Actual source code: ex42.c
1: static char help[] = "Test DMCreateFieldDecomposition_Stag()\n\n";
3: #include <petscdm.h>
4: #include <petscdmstag.h>
6: int main(int argc, char **argv)
7: {
8: DM dm;
9: DM *sub_dms;
10: PetscInt dim, n_fields;
11: IS *fields;
12: char **field_names;
15: PetscInitialize(&argc, &argv, (char *)0, help);
16: dim = 2;
17: PetscOptionsGetInt(NULL, NULL, "-dim", &dim, NULL);
19: switch (dim) {
20: case 1:
21: DMStagCreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 3, 1, 1, DMSTAG_STENCIL_BOX, 1, NULL, &dm);
22: break;
23: case 2:
24: DMStagCreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 3, 2, PETSC_DECIDE, PETSC_DECIDE, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, NULL, NULL, &dm);
25: break;
26: case 3:
27: DMStagCreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 3, 2, 4, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, 1, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, NULL, NULL, NULL, &dm);
28: break;
29: default:
30: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "No support for dimension %" PetscInt_FMT, dim);
31: }
33: DMSetFromOptions(dm);
34: DMSetUp(dm);
35: DMView(dm, PETSC_VIEWER_STDOUT_WORLD);
37: DMCreateFieldDecomposition(dm, &n_fields, &field_names, &fields, &sub_dms);
38: for (PetscInt i = 0; i < n_fields; ++i) {
39: PetscPrintf(PETSC_COMM_WORLD, "%" PetscInt_FMT " %s\n", i, field_names[i]);
40: ISView(fields[i], PETSC_VIEWER_STDOUT_WORLD);
41: DMView(sub_dms[i], PETSC_VIEWER_STDOUT_WORLD);
42: }
44: for (PetscInt i = 0; i < n_fields; ++i) {
45: PetscFree(field_names[i]);
46: ISDestroy(&fields[i]);
47: DMDestroy(&sub_dms[i]);
48: }
49: PetscFree(fields);
50: PetscFree(field_names);
51: PetscFree(sub_dms);
52: DMDestroy(&dm);
53: PetscFinalize();
54: return 0;
55: }
57: /*TEST
59: test:
60: nsize: 2
61: args: -dim {{1 2 3}separate output}
63: TEST*/