1 static char help[] = "Tests for VecGetValuesSection / VecSetValuesSection \n\n";
2
3 #include <petscdmplex.h>
4
main(int argc,char ** argv)5 int main(int argc, char **argv)
6 {
7 DM dm;
8 Vec v;
9 PetscSection section;
10 PetscScalar val[2];
11 PetscInt pStart, pEnd, p;
12
13 PetscCall(PetscInitialize(&argc, &argv, NULL, help));
14
15 PetscCall(DMCreate(PETSC_COMM_WORLD, &dm));
16 PetscCall(DMSetType(dm, DMPLEX));
17 PetscCall(DMSetFromOptions(dm));
18 PetscCall(DMViewFromOptions(dm, NULL, "-d_view"));
19
20 PetscCall(PetscSectionCreate(PetscObjectComm((PetscObject)dm), §ion));
21 PetscCall(DMPlexGetChart(dm, &pStart, &pEnd));
22 PetscCall(PetscSectionSetChart(section, pStart, pEnd));
23 PetscCall(DMPlexGetHeightStratum(dm, 0, &pStart, &pEnd));
24 for (p = pStart; p < pEnd; p++) PetscCall(PetscSectionSetDof(section, p, 1));
25 PetscCall(DMPlexGetDepthStratum(dm, 0, &pStart, &pEnd));
26 for (p = pStart; p < pEnd; p++) PetscCall(PetscSectionSetDof(section, p, 2));
27 PetscCall(PetscSectionSetUp(section));
28 PetscCall(DMSetLocalSection(dm, section));
29 PetscCall(PetscSectionViewFromOptions(section, NULL, "-s_view"));
30
31 PetscCall(DMCreateGlobalVector(dm, &v));
32 PetscCall(VecViewFromOptions(v, NULL, "-v_view"));
33
34 /* look through all cells and change "cell values" */
35 PetscCall(DMPlexGetChart(dm, &pStart, &pEnd));
36 for (p = pStart; p < pEnd; ++p) {
37 PetscInt dof;
38
39 PetscCall(PetscSectionGetDof(section, p, &dof));
40 for (PetscInt d = 0; d < dof; ++d) val[d] = 100 * p + d;
41 PetscCall(VecSetValuesSection(v, section, p, val, INSERT_VALUES));
42 }
43 PetscCall(VecView(v, PETSC_VIEWER_STDOUT_WORLD));
44
45 for (p = pStart; p < pEnd; ++p) {
46 PetscScalar *x;
47 PetscInt dof;
48
49 PetscCall(PetscSectionGetDof(section, p, &dof));
50 PetscCall(VecGetValuesSection(v, section, p, &x));
51 PetscCall(PetscPrintf(PETSC_COMM_SELF, "Point #%" PetscInt_FMT " %" PetscInt_FMT " dof\n", p, dof));
52 }
53
54 PetscCall(VecDestroy(&v));
55 PetscCall(PetscSectionDestroy(§ion));
56 PetscCall(DMDestroy(&dm));
57 PetscCall(PetscFinalize());
58 return 0;
59 }
60
61 /*TEST
62
63 test:
64 suffix: 0
65 args: -dm_plex_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/quads-q2.msh
66
67 TEST*/
68