Actual source code: ex53.c
1: /*$Id: ex53.c,v 1.22 2001/04/10 19:35:44 bsmith Exp $*/
3: static char help[] = "Tests the vatious routines in MatMPIBAIJ format.n";
6: #include "petscmat.h"
7: #define IMAX 15
8: int main(int argc,char **args)
9: {
10: Mat A,B,C,At,Bt;
11: PetscViewer fd;
12: char file[128];
13: PetscRandom rand;
14: Vec xx,yy,s1,s2;
15: double s1norm,s2norm,rnorm,tol = 1.e-10;
16: int rstart,rend,rows[2],cols[2],m,n,i,j,ierr,M,N,rank,ct,row,ncols1;
17: int *cols1,ncols2,*cols2,bs;
18: Scalar vals1[4],vals2[4],v,*v1,*v2;
19: PetscTruth flg;
21: PetscInitialize(&argc,&args,(char *)0,help);
22: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
24: #if defined(PETSC_USE_COMPLEX)
25: SETERRQ(1,"This example does not work with complex numbers");
26: #else
28: /* Check out if MatLoad() works */
29: PetscOptionsGetString(PETSC_NULL,"-f",file,127,&flg);
30: if (!flg) SETERRQ(1,"Input file not specified");
31: PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,PETSC_BINARY_RDONLY,&fd);
32: MatLoad(fd,MATMPIBAIJ,&A);
33: PetscViewerDestroy(fd);
35: MatConvert(A,MATMPIAIJ,&B);
36:
37: PetscRandomCreate(PETSC_COMM_WORLD,RANDOM_DEFAULT,&rand);
38: MatGetLocalSize(A,&m,&n);
39: VecCreateMPI(PETSC_COMM_WORLD,m,PETSC_DECIDE,&xx);
40: VecDuplicate(xx,&s1);
41: VecDuplicate(xx,&s2);
42: VecDuplicate(xx,&yy);
44: MatGetBlockSize(A,&bs);
45: /* Test MatMult() */
46: for (i=0; i<IMAX; i++) {
47: VecSetRandom(rand,xx);
48: MatMult(A,xx,s1);
49: MatMult(B,xx,s2);
50: VecNorm(s1,NORM_2,&s1norm);
51: VecNorm(s2,NORM_2,&s2norm);
52: rnorm = s2norm-s1norm;
53: if (rnorm<-tol || rnorm>tol) {
54: PetscPrintf(PETSC_COMM_SELF,"Error:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %dn",
55: s1norm,s2norm,bs);
56: }
57: }
58: /* test MatMultAdd() */
59: for (i=0; i<IMAX; i++) {
60: VecSetRandom(rand,xx);
61: VecSetRandom(rand,yy);
62: MatMultAdd(A,xx,yy,s1);
63: MatMultAdd(B,xx,yy,s2);
64: VecNorm(s1,NORM_2,&s1norm);
65: VecNorm(s2,NORM_2,&s2norm);
66: rnorm = s2norm-s1norm;
67: if (rnorm<-tol || rnorm>tol) {
68: PetscPrintf(PETSC_COMM_SELF,"Error:MatMultAdd - Norm1=%16.14e Norm2=%16.14e bs = %dn",s1norm,s2norm,bs);
69: }
70: }
71: /* Test MatMultTranspose() */
72: for (i=0; i<IMAX; i++) {
73: VecSetRandom(rand,xx);
74: MatMultTranspose(A,xx,s1);
75: MatMultTranspose(B,xx,s2);
76: VecNorm(s1,NORM_2,&s1norm);
77: VecNorm(s2,NORM_2,&s2norm);
78: rnorm = s2norm-s1norm;
79: if (rnorm<-tol || rnorm>tol) {
80: PetscPrintf(PETSC_COMM_SELF,"Error:MatMultTranspose - Norm1=%16.14e Norm2=%16.14e bs = %dn",s1norm,s2norm,bs);
81: }
82: }
83: /* Test MatMultTransposeAdd() */
84: for (i=0; i<IMAX; i++) {
85: VecSetRandom(rand,xx);
86: VecSetRandom(rand,yy);
87: MatMultTransposeAdd(A,xx,yy,s1);
88: MatMultTransposeAdd(B,xx,yy,s2);
89: VecNorm(s1,NORM_2,&s1norm);
90: VecNorm(s2,NORM_2,&s2norm);
91: rnorm = s2norm-s1norm;
92: if (rnorm<-tol || rnorm>tol) {
93: PetscPrintf(PETSC_COMM_SELF,"Error:MatMultTransposeAdd - Norm1=%16.14e Norm2=%16.14e bs = %dn",s1norm,s2norm,bs);
94: }
95: }
97: /* Check MatGetValues() */
98: MatGetOwnershipRange(A,&rstart,&rend);
99: MatGetSize(A,&M,&N);
102: for (i=0; i<IMAX; i++) {
103: /* Create random row numbers ad col numbers */
104: PetscRandomGetValue(rand,&v);
105: cols[0] = (int)(PetscRealPart(v)*N);
106: PetscRandomGetValue(rand,&v);
107: cols[1] = (int)(PetscRealPart(v)*N);
108: PetscRandomGetValue(rand,&v);
109: rows[0] = rstart + (int)(PetscRealPart(v)*m);
110: PetscRandomGetValue(rand,&v);
111: rows[1] = rstart + (int)(PetscRealPart(v)*m);
112:
113: MatGetValues(A,2,rows,2,cols,vals1);
114: MatGetValues(B,2,rows,2,cols,vals2);
117: for (j=0; j<4; j++) {
118: if(vals1[j] != vals2[j])
119: PetscPrintf(PETSC_COMM_SELF,"[%d]: Error:MatGetValues rstart = %2d row = %2d col = %2d val1 = %e val2 = %e bs = %dn",rank,rstart,rows[j/2],cols[j%2],PetscRealPart(vals1[j]),PetscRealPart(vals2[j]),bs);
120: }
121: }
123: /* Test MatGetRow()/ MatRestoreRow() */
124: for (ct=0; ct<100; ct++) {
125: PetscRandomGetValue(rand,&v);
126: row = rstart + (int)(PetscRealPart(v)*m);
127: MatGetRow(A,row,&ncols1,&cols1,&v1);
128: MatGetRow(B,row,&ncols2,&cols2,&v2);
129:
130: for (i=0,j=0; i<ncols1 && j<ncols2; j++) {
131: while (cols2[j] != cols1[i]) i++;
132: if (v1[i] != v2[j]) SETERRQ(1,"MatGetRow() failed - vals incorrect.");
133: }
134: if (j<ncols2) SETERRQ(1,"MatGetRow() failed - cols incorrect");
135:
136: MatRestoreRow(A,row,&ncols1,&cols1,&v1);
137: MatRestoreRow(B,row,&ncols2,&cols2,&v2);
138: }
139:
140: /* Test MatConvert() */
141: MatConvert(A,MATSAME,&C);
142:
143: /* See if MatMult Says both are same */
144: for (i=0; i<IMAX; i++) {
145: VecSetRandom(rand,xx);
146: MatMult(A,xx,s1);
147: MatMult(C,xx,s2);
148: VecNorm(s1,NORM_2,&s1norm);
149: VecNorm(s2,NORM_2,&s2norm);
150: rnorm = s2norm-s1norm;
151: if (rnorm<-tol || rnorm>tol) {
152: PetscPrintf(PETSC_COMM_SELF,"Error in MatConvert:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %dn",
153: s1norm,s2norm,bs);
154: }
155: }
156: MatDestroy(C);
158: /* Test MatTranspose() */
159: MatTranspose(A,&At);
160: MatTranspose(B,&Bt);
161: for (i=0; i<IMAX; i++) {
162: VecSetRandom(rand,xx);
163: MatMult(At,xx,s1);
164: MatMult(Bt,xx,s2);
165: VecNorm(s1,NORM_2,&s1norm);
166: VecNorm(s2,NORM_2,&s2norm);
167: rnorm = s2norm-s1norm;
168: if (rnorm<-tol || rnorm>tol) {
169: PetscPrintf(PETSC_COMM_SELF,"Error in MatConvert:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %dn",
170: s1norm,s2norm,bs);
171: }
172: }
173: MatDestroy(At);
174: MatDestroy(Bt);
176: MatDestroy(A);
177: MatDestroy(B);
178: VecDestroy(xx);
179: VecDestroy(yy);
180: VecDestroy(s1);
181: VecDestroy(s2);
182: PetscRandomDestroy(rand);
183: PetscFinalize();
184: #endif
185: return 0;
186: }