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,&r);
27: PetscRandomSetFromOptions(r);
28: MatGetArray(A,&array);
29: k = 0;
30: for (i=0; i<M; i++){
31: for (j=0; j<N; j++){
32: PetscRandomGetValue(r,&array[k++]);
33: }
34: }
35: MatRestoreArray(A,&array);
36: PetscRandomDestroy(r);
37: MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
38: MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);
40: /* Test MatMatMult() */
41: MatTranspose(A,&B); /* B = A^T */
42: MatMatMult(B,A,MAT_INITIAL_MATRIX,fill,&C); /* C = B*A = A^T*A */
44: MatMatMultSymbolic(B,A,fill,&D); /* D = B*A = A^T*A */
45: for (i=0; i<2; i++){
46: /* Repeat the numeric product to test reuse of the previous symbolic product */
47: MatMatMultNumeric(B,A,D);
48: }
49: MatEqual(C,D,&equal);
50: if (!equal) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"C != D");
51: MatDestroy(D);
53: /* Test MatMatMultTranspose() */
54: MatMatMultTranspose(A,A,MAT_INITIAL_MATRIX,fill,&D); /* D = A^T*A */
55: if (!equal) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"C != D");
56: MatDestroy(D);
58: MatDestroy(C);
59: MatDestroy(B);
60: MatDestroy(A);
61:
62: PetscFinalize();
63: return(0);
64: }