File: | dm/impls/plex/plexcreate.c |
Warning: | line 196, column 10 Array access (via field 'flags') results in a null pointer dereference |
[?] Use j/k keys for keyboard navigation
1 | #define PETSCDM_DLL | |||
2 | #include <petsc/private/dmpleximpl.h> /*I "petscdmplex.h" I*/ | |||
3 | #include <petsc/private/hashseti.h> /*I "petscdmplex.h" I*/ | |||
4 | #include <petscsf.h> | |||
5 | ||||
6 | /*@ | |||
7 | DMPlexCreateDoublet - Creates a mesh of two cells of the specified type, optionally with later refinement. | |||
8 | ||||
9 | Collective | |||
10 | ||||
11 | Input Parameters: | |||
12 | + comm - The communicator for the DM object | |||
13 | . dim - The spatial dimension | |||
14 | . simplex - Flag for simplicial cells, otherwise they are tensor product cells | |||
15 | . interpolate - Flag to create intermediate mesh pieces (edges, faces) | |||
16 | . refinementUniform - Flag for uniform parallel refinement | |||
17 | - refinementLimit - A nonzero number indicates the largest admissible volume for a refined cell | |||
18 | ||||
19 | Output Parameter: | |||
20 | . dm - The DM object | |||
21 | ||||
22 | Level: beginner | |||
23 | ||||
24 | .seealso: DMSetType(), DMCreate() | |||
25 | @*/ | |||
26 | PetscErrorCode DMPlexCreateDoublet(MPI_Comm comm, PetscInt dim, PetscBool simplex, PetscBool interpolate, PetscBool refinementUniform, PetscReal refinementLimit, DM *newdm) | |||
27 | { | |||
28 | DM dm; | |||
29 | PetscInt p; | |||
30 | PetscMPIInt rank; | |||
31 | PetscErrorCode ierr; | |||
32 | ||||
33 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 33; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
34 | ierr = DMCreate(comm, &dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),34,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
35 | ierr = DMSetType(dm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),35,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
36 | ierr = DMSetDimension(dm, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),36,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
37 | ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),37,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
38 | switch (dim) { | |||
39 | case 2: | |||
40 | if (simplex) {ierr = PetscObjectSetName((PetscObject) dm, "triangular");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),40,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
41 | else {ierr = PetscObjectSetName((PetscObject) dm, "quadrilateral");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),41,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
42 | break; | |||
43 | case 3: | |||
44 | if (simplex) {ierr = PetscObjectSetName((PetscObject) dm, "tetrahedral");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),44,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
45 | else {ierr = PetscObjectSetName((PetscObject) dm, "hexahedral");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),45,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
46 | break; | |||
47 | default: | |||
48 | SETERRQ1(comm, PETSC_ERR_ARG_OUTOFRANGE, "Cannot make meshes for dimension %d", dim)return PetscError(comm,48,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,63,PETSC_ERROR_INITIAL,"Cannot make meshes for dimension %d" ,dim); | |||
49 | } | |||
50 | if (rank) { | |||
51 | PetscInt numPoints[2] = {0, 0}; | |||
52 | ierr = DMPlexCreateFromDAG(dm, 1, numPoints, NULL((void*)0), NULL((void*)0), NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),52,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
53 | } else { | |||
54 | switch (dim) { | |||
55 | case 2: | |||
56 | if (simplex) { | |||
57 | PetscInt numPoints[2] = {4, 2}; | |||
58 | PetscInt coneSize[6] = {3, 3, 0, 0, 0, 0}; | |||
59 | PetscInt cones[6] = {2, 3, 4, 5, 4, 3}; | |||
60 | PetscInt coneOrientations[6] = {0, 0, 0, 0, 0, 0}; | |||
61 | PetscScalar vertexCoords[8] = {-0.5, 0.5, 0.0, 0.0, 0.0, 1.0, 0.5, 0.5}; | |||
62 | PetscInt markerPoints[8] = {2, 1, 3, 1, 4, 1, 5, 1}; | |||
63 | ||||
64 | ierr = DMPlexCreateFromDAG(dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),64,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
65 | for (p = 0; p < 4; ++p) {ierr = DMSetLabelValue(dm, "marker", markerPoints[p*2], markerPoints[p*2+1]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),65,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
66 | } else { | |||
67 | PetscInt numPoints[2] = {6, 2}; | |||
68 | PetscInt coneSize[8] = {4, 4, 0, 0, 0, 0, 0, 0}; | |||
69 | PetscInt cones[8] = {2, 3, 4, 5, 3, 6, 7, 4}; | |||
70 | PetscInt coneOrientations[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | |||
71 | PetscScalar vertexCoords[12] = {-1.0, -0.5, 0.0, -0.5, 0.0, 0.5, -1.0, 0.5, 1.0, -0.5, 1.0, 0.5}; | |||
72 | ||||
73 | ierr = DMPlexCreateFromDAG(dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),73,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
74 | } | |||
75 | break; | |||
76 | case 3: | |||
77 | if (simplex) { | |||
78 | PetscInt numPoints[2] = {5, 2}; | |||
79 | PetscInt coneSize[7] = {4, 4, 0, 0, 0, 0, 0}; | |||
80 | PetscInt cones[8] = {4, 3, 5, 2, 5, 3, 4, 6}; | |||
81 | PetscInt coneOrientations[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | |||
82 | PetscScalar vertexCoords[15] = {-1.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0}; | |||
83 | PetscInt markerPoints[10] = {2, 1, 3, 1, 4, 1, 5, 1, 6, 1}; | |||
84 | ||||
85 | ierr = DMPlexCreateFromDAG(dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),85,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
86 | for (p = 0; p < 5; ++p) {ierr = DMSetLabelValue(dm, "marker", markerPoints[p*2], markerPoints[p*2+1]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),86,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
87 | } else { | |||
88 | PetscInt numPoints[2] = {12, 2}; | |||
89 | PetscInt coneSize[14] = {8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | |||
90 | PetscInt cones[16] = {2, 3, 4, 5, 6, 7, 8, 9, 5, 4, 10, 11, 7, 12, 13, 8}; | |||
91 | PetscInt coneOrientations[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | |||
92 | PetscScalar vertexCoords[36] = {-1.0, -0.5, -0.5, -1.0, 0.5, -0.5, 0.0, 0.5, -0.5, 0.0, -0.5, -0.5, | |||
93 | -1.0, -0.5, 0.5, 0.0, -0.5, 0.5, 0.0, 0.5, 0.5, -1.0, 0.5, 0.5, | |||
94 | 1.0, 0.5, -0.5, 1.0, -0.5, -0.5, 1.0, -0.5, 0.5, 1.0, 0.5, 0.5}; | |||
95 | ||||
96 | ierr = DMPlexCreateFromDAG(dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),96,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
97 | } | |||
98 | break; | |||
99 | default: | |||
100 | SETERRQ1(comm, PETSC_ERR_ARG_OUTOFRANGE, "Cannot make meshes for dimension %d", dim)return PetscError(comm,100,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,63,PETSC_ERROR_INITIAL,"Cannot make meshes for dimension %d" ,dim); | |||
101 | } | |||
102 | } | |||
103 | *newdm = dm; | |||
104 | if (refinementLimit > 0.0) { | |||
105 | DM rdm; | |||
106 | const char *name; | |||
107 | ||||
108 | ierr = DMPlexSetRefinementUniform(*newdm, PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),108,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
109 | ierr = DMPlexSetRefinementLimit(*newdm, refinementLimit);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),109,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
110 | ierr = DMRefine(*newdm, comm, &rdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),110,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
111 | ierr = PetscObjectGetName((PetscObject) *newdm, &name);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),111,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
112 | ierr = PetscObjectSetName((PetscObject) rdm, name);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),112,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
113 | ierr = DMDestroy(newdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),113,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
114 | *newdm = rdm; | |||
115 | } | |||
116 | if (interpolate) { | |||
117 | DM idm; | |||
118 | ||||
119 | ierr = DMPlexInterpolate(*newdm, &idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),119,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
120 | ierr = DMDestroy(newdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),120,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
121 | *newdm = idm; | |||
122 | } | |||
123 | { | |||
124 | DM refinedMesh = NULL((void*)0); | |||
125 | DM distributedMesh = NULL((void*)0); | |||
126 | ||||
127 | /* Distribute mesh over processes */ | |||
128 | ierr = DMPlexDistribute(*newdm, 0, NULL((void*)0), &distributedMesh);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),128,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
129 | if (distributedMesh) { | |||
130 | ierr = DMDestroy(newdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),130,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
131 | *newdm = distributedMesh; | |||
132 | } | |||
133 | if (refinementUniform) { | |||
134 | ierr = DMPlexSetRefinementUniform(*newdm, refinementUniform);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),134,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
135 | ierr = DMRefine(*newdm, comm, &refinedMesh);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),135,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
136 | if (refinedMesh) { | |||
137 | ierr = DMDestroy(newdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),137,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
138 | *newdm = refinedMesh; | |||
139 | } | |||
140 | } | |||
141 | } | |||
142 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
143 | } | |||
144 | ||||
145 | /*@ | |||
146 | DMPlexCreateSquareBoundary - Creates a 1D mesh the is the boundary of a square lattice. | |||
147 | ||||
148 | Collective | |||
149 | ||||
150 | Input Parameters: | |||
151 | + comm - The communicator for the DM object | |||
152 | . lower - The lower left corner coordinates | |||
153 | . upper - The upper right corner coordinates | |||
154 | - edges - The number of cells in each direction | |||
155 | ||||
156 | Output Parameter: | |||
157 | . dm - The DM object | |||
158 | ||||
159 | Note: Here is the numbering returned for 2 cells in each direction: | |||
160 | $ 18--5-17--4--16 | |||
161 | $ | | | | |||
162 | $ 6 10 3 | |||
163 | $ | | | | |||
164 | $ 19-11-20--9--15 | |||
165 | $ | | | | |||
166 | $ 7 8 2 | |||
167 | $ | | | | |||
168 | $ 12--0-13--1--14 | |||
169 | ||||
170 | Level: beginner | |||
171 | ||||
172 | .seealso: DMPlexCreateBoxMesh(), DMPlexCreateCubeBoundary(), DMSetType(), DMCreate() | |||
173 | @*/ | |||
174 | PetscErrorCode DMPlexCreateSquareBoundary(DM dm, const PetscReal lower[], const PetscReal upper[], const PetscInt edges[]) | |||
175 | { | |||
176 | const PetscInt numVertices = (edges[0]+1)*(edges[1]+1); | |||
177 | const PetscInt numEdges = edges[0]*(edges[1]+1) + (edges[0]+1)*edges[1]; | |||
178 | PetscInt markerTop = 1; | |||
179 | PetscInt markerBottom = 1; | |||
180 | PetscInt markerRight = 1; | |||
181 | PetscInt markerLeft = 1; | |||
182 | PetscBool markerSeparate = PETSC_FALSE; | |||
183 | Vec coordinates; | |||
184 | PetscSection coordSection; | |||
185 | PetscScalar *coords; | |||
186 | PetscInt coordSize; | |||
187 | PetscMPIInt rank; | |||
188 | PetscInt v, vx, vy; | |||
189 | PetscErrorCode ierr; | |||
190 | ||||
191 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 191; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
192 | ierr = PetscOptionsGetBool(((PetscObject) dm)->options,((PetscObject) dm)->prefix, "-dm_plex_separate_marker", &markerSeparate, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),192,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
193 | if (markerSeparate) { | |||
194 | markerTop = 3; | |||
195 | markerBottom = 1; | |||
196 | markerRight = 2; | |||
197 | markerLeft = 4; | |||
198 | } | |||
199 | ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)dm), &rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),199,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
200 | if (!rank) { | |||
201 | PetscInt e, ex, ey; | |||
202 | ||||
203 | ierr = DMPlexSetChart(dm, 0, numEdges+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),203,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
204 | for (e = 0; e < numEdges; ++e) { | |||
205 | ierr = DMPlexSetConeSize(dm, e, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),205,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
206 | } | |||
207 | ierr = DMSetUp(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),207,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* Allocate space for cones */ | |||
208 | for (vx = 0; vx <= edges[0]; vx++) { | |||
209 | for (ey = 0; ey < edges[1]; ey++) { | |||
210 | PetscInt edge = vx*edges[1] + ey + edges[0]*(edges[1]+1); | |||
211 | PetscInt vertex = ey*(edges[0]+1) + vx + numEdges; | |||
212 | PetscInt cone[2]; | |||
213 | ||||
214 | cone[0] = vertex; cone[1] = vertex+edges[0]+1; | |||
215 | ierr = DMPlexSetCone(dm, edge, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),215,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
216 | if (vx == edges[0]) { | |||
217 | ierr = DMSetLabelValue(dm, "marker", edge, markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),217,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
218 | ierr = DMSetLabelValue(dm, "marker", cone[0], markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),218,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
219 | if (ey == edges[1]-1) { | |||
220 | ierr = DMSetLabelValue(dm, "marker", cone[1], markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),220,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
221 | ierr = DMSetLabelValue(dm, "Face Sets", cone[1], markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),221,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
222 | } | |||
223 | } else if (vx == 0) { | |||
224 | ierr = DMSetLabelValue(dm, "marker", edge, markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),224,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
225 | ierr = DMSetLabelValue(dm, "marker", cone[0], markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),225,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
226 | if (ey == edges[1]-1) { | |||
227 | ierr = DMSetLabelValue(dm, "marker", cone[1], markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),227,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
228 | ierr = DMSetLabelValue(dm, "Face Sets", cone[1], markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),228,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
229 | } | |||
230 | } | |||
231 | } | |||
232 | } | |||
233 | for (vy = 0; vy <= edges[1]; vy++) { | |||
234 | for (ex = 0; ex < edges[0]; ex++) { | |||
235 | PetscInt edge = vy*edges[0] + ex; | |||
236 | PetscInt vertex = vy*(edges[0]+1) + ex + numEdges; | |||
237 | PetscInt cone[2]; | |||
238 | ||||
239 | cone[0] = vertex; cone[1] = vertex+1; | |||
240 | ierr = DMPlexSetCone(dm, edge, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),240,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
241 | if (vy == edges[1]) { | |||
242 | ierr = DMSetLabelValue(dm, "marker", edge, markerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),242,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
243 | ierr = DMSetLabelValue(dm, "marker", cone[0], markerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),243,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
244 | if (ex == edges[0]-1) { | |||
245 | ierr = DMSetLabelValue(dm, "marker", cone[1], markerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),245,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
246 | ierr = DMSetLabelValue(dm, "Face Sets", cone[1], markerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),246,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
247 | } | |||
248 | } else if (vy == 0) { | |||
249 | ierr = DMSetLabelValue(dm, "marker", edge, markerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),249,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
250 | ierr = DMSetLabelValue(dm, "marker", cone[0], markerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),250,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
251 | if (ex == edges[0]-1) { | |||
252 | ierr = DMSetLabelValue(dm, "marker", cone[1], markerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),252,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
253 | ierr = DMSetLabelValue(dm, "Face Sets", cone[1], markerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),253,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
254 | } | |||
255 | } | |||
256 | } | |||
257 | } | |||
258 | } | |||
259 | ierr = DMPlexSymmetrize(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),259,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
260 | ierr = DMPlexStratify(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),260,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
261 | /* Build coordinates */ | |||
262 | ierr = DMSetCoordinateDim(dm, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),262,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
263 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),263,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
264 | ierr = PetscSectionSetNumFields(coordSection, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),264,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
265 | ierr = PetscSectionSetChart(coordSection, numEdges, numEdges + numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),265,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
266 | ierr = PetscSectionSetFieldComponents(coordSection, 0, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),266,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
267 | for (v = numEdges; v < numEdges+numVertices; ++v) { | |||
268 | ierr = PetscSectionSetDof(coordSection, v, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),268,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
269 | ierr = PetscSectionSetFieldDof(coordSection, v, 0, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),269,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
270 | } | |||
271 | ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),271,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
272 | ierr = PetscSectionGetStorageSize(coordSection, &coordSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),272,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
273 | ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001), &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),273,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
274 | ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),274,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
275 | ierr = VecSetSizes(coordinates, coordSize, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),275,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
276 | ierr = VecSetBlockSize(coordinates, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),276,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
277 | ierr = VecSetType(coordinates,VECSTANDARD"standard");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),277,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
278 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),278,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
279 | for (vy = 0; vy <= edges[1]; ++vy) { | |||
280 | for (vx = 0; vx <= edges[0]; ++vx) { | |||
281 | coords[(vy*(edges[0]+1)+vx)*2+0] = lower[0] + ((upper[0] - lower[0])/edges[0])*vx; | |||
282 | coords[(vy*(edges[0]+1)+vx)*2+1] = lower[1] + ((upper[1] - lower[1])/edges[1])*vy; | |||
283 | } | |||
284 | } | |||
285 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),285,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
286 | ierr = DMSetCoordinatesLocal(dm, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),286,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
287 | ierr = VecDestroy(&coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),287,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
288 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
289 | } | |||
290 | ||||
291 | /*@ | |||
292 | DMPlexCreateCubeBoundary - Creates a 2D mesh that is the boundary of a cubic lattice. | |||
293 | ||||
294 | Collective | |||
295 | ||||
296 | Input Parameters: | |||
297 | + comm - The communicator for the DM object | |||
298 | . lower - The lower left front corner coordinates | |||
299 | . upper - The upper right back corner coordinates | |||
300 | - edges - The number of cells in each direction | |||
301 | ||||
302 | Output Parameter: | |||
303 | . dm - The DM object | |||
304 | ||||
305 | Level: beginner | |||
306 | ||||
307 | .seealso: DMPlexCreateBoxMesh(), DMPlexCreateSquareBoundary(), DMSetType(), DMCreate() | |||
308 | @*/ | |||
309 | PetscErrorCode DMPlexCreateCubeBoundary(DM dm, const PetscReal lower[], const PetscReal upper[], const PetscInt faces[]) | |||
310 | { | |||
311 | PetscInt vertices[3], numVertices; | |||
312 | PetscInt numFaces = 2*faces[0]*faces[1] + 2*faces[1]*faces[2] + 2*faces[0]*faces[2]; | |||
313 | Vec coordinates; | |||
314 | PetscSection coordSection; | |||
315 | PetscScalar *coords; | |||
316 | PetscInt coordSize; | |||
317 | PetscMPIInt rank; | |||
318 | PetscInt v, vx, vy, vz; | |||
319 | PetscInt voffset, iface=0, cone[4]; | |||
320 | PetscErrorCode ierr; | |||
321 | ||||
322 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 322; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
323 | if ((faces[0] < 1) || (faces[1] < 1) || (faces[2] < 1)) SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Must have at least 1 face per side")return PetscError(PetscObjectComm((PetscObject)dm),323,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",56 ,PETSC_ERROR_INITIAL,"Must have at least 1 face per side"); | |||
324 | ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)dm), &rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),324,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
325 | vertices[0] = faces[0]+1; vertices[1] = faces[1]+1; vertices[2] = faces[2]+1; | |||
326 | numVertices = vertices[0]*vertices[1]*vertices[2]; | |||
327 | if (!rank) { | |||
328 | PetscInt f; | |||
329 | ||||
330 | ierr = DMPlexSetChart(dm, 0, numFaces+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),330,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
331 | for (f = 0; f < numFaces; ++f) { | |||
332 | ierr = DMPlexSetConeSize(dm, f, 4);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),332,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
333 | } | |||
334 | ierr = DMSetUp(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),334,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* Allocate space for cones */ | |||
335 | ||||
336 | /* Side 0 (Top) */ | |||
337 | for (vy = 0; vy < faces[1]; vy++) { | |||
338 | for (vx = 0; vx < faces[0]; vx++) { | |||
339 | voffset = numFaces + vertices[0]*vertices[1]*(vertices[2]-1) + vy*vertices[0] + vx; | |||
340 | cone[0] = voffset; cone[1] = voffset+1; cone[2] = voffset+vertices[0]+1; cone[3] = voffset+vertices[0]; | |||
341 | ierr = DMPlexSetCone(dm, iface, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),341,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
342 | ierr = DMSetLabelValue(dm, "marker", iface, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),342,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
343 | ierr = DMSetLabelValue(dm, "marker", voffset+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),343,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
344 | ierr = DMSetLabelValue(dm, "marker", voffset+1, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),344,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
345 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),345,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
346 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]+1, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),346,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
347 | iface++; | |||
348 | } | |||
349 | } | |||
350 | ||||
351 | /* Side 1 (Bottom) */ | |||
352 | for (vy = 0; vy < faces[1]; vy++) { | |||
353 | for (vx = 0; vx < faces[0]; vx++) { | |||
354 | voffset = numFaces + vy*(faces[0]+1) + vx; | |||
355 | cone[0] = voffset+1; cone[1] = voffset; cone[2] = voffset+vertices[0]; cone[3] = voffset+vertices[0]+1; | |||
356 | ierr = DMPlexSetCone(dm, iface, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),356,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
357 | ierr = DMSetLabelValue(dm, "marker", iface, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),357,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
358 | ierr = DMSetLabelValue(dm, "marker", voffset+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),358,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
359 | ierr = DMSetLabelValue(dm, "marker", voffset+1, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),359,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
360 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),360,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
361 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]+1, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),361,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
362 | iface++; | |||
363 | } | |||
364 | } | |||
365 | ||||
366 | /* Side 2 (Front) */ | |||
367 | for (vz = 0; vz < faces[2]; vz++) { | |||
368 | for (vx = 0; vx < faces[0]; vx++) { | |||
369 | voffset = numFaces + vz*vertices[0]*vertices[1] + vx; | |||
370 | cone[0] = voffset; cone[1] = voffset+1; cone[2] = voffset+vertices[0]*vertices[1]+1; cone[3] = voffset+vertices[0]*vertices[1]; | |||
371 | ierr = DMPlexSetCone(dm, iface, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),371,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
372 | ierr = DMSetLabelValue(dm, "marker", iface, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),372,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
373 | ierr = DMSetLabelValue(dm, "marker", voffset+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),373,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
374 | ierr = DMSetLabelValue(dm, "marker", voffset+1, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),374,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
375 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]*vertices[1]+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),375,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
376 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]*vertices[1]+1, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),376,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
377 | iface++; | |||
378 | } | |||
379 | } | |||
380 | ||||
381 | /* Side 3 (Back) */ | |||
382 | for (vz = 0; vz < faces[2]; vz++) { | |||
383 | for (vx = 0; vx < faces[0]; vx++) { | |||
384 | voffset = numFaces + vz*vertices[0]*vertices[1] + vertices[0]*(vertices[1]-1) + vx; | |||
385 | cone[0] = voffset+vertices[0]*vertices[1]; cone[1] = voffset+vertices[0]*vertices[1]+1; | |||
386 | cone[2] = voffset+1; cone[3] = voffset; | |||
387 | ierr = DMPlexSetCone(dm, iface, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),387,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
388 | ierr = DMSetLabelValue(dm, "marker", iface, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),388,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
389 | ierr = DMSetLabelValue(dm, "marker", voffset+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),389,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
390 | ierr = DMSetLabelValue(dm, "marker", voffset+1, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),390,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
391 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]*vertices[1]+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),391,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
392 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]*vertices[1]+1, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),392,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
393 | iface++; | |||
394 | } | |||
395 | } | |||
396 | ||||
397 | /* Side 4 (Left) */ | |||
398 | for (vz = 0; vz < faces[2]; vz++) { | |||
399 | for (vy = 0; vy < faces[1]; vy++) { | |||
400 | voffset = numFaces + vz*vertices[0]*vertices[1] + vy*vertices[0]; | |||
401 | cone[0] = voffset; cone[1] = voffset+vertices[0]*vertices[1]; | |||
402 | cone[2] = voffset+vertices[0]*vertices[1]+vertices[0]; cone[3] = voffset+vertices[0]; | |||
403 | ierr = DMPlexSetCone(dm, iface, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),403,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
404 | ierr = DMSetLabelValue(dm, "marker", iface, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),404,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
405 | ierr = DMSetLabelValue(dm, "marker", voffset+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),405,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
406 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),406,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
407 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[1]+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),407,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
408 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]*vertices[1]+vertices[0], 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),408,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
409 | iface++; | |||
410 | } | |||
411 | } | |||
412 | ||||
413 | /* Side 5 (Right) */ | |||
414 | for (vz = 0; vz < faces[2]; vz++) { | |||
415 | for (vy = 0; vy < faces[1]; vy++) { | |||
416 | voffset = numFaces + vz*vertices[0]*vertices[1] + vy*vertices[0] + faces[0]; | |||
417 | cone[0] = voffset+vertices[0]*vertices[1]; cone[1] = voffset; | |||
418 | cone[2] = voffset+vertices[0]; cone[3] = voffset+vertices[0]*vertices[1]+vertices[0]; | |||
419 | ierr = DMPlexSetCone(dm, iface, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),419,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
420 | ierr = DMSetLabelValue(dm, "marker", iface, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),420,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
421 | ierr = DMSetLabelValue(dm, "marker", voffset+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),421,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
422 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),422,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
423 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]*vertices[1]+0, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),423,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
424 | ierr = DMSetLabelValue(dm, "marker", voffset+vertices[0]*vertices[1]+vertices[0], 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),424,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
425 | iface++; | |||
426 | } | |||
427 | } | |||
428 | } | |||
429 | ierr = DMPlexSymmetrize(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),429,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
430 | ierr = DMPlexStratify(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),430,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
431 | /* Build coordinates */ | |||
432 | ierr = DMSetCoordinateDim(dm, 3);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),432,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
433 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),433,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
434 | ierr = PetscSectionSetChart(coordSection, numFaces, numFaces + numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),434,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
435 | for (v = numFaces; v < numFaces+numVertices; ++v) { | |||
436 | ierr = PetscSectionSetDof(coordSection, v, 3);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),436,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
437 | } | |||
438 | ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),438,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
439 | ierr = PetscSectionGetStorageSize(coordSection, &coordSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),439,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
440 | ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001), &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),440,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
441 | ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),441,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
442 | ierr = VecSetSizes(coordinates, coordSize, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),442,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
443 | ierr = VecSetBlockSize(coordinates, 3);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),443,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
444 | ierr = VecSetType(coordinates,VECSTANDARD"standard");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),444,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
445 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),445,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
446 | for (vz = 0; vz <= faces[2]; ++vz) { | |||
447 | for (vy = 0; vy <= faces[1]; ++vy) { | |||
448 | for (vx = 0; vx <= faces[0]; ++vx) { | |||
449 | coords[((vz*(faces[1]+1)+vy)*(faces[0]+1)+vx)*3+0] = lower[0] + ((upper[0] - lower[0])/faces[0])*vx; | |||
450 | coords[((vz*(faces[1]+1)+vy)*(faces[0]+1)+vx)*3+1] = lower[1] + ((upper[1] - lower[1])/faces[1])*vy; | |||
451 | coords[((vz*(faces[1]+1)+vy)*(faces[0]+1)+vx)*3+2] = lower[2] + ((upper[2] - lower[2])/faces[2])*vz; | |||
452 | } | |||
453 | } | |||
454 | } | |||
455 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),455,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
456 | ierr = DMSetCoordinatesLocal(dm, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),456,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
457 | ierr = VecDestroy(&coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),457,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
458 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
459 | } | |||
460 | ||||
461 | static PetscErrorCode DMPlexCreateLineMesh_Internal(MPI_Comm comm,PetscInt segments,PetscReal lower,PetscReal upper,DMBoundaryType bd,DM *dm) | |||
462 | { | |||
463 | PetscInt i,fStart,fEnd,numCells = 0,numVerts = 0; | |||
464 | PetscInt numPoints[2],*coneSize,*cones,*coneOrientations; | |||
465 | PetscScalar *vertexCoords; | |||
466 | PetscReal L,maxCell; | |||
467 | PetscBool markerSeparate = PETSC_FALSE; | |||
468 | PetscInt markerLeft = 1, faceMarkerLeft = 1; | |||
469 | PetscInt markerRight = 1, faceMarkerRight = 2; | |||
470 | PetscBool wrap = (bd == DM_BOUNDARY_PERIODIC || bd == DM_BOUNDARY_TWIST) ? PETSC_TRUE : PETSC_FALSE; | |||
471 | PetscMPIInt rank; | |||
472 | PetscErrorCode ierr; | |||
473 | ||||
474 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 474; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
475 | PetscValidPointer(dm,4)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),475,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",85 ,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",4); if (! PetscCheckPointer(dm,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),475,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",4); } while (0); | |||
476 | ||||
477 | ierr = DMCreate(comm,dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),477,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
478 | ierr = DMSetType(*dm,DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),478,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
479 | ierr = DMSetDimension(*dm,1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),479,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
480 | ierr = DMCreateLabel(*dm,"marker");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),480,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
481 | ierr = DMCreateLabel(*dm,"Face Sets");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),481,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
482 | ||||
483 | ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),483,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
484 | if (!rank) numCells = segments; | |||
485 | if (!rank) numVerts = segments + (wrap ? 0 : 1); | |||
486 | ||||
487 | numPoints[0] = numVerts ; numPoints[1] = numCells; | |||
488 | ierr = PetscMalloc4(numCells+numVerts,&coneSize,numCells*2,&cones,numCells+numVerts,&coneOrientations,numVerts,&vertexCoords)PetscMallocA(4,PETSC_FALSE,488,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numCells+numVerts)*sizeof(**(&coneSize)),(& coneSize),(size_t)(numCells*2)*sizeof(**(&cones)),(&cones ),(size_t)(numCells+numVerts)*sizeof(**(&coneOrientations )),(&coneOrientations),(size_t)(numVerts)*sizeof(**(& vertexCoords)),(&vertexCoords));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),488,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
489 | ierr = PetscArrayzero(coneOrientations,numCells+numVerts)PetscMemzero(coneOrientations,(numCells+numVerts)*sizeof(*(coneOrientations )));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),489,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
490 | for (i = 0; i < numCells; ++i) { coneSize[i] = 2; } | |||
491 | for (i = 0; i < numVerts; ++i) { coneSize[numCells+i] = 0; } | |||
492 | for (i = 0; i < numCells; ++i) { cones[2*i] = numCells + i%numVerts; cones[2*i+1] = numCells + (i+1)%numVerts; } | |||
493 | for (i = 0; i < numVerts; ++i) { vertexCoords[i] = lower + (upper-lower)*((PetscReal)i/(PetscReal)numCells); } | |||
494 | ierr = DMPlexCreateFromDAG(*dm,1,numPoints,coneSize,cones,coneOrientations,vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),494,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
495 | ierr = PetscFree4(coneSize,cones,coneOrientations,vertexCoords)PetscFreeA(4,495,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,&(coneSize),&(cones),&(coneOrientations),&(vertexCoords ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),495,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
496 | ||||
497 | ierr = PetscOptionsGetBool(((PetscObject)*dm)->options,((PetscObject)*dm)->prefix,"-dm_plex_separate_marker",&markerSeparate,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),497,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
498 | if (markerSeparate) { markerLeft = faceMarkerLeft; markerRight = faceMarkerRight;} | |||
499 | if (!wrap && !rank) { | |||
500 | ierr = DMPlexGetHeightStratum(*dm,1,&fStart,&fEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),500,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
501 | ierr = DMSetLabelValue(*dm,"marker",fStart,markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),501,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
502 | ierr = DMSetLabelValue(*dm,"marker",fEnd-1,markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),502,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
503 | ierr = DMSetLabelValue(*dm,"Face Sets",fStart,faceMarkerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),503,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
504 | ierr = DMSetLabelValue(*dm,"Face Sets",fEnd-1,faceMarkerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),504,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
505 | } | |||
506 | if (wrap) { | |||
507 | L = upper - lower; | |||
508 | maxCell = (PetscReal)1.1*(L/(PetscReal)PetscMax(1,segments)(((1)<(segments)) ? (segments) : (1))); | |||
509 | ierr = DMSetPeriodicity(*dm,PETSC_TRUE,&maxCell,&L,&bd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),509,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
510 | } | |||
511 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
512 | } | |||
513 | ||||
514 | static PetscErrorCode DMPlexCreateBoxMesh_Simplex_Internal(MPI_Comm comm, PetscInt dim, const PetscInt faces[], const PetscReal lower[], const PetscReal upper[], const DMBoundaryType periodicity[], PetscBool interpolate, DM *dm) | |||
515 | { | |||
516 | DM boundary; | |||
517 | PetscInt i; | |||
518 | PetscErrorCode ierr; | |||
519 | ||||
520 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 520; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
521 | PetscValidPointer(dm, 4)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),521,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",85 ,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",4); if (! PetscCheckPointer(dm,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),521,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",4); } while (0); | |||
522 | for (i = 0; i < dim; ++i) if (periodicity[i] != DM_BOUNDARY_NONE) SETERRQ(comm, PETSC_ERR_SUP, "Periodicity is not supported for simplex meshes")return PetscError(comm,522,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,56,PETSC_ERROR_INITIAL,"Periodicity is not supported for simplex meshes" ); | |||
523 | ierr = DMCreate(comm, &boundary);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),523,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
524 | PetscValidLogicalCollectiveInt(boundary,dim,2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -dim ; b1[1] = dim; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)boundary),2,524,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)boundary))),0) || MPI_Allreduce((b1),(b2),(2),( ((MPI_Datatype)0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm ((PetscObject)boundary)))));do {if (__builtin_expect(!!(_7_ierr ),0)) return PetscError(((MPI_Comm)0x44000001),524,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)boundary) ,524,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
525 | ierr = DMSetType(boundary, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),525,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
526 | ierr = DMSetDimension(boundary, dim-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),526,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
527 | ierr = DMSetCoordinateDim(boundary, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),527,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
528 | switch (dim) { | |||
529 | case 2: ierr = DMPlexCreateSquareBoundary(boundary, lower, upper, faces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),529,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);break; | |||
530 | case 3: ierr = DMPlexCreateCubeBoundary(boundary, lower, upper, faces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),530,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);break; | |||
531 | default: SETERRQ1(comm, PETSC_ERR_SUP, "Dimension not supported: %d", dim)return PetscError(comm,531,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,56,PETSC_ERROR_INITIAL,"Dimension not supported: %d",dim); | |||
532 | } | |||
533 | ierr = DMPlexGenerate(boundary, NULL((void*)0), interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),533,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
534 | ierr = DMDestroy(&boundary);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),534,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
535 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
536 | } | |||
537 | ||||
538 | static PetscErrorCode DMPlexCreateCubeMesh_Internal(DM dm, const PetscReal lower[], const PetscReal upper[], const PetscInt edges[], DMBoundaryType bdX, DMBoundaryType bdY, DMBoundaryType bdZ) | |||
539 | { | |||
540 | DMLabel cutLabel = NULL((void*)0); | |||
541 | PetscInt markerTop = 1, faceMarkerTop = 1; | |||
542 | PetscInt markerBottom = 1, faceMarkerBottom = 1; | |||
543 | PetscInt markerFront = 1, faceMarkerFront = 1; | |||
544 | PetscInt markerBack = 1, faceMarkerBack = 1; | |||
545 | PetscInt markerRight = 1, faceMarkerRight = 1; | |||
546 | PetscInt markerLeft = 1, faceMarkerLeft = 1; | |||
547 | PetscInt dim; | |||
548 | PetscBool markerSeparate = PETSC_FALSE, cutMarker = PETSC_FALSE; | |||
549 | PetscMPIInt rank; | |||
550 | PetscErrorCode ierr; | |||
551 | ||||
552 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 552; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
553 | ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),553,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
554 | ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)dm), &rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),554,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
555 | ierr = DMCreateLabel(dm,"marker");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),555,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
556 | ierr = DMCreateLabel(dm,"Face Sets");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),556,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
557 | ierr = PetscOptionsGetBool(((PetscObject) dm)->options,((PetscObject) dm)->prefix, "-dm_plex_periodic_cut", &cutMarker, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),557,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
558 | if (bdX == DM_BOUNDARY_PERIODIC || bdX == DM_BOUNDARY_TWIST || | |||
559 | bdY == DM_BOUNDARY_PERIODIC || bdY == DM_BOUNDARY_TWIST || | |||
560 | bdZ == DM_BOUNDARY_PERIODIC || bdZ == DM_BOUNDARY_TWIST) { | |||
561 | ||||
562 | if (cutMarker) {ierr = DMCreateLabel(dm, "periodic_cut");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),562,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); ierr = DMGetLabel(dm, "periodic_cut", &cutLabel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),562,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
563 | } | |||
564 | switch (dim) { | |||
565 | case 2: | |||
566 | faceMarkerTop = 3; | |||
567 | faceMarkerBottom = 1; | |||
568 | faceMarkerRight = 2; | |||
569 | faceMarkerLeft = 4; | |||
570 | break; | |||
571 | case 3: | |||
572 | faceMarkerBottom = 1; | |||
573 | faceMarkerTop = 2; | |||
574 | faceMarkerFront = 3; | |||
575 | faceMarkerBack = 4; | |||
576 | faceMarkerRight = 5; | |||
577 | faceMarkerLeft = 6; | |||
578 | break; | |||
579 | default: | |||
580 | SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Dimension %d not supported",dim)return PetscError(((MPI_Comm)0x44000001),580,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,56,PETSC_ERROR_INITIAL,"Dimension %d not supported",dim); | |||
581 | break; | |||
582 | } | |||
583 | ierr = PetscOptionsGetBool(((PetscObject) dm)->options,((PetscObject) dm)->prefix, "-dm_plex_separate_marker", &markerSeparate, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),583,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
584 | if (markerSeparate) { | |||
585 | markerBottom = faceMarkerBottom; | |||
586 | markerTop = faceMarkerTop; | |||
587 | markerFront = faceMarkerFront; | |||
588 | markerBack = faceMarkerBack; | |||
589 | markerRight = faceMarkerRight; | |||
590 | markerLeft = faceMarkerLeft; | |||
591 | } | |||
592 | { | |||
593 | const PetscInt numXEdges = !rank ? edges[0] : 0; | |||
594 | const PetscInt numYEdges = !rank ? edges[1] : 0; | |||
595 | const PetscInt numZEdges = !rank ? edges[2] : 0; | |||
596 | const PetscInt numXVertices = !rank ? (bdX == DM_BOUNDARY_PERIODIC || bdX == DM_BOUNDARY_TWIST ? edges[0] : edges[0]+1) : 0; | |||
597 | const PetscInt numYVertices = !rank ? (bdY == DM_BOUNDARY_PERIODIC || bdY == DM_BOUNDARY_TWIST ? edges[1] : edges[1]+1) : 0; | |||
598 | const PetscInt numZVertices = !rank ? (bdZ == DM_BOUNDARY_PERIODIC || bdZ == DM_BOUNDARY_TWIST ? edges[2] : edges[2]+1) : 0; | |||
599 | const PetscInt numCells = numXEdges*numYEdges*numZEdges; | |||
600 | const PetscInt numXFaces = numYEdges*numZEdges; | |||
601 | const PetscInt numYFaces = numXEdges*numZEdges; | |||
602 | const PetscInt numZFaces = numXEdges*numYEdges; | |||
603 | const PetscInt numTotXFaces = numXVertices*numXFaces; | |||
604 | const PetscInt numTotYFaces = numYVertices*numYFaces; | |||
605 | const PetscInt numTotZFaces = numZVertices*numZFaces; | |||
606 | const PetscInt numFaces = numTotXFaces + numTotYFaces + numTotZFaces; | |||
607 | const PetscInt numTotXEdges = numXEdges*numYVertices*numZVertices; | |||
608 | const PetscInt numTotYEdges = numYEdges*numXVertices*numZVertices; | |||
609 | const PetscInt numTotZEdges = numZEdges*numXVertices*numYVertices; | |||
610 | const PetscInt numVertices = numXVertices*numYVertices*numZVertices; | |||
611 | const PetscInt numEdges = numTotXEdges + numTotYEdges + numTotZEdges; | |||
612 | const PetscInt firstVertex = (dim == 2) ? numFaces : numCells; | |||
613 | const PetscInt firstXFace = (dim == 2) ? 0 : numCells + numVertices; | |||
614 | const PetscInt firstYFace = firstXFace + numTotXFaces; | |||
615 | const PetscInt firstZFace = firstYFace + numTotYFaces; | |||
616 | const PetscInt firstXEdge = numCells + numFaces + numVertices; | |||
617 | const PetscInt firstYEdge = firstXEdge + numTotXEdges; | |||
618 | const PetscInt firstZEdge = firstYEdge + numTotYEdges; | |||
619 | Vec coordinates; | |||
620 | PetscSection coordSection; | |||
621 | PetscScalar *coords; | |||
622 | PetscInt coordSize; | |||
623 | PetscInt v, vx, vy, vz; | |||
624 | PetscInt c, f, fx, fy, fz, e, ex, ey, ez; | |||
625 | ||||
626 | ierr = DMPlexSetChart(dm, 0, numCells+numFaces+numEdges+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),626,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
627 | for (c = 0; c < numCells; c++) { | |||
628 | ierr = DMPlexSetConeSize(dm, c, 6);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),628,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
629 | } | |||
630 | for (f = firstXFace; f < firstXFace+numFaces; ++f) { | |||
631 | ierr = DMPlexSetConeSize(dm, f, 4);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),631,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
632 | } | |||
633 | for (e = firstXEdge; e < firstXEdge+numEdges; ++e) { | |||
634 | ierr = DMPlexSetConeSize(dm, e, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),634,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
635 | } | |||
636 | ierr = DMSetUp(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),636,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* Allocate space for cones */ | |||
637 | /* Build cells */ | |||
638 | for (fz = 0; fz < numZEdges; ++fz) { | |||
639 | for (fy = 0; fy < numYEdges; ++fy) { | |||
640 | for (fx = 0; fx < numXEdges; ++fx) { | |||
641 | PetscInt cell = (fz*numYEdges + fy)*numXEdges + fx; | |||
642 | PetscInt faceB = firstZFace + (fy*numXEdges+fx)*numZVertices + fz; | |||
643 | PetscInt faceT = firstZFace + (fy*numXEdges+fx)*numZVertices + ((fz+1)%numZVertices); | |||
644 | PetscInt faceF = firstYFace + (fz*numXEdges+fx)*numYVertices + fy; | |||
645 | PetscInt faceK = firstYFace + (fz*numXEdges+fx)*numYVertices + ((fy+1)%numYVertices); | |||
646 | PetscInt faceL = firstXFace + (fz*numYEdges+fy)*numXVertices + fx; | |||
647 | PetscInt faceR = firstXFace + (fz*numYEdges+fy)*numXVertices + ((fx+1)%numXVertices); | |||
648 | /* B, T, F, K, R, L */ | |||
649 | PetscInt ornt[6] = {-4, 0, 0, -1, 0, -4}; /* ??? */ | |||
650 | PetscInt cone[6]; | |||
651 | ||||
652 | /* no boundary twisting in 3D */ | |||
653 | cone[0] = faceB; cone[1] = faceT; cone[2] = faceF; cone[3] = faceK; cone[4] = faceR; cone[5] = faceL; | |||
654 | ierr = DMPlexSetCone(dm, cell, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),654,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
655 | ierr = DMPlexSetConeOrientation(dm, cell, ornt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),655,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
656 | if (bdX != DM_BOUNDARY_NONE && fx == numXEdges-1 && cutLabel) {ierr = DMLabelSetValue(cutLabel, cell, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),656,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
657 | if (bdY != DM_BOUNDARY_NONE && fy == numYEdges-1 && cutLabel) {ierr = DMLabelSetValue(cutLabel, cell, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),657,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
658 | if (bdZ != DM_BOUNDARY_NONE && fz == numZEdges-1 && cutLabel) {ierr = DMLabelSetValue(cutLabel, cell, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),658,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
659 | } | |||
660 | } | |||
661 | } | |||
662 | /* Build x faces */ | |||
663 | for (fz = 0; fz < numZEdges; ++fz) { | |||
664 | for (fy = 0; fy < numYEdges; ++fy) { | |||
665 | for (fx = 0; fx < numXVertices; ++fx) { | |||
666 | PetscInt face = firstXFace + (fz*numYEdges+fy)*numXVertices + fx; | |||
667 | PetscInt edgeL = firstZEdge + ( fy* numXVertices+fx)*numZEdges + fz; | |||
668 | PetscInt edgeR = firstZEdge + (((fy+1)%numYVertices)*numXVertices+fx)*numZEdges + fz; | |||
669 | PetscInt edgeB = firstYEdge + ( fz* numXVertices+fx)*numYEdges + fy; | |||
670 | PetscInt edgeT = firstYEdge + (((fz+1)%numZVertices)*numXVertices+fx)*numYEdges + fy; | |||
671 | PetscInt ornt[4] = {0, 0, -2, -2}; | |||
672 | PetscInt cone[4]; | |||
673 | ||||
674 | if (dim == 3) { | |||
675 | /* markers */ | |||
676 | if (bdX != DM_BOUNDARY_PERIODIC) { | |||
677 | if (fx == numXVertices-1) { | |||
678 | ierr = DMSetLabelValue(dm, "Face Sets", face, faceMarkerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),678,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
679 | ierr = DMSetLabelValue(dm, "marker", face, markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),679,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
680 | } | |||
681 | else if (fx == 0) { | |||
682 | ierr = DMSetLabelValue(dm, "Face Sets", face, faceMarkerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),682,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
683 | ierr = DMSetLabelValue(dm, "marker", face, markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),683,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
684 | } | |||
685 | } | |||
686 | } | |||
687 | cone[0] = edgeB; cone[1] = edgeR; cone[2] = edgeT; cone[3] = edgeL; | |||
688 | ierr = DMPlexSetCone(dm, face, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),688,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
689 | ierr = DMPlexSetConeOrientation(dm, face, ornt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),689,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
690 | } | |||
691 | } | |||
692 | } | |||
693 | /* Build y faces */ | |||
694 | for (fz = 0; fz < numZEdges; ++fz) { | |||
695 | for (fx = 0; fx < numXEdges; ++fx) { | |||
696 | for (fy = 0; fy < numYVertices; ++fy) { | |||
697 | PetscInt face = firstYFace + (fz*numXEdges+fx)*numYVertices + fy; | |||
698 | PetscInt edgeL = firstZEdge + (fy*numXVertices+ fx )*numZEdges + fz; | |||
699 | PetscInt edgeR = firstZEdge + (fy*numXVertices+((fx+1)%numXVertices))*numZEdges + fz; | |||
700 | PetscInt edgeB = firstXEdge + ( fz *numYVertices+fy)*numXEdges + fx; | |||
701 | PetscInt edgeT = firstXEdge + (((fz+1)%numZVertices)*numYVertices+fy)*numXEdges + fx; | |||
702 | PetscInt ornt[4] = {0, 0, -2, -2}; | |||
703 | PetscInt cone[4]; | |||
704 | ||||
705 | if (dim == 3) { | |||
706 | /* markers */ | |||
707 | if (bdY != DM_BOUNDARY_PERIODIC) { | |||
708 | if (fy == numYVertices-1) { | |||
709 | ierr = DMSetLabelValue(dm, "Face Sets", face, faceMarkerBack);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),709,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
710 | ierr = DMSetLabelValue(dm, "marker", face, markerBack);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),710,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
711 | } | |||
712 | else if (fy == 0) { | |||
713 | ierr = DMSetLabelValue(dm, "Face Sets", face, faceMarkerFront);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),713,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
714 | ierr = DMSetLabelValue(dm, "marker", face, markerFront);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),714,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
715 | } | |||
716 | } | |||
717 | } | |||
718 | cone[0] = edgeB; cone[1] = edgeR; cone[2] = edgeT; cone[3] = edgeL; | |||
719 | ierr = DMPlexSetCone(dm, face, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),719,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
720 | ierr = DMPlexSetConeOrientation(dm, face, ornt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),720,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
721 | } | |||
722 | } | |||
723 | } | |||
724 | /* Build z faces */ | |||
725 | for (fy = 0; fy < numYEdges; ++fy) { | |||
726 | for (fx = 0; fx < numXEdges; ++fx) { | |||
727 | for (fz = 0; fz < numZVertices; fz++) { | |||
728 | PetscInt face = firstZFace + (fy*numXEdges+fx)*numZVertices + fz; | |||
729 | PetscInt edgeL = firstYEdge + (fz*numXVertices+ fx )*numYEdges + fy; | |||
730 | PetscInt edgeR = firstYEdge + (fz*numXVertices+((fx+1)%numXVertices))*numYEdges + fy; | |||
731 | PetscInt edgeB = firstXEdge + (fz*numYVertices+ fy )*numXEdges + fx; | |||
732 | PetscInt edgeT = firstXEdge + (fz*numYVertices+((fy+1)%numYVertices))*numXEdges + fx; | |||
733 | PetscInt ornt[4] = {0, 0, -2, -2}; | |||
734 | PetscInt cone[4]; | |||
735 | ||||
736 | if (dim == 2) { | |||
737 | if (bdX == DM_BOUNDARY_TWIST && fx == numXEdges-1) {edgeR += numYEdges-1-2*fy; ornt[1] = -2;} | |||
738 | if (bdY == DM_BOUNDARY_TWIST && fy == numYEdges-1) {edgeT += numXEdges-1-2*fx; ornt[2] = 0;} | |||
739 | if (bdX != DM_BOUNDARY_NONE && fx == numXEdges-1 && cutLabel) {ierr = DMLabelSetValue(cutLabel, face, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),739,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
740 | if (bdY != DM_BOUNDARY_NONE && fy == numYEdges-1 && cutLabel) {ierr = DMLabelSetValue(cutLabel, face, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),740,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
741 | } else { | |||
742 | /* markers */ | |||
743 | if (bdZ != DM_BOUNDARY_PERIODIC) { | |||
744 | if (fz == numZVertices-1) { | |||
745 | ierr = DMSetLabelValue(dm, "Face Sets", face, faceMarkerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),745,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
746 | ierr = DMSetLabelValue(dm, "marker", face, markerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),746,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
747 | } | |||
748 | else if (fz == 0) { | |||
749 | ierr = DMSetLabelValue(dm, "Face Sets", face, faceMarkerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),749,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
750 | ierr = DMSetLabelValue(dm, "marker", face, markerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),750,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
751 | } | |||
752 | } | |||
753 | } | |||
754 | cone[0] = edgeB; cone[1] = edgeR; cone[2] = edgeT; cone[3] = edgeL; | |||
755 | ierr = DMPlexSetCone(dm, face, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),755,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
756 | ierr = DMPlexSetConeOrientation(dm, face, ornt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),756,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
757 | } | |||
758 | } | |||
759 | } | |||
760 | /* Build Z edges*/ | |||
761 | for (vy = 0; vy < numYVertices; vy++) { | |||
762 | for (vx = 0; vx < numXVertices; vx++) { | |||
763 | for (ez = 0; ez < numZEdges; ez++) { | |||
764 | const PetscInt edge = firstZEdge + (vy*numXVertices+vx)*numZEdges + ez; | |||
765 | const PetscInt vertexB = firstVertex + ( ez *numYVertices+vy)*numXVertices + vx; | |||
766 | const PetscInt vertexT = firstVertex + (((ez+1)%numZVertices)*numYVertices+vy)*numXVertices + vx; | |||
767 | PetscInt cone[2]; | |||
768 | ||||
769 | if (dim == 3) { | |||
770 | if (bdX != DM_BOUNDARY_PERIODIC) { | |||
771 | if (vx == numXVertices-1) { | |||
772 | ierr = DMSetLabelValue(dm, "marker", edge, markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),772,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
773 | } | |||
774 | else if (vx == 0) { | |||
775 | ierr = DMSetLabelValue(dm, "marker", edge, markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),775,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
776 | } | |||
777 | } | |||
778 | if (bdY != DM_BOUNDARY_PERIODIC) { | |||
779 | if (vy == numYVertices-1) { | |||
780 | ierr = DMSetLabelValue(dm, "marker", edge, markerBack);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),780,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
781 | } | |||
782 | else if (vy == 0) { | |||
783 | ierr = DMSetLabelValue(dm, "marker", edge, markerFront);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),783,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
784 | } | |||
785 | } | |||
786 | } | |||
787 | cone[0] = vertexB; cone[1] = vertexT; | |||
788 | ierr = DMPlexSetCone(dm, edge, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),788,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
789 | } | |||
790 | } | |||
791 | } | |||
792 | /* Build Y edges*/ | |||
793 | for (vz = 0; vz < numZVertices; vz++) { | |||
794 | for (vx = 0; vx < numXVertices; vx++) { | |||
795 | for (ey = 0; ey < numYEdges; ey++) { | |||
796 | const PetscInt nextv = (dim == 2 && bdY == DM_BOUNDARY_TWIST && ey == numYEdges-1) ? (numXVertices-vx-1) : (vz*numYVertices+((ey+1)%numYVertices))*numXVertices + vx; | |||
797 | const PetscInt edge = firstYEdge + (vz*numXVertices+vx)*numYEdges + ey; | |||
798 | const PetscInt vertexF = firstVertex + (vz*numYVertices+ey)*numXVertices + vx; | |||
799 | const PetscInt vertexK = firstVertex + nextv; | |||
800 | PetscInt cone[2]; | |||
801 | ||||
802 | cone[0] = vertexF; cone[1] = vertexK; | |||
803 | ierr = DMPlexSetCone(dm, edge, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),803,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
804 | if (dim == 2) { | |||
805 | if ((bdX != DM_BOUNDARY_PERIODIC) && (bdX != DM_BOUNDARY_TWIST)) { | |||
806 | if (vx == numXVertices-1) { | |||
807 | ierr = DMSetLabelValue(dm, "Face Sets", edge, faceMarkerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),807,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
808 | ierr = DMSetLabelValue(dm, "marker", edge, markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),808,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
809 | ierr = DMSetLabelValue(dm, "marker", cone[0], markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),809,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
810 | if (ey == numYEdges-1) { | |||
811 | ierr = DMSetLabelValue(dm, "marker", cone[1], markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),811,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
812 | } | |||
813 | } else if (vx == 0) { | |||
814 | ierr = DMSetLabelValue(dm, "Face Sets", edge, faceMarkerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),814,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
815 | ierr = DMSetLabelValue(dm, "marker", edge, markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),815,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
816 | ierr = DMSetLabelValue(dm, "marker", cone[0], markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),816,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
817 | if (ey == numYEdges-1) { | |||
818 | ierr = DMSetLabelValue(dm, "marker", cone[1], markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),818,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
819 | } | |||
820 | } | |||
821 | } else { | |||
822 | if (vx == 0 && cutLabel) { | |||
823 | ierr = DMLabelSetValue(cutLabel, edge, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),823,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
824 | ierr = DMLabelSetValue(cutLabel, cone[0], 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),824,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
825 | if (ey == numYEdges-1) { | |||
826 | ierr = DMLabelSetValue(cutLabel, cone[1], 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),826,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
827 | } | |||
828 | } | |||
829 | } | |||
830 | } else { | |||
831 | if (bdX != DM_BOUNDARY_PERIODIC) { | |||
832 | if (vx == numXVertices-1) { | |||
833 | ierr = DMSetLabelValue(dm, "marker", edge, markerRight);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),833,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
834 | } else if (vx == 0) { | |||
835 | ierr = DMSetLabelValue(dm, "marker", edge, markerLeft);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),835,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
836 | } | |||
837 | } | |||
838 | if (bdZ != DM_BOUNDARY_PERIODIC) { | |||
839 | if (vz == numZVertices-1) { | |||
840 | ierr = DMSetLabelValue(dm, "marker", edge, markerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),840,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
841 | } else if (vz == 0) { | |||
842 | ierr = DMSetLabelValue(dm, "marker", edge, markerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),842,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
843 | } | |||
844 | } | |||
845 | } | |||
846 | } | |||
847 | } | |||
848 | } | |||
849 | /* Build X edges*/ | |||
850 | for (vz = 0; vz < numZVertices; vz++) { | |||
851 | for (vy = 0; vy < numYVertices; vy++) { | |||
852 | for (ex = 0; ex < numXEdges; ex++) { | |||
853 | const PetscInt nextv = (dim == 2 && bdX == DM_BOUNDARY_TWIST && ex == numXEdges-1) ? (numYVertices-vy-1)*numXVertices : (vz*numYVertices+vy)*numXVertices + (ex+1)%numXVertices; | |||
854 | const PetscInt edge = firstXEdge + (vz*numYVertices+vy)*numXEdges + ex; | |||
855 | const PetscInt vertexL = firstVertex + (vz*numYVertices+vy)*numXVertices + ex; | |||
856 | const PetscInt vertexR = firstVertex + nextv; | |||
857 | PetscInt cone[2]; | |||
858 | ||||
859 | cone[0] = vertexL; cone[1] = vertexR; | |||
860 | ierr = DMPlexSetCone(dm, edge, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),860,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
861 | if (dim == 2) { | |||
862 | if ((bdY != DM_BOUNDARY_PERIODIC) && (bdY != DM_BOUNDARY_TWIST)) { | |||
863 | if (vy == numYVertices-1) { | |||
864 | ierr = DMSetLabelValue(dm, "Face Sets", edge, faceMarkerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),864,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
865 | ierr = DMSetLabelValue(dm, "marker", edge, markerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),865,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
866 | ierr = DMSetLabelValue(dm, "marker", cone[0], markerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),866,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
867 | if (ex == numXEdges-1) { | |||
868 | ierr = DMSetLabelValue(dm, "marker", cone[1], markerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),868,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
869 | } | |||
870 | } else if (vy == 0) { | |||
871 | ierr = DMSetLabelValue(dm, "Face Sets", edge, faceMarkerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),871,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
872 | ierr = DMSetLabelValue(dm, "marker", edge, markerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),872,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
873 | ierr = DMSetLabelValue(dm, "marker", cone[0], markerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),873,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
874 | if (ex == numXEdges-1) { | |||
875 | ierr = DMSetLabelValue(dm, "marker", cone[1], markerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),875,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
876 | } | |||
877 | } | |||
878 | } else { | |||
879 | if (vy == 0 && cutLabel) { | |||
880 | ierr = DMLabelSetValue(cutLabel, edge, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),880,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
881 | ierr = DMLabelSetValue(cutLabel, cone[0], 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),881,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
882 | if (ex == numXEdges-1) { | |||
883 | ierr = DMLabelSetValue(cutLabel, cone[1], 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),883,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
884 | } | |||
885 | } | |||
886 | } | |||
887 | } else { | |||
888 | if (bdY != DM_BOUNDARY_PERIODIC) { | |||
889 | if (vy == numYVertices-1) { | |||
890 | ierr = DMSetLabelValue(dm, "marker", edge, markerBack);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),890,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
891 | } | |||
892 | else if (vy == 0) { | |||
893 | ierr = DMSetLabelValue(dm, "marker", edge, markerFront);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),893,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
894 | } | |||
895 | } | |||
896 | if (bdZ != DM_BOUNDARY_PERIODIC) { | |||
897 | if (vz == numZVertices-1) { | |||
898 | ierr = DMSetLabelValue(dm, "marker", edge, markerTop);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),898,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
899 | } | |||
900 | else if (vz == 0) { | |||
901 | ierr = DMSetLabelValue(dm, "marker", edge, markerBottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),901,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
902 | } | |||
903 | } | |||
904 | } | |||
905 | } | |||
906 | } | |||
907 | } | |||
908 | ierr = DMPlexSymmetrize(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),908,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
909 | ierr = DMPlexStratify(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),909,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
910 | /* Build coordinates */ | |||
911 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),911,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
912 | ierr = PetscSectionSetNumFields(coordSection, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),912,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
913 | ierr = PetscSectionSetFieldComponents(coordSection, 0, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),913,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
914 | ierr = PetscSectionSetChart(coordSection, firstVertex, firstVertex+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),914,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
915 | for (v = firstVertex; v < firstVertex+numVertices; ++v) { | |||
916 | ierr = PetscSectionSetDof(coordSection, v, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),916,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
917 | ierr = PetscSectionSetFieldDof(coordSection, v, 0, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),917,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
918 | } | |||
919 | ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),919,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
920 | ierr = PetscSectionGetStorageSize(coordSection, &coordSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),920,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
921 | ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001), &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),921,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
922 | ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),922,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
923 | ierr = VecSetSizes(coordinates, coordSize, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),923,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
924 | ierr = VecSetBlockSize(coordinates, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),924,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
925 | ierr = VecSetType(coordinates,VECSTANDARD"standard");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),925,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
926 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),926,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
927 | for (vz = 0; vz < numZVertices; ++vz) { | |||
928 | for (vy = 0; vy < numYVertices; ++vy) { | |||
929 | for (vx = 0; vx < numXVertices; ++vx) { | |||
930 | coords[((vz*numYVertices+vy)*numXVertices+vx)*dim+0] = lower[0] + ((upper[0] - lower[0])/numXEdges)*vx; | |||
931 | coords[((vz*numYVertices+vy)*numXVertices+vx)*dim+1] = lower[1] + ((upper[1] - lower[1])/numYEdges)*vy; | |||
932 | if (dim == 3) { | |||
933 | coords[((vz*numYVertices+vy)*numXVertices+vx)*dim+2] = lower[2] + ((upper[2] - lower[2])/numZEdges)*vz; | |||
934 | } | |||
935 | } | |||
936 | } | |||
937 | } | |||
938 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),938,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
939 | ierr = DMSetCoordinatesLocal(dm, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),939,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
940 | ierr = VecDestroy(&coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),940,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
941 | } | |||
942 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
943 | } | |||
944 | ||||
945 | static PetscErrorCode DMPlexCreateBoxMesh_Tensor_Internal(MPI_Comm comm, PetscInt dim, const PetscInt faces[], const PetscReal lower[], const PetscReal upper[], const DMBoundaryType periodicity[], PetscBool interpolate, DM *dm) | |||
946 | { | |||
947 | PetscInt i; | |||
948 | PetscErrorCode ierr; | |||
949 | ||||
950 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 950; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
951 | PetscValidPointer(dm, 7)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),951,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",85 ,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",7); if (! PetscCheckPointer(dm,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),951,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",7); } while (0); | |||
952 | ierr = DMCreate(comm, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),952,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
953 | PetscValidLogicalCollectiveInt(*dm,dim,2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -dim ; b1[1] = dim; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)*dm),2,953,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)*dm))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )*dm)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),953,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)*dm),953, __func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
954 | ierr = DMSetType(*dm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),954,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
955 | ierr = DMSetDimension(*dm, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),955,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
956 | switch (dim) { | |||
957 | case 2: {ierr = DMPlexCreateCubeMesh_Internal(*dm, lower, upper, faces, periodicity[0], periodicity[1], DM_BOUNDARY_NONE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),957,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);break;} | |||
958 | case 3: {ierr = DMPlexCreateCubeMesh_Internal(*dm, lower, upper, faces, periodicity[0], periodicity[1], periodicity[2]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),958,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);break;} | |||
959 | default: SETERRQ1(comm, PETSC_ERR_SUP, "Dimension not supported: %d", dim)return PetscError(comm,959,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,56,PETSC_ERROR_INITIAL,"Dimension not supported: %d",dim); | |||
960 | } | |||
961 | if (periodicity[0] == DM_BOUNDARY_PERIODIC || periodicity[0] == DM_BOUNDARY_TWIST || | |||
962 | periodicity[1] == DM_BOUNDARY_PERIODIC || periodicity[1] == DM_BOUNDARY_TWIST || | |||
963 | (dim > 2 && (periodicity[2] == DM_BOUNDARY_PERIODIC || periodicity[2] == DM_BOUNDARY_TWIST))) { | |||
964 | PetscReal L[3]; | |||
965 | PetscReal maxCell[3]; | |||
966 | ||||
967 | for (i = 0; i < dim; i++) { | |||
968 | L[i] = upper[i] - lower[i]; | |||
969 | maxCell[i] = 1.1 * (L[i] / PetscMax(1,faces[i])(((1)<(faces[i])) ? (faces[i]) : (1))); | |||
970 | } | |||
971 | ierr = DMSetPeriodicity(*dm,PETSC_TRUE,maxCell,L,periodicity);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),971,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
972 | } | |||
973 | if (!interpolate) { | |||
974 | DM udm; | |||
975 | ||||
976 | ierr = DMPlexUninterpolate(*dm, &udm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),976,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
977 | ierr = DMPlexCopyCoordinates(*dm, udm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),977,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
978 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),978,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
979 | *dm = udm; | |||
980 | } | |||
981 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
982 | } | |||
983 | ||||
984 | /*@C | |||
985 | DMPlexCreateBoxMesh - Creates a mesh on the tensor product of unit intervals (box) using simplices or tensor cells (hexahedra). | |||
986 | ||||
987 | Collective | |||
988 | ||||
989 | Input Parameters: | |||
990 | + comm - The communicator for the DM object | |||
991 | . dim - The spatial dimension | |||
992 | . simplex - PETSC_TRUE for simplices, PETSC_FALSE for tensor cells | |||
993 | . faces - Number of faces per dimension, or NULL for (1,) in 1D and (2, 2) in 2D and (1, 1, 1) in 3D | |||
994 | . lower - The lower left corner, or NULL for (0, 0, 0) | |||
995 | . upper - The upper right corner, or NULL for (1, 1, 1) | |||
996 | . periodicity - The boundary type for the X,Y,Z direction, or NULL for DM_BOUNDARY_NONE | |||
997 | - interpolate - Flag to create intermediate mesh pieces (edges, faces) | |||
998 | ||||
999 | Output Parameter: | |||
1000 | . dm - The DM object | |||
1001 | ||||
1002 | Options Database Keys: | |||
1003 | + -dm_plex_box_lower <x,y,z> - Specify lower-left-bottom coordinates for the box | |||
1004 | - -dm_plex_box_upper <x,y,z> - Specify upper-right-top coordinates for the box | |||
1005 | ||||
1006 | Note: Here is the numbering returned for 2 faces in each direction for tensor cells: | |||
1007 | $ 10---17---11---18----12 | |||
1008 | $ | | | | |||
1009 | $ | | | | |||
1010 | $ 20 2 22 3 24 | |||
1011 | $ | | | | |||
1012 | $ | | | | |||
1013 | $ 7---15----8---16----9 | |||
1014 | $ | | | | |||
1015 | $ | | | | |||
1016 | $ 19 0 21 1 23 | |||
1017 | $ | | | | |||
1018 | $ | | | | |||
1019 | $ 4---13----5---14----6 | |||
1020 | ||||
1021 | and for simplicial cells | |||
1022 | ||||
1023 | $ 14----8---15----9----16 | |||
1024 | $ |\ 5 |\ 7 | | |||
1025 | $ | \ | \ | | |||
1026 | $ 13 2 14 3 15 | |||
1027 | $ | 4 \ | 6 \ | | |||
1028 | $ | \ | \ | | |||
1029 | $ 11----6---12----7----13 | |||
1030 | $ |\ |\ | | |||
1031 | $ | \ 1 | \ 3 | | |||
1032 | $ 10 0 11 1 12 | |||
1033 | $ | 0 \ | 2 \ | | |||
1034 | $ | \ | \ | | |||
1035 | $ 8----4----9----5----10 | |||
1036 | ||||
1037 | Level: beginner | |||
1038 | ||||
1039 | .seealso: DMPlexCreateFromFile(), DMPlexCreateHexCylinderMesh(), DMSetType(), DMCreate() | |||
1040 | @*/ | |||
1041 | PetscErrorCode DMPlexCreateBoxMesh(MPI_Comm comm, PetscInt dim, PetscBool simplex, const PetscInt faces[], const PetscReal lower[], const PetscReal upper[], const DMBoundaryType periodicity[], PetscBool interpolate, DM *dm) | |||
1042 | { | |||
1043 | PetscInt fac[3] = {0, 0, 0}; | |||
1044 | PetscReal low[3] = {0, 0, 0}; | |||
1045 | PetscReal upp[3] = {1, 1, 1}; | |||
1046 | DMBoundaryType bdt[3] = {DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE}; | |||
1047 | PetscInt i, n; | |||
1048 | PetscBool flg; | |||
1049 | PetscErrorCode ierr; | |||
1050 | ||||
1051 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 1051; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1052 | n = 3; | |||
1053 | ierr = PetscOptionsGetIntArray(NULL((void*)0), NULL((void*)0), "-dm_plex_box_faces", fac, &n, &flg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1053,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1054 | for (i = 0; i < dim; ++i) fac[i] = faces ? faces[i] : (flg && i < n ? fac[i] : (dim == 1 ? 1 : 4-dim)); | |||
1055 | if (lower) for (i = 0; i < dim; ++i) low[i] = lower[i]; | |||
1056 | if (upper) for (i = 0; i < dim; ++i) upp[i] = upper[i]; | |||
1057 | if (periodicity) for (i = 0; i < dim; ++i) bdt[i] = periodicity[i]; | |||
1058 | /* Allow bounds to be specified from the command line */ | |||
1059 | n = 3; | |||
1060 | ierr = PetscOptionsGetRealArray(NULL((void*)0), NULL((void*)0), "-dm_plex_box_lower", low, &n, &flg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1060,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1061 | if (flg && (n != dim)) SETERRQ2(comm, PETSC_ERR_ARG_SIZ, "Lower box point had %D values, should have been %D", n, dim)return PetscError(comm,1061,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,60,PETSC_ERROR_INITIAL,"Lower box point had %D values, should have been %D" ,n,dim); | |||
1062 | n = 3; | |||
1063 | ierr = PetscOptionsGetRealArray(NULL((void*)0), NULL((void*)0), "-dm_plex_box_upper", upp, &n, &flg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1063,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1064 | if (flg && (n != dim)) SETERRQ2(comm, PETSC_ERR_ARG_SIZ, "Upper box point had %D values, should have been %D", n, dim)return PetscError(comm,1064,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,60,PETSC_ERROR_INITIAL,"Upper box point had %D values, should have been %D" ,n,dim); | |||
1065 | ||||
1066 | if (dim == 1) {ierr = DMPlexCreateLineMesh_Internal(comm, fac[0], low[0], upp[0], bdt[0], dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1066,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
1067 | else if (simplex) {ierr = DMPlexCreateBoxMesh_Simplex_Internal(comm, dim, fac, low, upp, bdt, interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1067,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
1068 | else {ierr = DMPlexCreateBoxMesh_Tensor_Internal(comm, dim, fac, low, upp, bdt, interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1068,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
1069 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1070 | } | |||
1071 | ||||
1072 | /*@ | |||
1073 | DMPlexCreateWedgeBoxMesh - Creates a 3-D mesh tesselating the (x,y) plane and extruding in the third direction using wedge cells. | |||
1074 | ||||
1075 | Collective | |||
1076 | ||||
1077 | Input Parameters: | |||
1078 | + comm - The communicator for the DM object | |||
1079 | . faces - Number of faces per dimension, or NULL for (1, 1, 1) | |||
1080 | . lower - The lower left corner, or NULL for (0, 0, 0) | |||
1081 | . upper - The upper right corner, or NULL for (1, 1, 1) | |||
1082 | . periodicity - The boundary type for the X,Y,Z direction, or NULL for DM_BOUNDARY_NONE | |||
1083 | . ordExt - If PETSC_TRUE, orders the extruded cells in the height first. Otherwise, orders the cell on the layers first | |||
1084 | - interpolate - Flag to create intermediate mesh pieces (edges, faces) | |||
1085 | ||||
1086 | Output Parameter: | |||
1087 | . dm - The DM object | |||
1088 | ||||
1089 | Level: beginner | |||
1090 | ||||
1091 | .seealso: DMPlexCreateHexCylinderMesh(), DMPlexCreateWedgeCylinderMesh(), DMPlexExtrude(), DMPlexCreateBoxMesh(), DMSetType(), DMCreate() | |||
1092 | @*/ | |||
1093 | PetscErrorCode DMPlexCreateWedgeBoxMesh(MPI_Comm comm, const PetscInt faces[], const PetscReal lower[], const PetscReal upper[], const DMBoundaryType periodicity[], PetscBool ordExt, PetscBool interpolate, DM *dm) | |||
1094 | { | |||
1095 | DM bdm, botdm; | |||
1096 | PetscInt i; | |||
1097 | PetscInt fac[3] = {0, 0, 0}; | |||
1098 | PetscReal low[3] = {0, 0, 0}; | |||
1099 | PetscReal upp[3] = {1, 1, 1}; | |||
1100 | DMBoundaryType bdt[3] = {DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE}; | |||
1101 | PetscErrorCode ierr; | |||
1102 | ||||
1103 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 1103; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1104 | for (i = 0; i < 3; ++i) fac[i] = faces ? (faces[i] > 0 ? faces[i] : 1) : 1; | |||
1105 | if (lower) for (i = 0; i < 3; ++i) low[i] = lower[i]; | |||
1106 | if (upper) for (i = 0; i < 3; ++i) upp[i] = upper[i]; | |||
1107 | if (periodicity) for (i = 0; i < 3; ++i) bdt[i] = periodicity[i]; | |||
1108 | for (i = 0; i < 3; ++i) if (bdt[i] != DM_BOUNDARY_NONE) SETERRQ(comm, PETSC_ERR_SUP, "Periodicity not yet supported")return PetscError(comm,1108,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,56,PETSC_ERROR_INITIAL,"Periodicity not yet supported"); | |||
1109 | ||||
1110 | ierr = DMCreate(comm, &bdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1110,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1111 | ierr = DMSetType(bdm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1111,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1112 | ierr = DMSetDimension(bdm, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1112,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1113 | ierr = DMSetCoordinateDim(bdm, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1113,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1114 | ierr = DMPlexCreateSquareBoundary(bdm, low, upp, fac);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1114,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1115 | ierr = DMPlexGenerate(bdm, NULL((void*)0), PETSC_FALSE, &botdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1115,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1116 | ierr = DMDestroy(&bdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1116,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1117 | ierr = DMPlexExtrude(botdm, fac[2], upp[2] - low[2], ordExt, interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1117,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1118 | if (low[2] != 0.0) { | |||
1119 | Vec v; | |||
1120 | PetscScalar *x; | |||
1121 | PetscInt cDim, n; | |||
1122 | ||||
1123 | ierr = DMGetCoordinatesLocal(*dm, &v);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1123,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1124 | ierr = VecGetBlockSize(v, &cDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1124,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1125 | ierr = VecGetLocalSize(v, &n);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1125,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1126 | ierr = VecGetArray(v, &x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1126,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1127 | x += cDim; | |||
1128 | for (i=0; i<n; i+=cDim) x[i] += low[2]; | |||
1129 | ierr = VecRestoreArray(v,&x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1129,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1130 | ierr = DMSetCoordinatesLocal(*dm, v);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1130,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1131 | } | |||
1132 | ierr = DMDestroy(&botdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1132,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1133 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1134 | } | |||
1135 | ||||
1136 | /*@ | |||
1137 | DMPlexExtrude - Creates a (d+1)-D mesh by extruding a d-D mesh in the normal direction using prismatic cells. | |||
1138 | ||||
1139 | Collective on idm | |||
1140 | ||||
1141 | Input Parameters: | |||
1142 | + idm - The mesh to be extruted | |||
1143 | . layers - The number of layers | |||
1144 | . height - The height of the extruded layer | |||
1145 | . ordExt - If PETSC_TRUE, orders the extruded cells in the height first. Otherwise, orders the cell on the layers first | |||
1146 | - interpolate - Flag to create intermediate mesh pieces (edges, faces) | |||
1147 | ||||
1148 | Output Parameter: | |||
1149 | . dm - The DM object | |||
1150 | ||||
1151 | Notes: The object created is an hybrid mesh, the vertex ordering in the cone of the cell is that of the prismatic cells | |||
1152 | ||||
1153 | Level: advanced | |||
1154 | ||||
1155 | .seealso: DMPlexCreateWedgeCylinderMesh(), DMPlexCreateWedgeBoxMesh(), DMPlexSetHybridBounds(), DMSetType(), DMCreate() | |||
1156 | @*/ | |||
1157 | PetscErrorCode DMPlexExtrude(DM idm, PetscInt layers, PetscReal height, PetscBool ordExt, PetscBool interpolate, DM* dm) | |||
1158 | { | |||
1159 | PetscScalar *coordsB; | |||
1160 | const PetscScalar *coordsA; | |||
1161 | PetscReal *normals = NULL((void*)0); | |||
1162 | Vec coordinatesA, coordinatesB; | |||
1163 | PetscSection coordSectionA, coordSectionB; | |||
1164 | PetscInt dim, cDim, cDimB, c, l, v, coordSize, *newCone; | |||
1165 | PetscInt cStart, cEnd, vStart, vEnd, cellV, numCells, numVertices; | |||
1166 | PetscErrorCode ierr; | |||
1167 | ||||
1168 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 1168; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1169 | PetscValidHeaderSpecific(idm, DM_CLASSID, 1)do { if (!idm) return PetscError(((MPI_Comm)0x44000001),1169, __func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if ( !PetscCheckPointer(idm,PETSC_OBJECT)) return PetscError(((MPI_Comm )0x44000001),1169,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(idm))->classid != DM_CLASSID) { if (((PetscObject)(idm))->classid == -1) return PetscError(( (MPI_Comm)0x44000001),1169,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1169,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",62 ,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1 ); } } while (0); | |||
1170 | PetscValidLogicalCollectiveInt(idm, layers, 2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -layers ; b1[1] = layers; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)idm),2,1170,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)idm))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )idm)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),1170,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)idm),1170 ,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
1171 | PetscValidLogicalCollectiveReal(idm, height, 3)do { PetscErrorCode _7_ierr; PetscReal b1[3],b2[3]; if (PetscIsNanReal (height)) {b1[2] = 1;} else {b1[2] = 0;}; b1[0] = -height; b1 [1] = height; _7_ierr = ((petsc_allreduce_ct += PetscMPIParallelComm ((PetscObjectComm((PetscObject)idm))),0) || MPI_Allreduce((b1 ),(b2),(3),(((MPI_Datatype)0x4c00080b)),((MPI_Op)(0x58000001) ),(PetscObjectComm((PetscObject)idm))));do {if (__builtin_expect (!!(_7_ierr),0)) return PetscError(((MPI_Comm)0x44000001),1171 ,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (!(b2[2] > 0) && !PetscEqualReal(-b2[0],b2[1])) return PetscError (PetscObjectComm((PetscObject)idm),1171,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Real value must be same on all processes, argument # %d" ,3); } while (0); | |||
1172 | PetscValidLogicalCollectiveBool(idm, interpolate, 4)do { PetscErrorCode _7_ierr; PetscMPIInt b1[2],b2[2]; b1[0] = -(PetscMPIInt)interpolate; b1[1] = (PetscMPIInt)interpolate; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm((PetscObject )idm),2,1172,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)idm))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )idm)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),1172,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)idm),1172 ,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Bool value must be same on all processes, argument # %d" ,4); } while (0); | |||
1173 | ierr = DMGetDimension(idm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1173,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1174 | if (dim < 1 || dim > 3) SETERRQ1(PetscObjectComm((PetscObject)idm), PETSC_ERR_SUP, "Support for dimension %D not coded", dim)return PetscError(PetscObjectComm((PetscObject)idm),1174,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",56 ,PETSC_ERROR_INITIAL,"Support for dimension %D not coded",dim ); | |||
1175 | ||||
1176 | ierr = DMPlexGetHeightStratum(idm, 0, &cStart, &cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1176,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1177 | ierr = DMPlexGetDepthStratum(idm, 0, &vStart, &vEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1177,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1178 | numCells = (cEnd - cStart)*layers; | |||
1179 | numVertices = (vEnd - vStart)*(layers+1); | |||
1180 | ierr = DMCreate(PetscObjectComm((PetscObject)idm), dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1180,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1181 | ierr = DMSetType(*dm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1181,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1182 | ierr = DMSetDimension(*dm, dim+1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1182,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1183 | ierr = DMPlexSetChart(*dm, 0, numCells+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1183,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1184 | for (c = cStart, cellV = 0; c < cEnd; ++c) { | |||
1185 | PetscInt *closure = NULL((void*)0); | |||
1186 | PetscInt closureSize, numCorners = 0; | |||
1187 | ||||
1188 | ierr = DMPlexGetTransitiveClosure(idm, c, PETSC_TRUE, &closureSize, &closure);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1188,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1189 | for (v = 0; v < closureSize*2; v += 2) if ((closure[v] >= vStart) && (closure[v] < vEnd)) numCorners++; | |||
1190 | ierr = DMPlexRestoreTransitiveClosure(idm, c, PETSC_TRUE, &closureSize, &closure);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1190,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1191 | for (l = 0; l < layers; ++l) { | |||
1192 | ierr = DMPlexSetConeSize(*dm, ordExt ? layers*(c - cStart) + l : l*(cEnd - cStart) + c - cStart, 2*numCorners);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1192,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1193 | } | |||
1194 | cellV = PetscMax(numCorners,cellV)(((numCorners)<(cellV)) ? (cellV) : (numCorners)); | |||
1195 | } | |||
1196 | ierr = DMPlexSetHybridBounds(*dm, 0, PETSC_DETERMINE-1, PETSC_DETERMINE-1, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1196,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1197 | ierr = DMSetUp(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1197,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1198 | ||||
1199 | ierr = DMGetCoordinateDim(idm, &cDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1199,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1200 | if (dim != cDim) { | |||
1201 | ierr = PetscCalloc1(cDim*(vEnd - vStart), &normals)PetscMallocA(1,PETSC_TRUE,1201,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(cDim*(vEnd - vStart))*sizeof(**(&normals)),(& normals));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1201,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1202 | } | |||
1203 | ierr = PetscMalloc1(3*cellV,&newCone)PetscMallocA(1,PETSC_FALSE,1203,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(3*cellV)*sizeof(**(&newCone)),(&newCone));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1203,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1204 | for (c = cStart; c < cEnd; ++c) { | |||
1205 | PetscInt *closure = NULL((void*)0); | |||
1206 | PetscInt closureSize, numCorners = 0, l; | |||
1207 | PetscReal normal[3] = {0, 0, 0}; | |||
1208 | ||||
1209 | if (normals) { | |||
1210 | ierr = DMPlexComputeCellGeometryFVM(idm, c, NULL((void*)0), NULL((void*)0), normal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1210,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1211 | } | |||
1212 | ierr = DMPlexGetTransitiveClosure(idm, c, PETSC_TRUE, &closureSize, &closure);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1212,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1213 | for (v = 0; v < closureSize*2; v += 2) { | |||
1214 | if ((closure[v] >= vStart) && (closure[v] < vEnd)) { | |||
1215 | PetscInt d; | |||
1216 | ||||
1217 | newCone[numCorners++] = closure[v] - vStart; | |||
1218 | if (normals) { for (d = 0; d < cDim; ++d) normals[cDim*(closure[v]-vStart)+d] += normal[d]; } | |||
1219 | } | |||
1220 | } | |||
1221 | switch (numCorners) { | |||
1222 | case 4: /* do nothing */ | |||
1223 | case 2: /* do nothing */ | |||
1224 | break; | |||
1225 | case 3: /* from counter-clockwise to wedge ordering */ | |||
1226 | l = newCone[1]; | |||
1227 | newCone[1] = newCone[2]; | |||
1228 | newCone[2] = l; | |||
1229 | break; | |||
1230 | default: SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported number of corners: %D", numCorners)return PetscError(((MPI_Comm)0x44000001),1230,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,56,PETSC_ERROR_INITIAL,"Unsupported number of corners: %D",numCorners ); | |||
1231 | } | |||
1232 | ierr = DMPlexRestoreTransitiveClosure(idm, c, PETSC_TRUE, &closureSize, &closure);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1232,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1233 | for (l = 0; l < layers; ++l) { | |||
1234 | PetscInt i; | |||
1235 | ||||
1236 | for (i = 0; i < numCorners; ++i) { | |||
1237 | newCone[ numCorners + i] = ordExt ? (layers+1)*newCone[i] + l + numCells : l*(vEnd - vStart) + newCone[i] + numCells; | |||
1238 | newCone[2*numCorners + i] = ordExt ? (layers+1)*newCone[i] + l + 1 + numCells : (l+1)*(vEnd - vStart) + newCone[i] + numCells; | |||
1239 | } | |||
1240 | ierr = DMPlexSetCone(*dm, ordExt ? layers*(c - cStart) + l : l*(cEnd - cStart) + c - cStart, newCone + numCorners);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1240,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1241 | } | |||
1242 | } | |||
1243 | ierr = DMPlexSymmetrize(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1243,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1244 | ierr = DMPlexStratify(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1244,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1245 | ierr = PetscFree(newCone)((*PetscTrFree)((void*)(newCone),1245,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((newCone) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1245,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1246 | ||||
1247 | cDimB = cDim == dim ? cDim+1 : cDim; | |||
1248 | ierr = DMGetCoordinateSection(*dm, &coordSectionB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1248,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1249 | ierr = PetscSectionSetNumFields(coordSectionB, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1249,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1250 | ierr = PetscSectionSetFieldComponents(coordSectionB, 0, cDimB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1250,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1251 | ierr = PetscSectionSetChart(coordSectionB, numCells, numCells+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1251,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1252 | for (v = numCells; v < numCells+numVertices; ++v) { | |||
1253 | ierr = PetscSectionSetDof(coordSectionB, v, cDimB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1253,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1254 | ierr = PetscSectionSetFieldDof(coordSectionB, v, 0, cDimB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1254,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1255 | } | |||
1256 | ierr = PetscSectionSetUp(coordSectionB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1256,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1257 | ierr = PetscSectionGetStorageSize(coordSectionB, &coordSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1257,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1258 | ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001), &coordinatesB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1258,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1259 | ierr = PetscObjectSetName((PetscObject) coordinatesB, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1259,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1260 | ierr = VecSetSizes(coordinatesB, coordSize, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1260,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1261 | ierr = VecSetBlockSize(coordinatesB, cDimB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1261,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1262 | ierr = VecSetType(coordinatesB,VECSTANDARD"standard");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1262,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1263 | ||||
1264 | ierr = DMGetCoordinateSection(idm, &coordSectionA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1264,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1265 | ierr = DMGetCoordinatesLocal(idm, &coordinatesA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1265,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1266 | ierr = VecGetArray(coordinatesB, &coordsB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1266,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1267 | ierr = VecGetArrayRead(coordinatesA, &coordsA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1267,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1268 | for (v = vStart; v < vEnd; ++v) { | |||
1269 | const PetscScalar *cptr; | |||
1270 | PetscReal ones2[2] = { 0., 1.}, ones3[3] = { 0., 0., 1.}; | |||
1271 | PetscReal *normal, norm, h = height/layers; | |||
1272 | PetscInt offA, d, cDimA = cDim; | |||
1273 | ||||
1274 | normal = normals ? normals + cDimB*(v - vStart) : (cDim > 1 ? ones3 : ones2); | |||
1275 | if (normals) { | |||
1276 | for (d = 0, norm = 0.0; d < cDimB; ++d) norm += normal[d]*normal[d]; | |||
1277 | for (d = 0; d < cDimB; ++d) normal[d] *= 1./PetscSqrtReal(norm)sqrt(norm); | |||
1278 | } | |||
1279 | ||||
1280 | ierr = PetscSectionGetOffset(coordSectionA, v, &offA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1280,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1281 | cptr = coordsA + offA; | |||
1282 | for (l = 0; l < layers+1; ++l) { | |||
1283 | PetscInt offB, d, newV; | |||
1284 | ||||
1285 | newV = ordExt ? (layers+1)*(v -vStart) + l + numCells : (vEnd -vStart)*l + (v -vStart) + numCells; | |||
1286 | ierr = PetscSectionGetOffset(coordSectionB, newV, &offB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1286,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1287 | for (d = 0; d < cDimA; ++d) { coordsB[offB+d] = cptr[d]; } | |||
1288 | for (d = 0; d < cDimB; ++d) { coordsB[offB+d] += l ? normal[d]*h : 0.0; } | |||
1289 | cptr = coordsB + offB; | |||
1290 | cDimA = cDimB; | |||
1291 | } | |||
1292 | } | |||
1293 | ierr = VecRestoreArrayRead(coordinatesA, &coordsA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1293,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1294 | ierr = VecRestoreArray(coordinatesB, &coordsB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1294,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1295 | ierr = DMSetCoordinatesLocal(*dm, coordinatesB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1295,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1296 | ierr = VecDestroy(&coordinatesB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1296,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1297 | ierr = PetscFree(normals)((*PetscTrFree)((void*)(normals),1297,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((normals) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1297,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1298 | if (interpolate) { | |||
1299 | DM idm; | |||
1300 | ||||
1301 | ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1301,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1302 | ierr = DMPlexCopyCoordinates(*dm, idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1302,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1303 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1303,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1304 | *dm = idm; | |||
1305 | } | |||
1306 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1307 | } | |||
1308 | ||||
1309 | /*@C | |||
1310 | DMPlexSetOptionsPrefix - Sets the prefix used for searching for all DM options in the database. | |||
1311 | ||||
1312 | Logically Collective on dm | |||
1313 | ||||
1314 | Input Parameters: | |||
1315 | + dm - the DM context | |||
1316 | - prefix - the prefix to prepend to all option names | |||
1317 | ||||
1318 | Notes: | |||
1319 | A hyphen (-) must NOT be given at the beginning of the prefix name. | |||
1320 | The first character of all runtime options is AUTOMATICALLY the hyphen. | |||
1321 | ||||
1322 | Level: advanced | |||
1323 | ||||
1324 | .seealso: SNESSetFromOptions() | |||
1325 | @*/ | |||
1326 | PetscErrorCode DMPlexSetOptionsPrefix(DM dm, const char prefix[]) | |||
1327 | { | |||
1328 | DM_Plex *mesh = (DM_Plex *) dm->data; | |||
1329 | PetscErrorCode ierr; | |||
1330 | ||||
1331 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 1331; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1332 | PetscValidHeaderSpecific(dm, DM_CLASSID, 1)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),1332,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",85 ,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (dm,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1332 ,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(dm))->classid != DM_CLASSID) { if ( ((PetscObject)(dm))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1332,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1332,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",62 ,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1 ); } } while (0); | |||
1333 | ierr = PetscObjectSetOptionsPrefix((PetscObject) dm, prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1333,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1334 | ierr = PetscObjectSetOptionsPrefix((PetscObject) mesh->partitioner, prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1334,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1335 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1336 | } | |||
1337 | ||||
1338 | /*@ | |||
1339 | DMPlexCreateHexCylinderMesh - Creates a mesh on the tensor product of the unit interval with the circle (cylinder) using hexahedra. | |||
1340 | ||||
1341 | Collective | |||
1342 | ||||
1343 | Input Parameters: | |||
1344 | + comm - The communicator for the DM object | |||
1345 | . numRefine - The number of regular refinements to the basic 5 cell structure | |||
1346 | - periodicZ - The boundary type for the Z direction | |||
1347 | ||||
1348 | Output Parameter: | |||
1349 | . dm - The DM object | |||
1350 | ||||
1351 | Note: Here is the output numbering looking from the bottom of the cylinder: | |||
1352 | $ 17-----14 | |||
1353 | $ | | | |||
1354 | $ | 2 | | |||
1355 | $ | | | |||
1356 | $ 17-----8-----7-----14 | |||
1357 | $ | | | | | |||
1358 | $ | 3 | 0 | 1 | | |||
1359 | $ | | | | | |||
1360 | $ 19-----5-----6-----13 | |||
1361 | $ | | | |||
1362 | $ | 4 | | |||
1363 | $ | | | |||
1364 | $ 19-----13 | |||
1365 | $ | |||
1366 | $ and up through the top | |||
1367 | $ | |||
1368 | $ 18-----16 | |||
1369 | $ | | | |||
1370 | $ | 2 | | |||
1371 | $ | | | |||
1372 | $ 18----10----11-----16 | |||
1373 | $ | | | | | |||
1374 | $ | 3 | 0 | 1 | | |||
1375 | $ | | | | | |||
1376 | $ 20-----9----12-----15 | |||
1377 | $ | | | |||
1378 | $ | 4 | | |||
1379 | $ | | | |||
1380 | $ 20-----15 | |||
1381 | ||||
1382 | Level: beginner | |||
1383 | ||||
1384 | .seealso: DMPlexCreateBoxMesh(), DMSetType(), DMCreate() | |||
1385 | @*/ | |||
1386 | PetscErrorCode DMPlexCreateHexCylinderMesh(MPI_Comm comm, PetscInt numRefine, DMBoundaryType periodicZ, DM *dm) | |||
1387 | { | |||
1388 | const PetscInt dim = 3; | |||
1389 | PetscInt numCells, numVertices, r; | |||
1390 | PetscMPIInt rank; | |||
1391 | PetscErrorCode ierr; | |||
1392 | ||||
1393 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 1393; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1394 | PetscValidPointer(dm, 4)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),1394,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",85 ,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",4); if (! PetscCheckPointer(dm,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),1394,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",4); } while (0); | |||
1395 | ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1395,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1396 | if (numRefine < 0) SETERRQ1(comm, PETSC_ERR_ARG_OUTOFRANGE, "Number of refinements %D cannot be negative", numRefine)return PetscError(comm,1396,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,63,PETSC_ERROR_INITIAL,"Number of refinements %D cannot be negative" ,numRefine); | |||
1397 | ierr = DMCreate(comm, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1397,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1398 | ierr = DMSetType(*dm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1398,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1399 | ierr = DMSetDimension(*dm, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1399,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1400 | /* Create topology */ | |||
1401 | { | |||
1402 | PetscInt cone[8], c; | |||
1403 | ||||
1404 | numCells = !rank ? 5 : 0; | |||
1405 | numVertices = !rank ? 16 : 0; | |||
1406 | if (periodicZ == DM_BOUNDARY_PERIODIC) { | |||
1407 | numCells *= 3; | |||
1408 | numVertices = !rank ? 24 : 0; | |||
1409 | } | |||
1410 | ierr = DMPlexSetChart(*dm, 0, numCells+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1410,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1411 | for (c = 0; c < numCells; c++) {ierr = DMPlexSetConeSize(*dm, c, 8);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1411,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
1412 | ierr = DMSetUp(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1412,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1413 | if (!rank) { | |||
1414 | if (periodicZ == DM_BOUNDARY_PERIODIC) { | |||
1415 | cone[0] = 15; cone[1] = 18; cone[2] = 17; cone[3] = 16; | |||
1416 | cone[4] = 31; cone[5] = 32; cone[6] = 33; cone[7] = 34; | |||
1417 | ierr = DMPlexSetCone(*dm, 0, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1417,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1418 | cone[0] = 16; cone[1] = 17; cone[2] = 24; cone[3] = 23; | |||
1419 | cone[4] = 32; cone[5] = 36; cone[6] = 37; cone[7] = 33; /* 22 25 26 21 */ | |||
1420 | ierr = DMPlexSetCone(*dm, 1, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1420,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1421 | cone[0] = 18; cone[1] = 27; cone[2] = 24; cone[3] = 17; | |||
1422 | cone[4] = 34; cone[5] = 33; cone[6] = 37; cone[7] = 38; | |||
1423 | ierr = DMPlexSetCone(*dm, 2, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1423,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1424 | cone[0] = 29; cone[1] = 27; cone[2] = 18; cone[3] = 15; | |||
1425 | cone[4] = 35; cone[5] = 31; cone[6] = 34; cone[7] = 38; | |||
1426 | ierr = DMPlexSetCone(*dm, 3, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1426,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1427 | cone[0] = 29; cone[1] = 15; cone[2] = 16; cone[3] = 23; | |||
1428 | cone[4] = 35; cone[5] = 36; cone[6] = 32; cone[7] = 31; | |||
1429 | ierr = DMPlexSetCone(*dm, 4, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1429,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1430 | ||||
1431 | cone[0] = 31; cone[1] = 34; cone[2] = 33; cone[3] = 32; | |||
1432 | cone[4] = 19; cone[5] = 22; cone[6] = 21; cone[7] = 20; | |||
1433 | ierr = DMPlexSetCone(*dm, 5, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1433,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1434 | cone[0] = 32; cone[1] = 33; cone[2] = 37; cone[3] = 36; | |||
1435 | cone[4] = 22; cone[5] = 25; cone[6] = 26; cone[7] = 21; | |||
1436 | ierr = DMPlexSetCone(*dm, 6, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1436,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1437 | cone[0] = 34; cone[1] = 38; cone[2] = 37; cone[3] = 33; | |||
1438 | cone[4] = 20; cone[5] = 21; cone[6] = 26; cone[7] = 28; | |||
1439 | ierr = DMPlexSetCone(*dm, 7, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1439,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1440 | cone[0] = 35; cone[1] = 38; cone[2] = 34; cone[3] = 31; | |||
1441 | cone[4] = 30; cone[5] = 19; cone[6] = 20; cone[7] = 28; | |||
1442 | ierr = DMPlexSetCone(*dm, 8, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1442,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1443 | cone[0] = 35; cone[1] = 31; cone[2] = 32; cone[3] = 36; | |||
1444 | cone[4] = 30; cone[5] = 25; cone[6] = 22; cone[7] = 19; | |||
1445 | ierr = DMPlexSetCone(*dm, 9, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1445,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1446 | ||||
1447 | cone[0] = 19; cone[1] = 20; cone[2] = 21; cone[3] = 22; | |||
1448 | cone[4] = 15; cone[5] = 16; cone[6] = 17; cone[7] = 18; | |||
1449 | ierr = DMPlexSetCone(*dm, 10, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1449,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1450 | cone[0] = 22; cone[1] = 21; cone[2] = 26; cone[3] = 25; | |||
1451 | cone[4] = 16; cone[5] = 23; cone[6] = 24; cone[7] = 17; | |||
1452 | ierr = DMPlexSetCone(*dm, 11, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1452,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1453 | cone[0] = 20; cone[1] = 28; cone[2] = 26; cone[3] = 21; | |||
1454 | cone[4] = 18; cone[5] = 17; cone[6] = 24; cone[7] = 27; | |||
1455 | ierr = DMPlexSetCone(*dm, 12, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1455,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1456 | cone[0] = 30; cone[1] = 28; cone[2] = 20; cone[3] = 19; | |||
1457 | cone[4] = 29; cone[5] = 15; cone[6] = 18; cone[7] = 27; | |||
1458 | ierr = DMPlexSetCone(*dm, 13, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1458,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1459 | cone[0] = 30; cone[1] = 19; cone[2] = 22; cone[3] = 25; | |||
1460 | cone[4] = 29; cone[5] = 23; cone[6] = 16; cone[7] = 15; | |||
1461 | ierr = DMPlexSetCone(*dm, 14, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1461,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1462 | } else { | |||
1463 | cone[0] = 5; cone[1] = 8; cone[2] = 7; cone[3] = 6; | |||
1464 | cone[4] = 9; cone[5] = 12; cone[6] = 11; cone[7] = 10; | |||
1465 | ierr = DMPlexSetCone(*dm, 0, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1465,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1466 | cone[0] = 6; cone[1] = 7; cone[2] = 14; cone[3] = 13; | |||
1467 | cone[4] = 12; cone[5] = 15; cone[6] = 16; cone[7] = 11; | |||
1468 | ierr = DMPlexSetCone(*dm, 1, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1468,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1469 | cone[0] = 8; cone[1] = 17; cone[2] = 14; cone[3] = 7; | |||
1470 | cone[4] = 10; cone[5] = 11; cone[6] = 16; cone[7] = 18; | |||
1471 | ierr = DMPlexSetCone(*dm, 2, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1471,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1472 | cone[0] = 19; cone[1] = 17; cone[2] = 8; cone[3] = 5; | |||
1473 | cone[4] = 20; cone[5] = 9; cone[6] = 10; cone[7] = 18; | |||
1474 | ierr = DMPlexSetCone(*dm, 3, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1474,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1475 | cone[0] = 19; cone[1] = 5; cone[2] = 6; cone[3] = 13; | |||
1476 | cone[4] = 20; cone[5] = 15; cone[6] = 12; cone[7] = 9; | |||
1477 | ierr = DMPlexSetCone(*dm, 4, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1477,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1478 | } | |||
1479 | } | |||
1480 | ierr = DMPlexSymmetrize(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1480,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1481 | ierr = DMPlexStratify(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1481,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1482 | } | |||
1483 | /* Interpolate */ | |||
1484 | { | |||
1485 | DM idm; | |||
1486 | ||||
1487 | ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1487,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1488 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1488,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1489 | *dm = idm; | |||
1490 | } | |||
1491 | /* Create cube geometry */ | |||
1492 | { | |||
1493 | Vec coordinates; | |||
1494 | PetscSection coordSection; | |||
1495 | PetscScalar *coords; | |||
1496 | PetscInt coordSize, v; | |||
1497 | const PetscReal dis = 1.0/PetscSqrtReal(2.0)sqrt(2.0); | |||
1498 | const PetscReal ds2 = dis/2.0; | |||
1499 | ||||
1500 | /* Build coordinates */ | |||
1501 | ierr = DMGetCoordinateSection(*dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1501,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1502 | ierr = PetscSectionSetNumFields(coordSection, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1502,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1503 | ierr = PetscSectionSetFieldComponents(coordSection, 0, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1503,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1504 | ierr = PetscSectionSetChart(coordSection, numCells, numCells+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1504,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1505 | for (v = numCells; v < numCells+numVertices; ++v) { | |||
1506 | ierr = PetscSectionSetDof(coordSection, v, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1506,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1507 | ierr = PetscSectionSetFieldDof(coordSection, v, 0, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1507,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1508 | } | |||
1509 | ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1509,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1510 | ierr = PetscSectionGetStorageSize(coordSection, &coordSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1510,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1511 | ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001), &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1511,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1512 | ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1512,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1513 | ierr = VecSetSizes(coordinates, coordSize, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1513,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1514 | ierr = VecSetBlockSize(coordinates, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1514,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1515 | ierr = VecSetType(coordinates,VECSTANDARD"standard");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1515,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1516 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1516,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1517 | if (!rank) { | |||
1518 | coords[0*dim+0] = -ds2; coords[0*dim+1] = -ds2; coords[0*dim+2] = 0.0; | |||
1519 | coords[1*dim+0] = ds2; coords[1*dim+1] = -ds2; coords[1*dim+2] = 0.0; | |||
1520 | coords[2*dim+0] = ds2; coords[2*dim+1] = ds2; coords[2*dim+2] = 0.0; | |||
1521 | coords[3*dim+0] = -ds2; coords[3*dim+1] = ds2; coords[3*dim+2] = 0.0; | |||
1522 | coords[4*dim+0] = -ds2; coords[4*dim+1] = -ds2; coords[4*dim+2] = 1.0; | |||
1523 | coords[5*dim+0] = -ds2; coords[5*dim+1] = ds2; coords[5*dim+2] = 1.0; | |||
1524 | coords[6*dim+0] = ds2; coords[6*dim+1] = ds2; coords[6*dim+2] = 1.0; | |||
1525 | coords[7*dim+0] = ds2; coords[7*dim+1] = -ds2; coords[7*dim+2] = 1.0; | |||
1526 | coords[ 8*dim+0] = dis; coords[ 8*dim+1] = -dis; coords[ 8*dim+2] = 0.0; | |||
1527 | coords[ 9*dim+0] = dis; coords[ 9*dim+1] = dis; coords[ 9*dim+2] = 0.0; | |||
1528 | coords[10*dim+0] = dis; coords[10*dim+1] = -dis; coords[10*dim+2] = 1.0; | |||
1529 | coords[11*dim+0] = dis; coords[11*dim+1] = dis; coords[11*dim+2] = 1.0; | |||
1530 | coords[12*dim+0] = -dis; coords[12*dim+1] = dis; coords[12*dim+2] = 0.0; | |||
1531 | coords[13*dim+0] = -dis; coords[13*dim+1] = dis; coords[13*dim+2] = 1.0; | |||
1532 | coords[14*dim+0] = -dis; coords[14*dim+1] = -dis; coords[14*dim+2] = 0.0; | |||
1533 | coords[15*dim+0] = -dis; coords[15*dim+1] = -dis; coords[15*dim+2] = 1.0; | |||
1534 | if (periodicZ == DM_BOUNDARY_PERIODIC) { | |||
1535 | /* 15 31 19 */ coords[16*dim+0] = -ds2; coords[16*dim+1] = -ds2; coords[16*dim+2] = 0.5; | |||
1536 | /* 16 32 22 */ coords[17*dim+0] = ds2; coords[17*dim+1] = -ds2; coords[17*dim+2] = 0.5; | |||
1537 | /* 17 33 21 */ coords[18*dim+0] = ds2; coords[18*dim+1] = ds2; coords[18*dim+2] = 0.5; | |||
1538 | /* 18 34 20 */ coords[19*dim+0] = -ds2; coords[19*dim+1] = ds2; coords[19*dim+2] = 0.5; | |||
1539 | /* 29 35 30 */ coords[20*dim+0] = -dis; coords[20*dim+1] = -dis; coords[20*dim+2] = 0.5; | |||
1540 | /* 23 36 25 */ coords[21*dim+0] = dis; coords[21*dim+1] = -dis; coords[21*dim+2] = 0.5; | |||
1541 | /* 24 37 26 */ coords[22*dim+0] = dis; coords[22*dim+1] = dis; coords[22*dim+2] = 0.5; | |||
1542 | /* 27 38 28 */ coords[23*dim+0] = -dis; coords[23*dim+1] = dis; coords[23*dim+2] = 0.5; | |||
1543 | } | |||
1544 | } | |||
1545 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1545,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1546 | ierr = DMSetCoordinatesLocal(*dm, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1546,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1547 | ierr = VecDestroy(&coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1547,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1548 | } | |||
1549 | /* Create periodicity */ | |||
1550 | if (periodicZ == DM_BOUNDARY_PERIODIC || periodicZ == DM_BOUNDARY_TWIST) { | |||
1551 | PetscReal L[3]; | |||
1552 | PetscReal maxCell[3]; | |||
1553 | DMBoundaryType bdType[3]; | |||
1554 | PetscReal lower[3] = {0.0, 0.0, 0.0}; | |||
1555 | PetscReal upper[3] = {1.0, 1.0, 1.5}; | |||
1556 | PetscInt i, numZCells = 3; | |||
1557 | ||||
1558 | bdType[0] = DM_BOUNDARY_NONE; | |||
1559 | bdType[1] = DM_BOUNDARY_NONE; | |||
1560 | bdType[2] = periodicZ; | |||
1561 | for (i = 0; i < dim; i++) { | |||
1562 | L[i] = upper[i] - lower[i]; | |||
1563 | maxCell[i] = 1.1 * (L[i] / numZCells); | |||
1564 | } | |||
1565 | ierr = DMSetPeriodicity(*dm, PETSC_TRUE, maxCell, L, bdType);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1565,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1566 | } | |||
1567 | /* Refine topology */ | |||
1568 | for (r = 0; r < numRefine; ++r) { | |||
1569 | DM rdm = NULL((void*)0); | |||
1570 | ||||
1571 | ierr = DMRefine(*dm, comm, &rdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1571,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1572 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1572,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1573 | *dm = rdm; | |||
1574 | } | |||
1575 | /* Remap geometry to cylinder | |||
1576 | Interior square: Linear interpolation is correct | |||
1577 | The other cells all have vertices on rays from the origin. We want to uniformly expand the spacing | |||
1578 | such that the last vertex is on the unit circle. So the closest and farthest vertices are at distance | |||
1579 | ||||
1580 | phi = arctan(y/x) | |||
1581 | d_close = sqrt(1/8 + 1/4 sin^2(phi)) | |||
1582 | d_far = sqrt(1/2 + sin^2(phi)) | |||
1583 | ||||
1584 | so we remap them using | |||
1585 | ||||
1586 | x_new = x_close + (x - x_close) (1 - d_close) / (d_far - d_close) | |||
1587 | y_new = y_close + (y - y_close) (1 - d_close) / (d_far - d_close) | |||
1588 | ||||
1589 | If pi/4 < phi < 3pi/4 or -3pi/4 < phi < -pi/4, then we switch x and y. | |||
1590 | */ | |||
1591 | { | |||
1592 | Vec coordinates; | |||
1593 | PetscSection coordSection; | |||
1594 | PetscScalar *coords; | |||
1595 | PetscInt vStart, vEnd, v; | |||
1596 | const PetscReal dis = 1.0/PetscSqrtReal(2.0)sqrt(2.0); | |||
1597 | const PetscReal ds2 = 0.5*dis; | |||
1598 | ||||
1599 | ierr = DMPlexGetDepthStratum(*dm, 0, &vStart, &vEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1599,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1600 | ierr = DMGetCoordinateSection(*dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1600,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1601 | ierr = DMGetCoordinatesLocal(*dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1601,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1602 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1602,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1603 | for (v = vStart; v < vEnd; ++v) { | |||
1604 | PetscReal phi, sinp, cosp, dc, df, x, y, xc, yc; | |||
1605 | PetscInt off; | |||
1606 | ||||
1607 | ierr = PetscSectionGetOffset(coordSection, v, &off);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1607,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1608 | if ((PetscAbsScalar(coords[off+0]) <= ds2) && (PetscAbsScalar(coords[off+1]) <= ds2)) continue; | |||
1609 | x = PetscRealPart(coords[off])(coords[off]); | |||
1610 | y = PetscRealPart(coords[off+1])(coords[off+1]); | |||
1611 | phi = PetscAtan2Real(y, x)atan2(y,x); | |||
1612 | sinp = PetscSinReal(phi)sin(phi); | |||
1613 | cosp = PetscCosReal(phi)cos(phi); | |||
1614 | if ((PetscAbsReal(phi)fabs(phi) > PETSC_PI3.1415926535897932384626433832795029/4.0) && (PetscAbsReal(phi)fabs(phi) < 3.0*PETSC_PI3.1415926535897932384626433832795029/4.0)) { | |||
1615 | dc = PetscAbsReal(ds2/sinp)fabs(ds2/sinp); | |||
1616 | df = PetscAbsReal(dis/sinp)fabs(dis/sinp); | |||
1617 | xc = ds2*x/PetscAbsReal(y)fabs(y); | |||
1618 | yc = ds2*PetscSignReal(y)(((y) >= 0.0) ? ((y) == 0.0 ? 0.0 : 1.0) : -1.0); | |||
1619 | } else { | |||
1620 | dc = PetscAbsReal(ds2/cosp)fabs(ds2/cosp); | |||
1621 | df = PetscAbsReal(dis/cosp)fabs(dis/cosp); | |||
1622 | xc = ds2*PetscSignReal(x)(((x) >= 0.0) ? ((x) == 0.0 ? 0.0 : 1.0) : -1.0); | |||
1623 | yc = ds2*y/PetscAbsReal(x)fabs(x); | |||
1624 | } | |||
1625 | coords[off+0] = xc + (coords[off+0] - xc)*(1.0 - dc)/(df - dc); | |||
1626 | coords[off+1] = yc + (coords[off+1] - yc)*(1.0 - dc)/(df - dc); | |||
1627 | } | |||
1628 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1628,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1629 | if (periodicZ == DM_BOUNDARY_PERIODIC || periodicZ == DM_BOUNDARY_TWIST) { | |||
1630 | ierr = DMLocalizeCoordinates(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1630,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1631 | } | |||
1632 | } | |||
1633 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1634 | } | |||
1635 | ||||
1636 | /*@ | |||
1637 | DMPlexCreateWedgeCylinderMesh - Creates a mesh on the tensor product of the unit interval with the circle (cylinder) using wedges. | |||
1638 | ||||
1639 | Collective | |||
1640 | ||||
1641 | Input Parameters: | |||
1642 | + comm - The communicator for the DM object | |||
1643 | . n - The number of wedges around the origin | |||
1644 | - interpolate - Create edges and faces | |||
1645 | ||||
1646 | Output Parameter: | |||
1647 | . dm - The DM object | |||
1648 | ||||
1649 | Level: beginner | |||
1650 | ||||
1651 | .seealso: DMPlexCreateHexCylinderMesh(), DMPlexCreateBoxMesh(), DMSetType(), DMCreate() | |||
1652 | @*/ | |||
1653 | PetscErrorCode DMPlexCreateWedgeCylinderMesh(MPI_Comm comm, PetscInt n, PetscBool interpolate, DM *dm) | |||
1654 | { | |||
1655 | const PetscInt dim = 3; | |||
1656 | PetscInt numCells, numVertices; | |||
1657 | PetscMPIInt rank; | |||
1658 | PetscErrorCode ierr; | |||
1659 | ||||
1660 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 1660; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1661 | PetscValidPointer(dm, 3)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),1661,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",85 ,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",3); if (! PetscCheckPointer(dm,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),1661,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",3); } while (0); | |||
1662 | ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1662,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1663 | if (n < 0) SETERRQ1(comm, PETSC_ERR_ARG_OUTOFRANGE, "Number of wedges %D cannot be negative", n)return PetscError(comm,1663,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,63,PETSC_ERROR_INITIAL,"Number of wedges %D cannot be negative" ,n); | |||
1664 | ierr = DMCreate(comm, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1664,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1665 | ierr = DMSetType(*dm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1665,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1666 | ierr = DMSetDimension(*dm, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1666,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1667 | /* Create topology */ | |||
1668 | { | |||
1669 | PetscInt cone[6], c; | |||
1670 | ||||
1671 | numCells = !rank ? n : 0; | |||
1672 | numVertices = !rank ? 2*(n+1) : 0; | |||
1673 | ierr = DMPlexSetChart(*dm, 0, numCells+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1673,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1674 | ierr = DMPlexSetHybridBounds(*dm, 0, PETSC_DETERMINE-1, PETSC_DETERMINE-1, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1674,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1675 | for (c = 0; c < numCells; c++) {ierr = DMPlexSetConeSize(*dm, c, 6);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1675,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
1676 | ierr = DMSetUp(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1676,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1677 | for (c = 0; c < numCells; c++) { | |||
1678 | cone[0] = c+n*1; cone[1] = (c+1)%n+n*1; cone[2] = 0+3*n; | |||
1679 | cone[3] = c+n*2; cone[4] = (c+1)%n+n*2; cone[5] = 1+3*n; | |||
1680 | ierr = DMPlexSetCone(*dm, c, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1680,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1681 | } | |||
1682 | ierr = DMPlexSymmetrize(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1682,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1683 | ierr = DMPlexStratify(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1683,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1684 | } | |||
1685 | /* Interpolate */ | |||
1686 | if (interpolate) { | |||
1687 | DM idm; | |||
1688 | ||||
1689 | ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1689,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1690 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1690,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1691 | *dm = idm; | |||
1692 | } | |||
1693 | /* Create cylinder geometry */ | |||
1694 | { | |||
1695 | Vec coordinates; | |||
1696 | PetscSection coordSection; | |||
1697 | PetscScalar *coords; | |||
1698 | PetscInt coordSize, v, c; | |||
1699 | ||||
1700 | /* Build coordinates */ | |||
1701 | ierr = DMGetCoordinateSection(*dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1701,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1702 | ierr = PetscSectionSetNumFields(coordSection, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1702,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1703 | ierr = PetscSectionSetFieldComponents(coordSection, 0, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1703,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1704 | ierr = PetscSectionSetChart(coordSection, numCells, numCells+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1704,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1705 | for (v = numCells; v < numCells+numVertices; ++v) { | |||
1706 | ierr = PetscSectionSetDof(coordSection, v, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1706,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1707 | ierr = PetscSectionSetFieldDof(coordSection, v, 0, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1707,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1708 | } | |||
1709 | ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1709,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1710 | ierr = PetscSectionGetStorageSize(coordSection, &coordSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1710,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1711 | ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001), &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1711,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1712 | ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1712,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1713 | ierr = VecSetSizes(coordinates, coordSize, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1713,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1714 | ierr = VecSetBlockSize(coordinates, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1714,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1715 | ierr = VecSetType(coordinates,VECSTANDARD"standard");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1715,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1716 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1716,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1717 | for (c = 0; c < numCells; c++) { | |||
1718 | coords[(c+0*n)*dim+0] = PetscCosReal(2.0*c*PETSC_PI/n)cos(2.0*c*3.1415926535897932384626433832795029/n); coords[(c+0*n)*dim+1] = PetscSinReal(2.0*c*PETSC_PI/n)sin(2.0*c*3.1415926535897932384626433832795029/n); coords[(c+0*n)*dim+2] = 1.0; | |||
1719 | coords[(c+1*n)*dim+0] = PetscCosReal(2.0*c*PETSC_PI/n)cos(2.0*c*3.1415926535897932384626433832795029/n); coords[(c+1*n)*dim+1] = PetscSinReal(2.0*c*PETSC_PI/n)sin(2.0*c*3.1415926535897932384626433832795029/n); coords[(c+1*n)*dim+2] = 0.0; | |||
1720 | } | |||
1721 | if (!rank) { | |||
1722 | coords[(2*n+0)*dim+0] = 0.0; coords[(2*n+0)*dim+1] = 0.0; coords[(2*n+0)*dim+2] = 1.0; | |||
1723 | coords[(2*n+1)*dim+0] = 0.0; coords[(2*n+1)*dim+1] = 0.0; coords[(2*n+1)*dim+2] = 0.0; | |||
1724 | } | |||
1725 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1725,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1726 | ierr = DMSetCoordinatesLocal(*dm, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1726,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1727 | ierr = VecDestroy(&coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1727,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1728 | } | |||
1729 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1730 | } | |||
1731 | ||||
1732 | PETSC_STATIC_INLINEstatic inline PetscReal DiffNormReal(PetscInt dim, const PetscReal x[], const PetscReal y[]) | |||
1733 | { | |||
1734 | PetscReal prod = 0.0; | |||
1735 | PetscInt i; | |||
1736 | for (i = 0; i < dim; ++i) prod += PetscSqr(x[i] - y[i])((x[i] - y[i])*(x[i] - y[i])); | |||
1737 | return PetscSqrtReal(prod)sqrt(prod); | |||
1738 | } | |||
1739 | PETSC_STATIC_INLINEstatic inline PetscReal DotReal(PetscInt dim, const PetscReal x[], const PetscReal y[]) | |||
1740 | { | |||
1741 | PetscReal prod = 0.0; | |||
1742 | PetscInt i; | |||
1743 | for (i = 0; i < dim; ++i) prod += x[i]*y[i]; | |||
1744 | return prod; | |||
1745 | } | |||
1746 | ||||
1747 | /*@ | |||
1748 | DMPlexCreateSphereMesh - Creates a mesh on the d-dimensional sphere, S^d. | |||
1749 | ||||
1750 | Collective | |||
1751 | ||||
1752 | Input Parameters: | |||
1753 | + comm - The communicator for the DM object | |||
1754 | . dim - The dimension | |||
1755 | - simplex - Use simplices, or tensor product cells | |||
1756 | ||||
1757 | Output Parameter: | |||
1758 | . dm - The DM object | |||
1759 | ||||
1760 | Level: beginner | |||
1761 | ||||
1762 | .seealso: DMPlexCreateBoxMesh(), DMSetType(), DMCreate() | |||
1763 | @*/ | |||
1764 | PetscErrorCode DMPlexCreateSphereMesh(MPI_Comm comm, PetscInt dim, PetscBool simplex, DM *dm) | |||
1765 | { | |||
1766 | const PetscInt embedDim = dim+1; | |||
1767 | PetscSection coordSection; | |||
1768 | Vec coordinates; | |||
1769 | PetscScalar *coords; | |||
1770 | PetscReal *coordsIn; | |||
1771 | PetscInt numCells, numEdges, numVerts, firstVertex, v, firstEdge, coordSize, d, c, e; | |||
1772 | PetscMPIInt rank; | |||
1773 | PetscErrorCode ierr; | |||
1774 | ||||
1775 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 1775; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1776 | PetscValidPointer(dm, 4)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),1776,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",85 ,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",4); if (! PetscCheckPointer(dm,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),1776,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",4); } while (0); | |||
1777 | ierr = DMCreate(comm, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1777,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1778 | ierr = DMSetType(*dm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1778,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1779 | ierr = DMSetDimension(*dm, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1779,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1780 | ierr = DMSetCoordinateDim(*dm, dim+1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1780,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1781 | ierr = MPI_Comm_rank(PetscObjectComm((PetscObject) *dm), &rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1781,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1782 | switch (dim) { | |||
1783 | case 2: | |||
1784 | if (simplex) { | |||
1785 | DM idm; | |||
1786 | const PetscReal edgeLen = 2.0/(1.0 + PETSC_PHI1.6180339887498948482045868343656381); | |||
1787 | const PetscReal vertex[3] = {0.0, 1.0/(1.0 + PETSC_PHI1.6180339887498948482045868343656381), PETSC_PHI1.6180339887498948482045868343656381/(1.0 + PETSC_PHI1.6180339887498948482045868343656381)}; | |||
1788 | const PetscInt degree = 5; | |||
1789 | PetscInt s[3] = {1, 1, 1}; | |||
1790 | PetscInt cone[3]; | |||
1791 | PetscInt *graph, p, i, j, k; | |||
1792 | ||||
1793 | numCells = !rank ? 20 : 0; | |||
1794 | numVerts = !rank ? 12 : 0; | |||
1795 | firstVertex = numCells; | |||
1796 | /* Use icosahedron, which for a unit sphere has coordinates which are all cyclic permutations of | |||
1797 | ||||
1798 | (0, \pm 1/\phi+1, \pm \phi/\phi+1) | |||
1799 | ||||
1800 | where \phi^2 - \phi - 1 = 0, meaning \phi is the golden ratio \frac{1 + \sqrt{5}}{2}. The edge | |||
1801 | length is then given by 2/\phi = 2 * 2.73606 = 5.47214. | |||
1802 | */ | |||
1803 | /* Construct vertices */ | |||
1804 | ierr = PetscCalloc1(numVerts * embedDim, &coordsIn)PetscMallocA(1,PETSC_TRUE,1804,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numVerts * embedDim)*sizeof(**(&coordsIn)),(& coordsIn));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1804,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1805 | for (p = 0, i = 0; p < embedDim; ++p) { | |||
1806 | for (s[1] = -1; s[1] < 2; s[1] += 2) { | |||
1807 | for (s[2] = -1; s[2] < 2; s[2] += 2) { | |||
1808 | for (d = 0; d < embedDim; ++d) coordsIn[i*embedDim+d] = s[(d+p)%embedDim]*vertex[(d+p)%embedDim]; | |||
1809 | ++i; | |||
1810 | } | |||
1811 | } | |||
1812 | } | |||
1813 | /* Construct graph */ | |||
1814 | ierr = PetscCalloc1(numVerts * numVerts, &graph)PetscMallocA(1,PETSC_TRUE,1814,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numVerts * numVerts)*sizeof(**(&graph)),(&graph ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1814,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1815 | for (i = 0; i < numVerts; ++i) { | |||
1816 | for (j = 0, k = 0; j < numVerts; ++j) { | |||
1817 | if (PetscAbsReal(DiffNormReal(embedDim, &coordsIn[i*embedDim], &coordsIn[j*embedDim]) - edgeLen)fabs(DiffNormReal(embedDim, &coordsIn[i*embedDim], &coordsIn [j*embedDim]) - edgeLen) < PETSC_SMALL1.e-10) {graph[i*numVerts+j] = 1; ++k;} | |||
1818 | } | |||
1819 | if (k != degree) SETERRQ3(comm, PETSC_ERR_PLIB, "Invalid icosahedron, vertex %D degree %D != %D", i, k, degree)return PetscError(comm,1819,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,77,PETSC_ERROR_INITIAL,"Invalid icosahedron, vertex %D degree %D != %D" ,i,k,degree); | |||
1820 | } | |||
1821 | /* Build Topology */ | |||
1822 | ierr = DMPlexSetChart(*dm, 0, numCells+numVerts);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1822,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1823 | for (c = 0; c < numCells; c++) { | |||
1824 | ierr = DMPlexSetConeSize(*dm, c, embedDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1824,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1825 | } | |||
1826 | ierr = DMSetUp(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1826,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* Allocate space for cones */ | |||
1827 | /* Cells */ | |||
1828 | for (i = 0, c = 0; i < numVerts; ++i) { | |||
1829 | for (j = 0; j < i; ++j) { | |||
1830 | for (k = 0; k < j; ++k) { | |||
1831 | if (graph[i*numVerts+j] && graph[j*numVerts+k] && graph[k*numVerts+i]) { | |||
1832 | cone[0] = firstVertex+i; cone[1] = firstVertex+j; cone[2] = firstVertex+k; | |||
1833 | /* Check orientation */ | |||
1834 | { | |||
1835 | const PetscInt epsilon[3][3][3] = {{{0, 0, 0}, {0, 0, 1}, {0, -1, 0}}, {{0, 0, -1}, {0, 0, 0}, {1, 0, 0}}, {{0, 1, 0}, {-1, 0, 0}, {0, 0, 0}}}; | |||
1836 | PetscReal normal[3]; | |||
1837 | PetscInt e, f; | |||
1838 | ||||
1839 | for (d = 0; d < embedDim; ++d) { | |||
1840 | normal[d] = 0.0; | |||
1841 | for (e = 0; e < embedDim; ++e) { | |||
1842 | for (f = 0; f < embedDim; ++f) { | |||
1843 | normal[d] += epsilon[d][e][f]*(coordsIn[j*embedDim+e] - coordsIn[i*embedDim+e])*(coordsIn[k*embedDim+f] - coordsIn[i*embedDim+f]); | |||
1844 | } | |||
1845 | } | |||
1846 | } | |||
1847 | if (DotReal(embedDim, normal, &coordsIn[i*embedDim]) < 0) {PetscInt tmp = cone[1]; cone[1] = cone[2]; cone[2] = tmp;} | |||
1848 | } | |||
1849 | ierr = DMPlexSetCone(*dm, c++, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1849,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1850 | } | |||
1851 | } | |||
1852 | } | |||
1853 | } | |||
1854 | ierr = DMPlexSymmetrize(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1854,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1855 | ierr = DMPlexStratify(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1855,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1856 | ierr = PetscFree(graph)((*PetscTrFree)((void*)(graph),1856,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((graph) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1856,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1857 | /* Interpolate mesh */ | |||
1858 | ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1858,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1859 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1859,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1860 | *dm = idm; | |||
1861 | } else { | |||
1862 | /* | |||
1863 | 12-21--13 | |||
1864 | | | | |||
1865 | 25 4 24 | |||
1866 | | | | |||
1867 | 12-25--9-16--8-24--13 | |||
1868 | | | | | | |||
1869 | 23 5 17 0 15 3 22 | |||
1870 | | | | | | |||
1871 | 10-20--6-14--7-19--11 | |||
1872 | | | | |||
1873 | 20 1 19 | |||
1874 | | | | |||
1875 | 10-18--11 | |||
1876 | | | | |||
1877 | 23 2 22 | |||
1878 | | | | |||
1879 | 12-21--13 | |||
1880 | */ | |||
1881 | const PetscReal dist = 1.0/PetscSqrtReal(3.0)sqrt(3.0); | |||
1882 | PetscInt cone[4], ornt[4]; | |||
1883 | ||||
1884 | numCells = !rank ? 6 : 0; | |||
1885 | numEdges = !rank ? 12 : 0; | |||
1886 | numVerts = !rank ? 8 : 0; | |||
1887 | firstVertex = numCells; | |||
1888 | firstEdge = numCells + numVerts; | |||
1889 | /* Build Topology */ | |||
1890 | ierr = DMPlexSetChart(*dm, 0, numCells+numEdges+numVerts);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1890,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1891 | for (c = 0; c < numCells; c++) { | |||
1892 | ierr = DMPlexSetConeSize(*dm, c, 4);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1892,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1893 | } | |||
1894 | for (e = firstEdge; e < firstEdge+numEdges; ++e) { | |||
1895 | ierr = DMPlexSetConeSize(*dm, e, 2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1895,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1896 | } | |||
1897 | ierr = DMSetUp(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1897,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* Allocate space for cones */ | |||
1898 | /* Cell 0 */ | |||
1899 | cone[0] = 14; cone[1] = 15; cone[2] = 16; cone[3] = 17; | |||
1900 | ierr = DMPlexSetCone(*dm, 0, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1900,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1901 | ornt[0] = 0; ornt[1] = 0; ornt[2] = 0; ornt[3] = 0; | |||
1902 | ierr = DMPlexSetConeOrientation(*dm, 0, ornt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1902,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1903 | /* Cell 1 */ | |||
1904 | cone[0] = 18; cone[1] = 19; cone[2] = 14; cone[3] = 20; | |||
1905 | ierr = DMPlexSetCone(*dm, 1, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1905,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1906 | ornt[0] = 0; ornt[1] = 0; ornt[2] = -2; ornt[3] = 0; | |||
1907 | ierr = DMPlexSetConeOrientation(*dm, 1, ornt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1907,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1908 | /* Cell 2 */ | |||
1909 | cone[0] = 21; cone[1] = 22; cone[2] = 18; cone[3] = 23; | |||
1910 | ierr = DMPlexSetCone(*dm, 2, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1910,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1911 | ornt[0] = 0; ornt[1] = 0; ornt[2] = -2; ornt[3] = 0; | |||
1912 | ierr = DMPlexSetConeOrientation(*dm, 2, ornt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1912,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1913 | /* Cell 3 */ | |||
1914 | cone[0] = 19; cone[1] = 22; cone[2] = 24; cone[3] = 15; | |||
1915 | ierr = DMPlexSetCone(*dm, 3, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1915,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1916 | ornt[0] = -2; ornt[1] = -2; ornt[2] = 0; ornt[3] = -2; | |||
1917 | ierr = DMPlexSetConeOrientation(*dm, 3, ornt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1917,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1918 | /* Cell 4 */ | |||
1919 | cone[0] = 16; cone[1] = 24; cone[2] = 21; cone[3] = 25; | |||
1920 | ierr = DMPlexSetCone(*dm, 4, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1920,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1921 | ornt[0] = -2; ornt[1] = -2; ornt[2] = -2; ornt[3] = 0; | |||
1922 | ierr = DMPlexSetConeOrientation(*dm, 4, ornt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1922,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1923 | /* Cell 5 */ | |||
1924 | cone[0] = 20; cone[1] = 17; cone[2] = 25; cone[3] = 23; | |||
1925 | ierr = DMPlexSetCone(*dm, 5, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1925,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1926 | ornt[0] = -2; ornt[1] = -2; ornt[2] = -2; ornt[3] = -2; | |||
1927 | ierr = DMPlexSetConeOrientation(*dm, 5, ornt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1927,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1928 | /* Edges */ | |||
1929 | cone[0] = 6; cone[1] = 7; | |||
1930 | ierr = DMPlexSetCone(*dm, 14, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1930,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1931 | cone[0] = 7; cone[1] = 8; | |||
1932 | ierr = DMPlexSetCone(*dm, 15, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1932,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1933 | cone[0] = 8; cone[1] = 9; | |||
1934 | ierr = DMPlexSetCone(*dm, 16, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1934,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1935 | cone[0] = 9; cone[1] = 6; | |||
1936 | ierr = DMPlexSetCone(*dm, 17, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1936,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1937 | cone[0] = 10; cone[1] = 11; | |||
1938 | ierr = DMPlexSetCone(*dm, 18, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1938,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1939 | cone[0] = 11; cone[1] = 7; | |||
1940 | ierr = DMPlexSetCone(*dm, 19, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1940,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1941 | cone[0] = 6; cone[1] = 10; | |||
1942 | ierr = DMPlexSetCone(*dm, 20, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1942,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1943 | cone[0] = 12; cone[1] = 13; | |||
1944 | ierr = DMPlexSetCone(*dm, 21, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1944,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1945 | cone[0] = 13; cone[1] = 11; | |||
1946 | ierr = DMPlexSetCone(*dm, 22, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1946,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1947 | cone[0] = 10; cone[1] = 12; | |||
1948 | ierr = DMPlexSetCone(*dm, 23, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1948,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1949 | cone[0] = 13; cone[1] = 8; | |||
1950 | ierr = DMPlexSetCone(*dm, 24, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1950,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1951 | cone[0] = 12; cone[1] = 9; | |||
1952 | ierr = DMPlexSetCone(*dm, 25, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1952,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1953 | ierr = DMPlexSymmetrize(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1953,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1954 | ierr = DMPlexStratify(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1954,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1955 | /* Build coordinates */ | |||
1956 | ierr = PetscCalloc1(numVerts * embedDim, &coordsIn)PetscMallocA(1,PETSC_TRUE,1956,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numVerts * embedDim)*sizeof(**(&coordsIn)),(& coordsIn));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1956,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1957 | coordsIn[0*embedDim+0] = -dist; coordsIn[0*embedDim+1] = dist; coordsIn[0*embedDim+2] = -dist; | |||
1958 | coordsIn[1*embedDim+0] = dist; coordsIn[1*embedDim+1] = dist; coordsIn[1*embedDim+2] = -dist; | |||
1959 | coordsIn[2*embedDim+0] = dist; coordsIn[2*embedDim+1] = -dist; coordsIn[2*embedDim+2] = -dist; | |||
1960 | coordsIn[3*embedDim+0] = -dist; coordsIn[3*embedDim+1] = -dist; coordsIn[3*embedDim+2] = -dist; | |||
1961 | coordsIn[4*embedDim+0] = -dist; coordsIn[4*embedDim+1] = dist; coordsIn[4*embedDim+2] = dist; | |||
1962 | coordsIn[5*embedDim+0] = dist; coordsIn[5*embedDim+1] = dist; coordsIn[5*embedDim+2] = dist; | |||
1963 | coordsIn[6*embedDim+0] = -dist; coordsIn[6*embedDim+1] = -dist; coordsIn[6*embedDim+2] = dist; | |||
1964 | coordsIn[7*embedDim+0] = dist; coordsIn[7*embedDim+1] = -dist; coordsIn[7*embedDim+2] = dist; | |||
1965 | } | |||
1966 | break; | |||
1967 | case 3: | |||
1968 | if (simplex) { | |||
1969 | DM idm; | |||
1970 | const PetscReal edgeLen = 1.0/PETSC_PHI1.6180339887498948482045868343656381; | |||
1971 | const PetscReal vertexA[4] = {0.5, 0.5, 0.5, 0.5}; | |||
1972 | const PetscReal vertexB[4] = {1.0, 0.0, 0.0, 0.0}; | |||
1973 | const PetscReal vertexC[4] = {0.5, 0.5*PETSC_PHI1.6180339887498948482045868343656381, 0.5/PETSC_PHI1.6180339887498948482045868343656381, 0.0}; | |||
1974 | const PetscInt degree = 12; | |||
1975 | PetscInt s[4] = {1, 1, 1}; | |||
1976 | PetscInt evenPerm[12][4] = {{0, 1, 2, 3}, {0, 2, 3, 1}, {0, 3, 1, 2}, {1, 0, 3, 2}, {1, 2, 0, 3}, {1, 3, 2, 0}, | |||
1977 | {2, 0, 1, 3}, {2, 1, 3, 0}, {2, 3, 0, 1}, {3, 0, 2, 1}, {3, 1, 0, 2}, {3, 2, 1, 0}}; | |||
1978 | PetscInt cone[4]; | |||
1979 | PetscInt *graph, p, i, j, k, l; | |||
1980 | ||||
1981 | numCells = !rank ? 600 : 0; | |||
1982 | numVerts = !rank ? 120 : 0; | |||
1983 | firstVertex = numCells; | |||
1984 | /* Use the 600-cell, which for a unit sphere has coordinates which are | |||
1985 | ||||
1986 | 1/2 (\pm 1, \pm 1, \pm 1, \pm 1) 16 | |||
1987 | (\pm 1, 0, 0, 0) all cyclic permutations 8 | |||
1988 | 1/2 (\pm 1, \pm phi, \pm 1/phi, 0) all even permutations 96 | |||
1989 | ||||
1990 | where \phi^2 - \phi - 1 = 0, meaning \phi is the golden ratio \frac{1 + \sqrt{5}}{2}. The edge | |||
1991 | length is then given by 1/\phi = 2.73606. | |||
1992 | ||||
1993 | http://buzzard.pugetsound.edu/sage-practice/ch03s03.html | |||
1994 | http://mathworld.wolfram.com/600-Cell.html | |||
1995 | */ | |||
1996 | /* Construct vertices */ | |||
1997 | ierr = PetscCalloc1(numVerts * embedDim, &coordsIn)PetscMallocA(1,PETSC_TRUE,1997,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numVerts * embedDim)*sizeof(**(&coordsIn)),(& coordsIn));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1997,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1998 | i = 0; | |||
1999 | for (s[0] = -1; s[0] < 2; s[0] += 2) { | |||
2000 | for (s[1] = -1; s[1] < 2; s[1] += 2) { | |||
2001 | for (s[2] = -1; s[2] < 2; s[2] += 2) { | |||
2002 | for (s[3] = -1; s[3] < 2; s[3] += 2) { | |||
2003 | for (d = 0; d < embedDim; ++d) coordsIn[i*embedDim+d] = s[d]*vertexA[d]; | |||
2004 | ++i; | |||
2005 | } | |||
2006 | } | |||
2007 | } | |||
2008 | } | |||
2009 | for (p = 0; p < embedDim; ++p) { | |||
2010 | s[1] = s[2] = s[3] = 1; | |||
2011 | for (s[0] = -1; s[0] < 2; s[0] += 2) { | |||
2012 | for (d = 0; d < embedDim; ++d) coordsIn[i*embedDim+d] = s[(d+p)%embedDim]*vertexB[(d+p)%embedDim]; | |||
2013 | ++i; | |||
2014 | } | |||
2015 | } | |||
2016 | for (p = 0; p < 12; ++p) { | |||
2017 | s[3] = 1; | |||
2018 | for (s[0] = -1; s[0] < 2; s[0] += 2) { | |||
2019 | for (s[1] = -1; s[1] < 2; s[1] += 2) { | |||
2020 | for (s[2] = -1; s[2] < 2; s[2] += 2) { | |||
2021 | for (d = 0; d < embedDim; ++d) coordsIn[i*embedDim+d] = s[evenPerm[p][d]]*vertexC[evenPerm[p][d]]; | |||
2022 | ++i; | |||
2023 | } | |||
2024 | } | |||
2025 | } | |||
2026 | } | |||
2027 | if (i != numVerts) SETERRQ2(comm, PETSC_ERR_PLIB, "Invalid 600-cell, vertices %D != %D", i, numVerts)return PetscError(comm,2027,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,77,PETSC_ERROR_INITIAL,"Invalid 600-cell, vertices %D != %D" ,i,numVerts); | |||
2028 | /* Construct graph */ | |||
2029 | ierr = PetscCalloc1(numVerts * numVerts, &graph)PetscMallocA(1,PETSC_TRUE,2029,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numVerts * numVerts)*sizeof(**(&graph)),(&graph ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2029,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2030 | for (i = 0; i < numVerts; ++i) { | |||
2031 | for (j = 0, k = 0; j < numVerts; ++j) { | |||
2032 | if (PetscAbsReal(DiffNormReal(embedDim, &coordsIn[i*embedDim], &coordsIn[j*embedDim]) - edgeLen)fabs(DiffNormReal(embedDim, &coordsIn[i*embedDim], &coordsIn [j*embedDim]) - edgeLen) < PETSC_SMALL1.e-10) {graph[i*numVerts+j] = 1; ++k;} | |||
2033 | } | |||
2034 | if (k != degree) SETERRQ3(comm, PETSC_ERR_PLIB, "Invalid 600-cell, vertex %D degree %D != %D", i, k, degree)return PetscError(comm,2034,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,77,PETSC_ERROR_INITIAL,"Invalid 600-cell, vertex %D degree %D != %D" ,i,k,degree); | |||
2035 | } | |||
2036 | /* Build Topology */ | |||
2037 | ierr = DMPlexSetChart(*dm, 0, numCells+numVerts);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2037,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2038 | for (c = 0; c < numCells; c++) { | |||
2039 | ierr = DMPlexSetConeSize(*dm, c, embedDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2039,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2040 | } | |||
2041 | ierr = DMSetUp(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2041,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* Allocate space for cones */ | |||
2042 | /* Cells */ | |||
2043 | for (i = 0, c = 0; i < numVerts; ++i) { | |||
2044 | for (j = 0; j < i; ++j) { | |||
2045 | for (k = 0; k < j; ++k) { | |||
2046 | for (l = 0; l < k; ++l) { | |||
2047 | if (graph[i*numVerts+j] && graph[j*numVerts+k] && graph[k*numVerts+i] && | |||
2048 | graph[l*numVerts+i] && graph[l*numVerts+j] && graph[l*numVerts+k]) { | |||
2049 | cone[0] = firstVertex+i; cone[1] = firstVertex+j; cone[2] = firstVertex+k; cone[3] = firstVertex+l; | |||
2050 | /* Check orientation: https://ef.gy/linear-algebra:normal-vectors-in-higher-dimensional-spaces */ | |||
2051 | { | |||
2052 | const PetscInt epsilon[4][4][4][4] = {{{{0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}}, | |||
2053 | {{0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 1}, { 0, 0, -1, 0}}, | |||
2054 | {{0, 0, 0, 0}, { 0, 0, 0, -1}, { 0, 0, 0, 0}, { 0, 1, 0, 0}}, | |||
2055 | {{0, 0, 0, 0}, { 0, 0, 1, 0}, { 0, -1, 0, 0}, { 0, 0, 0, 0}}}, | |||
2056 | ||||
2057 | {{{0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, -1}, { 0, 0, 1, 0}}, | |||
2058 | {{0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}}, | |||
2059 | {{0, 0, 0, 1}, { 0, 0, 0, 0}, { 0, 0, 0, 0}, {-1, 0, 0, 0}}, | |||
2060 | {{0, 0, -1, 0}, { 0, 0, 0, 0}, { 1, 0, 0, 0}, { 0, 0, 0, 0}}}, | |||
2061 | ||||
2062 | {{{0, 0, 0, 0}, { 0, 0, 0, 1}, { 0, 0, 0, 0}, { 0, -1, 0, 0}}, | |||
2063 | {{0, 0, 0, -1}, { 0, 0, 0, 0}, { 0, 0, 0, 0}, { 1, 0, 0, 0}}, | |||
2064 | {{0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}}, | |||
2065 | {{0, 1, 0, 0}, {-1, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}}}, | |||
2066 | ||||
2067 | {{{0, 0, 0, 0}, { 0, 0, -1, 0}, { 0, 1, 0, 0}, { 0, 0, 0, 0}}, | |||
2068 | {{0, 0, 1, 0}, { 0, 0, 0, 0}, {-1, 0, 0, 0}, { 0, 0, 0, 0}}, | |||
2069 | {{0, -1, 0, 0}, { 1, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}}, | |||
2070 | {{0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}}}}; | |||
2071 | PetscReal normal[4]; | |||
2072 | PetscInt e, f, g; | |||
2073 | ||||
2074 | for (d = 0; d < embedDim; ++d) { | |||
2075 | normal[d] = 0.0; | |||
2076 | for (e = 0; e < embedDim; ++e) { | |||
2077 | for (f = 0; f < embedDim; ++f) { | |||
2078 | for (g = 0; g < embedDim; ++g) { | |||
2079 | normal[d] += epsilon[d][e][f][g]*(coordsIn[j*embedDim+e] - coordsIn[i*embedDim+e])*(coordsIn[k*embedDim+f] - coordsIn[i*embedDim+f])*(coordsIn[l*embedDim+f] - coordsIn[i*embedDim+f]); | |||
2080 | } | |||
2081 | } | |||
2082 | } | |||
2083 | } | |||
2084 | if (DotReal(embedDim, normal, &coordsIn[i*embedDim]) < 0) {PetscInt tmp = cone[1]; cone[1] = cone[2]; cone[2] = tmp;} | |||
2085 | } | |||
2086 | ierr = DMPlexSetCone(*dm, c++, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2086,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2087 | } | |||
2088 | } | |||
2089 | } | |||
2090 | } | |||
2091 | } | |||
2092 | ierr = DMPlexSymmetrize(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2092,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2093 | ierr = DMPlexStratify(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2093,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2094 | ierr = PetscFree(graph)((*PetscTrFree)((void*)(graph),2094,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((graph) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2094,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2095 | /* Interpolate mesh */ | |||
2096 | ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2096,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2097 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2097,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2098 | *dm = idm; | |||
2099 | break; | |||
2100 | } | |||
2101 | default: SETERRQ1(comm, PETSC_ERR_SUP, "Unsupported dimension for sphere: %D", dim)return PetscError(comm,2101,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,56,PETSC_ERROR_INITIAL,"Unsupported dimension for sphere: %D" ,dim); | |||
2102 | } | |||
2103 | /* Create coordinates */ | |||
2104 | ierr = DMGetCoordinateSection(*dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2104,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2105 | ierr = PetscSectionSetNumFields(coordSection, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2105,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2106 | ierr = PetscSectionSetFieldComponents(coordSection, 0, embedDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2106,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2107 | ierr = PetscSectionSetChart(coordSection, firstVertex, firstVertex+numVerts);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2107,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2108 | for (v = firstVertex; v < firstVertex+numVerts; ++v) { | |||
2109 | ierr = PetscSectionSetDof(coordSection, v, embedDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2109,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2110 | ierr = PetscSectionSetFieldDof(coordSection, v, 0, embedDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2110,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2111 | } | |||
2112 | ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2112,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2113 | ierr = PetscSectionGetStorageSize(coordSection, &coordSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2113,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2114 | ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001), &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2114,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2115 | ierr = VecSetBlockSize(coordinates, embedDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2115,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2116 | ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2116,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2117 | ierr = VecSetSizes(coordinates, coordSize, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2117,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2118 | ierr = VecSetType(coordinates,VECSTANDARD"standard");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2118,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2119 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2119,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2120 | for (v = 0; v < numVerts; ++v) for (d = 0; d < embedDim; ++d) {coords[v*embedDim+d] = coordsIn[v*embedDim+d];} | |||
2121 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2121,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2122 | ierr = DMSetCoordinatesLocal(*dm, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2122,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2123 | ierr = VecDestroy(&coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2123,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2124 | ierr = PetscFree(coordsIn)((*PetscTrFree)((void*)(coordsIn),2124,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((coordsIn) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2124,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2125 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2126 | } | |||
2127 | ||||
2128 | /* External function declarations here */ | |||
2129 | extern PetscErrorCode DMCreateInterpolation_Plex(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling); | |||
2130 | extern PetscErrorCode DMCreateInjection_Plex(DM dmCoarse, DM dmFine, Mat *mat); | |||
2131 | extern PetscErrorCode DMCreateMassMatrix_Plex(DM dmCoarse, DM dmFine, Mat *mat); | |||
2132 | extern PetscErrorCode DMCreateDefaultSection_Plex(DM dm); | |||
2133 | extern PetscErrorCode DMCreateDefaultConstraints_Plex(DM dm); | |||
2134 | extern PetscErrorCode DMCreateMatrix_Plex(DM dm, Mat *J); | |||
2135 | extern PetscErrorCode DMCreateCoordinateDM_Plex(DM dm, DM *cdm); | |||
2136 | extern PetscErrorCode DMCreateCoordinateField_Plex(DM dm, DMField *field); | |||
2137 | PETSC_INTERNextern __attribute__((visibility ("hidden"))) PetscErrorCode DMClone_Plex(DM dm, DM *newdm); | |||
2138 | extern PetscErrorCode DMSetUp_Plex(DM dm); | |||
2139 | extern PetscErrorCode DMDestroy_Plex(DM dm); | |||
2140 | extern PetscErrorCode DMView_Plex(DM dm, PetscViewer viewer); | |||
2141 | extern PetscErrorCode DMLoad_Plex(DM dm, PetscViewer viewer); | |||
2142 | extern PetscErrorCode DMCreateSubDM_Plex(DM dm, PetscInt numFields, const PetscInt fields[], IS *is, DM *subdm); | |||
2143 | extern PetscErrorCode DMCreateSuperDM_Plex(DM dms[], PetscInt len, IS **is, DM *superdm); | |||
2144 | static PetscErrorCode DMInitialize_Plex(DM dm); | |||
2145 | ||||
2146 | /* Replace dm with the contents of dmNew | |||
2147 | - Share the DM_Plex structure | |||
2148 | - Share the coordinates | |||
2149 | - Share the SF | |||
2150 | */ | |||
2151 | static PetscErrorCode DMPlexReplace_Static(DM dm, DM dmNew) | |||
2152 | { | |||
2153 | PetscSF sf; | |||
2154 | DM coordDM, coarseDM; | |||
2155 | Vec coords; | |||
2156 | PetscBool isper; | |||
2157 | const PetscReal *maxCell, *L; | |||
2158 | const DMBoundaryType *bd; | |||
2159 | PetscErrorCode ierr; | |||
2160 | ||||
2161 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2161; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2162 | ierr = DMGetPointSF(dmNew, &sf);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2162,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2163 | ierr = DMSetPointSF(dm, sf);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2163,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2164 | ierr = DMGetCoordinateDM(dmNew, &coordDM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2164,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2165 | ierr = DMGetCoordinatesLocal(dmNew, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2165,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2166 | ierr = DMSetCoordinateDM(dm, coordDM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2166,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2167 | ierr = DMSetCoordinatesLocal(dm, coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2167,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2168 | ierr = DMGetPeriodicity(dm, &isper, &maxCell, &L, &bd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2168,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2169 | ierr = DMSetPeriodicity(dmNew, isper, maxCell, L, bd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2169,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2170 | ierr = DMDestroy_Plex(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2170,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2171 | ierr = DMInitialize_Plex(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2171,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2172 | dm->data = dmNew->data; | |||
2173 | ((DM_Plex *) dmNew->data)->refct++; | |||
2174 | dmNew->labels->refct++; | |||
2175 | if (!--(dm->labels->refct)) { | |||
2176 | DMLabelLink next = dm->labels->next; | |||
2177 | ||||
2178 | /* destroy the labels */ | |||
2179 | while (next) { | |||
2180 | DMLabelLink tmp = next->next; | |||
2181 | ||||
2182 | ierr = DMLabelDestroy(&next->label);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2182,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2183 | ierr = PetscFree(next)((*PetscTrFree)((void*)(next),2183,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((next) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2183,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2184 | next = tmp; | |||
2185 | } | |||
2186 | ierr = PetscFree(dm->labels)((*PetscTrFree)((void*)(dm->labels),2186,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((dm->labels) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2186,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2187 | } | |||
2188 | dm->labels = dmNew->labels; | |||
2189 | dm->depthLabel = dmNew->depthLabel; | |||
2190 | ierr = DMGetCoarseDM(dmNew,&coarseDM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2190,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2191 | ierr = DMSetCoarseDM(dm,coarseDM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2191,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2192 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2193 | } | |||
2194 | ||||
2195 | /* Swap dm with the contents of dmNew | |||
2196 | - Swap the DM_Plex structure | |||
2197 | - Swap the coordinates | |||
2198 | - Swap the point PetscSF | |||
2199 | */ | |||
2200 | static PetscErrorCode DMPlexSwap_Static(DM dmA, DM dmB) | |||
2201 | { | |||
2202 | DM coordDMA, coordDMB; | |||
2203 | Vec coordsA, coordsB; | |||
2204 | PetscSF sfA, sfB; | |||
2205 | void *tmp; | |||
2206 | DMLabelLinkList listTmp; | |||
2207 | DMLabel depthTmp; | |||
2208 | PetscInt tmpI; | |||
2209 | PetscErrorCode ierr; | |||
2210 | ||||
2211 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2211; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2212 | ierr = DMGetPointSF(dmA, &sfA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2212,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2213 | ierr = DMGetPointSF(dmB, &sfB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2213,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2214 | ierr = PetscObjectReference((PetscObject) sfA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2214,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2215 | ierr = DMSetPointSF(dmA, sfB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2215,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2216 | ierr = DMSetPointSF(dmB, sfA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2216,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2217 | ierr = PetscObjectDereference((PetscObject) sfA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2217,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2218 | ||||
2219 | ierr = DMGetCoordinateDM(dmA, &coordDMA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2219,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2220 | ierr = DMGetCoordinateDM(dmB, &coordDMB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2220,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2221 | ierr = PetscObjectReference((PetscObject) coordDMA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2221,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2222 | ierr = DMSetCoordinateDM(dmA, coordDMB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2222,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2223 | ierr = DMSetCoordinateDM(dmB, coordDMA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2223,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2224 | ierr = PetscObjectDereference((PetscObject) coordDMA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2224,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2225 | ||||
2226 | ierr = DMGetCoordinatesLocal(dmA, &coordsA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2226,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2227 | ierr = DMGetCoordinatesLocal(dmB, &coordsB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2227,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2228 | ierr = PetscObjectReference((PetscObject) coordsA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2228,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2229 | ierr = DMSetCoordinatesLocal(dmA, coordsB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2229,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2230 | ierr = DMSetCoordinatesLocal(dmB, coordsA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2230,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2231 | ierr = PetscObjectDereference((PetscObject) coordsA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2231,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2232 | ||||
2233 | tmp = dmA->data; | |||
2234 | dmA->data = dmB->data; | |||
2235 | dmB->data = tmp; | |||
2236 | listTmp = dmA->labels; | |||
2237 | dmA->labels = dmB->labels; | |||
2238 | dmB->labels = listTmp; | |||
2239 | depthTmp = dmA->depthLabel; | |||
2240 | dmA->depthLabel = dmB->depthLabel; | |||
2241 | dmB->depthLabel = depthTmp; | |||
2242 | tmpI = dmA->levelup; | |||
2243 | dmA->levelup = dmB->levelup; | |||
2244 | dmB->levelup = tmpI; | |||
2245 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2246 | } | |||
2247 | ||||
2248 | PetscErrorCode DMSetFromOptions_NonRefinement_Plex(PetscOptionItems *PetscOptionsObject,DM dm) | |||
2249 | { | |||
2250 | DM_Plex *mesh = (DM_Plex*) dm->data; | |||
2251 | PetscErrorCode ierr; | |||
2252 | ||||
2253 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2253; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2254 | /* Handle viewing */ | |||
2255 | ierr = PetscOptionsBool("-dm_plex_print_set_values", "Output all set values info", "DMPlexMatSetClosure", PETSC_FALSE, &mesh->printSetValues, NULL)PetscOptionsBool_Private(PetscOptionsObject,"-dm_plex_print_set_values" ,"Output all set values info","DMPlexMatSetClosure",PETSC_FALSE ,&mesh->printSetValues,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2255,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2256 | ierr = PetscOptionsBoundedInt("-dm_plex_print_fem", "Debug output level all fem computations", "DMPlexSNESComputeResidualFEM", 0, &mesh->printFEM, NULL,0)PetscOptionsInt_Private(PetscOptionsObject,"-dm_plex_print_fem" ,"Debug output level all fem computations","DMPlexSNESComputeResidualFEM" ,0,&mesh->printFEM,((void*)0),0,2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2256,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2257 | ierr = PetscOptionsReal("-dm_plex_print_tol", "Tolerance for FEM output", "DMPlexSNESComputeResidualFEM", mesh->printTol, &mesh->printTol, NULL)PetscOptionsReal_Private(PetscOptionsObject,"-dm_plex_print_tol" ,"Tolerance for FEM output","DMPlexSNESComputeResidualFEM",mesh ->printTol,&mesh->printTol,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2257,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2258 | ierr = PetscOptionsBoundedInt("-dm_plex_print_l2", "Debug output level all L2 diff computations", "DMComputeL2Diff", 0, &mesh->printL2, NULL,0)PetscOptionsInt_Private(PetscOptionsObject,"-dm_plex_print_l2" ,"Debug output level all L2 diff computations","DMComputeL2Diff" ,0,&mesh->printL2,((void*)0),0,2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2258,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2259 | /* Point Location */ | |||
2260 | ierr = PetscOptionsBool("-dm_plex_hash_location", "Use grid hashing for point location", "DMInterpolate", PETSC_FALSE, &mesh->useHashLocation, NULL)PetscOptionsBool_Private(PetscOptionsObject,"-dm_plex_hash_location" ,"Use grid hashing for point location","DMInterpolate",PETSC_FALSE ,&mesh->useHashLocation,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2260,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2261 | /* Partitioning and distribution */ | |||
2262 | ierr = PetscOptionsBool("-dm_plex_partition_balance", "Attempt to evenly divide points on partition boundary between processes", "DMPlexSetPartitionBalance", PETSC_FALSE, &mesh->partitionBalance, NULL)PetscOptionsBool_Private(PetscOptionsObject,"-dm_plex_partition_balance" ,"Attempt to evenly divide points on partition boundary between processes" ,"DMPlexSetPartitionBalance",PETSC_FALSE,&mesh->partitionBalance ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2262,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2263 | /* Generation and remeshing */ | |||
2264 | ierr = PetscOptionsBool("-dm_plex_remesh_bd", "Allow changes to the boundary on remeshing", "DMAdapt", PETSC_FALSE, &mesh->remeshBd, NULL)PetscOptionsBool_Private(PetscOptionsObject,"-dm_plex_remesh_bd" ,"Allow changes to the boundary on remeshing","DMAdapt",PETSC_FALSE ,&mesh->remeshBd,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2264,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2265 | /* Projection behavior */ | |||
2266 | ierr = PetscOptionsBoundedInt("-dm_plex_max_projection_height", "Maxmimum mesh point height used to project locally", "DMPlexSetMaxProjectionHeight", 0, &mesh->maxProjectionHeight, NULL,0)PetscOptionsInt_Private(PetscOptionsObject,"-dm_plex_max_projection_height" ,"Maxmimum mesh point height used to project locally","DMPlexSetMaxProjectionHeight" ,0,&mesh->maxProjectionHeight,((void*)0),0,2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2266,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2267 | ierr = PetscOptionsBool("-dm_plex_regular_refinement", "Use special nested projection algorithm for regular refinement", "DMPlexSetRegularRefinement", mesh->regularRefinement, &mesh->regularRefinement, NULL)PetscOptionsBool_Private(PetscOptionsObject,"-dm_plex_regular_refinement" ,"Use special nested projection algorithm for regular refinement" ,"DMPlexSetRegularRefinement",mesh->regularRefinement,& mesh->regularRefinement,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2267,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2268 | /* Checking structure */ | |||
2269 | { | |||
2270 | PetscBool flg = PETSC_FALSE, flg2 = PETSC_FALSE; | |||
2271 | ||||
2272 | ierr = PetscOptionsBool("-dm_plex_check_symmetry", "Check that the adjacency information in the mesh is symmetric", "DMPlexCheckSymmetry", PETSC_FALSE, &flg, &flg2)PetscOptionsBool_Private(PetscOptionsObject,"-dm_plex_check_symmetry" ,"Check that the adjacency information in the mesh is symmetric" ,"DMPlexCheckSymmetry",PETSC_FALSE,&flg,&flg2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2272,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2273 | if (flg && flg2) {ierr = DMPlexCheckSymmetry(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2273,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
2274 | ierr = PetscOptionsBool("-dm_plex_check_skeleton", "Check that each cell has the correct number of vertices (only for homogeneous simplex or tensor meshes)", "DMPlexCheckSkeleton", PETSC_FALSE, &flg, &flg2)PetscOptionsBool_Private(PetscOptionsObject,"-dm_plex_check_skeleton" ,"Check that each cell has the correct number of vertices (only for homogeneous simplex or tensor meshes)" ,"DMPlexCheckSkeleton",PETSC_FALSE,&flg,&flg2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2274,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2275 | if (flg && flg2) {ierr = DMPlexCheckSkeleton(dm, 0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2275,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
2276 | ierr = PetscOptionsBool("-dm_plex_check_faces", "Check that the faces of each cell give a vertex order this is consistent with what we expect from the cell type", "DMPlexCheckFaces", PETSC_FALSE, &flg, &flg2)PetscOptionsBool_Private(PetscOptionsObject,"-dm_plex_check_faces" ,"Check that the faces of each cell give a vertex order this is consistent with what we expect from the cell type" ,"DMPlexCheckFaces",PETSC_FALSE,&flg,&flg2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2276,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2277 | if (flg && flg2) {ierr = DMPlexCheckFaces(dm, 0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2277,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
2278 | ierr = PetscOptionsBool("-dm_plex_check_geometry", "Check that cells have positive volume", "DMPlexCheckGeometry", PETSC_FALSE, &flg, &flg2)PetscOptionsBool_Private(PetscOptionsObject,"-dm_plex_check_geometry" ,"Check that cells have positive volume","DMPlexCheckGeometry" ,PETSC_FALSE,&flg,&flg2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2278,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2279 | if (flg && flg2) {ierr = DMPlexCheckGeometry(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2279,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
2280 | } | |||
2281 | ||||
2282 | ierr = PetscPartitionerSetFromOptions(mesh->partitioner);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2282,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2283 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2284 | } | |||
2285 | ||||
2286 | static PetscErrorCode DMSetFromOptions_Plex(PetscOptionItems *PetscOptionsObject,DM dm) | |||
2287 | { | |||
2288 | PetscInt refine = 0, coarsen = 0, r; | |||
2289 | PetscBool isHierarchy; | |||
2290 | PetscErrorCode ierr; | |||
2291 | ||||
2292 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2292; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2293 | PetscValidHeaderSpecific(dm, DM_CLASSID, 1)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),2293,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",85 ,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (dm,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),2293 ,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(dm))->classid != DM_CLASSID) { if ( ((PetscObject)(dm))->classid == -1) return PetscError(((MPI_Comm )0x44000001),2293,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),2293,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",62 ,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1 ); } } while (0); | |||
2294 | ierr = PetscOptionsHead(PetscOptionsObject,"DMPlex Options");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2294,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2295 | /* Handle DMPlex refinement */ | |||
2296 | ierr = PetscOptionsBoundedInt("-dm_refine", "The number of uniform refinements", "DMCreate", refine, &refine, NULL,0)PetscOptionsInt_Private(PetscOptionsObject,"-dm_refine","The number of uniform refinements" ,"DMCreate",refine,&refine,((void*)0),0,2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2296,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2297 | ierr = PetscOptionsBoundedInt("-dm_refine_hierarchy", "The number of uniform refinements", "DMCreate", refine, &refine, &isHierarchy,0)PetscOptionsInt_Private(PetscOptionsObject,"-dm_refine_hierarchy" ,"The number of uniform refinements","DMCreate",refine,&refine ,&isHierarchy,0,2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2297,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2298 | if (refine) {ierr = DMPlexSetRefinementUniform(dm, PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2298,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
2299 | if (refine && isHierarchy) { | |||
2300 | DM *dms, coarseDM; | |||
2301 | ||||
2302 | ierr = DMGetCoarseDM(dm, &coarseDM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2302,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2303 | ierr = PetscObjectReference((PetscObject)coarseDM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2303,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2304 | ierr = PetscMalloc1(refine,&dms)PetscMallocA(1,PETSC_FALSE,2304,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(refine)*sizeof(**(&dms)),(&dms));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2304,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2305 | ierr = DMRefineHierarchy(dm, refine, dms);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2305,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2306 | /* Total hack since we do not pass in a pointer */ | |||
2307 | ierr = DMPlexSwap_Static(dm, dms[refine-1]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2307,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2308 | if (refine == 1) { | |||
2309 | ierr = DMSetCoarseDM(dm, dms[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2309,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2310 | ierr = DMPlexSetRegularRefinement(dm, PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2310,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2311 | } else { | |||
2312 | ierr = DMSetCoarseDM(dm, dms[refine-2]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2312,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2313 | ierr = DMPlexSetRegularRefinement(dm, PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2313,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2314 | ierr = DMSetCoarseDM(dms[0], dms[refine-1]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2314,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2315 | ierr = DMPlexSetRegularRefinement(dms[0], PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2315,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2316 | } | |||
2317 | ierr = DMSetCoarseDM(dms[refine-1], coarseDM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2317,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2318 | ierr = PetscObjectDereference((PetscObject)coarseDM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2318,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2319 | /* Free DMs */ | |||
2320 | for (r = 0; r < refine; ++r) { | |||
2321 | ierr = DMSetFromOptions_NonRefinement_Plex(PetscOptionsObject, dms[r]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2321,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2322 | ierr = DMDestroy(&dms[r]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2322,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2323 | } | |||
2324 | ierr = PetscFree(dms)((*PetscTrFree)((void*)(dms),2324,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((dms) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2324,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2325 | } else { | |||
2326 | for (r = 0; r < refine; ++r) { | |||
2327 | DM refinedMesh; | |||
2328 | ||||
2329 | ierr = DMSetFromOptions_NonRefinement_Plex(PetscOptionsObject, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2329,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2330 | ierr = DMRefine(dm, PetscObjectComm((PetscObject) dm), &refinedMesh);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2330,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2331 | /* Total hack since we do not pass in a pointer */ | |||
2332 | ierr = DMPlexReplace_Static(dm, refinedMesh);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2332,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2333 | ierr = DMSetFromOptions_NonRefinement_Plex(PetscOptionsObject, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2333,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2334 | ierr = DMDestroy(&refinedMesh);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2334,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2335 | } | |||
2336 | } | |||
2337 | /* Handle DMPlex coarsening */ | |||
2338 | ierr = PetscOptionsBoundedInt("-dm_coarsen", "Coarsen the mesh", "DMCreate", coarsen, &coarsen, NULL,0)PetscOptionsInt_Private(PetscOptionsObject,"-dm_coarsen","Coarsen the mesh" ,"DMCreate",coarsen,&coarsen,((void*)0),0,2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2338,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2339 | ierr = PetscOptionsBoundedInt("-dm_coarsen_hierarchy", "The number of coarsenings", "DMCreate", coarsen, &coarsen, &isHierarchy,0)PetscOptionsInt_Private(PetscOptionsObject,"-dm_coarsen_hierarchy" ,"The number of coarsenings","DMCreate",coarsen,&coarsen, &isHierarchy,0,2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2339,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2340 | if (coarsen && isHierarchy) { | |||
2341 | DM *dms; | |||
2342 | ||||
2343 | ierr = PetscMalloc1(coarsen, &dms)PetscMallocA(1,PETSC_FALSE,2343,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(coarsen)*sizeof(**(&dms)),(&dms));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2343,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2344 | ierr = DMCoarsenHierarchy(dm, coarsen, dms);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2344,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2345 | /* Free DMs */ | |||
2346 | for (r = 0; r < coarsen; ++r) { | |||
2347 | ierr = DMSetFromOptions_NonRefinement_Plex(PetscOptionsObject, dms[r]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2347,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2348 | ierr = DMDestroy(&dms[r]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2348,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2349 | } | |||
2350 | ierr = PetscFree(dms)((*PetscTrFree)((void*)(dms),2350,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((dms) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2350,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2351 | } else { | |||
2352 | for (r = 0; r < coarsen; ++r) { | |||
2353 | DM coarseMesh; | |||
2354 | ||||
2355 | ierr = DMSetFromOptions_NonRefinement_Plex(PetscOptionsObject, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2355,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2356 | ierr = DMCoarsen(dm, PetscObjectComm((PetscObject) dm), &coarseMesh);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2356,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2357 | /* Total hack since we do not pass in a pointer */ | |||
2358 | ierr = DMPlexReplace_Static(dm, coarseMesh);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2358,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2359 | ierr = DMSetFromOptions_NonRefinement_Plex(PetscOptionsObject, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2359,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2360 | ierr = DMDestroy(&coarseMesh);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2360,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2361 | } | |||
2362 | } | |||
2363 | /* Handle */ | |||
2364 | ierr = DMSetFromOptions_NonRefinement_Plex(PetscOptionsObject, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2364,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2365 | ierr = PetscOptionsTail()0; do {if (PetscOptionsObject->count != 1) do { do { ; if ( petscstack && petscstack->currentsize > 0) { petscstack ->currentsize--; petscstack->function[petscstack->currentsize ] = 0; petscstack->file[petscstack->currentsize] = 0; petscstack ->line[petscstack->currentsize] = 0; petscstack->petscroutine [petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)< (0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return (0);} while (0);} while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2365,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2366 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2367 | } | |||
2368 | ||||
2369 | static PetscErrorCode DMCreateGlobalVector_Plex(DM dm,Vec *vec) | |||
2370 | { | |||
2371 | PetscErrorCode ierr; | |||
2372 | ||||
2373 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2373; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2374 | ierr = DMCreateGlobalVector_Section_Private(dm,vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2374,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2375 | /* ierr = VecSetOperation(*vec, VECOP_DUPLICATE, (void(*)(void)) VecDuplicate_MPI_DM);CHKERRQ(ierr); */ | |||
2376 | ierr = VecSetOperation(*vec, VECOP_VIEW, (void (*)(void)) VecView_Plex);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2376,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2377 | ierr = VecSetOperation(*vec, VECOP_VIEWNATIVE, (void (*)(void)) VecView_Plex_Native);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2377,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2378 | ierr = VecSetOperation(*vec, VECOP_LOAD, (void (*)(void)) VecLoad_Plex);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2378,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2379 | ierr = VecSetOperation(*vec, VECOP_LOADNATIVE, (void (*)(void)) VecLoad_Plex_Native);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2379,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2380 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2381 | } | |||
2382 | ||||
2383 | static PetscErrorCode DMCreateLocalVector_Plex(DM dm,Vec *vec) | |||
2384 | { | |||
2385 | PetscErrorCode ierr; | |||
2386 | ||||
2387 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2387; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2388 | ierr = DMCreateLocalVector_Section_Private(dm,vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2388,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2389 | ierr = VecSetOperation(*vec, VECOP_VIEW, (void (*)(void)) VecView_Plex_Local);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2389,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2390 | ierr = VecSetOperation(*vec, VECOP_LOAD, (void (*)(void)) VecLoad_Plex_Local);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2390,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2391 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2392 | } | |||
2393 | ||||
2394 | static PetscErrorCode DMGetDimPoints_Plex(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd) | |||
2395 | { | |||
2396 | PetscInt depth, d; | |||
2397 | PetscErrorCode ierr; | |||
2398 | ||||
2399 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2399; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2400 | ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2400,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2401 | if (depth == 1) { | |||
2402 | ierr = DMGetDimension(dm, &d);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2402,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2403 | if (dim == 0) {ierr = DMPlexGetDepthStratum(dm, dim, pStart, pEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2403,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
2404 | else if (dim == d) {ierr = DMPlexGetDepthStratum(dm, 1, pStart, pEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2404,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
2405 | else {*pStart = 0; *pEnd = 0;} | |||
2406 | } else { | |||
2407 | ierr = DMPlexGetDepthStratum(dm, dim, pStart, pEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2407,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2408 | } | |||
2409 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2410 | } | |||
2411 | ||||
2412 | static PetscErrorCode DMGetNeighors_Plex(DM dm, PetscInt *nranks, const PetscMPIInt *ranks[]) | |||
2413 | { | |||
2414 | PetscSF sf; | |||
2415 | PetscErrorCode ierr; | |||
2416 | ||||
2417 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2417; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2418 | ierr = DMGetPointSF(dm, &sf);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2418,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2419 | ierr = PetscSFGetRanks(sf, nranks, ranks, NULL((void*)0), NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2419,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2420 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2421 | } | |||
2422 | ||||
2423 | static PetscErrorCode DMInitialize_Plex(DM dm) | |||
2424 | { | |||
2425 | PetscErrorCode ierr; | |||
2426 | ||||
2427 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2427; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2428 | dm->ops->view = DMView_Plex; | |||
2429 | dm->ops->load = DMLoad_Plex; | |||
2430 | dm->ops->setfromoptions = DMSetFromOptions_Plex; | |||
2431 | dm->ops->clone = DMClone_Plex; | |||
2432 | dm->ops->setup = DMSetUp_Plex; | |||
2433 | dm->ops->createdefaultsection = DMCreateDefaultSection_Plex; | |||
2434 | dm->ops->createdefaultconstraints = DMCreateDefaultConstraints_Plex; | |||
2435 | dm->ops->createglobalvector = DMCreateGlobalVector_Plex; | |||
2436 | dm->ops->createlocalvector = DMCreateLocalVector_Plex; | |||
2437 | dm->ops->getlocaltoglobalmapping = NULL((void*)0); | |||
2438 | dm->ops->createfieldis = NULL((void*)0); | |||
2439 | dm->ops->createcoordinatedm = DMCreateCoordinateDM_Plex; | |||
2440 | dm->ops->createcoordinatefield = DMCreateCoordinateField_Plex; | |||
2441 | dm->ops->getcoloring = NULL((void*)0); | |||
2442 | dm->ops->creatematrix = DMCreateMatrix_Plex; | |||
2443 | dm->ops->createinterpolation = DMCreateInterpolation_Plex; | |||
2444 | dm->ops->createmassmatrix = DMCreateMassMatrix_Plex; | |||
2445 | dm->ops->createinjection = DMCreateInjection_Plex; | |||
2446 | dm->ops->refine = DMRefine_Plex; | |||
2447 | dm->ops->coarsen = DMCoarsen_Plex; | |||
2448 | dm->ops->refinehierarchy = DMRefineHierarchy_Plex; | |||
2449 | dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Plex; | |||
2450 | dm->ops->adaptlabel = DMAdaptLabel_Plex; | |||
2451 | dm->ops->adaptmetric = DMAdaptMetric_Plex; | |||
2452 | dm->ops->globaltolocalbegin = NULL((void*)0); | |||
2453 | dm->ops->globaltolocalend = NULL((void*)0); | |||
2454 | dm->ops->localtoglobalbegin = NULL((void*)0); | |||
2455 | dm->ops->localtoglobalend = NULL((void*)0); | |||
2456 | dm->ops->destroy = DMDestroy_Plex; | |||
2457 | dm->ops->createsubdm = DMCreateSubDM_Plex; | |||
2458 | dm->ops->createsuperdm = DMCreateSuperDM_Plex; | |||
2459 | dm->ops->getdimpoints = DMGetDimPoints_Plex; | |||
2460 | dm->ops->locatepoints = DMLocatePoints_Plex; | |||
2461 | dm->ops->projectfunctionlocal = DMProjectFunctionLocal_Plex; | |||
2462 | dm->ops->projectfunctionlabellocal = DMProjectFunctionLabelLocal_Plex; | |||
2463 | dm->ops->projectfieldlocal = DMProjectFieldLocal_Plex; | |||
2464 | dm->ops->projectfieldlabellocal = DMProjectFieldLabelLocal_Plex; | |||
2465 | dm->ops->computel2diff = DMComputeL2Diff_Plex; | |||
2466 | dm->ops->computel2gradientdiff = DMComputeL2GradientDiff_Plex; | |||
2467 | dm->ops->computel2fielddiff = DMComputeL2FieldDiff_Plex; | |||
2468 | dm->ops->getneighbors = DMGetNeighors_Plex; | |||
2469 | ierr = PetscObjectComposeFunction((PetscObject)dm,"DMPlexInsertBoundaryValues_C",DMPlexInsertBoundaryValues_Plex)PetscObjectComposeFunction_Private((PetscObject)dm,"DMPlexInsertBoundaryValues_C" ,(PetscVoidFunction)(DMPlexInsertBoundaryValues_Plex));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2469,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2470 | ierr = PetscObjectComposeFunction((PetscObject)dm,"DMSetUpGLVisViewer_C",DMSetUpGLVisViewer_Plex)PetscObjectComposeFunction_Private((PetscObject)dm,"DMSetUpGLVisViewer_C" ,(PetscVoidFunction)(DMSetUpGLVisViewer_Plex));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2470,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2471 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2472 | } | |||
2473 | ||||
2474 | PETSC_INTERNextern __attribute__((visibility ("hidden"))) PetscErrorCode DMClone_Plex(DM dm, DM *newdm) | |||
2475 | { | |||
2476 | DM_Plex *mesh = (DM_Plex *) dm->data; | |||
2477 | PetscErrorCode ierr; | |||
2478 | ||||
2479 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2479; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2480 | mesh->refct++; | |||
2481 | (*newdm)->data = mesh; | |||
2482 | ierr = PetscObjectChangeTypeName((PetscObject) *newdm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2482,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2483 | ierr = DMInitialize_Plex(*newdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2483,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2484 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2485 | } | |||
2486 | ||||
2487 | /*MC | |||
2488 | DMPLEX = "plex" - A DM object that encapsulates an unstructured mesh, or CW Complex, which can be expressed using a Hasse Diagram. | |||
2489 | In the local representation, Vecs contain all unknowns in the interior and shared boundary. This is | |||
2490 | specified by a PetscSection object. Ownership in the global representation is determined by | |||
2491 | ownership of the underlying DMPlex points. This is specified by another PetscSection object. | |||
2492 | ||||
2493 | Options Database Keys: | |||
2494 | + -dm_plex_hash_location - Use grid hashing for point location | |||
2495 | . -dm_plex_partition_balance - Attempt to evenly divide points on partition boundary between processes | |||
2496 | . -dm_plex_remesh_bd - Allow changes to the boundary on remeshing | |||
2497 | . -dm_plex_max_projection_height - Maxmimum mesh point height used to project locally | |||
2498 | . -dm_plex_regular_refinement - Use special nested projection algorithm for regular refinement | |||
2499 | . -dm_plex_check_symmetry - Check that the adjacency information in the mesh is symmetric | |||
2500 | . -dm_plex_check_skeleton <celltype> - Check that each cell has the correct number of vertices | |||
2501 | . -dm_plex_check_faces <celltype> - Check that the faces of each cell give a vertex order this is consistent with what we expect from the cell type | |||
2502 | . -dm_plex_check_geometry - Check that cells have positive volume | |||
2503 | . -dm_view :mesh.tex:ascii_latex - View the mesh in LaTeX/TikZ | |||
2504 | . -dm_plex_view_scale <num> - Scale the TikZ | |||
2505 | - -dm_plex_print_fem <num> - View FEM assembly information, such as element vectors and matrices | |||
2506 | ||||
2507 | ||||
2508 | Level: intermediate | |||
2509 | ||||
2510 | .seealso: DMType, DMPlexCreate(), DMCreate(), DMSetType() | |||
2511 | M*/ | |||
2512 | ||||
2513 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode DMCreate_Plex(DM dm) | |||
2514 | { | |||
2515 | DM_Plex *mesh; | |||
2516 | PetscInt unit, d; | |||
2517 | PetscErrorCode ierr; | |||
2518 | ||||
2519 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2519; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2520 | PetscValidHeaderSpecific(dm, DM_CLASSID, 1)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),2520,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",85 ,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (dm,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),2520 ,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(dm))->classid != DM_CLASSID) { if ( ((PetscObject)(dm))->classid == -1) return PetscError(((MPI_Comm )0x44000001),2520,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),2520,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",62 ,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1 ); } } while (0); | |||
2521 | ierr = PetscNewLog(dm,&mesh)(PetscMallocA(1,PETSC_TRUE,2521,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(1)*sizeof(**(((&mesh)))),(((&mesh)))) || PetscLogObjectMemory ((PetscObject)dm,sizeof(**(&mesh))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2521,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2522 | dm->dim = 0; | |||
2523 | dm->data = mesh; | |||
2524 | ||||
2525 | mesh->refct = 1; | |||
2526 | ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm), &mesh->coneSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2526,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2527 | mesh->maxConeSize = 0; | |||
2528 | mesh->cones = NULL((void*)0); | |||
2529 | mesh->coneOrientations = NULL((void*)0); | |||
2530 | ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm), &mesh->supportSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2530,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2531 | mesh->maxSupportSize = 0; | |||
2532 | mesh->supports = NULL((void*)0); | |||
2533 | mesh->refinementUniform = PETSC_TRUE; | |||
2534 | mesh->refinementLimit = -1.0; | |||
2535 | ||||
2536 | mesh->facesTmp = NULL((void*)0); | |||
2537 | ||||
2538 | mesh->tetgenOpts = NULL((void*)0); | |||
2539 | mesh->triangleOpts = NULL((void*)0); | |||
2540 | ierr = PetscPartitionerCreate(PetscObjectComm((PetscObject)dm), &mesh->partitioner);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2540,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2541 | mesh->remeshBd = PETSC_FALSE; | |||
2542 | ||||
2543 | mesh->subpointMap = NULL((void*)0); | |||
2544 | ||||
2545 | for (unit = 0; unit < NUM_PETSC_UNITS; ++unit) mesh->scale[unit] = 1.0; | |||
2546 | ||||
2547 | mesh->regularRefinement = PETSC_FALSE; | |||
2548 | mesh->depthState = -1; | |||
2549 | mesh->globalVertexNumbers = NULL((void*)0); | |||
2550 | mesh->globalCellNumbers = NULL((void*)0); | |||
2551 | mesh->anchorSection = NULL((void*)0); | |||
2552 | mesh->anchorIS = NULL((void*)0); | |||
2553 | mesh->createanchors = NULL((void*)0); | |||
2554 | mesh->computeanchormatrix = NULL((void*)0); | |||
2555 | mesh->parentSection = NULL((void*)0); | |||
2556 | mesh->parents = NULL((void*)0); | |||
2557 | mesh->childIDs = NULL((void*)0); | |||
2558 | mesh->childSection = NULL((void*)0); | |||
2559 | mesh->children = NULL((void*)0); | |||
2560 | mesh->referenceTree = NULL((void*)0); | |||
2561 | mesh->getchildsymmetry = NULL((void*)0); | |||
2562 | for (d = 0; d < 8; ++d) mesh->hybridPointMax[d] = PETSC_DETERMINE-1; | |||
2563 | mesh->vtkCellHeight = 0; | |||
2564 | mesh->useAnchors = PETSC_FALSE; | |||
2565 | ||||
2566 | mesh->maxProjectionHeight = 0; | |||
2567 | ||||
2568 | mesh->printSetValues = PETSC_FALSE; | |||
2569 | mesh->printFEM = 0; | |||
2570 | mesh->printTol = 1.0e-10; | |||
2571 | ||||
2572 | ierr = DMInitialize_Plex(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2572,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2573 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2574 | } | |||
2575 | ||||
2576 | /*@ | |||
2577 | DMPlexCreate - Creates a DMPlex object, which encapsulates an unstructured mesh, or CW complex, which can be expressed using a Hasse Diagram. | |||
2578 | ||||
2579 | Collective | |||
2580 | ||||
2581 | Input Parameter: | |||
2582 | . comm - The communicator for the DMPlex object | |||
2583 | ||||
2584 | Output Parameter: | |||
2585 | . mesh - The DMPlex object | |||
2586 | ||||
2587 | Level: beginner | |||
2588 | ||||
2589 | @*/ | |||
2590 | PetscErrorCode DMPlexCreate(MPI_Comm comm, DM *mesh) | |||
2591 | { | |||
2592 | PetscErrorCode ierr; | |||
2593 | ||||
2594 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2594; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2595 | PetscValidPointer(mesh,2)do { if (!mesh) return PetscError(((MPI_Comm)0x44000001),2595 ,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(mesh,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),2595,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",2); } while (0); | |||
2596 | ierr = DMCreate(comm, mesh);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2596,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2597 | ierr = DMSetType(*mesh, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2597,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2598 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2599 | } | |||
2600 | ||||
2601 | /* | |||
2602 | This takes as input the common mesh generator output, a list of the vertices for each cell, but vertex numbers are global and an SF is built for them | |||
2603 | */ | |||
2604 | /* TODO: invertCells and spaceDim arguments could be added also to to DMPlexCreateFromCellListParallel(), DMPlexBuildFromCellList_Internal() and DMPlexCreateFromCellList() */ | |||
2605 | PetscErrorCode DMPlexBuildFromCellList_Parallel_Internal(DM dm, PetscInt spaceDim, PetscInt numCells, PetscInt numVertices, PetscInt numCorners, const int cells[], PetscBool invertCells, PetscSF *sfVert) | |||
2606 | { | |||
2607 | PetscSF sfPoint; | |||
2608 | PetscLayout vLayout; | |||
2609 | PetscHSetI vhash; | |||
2610 | PetscSFNode *remoteVerticesAdj, *vertexLocal, *vertexOwner, *remoteVertex; | |||
2611 | const PetscInt *vrange; | |||
2612 | PetscInt numVerticesAdj, off = 0, *verticesAdj, numVerticesGhost = 0, *localVertex, *cone, c, p, v, g; | |||
2613 | PetscMPIInt rank, size; | |||
2614 | PetscErrorCode ierr; | |||
2615 | ||||
2616 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2616; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2617 | ierr = MPI_Comm_rank(PetscObjectComm((PetscObject) dm), &rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2617,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2618 | ierr = MPI_Comm_size(PetscObjectComm((PetscObject) dm), &size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2618,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2619 | /* Partition vertices */ | |||
2620 | ierr = PetscLayoutCreate(PetscObjectComm((PetscObject) dm), &vLayout);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2620,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2621 | ierr = PetscLayoutSetLocalSize(vLayout, numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2621,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2622 | ierr = PetscLayoutSetBlockSize(vLayout, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2622,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2623 | ierr = PetscLayoutSetUp(vLayout);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2623,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2624 | ierr = PetscLayoutGetRanges(vLayout, &vrange);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2624,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2625 | /* Count vertices and map them to procs */ | |||
2626 | ierr = PetscHSetICreate(&vhash);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2626,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
| ||||
2627 | for (c = 0; c < numCells; ++c) { | |||
2628 | for (p = 0; p < numCorners; ++p) { | |||
2629 | ierr = PetscHSetIAdd(vhash, cells[c*numCorners+p]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2629,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2630 | } | |||
2631 | } | |||
2632 | ierr = PetscHSetIGetSize(vhash, &numVerticesAdj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2632,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2633 | ierr = PetscMalloc1(numVerticesAdj, &verticesAdj)PetscMallocA(1,PETSC_FALSE,2633,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numVerticesAdj)*sizeof(**(&verticesAdj)),(& verticesAdj));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2633,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2634 | ierr = PetscHSetIGetElems(vhash, &off, verticesAdj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2634,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2635 | ierr = PetscHSetIDestroy(&vhash);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2635,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2636 | if (off != numVerticesAdj) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid number of local vertices %D should be %D", off, numVerticesAdj)return PetscError(((MPI_Comm)0x44000001),2636,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Invalid number of local vertices %D should be %D" ,off,numVerticesAdj); | |||
2637 | ierr = PetscSortInt(numVerticesAdj, verticesAdj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2637,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2638 | ierr = PetscMalloc1(numVerticesAdj, &remoteVerticesAdj)PetscMallocA(1,PETSC_FALSE,2638,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numVerticesAdj)*sizeof(**(&remoteVerticesAdj)), (&remoteVerticesAdj));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2638,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2639 | for (v = 0; v < numVerticesAdj; ++v) { | |||
2640 | const PetscInt gv = verticesAdj[v]; | |||
2641 | PetscInt vrank; | |||
2642 | ||||
2643 | ierr = PetscFindInt(gv, size+1, vrange, &vrank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2643,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2644 | vrank = vrank < 0 ? -(vrank+2) : vrank; | |||
2645 | remoteVerticesAdj[v].index = gv - vrange[vrank]; | |||
2646 | remoteVerticesAdj[v].rank = vrank; | |||
2647 | } | |||
2648 | /* Create cones */ | |||
2649 | ierr = DMPlexSetChart(dm, 0, numCells+numVerticesAdj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2649,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2650 | for (c = 0; c < numCells; ++c) {ierr = DMPlexSetConeSize(dm, c, numCorners);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2650,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
2651 | ierr = DMSetUp(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2651,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2652 | ierr = DMGetWorkArray(dm, numCorners, MPIU_INT((MPI_Datatype)0x4c000405), &cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2652,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2653 | for (c = 0; c < numCells; ++c) { | |||
2654 | for (p = 0; p < numCorners; ++p) { | |||
2655 | const PetscInt gv = cells[c*numCorners+p]; | |||
2656 | PetscInt lv; | |||
2657 | ||||
2658 | ierr = PetscFindInt(gv, numVerticesAdj, verticesAdj, &lv);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2658,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2659 | if (lv < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Could not find global vertex %D in local connectivity", gv)return PetscError(((MPI_Comm)0x44000001),2659,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,63,PETSC_ERROR_INITIAL,"Could not find global vertex %D in local connectivity" ,gv); | |||
2660 | cone[p] = lv+numCells; | |||
2661 | } | |||
2662 | if (invertCells) { ierr = DMPlexInvertCell_Internal(spaceDim, numCorners, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2662,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); } | |||
2663 | ierr = DMPlexSetCone(dm, c, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2663,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2664 | } | |||
2665 | ierr = DMRestoreWorkArray(dm, numCorners, MPIU_INT((MPI_Datatype)0x4c000405), &cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2665,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2666 | /* Create SF for vertices */ | |||
2667 | ierr = PetscSFCreate(PetscObjectComm((PetscObject)dm), sfVert);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2667,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2668 | ierr = PetscObjectSetName((PetscObject) *sfVert, "Vertex Ownership SF");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2668,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2669 | ierr = PetscSFSetFromOptions(*sfVert);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2669,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2670 | ierr = PetscSFSetGraph(*sfVert, numVertices, numVerticesAdj, NULL((void*)0), PETSC_OWN_POINTER, remoteVerticesAdj, PETSC_OWN_POINTER);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2670,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2671 | ierr = PetscFree(verticesAdj)((*PetscTrFree)((void*)(verticesAdj),2671,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((verticesAdj) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2671,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2672 | /* Build pointSF */ | |||
2673 | ierr = PetscMalloc2(numVerticesAdj, &vertexLocal, numVertices, &vertexOwner)PetscMallocA(2,PETSC_FALSE,2673,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numVerticesAdj)*sizeof(**(&vertexLocal)),(& vertexLocal),(size_t)(numVertices)*sizeof(**(&vertexOwner )),(&vertexOwner));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2673,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2674 | for (v = 0; v < numVerticesAdj; ++v) {vertexLocal[v].index = v+numCells; vertexLocal[v].rank = rank;} | |||
2675 | for (v = 0; v < numVertices; ++v) {vertexOwner[v].index = -1; vertexOwner[v].rank = -1;} | |||
2676 | ierr = PetscSFReduceBegin(*sfVert, MPIU_2INT((MPI_Datatype)0x4c000816), vertexLocal, vertexOwner, MPI_MAXLOC(MPI_Op)(0x5800000c));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2676,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2677 | ierr = PetscSFReduceEnd(*sfVert, MPIU_2INT((MPI_Datatype)0x4c000816), vertexLocal, vertexOwner, MPI_MAXLOC(MPI_Op)(0x5800000c));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2677,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2678 | for (v = 0; v < numVertices; ++v) if (vertexOwner[v].rank < 0) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Global vertex %d on rank %d was unclaimed", v + vrange[rank], rank)return PetscError(((MPI_Comm)0x44000001),2678,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Global vertex %d on rank %d was unclaimed" ,v + vrange[rank],rank); | |||
2679 | ierr = PetscSFBcastBegin(*sfVert, MPIU_2INT((MPI_Datatype)0x4c000816), vertexOwner, vertexLocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2679,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2680 | ierr = PetscSFBcastEnd(*sfVert, MPIU_2INT((MPI_Datatype)0x4c000816), vertexOwner, vertexLocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2680,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2681 | for (v = 0; v < numVerticesAdj; ++v) if (vertexLocal[v].rank != rank) ++numVerticesGhost; | |||
2682 | ierr = PetscMalloc1(numVerticesGhost, &localVertex)PetscMallocA(1,PETSC_FALSE,2682,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numVerticesGhost)*sizeof(**(&localVertex)),(& localVertex));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2682,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2683 | ierr = PetscMalloc1(numVerticesGhost, &remoteVertex)PetscMallocA(1,PETSC_FALSE,2683,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numVerticesGhost)*sizeof(**(&remoteVertex)),(& remoteVertex));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2683,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2684 | for (v = 0, g = 0; v < numVerticesAdj; ++v) { | |||
2685 | if (vertexLocal[v].rank != rank) { | |||
2686 | localVertex[g] = v+numCells; | |||
2687 | remoteVertex[g].index = vertexLocal[v].index; | |||
2688 | remoteVertex[g].rank = vertexLocal[v].rank; | |||
2689 | ++g; | |||
2690 | } | |||
2691 | } | |||
2692 | ierr = PetscFree2(vertexLocal, vertexOwner)PetscFreeA(2,2692,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,&(vertexLocal),&(vertexOwner));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2692,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2693 | if (g != numVerticesGhost) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of vertex ghosts %D should be %D", g, numVerticesGhost)return PetscError(((MPI_Comm)0x44000001),2693,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,77,PETSC_ERROR_INITIAL,"Invalid number of vertex ghosts %D should be %D" ,g,numVerticesGhost); | |||
2694 | ierr = DMGetPointSF(dm, &sfPoint);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2694,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2695 | ierr = PetscObjectSetName((PetscObject) sfPoint, "point SF");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2695,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2696 | ierr = PetscSFSetGraph(sfPoint, numCells+numVerticesAdj, numVerticesGhost, localVertex, PETSC_OWN_POINTER, remoteVertex, PETSC_OWN_POINTER);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2696,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2697 | ierr = PetscLayoutDestroy(&vLayout);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2697,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2698 | /* Fill in the rest of the topology structure */ | |||
2699 | ierr = DMPlexSymmetrize(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2699,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2700 | ierr = DMPlexStratify(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2700,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2701 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2702 | } | |||
2703 | ||||
2704 | /* | |||
2705 | This takes as input the coordinates for each owned vertex | |||
2706 | */ | |||
2707 | PetscErrorCode DMPlexBuildCoordinates_Parallel_Internal(DM dm, PetscInt spaceDim, PetscInt numCells, PetscInt numV, PetscSF sfVert, const PetscReal vertexCoords[]) | |||
2708 | { | |||
2709 | PetscSection coordSection; | |||
2710 | Vec coordinates; | |||
2711 | PetscScalar *coords; | |||
2712 | PetscInt numVertices, numVerticesAdj, coordSize, v; | |||
2713 | PetscErrorCode ierr; | |||
2714 | ||||
2715 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2715; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2716 | ierr = DMSetCoordinateDim(dm, spaceDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2716,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2717 | ierr = PetscSFGetGraph(sfVert, &numVertices, &numVerticesAdj, NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2717,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2718 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2718,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2719 | ierr = PetscSectionSetNumFields(coordSection, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2719,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2720 | ierr = PetscSectionSetFieldComponents(coordSection, 0, spaceDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2720,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2721 | ierr = PetscSectionSetChart(coordSection, numCells, numCells + numVerticesAdj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2721,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2722 | for (v = numCells; v < numCells+numVerticesAdj; ++v) { | |||
2723 | ierr = PetscSectionSetDof(coordSection, v, spaceDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2723,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2724 | ierr = PetscSectionSetFieldDof(coordSection, v, 0, spaceDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2724,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2725 | } | |||
2726 | ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2726,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2727 | ierr = PetscSectionGetStorageSize(coordSection, &coordSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2727,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2728 | ierr = VecCreate(PetscObjectComm((PetscObject)dm), &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2728,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2729 | ierr = VecSetBlockSize(coordinates, spaceDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2729,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2730 | ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2730,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2731 | ierr = VecSetSizes(coordinates, coordSize, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2731,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2732 | ierr = VecSetType(coordinates,VECSTANDARD"standard");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2732,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2733 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2733,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2734 | { | |||
2735 | MPI_Datatype coordtype; | |||
2736 | ||||
2737 | /* Need a temp buffer for coords if we have complex/single */ | |||
2738 | ierr = MPI_Type_contiguous(spaceDim, MPIU_SCALAR((MPI_Datatype)0x4c00080b), &coordtype);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2738,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2739 | ierr = MPI_Type_commit(&coordtype);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2739,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2740 | #if defined(PETSC_USE_COMPLEX) | |||
2741 | { | |||
2742 | PetscScalar *svertexCoords; | |||
2743 | PetscInt i; | |||
2744 | ierr = PetscMalloc1(numV*spaceDim,&svertexCoords)PetscMallocA(1,PETSC_FALSE,2744,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,(size_t)(numV*spaceDim)*sizeof(**(&svertexCoords)),(& svertexCoords));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2744,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2745 | for (i=0; i<numV*spaceDim; i++) svertexCoords[i] = vertexCoords[i]; | |||
2746 | ierr = PetscSFBcastBegin(sfVert, coordtype, svertexCoords, coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2746,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2747 | ierr = PetscSFBcastEnd(sfVert, coordtype, svertexCoords, coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2747,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2748 | ierr = PetscFree(svertexCoords)((*PetscTrFree)((void*)(svertexCoords),2748,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((svertexCoords) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2748,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2749 | } | |||
2750 | #else | |||
2751 | ierr = PetscSFBcastBegin(sfVert, coordtype, vertexCoords, coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2751,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2752 | ierr = PetscSFBcastEnd(sfVert, coordtype, vertexCoords, coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2752,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2753 | #endif | |||
2754 | ierr = MPI_Type_free(&coordtype);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2754,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2755 | } | |||
2756 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2756,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2757 | ierr = DMSetCoordinatesLocal(dm, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2757,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2758 | ierr = VecDestroy(&coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2758,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2759 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2760 | } | |||
2761 | ||||
2762 | /*@ | |||
2763 | DMPlexCreateFromCellListParallel - This takes as input common mesh generator output, a list of the vertices for each cell, and produces a DM | |||
2764 | ||||
2765 | Input Parameters: | |||
2766 | + comm - The communicator | |||
2767 | . dim - The topological dimension of the mesh | |||
2768 | . numCells - The number of cells owned by this process | |||
2769 | . numVertices - The number of vertices owned by this process | |||
2770 | . numCorners - The number of vertices for each cell | |||
2771 | . interpolate - Flag indicating that intermediate mesh entities (faces, edges) should be created automatically | |||
2772 | . cells - An array of numCells*numCorners numbers, the global vertex numbers for each cell | |||
2773 | . spaceDim - The spatial dimension used for coordinates | |||
2774 | - vertexCoords - An array of numVertices*spaceDim numbers, the coordinates of each vertex | |||
2775 | ||||
2776 | Output Parameter: | |||
2777 | + dm - The DM | |||
2778 | - vertexSF - Optional, SF describing complete vertex ownership | |||
2779 | ||||
2780 | Note: Two triangles sharing a face | |||
2781 | $ | |||
2782 | $ 2 | |||
2783 | $ / | \ | |||
2784 | $ / | \ | |||
2785 | $ / | \ | |||
2786 | $ 0 0 | 1 3 | |||
2787 | $ \ | / | |||
2788 | $ \ | / | |||
2789 | $ \ | / | |||
2790 | $ 1 | |||
2791 | would have input | |||
2792 | $ numCells = 2, numVertices = 4 | |||
2793 | $ cells = [0 1 2 1 3 2] | |||
2794 | $ | |||
2795 | which would result in the DMPlex | |||
2796 | $ | |||
2797 | $ 4 | |||
2798 | $ / | \ | |||
2799 | $ / | \ | |||
2800 | $ / | \ | |||
2801 | $ 2 0 | 1 5 | |||
2802 | $ \ | / | |||
2803 | $ \ | / | |||
2804 | $ \ | / | |||
2805 | $ 3 | |||
2806 | ||||
2807 | Level: beginner | |||
2808 | ||||
2809 | .seealso: DMPlexCreateFromCellList(), DMPlexCreateFromDAG(), DMPlexCreate() | |||
2810 | @*/ | |||
2811 | PetscErrorCode DMPlexCreateFromCellListParallel(MPI_Comm comm, PetscInt dim, PetscInt numCells, PetscInt numVertices, PetscInt numCorners, PetscBool interpolate, const int cells[], PetscInt spaceDim, const PetscReal vertexCoords[], PetscSF *vertexSF, DM *dm) | |||
2812 | { | |||
2813 | PetscSF sfVert; | |||
2814 | PetscErrorCode ierr; | |||
2815 | ||||
2816 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2816; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2817 | ierr = DMCreate(comm, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2817,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2818 | ierr = DMSetType(*dm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2818,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2819 | PetscValidLogicalCollectiveInt(*dm, dim, 2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -dim ; b1[1] = dim; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)*dm),2,2819,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)*dm))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )*dm)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),2819,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)*dm),2819 ,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
2820 | PetscValidLogicalCollectiveInt(*dm, spaceDim, 8)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -spaceDim ; b1[1] = spaceDim; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)*dm),2,2820,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)*dm))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )*dm)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),2820,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)*dm),2820 ,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,8); } while (0); | |||
2821 | ierr = DMSetDimension(*dm, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2821,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2822 | ierr = DMPlexBuildFromCellList_Parallel_Internal(*dm, spaceDim, numCells, numVertices, numCorners, cells, PETSC_FALSE, &sfVert);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2822,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2823 | if (interpolate) { | |||
2824 | DM idm; | |||
2825 | ||||
2826 | ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2826,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2827 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2827,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2828 | *dm = idm; | |||
2829 | } | |||
2830 | ierr = DMPlexBuildCoordinates_Parallel_Internal(*dm, spaceDim, numCells, numVertices, sfVert, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2830,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2831 | if (vertexSF) *vertexSF = sfVert; | |||
2832 | else {ierr = PetscSFDestroy(&sfVert);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2832,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
2833 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2834 | } | |||
2835 | ||||
2836 | /* | |||
2837 | This takes as input the common mesh generator output, a list of the vertices for each cell | |||
2838 | */ | |||
2839 | PetscErrorCode DMPlexBuildFromCellList_Internal(DM dm, PetscInt spaceDim, PetscInt numCells, PetscInt numVertices, PetscInt numCorners, const int cells[], PetscBool invertCells) | |||
2840 | { | |||
2841 | PetscInt *cone, c, p; | |||
2842 | PetscErrorCode ierr; | |||
2843 | ||||
2844 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2844; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2845 | ierr = DMPlexSetChart(dm, 0, numCells+numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2845,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2846 | for (c = 0; c < numCells; ++c) { | |||
2847 | ierr = DMPlexSetConeSize(dm, c, numCorners);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2847,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2848 | } | |||
2849 | ierr = DMSetUp(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2849,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2850 | ierr = DMGetWorkArray(dm, numCorners, MPIU_INT((MPI_Datatype)0x4c000405), &cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2850,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2851 | for (c = 0; c < numCells; ++c) { | |||
2852 | for (p = 0; p < numCorners; ++p) { | |||
2853 | cone[p] = cells[c*numCorners+p]+numCells; | |||
2854 | } | |||
2855 | if (invertCells) { ierr = DMPlexInvertCell_Internal(spaceDim, numCorners, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2855,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); } | |||
2856 | ierr = DMPlexSetCone(dm, c, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2856,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2857 | } | |||
2858 | ierr = DMRestoreWorkArray(dm, numCorners, MPIU_INT((MPI_Datatype)0x4c000405), &cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2858,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2859 | ierr = DMPlexSymmetrize(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2859,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2860 | ierr = DMPlexStratify(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2860,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2861 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2862 | } | |||
2863 | ||||
2864 | /* | |||
2865 | This takes as input the coordinates for each vertex | |||
2866 | */ | |||
2867 | PetscErrorCode DMPlexBuildCoordinates_Internal(DM dm, PetscInt spaceDim, PetscInt numCells, PetscInt numVertices, const double vertexCoords[]) | |||
2868 | { | |||
2869 | PetscSection coordSection; | |||
2870 | Vec coordinates; | |||
2871 | DM cdm; | |||
2872 | PetscScalar *coords; | |||
2873 | PetscInt v, d; | |||
2874 | PetscErrorCode ierr; | |||
2875 | ||||
2876 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2876; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2877 | ierr = DMSetCoordinateDim(dm, spaceDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2877,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2878 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2878,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2879 | ierr = PetscSectionSetNumFields(coordSection, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2879,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2880 | ierr = PetscSectionSetFieldComponents(coordSection, 0, spaceDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2880,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2881 | ierr = PetscSectionSetChart(coordSection, numCells, numCells + numVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2881,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2882 | for (v = numCells; v < numCells+numVertices; ++v) { | |||
2883 | ierr = PetscSectionSetDof(coordSection, v, spaceDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2883,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2884 | ierr = PetscSectionSetFieldDof(coordSection, v, 0, spaceDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2884,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2885 | } | |||
2886 | ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2886,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2887 | ||||
2888 | ierr = DMGetCoordinateDM(dm, &cdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2888,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2889 | ierr = DMCreateLocalVector(cdm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2889,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2890 | ierr = VecSetBlockSize(coordinates, spaceDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2890,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2891 | ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2891,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2892 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2892,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2893 | for (v = 0; v < numVertices; ++v) { | |||
2894 | for (d = 0; d < spaceDim; ++d) { | |||
2895 | coords[v*spaceDim+d] = vertexCoords[v*spaceDim+d]; | |||
2896 | } | |||
2897 | } | |||
2898 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2898,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2899 | ierr = DMSetCoordinatesLocal(dm, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2899,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2900 | ierr = VecDestroy(&coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2900,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2901 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2902 | } | |||
2903 | ||||
2904 | /*@ | |||
2905 | DMPlexCreateFromCellList - This takes as input common mesh generator output, a list of the vertices for each cell, and produces a DM | |||
2906 | ||||
2907 | Input Parameters: | |||
2908 | + comm - The communicator | |||
2909 | . dim - The topological dimension of the mesh | |||
2910 | . numCells - The number of cells | |||
2911 | . numVertices - The number of vertices | |||
2912 | . numCorners - The number of vertices for each cell | |||
2913 | . interpolate - Flag indicating that intermediate mesh entities (faces, edges) should be created automatically | |||
2914 | . cells - An array of numCells*numCorners numbers, the vertices for each cell | |||
2915 | . spaceDim - The spatial dimension used for coordinates | |||
2916 | - vertexCoords - An array of numVertices*spaceDim numbers, the coordinates of each vertex | |||
2917 | ||||
2918 | Output Parameter: | |||
2919 | . dm - The DM | |||
2920 | ||||
2921 | Note: Two triangles sharing a face | |||
2922 | $ | |||
2923 | $ 2 | |||
2924 | $ / | \ | |||
2925 | $ / | \ | |||
2926 | $ / | \ | |||
2927 | $ 0 0 | 1 3 | |||
2928 | $ \ | / | |||
2929 | $ \ | / | |||
2930 | $ \ | / | |||
2931 | $ 1 | |||
2932 | would have input | |||
2933 | $ numCells = 2, numVertices = 4 | |||
2934 | $ cells = [0 1 2 1 3 2] | |||
2935 | $ | |||
2936 | which would result in the DMPlex | |||
2937 | $ | |||
2938 | $ 4 | |||
2939 | $ / | \ | |||
2940 | $ / | \ | |||
2941 | $ / | \ | |||
2942 | $ 2 0 | 1 5 | |||
2943 | $ \ | / | |||
2944 | $ \ | / | |||
2945 | $ \ | / | |||
2946 | $ 3 | |||
2947 | ||||
2948 | Level: beginner | |||
2949 | ||||
2950 | .seealso: DMPlexCreateFromDAG(), DMPlexCreate() | |||
2951 | @*/ | |||
2952 | PetscErrorCode DMPlexCreateFromCellList(MPI_Comm comm, PetscInt dim, PetscInt numCells, PetscInt numVertices, PetscInt numCorners, PetscBool interpolate, const int cells[], PetscInt spaceDim, const double vertexCoords[], DM *dm) | |||
2953 | { | |||
2954 | PetscErrorCode ierr; | |||
2955 | ||||
2956 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 2956; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2957 | ierr = DMCreate(comm, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2957,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2958 | ierr = DMSetType(*dm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2958,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2959 | ierr = DMSetDimension(*dm, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2959,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2960 | ierr = DMPlexBuildFromCellList_Internal(*dm, spaceDim, numCells, numVertices, numCorners, cells, PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2960,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2961 | if (interpolate) { | |||
2962 | DM idm; | |||
2963 | ||||
2964 | ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2964,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2965 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2965,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2966 | *dm = idm; | |||
2967 | } | |||
2968 | ierr = DMPlexBuildCoordinates_Internal(*dm, spaceDim, numCells, numVertices, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2968,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2969 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2970 | } | |||
2971 | ||||
2972 | /*@ | |||
2973 | DMPlexCreateFromDAG - This takes as input the adjacency-list representation of the Directed Acyclic Graph (Hasse Diagram) encoding a mesh, and produces a DM | |||
2974 | ||||
2975 | Input Parameters: | |||
2976 | + dm - The empty DM object, usually from DMCreate() and DMSetDimension() | |||
2977 | . depth - The depth of the DAG | |||
2978 | . numPoints - Array of size depth + 1 containing the number of points at each depth | |||
2979 | . coneSize - The cone size of each point | |||
2980 | . cones - The concatenation of the cone points for each point, the cone list must be oriented correctly for each point | |||
2981 | . coneOrientations - The orientation of each cone point | |||
2982 | - vertexCoords - An array of numPoints[0]*spacedim numbers representing the coordinates of each vertex, with spacedim the value set via DMSetCoordinateDim() | |||
2983 | ||||
2984 | Output Parameter: | |||
2985 | . dm - The DM | |||
2986 | ||||
2987 | Note: Two triangles sharing a face would have input | |||
2988 | $ depth = 1, numPoints = [4 2], coneSize = [3 3 0 0 0 0] | |||
2989 | $ cones = [2 3 4 3 5 4], coneOrientations = [0 0 0 0 0 0] | |||
2990 | $ vertexCoords = [-1.0 0.0 0.0 -1.0 0.0 1.0 1.0 0.0] | |||
2991 | $ | |||
2992 | which would result in the DMPlex | |||
2993 | $ | |||
2994 | $ 4 | |||
2995 | $ / | \ | |||
2996 | $ / | \ | |||
2997 | $ / | \ | |||
2998 | $ 2 0 | 1 5 | |||
2999 | $ \ | / | |||
3000 | $ \ | / | |||
3001 | $ \ | / | |||
3002 | $ 3 | |||
3003 | $ | |||
3004 | $ Notice that all points are numbered consecutively, unlikely DMPlexCreateFromCellList() | |||
3005 | ||||
3006 | Level: advanced | |||
3007 | ||||
3008 | .seealso: DMPlexCreateFromCellList(), DMPlexCreate() | |||
3009 | @*/ | |||
3010 | PetscErrorCode DMPlexCreateFromDAG(DM dm, PetscInt depth, const PetscInt numPoints[], const PetscInt coneSize[], const PetscInt cones[], const PetscInt coneOrientations[], const PetscScalar vertexCoords[]) | |||
3011 | { | |||
3012 | Vec coordinates; | |||
3013 | PetscSection coordSection; | |||
3014 | PetscScalar *coords; | |||
3015 | PetscInt coordSize, firstVertex = -1, pStart = 0, pEnd = 0, p, v, dim, dimEmbed, d, off; | |||
3016 | PetscErrorCode ierr; | |||
3017 | ||||
3018 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 3018; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
3019 | ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3019,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3020 | ierr = DMGetCoordinateDim(dm, &dimEmbed);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3020,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3021 | if (dimEmbed < dim) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Embedding dimension %d cannot be less than intrinsic dimension %d",dimEmbed,dim)return PetscError(((MPI_Comm)0x44000001),3021,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,77,PETSC_ERROR_INITIAL,"Embedding dimension %d cannot be less than intrinsic dimension %d" ,dimEmbed,dim); | |||
3022 | for (d = 0; d <= depth; ++d) pEnd += numPoints[d]; | |||
3023 | ierr = DMPlexSetChart(dm, pStart, pEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3023,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3024 | for (p = pStart; p < pEnd; ++p) { | |||
3025 | ierr = DMPlexSetConeSize(dm, p, coneSize[p-pStart]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3025,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3026 | if (firstVertex < 0 && !coneSize[p - pStart]) { | |||
3027 | firstVertex = p - pStart; | |||
3028 | } | |||
3029 | } | |||
3030 | if (firstVertex < 0 && numPoints[0]) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Expected %d vertices but could not find any", numPoints[0])return PetscError(((MPI_Comm)0x44000001),3030,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Expected %d vertices but could not find any" ,numPoints[0]); | |||
3031 | ierr = DMSetUp(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3031,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* Allocate space for cones */ | |||
3032 | for (p = pStart, off = 0; p < pEnd; off += coneSize[p-pStart], ++p) { | |||
3033 | ierr = DMPlexSetCone(dm, p, &cones[off]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3033,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3034 | ierr = DMPlexSetConeOrientation(dm, p, &coneOrientations[off]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3034,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3035 | } | |||
3036 | ierr = DMPlexSymmetrize(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3036,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3037 | ierr = DMPlexStratify(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3037,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3038 | /* Build coordinates */ | |||
3039 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3039,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3040 | ierr = PetscSectionSetNumFields(coordSection, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3040,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3041 | ierr = PetscSectionSetFieldComponents(coordSection, 0, dimEmbed);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3041,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3042 | ierr = PetscSectionSetChart(coordSection, firstVertex, firstVertex+numPoints[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3042,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3043 | for (v = firstVertex; v < firstVertex+numPoints[0]; ++v) { | |||
3044 | ierr = PetscSectionSetDof(coordSection, v, dimEmbed);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3044,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3045 | ierr = PetscSectionSetFieldDof(coordSection, v, 0, dimEmbed);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3045,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3046 | } | |||
3047 | ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3047,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3048 | ierr = PetscSectionGetStorageSize(coordSection, &coordSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3048,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3049 | ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001), &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3049,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3050 | ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3050,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3051 | ierr = VecSetSizes(coordinates, coordSize, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3051,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3052 | ierr = VecSetBlockSize(coordinates, dimEmbed);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3052,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3053 | ierr = VecSetType(coordinates,VECSTANDARD"standard");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3053,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3054 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3054,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3055 | for (v = 0; v < numPoints[0]; ++v) { | |||
3056 | PetscInt off; | |||
3057 | ||||
3058 | ierr = PetscSectionGetOffset(coordSection, v+firstVertex, &off);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3058,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3059 | for (d = 0; d < dimEmbed; ++d) { | |||
3060 | coords[off+d] = vertexCoords[v*dimEmbed+d]; | |||
3061 | } | |||
3062 | } | |||
3063 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3063,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3064 | ierr = DMSetCoordinatesLocal(dm, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3064,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3065 | ierr = VecDestroy(&coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3065,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3066 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
3067 | } | |||
3068 | ||||
3069 | /*@C | |||
3070 | DMPlexCreateCellVertexFromFile - Create a DMPlex mesh from a simple cell-vertex file. | |||
3071 | ||||
3072 | + comm - The MPI communicator | |||
3073 | . filename - Name of the .dat file | |||
3074 | - interpolate - Create faces and edges in the mesh | |||
3075 | ||||
3076 | Output Parameter: | |||
3077 | . dm - The DM object representing the mesh | |||
3078 | ||||
3079 | Note: The format is the simplest possible: | |||
3080 | $ Ne | |||
3081 | $ v0 v1 ... vk | |||
3082 | $ Nv | |||
3083 | $ x y z marker | |||
3084 | ||||
3085 | Level: beginner | |||
3086 | ||||
3087 | .seealso: DMPlexCreateFromFile(), DMPlexCreateMedFromFile(), DMPlexCreateGmsh(), DMPlexCreate() | |||
3088 | @*/ | |||
3089 | PetscErrorCode DMPlexCreateCellVertexFromFile(MPI_Comm comm, const char filename[], PetscBool interpolate, DM *dm) | |||
3090 | { | |||
3091 | DMLabel marker; | |||
3092 | PetscViewer viewer; | |||
3093 | Vec coordinates; | |||
3094 | PetscSection coordSection; | |||
3095 | PetscScalar *coords; | |||
3096 | char line[PETSC_MAX_PATH_LEN4096]; | |||
3097 | PetscInt dim = 3, cdim = 3, coordSize, v, c, d; | |||
3098 | PetscMPIInt rank; | |||
3099 | int snum, Nv, Nc; | |||
3100 | PetscErrorCode ierr; | |||
3101 | ||||
3102 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 3102; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
3103 | ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3103,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3104 | ierr = PetscViewerCreate(comm, &viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3104,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3105 | ierr = PetscViewerSetType(viewer, PETSCVIEWERASCII"ascii");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3105,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3106 | ierr = PetscViewerFileSetMode(viewer, FILE_MODE_READ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3106,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3107 | ierr = PetscViewerFileSetName(viewer, filename);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3107,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3108 | if (!rank) { | |||
3109 | ierr = PetscViewerRead(viewer, line, 2, NULL((void*)0), PETSC_STRING);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3109,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3110 | snum = sscanf(line, "%d %d", &Nc, &Nv); | |||
3111 | if (snum != 2) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unable to parse cell-vertex file: %s", line)return PetscError(((MPI_Comm)0x44000001),3111,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Unable to parse cell-vertex file: %s" ,line); | |||
3112 | } else { | |||
3113 | Nc = Nv = 0; | |||
3114 | } | |||
3115 | ierr = DMCreate(comm, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3115,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3116 | ierr = DMSetType(*dm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3116,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3117 | ierr = DMPlexSetChart(*dm, 0, Nc+Nv);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3117,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3118 | ierr = DMSetDimension(*dm, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3118,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3119 | ierr = DMSetCoordinateDim(*dm, cdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3119,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3120 | /* Read topology */ | |||
3121 | if (!rank) { | |||
3122 | PetscInt cone[8], corners = 8; | |||
3123 | int vbuf[8], v; | |||
3124 | ||||
3125 | for (c = 0; c < Nc; ++c) {ierr = DMPlexSetConeSize(*dm, c, corners);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3125,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
3126 | ierr = DMSetUp(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3126,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3127 | for (c = 0; c < Nc; ++c) { | |||
3128 | ierr = PetscViewerRead(viewer, line, corners, NULL((void*)0), PETSC_STRING);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3128,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3129 | snum = sscanf(line, "%d %d %d %d %d %d %d %d", &vbuf[0], &vbuf[1], &vbuf[2], &vbuf[3], &vbuf[4], &vbuf[5], &vbuf[6], &vbuf[7]); | |||
3130 | if (snum != corners) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unable to parse cell-vertex file: %s", line)return PetscError(((MPI_Comm)0x44000001),3130,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Unable to parse cell-vertex file: %s" ,line); | |||
3131 | for (v = 0; v < corners; ++v) cone[v] = vbuf[v] + Nc; | |||
3132 | /* Hexahedra are inverted */ | |||
3133 | { | |||
3134 | PetscInt tmp = cone[1]; | |||
3135 | cone[1] = cone[3]; | |||
3136 | cone[3] = tmp; | |||
3137 | } | |||
3138 | ierr = DMPlexSetCone(*dm, c, cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3138,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3139 | } | |||
3140 | } | |||
3141 | ierr = DMPlexSymmetrize(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3141,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3142 | ierr = DMPlexStratify(*dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3142,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3143 | /* Read coordinates */ | |||
3144 | ierr = DMGetCoordinateSection(*dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3144,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3145 | ierr = PetscSectionSetNumFields(coordSection, 1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3145,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3146 | ierr = PetscSectionSetFieldComponents(coordSection, 0, cdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3146,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3147 | ierr = PetscSectionSetChart(coordSection, Nc, Nc + Nv);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3147,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3148 | for (v = Nc; v < Nc+Nv; ++v) { | |||
3149 | ierr = PetscSectionSetDof(coordSection, v, cdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3149,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3150 | ierr = PetscSectionSetFieldDof(coordSection, v, 0, cdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3150,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3151 | } | |||
3152 | ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3152,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3153 | ierr = PetscSectionGetStorageSize(coordSection, &coordSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3153,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3154 | ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001), &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3154,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3155 | ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3155,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3156 | ierr = VecSetSizes(coordinates, coordSize, PETSC_DETERMINE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3156,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3157 | ierr = VecSetBlockSize(coordinates, cdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3157,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3158 | ierr = VecSetType(coordinates, VECSTANDARD"standard");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3158,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3159 | ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3159,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3160 | if (!rank) { | |||
3161 | double x[3]; | |||
3162 | int val; | |||
3163 | ||||
3164 | ierr = DMCreateLabel(*dm, "marker");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3164,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3165 | ierr = DMGetLabel(*dm, "marker", &marker);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3165,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3166 | for (v = 0; v < Nv; ++v) { | |||
3167 | ierr = PetscViewerRead(viewer, line, 4, NULL((void*)0), PETSC_STRING);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3167,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3168 | snum = sscanf(line, "%lg %lg %lg %d", &x[0], &x[1], &x[2], &val); | |||
3169 | if (snum != 4) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unable to parse cell-vertex file: %s", line)return PetscError(((MPI_Comm)0x44000001),3169,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Unable to parse cell-vertex file: %s" ,line); | |||
3170 | for (d = 0; d < cdim; ++d) coords[v*cdim+d] = x[d]; | |||
3171 | if (val) {ierr = DMLabelSetValue(marker, v+Nc, val);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3171,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
3172 | } | |||
3173 | } | |||
3174 | ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3174,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3175 | ierr = DMSetCoordinatesLocal(*dm, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3175,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3176 | ierr = VecDestroy(&coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3176,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3177 | ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3177,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3178 | if (interpolate) { | |||
3179 | DM idm; | |||
3180 | DMLabel bdlabel; | |||
3181 | ||||
3182 | ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3182,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3183 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3183,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3184 | *dm = idm; | |||
3185 | ||||
3186 | ierr = DMGetLabel(*dm, "marker", &bdlabel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3186,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3187 | ierr = DMPlexMarkBoundaryFaces(*dm, PETSC_DETERMINE-1, bdlabel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3187,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3188 | ierr = DMPlexLabelComplete(*dm, bdlabel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3188,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3189 | } | |||
3190 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
3191 | } | |||
3192 | ||||
3193 | /*@C | |||
3194 | DMPlexCreateFromFile - This takes a filename and produces a DM | |||
3195 | ||||
3196 | Input Parameters: | |||
3197 | + comm - The communicator | |||
3198 | . filename - A file name | |||
3199 | - interpolate - Flag to create intermediate mesh pieces (edges, faces) | |||
3200 | ||||
3201 | Output Parameter: | |||
3202 | . dm - The DM | |||
3203 | ||||
3204 | Options Database Keys: | |||
3205 | . -dm_plex_create_from_hdf5_xdmf - use the PETSC_VIEWER_HDF5_XDMF format for reading HDF5 | |||
3206 | ||||
3207 | Level: beginner | |||
3208 | ||||
3209 | .seealso: DMPlexCreateFromDAG(), DMPlexCreateFromCellList(), DMPlexCreate() | |||
3210 | @*/ | |||
3211 | PetscErrorCode DMPlexCreateFromFile(MPI_Comm comm, const char filename[], PetscBool interpolate, DM *dm) | |||
3212 | { | |||
3213 | const char *extGmsh = ".msh"; | |||
3214 | const char *extGmsh2 = ".msh2"; | |||
3215 | const char *extGmsh4 = ".msh4"; | |||
3216 | const char *extCGNS = ".cgns"; | |||
3217 | const char *extExodus = ".exo"; | |||
3218 | const char *extGenesis = ".gen"; | |||
3219 | const char *extFluent = ".cas"; | |||
3220 | const char *extHDF5 = ".h5"; | |||
3221 | const char *extMed = ".med"; | |||
3222 | const char *extPLY = ".ply"; | |||
3223 | const char *extCV = ".dat"; | |||
3224 | size_t len; | |||
3225 | PetscBool isGmsh, isGmsh2, isGmsh4, isCGNS, isExodus, isGenesis, isFluent, isHDF5, isMed, isPLY, isCV; | |||
3226 | PetscMPIInt rank; | |||
3227 | PetscErrorCode ierr; | |||
3228 | ||||
3229 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 3229; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
3230 | PetscValidPointer(filename, 2)do { if (!filename) return PetscError(((MPI_Comm)0x44000001), 3230,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(filename,PETSC_CHAR)) return PetscError( ((MPI_Comm)0x44000001),3230,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",2); } while (0); | |||
3231 | PetscValidPointer(dm, 4)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),3231,__func__ ,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c",85 ,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",4); if (! PetscCheckPointer(dm,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),3231,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",4); } while (0); | |||
3232 | ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3232,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3233 | ierr = PetscStrlen(filename, &len);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3233,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3234 | if (!len) SETERRQ(comm, PETSC_ERR_ARG_WRONG, "Filename must be a valid path")return PetscError(comm,3234,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Filename must be a valid path"); | |||
3235 | ierr = PetscStrncmp(&filename[PetscMax(0,len-4)(((0)<(len-4)) ? (len-4) : (0))], extGmsh, 4, &isGmsh);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3235,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3236 | ierr = PetscStrncmp(&filename[PetscMax(0,len-5)(((0)<(len-5)) ? (len-5) : (0))], extGmsh2, 5, &isGmsh2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3236,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3237 | ierr = PetscStrncmp(&filename[PetscMax(0,len-5)(((0)<(len-5)) ? (len-5) : (0))], extGmsh4, 5, &isGmsh4);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3237,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3238 | ierr = PetscStrncmp(&filename[PetscMax(0,len-5)(((0)<(len-5)) ? (len-5) : (0))], extCGNS, 5, &isCGNS);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3238,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3239 | ierr = PetscStrncmp(&filename[PetscMax(0,len-4)(((0)<(len-4)) ? (len-4) : (0))], extExodus, 4, &isExodus);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3239,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3240 | ierr = PetscStrncmp(&filename[PetscMax(0,len-4)(((0)<(len-4)) ? (len-4) : (0))], extGenesis, 4, &isGenesis);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3240,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3241 | ierr = PetscStrncmp(&filename[PetscMax(0,len-4)(((0)<(len-4)) ? (len-4) : (0))], extFluent, 4, &isFluent);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3241,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3242 | ierr = PetscStrncmp(&filename[PetscMax(0,len-3)(((0)<(len-3)) ? (len-3) : (0))], extHDF5, 3, &isHDF5);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3242,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3243 | ierr = PetscStrncmp(&filename[PetscMax(0,len-4)(((0)<(len-4)) ? (len-4) : (0))], extMed, 4, &isMed);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3243,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3244 | ierr = PetscStrncmp(&filename[PetscMax(0,len-4)(((0)<(len-4)) ? (len-4) : (0))], extPLY, 4, &isPLY);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3244,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3245 | ierr = PetscStrncmp(&filename[PetscMax(0,len-4)(((0)<(len-4)) ? (len-4) : (0))], extCV, 4, &isCV);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3245,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3246 | if (isGmsh || isGmsh2 || isGmsh4) { | |||
3247 | ierr = DMPlexCreateGmshFromFile(comm, filename, interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3247,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3248 | } else if (isCGNS) { | |||
3249 | ierr = DMPlexCreateCGNSFromFile(comm, filename, interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3249,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3250 | } else if (isExodus || isGenesis) { | |||
3251 | ierr = DMPlexCreateExodusFromFile(comm, filename, interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3251,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3252 | } else if (isFluent) { | |||
3253 | ierr = DMPlexCreateFluentFromFile(comm, filename, interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3253,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3254 | } else if (isHDF5) { | |||
3255 | PetscBool load_hdf5_xdmf = PETSC_FALSE; | |||
3256 | PetscViewer viewer; | |||
3257 | ||||
3258 | /* PETSC_VIEWER_HDF5_XDMF is used if the filename ends with .xdmf.h5, or if -dm_plex_create_from_hdf5_xdmf option is present */ | |||
3259 | ierr = PetscStrncmp(&filename[PetscMax(0,len-8)(((0)<(len-8)) ? (len-8) : (0))], ".xdmf", 5, &load_hdf5_xdmf);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3259,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3260 | ierr = PetscOptionsGetBool(NULL((void*)0), NULL((void*)0), "-dm_plex_create_from_hdf5_xdmf", &load_hdf5_xdmf, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3260,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3261 | ierr = PetscViewerCreate(comm, &viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3261,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3262 | ierr = PetscViewerSetType(viewer, PETSCVIEWERHDF5"hdf5");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3262,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3263 | ierr = PetscViewerFileSetMode(viewer, FILE_MODE_READ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3263,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3264 | ierr = PetscViewerFileSetName(viewer, filename);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3264,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3265 | ierr = DMCreate(comm, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3265,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3266 | ierr = DMSetType(*dm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3266,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3267 | if (load_hdf5_xdmf) {ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_XDMF);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3267,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
3268 | ierr = DMLoad(*dm, viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3268,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3269 | if (load_hdf5_xdmf) {ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3269,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
3270 | ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3270,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3271 | ||||
3272 | if (interpolate) { | |||
3273 | DM idm; | |||
3274 | ||||
3275 | ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3275,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3276 | ierr = DMDestroy(dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3276,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3277 | *dm = idm; | |||
3278 | } | |||
3279 | } else if (isMed) { | |||
3280 | ierr = DMPlexCreateMedFromFile(comm, filename, interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3280,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3281 | } else if (isPLY) { | |||
3282 | ierr = DMPlexCreatePLYFromFile(comm, filename, interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3282,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3283 | } else if (isCV) { | |||
3284 | ierr = DMPlexCreateCellVertexFromFile(comm, filename, interpolate, dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3284,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3285 | } else SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot load file %s: unrecognized extension", filename)return PetscError(((MPI_Comm)0x44000001),3285,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Cannot load file %s: unrecognized extension" ,filename); | |||
3286 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
3287 | } | |||
3288 | ||||
3289 | /*@ | |||
3290 | DMPlexCreateReferenceCell - Create a DMPLEX with the appropriate FEM reference cell | |||
3291 | ||||
3292 | Collective | |||
3293 | ||||
3294 | Input Parameters: | |||
3295 | + comm - The communicator | |||
3296 | . dim - The spatial dimension | |||
3297 | - simplex - Flag for simplex, otherwise use a tensor-product cell | |||
3298 | ||||
3299 | Output Parameter: | |||
3300 | . refdm - The reference cell | |||
3301 | ||||
3302 | Level: intermediate | |||
3303 | ||||
3304 | .seealso: | |||
3305 | @*/ | |||
3306 | PetscErrorCode DMPlexCreateReferenceCell(MPI_Comm comm, PetscInt dim, PetscBool simplex, DM *refdm) | |||
3307 | { | |||
3308 | DM rdm; | |||
3309 | Vec coords; | |||
3310 | PetscErrorCode ierr; | |||
3311 | ||||
3312 | PetscFunctionBeginUserdo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ; petscstack->line[petscstack->currentsize] = 3312; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
3313 | ierr = DMCreate(comm, &rdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3313,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3314 | ierr = DMSetType(rdm, DMPLEX"plex");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3314,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3315 | ierr = DMSetDimension(rdm, dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3315,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3316 | switch (dim) { | |||
3317 | case 0: | |||
3318 | { | |||
3319 | PetscInt numPoints[1] = {1}; | |||
3320 | PetscInt coneSize[1] = {0}; | |||
3321 | PetscInt cones[1] = {0}; | |||
3322 | PetscInt coneOrientations[1] = {0}; | |||
3323 | PetscScalar vertexCoords[1] = {0.0}; | |||
3324 | ||||
3325 | ierr = DMPlexCreateFromDAG(rdm, 0, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3325,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3326 | } | |||
3327 | break; | |||
3328 | case 1: | |||
3329 | { | |||
3330 | PetscInt numPoints[2] = {2, 1}; | |||
3331 | PetscInt coneSize[3] = {2, 0, 0}; | |||
3332 | PetscInt cones[2] = {1, 2}; | |||
3333 | PetscInt coneOrientations[2] = {0, 0}; | |||
3334 | PetscScalar vertexCoords[2] = {-1.0, 1.0}; | |||
3335 | ||||
3336 | ierr = DMPlexCreateFromDAG(rdm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3336,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3337 | } | |||
3338 | break; | |||
3339 | case 2: | |||
3340 | if (simplex) { | |||
3341 | PetscInt numPoints[2] = {3, 1}; | |||
3342 | PetscInt coneSize[4] = {3, 0, 0, 0}; | |||
3343 | PetscInt cones[3] = {1, 2, 3}; | |||
3344 | PetscInt coneOrientations[3] = {0, 0, 0}; | |||
3345 | PetscScalar vertexCoords[6] = {-1.0, -1.0, 1.0, -1.0, -1.0, 1.0}; | |||
3346 | ||||
3347 | ierr = DMPlexCreateFromDAG(rdm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3347,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3348 | } else { | |||
3349 | PetscInt numPoints[2] = {4, 1}; | |||
3350 | PetscInt coneSize[5] = {4, 0, 0, 0, 0}; | |||
3351 | PetscInt cones[4] = {1, 2, 3, 4}; | |||
3352 | PetscInt coneOrientations[4] = {0, 0, 0, 0}; | |||
3353 | PetscScalar vertexCoords[8] = {-1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0}; | |||
3354 | ||||
3355 | ierr = DMPlexCreateFromDAG(rdm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3355,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3356 | } | |||
3357 | break; | |||
3358 | case 3: | |||
3359 | if (simplex) { | |||
3360 | PetscInt numPoints[2] = {4, 1}; | |||
3361 | PetscInt coneSize[5] = {4, 0, 0, 0, 0}; | |||
3362 | PetscInt cones[4] = {1, 3, 2, 4}; | |||
3363 | PetscInt coneOrientations[4] = {0, 0, 0, 0}; | |||
3364 | PetscScalar vertexCoords[12] = {-1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0}; | |||
3365 | ||||
3366 | ierr = DMPlexCreateFromDAG(rdm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3366,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3367 | } else { | |||
3368 | PetscInt numPoints[2] = {8, 1}; | |||
3369 | PetscInt coneSize[9] = {8, 0, 0, 0, 0, 0, 0, 0, 0}; | |||
3370 | PetscInt cones[8] = {1, 4, 3, 2, 5, 6, 7, 8}; | |||
3371 | PetscInt coneOrientations[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | |||
3372 | PetscScalar vertexCoords[24] = {-1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, | |||
3373 | -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0}; | |||
3374 | ||||
3375 | ierr = DMPlexCreateFromDAG(rdm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3375,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3376 | } | |||
3377 | break; | |||
3378 | default: | |||
3379 | SETERRQ1(comm, PETSC_ERR_ARG_WRONG, "Cannot create reference cell for dimension %d", dim)return PetscError(comm,3379,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,62,PETSC_ERROR_INITIAL,"Cannot create reference cell for dimension %d" ,dim); | |||
3380 | } | |||
3381 | ierr = DMPlexInterpolate(rdm, refdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3381,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3382 | if (rdm->coordinateDM) { | |||
3383 | DM ncdm; | |||
3384 | PetscSection cs; | |||
3385 | PetscInt pEnd = -1; | |||
3386 | ||||
3387 | ierr = DMGetSection(rdm->coordinateDM, &cs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3387,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3388 | if (cs) {ierr = PetscSectionGetChart(cs, NULL((void*)0), &pEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3388,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
3389 | if (pEnd >= 0) { | |||
3390 | ierr = DMClone(*refdm, &ncdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3390,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3391 | ierr = DMCopyDisc(rdm->coordinateDM, ncdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3391,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3392 | ierr = DMSetSection(ncdm, cs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3392,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3393 | ierr = DMSetCoordinateDM(*refdm, ncdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3393,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3394 | ierr = DMDestroy(&ncdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3394,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3395 | } | |||
3396 | } | |||
3397 | ierr = DMGetCoordinatesLocal(rdm, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3397,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3398 | if (coords) { | |||
3399 | ierr = DMSetCoordinatesLocal(*refdm, coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3399,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3400 | } else { | |||
3401 | ierr = DMGetCoordinates(rdm, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3401,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3402 | if (coords) {ierr = DMSetCoordinates(*refdm, coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3402,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
3403 | } | |||
3404 | ierr = DMDestroy(&rdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3404,__func__,"/sandbox/petsc/petsc.next/src/dm/impls/plex/plexcreate.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3405 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
3406 | } |
1 | #if !defined(PETSC_HASHSETI_H) |
2 | #define PETSC_HASHSETI_H |
3 | |
4 | #include <petsc/private/hashset.h> |
5 | |
6 | PETSC_HASH_SET(HSetI, PetscInt, PetscHashInt, PetscHashEqual)typedef struct kh_HSetI_s { khint_t n_buckets, size, n_occupied , upper_bound; khint32_t *flags; PetscInt *keys; char *vals; } kh_HSetI_t; static inline __attribute((unused)) kh_HSetI_t * kh_init_HSetI(void) { return (kh_HSetI_t*)calloc(1,sizeof(kh_HSetI_t )); } static inline __attribute((unused)) void kh_destroy_HSetI (kh_HSetI_t *h) { if (h) { free((void *)h->keys); free(h-> flags); free((void *)h->vals); free(h); } } static inline __attribute ((unused)) void kh_clear_HSetI(kh_HSetI_t *h) { if (h && h->flags) { memset(h->flags, 0xaa, ((h->n_buckets) < 16? 1 : (h->n_buckets)>>4) * sizeof(khint32_t)); h-> size = h->n_occupied = 0; } } static inline __attribute((unused )) khint_t kh_get_HSetI(const kh_HSetI_t *h, PetscInt key) { if (h->n_buckets) { khint_t k, i, last, mask, step = 0; mask = h->n_buckets - 1; k = PetscHashInt(key); i = k & mask ; last = i; while (!((h->flags[i>>4]>>((i& 0xfU)<<1))&2) && (((h->flags[i>>4] >>((i&0xfU)<<1))&1) || !((h->keys[i]) == (key)))) { i = (i + (++step)) & mask; if (i == last) return h->n_buckets; } return ((h->flags[i>>4]>>( (i&0xfU)<<1))&3)? h->n_buckets : i; } else return 0; } static inline __attribute((unused)) int kh_resize_HSetI (kh_HSetI_t *h, khint_t new_n_buckets) { khint32_t *new_flags = 0; khint_t j = 1; { (--(new_n_buckets), (new_n_buckets)|=( new_n_buckets)>>1, (new_n_buckets)|=(new_n_buckets)>> 2, (new_n_buckets)|=(new_n_buckets)>>4, (new_n_buckets) |=(new_n_buckets)>>8, (new_n_buckets)|=(new_n_buckets)>> 16, ++(new_n_buckets)); if (new_n_buckets < 4) new_n_buckets = 4; if (h->size >= (khint_t)(new_n_buckets * __ac_HASH_UPPER + 0.5)) j = 0; else { new_flags = (khint32_t*)malloc(((new_n_buckets ) < 16? 1 : (new_n_buckets)>>4) * sizeof(khint32_t)) ; if (!new_flags) return -1; memset(new_flags, 0xaa, ((new_n_buckets ) < 16? 1 : (new_n_buckets)>>4) * sizeof(khint32_t)) ; if (h->n_buckets < new_n_buckets) { PetscInt *new_keys = (PetscInt*)realloc((void *)h->keys,new_n_buckets * sizeof (PetscInt)); if (!new_keys) { free(new_flags); return -1; } h ->keys = new_keys; if (0) { char *new_vals = (char*)realloc ((void *)h->vals,new_n_buckets * sizeof(char)); if (!new_vals ) { free(new_flags); return -1; } h->vals = new_vals; } } } } if (j) { for (j = 0; j != h->n_buckets; ++j) { if (((h-> flags[j>>4]>>((j&0xfU)<<1))&3) == 0 ) { PetscInt key = h->keys[j]; char val; khint_t new_mask; new_mask = new_n_buckets - 1; if (0) val = h->vals[j]; (h ->flags[j>>4]|=1ul<<((j&0xfU)<<1)); while (1) { khint_t k, i, step = 0; k = PetscHashInt(key); i = k & new_mask; while (!((new_flags[i>>4]>>((i&0xfU )<<1))&2)) i = (i + (++step)) & new_mask; (new_flags [i>>4]&=~(2ul<<((i&0xfU)<<1))); if ( i < h->n_buckets && ((h->flags[i>>4]>> ((i&0xfU)<<1))&3) == 0) { { PetscInt tmp = h-> keys[i]; h->keys[i] = key; key = tmp; } if (0) { char tmp = h->vals[i]; h->vals[i] = val; val = tmp; } (h->flags [i>>4]|=1ul<<((i&0xfU)<<1)); } else { h ->keys[i] = key; if (0) h->vals[i] = val; break; } } } } if (h->n_buckets > new_n_buckets) { h->keys = (PetscInt *)realloc((void *)h->keys,new_n_buckets * sizeof(PetscInt) ); if (0) h->vals = (char*)realloc((void *)h->vals,new_n_buckets * sizeof(char)); } free(h->flags); h->flags = new_flags ; h->n_buckets = new_n_buckets; h->n_occupied = h->size ; h->upper_bound = (khint_t)(h->n_buckets * __ac_HASH_UPPER + 0.5); } return 0; } static inline __attribute((unused)) khint_t kh_put_HSetI(kh_HSetI_t *h, PetscInt key, int *ret) { khint_t x; if (h->n_occupied >= h->upper_bound) { if (h-> n_buckets > (h->size<<1)) { if (kh_resize_HSetI(h , h->n_buckets - 1) < 0) { *ret = -1; return h->n_buckets ; } } else if (kh_resize_HSetI(h, h->n_buckets + 1) < 0 ) { *ret = -1; return h->n_buckets; } } { khint_t k, i, site , last, mask = h->n_buckets - 1, step = 0; x = site = h-> n_buckets; k = PetscHashInt(key); i = k & mask; if (((h-> flags[i>>4]>>((i&0xfU)<<1))&2)) x = i; else { last = i; while (!((h->flags[i>>4]>> ((i&0xfU)<<1))&2) && (((h->flags[i>> 4]>>((i&0xfU)<<1))&1) || !((h->keys[i] ) == (key)))) { if (((h->flags[i>>4]>>((i& 0xfU)<<1))&1)) site = i; i = (i + (++step)) & mask ; if (i == last) { x = site; break; } } if (x == h->n_buckets ) { if (((h->flags[i>>4]>>((i&0xfU)<< 1))&2) && site != h->n_buckets) x = site; else x = i; } } } if (((h->flags[x>>4]>>((x&0xfU )<<1))&2)) { h->keys[x] = key; (h->flags[x>> 4]&=~(3ul<<((x&0xfU)<<1))); ++h->size; ++h->n_occupied; *ret = 1; } else if (((h->flags[x>> 4]>>((x&0xfU)<<1))&1)) { h->keys[x] = key ; (h->flags[x>>4]&=~(3ul<<((x&0xfU)<< 1))); ++h->size; *ret = 2; } else *ret = 0; return x; } static inline __attribute((unused)) void kh_del_HSetI(kh_HSetI_t *h , khint_t x) { if (x != h->n_buckets && !((h->flags [x>>4]>>((x&0xfU)<<1))&3)) { (h-> flags[x>>4]|=1ul<<((x&0xfU)<<1)); --h-> size; } } typedef kh_HSetI_t *PetscHSetI; static inline __attribute ((unused)) PetscErrorCode PetscHSetICreate(PetscHSetI *ht) { do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); *ht = kh_init_HSetI(); do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack-> currentsize--; petscstack->function[petscstack->currentsize ] = 0; petscstack->file[petscstack->currentsize] = 0; petscstack ->line[petscstack->currentsize] = 0; petscstack->petscroutine [petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)< (0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return (0);} while (0); } static inline __attribute((unused)) PetscErrorCode PetscHSetIDestroy(PetscHSetI *ht) { do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = __func__; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); if (!*ht) do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize --; petscstack->function[petscstack->currentsize] = 0; petscstack ->file[petscstack->currentsize] = 0; petscstack->line [petscstack->currentsize] = 0; petscstack->petscroutine [petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)< (0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return (0);} while (0); kh_destroy_HSetI(*ht); *ht = ((void*)0); do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function[petscstack ->currentsize] = 0; petscstack->file[petscstack->currentsize ] = 0; petscstack->line[petscstack->currentsize] = 0; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack-> hotdepth-1)<(0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return(0);} while (0); } static inline __attribute ((unused)) PetscErrorCode PetscHSetIReset(PetscHSetI ht) { do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); { if (ht) { free((ht)->keys); free((ht)-> flags); free((ht)->vals); memset((ht), 0x00, sizeof(*(ht)) ); } }; do { do { ; if (petscstack && petscstack-> currentsize > 0) { petscstack->currentsize--; petscstack ->function[petscstack->currentsize] = 0; petscstack-> file[petscstack->currentsize] = 0; petscstack->line[petscstack ->currentsize] = 0; petscstack->petscroutine[petscstack ->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack ->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return(0);} while (0); } static inline __attribute((unused)) PetscErrorCode PetscHSetIDuplicate (PetscHSetI ht,PetscHSetI *hd) { int ret; PetscInt key; do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); do { if (!hd) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(hd,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",2); } while (0); *hd = kh_init_HSetI(); ret = kh_resize_HSetI(*hd , ((ht)->size)); do { if (__builtin_expect(!!(!(ret==0)),0 )) return PetscError(((MPI_Comm)0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","ret==0" ); } while(0); { khint_t __i; for (__i = (khint_t)(0); __i != ((ht)->n_buckets); ++__i) { if (!(!(((ht)->flags[(__i) >>4]>>(((__i)&0xfU)<<1))&3))) continue ; (key) = ((ht)->keys[__i]); { kh_put_HSetI(*hd, key, & ret); do { if (__builtin_expect(!!(!(ret>=0)),0)) return PetscError (((MPI_Comm)0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","ret>=0" ); } while(0);}; } } do { do { ; if (petscstack && petscstack ->currentsize > 0) { petscstack->currentsize--; petscstack ->function[petscstack->currentsize] = 0; petscstack-> file[petscstack->currentsize] = 0; petscstack->line[petscstack ->currentsize] = 0; petscstack->petscroutine[petscstack ->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack ->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return(0);} while (0); } static inline __attribute((unused)) PetscErrorCode PetscHSetIUpdate (PetscHSetI ht,PetscHSetI hta) { int ret; PetscInt key; do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); do { if (!hta) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(hta,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",2); } while (0); { khint_t __i; for (__i = (khint_t)(0); __i != ( (hta)->n_buckets); ++__i) { if (!(!(((hta)->flags[(__i) >>4]>>(((__i)&0xfU)<<1))&3))) continue ; (key) = ((hta)->keys[__i]); { kh_put_HSetI(ht, key, & ret); do { if (__builtin_expect(!!(!(ret>=0)),0)) return PetscError (((MPI_Comm)0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","ret>=0" ); } while(0);}; } } do { do { ; if (petscstack && petscstack ->currentsize > 0) { petscstack->currentsize--; petscstack ->function[petscstack->currentsize] = 0; petscstack-> file[petscstack->currentsize] = 0; petscstack->line[petscstack ->currentsize] = 0; petscstack->petscroutine[petscstack ->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack ->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return(0);} while (0); } static inline __attribute((unused)) PetscErrorCode PetscHSetIClear (PetscHSetI ht) { do { do { ; if (petscstack && (petscstack ->currentsize < 64)) { petscstack->function[petscstack ->currentsize] = __func__; petscstack->file[petscstack-> currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); kh_clear_HSetI(ht); do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize --; petscstack->function[petscstack->currentsize] = 0; petscstack ->file[petscstack->currentsize] = 0; petscstack->line [petscstack->currentsize] = 0; petscstack->petscroutine [petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)< (0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return (0);} while (0); } static inline __attribute((unused)) PetscErrorCode PetscHSetIResize(PetscHSetI ht,PetscInt nb) { int ret; do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); ret = kh_resize_HSetI(ht, (khint_t)nb); do { if (__builtin_expect(!!(!(ret==0)),0)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","ret==0" ); } while(0); do { do { ; if (petscstack && petscstack ->currentsize > 0) { petscstack->currentsize--; petscstack ->function[petscstack->currentsize] = 0; petscstack-> file[petscstack->currentsize] = 0; petscstack->line[petscstack ->currentsize] = 0; petscstack->petscroutine[petscstack ->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack ->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return(0);} while (0); } static inline __attribute((unused)) PetscErrorCode PetscHSetIGetSize (PetscHSetI ht,PetscInt *n) { do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function [petscstack->currentsize] = __func__; petscstack->file[ petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); do { if (!n) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(n,PETSC_INT)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer to PetscInt: Parameter # %d" ,2); } while (0); *n = (PetscInt)((ht)->size); do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function[petscstack ->currentsize] = 0; petscstack->file[petscstack->currentsize ] = 0; petscstack->line[petscstack->currentsize] = 0; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack-> hotdepth-1)<(0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return(0);} while (0); } static inline __attribute ((unused)) PetscErrorCode PetscHSetIGetCapacity(PetscHSetI ht ,PetscInt *n) { do { do { ; if (petscstack && (petscstack ->currentsize < 64)) { petscstack->function[petscstack ->currentsize] = __func__; petscstack->file[petscstack-> currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); do { if (!n) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(n,PETSC_INT)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer to PetscInt: Parameter # %d" ,2); } while (0); *n = (PetscInt)((ht)->n_buckets); do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function[petscstack ->currentsize] = 0; petscstack->file[petscstack->currentsize ] = 0; petscstack->line[petscstack->currentsize] = 0; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack-> hotdepth-1)<(0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return(0);} while (0); } static inline __attribute ((unused)) PetscErrorCode PetscHSetIHas(PetscHSetI ht,PetscInt key,PetscBool *has) { khiter_t iter; do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = __func__; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); do { if (!has) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",3); if (!PetscCheckPointer(has,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",3); } while (0); iter = kh_get_HSetI(ht, key); *has = (iter != ( (ht)->n_buckets)) ? PETSC_TRUE : PETSC_FALSE; do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack ->currentsize--; petscstack->function[petscstack->currentsize ] = 0; petscstack->file[petscstack->currentsize] = 0; petscstack ->line[petscstack->currentsize] = 0; petscstack->petscroutine [petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)< (0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return (0);} while (0); } static inline __attribute((unused)) PetscErrorCode PetscHSetIAdd(PetscHSetI ht,PetscInt key) { int ret; khiter_t iter; do { do { ; if (petscstack && (petscstack-> currentsize < 64)) { petscstack->function[petscstack-> currentsize] = __func__; petscstack->file[petscstack->currentsize ] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); iter = kh_put_HSetI(ht, key, &ret); (void)iter ; do { if (__builtin_expect(!!(!(ret>=0)),0)) return PetscError (((MPI_Comm)0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","ret>=0" ); } while(0); do { do { ; if (petscstack && petscstack ->currentsize > 0) { petscstack->currentsize--; petscstack ->function[petscstack->currentsize] = 0; petscstack-> file[petscstack->currentsize] = 0; petscstack->line[petscstack ->currentsize] = 0; petscstack->petscroutine[petscstack ->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack ->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return(0);} while (0); } static inline __attribute((unused)) PetscErrorCode PetscHSetIDel (PetscHSetI ht,PetscInt key) { khiter_t iter; do { do { ; if ( petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize] = __func__ ; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); iter = kh_get_HSetI(ht, key); kh_del_HSetI(ht, iter ); do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); } static inline __attribute((unused)) PetscErrorCode PetscHSetIQueryAdd (PetscHSetI ht,PetscInt key,PetscBool *missing) { int ret; khiter_t iter; do { do { ; if (petscstack && (petscstack-> currentsize < 64)) { petscstack->function[petscstack-> currentsize] = __func__; petscstack->file[petscstack->currentsize ] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); do { if (!missing) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",3); if (!PetscCheckPointer(missing,PETSC_CHAR)) return PetscError(( (MPI_Comm)0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",3); } while (0); iter = kh_put_HSetI(ht, key, &ret); (void)iter ; do { if (__builtin_expect(!!(!(ret>=0)),0)) return PetscError (((MPI_Comm)0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","ret>=0" ); } while(0); *missing = ret ? PETSC_TRUE : PETSC_FALSE; do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function[petscstack ->currentsize] = 0; petscstack->file[petscstack->currentsize ] = 0; petscstack->line[petscstack->currentsize] = 0; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack-> hotdepth-1)<(0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return(0);} while (0); } static inline __attribute ((unused)) PetscErrorCode PetscHSetIQueryDel(PetscHSetI ht,PetscInt key,PetscBool *present) { khiter_t iter; do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = __func__; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); do { if (!present) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",3); if (!PetscCheckPointer(present,PETSC_CHAR)) return PetscError(( (MPI_Comm)0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",3); } while (0); iter = kh_get_HSetI(ht, key); if (iter != ((ht) ->n_buckets)) { kh_del_HSetI(ht, iter); *present = PETSC_TRUE ; } else { *present = PETSC_FALSE; } do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack-> currentsize--; petscstack->function[petscstack->currentsize ] = 0; petscstack->file[petscstack->currentsize] = 0; petscstack ->line[petscstack->currentsize] = 0; petscstack->petscroutine [petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)< (0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return (0);} while (0); } static inline __attribute((unused)) PetscErrorCode PetscHSetIGetElems(PetscHSetI ht,PetscInt *off,PetscInt array []) { PetscInt key; PetscInt pos; do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function [petscstack->currentsize] = __func__; petscstack->file[ petscstack->currentsize] = "/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ; petscstack->line[petscstack->currentsize] = 6; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); do { if (!ht) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",1); if (!PetscCheckPointer(ht,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",1); } while (0); do { if (!off) return PetscError(((MPI_Comm)0x44000001 ),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(off,PETSC_INT)) return PetscError(((MPI_Comm )0x44000001),6,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashseti.h" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer to PetscInt: Parameter # %d" ,2); } while (0); pos = *off; { khint_t __i; for (__i = (khint_t )(0); __i != ((ht)->n_buckets); ++__i) { if (!(!(((ht)-> flags[(__i)>>4]>>(((__i)&0xfU)<<1))& 3))) continue; (key) = ((ht)->keys[__i]); array[pos++] = key ; } }; *off = pos; do { do { ; if (petscstack && petscstack ->currentsize > 0) { petscstack->currentsize--; petscstack ->function[petscstack->currentsize] = 0; petscstack-> file[petscstack->currentsize] = 0; petscstack->line[petscstack ->currentsize] = 0; petscstack->petscroutine[petscstack ->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack ->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return(0);} while (0); } |
7 | |
8 | #endif /* PETSC_HASHSETI_H */ |
1 | #if !defined(PETSC_HASHTABLE_H) | |||
2 | #define PETSC_HASHTABLE_H | |||
3 | ||||
4 | #include <petsc/private/petscimpl.h> | |||
5 | ||||
6 | #define kh_inlineinline PETSC_INLINEinline | |||
7 | #define klib_unused__attribute((unused)) PETSC_UNUSED__attribute((unused)) | |||
8 | #include <petsc/private/kernels/khash.h> | |||
9 | ||||
10 | /* Required for khash <= 0.2.5 */ | |||
11 | #if !defined(kcalloc) | |||
12 | #define kcalloc(N,Z)calloc(N,Z) calloc(N,Z) | |||
13 | #endif | |||
14 | #if !defined(kmalloc) | |||
15 | #define kmalloc(Z)malloc(Z) malloc(Z) | |||
16 | #endif | |||
17 | #if !defined(krealloc) | |||
18 | #define krealloc(P,Z)realloc(P,Z) realloc(P,Z) | |||
19 | #endif | |||
20 | #if !defined(kfree) | |||
21 | #define kfree(P)free(P) free(P) | |||
22 | #endif | |||
23 | ||||
24 | /* --- Useful extensions to khash --- */ | |||
25 | ||||
26 | #if !defined(kh_reset) | |||
27 | /*! @function | |||
28 | @abstract Reset a hash table to initial state. | |||
29 | @param name Name of the hash table [symbol] | |||
30 | @param h Pointer to the hash table [khash_t(name)*] | |||
31 | */ | |||
32 | #define kh_reset(name, h){ if (h) { free((h)->keys); free((h)->flags); free((h)-> vals); memset((h), 0x00, sizeof(*(h))); } } { \ | |||
33 | if (h) { \ | |||
34 | kfree((h)->keys)free((h)->keys); kfree((h)->flags)free((h)->flags); \ | |||
35 | kfree((h)->vals)free((h)->vals); \ | |||
36 | memset((h), 0x00, sizeof(*(h))); \ | |||
37 | } } | |||
38 | #endif /*kh_reset*/ | |||
39 | ||||
40 | #if !defined(kh_foreach) | |||
41 | /*! @function | |||
42 | @abstract Iterate over the entries in the hash table | |||
43 | @param h Pointer to the hash table [khash_t(name)*] | |||
44 | @param kvar Variable to which key will be assigned | |||
45 | @param vvar Variable to which value will be assigned | |||
46 | @param code Block of code to execute | |||
47 | */ | |||
48 | #define kh_foreach(h, kvar, vvar, code){ khint_t __i; for (__i = (khint_t)(0); __i != ((h)->n_buckets ); ++__i) { if (!(!(((h)->flags[(__i)>>4]>>((( __i)&0xfU)<<1))&3))) continue; (kvar) = ((h)-> keys[__i]); (vvar) = ((h)->vals[__i]); code; } } { khint_t __i; \ | |||
49 | for (__i = kh_begin(h)(khint_t)(0); __i != kh_end(h)((h)->n_buckets); ++__i) { \ | |||
50 | if (!kh_exist(h,__i)(!(((h)->flags[(__i)>>4]>>(((__i)&0xfU)<< 1))&3))) continue; \ | |||
51 | (kvar) = kh_key(h,__i)((h)->keys[__i]); \ | |||
52 | (vvar) = kh_val(h,__i)((h)->vals[__i]); \ | |||
53 | code; \ | |||
54 | } } | |||
55 | #endif /*kh_foreach*/ | |||
56 | ||||
57 | #if !defined(kh_foreach_key) | |||
58 | /*! @function | |||
59 | @abstract Iterate over the keys in the hash table | |||
60 | @param h Pointer to the hash table [khash_t(name)*] | |||
61 | @param kvar Variable to which key will be assigned | |||
62 | @param code Block of code to execute | |||
63 | */ | |||
64 | #define kh_foreach_key(h, kvar, code){ khint_t __i; for (__i = (khint_t)(0); __i != ((h)->n_buckets ); ++__i) { if (!(!(((h)->flags[(__i)>>4]>>((( __i)&0xfU)<<1))&3))) continue; (kvar) = ((h)-> keys[__i]); code; } } { khint_t __i; \ | |||
65 | for (__i = kh_begin(h)(khint_t)(0); __i != kh_end(h)((h)->n_buckets); ++__i) { \ | |||
66 | if (!kh_exist(h,__i)(!(((h)->flags[(__i)>>4]>>(((__i)&0xfU)<< 1))&3))) continue; \ | |||
67 | (kvar) = kh_key(h,__i)((h)->keys[__i]); \ | |||
68 | code; \ | |||
69 | } } | |||
70 | #endif /*kh_foreach_key*/ | |||
71 | ||||
72 | #if !defined(kh_foreach_value) | |||
73 | /*! @function | |||
74 | @abstract Iterate over the values in the hash table | |||
75 | @param h Pointer to the hash table [khash_t(name)*] | |||
76 | @param vvar Variable to which value will be assigned | |||
77 | @param code Block of code to execute | |||
78 | */ | |||
79 | #define kh_foreach_value(h, vvar, code){ khint_t __i; for (__i = (khint_t)(0); __i != ((h)->n_buckets ); ++__i) { if (!(!(((h)->flags[(__i)>>4]>>((( __i)&0xfU)<<1))&3))) continue; (vvar) = ((h)-> vals[__i]); code; } } { khint_t __i; \ | |||
80 | for (__i = kh_begin(h)(khint_t)(0); __i != kh_end(h)((h)->n_buckets); ++__i) { \ | |||
81 | if (!kh_exist(h,__i)(!(((h)->flags[(__i)>>4]>>(((__i)&0xfU)<< 1))&3))) continue; \ | |||
82 | (vvar) = kh_val(h,__i)((h)->vals[__i]); \ | |||
83 | code; \ | |||
84 | } } | |||
85 | #endif /*kh_foreach_value*/ | |||
86 | ||||
87 | ||||
88 | /* --- Helper macro for error checking --- */ | |||
89 | ||||
90 | #if defined(PETSC_USE_DEBUG1) | |||
91 | #define PetscHashAssert(expr)do { if (__builtin_expect(!!(!(expr)),0)) return PetscError(( (MPI_Comm)0x44000001),91,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashtable.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","expr" ); } while(0) do { \ | |||
92 | if (PetscUnlikely(!(expr))__builtin_expect(!!(!(expr)),0)) \ | |||
93 | SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB, \return PetscError(((MPI_Comm)0x44000001),95,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashtable.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","expr" ) | |||
94 | "[khash] Assertion: `%s' failed.", \return PetscError(((MPI_Comm)0x44000001),95,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashtable.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","expr" ) | |||
95 | PetscStringize(expr))return PetscError(((MPI_Comm)0x44000001),95,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashtable.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","expr" ); \ | |||
96 | } while(0) | |||
97 | #else | |||
98 | #define PetscHashAssert(expr)do { if (__builtin_expect(!!(!(expr)),0)) return PetscError(( (MPI_Comm)0x44000001),98,__func__,"/sandbox/petsc/petsc.next/include/petsc/private/hashtable.h" ,76,PETSC_ERROR_INITIAL,"[khash] Assertion: `%s' failed.","expr" ); } while(0) ((void)(expr)) | |||
99 | #endif | |||
100 | ||||
101 | ||||
102 | /* --- Low level iterator API --- */ | |||
103 | ||||
104 | typedef khiter_t PetscHashIter; | |||
105 | ||||
106 | #define PetscHashIterBegin(ht,i)do { (i) = (khint_t)(0); if ((i) != (((ht))->n_buckets) && !(!((((ht))->flags[((i))>>4]>>((((i))&0xfU )<<1))&3))) do { ++((i)); } while (((i)) != ((((ht) ))->n_buckets) && !(!(((((ht)))->flags[(((i)))>> 4]>>(((((i)))&0xfU)<<1))&3))); } while (0 ) do { \ | |||
107 | (i) = kh_begin((ht))(khint_t)(0); \ | |||
108 | if ((i) != kh_end((ht))(((ht))->n_buckets) && !kh_exist((ht),(i))(!((((ht))->flags[((i))>>4]>>((((i))&0xfU) <<1))&3))) \ | |||
109 | PetscHashIterNext((ht),(i))do { ++((i)); } while (((i)) != ((((ht)))->n_buckets) && !(!(((((ht)))->flags[(((i)))>>4]>>(((((i)))& 0xfU)<<1))&3))); \ | |||
110 | } while (0) | |||
111 | ||||
112 | #define PetscHashIterNext(ht,i)do { ++(i); } while ((i) != (((ht))->n_buckets) && !(!((((ht))->flags[((i))>>4]>>((((i))&0xfU )<<1))&3))) \ | |||
113 | do { ++(i); } while ((i) != kh_end((ht))(((ht))->n_buckets) && !kh_exist((ht),(i))(!((((ht))->flags[((i))>>4]>>((((i))&0xfU) <<1))&3))) | |||
114 | ||||
115 | #define PetscHashIterAtEnd(ht,i)((i) == (((ht))->n_buckets)) ((i) == kh_end((ht))(((ht))->n_buckets)) | |||
116 | ||||
117 | #define PetscHashIterGetKey(ht,i,k)((k) = (((ht))->keys[(i)])) ((k) = kh_key((ht),(i))(((ht))->keys[(i)])) | |||
118 | ||||
119 | #define PetscHashIterGetVal(ht,i,v)((v) = (((ht))->vals[(i)])) ((v) = kh_val((ht),(i))(((ht))->vals[(i)])) | |||
120 | ||||
121 | #define PetscHashIterSetVal(ht,i,v)((((ht))->vals[(i)]) = (v)) (kh_val((ht),(i))(((ht))->vals[(i)]) = (v)) | |||
122 | ||||
123 | ||||
124 | /* --- Thomas Wang integer hash functions --- */ | |||
125 | ||||
126 | typedef khint32_t PetscHash32_t; | |||
127 | typedef khint64_t PetscHash64_t; | |||
128 | typedef khint_t PetscHash_t; | |||
129 | ||||
130 | /* Thomas Wang's first version for 32bit integers */ | |||
131 | PETSC_STATIC_INLINEstatic inline PetscHash_t PetscHash_UInt32_v0(PetscHash32_t key) | |||
132 | { | |||
133 | key += ~(key << 15); | |||
134 | key ^= (key >> 10); | |||
135 | key += (key << 3); | |||
136 | key ^= (key >> 6); | |||
137 | key += ~(key << 11); | |||
138 | key ^= (key >> 16); | |||
139 | return key; | |||
140 | } | |||
141 | ||||
142 | /* Thomas Wang's second version for 32bit integers */ | |||
143 | PETSC_STATIC_INLINEstatic inline PetscHash_t PetscHash_UInt32_v1(PetscHash32_t key) | |||
144 | { | |||
145 | key = ~key + (key << 15); /* key = (key << 15) - key - 1; */ | |||
146 | key = key ^ (key >> 12); | |||
147 | key = key + (key << 2); | |||
148 | key = key ^ (key >> 4); | |||
149 | key = key * 2057; /* key = (key + (key << 3)) + (key << 11); */ | |||
150 | key = key ^ (key >> 16); | |||
151 | return key; | |||
152 | } | |||
153 | ||||
154 | PETSC_STATIC_INLINEstatic inline PetscHash_t PetscHash_UInt32(PetscHash32_t key) | |||
155 | { | |||
156 | return PetscHash_UInt32_v1(key); | |||
157 | } | |||
158 | ||||
159 | /* Thomas Wang's version for 64bit integer -> 32bit hash */ | |||
160 | PETSC_STATIC_INLINEstatic inline PetscHash32_t PetscHash_UInt64_32(PetscHash64_t key) | |||
161 | { | |||
162 | key = ~key + (key << 18); /* key = (key << 18) - key - 1; */ | |||
163 | key = key ^ (key >> 31); | |||
164 | key = key * 21; /* key = (key + (key << 2)) + (key << 4); */ | |||
165 | key = key ^ (key >> 11); | |||
166 | key = key + (key << 6); | |||
167 | key = key ^ (key >> 22); | |||
168 | return (PetscHash32_t)key; | |||
169 | } | |||
170 | ||||
171 | /* Thomas Wang's version for 64bit integer -> 64bit hash */ | |||
172 | PETSC_STATIC_INLINEstatic inline PetscHash64_t PetscHash_UInt64_64(PetscHash64_t key) | |||
173 | { | |||
174 | key = ~key + (key << 21); /* key = (key << 21) - key - 1; */ | |||
175 | key = key ^ (key >> 24); | |||
176 | key = key * 265; /* key = (key + (key << 3)) + (key << 8); */ | |||
177 | key = key ^ (key >> 14); | |||
178 | key = key * 21; /* key = (key + (key << 2)) + (key << 4); */ | |||
179 | key = key ^ (key >> 28); | |||
180 | key = key + (key << 31); | |||
181 | return key; | |||
182 | } | |||
183 | ||||
184 | PETSC_STATIC_INLINEstatic inline PetscHash_t PetscHash_UInt64(PetscHash64_t key) | |||
185 | { | |||
186 | return sizeof(PetscHash_t) < sizeof(PetscHash64_t) | |||
187 | ? (PetscHash_t)PetscHash_UInt64_32(key) | |||
188 | : (PetscHash_t)PetscHash_UInt64_64(key); | |||
189 | } | |||
190 | ||||
191 | PETSC_STATIC_INLINEstatic inline PetscHash_t PetscHashInt(PetscInt key) | |||
192 | { | |||
193 | #if defined(PETSC_USE_64BIT_INDICES) | |||
194 | return PetscHash_UInt64((PetscHash64_t)key); | |||
195 | #else | |||
196 | return PetscHash_UInt32((PetscHash32_t)key); | |||
| ||||
197 | #endif | |||
198 | } | |||
199 | ||||
200 | PETSC_STATIC_INLINEstatic inline PetscHash_t PetscHashCombine(PetscHash_t seed, PetscHash_t hash) | |||
201 | { | |||
202 | /* https://doi.org/10.1002/asi.10170 */ | |||
203 | /* https://dl.acm.org/citation.cfm?id=759509 */ | |||
204 | return seed ^ (hash + (seed << 6) + (seed >> 2)); | |||
205 | } | |||
206 | ||||
207 | #define PetscHashEqual(a,b)((a) == (b)) ((a) == (b)) | |||
208 | ||||
209 | ||||
210 | #endif /* PETSC_HASHTABLE_H */ |