1fe1fc275SAlexander static char help[] = "Tests assembly of a matrix from another matrix's hash table.\n\n"; 2fe1fc275SAlexander 3fe1fc275SAlexander #include <petscmat.h> 4fe1fc275SAlexander 5*9680b7ceSStefano Zampini PetscErrorCode SetValues(Mat A, PetscBool zero, PetscBool insertvals) 6fe1fc275SAlexander { 7fe1fc275SAlexander PetscInt m, n, i, j; 8fe1fc275SAlexander PetscScalar v; 9fe1fc275SAlexander 10fe1fc275SAlexander PetscFunctionBeginUser; 11674b392bSAlexander PetscCall(MatGetSize(A, &m, &n)); 12674b392bSAlexander for (i = 0; i < m; i++) { 13674b392bSAlexander for (j = 0; j < n; j++) { 14*9680b7ceSStefano Zampini v = zero ? 0.0 : 10.0 * i + j + 1; 15*9680b7ceSStefano Zampini PetscCall(MatSetValues(A, 1, &i, 1, &j, &v, insertvals ? INSERT_VALUES : ADD_VALUES)); 16674b392bSAlexander } 17674b392bSAlexander } 18674b392bSAlexander PetscFunctionReturn(PETSC_SUCCESS); 19674b392bSAlexander } 20674b392bSAlexander 21674b392bSAlexander PetscErrorCode CreateAndViewB(Mat A) 22674b392bSAlexander { 23674b392bSAlexander Mat B; 24674b392bSAlexander 25674b392bSAlexander PetscFunctionBeginUser; 26674b392bSAlexander PetscCall(MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, &B)); 27674b392bSAlexander PetscCall(MatCopyHashToXAIJ(A, B)); 28674b392bSAlexander PetscCall(MatView(B, PETSC_VIEWER_STDOUT_WORLD)); 29674b392bSAlexander PetscCall(MatDestroy(&B)); 30674b392bSAlexander PetscFunctionReturn(PETSC_SUCCESS); 31674b392bSAlexander } 32674b392bSAlexander 33674b392bSAlexander PetscErrorCode AssembleAndViewA(Mat A) 34674b392bSAlexander { 35674b392bSAlexander PetscFunctionBeginUser; 36674b392bSAlexander PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY)); 37674b392bSAlexander PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY)); 38674b392bSAlexander PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD)); 39674b392bSAlexander PetscFunctionReturn(PETSC_SUCCESS); 40674b392bSAlexander } 41674b392bSAlexander 42674b392bSAlexander int main(int argc, char **argv) 43674b392bSAlexander { 44*9680b7ceSStefano Zampini Mat A, T; 45*9680b7ceSStefano Zampini PetscInt N, n, m; 46*9680b7ceSStefano Zampini PetscBool zero = PETSC_FALSE, ignorezero = PETSC_FALSE, insertvals = PETSC_FALSE; 47674b392bSAlexander 48674b392bSAlexander PetscFunctionBeginUser; 49fe1fc275SAlexander PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 50*9680b7ceSStefano Zampini PetscCall(PetscOptionsGetBool(NULL, NULL, "-zero", &zero, NULL)); 51*9680b7ceSStefano Zampini PetscCall(PetscOptionsGetBool(NULL, NULL, "-ignorezero", &ignorezero, NULL)); 52*9680b7ceSStefano Zampini PetscCall(PetscOptionsGetBool(NULL, NULL, "-insertvals", &insertvals, NULL)); 53fe1fc275SAlexander 54*9680b7ceSStefano Zampini PetscCall(MatCreate(PETSC_COMM_WORLD, &T)); 55*9680b7ceSStefano Zampini PetscCall(MatSetSizes(T, 1, 1, PETSC_DETERMINE, PETSC_DETERMINE)); 56*9680b7ceSStefano Zampini PetscCall(MatSetFromOptions(T)); 57*9680b7ceSStefano Zampini PetscCall(MatGetSize(T, NULL, &N)); 58*9680b7ceSStefano Zampini PetscCall(MatGetLocalSize(T, &m, &n)); 59*9680b7ceSStefano Zampini PetscCall(MatSeqAIJSetPreallocation(T, N, NULL)); 60*9680b7ceSStefano Zampini PetscCall(MatMPIAIJSetPreallocation(T, n, NULL, N - n, NULL)); 61*9680b7ceSStefano Zampini PetscCall(MatSetOption(T, MAT_IGNORE_ZERO_ENTRIES, ignorezero)); 62*9680b7ceSStefano Zampini PetscCall(MatSetUp(T)); 63*9680b7ceSStefano Zampini PetscCall(SetValues(T, zero, insertvals)); 64*9680b7ceSStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG T\n")); 65*9680b7ceSStefano Zampini PetscCall(AssembleAndViewA(T)); 66*9680b7ceSStefano Zampini 67fe1fc275SAlexander PetscCall(MatCreate(PETSC_COMM_WORLD, &A)); 68fe1fc275SAlexander PetscCall(MatSetSizes(A, 1, 1, PETSC_DETERMINE, PETSC_DETERMINE)); 69fe1fc275SAlexander PetscCall(MatSetFromOptions(A)); 70*9680b7ceSStefano Zampini PetscCall(MatSetOption(A, MAT_IGNORE_ZERO_ENTRIES, ignorezero)); 71fe1fc275SAlexander PetscCall(MatSetUp(A)); 72fe1fc275SAlexander 73*9680b7ceSStefano Zampini PetscCall(SetValues(A, zero, insertvals)); 74*9680b7ceSStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG B\n")); 75674b392bSAlexander PetscCall(CreateAndViewB(A)); 76*9680b7ceSStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG A\n")); 77674b392bSAlexander PetscCall(AssembleAndViewA(A)); 78fe1fc275SAlexander 79674b392bSAlexander PetscCall(MatResetHash(A)); 80*9680b7ceSStefano Zampini /* need to reset the option for MPIAIJ */ 81*9680b7ceSStefano Zampini PetscCall(MatSetOption(A, MAT_IGNORE_ZERO_ENTRIES, ignorezero)); 82674b392bSAlexander 83*9680b7ceSStefano Zampini PetscCall(SetValues(A, zero, insertvals)); 84*9680b7ceSStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG B\n")); 85674b392bSAlexander PetscCall(CreateAndViewB(A)); 86*9680b7ceSStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG A\n")); 87674b392bSAlexander PetscCall(AssembleAndViewA(A)); 88fe1fc275SAlexander 89fe1fc275SAlexander PetscCall(MatDestroy(&A)); 90*9680b7ceSStefano Zampini PetscCall(MatDestroy(&T)); 91fe1fc275SAlexander PetscCall(PetscFinalize()); 92fe1fc275SAlexander return 0; 93fe1fc275SAlexander } 94fe1fc275SAlexander 95fe1fc275SAlexander /*TEST 96fe1fc275SAlexander 97fe1fc275SAlexander test: 98fe1fc275SAlexander suffix: seq 99*9680b7ceSStefano Zampini diff_args: -j 100fe1fc275SAlexander args: -mat_type seqaij 101fe1fc275SAlexander filter: grep -v "Mat Object" 102fe1fc275SAlexander 103fe1fc275SAlexander test: 104fe1fc275SAlexander suffix: mpi 105*9680b7ceSStefano Zampini diff_args: -j 106fe1fc275SAlexander args: -mat_type mpiaij 107fe1fc275SAlexander nsize: 4 108fe1fc275SAlexander filter: grep -v "Mat Object" 109fe1fc275SAlexander 110*9680b7ceSStefano Zampini test: 111*9680b7ceSStefano Zampini diff_args: -j 112*9680b7ceSStefano Zampini suffix: seq_ignore 113*9680b7ceSStefano Zampini args: -mat_type seqaij -zero {{0 1}separate output} -ignorezero {{0 1}separate output} -insertvals {{0 1}separate output} 114*9680b7ceSStefano Zampini filter: grep -v "Mat Object" 115*9680b7ceSStefano Zampini 116*9680b7ceSStefano Zampini test: 117*9680b7ceSStefano Zampini diff_args: -j 118*9680b7ceSStefano Zampini suffix: mpi 119*9680b7ceSStefano Zampini args: -mat_type mpiaij -zero {{0 1}separate output} -ignorezero {{0 1}separate output} -insertvals {{0 1}separate output} 120*9680b7ceSStefano Zampini nsize: 4 121*9680b7ceSStefano Zampini filter: grep -v "Mat Object" 122*9680b7ceSStefano Zampini 123fe1fc275SAlexander TEST*/ 124