xref: /petsc/src/dm/tests/ex5.c (revision 061e922f3926be00487707c73b78dd3d40309129)
1 /*
2   Test DMCreateMatrix() for structure_only
3 */
4 
5 #include <petscdmda.h>
6 
main(int argc,char * argv[])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