Actual source code: ex104.c
1: static char help[] = "Test MatMatMult(), MatMatMultTranspose() for SeqDense matrices.\n\n";
3: #include petscmat.h
7: int main(int argc,char **argv) {
8: Mat A,B,C,D;
9: PetscInt i,j,k,M=10,N=5;
10: PetscScalar *array;;
12: PetscRandom r;
13: PetscTruth equal;
14: PetscReal fill = 1.0;
15: PetscMPIInt size;
17: PetscInitialize(&argc,&argv,(char *)0,help);
18: MPI_Comm_size(PETSC_COMM_WORLD,&size);
19: if (size != 1) SETERRQ(PETSC_ERR_SUP,"This is a uniprocessor example only!");
20: PetscOptionsGetInt(PETSC_NULL,"-M",&M,PETSC_NULL);
21: PetscOptionsGetInt(PETSC_NULL,"-N",&N,PETSC_NULL);
22: MatCreate(PETSC_COMM_SELF,&A);
23: MatSetSizes(A,M,N,M,N);
24: MatSetType(A,MATSEQDENSE);
25: MatSeqDenseSetPreallocation(A,PETSC_NULL);
26: PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r);
27: MatGetArray(A,&array);
28: k = 0;
29: for (i=0; i<M; i++){
30: for (j=0; j<N; j++){
31: PetscRandomGetValue(r,&array[k++]);
32: }
33: }
34: MatRestoreArray(A,&array);
35: PetscRandomDestroy(r);
36: MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
37: MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);
39: /* Test MatMatMult() */
40: MatTranspose(A,&B); /* B = A^T */
41: MatMatMult(B,A,MAT_INITIAL_MATRIX,fill,&C); /* C = B*A = A^T*A */
43: MatMatMultSymbolic(B,A,fill,&D); /* D = B*A = A^T*A */
44: for (i=0; i<2; i++){
45: /* Repeat the numeric product to test reuse of the previous symbolic product */
46: MatMatMultNumeric(B,A,D);
47: }
48: MatEqual(C,D,&equal);
49: if (!equal) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"C != D");
50: MatDestroy(D);
52: /* Test MatMatMultTranspose() */
53: MatMatMultTranspose(A,A,MAT_INITIAL_MATRIX,fill,&D); /* D = A^T*A */
54: if (!equal) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"C != D");
55: MatDestroy(D);
57: MatDestroy(C);
58: MatDestroy(B);
59: MatDestroy(A);
60:
61: PetscFinalize();
62: return(0);
63: }