Actual source code: ex37.c

  2: static char help[] = "Tests MatCopy() and MatStore/RetrieveValues().\n\n";

  4: #include <petscmat.h>

  8: int main(int argc,char **args)
  9: {
 10:   Mat            C,A;
 11:   PetscInt       i, n = 10,midx[3],bs=1;
 13:   PetscScalar    v[3];
 14:   PetscBool      flg,isAIJ;
 15:   const MatType  type;
 16:   PetscMPIInt    size;

 18:   PetscInitialize(&argc,&args,(char *)0,help);
 19:   MPI_Comm_size(PETSC_COMM_WORLD,&size);
 20:   PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);

 22:   MatCreate(PETSC_COMM_WORLD,&C);
 23:   MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,n,n);
 24:   MatSetType(C,MATAIJ);
 25:   MatSetFromOptions(C);

 27:   MatGetType(C,&type);
 28:   if (size == 1){
 29:     PetscTypeCompare((PetscObject)C,MATSEQAIJ,&isAIJ);
 30:   } else {
 31:     PetscTypeCompare((PetscObject)C,MATMPIAIJ,&isAIJ);
 32:   }
 33:   if (isAIJ){
 34:     MatSeqAIJSetPreallocation(C,3,PETSC_NULL);
 35:     MatMPIAIJSetPreallocation(C,3,PETSC_NULL,3,PETSC_NULL);
 36:   } else {
 37:     MatGetBlockSize(C,&bs);
 38:     MatSeqBAIJSetPreallocation(C,bs,3,PETSC_NULL);
 39:     MatMPIBAIJSetPreallocation(C,bs,3,PETSC_NULL,3,PETSC_NULL);
 40:   }
 41:   v[0] = -1.; v[1] = 2.; v[2] = -1.;
 42:   for (i=1; i<n-1; i++){
 43:     midx[2] = i-1; midx[1] = i; midx[0] = i+1;
 44:     MatSetValues(C,1,&i,3,midx,v,INSERT_VALUES);
 45:   }
 46:   i = 0; midx[0] = 0; midx[1] = 1;
 47:   v[0] = 2.0; v[1] = -1.;
 48:   MatSetValues(C,1,&i,2,midx,v,INSERT_VALUES);
 49:   i = n-1; midx[0] = n-2; midx[1] = n-1;
 50:   v[0] = -1.0; v[1] = 2.;
 51:   MatSetValues(C,1,&i,2,midx,v,INSERT_VALUES);

 53:   MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);
 54:   MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);

 56:   MatCreate(PETSC_COMM_WORLD,&A);
 57:   MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);
 58:   MatSetFromOptions(A);
 59:   MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
 60:   MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);

 62:   /* test matrices with different nonzero patterns - Note: A is created with different nonzero pattern of C! */
 63:   MatCopy(C,A,DIFFERENT_NONZERO_PATTERN);
 64:   MatEqual(A,C,&flg);
 65:   if (!flg) SETERRQ(PETSC_COMM_SELF,1,"MatCopy(C,A,DIFFERENT_NONZERO_PATTERN): Matrices are NOT equal");
 66: 
 67:   PetscViewerSetFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO);
 68:   PetscPrintf(PETSC_COMM_WORLD,"A is obtained with MatCopy(,,DIFFERENT_NONZERO_PATTERN):\n");
 69:   MatView(A,PETSC_VIEWER_STDOUT_WORLD);
 70:   MatDestroy(&A);

 72:   /* test matrices with same nonzero pattern */
 73:   MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&A);
 74:   MatCopy(C,A,SAME_NONZERO_PATTERN);
 75:   MatEqual(A,C,&flg);
 76:   if (!flg) SETERRQ(PETSC_COMM_SELF,1,"MatCopy(C,A,SAME_NONZERO_PATTERN): Matrices are NOT equal");
 77: 
 78:   PetscViewerSetFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO);
 79:   PetscPrintf(PETSC_COMM_WORLD,"\nA is obtained with MatCopy(,,SAME_NONZERO_PATTERN):\n");
 80:   MatView(A,PETSC_VIEWER_STDOUT_WORLD);

 82:   PetscViewerSetFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_COMMON);
 83:   PetscPrintf(PETSC_COMM_WORLD,"A:\n");
 84:   MatView(A,PETSC_VIEWER_STDOUT_WORLD);
 85: 
 86:   /* test MatStore/RetrieveValues() */
 87:   if (isAIJ){
 88:     MatSetOption(A,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE);
 89:     MatStoreValues(A);
 90:     MatZeroEntries(A);
 91:     MatRetrieveValues(A);
 92:   }

 94:   MatDestroy(&C);
 95:   MatDestroy(&A);
 96:   PetscFinalize();
 97:   return 0;
 98: }

100: