Actual source code: ex53.c
1: /*$Id: ex53.c,v 1.25 2001/09/11 16:32:50 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: PetscReal 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: PetscScalar 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: VecCreate(PETSC_COMM_WORLD,&xx);
40: VecSetSizes(xx,m,PETSC_DECIDE);
41: VecSetFromOptions(xx);
42: VecDuplicate(xx,&s1);
43: VecDuplicate(xx,&s2);
44: VecDuplicate(xx,&yy);
46: MatGetBlockSize(A,&bs);
47: /* Test MatMult() */
48: for (i=0; i<IMAX; i++) {
49: VecSetRandom(rand,xx);
50: MatMult(A,xx,s1);
51: MatMult(B,xx,s2);
52: VecNorm(s1,NORM_2,&s1norm);
53: VecNorm(s2,NORM_2,&s2norm);
54: rnorm = s2norm-s1norm;
55: if (rnorm<-tol || rnorm>tol) {
56: PetscPrintf(PETSC_COMM_SELF,"Error:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %dn",
57: s1norm,s2norm,bs);
58: }
59: }
60: /* test MatMultAdd() */
61: for (i=0; i<IMAX; i++) {
62: VecSetRandom(rand,xx);
63: VecSetRandom(rand,yy);
64: MatMultAdd(A,xx,yy,s1);
65: MatMultAdd(B,xx,yy,s2);
66: VecNorm(s1,NORM_2,&s1norm);
67: VecNorm(s2,NORM_2,&s2norm);
68: rnorm = s2norm-s1norm;
69: if (rnorm<-tol || rnorm>tol) {
70: PetscPrintf(PETSC_COMM_SELF,"Error:MatMultAdd - Norm1=%16.14e Norm2=%16.14e bs = %dn",s1norm,s2norm,bs);
71: }
72: }
73: /* Test MatMultTranspose() */
74: for (i=0; i<IMAX; i++) {
75: VecSetRandom(rand,xx);
76: MatMultTranspose(A,xx,s1);
77: MatMultTranspose(B,xx,s2);
78: VecNorm(s1,NORM_2,&s1norm);
79: VecNorm(s2,NORM_2,&s2norm);
80: rnorm = s2norm-s1norm;
81: if (rnorm<-tol || rnorm>tol) {
82: PetscPrintf(PETSC_COMM_SELF,"Error:MatMultTranspose - Norm1=%16.14e Norm2=%16.14e bs = %dn",s1norm,s2norm,bs);
83: }
84: }
85: /* Test MatMultTransposeAdd() */
86: for (i=0; i<IMAX; i++) {
87: VecSetRandom(rand,xx);
88: VecSetRandom(rand,yy);
89: MatMultTransposeAdd(A,xx,yy,s1);
90: MatMultTransposeAdd(B,xx,yy,s2);
91: VecNorm(s1,NORM_2,&s1norm);
92: VecNorm(s2,NORM_2,&s2norm);
93: rnorm = s2norm-s1norm;
94: if (rnorm<-tol || rnorm>tol) {
95: PetscPrintf(PETSC_COMM_SELF,"Error:MatMultTransposeAdd - Norm1=%16.14e Norm2=%16.14e bs = %dn",s1norm,s2norm,bs);
96: }
97: }
99: /* Check MatGetValues() */
100: MatGetOwnershipRange(A,&rstart,&rend);
101: MatGetSize(A,&M,&N);
104: for (i=0; i<IMAX; i++) {
105: /* Create random row numbers ad col numbers */
106: PetscRandomGetValue(rand,&v);
107: cols[0] = (int)(PetscRealPart(v)*N);
108: PetscRandomGetValue(rand,&v);
109: cols[1] = (int)(PetscRealPart(v)*N);
110: PetscRandomGetValue(rand,&v);
111: rows[0] = rstart + (int)(PetscRealPart(v)*m);
112: PetscRandomGetValue(rand,&v);
113: rows[1] = rstart + (int)(PetscRealPart(v)*m);
114:
115: MatGetValues(A,2,rows,2,cols,vals1);
116: MatGetValues(B,2,rows,2,cols,vals2);
119: for (j=0; j<4; j++) {
120: if(vals1[j] != vals2[j])
121: 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);
122: }
123: }
125: /* Test MatGetRow()/ MatRestoreRow() */
126: for (ct=0; ct<100; ct++) {
127: PetscRandomGetValue(rand,&v);
128: row = rstart + (int)(PetscRealPart(v)*m);
129: MatGetRow(A,row,&ncols1,&cols1,&v1);
130: MatGetRow(B,row,&ncols2,&cols2,&v2);
131:
132: for (i=0,j=0; i<ncols1 && j<ncols2; j++) {
133: while (cols2[j] != cols1[i]) i++;
134: if (v1[i] != v2[j]) SETERRQ(1,"MatGetRow() failed - vals incorrect.");
135: }
136: if (j<ncols2) SETERRQ(1,"MatGetRow() failed - cols incorrect");
137:
138: MatRestoreRow(A,row,&ncols1,&cols1,&v1);
139: MatRestoreRow(B,row,&ncols2,&cols2,&v2);
140: }
141:
142: /* Test MatConvert() */
143: MatConvert(A,MATSAME,&C);
144:
145: /* See if MatMult Says both are same */
146: for (i=0; i<IMAX; i++) {
147: VecSetRandom(rand,xx);
148: MatMult(A,xx,s1);
149: MatMult(C,xx,s2);
150: VecNorm(s1,NORM_2,&s1norm);
151: VecNorm(s2,NORM_2,&s2norm);
152: rnorm = s2norm-s1norm;
153: if (rnorm<-tol || rnorm>tol) {
154: PetscPrintf(PETSC_COMM_SELF,"Error in MatConvert:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %dn",
155: s1norm,s2norm,bs);
156: }
157: }
158: MatDestroy(C);
160: /* Test MatTranspose() */
161: MatTranspose(A,&At);
162: MatTranspose(B,&Bt);
163: for (i=0; i<IMAX; i++) {
164: VecSetRandom(rand,xx);
165: MatMult(At,xx,s1);
166: MatMult(Bt,xx,s2);
167: VecNorm(s1,NORM_2,&s1norm);
168: VecNorm(s2,NORM_2,&s2norm);
169: rnorm = s2norm-s1norm;
170: if (rnorm<-tol || rnorm>tol) {
171: PetscPrintf(PETSC_COMM_SELF,"Error in MatConvert:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %dn",
172: s1norm,s2norm,bs);
173: }
174: }
175: MatDestroy(At);
176: MatDestroy(Bt);
178: MatDestroy(A);
179: MatDestroy(B);
180: VecDestroy(xx);
181: VecDestroy(yy);
182: VecDestroy(s1);
183: VecDestroy(s2);
184: PetscRandomDestroy(rand);
185: PetscFinalize();
186: #endif
187: return 0;
188: }