1 /* 2 Test DMCreateMatrix() for structure_only 3 */ 4 5 #include <petscdmda.h> 6 7 int main(int argc, char *argv[]) 8 { 9 PetscInt nx = 6, ny = 6, nz = 6, dim = 1, dof = 2; 10 DM da; 11 Mat A; 12 PetscBool struct_only = PETSC_TRUE; 13 14 PetscFunctionBeginUser; 15 PetscCall(PetscInitialize(&argc, &argv, NULL, NULL)); 16 PetscCall(PetscOptionsGetInt(NULL, NULL, "-dim", &dim, NULL)); 17 PetscCall(PetscOptionsGetInt(NULL, NULL, "-dof", &dof, NULL)); 18 switch (dim) { 19 case 1: 20 PetscCall(DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, nx, dof, 1, NULL, &da)); 21 break; 22 case 2: 23 PetscCall(DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_STAR, nx, ny, PETSC_DECIDE, PETSC_DECIDE, dof, 1, NULL, NULL, &da)); 24 break; 25 default: 26 PetscCall(DMDACreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, nx, ny, nz, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, dof, 2, NULL, NULL, NULL, &da)); 27 } 28 29 PetscCall(DMSetFromOptions(da)); 30 PetscCall(DMSetUp(da)); 31 PetscCall(DMView(da, PETSC_VIEWER_STDOUT_WORLD)); 32 33 PetscCall(PetscOptionsGetBool(NULL, NULL, "-struct_only", &struct_only, NULL)); 34 PetscCall(DMSetMatrixStructureOnly(da, struct_only)); 35 PetscCall(DMCreateMatrix(da, &A)); 36 /* Set da->structure_only to default PETSC_FALSE in case da is being used to create new matrices */ 37 PetscCall(DMSetMatrixStructureOnly(da, PETSC_FALSE)); 38 39 PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD)); 40 PetscCall(MatDestroy(&A)); 41 PetscCall(DMDestroy(&da)); 42 PetscCall(PetscFinalize()); 43 return 0; 44 } 45 46 /*TEST 47 48 test: 49 50 test: 51 suffix: 2 52 args: -dm_mat_type baij -dim 2 53 54 TEST*/ 55