Actual source code: ex36.c

  1: static char help[] = "Tests assembly of a matrix from another matrix's hash table.\n\n";

  3: #include <petscmat.h>

  5: PetscErrorCode SetValues(Mat A, PetscBool zero, PetscBool insertvals)
  6: {
  7:   PetscInt    m, n, i, j;
  8:   PetscScalar v;

 10:   PetscFunctionBeginUser;
 11:   PetscCall(MatGetSize(A, &m, &n));
 12:   for (i = 0; i < m; i++) {
 13:     for (j = 0; j < n; j++) {
 14:       v = zero ? 0.0 : 10.0 * i + j + 1;
 15:       PetscCall(MatSetValues(A, 1, &i, 1, &j, &v, insertvals ? INSERT_VALUES : ADD_VALUES));
 16:     }
 17:   }
 18:   PetscFunctionReturn(PETSC_SUCCESS);
 19: }

 21: PetscErrorCode CreateAndViewB(Mat A)
 22: {
 23:   Mat B;

 25:   PetscFunctionBeginUser;
 26:   PetscCall(MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, &B));
 27:   PetscCall(MatCopyHashToXAIJ(A, B));
 28:   PetscCall(MatView(B, PETSC_VIEWER_STDOUT_WORLD));
 29:   PetscCall(MatDestroy(&B));
 30:   PetscFunctionReturn(PETSC_SUCCESS);
 31: }

 33: PetscErrorCode AssembleAndViewA(Mat A)
 34: {
 35:   PetscFunctionBeginUser;
 36:   PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
 37:   PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
 38:   PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));
 39:   PetscFunctionReturn(PETSC_SUCCESS);
 40: }

 42: int main(int argc, char **argv)
 43: {
 44:   Mat       A, T;
 45:   PetscInt  N, n, m;
 46:   PetscBool zero = PETSC_FALSE, ignorezero = PETSC_FALSE, insertvals = PETSC_FALSE;

 48:   PetscFunctionBeginUser;
 49:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 50:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-zero", &zero, NULL));
 51:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-ignorezero", &ignorezero, NULL));
 52:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-insertvals", &insertvals, NULL));

 54:   PetscCall(MatCreate(PETSC_COMM_WORLD, &T));
 55:   PetscCall(MatSetSizes(T, 1, 1, PETSC_DETERMINE, PETSC_DETERMINE));
 56:   PetscCall(MatSetFromOptions(T));
 57:   PetscCall(MatGetSize(T, NULL, &N));
 58:   PetscCall(MatGetLocalSize(T, &m, &n));
 59:   PetscCall(MatSeqAIJSetPreallocation(T, N, NULL));
 60:   PetscCall(MatMPIAIJSetPreallocation(T, n, NULL, N - n, NULL));
 61:   PetscCall(MatSetOption(T, MAT_IGNORE_ZERO_ENTRIES, ignorezero));
 62:   PetscCall(MatSetUp(T));
 63:   PetscCall(SetValues(T, zero, insertvals));
 64:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG T\n"));
 65:   PetscCall(AssembleAndViewA(T));

 67:   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
 68:   PetscCall(MatSetSizes(A, 1, 1, PETSC_DETERMINE, PETSC_DETERMINE));
 69:   PetscCall(MatSetFromOptions(A));
 70:   PetscCall(MatSetOption(A, MAT_IGNORE_ZERO_ENTRIES, ignorezero));
 71:   PetscCall(MatSetUp(A));

 73:   PetscCall(SetValues(A, zero, insertvals));
 74:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG B\n"));
 75:   PetscCall(CreateAndViewB(A));
 76:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG A\n"));
 77:   PetscCall(AssembleAndViewA(A));

 79:   PetscCall(MatResetHash(A));
 80:   /* need to reset the option for MPIAIJ */
 81:   PetscCall(MatSetOption(A, MAT_IGNORE_ZERO_ENTRIES, ignorezero));

 83:   PetscCall(SetValues(A, zero, insertvals));
 84:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG B\n"));
 85:   PetscCall(CreateAndViewB(A));
 86:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG A\n"));
 87:   PetscCall(AssembleAndViewA(A));

 89:   PetscCall(MatDestroy(&A));
 90:   PetscCall(MatDestroy(&T));
 91:   PetscCall(PetscFinalize());
 92:   return 0;
 93: }

 95: /*TEST

 97:    test:
 98:       suffix: seq
 99:       diff_args: -j
100:       args: -mat_type seqaij
101:       filter: grep -v "Mat Object"

103:    test:
104:       suffix: mpi
105:       diff_args: -j
106:       args: -mat_type mpiaij
107:       nsize: 4
108:       filter: grep -v "Mat Object"

110:    test:
111:       diff_args: -j
112:       suffix: seq_ignore
113:       args: -mat_type seqaij -zero {{0 1}separate output} -ignorezero {{0 1}separate output} -insertvals {{0 1}separate output}
114:       filter: grep -v "Mat Object"

116:    test:
117:       diff_args: -j
118:       suffix: mpi
119:       args: -mat_type mpiaij -zero {{0 1}separate output} -ignorezero {{0 1}separate output} -insertvals {{0 1}separate output}
120:       nsize: 4
121:       filter: grep -v "Mat Object"

123: TEST*/