Actual source code: ex93.c

  1: static char help[] = "Testing Matrix-Matrix multiplication for SeqAIJ matrices.\n\n";

 3:  #include petscmat.h

  7: int main(int argc,char **argv) {
  8:   Mat            A,B,C,D;
  9:   PetscScalar    a[]={1.,1.,0.,0.,1.,1.,0.,0.,1.};
 10:   PetscInt       ij[]={0,1,2};
 11:   PetscScalar    none=-1.;
 13:   PetscReal      fill=4;

 15:   PetscInitialize(&argc,&argv,(char *)0,help);
 16:   MatCreate(PETSC_COMM_SELF,3,3,3,3,&A);
 17:   MatSetType(A,MATSEQAIJ);
 18:   MatSetOption(A,MAT_IGNORE_ZERO_ENTRIES);

 20:   MatSetValues(A,3,ij,3,ij,a,ADD_VALUES);
 21:   MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
 22:   MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);

 24:   /* Form A^T*A*A to test PtAP routine. */
 25:   MatTranspose(A,&B);
 26:   MatMatMult(B,A,MAT_INITIAL_MATRIX,fill,&C);
 27:   MatMatMultSymbolic(C,A,fill,&D);
 28:   MatMatMultNumeric(C,A,D);
 29:   MatView(D,PETSC_VIEWER_STDOUT_WORLD);

 31:   /* Repeat the numeric product to test reuse of the previous symbolic product */
 32:   MatMatMultNumeric(C,A,D);
 33:   MatView(D,PETSC_VIEWER_STDOUT_WORLD);

 35:   MatDestroy(B);
 36:   MatDestroy(C);

 38:   MatDuplicate(A,MAT_COPY_VALUES,&B);
 39:   MatPtAP(A,B,MAT_INITIAL_MATRIX,fill,&C);

 41:   MatAXPY(&none,C,D,DIFFERENT_NONZERO_PATTERN);
 42:   MatView(D,PETSC_VIEWER_STDOUT_WORLD);

 44:   MatDestroy(C);
 45:   MatDestroy(D);

 47:   /* Repeat PtAP to test symbolic/numeric separation for reuse of the symbolic product */
 48:   MatPtAP(A,B,MAT_INITIAL_MATRIX,fill,&C);
 49:   MatView(C,PETSC_VIEWER_STDOUT_WORLD);
 50:   MatPtAPSymbolic(A,B,fill,&D);
 51:   MatPtAPNumeric(A,B,D);
 52:   MatView(D,PETSC_VIEWER_STDOUT_WORLD);

 54:   /* Repeat numeric product to test reuse of the previous symbolic product */
 55:   MatPtAPNumeric(A,B,D);
 56:   MatAXPY(&none,C,D,DIFFERENT_NONZERO_PATTERN);
 57:   MatView(D,PETSC_VIEWER_STDOUT_WORLD);

 59:   MatDestroy(A);
 60:   MatDestroy(B);
 61:   MatDestroy(C);
 62:   MatDestroy(D);
 63:   PetscFinalize();
 64:   return(0);
 65: }