File: | dm/impls/plex/plexgeometry.c |
Warning: | line 787, column 13 Value stored to 'distMax' is never read |
[?] Use j/k keys for keyboard navigation
1 | #include <petsc/private/dmpleximpl.h> /*I "petscdmplex.h" I*/ |
2 | #include <petsc/private/petscfeimpl.h> /*I "petscfe.h" I*/ |
3 | #include <petscblaslapack.h> |
4 | #include <petsctime.h> |
5 | |
6 | /*@ |
7 | DMPlexFindVertices - Try to find DAG points based on their coordinates. |
8 | |
9 | Not Collective (provided DMGetCoordinatesLocalSetUp() has been called already) |
10 | |
11 | Input Parameters: |
12 | + dm - The DMPlex object |
13 | . npoints - The number of sought points |
14 | . coords - The array of coordinates of the sought points |
15 | - eps - The tolerance or PETSC_DEFAULT |
16 | |
17 | Output Parameters: |
18 | . dagPoints - The array of found DAG points, or -1 if not found |
19 | |
20 | Level: intermediate |
21 | |
22 | Notes: |
23 | The length of the array coords must be npoints * dim where dim is the spatial dimension returned by DMGetDimension(). |
24 | |
25 | The output array dagPoints is NOT newly allocated; the user must pass an array of length npoints. |
26 | |
27 | Each rank does the search independently; a nonnegative value is returned only if this rank's local DMPlex portion contains the point. |
28 | |
29 | The tolerance is interpreted as the maximum Euclidean (L2) distance of the sought point from the specified coordinates. |
30 | |
31 | .seealso: DMPlexCreate(), DMGetCoordinates() |
32 | @*/ |
33 | PetscErrorCode DMPlexFindVertices(DM dm, PetscInt npoints, const PetscReal coord[], PetscReal eps, PetscInt dagPoints[]) |
34 | { |
35 | PetscInt c, dim, i, j, ndof, o, p, vStart, vEnd; |
36 | PetscSection cs; |
37 | Vec allCoordsVec; |
38 | const PetscScalar *allCoords; |
39 | PetscReal norm; |
40 | PetscErrorCode ierr; |
41 | |
42 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 42; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
43 | if (eps < 0) eps = PETSC_SQRT_MACHINE_EPSILON1.490116119384766e-08; |
44 | ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),44,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
45 | ierr = DMGetCoordinateSection(dm, &cs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),45,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
46 | ierr = DMGetCoordinatesLocal(dm, &allCoordsVec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),46,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
47 | ierr = VecGetArrayRead(allCoordsVec, &allCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),47,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
48 | ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),48,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
49 | for (i=0,j=0; i < npoints; i++,j+=dim) { |
50 | dagPoints[i] = -1; |
51 | for (p = vStart; p < vEnd; p++) { |
52 | ierr = PetscSectionGetOffset(cs, p, &o);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),52,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
53 | ierr = PetscSectionGetDof(cs, p, &ndof);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),53,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
54 | if (PetscUnlikely(ndof != dim)__builtin_expect(!!(ndof != dim),0)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_PLIB, "point %D: ndof = %D != %D = dim", p, ndof, dim)return PetscError(((MPI_Comm)0x44000001),54,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,77,PETSC_ERROR_INITIAL,"point %D: ndof = %D != %D = dim",p,ndof ,dim); |
55 | norm = 0.0; |
56 | for (c = 0; c < dim; c++) { |
57 | norm += PetscSqr(coord[j+c] - PetscRealPart(allCoords[o+c]))((coord[j+c] - (allCoords[o+c]))*(coord[j+c] - (allCoords[o+c ]))); |
58 | } |
59 | norm = PetscSqrtReal(norm)sqrt(norm); |
60 | if (norm <= eps) { |
61 | dagPoints[i] = p; |
62 | break; |
63 | } |
64 | } |
65 | } |
66 | ierr = VecRestoreArrayRead(allCoordsVec, &allCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),66,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
67 | 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); |
68 | } |
69 | |
70 | static PetscErrorCode DMPlexGetLineIntersection_2D_Internal(const PetscReal segmentA[], const PetscReal segmentB[], PetscReal intersection[], PetscBool *hasIntersection) |
71 | { |
72 | const PetscReal p0_x = segmentA[0*2+0]; |
73 | const PetscReal p0_y = segmentA[0*2+1]; |
74 | const PetscReal p1_x = segmentA[1*2+0]; |
75 | const PetscReal p1_y = segmentA[1*2+1]; |
76 | const PetscReal p2_x = segmentB[0*2+0]; |
77 | const PetscReal p2_y = segmentB[0*2+1]; |
78 | const PetscReal p3_x = segmentB[1*2+0]; |
79 | const PetscReal p3_y = segmentB[1*2+1]; |
80 | const PetscReal s1_x = p1_x - p0_x; |
81 | const PetscReal s1_y = p1_y - p0_y; |
82 | const PetscReal s2_x = p3_x - p2_x; |
83 | const PetscReal s2_y = p3_y - p2_y; |
84 | const PetscReal denom = (-s2_x * s1_y + s1_x * s2_y); |
85 | |
86 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 86; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
87 | *hasIntersection = PETSC_FALSE; |
88 | /* Non-parallel lines */ |
89 | if (denom != 0.0) { |
90 | const PetscReal s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / denom; |
91 | const PetscReal t = ( s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / denom; |
92 | |
93 | if (s >= 0 && s <= 1 && t >= 0 && t <= 1) { |
94 | *hasIntersection = PETSC_TRUE; |
95 | if (intersection) { |
96 | intersection[0] = p0_x + (t * s1_x); |
97 | intersection[1] = p0_y + (t * s1_y); |
98 | } |
99 | } |
100 | } |
101 | 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); |
102 | } |
103 | |
104 | static PetscErrorCode DMPlexLocatePoint_Simplex_2D_Internal(DM dm, const PetscScalar point[], PetscInt c, PetscInt *cell) |
105 | { |
106 | const PetscInt embedDim = 2; |
107 | const PetscReal eps = PETSC_SQRT_MACHINE_EPSILON1.490116119384766e-08; |
108 | PetscReal x = PetscRealPart(point[0])(point[0]); |
109 | PetscReal y = PetscRealPart(point[1])(point[1]); |
110 | PetscReal v0[2], J[4], invJ[4], detJ; |
111 | PetscReal xi, eta; |
112 | PetscErrorCode ierr; |
113 | |
114 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 114; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
115 | ierr = DMPlexComputeCellGeometryFEM(dm, c, NULL((void*)0), v0, J, invJ, &detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),115,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
116 | xi = invJ[0*embedDim+0]*(x - v0[0]) + invJ[0*embedDim+1]*(y - v0[1]); |
117 | eta = invJ[1*embedDim+0]*(x - v0[0]) + invJ[1*embedDim+1]*(y - v0[1]); |
118 | |
119 | if ((xi >= -eps) && (eta >= -eps) && (xi + eta <= 2.0+eps)) *cell = c; |
120 | else *cell = DMLOCATEPOINT_POINT_NOT_FOUND-367; |
121 | 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); |
122 | } |
123 | |
124 | static PetscErrorCode DMPlexClosestPoint_Simplex_2D_Internal(DM dm, const PetscScalar point[], PetscInt c, PetscReal cpoint[]) |
125 | { |
126 | const PetscInt embedDim = 2; |
127 | PetscReal x = PetscRealPart(point[0])(point[0]); |
128 | PetscReal y = PetscRealPart(point[1])(point[1]); |
129 | PetscReal v0[2], J[4], invJ[4], detJ; |
130 | PetscReal xi, eta, r; |
131 | PetscErrorCode ierr; |
132 | |
133 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 133; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
134 | ierr = DMPlexComputeCellGeometryFEM(dm, c, NULL((void*)0), v0, J, invJ, &detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),134,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
135 | xi = invJ[0*embedDim+0]*(x - v0[0]) + invJ[0*embedDim+1]*(y - v0[1]); |
136 | eta = invJ[1*embedDim+0]*(x - v0[0]) + invJ[1*embedDim+1]*(y - v0[1]); |
137 | |
138 | xi = PetscMax(xi, 0.0)(((xi)<(0.0)) ? (0.0) : (xi)); |
139 | eta = PetscMax(eta, 0.0)(((eta)<(0.0)) ? (0.0) : (eta)); |
140 | if (xi + eta > 2.0) { |
141 | r = (xi + eta)/2.0; |
142 | xi /= r; |
143 | eta /= r; |
144 | } |
145 | cpoint[0] = J[0*embedDim+0]*xi + J[0*embedDim+1]*eta + v0[0]; |
146 | cpoint[1] = J[1*embedDim+0]*xi + J[1*embedDim+1]*eta + v0[1]; |
147 | 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); |
148 | } |
149 | |
150 | static PetscErrorCode DMPlexLocatePoint_General_2D_Internal(DM dm, const PetscScalar point[], PetscInt c, PetscInt *cell) |
151 | { |
152 | PetscSection coordSection; |
153 | Vec coordsLocal; |
154 | PetscScalar *coords = NULL((void*)0); |
155 | const PetscInt faces[8] = {0, 1, 1, 2, 2, 3, 3, 0}; |
156 | PetscReal x = PetscRealPart(point[0])(point[0]); |
157 | PetscReal y = PetscRealPart(point[1])(point[1]); |
158 | PetscInt crossings = 0, f; |
159 | PetscErrorCode ierr; |
160 | |
161 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 161; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
162 | ierr = DMGetCoordinatesLocal(dm, &coordsLocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),162,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
163 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),163,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
164 | ierr = DMPlexVecGetClosure(dm, coordSection, coordsLocal, c, NULL((void*)0), &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),164,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
165 | for (f = 0; f < 4; ++f) { |
166 | PetscReal x_i = PetscRealPart(coords[faces[2*f+0]*2+0])(coords[faces[2*f+0]*2+0]); |
167 | PetscReal y_i = PetscRealPart(coords[faces[2*f+0]*2+1])(coords[faces[2*f+0]*2+1]); |
168 | PetscReal x_j = PetscRealPart(coords[faces[2*f+1]*2+0])(coords[faces[2*f+1]*2+0]); |
169 | PetscReal y_j = PetscRealPart(coords[faces[2*f+1]*2+1])(coords[faces[2*f+1]*2+1]); |
170 | PetscReal slope = (y_j - y_i) / (x_j - x_i); |
171 | PetscBool cond1 = (x_i <= x) && (x < x_j) ? PETSC_TRUE : PETSC_FALSE; |
172 | PetscBool cond2 = (x_j <= x) && (x < x_i) ? PETSC_TRUE : PETSC_FALSE; |
173 | PetscBool above = (y < slope * (x - x_i) + y_i) ? PETSC_TRUE : PETSC_FALSE; |
174 | if ((cond1 || cond2) && above) ++crossings; |
175 | } |
176 | if (crossings % 2) *cell = c; |
177 | else *cell = DMLOCATEPOINT_POINT_NOT_FOUND-367; |
178 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordsLocal, c, NULL((void*)0), &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),178,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
179 | 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); |
180 | } |
181 | |
182 | static PetscErrorCode DMPlexLocatePoint_Simplex_3D_Internal(DM dm, const PetscScalar point[], PetscInt c, PetscInt *cell) |
183 | { |
184 | const PetscInt embedDim = 3; |
185 | PetscReal v0[3], J[9], invJ[9], detJ; |
186 | PetscReal x = PetscRealPart(point[0])(point[0]); |
187 | PetscReal y = PetscRealPart(point[1])(point[1]); |
188 | PetscReal z = PetscRealPart(point[2])(point[2]); |
189 | PetscReal xi, eta, zeta; |
190 | PetscErrorCode ierr; |
191 | |
192 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 192; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
193 | ierr = DMPlexComputeCellGeometryFEM(dm, c, NULL((void*)0), v0, J, invJ, &detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),193,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
194 | xi = invJ[0*embedDim+0]*(x - v0[0]) + invJ[0*embedDim+1]*(y - v0[1]) + invJ[0*embedDim+2]*(z - v0[2]); |
195 | eta = invJ[1*embedDim+0]*(x - v0[0]) + invJ[1*embedDim+1]*(y - v0[1]) + invJ[1*embedDim+2]*(z - v0[2]); |
196 | zeta = invJ[2*embedDim+0]*(x - v0[0]) + invJ[2*embedDim+1]*(y - v0[1]) + invJ[2*embedDim+2]*(z - v0[2]); |
197 | |
198 | if ((xi >= 0.0) && (eta >= 0.0) && (zeta >= 0.0) && (xi + eta + zeta <= 2.0)) *cell = c; |
199 | else *cell = DMLOCATEPOINT_POINT_NOT_FOUND-367; |
200 | 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); |
201 | } |
202 | |
203 | static PetscErrorCode DMPlexLocatePoint_General_3D_Internal(DM dm, const PetscScalar point[], PetscInt c, PetscInt *cell) |
204 | { |
205 | PetscSection coordSection; |
206 | Vec coordsLocal; |
207 | PetscScalar *coords = NULL((void*)0); |
208 | const PetscInt faces[24] = {0, 3, 2, 1, 5, 4, 7, 6, 3, 0, 4, 5, |
209 | 1, 2, 6, 7, 3, 5, 6, 2, 0, 1, 7, 4}; |
210 | PetscBool found = PETSC_TRUE; |
211 | PetscInt f; |
212 | PetscErrorCode ierr; |
213 | |
214 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 214; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
215 | ierr = DMGetCoordinatesLocal(dm, &coordsLocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),215,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
216 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),216,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
217 | ierr = DMPlexVecGetClosure(dm, coordSection, coordsLocal, c, NULL((void*)0), &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),217,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
218 | for (f = 0; f < 6; ++f) { |
219 | /* Check the point is under plane */ |
220 | /* Get face normal */ |
221 | PetscReal v_i[3]; |
222 | PetscReal v_j[3]; |
223 | PetscReal normal[3]; |
224 | PetscReal pp[3]; |
225 | PetscReal dot; |
226 | |
227 | v_i[0] = PetscRealPart(coords[faces[f*4+3]*3+0]-coords[faces[f*4+0]*3+0])(coords[faces[f*4+3]*3+0]-coords[faces[f*4+0]*3+0]); |
228 | v_i[1] = PetscRealPart(coords[faces[f*4+3]*3+1]-coords[faces[f*4+0]*3+1])(coords[faces[f*4+3]*3+1]-coords[faces[f*4+0]*3+1]); |
229 | v_i[2] = PetscRealPart(coords[faces[f*4+3]*3+2]-coords[faces[f*4+0]*3+2])(coords[faces[f*4+3]*3+2]-coords[faces[f*4+0]*3+2]); |
230 | v_j[0] = PetscRealPart(coords[faces[f*4+1]*3+0]-coords[faces[f*4+0]*3+0])(coords[faces[f*4+1]*3+0]-coords[faces[f*4+0]*3+0]); |
231 | v_j[1] = PetscRealPart(coords[faces[f*4+1]*3+1]-coords[faces[f*4+0]*3+1])(coords[faces[f*4+1]*3+1]-coords[faces[f*4+0]*3+1]); |
232 | v_j[2] = PetscRealPart(coords[faces[f*4+1]*3+2]-coords[faces[f*4+0]*3+2])(coords[faces[f*4+1]*3+2]-coords[faces[f*4+0]*3+2]); |
233 | normal[0] = v_i[1]*v_j[2] - v_i[2]*v_j[1]; |
234 | normal[1] = v_i[2]*v_j[0] - v_i[0]*v_j[2]; |
235 | normal[2] = v_i[0]*v_j[1] - v_i[1]*v_j[0]; |
236 | pp[0] = PetscRealPart(coords[faces[f*4+0]*3+0] - point[0])(coords[faces[f*4+0]*3+0] - point[0]); |
237 | pp[1] = PetscRealPart(coords[faces[f*4+0]*3+1] - point[1])(coords[faces[f*4+0]*3+1] - point[1]); |
238 | pp[2] = PetscRealPart(coords[faces[f*4+0]*3+2] - point[2])(coords[faces[f*4+0]*3+2] - point[2]); |
239 | dot = normal[0]*pp[0] + normal[1]*pp[1] + normal[2]*pp[2]; |
240 | |
241 | /* Check that projected point is in face (2D location problem) */ |
242 | if (dot < 0.0) { |
243 | found = PETSC_FALSE; |
244 | break; |
245 | } |
246 | } |
247 | if (found) *cell = c; |
248 | else *cell = DMLOCATEPOINT_POINT_NOT_FOUND-367; |
249 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordsLocal, c, NULL((void*)0), &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),249,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
250 | 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); |
251 | } |
252 | |
253 | static PetscErrorCode PetscGridHashInitialize_Internal(PetscGridHash box, PetscInt dim, const PetscScalar point[]) |
254 | { |
255 | PetscInt d; |
256 | |
257 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 257; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
258 | box->dim = dim; |
259 | for (d = 0; d < dim; ++d) box->lower[d] = box->upper[d] = PetscRealPart(point[d])(point[d]); |
260 | 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); |
261 | } |
262 | |
263 | PetscErrorCode PetscGridHashCreate(MPI_Comm comm, PetscInt dim, const PetscScalar point[], PetscGridHash *box) |
264 | { |
265 | PetscErrorCode ierr; |
266 | |
267 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 267; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
268 | ierr = PetscMalloc1(1, box)PetscMallocA(1,PETSC_FALSE,268,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,(size_t)(1)*sizeof(**(box)),(box));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),268,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
269 | ierr = PetscGridHashInitialize_Internal(*box, dim, point);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),269,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
270 | 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); |
271 | } |
272 | |
273 | PetscErrorCode PetscGridHashEnlarge(PetscGridHash box, const PetscScalar point[]) |
274 | { |
275 | PetscInt d; |
276 | |
277 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 277; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
278 | for (d = 0; d < box->dim; ++d) { |
279 | box->lower[d] = PetscMin(box->lower[d], PetscRealPart(point[d]))(((box->lower[d])<((point[d]))) ? (box->lower[d]) : ( (point[d]))); |
280 | box->upper[d] = PetscMax(box->upper[d], PetscRealPart(point[d]))(((box->upper[d])<((point[d]))) ? ((point[d])) : (box-> upper[d])); |
281 | } |
282 | 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); |
283 | } |
284 | |
285 | /* |
286 | PetscGridHashSetGrid - Divide the grid into boxes |
287 | |
288 | Not collective |
289 | |
290 | Input Parameters: |
291 | + box - The grid hash object |
292 | . n - The number of boxes in each dimension, or PETSC_DETERMINE |
293 | - h - The box size in each dimension, only used if n[d] == PETSC_DETERMINE |
294 | |
295 | Level: developer |
296 | |
297 | .seealso: PetscGridHashCreate() |
298 | */ |
299 | PetscErrorCode PetscGridHashSetGrid(PetscGridHash box, const PetscInt n[], const PetscReal h[]) |
300 | { |
301 | PetscInt d; |
302 | |
303 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 303; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
304 | for (d = 0; d < box->dim; ++d) { |
305 | box->extent[d] = box->upper[d] - box->lower[d]; |
306 | if (n[d] == PETSC_DETERMINE-1) { |
307 | box->h[d] = h[d]; |
308 | box->n[d] = PetscCeilReal(box->extent[d]/h[d])ceil(box->extent[d]/h[d]); |
309 | } else { |
310 | box->n[d] = n[d]; |
311 | box->h[d] = box->extent[d]/n[d]; |
312 | } |
313 | } |
314 | 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); |
315 | } |
316 | |
317 | /* |
318 | PetscGridHashGetEnclosingBox - Find the grid boxes containing each input point |
319 | |
320 | Not collective |
321 | |
322 | Input Parameters: |
323 | + box - The grid hash object |
324 | . numPoints - The number of input points |
325 | - points - The input point coordinates |
326 | |
327 | Output Parameters: |
328 | + dboxes - An array of numPoints*dim integers expressing the enclosing box as (i_0, i_1, ..., i_dim) |
329 | - boxes - An array of numPoints integers expressing the enclosing box as single number, or NULL |
330 | |
331 | Level: developer |
332 | |
333 | .seealso: PetscGridHashCreate() |
334 | */ |
335 | PetscErrorCode PetscGridHashGetEnclosingBox(PetscGridHash box, PetscInt numPoints, const PetscScalar points[], PetscInt dboxes[], PetscInt boxes[]) |
336 | { |
337 | const PetscReal *lower = box->lower; |
338 | const PetscReal *upper = box->upper; |
339 | const PetscReal *h = box->h; |
340 | const PetscInt *n = box->n; |
341 | const PetscInt dim = box->dim; |
342 | PetscInt d, p; |
343 | |
344 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 344; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
345 | for (p = 0; p < numPoints; ++p) { |
346 | for (d = 0; d < dim; ++d) { |
347 | PetscInt dbox = PetscFloorReal((PetscRealPart(points[p*dim+d]) - lower[d])/h[d])floor(((points[p*dim+d]) - lower[d])/h[d]); |
348 | |
349 | if (dbox == n[d] && PetscAbsReal(PetscRealPart(points[p*dim+d]) - upper[d])fabs((points[p*dim+d]) - upper[d]) < 1.0e-9) dbox = n[d]-1; |
350 | if (dbox == -1 && PetscAbsReal(PetscRealPart(points[p*dim+d]) - lower[d])fabs((points[p*dim+d]) - lower[d]) < 1.0e-9) dbox = 0; |
351 | if (dbox < 0 || dbox >= n[d]) SETERRQ4(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Input point %d (%g, %g, %g) is outside of our bounding box",return PetscError(((MPI_Comm)0x44000001),352,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Input point %d (%g, %g, %g) is outside of our bounding box" ,p,(points[p*dim+0]),dim > 1 ? (points[p*dim+1]) : 0.0,dim > 2 ? (points[p*dim+2]) : 0.0) |
352 | p, PetscRealPart(points[p*dim+0]), dim > 1 ? PetscRealPart(points[p*dim+1]) : 0.0, dim > 2 ? PetscRealPart(points[p*dim+2]) : 0.0)return PetscError(((MPI_Comm)0x44000001),352,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Input point %d (%g, %g, %g) is outside of our bounding box" ,p,(points[p*dim+0]),dim > 1 ? (points[p*dim+1]) : 0.0,dim > 2 ? (points[p*dim+2]) : 0.0); |
353 | dboxes[p*dim+d] = dbox; |
354 | } |
355 | if (boxes) for (d = 1, boxes[p] = dboxes[p*dim]; d < dim; ++d) boxes[p] += dboxes[p*dim+d]*n[d-1]; |
356 | } |
357 | 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); |
358 | } |
359 | |
360 | /* |
361 | PetscGridHashGetEnclosingBoxQuery - Find the grid boxes containing each input point |
362 | |
363 | Not collective |
364 | |
365 | Input Parameters: |
366 | + box - The grid hash object |
367 | . numPoints - The number of input points |
368 | - points - The input point coordinates |
369 | |
370 | Output Parameters: |
371 | + dboxes - An array of numPoints*dim integers expressing the enclosing box as (i_0, i_1, ..., i_dim) |
372 | . boxes - An array of numPoints integers expressing the enclosing box as single number, or NULL |
373 | - found - Flag indicating if point was located within a box |
374 | |
375 | Level: developer |
376 | |
377 | .seealso: PetscGridHashGetEnclosingBox() |
378 | */ |
379 | PetscErrorCode PetscGridHashGetEnclosingBoxQuery(PetscGridHash box, PetscInt numPoints, const PetscScalar points[], PetscInt dboxes[], PetscInt boxes[],PetscBool *found) |
380 | { |
381 | const PetscReal *lower = box->lower; |
382 | const PetscReal *upper = box->upper; |
383 | const PetscReal *h = box->h; |
384 | const PetscInt *n = box->n; |
385 | const PetscInt dim = box->dim; |
386 | PetscInt d, p; |
387 | |
388 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 388; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
389 | *found = PETSC_FALSE; |
390 | for (p = 0; p < numPoints; ++p) { |
391 | for (d = 0; d < dim; ++d) { |
392 | PetscInt dbox = PetscFloorReal((PetscRealPart(points[p*dim+d]) - lower[d])/h[d])floor(((points[p*dim+d]) - lower[d])/h[d]); |
393 | |
394 | if (dbox == n[d] && PetscAbsReal(PetscRealPart(points[p*dim+d]) - upper[d])fabs((points[p*dim+d]) - upper[d]) < 1.0e-9) dbox = n[d]-1; |
395 | if (dbox < 0 || dbox >= n[d]) { |
396 | 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); |
397 | } |
398 | dboxes[p*dim+d] = dbox; |
399 | } |
400 | if (boxes) for (d = 1, boxes[p] = dboxes[p*dim]; d < dim; ++d) boxes[p] += dboxes[p*dim+d]*n[d-1]; |
401 | } |
402 | *found = PETSC_TRUE; |
403 | 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); |
404 | } |
405 | |
406 | PetscErrorCode PetscGridHashDestroy(PetscGridHash *box) |
407 | { |
408 | PetscErrorCode ierr; |
409 | |
410 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 410; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
411 | if (*box) { |
412 | ierr = PetscSectionDestroy(&(*box)->cellSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),412,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
413 | ierr = ISDestroy(&(*box)->cells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),413,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
414 | ierr = DMLabelDestroy(&(*box)->cellsSparse);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),414,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
415 | } |
416 | ierr = PetscFree(*box)((*PetscTrFree)((void*)(*box),416,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ) || ((*box) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),416,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
417 | 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); |
418 | } |
419 | |
420 | PetscErrorCode DMPlexLocatePoint_Internal(DM dm, PetscInt dim, const PetscScalar point[], PetscInt cellStart, PetscInt *cell) |
421 | { |
422 | PetscInt coneSize; |
423 | PetscErrorCode ierr; |
424 | |
425 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 425; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
426 | switch (dim) { |
427 | case 2: |
428 | ierr = DMPlexGetConeSize(dm, cellStart, &coneSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),428,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
429 | switch (coneSize) { |
430 | case 3: |
431 | ierr = DMPlexLocatePoint_Simplex_2D_Internal(dm, point, cellStart, cell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),431,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
432 | break; |
433 | case 4: |
434 | ierr = DMPlexLocatePoint_General_2D_Internal(dm, point, cellStart, cell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),434,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
435 | break; |
436 | default: |
437 | SETERRQ1(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "No point location for cell with cone size %D", coneSize)return PetscError(PetscObjectComm((PetscObject)dm),437,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"No point location for cell with cone size %D" ,coneSize); |
438 | } |
439 | break; |
440 | case 3: |
441 | ierr = DMPlexGetConeSize(dm, cellStart, &coneSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),441,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
442 | switch (coneSize) { |
443 | case 4: |
444 | ierr = DMPlexLocatePoint_Simplex_3D_Internal(dm, point, cellStart, cell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),444,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
445 | break; |
446 | case 6: |
447 | ierr = DMPlexLocatePoint_General_3D_Internal(dm, point, cellStart, cell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),447,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
448 | break; |
449 | default: |
450 | SETERRQ1(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "No point location for cell with cone size %D", coneSize)return PetscError(PetscObjectComm((PetscObject)dm),450,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"No point location for cell with cone size %D" ,coneSize); |
451 | } |
452 | break; |
453 | default: |
454 | SETERRQ1(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "No point location for mesh dimension %D", dim)return PetscError(PetscObjectComm((PetscObject)dm),454,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"No point location for mesh dimension %D" ,dim); |
455 | } |
456 | 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); |
457 | } |
458 | |
459 | /* |
460 | DMPlexClosestPoint_Internal - Returns the closest point in the cell to the given point |
461 | */ |
462 | PetscErrorCode DMPlexClosestPoint_Internal(DM dm, PetscInt dim, const PetscScalar point[], PetscInt cell, PetscReal cpoint[]) |
463 | { |
464 | PetscInt coneSize; |
465 | PetscErrorCode ierr; |
466 | |
467 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 467; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
468 | switch (dim) { |
469 | case 2: |
470 | ierr = DMPlexGetConeSize(dm, cell, &coneSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),470,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
471 | switch (coneSize) { |
472 | case 3: |
473 | ierr = DMPlexClosestPoint_Simplex_2D_Internal(dm, point, cell, cpoint);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),473,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
474 | break; |
475 | #if 0 |
476 | case 4: |
477 | ierr = DMPlexClosestPoint_General_2D_Internal(dm, point, cell, cpoint);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),477,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
478 | break; |
479 | #endif |
480 | default: |
481 | SETERRQ1(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "No closest point location for cell with cone size %D", coneSize)return PetscError(PetscObjectComm((PetscObject)dm),481,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"No closest point location for cell with cone size %D" ,coneSize); |
482 | } |
483 | break; |
484 | #if 0 |
485 | case 3: |
486 | ierr = DMPlexGetConeSize(dm, cell, &coneSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),486,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
487 | switch (coneSize) { |
488 | case 4: |
489 | ierr = DMPlexClosestPoint_Simplex_3D_Internal(dm, point, cell, cpoint);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),489,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
490 | break; |
491 | case 6: |
492 | ierr = DMPlexClosestPoint_General_3D_Internal(dm, point, cell, cpoint);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),492,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
493 | break; |
494 | default: |
495 | SETERRQ1(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "No closest point location for cell with cone size %D", coneSize)return PetscError(PetscObjectComm((PetscObject)dm),495,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"No closest point location for cell with cone size %D" ,coneSize); |
496 | } |
497 | break; |
498 | #endif |
499 | default: |
500 | SETERRQ1(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "No closest point location for mesh dimension %D", dim)return PetscError(PetscObjectComm((PetscObject)dm),500,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"No closest point location for mesh dimension %D" ,dim); |
501 | } |
502 | 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); |
503 | } |
504 | |
505 | /* |
506 | DMPlexComputeGridHash_Internal - Create a grid hash structure covering the Plex |
507 | |
508 | Collective on dm |
509 | |
510 | Input Parameter: |
511 | . dm - The Plex |
512 | |
513 | Output Parameter: |
514 | . localBox - The grid hash object |
515 | |
516 | Level: developer |
517 | |
518 | .seealso: PetscGridHashCreate(), PetscGridHashGetEnclosingBox() |
519 | */ |
520 | PetscErrorCode DMPlexComputeGridHash_Internal(DM dm, PetscGridHash *localBox) |
521 | { |
522 | MPI_Comm comm; |
523 | PetscGridHash lbox; |
524 | Vec coordinates; |
525 | PetscSection coordSection; |
526 | Vec coordsLocal; |
527 | const PetscScalar *coords; |
528 | PetscInt *dboxes, *boxes; |
529 | PetscInt n[3] = {10, 10, 10}; |
530 | PetscInt dim, N, cStart, cEnd, cMax, c, i; |
531 | PetscErrorCode ierr; |
532 | |
533 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 533; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
534 | ierr = PetscObjectGetComm((PetscObject) dm, &comm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),534,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
535 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),535,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
536 | ierr = DMGetCoordinateDim(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),536,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
537 | if (dim != 2) SETERRQ(comm, PETSC_ERR_SUP, "I have only coded this for 2D")return PetscError(comm,537,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"I have only coded this for 2D"); |
538 | ierr = VecGetLocalSize(coordinates, &N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),538,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
539 | ierr = VecGetArrayRead(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),539,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
540 | ierr = PetscGridHashCreate(comm, dim, coords, &lbox);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),540,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
541 | for (i = 0; i < N; i += dim) {ierr = PetscGridHashEnlarge(lbox, &coords[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),541,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
542 | ierr = VecRestoreArrayRead(coordinates, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),542,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
543 | ierr = PetscOptionsGetInt(NULL((void*)0),NULL((void*)0),"-dm_plex_hash_box_nijk",&n[0],NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),543,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
544 | n[1] = n[0]; |
545 | n[2] = n[0]; |
546 | ierr = PetscGridHashSetGrid(lbox, n, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),546,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
547 | #if 0 |
548 | /* Could define a custom reduction to merge these */ |
549 | ierr = MPIU_Allreduce(lbox->lower, gbox->lower, 3, MPIU_REAL, MPI_MIN, comm)(PetscAllreduceBarrierCheck(comm,3,549,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Allreduce((lbox->lower),(gbox->lower),(3),(((MPI_Datatype )0x4c00080b)),((MPI_Op)(0x58000002)),(comm))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),549,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
550 | ierr = MPIU_Allreduce(lbox->upper, gbox->upper, 3, MPIU_REAL, MPI_MAX, comm)(PetscAllreduceBarrierCheck(comm,3,550,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Allreduce((lbox->upper),(gbox->upper),(3),(((MPI_Datatype )0x4c00080b)),((MPI_Op)(0x58000001)),(comm))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),550,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
551 | #endif |
552 | /* Is there a reason to snap the local bounding box to a division of the global box? */ |
553 | /* Should we compute all overlaps of local boxes? We could do this with a rendevouz scheme partitioning the global box */ |
554 | /* Create label */ |
555 | ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),555,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
556 | ierr = DMPlexGetHybridBounds(dm, &cMax, NULL((void*)0), NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),556,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
557 | if (cMax >= 0) cEnd = PetscMin(cEnd, cMax)(((cEnd)<(cMax)) ? (cEnd) : (cMax)); |
558 | ierr = DMLabelCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001), "cells", &lbox->cellsSparse);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),558,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
559 | ierr = DMLabelCreateIndex(lbox->cellsSparse, cStart, cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),559,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
560 | /* Compute boxes which overlap each cell: https://stackoverflow.com/questions/13790208/triangle-square-intersection-test-in-2d */ |
561 | ierr = DMGetCoordinatesLocal(dm, &coordsLocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),561,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
562 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),562,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
563 | ierr = PetscCalloc2(16 * dim, &dboxes, 16, &boxes)PetscMallocA(2,PETSC_TRUE,563,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,(size_t)(16 * dim)*sizeof(**(&dboxes)),(&dboxes),(size_t )(16)*sizeof(**(&boxes)),(&boxes));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),563,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
564 | for (c = cStart; c < cEnd; ++c) { |
565 | const PetscReal *h = lbox->h; |
566 | PetscScalar *ccoords = NULL((void*)0); |
567 | PetscInt csize = 0; |
568 | PetscScalar point[3]; |
569 | PetscInt dlim[6], d, e, i, j, k; |
570 | |
571 | /* Find boxes enclosing each vertex */ |
572 | ierr = DMPlexVecGetClosure(dm, coordSection, coordsLocal, c, &csize, &ccoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),572,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
573 | ierr = PetscGridHashGetEnclosingBox(lbox, csize/dim, ccoords, dboxes, boxes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),573,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
574 | /* Mark cells containing the vertices */ |
575 | for (e = 0; e < csize/dim; ++e) {ierr = DMLabelSetValue(lbox->cellsSparse, c, boxes[e]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),575,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
576 | /* Get grid of boxes containing these */ |
577 | for (d = 0; d < dim; ++d) {dlim[d*2+0] = dlim[d*2+1] = dboxes[d];} |
578 | for (d = dim; d < 3; ++d) {dlim[d*2+0] = dlim[d*2+1] = 0;} |
579 | for (e = 1; e < dim+1; ++e) { |
580 | for (d = 0; d < dim; ++d) { |
581 | dlim[d*2+0] = PetscMin(dlim[d*2+0], dboxes[e*dim+d])(((dlim[d*2+0])<(dboxes[e*dim+d])) ? (dlim[d*2+0]) : (dboxes [e*dim+d])); |
582 | dlim[d*2+1] = PetscMax(dlim[d*2+1], dboxes[e*dim+d])(((dlim[d*2+1])<(dboxes[e*dim+d])) ? (dboxes[e*dim+d]) : ( dlim[d*2+1])); |
583 | } |
584 | } |
585 | /* Check for intersection of box with cell */ |
586 | for (k = dlim[2*2+0], point[2] = lbox->lower[2] + k*h[2]; k <= dlim[2*2+1]; ++k, point[2] += h[2]) { |
587 | for (j = dlim[1*2+0], point[1] = lbox->lower[1] + j*h[1]; j <= dlim[1*2+1]; ++j, point[1] += h[1]) { |
588 | for (i = dlim[0*2+0], point[0] = lbox->lower[0] + i*h[0]; i <= dlim[0*2+1]; ++i, point[0] += h[0]) { |
589 | const PetscInt box = (k*lbox->n[1] + j)*lbox->n[0] + i; |
590 | PetscScalar cpoint[3]; |
591 | PetscInt cell, edge, ii, jj, kk; |
592 | |
593 | /* Check whether cell contains any vertex of these subboxes TODO vectorize this */ |
594 | for (kk = 0, cpoint[2] = point[2]; kk < (dim > 2 ? 2 : 1); ++kk, cpoint[2] += h[2]) { |
595 | for (jj = 0, cpoint[1] = point[1]; jj < (dim > 1 ? 2 : 1); ++jj, cpoint[1] += h[1]) { |
596 | for (ii = 0, cpoint[0] = point[0]; ii < 2; ++ii, cpoint[0] += h[0]) { |
597 | |
598 | ierr = DMPlexLocatePoint_Internal(dm, dim, cpoint, c, &cell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),598,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
599 | if (cell >= 0) { ierr = DMLabelSetValue(lbox->cellsSparse, c, box);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),599,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); ii = jj = kk = 2;} |
600 | } |
601 | } |
602 | } |
603 | /* Check whether cell edge intersects any edge of these subboxes TODO vectorize this */ |
604 | for (edge = 0; edge < dim+1; ++edge) { |
605 | PetscReal segA[6], segB[6]; |
606 | |
607 | if (PetscUnlikely(dim > 3)__builtin_expect(!!(dim > 3),0)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Unexpected dim %d > 3",dim)return PetscError(((MPI_Comm)0x44000001),607,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,77,PETSC_ERROR_INITIAL,"Unexpected dim %d > 3",dim); |
608 | for (d = 0; d < dim; ++d) {segA[d] = PetscRealPart(ccoords[edge*dim+d])(ccoords[edge*dim+d]); segA[dim+d] = PetscRealPart(ccoords[((edge+1)%(dim+1))*dim+d])(ccoords[((edge+1)%(dim+1))*dim+d]);} |
609 | for (kk = 0; kk < (dim > 2 ? 2 : 1); ++kk) { |
610 | if (dim > 2) {segB[2] = PetscRealPart(point[2])(point[2]); |
611 | segB[dim+2] = PetscRealPart(point[2])(point[2]) + kk*h[2];} |
612 | for (jj = 0; jj < (dim > 1 ? 2 : 1); ++jj) { |
613 | if (dim > 1) {segB[1] = PetscRealPart(point[1])(point[1]); |
614 | segB[dim+1] = PetscRealPart(point[1])(point[1]) + jj*h[1];} |
615 | for (ii = 0; ii < 2; ++ii) { |
616 | PetscBool intersects; |
617 | |
618 | segB[0] = PetscRealPart(point[0])(point[0]); |
619 | segB[dim+0] = PetscRealPart(point[0])(point[0]) + ii*h[0]; |
620 | ierr = DMPlexGetLineIntersection_2D_Internal(segA, segB, NULL((void*)0), &intersects);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),620,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
621 | if (intersects) { ierr = DMLabelSetValue(lbox->cellsSparse, c, box);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),621,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); edge = ii = jj = kk = dim+1;} |
622 | } |
623 | } |
624 | } |
625 | } |
626 | } |
627 | } |
628 | } |
629 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordsLocal, c, NULL((void*)0), &ccoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),629,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
630 | } |
631 | ierr = PetscFree2(dboxes, boxes)PetscFreeA(2,631,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,&(dboxes),&(boxes));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),631,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
632 | ierr = DMLabelConvertToSection(lbox->cellsSparse, &lbox->cellSection, &lbox->cells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),632,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
633 | ierr = DMLabelDestroy(&lbox->cellsSparse);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),633,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
634 | *localBox = lbox; |
635 | 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); |
636 | } |
637 | |
638 | PetscErrorCode DMLocatePoints_Plex(DM dm, Vec v, DMPointLocationType ltype, PetscSF cellSF) |
639 | { |
640 | DM_Plex *mesh = (DM_Plex *) dm->data; |
641 | PetscBool hash = mesh->useHashLocation, reuse = PETSC_FALSE; |
642 | PetscInt bs, numPoints, p, numFound, *found = NULL((void*)0); |
643 | PetscInt dim, cStart, cEnd, cMax, numCells, c, d; |
644 | const PetscInt *boxCells; |
645 | PetscSFNode *cells; |
646 | PetscScalar *a; |
647 | PetscMPIInt result; |
648 | PetscLogDouble t0,t1; |
649 | PetscReal gmin[3],gmax[3]; |
650 | PetscInt terminating_query_type[] = { 0, 0, 0 }; |
651 | PetscErrorCode ierr; |
652 | |
653 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 653; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
654 | ierr = PetscTime(&t0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),654,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
655 | if (ltype == DM_POINTLOCATION_NEAREST && !hash) SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "Nearest point location only supported with grid hashing. Use -dm_plex_hash_location to enable it.")return PetscError(PetscObjectComm((PetscObject) dm),655,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"Nearest point location only supported with grid hashing. Use -dm_plex_hash_location to enable it." ); |
656 | ierr = DMGetCoordinateDim(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),656,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
657 | ierr = VecGetBlockSize(v, &bs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),657,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
658 | ierr = MPI_Comm_compare(PetscObjectComm((PetscObject)cellSF),PETSC_COMM_SELF((MPI_Comm)0x44000001),&result);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),658,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
659 | if (result != MPI_IDENT0 && result != MPI_CONGRUENT1) SETERRQ(PetscObjectComm((PetscObject)cellSF),PETSC_ERR_SUP, "Trying parallel point location: only local point location supported")return PetscError(PetscObjectComm((PetscObject)cellSF),659,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"Trying parallel point location: only local point location supported" ); |
660 | if (bs != dim) SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONG, "Block size for point vector %D must be the mesh coordinate dimension %D", bs, dim)return PetscError(PetscObjectComm((PetscObject)dm),660,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Block size for point vector %D must be the mesh coordinate dimension %D" ,bs,dim); |
661 | ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),661,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
662 | ierr = DMPlexGetHybridBounds(dm, &cMax, NULL((void*)0), NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),662,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
663 | if (cMax >= 0) cEnd = PetscMin(cEnd, cMax)(((cEnd)<(cMax)) ? (cEnd) : (cMax)); |
664 | ierr = VecGetLocalSize(v, &numPoints);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),664,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
665 | ierr = VecGetArray(v, &a);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),665,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
666 | numPoints /= bs; |
667 | { |
668 | const PetscSFNode *sf_cells; |
669 | |
670 | ierr = PetscSFGetGraph(cellSF,NULL((void*)0),NULL((void*)0),NULL((void*)0),&sf_cells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),670,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
671 | if (sf_cells) { |
672 | ierr = PetscInfo(dm,"[DMLocatePoints_Plex] Re-using existing StarForest node list\n")PetscInfo_Private(__func__,dm,"[DMLocatePoints_Plex] Re-using existing StarForest node list\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),672,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
673 | cells = (PetscSFNode*)sf_cells; |
674 | reuse = PETSC_TRUE; |
675 | } else { |
676 | ierr = PetscInfo(dm,"[DMLocatePoints_Plex] Creating and initializing new StarForest node list\n")PetscInfo_Private(__func__,dm,"[DMLocatePoints_Plex] Creating and initializing new StarForest node list\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),676,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
677 | ierr = PetscMalloc1(numPoints, &cells)PetscMallocA(1,PETSC_FALSE,677,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,(size_t)(numPoints)*sizeof(**(&cells)),(&cells));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),677,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
678 | /* initialize cells if created */ |
679 | for (p=0; p<numPoints; p++) { |
680 | cells[p].rank = 0; |
681 | cells[p].index = DMLOCATEPOINT_POINT_NOT_FOUND-367; |
682 | } |
683 | } |
684 | } |
685 | /* define domain bounding box */ |
686 | { |
687 | Vec coorglobal; |
688 | |
689 | ierr = DMGetCoordinates(dm,&coorglobal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),689,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
690 | ierr = VecStrideMaxAll(coorglobal,NULL((void*)0),gmax);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),690,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
691 | ierr = VecStrideMinAll(coorglobal,NULL((void*)0),gmin);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),691,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
692 | } |
693 | if (hash) { |
694 | if (!mesh->lbox) {ierr = PetscInfo(dm, "Initializing grid hashing")PetscInfo_Private(__func__,dm,"Initializing grid hashing");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),694,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);ierr = DMPlexComputeGridHash_Internal(dm, &mesh->lbox);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),694,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
695 | /* Designate the local box for each point */ |
696 | /* Send points to correct process */ |
697 | /* Search cells that lie in each subbox */ |
698 | /* Should we bin points before doing search? */ |
699 | ierr = ISGetIndices(mesh->lbox->cells, &boxCells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),699,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
700 | } |
701 | for (p = 0, numFound = 0; p < numPoints; ++p) { |
702 | const PetscScalar *point = &a[p*bs]; |
703 | PetscInt dbin[3] = {-1,-1,-1}, bin, cell = -1, cellOffset; |
704 | PetscBool point_outside_domain = PETSC_FALSE; |
705 | |
706 | /* check bounding box of domain */ |
707 | for (d=0; d<dim; d++) { |
708 | if (PetscRealPart(point[d])(point[d]) < gmin[d]) { point_outside_domain = PETSC_TRUE; break; } |
709 | if (PetscRealPart(point[d])(point[d]) > gmax[d]) { point_outside_domain = PETSC_TRUE; break; } |
710 | } |
711 | if (point_outside_domain) { |
712 | cells[p].rank = 0; |
713 | cells[p].index = DMLOCATEPOINT_POINT_NOT_FOUND-367; |
714 | terminating_query_type[0]++; |
715 | continue; |
716 | } |
717 | |
718 | /* check initial values in cells[].index - abort early if found */ |
719 | if (cells[p].index != DMLOCATEPOINT_POINT_NOT_FOUND-367) { |
720 | c = cells[p].index; |
721 | cells[p].index = DMLOCATEPOINT_POINT_NOT_FOUND-367; |
722 | ierr = DMPlexLocatePoint_Internal(dm, dim, point, c, &cell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),722,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
723 | if (cell >= 0) { |
724 | cells[p].rank = 0; |
725 | cells[p].index = cell; |
726 | numFound++; |
727 | } |
728 | } |
729 | if (cells[p].index != DMLOCATEPOINT_POINT_NOT_FOUND-367) { |
730 | terminating_query_type[1]++; |
731 | continue; |
732 | } |
733 | |
734 | if (hash) { |
735 | PetscBool found_box; |
736 | |
737 | /* allow for case that point is outside box - abort early */ |
738 | ierr = PetscGridHashGetEnclosingBoxQuery(mesh->lbox, 1, point, dbin, &bin,&found_box);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),738,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
739 | if (found_box) { |
740 | /* TODO Lay an interface over this so we can switch between Section (dense) and Label (sparse) */ |
741 | ierr = PetscSectionGetDof(mesh->lbox->cellSection, bin, &numCells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),741,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
742 | ierr = PetscSectionGetOffset(mesh->lbox->cellSection, bin, &cellOffset);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),742,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
743 | for (c = cellOffset; c < cellOffset + numCells; ++c) { |
744 | ierr = DMPlexLocatePoint_Internal(dm, dim, point, boxCells[c], &cell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),744,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
745 | if (cell >= 0) { |
746 | cells[p].rank = 0; |
747 | cells[p].index = cell; |
748 | numFound++; |
749 | terminating_query_type[2]++; |
750 | break; |
751 | } |
752 | } |
753 | } |
754 | } else { |
755 | for (c = cStart; c < cEnd; ++c) { |
756 | ierr = DMPlexLocatePoint_Internal(dm, dim, point, c, &cell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),756,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
757 | if (cell >= 0) { |
758 | cells[p].rank = 0; |
759 | cells[p].index = cell; |
760 | numFound++; |
761 | terminating_query_type[2]++; |
762 | break; |
763 | } |
764 | } |
765 | } |
766 | } |
767 | if (hash) {ierr = ISRestoreIndices(mesh->lbox->cells, &boxCells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),767,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
768 | if (ltype == DM_POINTLOCATION_NEAREST && hash && numFound < numPoints) { |
769 | for (p = 0; p < numPoints; p++) { |
770 | const PetscScalar *point = &a[p*bs]; |
771 | PetscReal cpoint[3], diff[3], dist, distMax = PETSC_MAX_REAL1.7976931348623157e+308; |
772 | PetscInt dbin[3] = {-1,-1,-1}, bin, cellOffset, d; |
773 | |
774 | if (cells[p].index < 0) { |
775 | ++numFound; |
776 | ierr = PetscGridHashGetEnclosingBox(mesh->lbox, 1, point, dbin, &bin);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),776,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
777 | ierr = PetscSectionGetDof(mesh->lbox->cellSection, bin, &numCells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),777,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
778 | ierr = PetscSectionGetOffset(mesh->lbox->cellSection, bin, &cellOffset);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),778,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
779 | for (c = cellOffset; c < cellOffset + numCells; ++c) { |
780 | ierr = DMPlexClosestPoint_Internal(dm, dim, point, boxCells[c], cpoint);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),780,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
781 | for (d = 0; d < dim; ++d) diff[d] = cpoint[d] - PetscRealPart(point[d])(point[d]); |
782 | dist = DMPlex_NormD_Internal(dim, diff); |
783 | if (dist < distMax) { |
784 | for (d = 0; d < dim; ++d) a[p*bs+d] = cpoint[d]; |
785 | cells[p].rank = 0; |
786 | cells[p].index = boxCells[c]; |
787 | distMax = dist; |
Value stored to 'distMax' is never read | |
788 | break; |
789 | } |
790 | } |
791 | } |
792 | } |
793 | } |
794 | /* This code is only be relevant when interfaced to parallel point location */ |
795 | /* Check for highest numbered proc that claims a point (do we care?) */ |
796 | if (ltype == DM_POINTLOCATION_REMOVE && numFound < numPoints) { |
797 | ierr = PetscMalloc1(numFound,&found)PetscMallocA(1,PETSC_FALSE,797,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,(size_t)(numFound)*sizeof(**(&found)),(&found));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),797,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
798 | for (p = 0, numFound = 0; p < numPoints; p++) { |
799 | if (cells[p].rank >= 0 && cells[p].index >= 0) { |
800 | if (numFound < p) { |
801 | cells[numFound] = cells[p]; |
802 | } |
803 | found[numFound++] = p; |
804 | } |
805 | } |
806 | } |
807 | ierr = VecRestoreArray(v, &a);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),807,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
808 | if (!reuse) { |
809 | ierr = PetscSFSetGraph(cellSF, cEnd - cStart, numFound, found, PETSC_OWN_POINTER, cells, PETSC_OWN_POINTER);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),809,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
810 | } |
811 | ierr = PetscTime(&t1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),811,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
812 | if (hash) { |
813 | ierr = PetscInfo3(dm,"[DMLocatePoints_Plex] terminating_query_type : %D [outside domain] : %D [inside intial cell] : %D [hash]\n",terminating_query_type[0],terminating_query_type[1],terminating_query_type[2])PetscInfo_Private(__func__,dm,"[DMLocatePoints_Plex] terminating_query_type : %D [outside domain] : %D [inside intial cell] : %D [hash]\n" ,terminating_query_type[0],terminating_query_type[1],terminating_query_type [2]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),813,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
814 | } else { |
815 | ierr = PetscInfo3(dm,"[DMLocatePoints_Plex] terminating_query_type : %D [outside domain] : %D [inside intial cell] : %D [brute-force]\n",terminating_query_type[0],terminating_query_type[1],terminating_query_type[2])PetscInfo_Private(__func__,dm,"[DMLocatePoints_Plex] terminating_query_type : %D [outside domain] : %D [inside intial cell] : %D [brute-force]\n" ,terminating_query_type[0],terminating_query_type[1],terminating_query_type [2]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),815,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
816 | } |
817 | ierr = PetscInfo3(dm,"[DMLocatePoints_Plex] npoints %D : time(rank0) %1.2e (sec): points/sec %1.4e\n",numPoints,t1-t0,(double)((double)numPoints/(t1-t0)))PetscInfo_Private(__func__,dm,"[DMLocatePoints_Plex] npoints %D : time(rank0) %1.2e (sec): points/sec %1.4e\n" ,numPoints,t1-t0,(double)((double)numPoints/(t1-t0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),817,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
818 | 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); |
819 | } |
820 | |
821 | /*@C |
822 | DMPlexComputeProjection2Dto1D - Rewrite coordinates to be the 1D projection of the 2D coordinates |
823 | |
824 | Not collective |
825 | |
826 | Input Parameter: |
827 | . coords - The coordinates of a segment |
828 | |
829 | Output Parameters: |
830 | + coords - The new y-coordinate, and 0 for x |
831 | - R - The rotation which accomplishes the projection |
832 | |
833 | Level: developer |
834 | |
835 | .seealso: DMPlexComputeProjection3Dto1D(), DMPlexComputeProjection3Dto2D() |
836 | @*/ |
837 | PetscErrorCode DMPlexComputeProjection2Dto1D(PetscScalar coords[], PetscReal R[]) |
838 | { |
839 | const PetscReal x = PetscRealPart(coords[2] - coords[0])(coords[2] - coords[0]); |
840 | const PetscReal y = PetscRealPart(coords[3] - coords[1])(coords[3] - coords[1]); |
841 | const PetscReal r = PetscSqrtReal(x*x + y*y)sqrt(x*x + y*y), c = x/r, s = y/r; |
842 | |
843 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 843; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
844 | R[0] = c; R[1] = -s; |
845 | R[2] = s; R[3] = c; |
846 | coords[0] = 0.0; |
847 | coords[1] = r; |
848 | 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); |
849 | } |
850 | |
851 | /*@C |
852 | DMPlexComputeProjection3Dto1D - Rewrite coordinates to be the 1D projection of the 3D coordinates |
853 | |
854 | Not collective |
855 | |
856 | Input Parameter: |
857 | . coords - The coordinates of a segment |
858 | |
859 | Output Parameters: |
860 | + coords - The new y-coordinate, and 0 for x and z |
861 | - R - The rotation which accomplishes the projection |
862 | |
863 | Note: This uses the basis completion described by Frisvad in http://www.imm.dtu.dk/~jerf/papers/abstracts/onb.html, DOI:10.1080/2165347X.2012.689606 |
864 | |
865 | Level: developer |
866 | |
867 | .seealso: DMPlexComputeProjection2Dto1D(), DMPlexComputeProjection3Dto2D() |
868 | @*/ |
869 | PetscErrorCode DMPlexComputeProjection3Dto1D(PetscScalar coords[], PetscReal R[]) |
870 | { |
871 | PetscReal x = PetscRealPart(coords[3] - coords[0])(coords[3] - coords[0]); |
872 | PetscReal y = PetscRealPart(coords[4] - coords[1])(coords[4] - coords[1]); |
873 | PetscReal z = PetscRealPart(coords[5] - coords[2])(coords[5] - coords[2]); |
874 | PetscReal r = PetscSqrtReal(x*x + y*y + z*z)sqrt(x*x + y*y + z*z); |
875 | PetscReal rinv = 1. / r; |
876 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 876; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
877 | |
878 | x *= rinv; y *= rinv; z *= rinv; |
879 | if (x > 0.) { |
880 | PetscReal inv1pX = 1./ (1. + x); |
881 | |
882 | R[0] = x; R[1] = -y; R[2] = -z; |
883 | R[3] = y; R[4] = 1. - y*y*inv1pX; R[5] = -y*z*inv1pX; |
884 | R[6] = z; R[7] = -y*z*inv1pX; R[8] = 1. - z*z*inv1pX; |
885 | } |
886 | else { |
887 | PetscReal inv1mX = 1./ (1. - x); |
888 | |
889 | R[0] = x; R[1] = z; R[2] = y; |
890 | R[3] = y; R[4] = -y*z*inv1mX; R[5] = 1. - y*y*inv1mX; |
891 | R[6] = z; R[7] = 1. - z*z*inv1mX; R[8] = -y*z*inv1mX; |
892 | } |
893 | coords[0] = 0.0; |
894 | coords[1] = r; |
895 | 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); |
896 | } |
897 | |
898 | /*@ |
899 | DMPlexComputeProjection3Dto2D - Rewrite coordinates to be the 2D projection of the 3D coordinates |
900 | |
901 | Not collective |
902 | |
903 | Input Parameter: |
904 | . coords - The coordinates of a segment |
905 | |
906 | Output Parameters: |
907 | + coords - The new y- and z-coordinates, and 0 for x |
908 | - R - The rotation which accomplishes the projection |
909 | |
910 | Level: developer |
911 | |
912 | .seealso: DMPlexComputeProjection2Dto1D(), DMPlexComputeProjection3Dto1D() |
913 | @*/ |
914 | PetscErrorCode DMPlexComputeProjection3Dto2D(PetscInt coordSize, PetscScalar coords[], PetscReal R[]) |
915 | { |
916 | PetscReal x1[3], x2[3], n[3], norm; |
917 | PetscReal x1p[3], x2p[3], xnp[3]; |
918 | PetscReal sqrtz, alpha; |
919 | const PetscInt dim = 3; |
920 | PetscInt d, e, p; |
921 | |
922 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 922; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
923 | /* 0) Calculate normal vector */ |
924 | for (d = 0; d < dim; ++d) { |
925 | x1[d] = PetscRealPart(coords[1*dim+d] - coords[0*dim+d])(coords[1*dim+d] - coords[0*dim+d]); |
926 | x2[d] = PetscRealPart(coords[2*dim+d] - coords[0*dim+d])(coords[2*dim+d] - coords[0*dim+d]); |
927 | } |
928 | n[0] = x1[1]*x2[2] - x1[2]*x2[1]; |
929 | n[1] = x1[2]*x2[0] - x1[0]*x2[2]; |
930 | n[2] = x1[0]*x2[1] - x1[1]*x2[0]; |
931 | norm = PetscSqrtReal(n[0]*n[0] + n[1]*n[1] + n[2]*n[2])sqrt(n[0]*n[0] + n[1]*n[1] + n[2]*n[2]); |
932 | n[0] /= norm; |
933 | n[1] /= norm; |
934 | n[2] /= norm; |
935 | /* 1) Take the normal vector and rotate until it is \hat z |
936 | |
937 | Let the normal vector be <nx, ny, nz> and alpha = 1/sqrt(1 - nz^2), then |
938 | |
939 | R = / alpha nx nz alpha ny nz -1/alpha \ |
940 | | -alpha ny alpha nx 0 | |
941 | \ nx ny nz / |
942 | |
943 | will rotate the normal vector to \hat z |
944 | */ |
945 | sqrtz = PetscSqrtReal(1.0 - n[2]*n[2])sqrt(1.0 - n[2]*n[2]); |
946 | /* Check for n = z */ |
947 | if (sqrtz < 1.0e-10) { |
948 | const PetscInt s = PetscSign(n[2])(((n[2]) >= 0) ? ((n[2]) == 0 ? 0 : 1) : -1); |
949 | /* If nz < 0, rotate 180 degrees around x-axis */ |
950 | for (p = 3; p < coordSize/3; ++p) { |
951 | coords[p*2+0] = PetscRealPart(coords[p*dim+0] - coords[0*dim+0])(coords[p*dim+0] - coords[0*dim+0]); |
952 | coords[p*2+1] = (PetscRealPart(coords[p*dim+1] - coords[0*dim+1])(coords[p*dim+1] - coords[0*dim+1])) * s; |
953 | } |
954 | coords[0] = 0.0; |
955 | coords[1] = 0.0; |
956 | coords[2] = x1[0]; |
957 | coords[3] = x1[1] * s; |
958 | coords[4] = x2[0]; |
959 | coords[5] = x2[1] * s; |
960 | R[0] = 1.0; R[1] = 0.0; R[2] = 0.0; |
961 | R[3] = 0.0; R[4] = 1.0 * s; R[5] = 0.0; |
962 | R[6] = 0.0; R[7] = 0.0; R[8] = 1.0 * s; |
963 | 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); |
964 | } |
965 | alpha = 1.0/sqrtz; |
966 | R[0] = alpha*n[0]*n[2]; R[1] = alpha*n[1]*n[2]; R[2] = -sqrtz; |
967 | R[3] = -alpha*n[1]; R[4] = alpha*n[0]; R[5] = 0.0; |
968 | R[6] = n[0]; R[7] = n[1]; R[8] = n[2]; |
969 | for (d = 0; d < dim; ++d) { |
970 | x1p[d] = 0.0; |
971 | x2p[d] = 0.0; |
972 | for (e = 0; e < dim; ++e) { |
973 | x1p[d] += R[d*dim+e]*x1[e]; |
974 | x2p[d] += R[d*dim+e]*x2[e]; |
975 | } |
976 | } |
977 | if (PetscAbsReal(x1p[2])fabs(x1p[2]) > 10. * PETSC_SMALL1.e-10) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid rotation calculated")return PetscError(((MPI_Comm)0x44000001),977,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,77,PETSC_ERROR_INITIAL,"Invalid rotation calculated"); |
978 | if (PetscAbsReal(x2p[2])fabs(x2p[2]) > 10. * PETSC_SMALL1.e-10) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid rotation calculated")return PetscError(((MPI_Comm)0x44000001),978,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,77,PETSC_ERROR_INITIAL,"Invalid rotation calculated"); |
979 | /* 2) Project to (x, y) */ |
980 | for (p = 3; p < coordSize/3; ++p) { |
981 | for (d = 0; d < dim; ++d) { |
982 | xnp[d] = 0.0; |
983 | for (e = 0; e < dim; ++e) { |
984 | xnp[d] += R[d*dim+e]*PetscRealPart(coords[p*dim+e] - coords[0*dim+e])(coords[p*dim+e] - coords[0*dim+e]); |
985 | } |
986 | if (d < dim-1) coords[p*2+d] = xnp[d]; |
987 | } |
988 | } |
989 | coords[0] = 0.0; |
990 | coords[1] = 0.0; |
991 | coords[2] = x1p[0]; |
992 | coords[3] = x1p[1]; |
993 | coords[4] = x2p[0]; |
994 | coords[5] = x2p[1]; |
995 | /* Output R^T which rotates \hat z to the input normal */ |
996 | for (d = 0; d < dim; ++d) { |
997 | for (e = d+1; e < dim; ++e) { |
998 | PetscReal tmp; |
999 | |
1000 | tmp = R[d*dim+e]; |
1001 | R[d*dim+e] = R[e*dim+d]; |
1002 | R[e*dim+d] = tmp; |
1003 | } |
1004 | } |
1005 | 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); |
1006 | } |
1007 | |
1008 | PETSC_UNUSED__attribute((unused)) |
1009 | PETSC_STATIC_INLINEstatic inline void Volume_Triangle_Internal(PetscReal *vol, PetscReal coords[]) |
1010 | { |
1011 | /* Signed volume is 1/2 the determinant |
1012 | |
1013 | | 1 1 1 | |
1014 | | x0 x1 x2 | |
1015 | | y0 y1 y2 | |
1016 | |
1017 | but if x0,y0 is the origin, we have |
1018 | |
1019 | | x1 x2 | |
1020 | | y1 y2 | |
1021 | */ |
1022 | const PetscReal x1 = coords[2] - coords[0], y1 = coords[3] - coords[1]; |
1023 | const PetscReal x2 = coords[4] - coords[0], y2 = coords[5] - coords[1]; |
1024 | PetscReal M[4], detM; |
1025 | M[0] = x1; M[1] = x2; |
1026 | M[2] = y1; M[3] = y2; |
1027 | DMPlex_Det2D_Internal(&detM, M); |
1028 | *vol = 0.5*detM; |
1029 | (void)PetscLogFlops(5.0); |
1030 | } |
1031 | |
1032 | PETSC_STATIC_INLINEstatic inline void Volume_Triangle_Origin_Internal(PetscReal *vol, PetscReal coords[]) |
1033 | { |
1034 | DMPlex_Det2D_Internal(vol, coords); |
1035 | *vol *= 0.5; |
1036 | } |
1037 | |
1038 | PETSC_UNUSED__attribute((unused)) |
1039 | PETSC_STATIC_INLINEstatic inline void Volume_Tetrahedron_Internal(PetscReal *vol, PetscReal coords[]) |
1040 | { |
1041 | /* Signed volume is 1/6th of the determinant |
1042 | |
1043 | | 1 1 1 1 | |
1044 | | x0 x1 x2 x3 | |
1045 | | y0 y1 y2 y3 | |
1046 | | z0 z1 z2 z3 | |
1047 | |
1048 | but if x0,y0,z0 is the origin, we have |
1049 | |
1050 | | x1 x2 x3 | |
1051 | | y1 y2 y3 | |
1052 | | z1 z2 z3 | |
1053 | */ |
1054 | const PetscReal x1 = coords[3] - coords[0], y1 = coords[4] - coords[1], z1 = coords[5] - coords[2]; |
1055 | const PetscReal x2 = coords[6] - coords[0], y2 = coords[7] - coords[1], z2 = coords[8] - coords[2]; |
1056 | const PetscReal x3 = coords[9] - coords[0], y3 = coords[10] - coords[1], z3 = coords[11] - coords[2]; |
1057 | const PetscReal onesixth = ((PetscReal)1./(PetscReal)6.); |
1058 | PetscReal M[9], detM; |
1059 | M[0] = x1; M[1] = x2; M[2] = x3; |
1060 | M[3] = y1; M[4] = y2; M[5] = y3; |
1061 | M[6] = z1; M[7] = z2; M[8] = z3; |
1062 | DMPlex_Det3D_Internal(&detM, M); |
1063 | *vol = -onesixth*detM; |
1064 | (void)PetscLogFlops(10.0); |
1065 | } |
1066 | |
1067 | PETSC_STATIC_INLINEstatic inline void Volume_Tetrahedron_Origin_Internal(PetscReal *vol, PetscReal coords[]) |
1068 | { |
1069 | const PetscReal onesixth = ((PetscReal)1./(PetscReal)6.); |
1070 | DMPlex_Det3D_Internal(vol, coords); |
1071 | *vol *= -onesixth; |
1072 | } |
1073 | |
1074 | static PetscErrorCode DMPlexComputePointGeometry_Internal(DM dm, PetscInt e, PetscReal v0[], PetscReal J[], PetscReal invJ[], PetscReal *detJ) |
1075 | { |
1076 | PetscSection coordSection; |
1077 | Vec coordinates; |
1078 | const PetscScalar *coords; |
1079 | PetscInt dim, d, off; |
1080 | PetscErrorCode ierr; |
1081 | |
1082 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1082; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1083 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1083,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1084 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1084,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1085 | ierr = PetscSectionGetDof(coordSection,e,&dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1085,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1086 | if (!dim) 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); |
1087 | ierr = PetscSectionGetOffset(coordSection,e,&off);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1087,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1088 | ierr = VecGetArrayRead(coordinates,&coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1088,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1089 | if (v0) {for (d = 0; d < dim; d++) v0[d] = PetscRealPart(coords[off + d])(coords[off + d]);} |
1090 | ierr = VecRestoreArrayRead(coordinates,&coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1090,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1091 | *detJ = 1.; |
1092 | if (J) { |
1093 | for (d = 0; d < dim * dim; d++) J[d] = 0.; |
1094 | for (d = 0; d < dim; d++) J[d * dim + d] = 1.; |
1095 | if (invJ) { |
1096 | for (d = 0; d < dim * dim; d++) invJ[d] = 0.; |
1097 | for (d = 0; d < dim; d++) invJ[d * dim + d] = 1.; |
1098 | } |
1099 | } |
1100 | 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); |
1101 | } |
1102 | |
1103 | static PetscErrorCode DMPlexComputeLineGeometry_Internal(DM dm, PetscInt e, PetscReal v0[], PetscReal J[], PetscReal invJ[], PetscReal *detJ) |
1104 | { |
1105 | PetscSection coordSection; |
1106 | Vec coordinates; |
1107 | PetscScalar *coords = NULL((void*)0); |
1108 | PetscInt numCoords, d, pStart, pEnd, numSelfCoords = 0; |
1109 | PetscErrorCode ierr; |
1110 | |
1111 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1111; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1112 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1112,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1113 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1113,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1114 | ierr = PetscSectionGetChart(coordSection,&pStart,&pEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1114,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1115 | if (e >= pStart && e < pEnd) {ierr = PetscSectionGetDof(coordSection,e,&numSelfCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1115,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
1116 | ierr = DMPlexVecGetClosure(dm, coordSection, coordinates, e, &numCoords, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1116,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1117 | numCoords = numSelfCoords ? numSelfCoords : numCoords; |
1118 | if (invJ && !J) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "In order to compute invJ, J must not be NULL")return PetscError(((MPI_Comm)0x44000001),1118,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"In order to compute invJ, J must not be NULL" ); |
1119 | *detJ = 0.0; |
1120 | if (numCoords == 6) { |
1121 | const PetscInt dim = 3; |
1122 | PetscReal R[9], J0; |
1123 | |
1124 | if (v0) {for (d = 0; d < dim; d++) v0[d] = PetscRealPart(coords[d])(coords[d]);} |
1125 | ierr = DMPlexComputeProjection3Dto1D(coords, R);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1125,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1126 | if (J) { |
1127 | J0 = 0.5*PetscRealPart(coords[1])(coords[1]); |
1128 | J[0] = R[0]*J0; J[1] = R[1]; J[2] = R[2]; |
1129 | J[3] = R[3]*J0; J[4] = R[4]; J[5] = R[5]; |
1130 | J[6] = R[6]*J0; J[7] = R[7]; J[8] = R[8]; |
1131 | DMPlex_Det3D_Internal(detJ, J); |
1132 | if (invJ) {DMPlex_Invert2D_Internal(invJ, J, *detJ);} |
1133 | } |
1134 | } else if (numCoords == 4) { |
1135 | const PetscInt dim = 2; |
1136 | PetscReal R[4], J0; |
1137 | |
1138 | if (v0) {for (d = 0; d < dim; d++) v0[d] = PetscRealPart(coords[d])(coords[d]);} |
1139 | ierr = DMPlexComputeProjection2Dto1D(coords, R);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1139,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1140 | if (J) { |
1141 | J0 = 0.5*PetscRealPart(coords[1])(coords[1]); |
1142 | J[0] = R[0]*J0; J[1] = R[1]; |
1143 | J[2] = R[2]*J0; J[3] = R[3]; |
1144 | DMPlex_Det2D_Internal(detJ, J); |
1145 | if (invJ) {DMPlex_Invert2D_Internal(invJ, J, *detJ);} |
1146 | } |
1147 | } else if (numCoords == 2) { |
1148 | const PetscInt dim = 1; |
1149 | |
1150 | if (v0) {for (d = 0; d < dim; d++) v0[d] = PetscRealPart(coords[d])(coords[d]);} |
1151 | if (J) { |
1152 | J[0] = 0.5*(PetscRealPart(coords[1])(coords[1]) - PetscRealPart(coords[0])(coords[0])); |
1153 | *detJ = J[0]; |
1154 | ierr = PetscLogFlops(2.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1154,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1155 | if (invJ) {invJ[0] = 1.0/J[0]; ierr = PetscLogFlops(1.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1155,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
1156 | } |
1157 | } else SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "The number of coordinates for this segment is %D != 2", numCoords)return PetscError(((MPI_Comm)0x44000001),1157,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"The number of coordinates for this segment is %D != 2" ,numCoords); |
1158 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordinates, e, &numCoords, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1158,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1159 | 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); |
1160 | } |
1161 | |
1162 | static PetscErrorCode DMPlexComputeTriangleGeometry_Internal(DM dm, PetscInt e, PetscReal v0[], PetscReal J[], PetscReal invJ[], PetscReal *detJ) |
1163 | { |
1164 | PetscSection coordSection; |
1165 | Vec coordinates; |
1166 | PetscScalar *coords = NULL((void*)0); |
1167 | PetscInt numCoords, numSelfCoords = 0, d, f, g, pStart, pEnd; |
1168 | PetscErrorCode ierr; |
1169 | |
1170 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1170; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1171 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1171,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1172 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1172,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1173 | ierr = PetscSectionGetChart(coordSection,&pStart,&pEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1173,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1174 | if (e >= pStart && e < pEnd) {ierr = PetscSectionGetDof(coordSection,e,&numSelfCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1174,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
1175 | ierr = DMPlexVecGetClosure(dm, coordSection, coordinates, e, &numCoords, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1175,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1176 | numCoords = numSelfCoords ? numSelfCoords : numCoords; |
1177 | *detJ = 0.0; |
1178 | if (numCoords == 9) { |
1179 | const PetscInt dim = 3; |
1180 | PetscReal R[9], J0[9] = {1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0}; |
1181 | |
1182 | if (v0) {for (d = 0; d < dim; d++) v0[d] = PetscRealPart(coords[d])(coords[d]);} |
1183 | ierr = DMPlexComputeProjection3Dto2D(numCoords, coords, R);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1183,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1184 | if (J) { |
1185 | const PetscInt pdim = 2; |
1186 | |
1187 | for (d = 0; d < pdim; d++) { |
1188 | for (f = 0; f < pdim; f++) { |
1189 | J0[d*dim+f] = 0.5*(PetscRealPart(coords[(f+1)*pdim+d])(coords[(f+1)*pdim+d]) - PetscRealPart(coords[0*pdim+d])(coords[0*pdim+d])); |
1190 | } |
1191 | } |
1192 | ierr = PetscLogFlops(8.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1192,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1193 | DMPlex_Det3D_Internal(detJ, J0); |
1194 | for (d = 0; d < dim; d++) { |
1195 | for (f = 0; f < dim; f++) { |
1196 | J[d*dim+f] = 0.0; |
1197 | for (g = 0; g < dim; g++) { |
1198 | J[d*dim+f] += R[d*dim+g]*J0[g*dim+f]; |
1199 | } |
1200 | } |
1201 | } |
1202 | ierr = PetscLogFlops(18.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1202,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1203 | } |
1204 | if (invJ) {DMPlex_Invert3D_Internal(invJ, J, *detJ);} |
1205 | } else if (numCoords == 6) { |
1206 | const PetscInt dim = 2; |
1207 | |
1208 | if (v0) {for (d = 0; d < dim; d++) v0[d] = PetscRealPart(coords[d])(coords[d]);} |
1209 | if (J) { |
1210 | for (d = 0; d < dim; d++) { |
1211 | for (f = 0; f < dim; f++) { |
1212 | J[d*dim+f] = 0.5*(PetscRealPart(coords[(f+1)*dim+d])(coords[(f+1)*dim+d]) - PetscRealPart(coords[0*dim+d])(coords[0*dim+d])); |
1213 | } |
1214 | } |
1215 | ierr = PetscLogFlops(8.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1215,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1216 | DMPlex_Det2D_Internal(detJ, J); |
1217 | } |
1218 | if (invJ) {DMPlex_Invert2D_Internal(invJ, J, *detJ);} |
1219 | } else SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "The number of coordinates for this triangle is %D != 6 or 9", numCoords)return PetscError(((MPI_Comm)0x44000001),1219,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"The number of coordinates for this triangle is %D != 6 or 9" ,numCoords); |
1220 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordinates, e, &numCoords, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1220,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1221 | 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); |
1222 | } |
1223 | |
1224 | static PetscErrorCode DMPlexComputeRectangleGeometry_Internal(DM dm, PetscInt e, PetscInt Nq, const PetscReal points[], PetscReal v[], PetscReal J[], PetscReal invJ[], PetscReal *detJ) |
1225 | { |
1226 | PetscSection coordSection; |
1227 | Vec coordinates; |
1228 | PetscScalar *coords = NULL((void*)0); |
1229 | PetscInt numCoords, numSelfCoords = 0, d, f, g, pStart, pEnd; |
1230 | PetscErrorCode ierr; |
1231 | |
1232 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1232; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1233 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1233,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1234 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1234,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1235 | ierr = PetscSectionGetChart(coordSection,&pStart,&pEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1235,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1236 | if (e >= pStart && e < pEnd) {ierr = PetscSectionGetDof(coordSection,e,&numSelfCoords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1236,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
1237 | ierr = DMPlexVecGetClosure(dm, coordSection, coordinates, e, &numCoords, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1237,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1238 | numCoords = numSelfCoords ? numSelfCoords : numCoords; |
1239 | if (!Nq) { |
1240 | *detJ = 0.0; |
1241 | if (numCoords == 12) { |
1242 | const PetscInt dim = 3; |
1243 | PetscReal R[9], J0[9] = {1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0}; |
1244 | |
1245 | if (v) {for (d = 0; d < dim; d++) v[d] = PetscRealPart(coords[d])(coords[d]);} |
1246 | ierr = DMPlexComputeProjection3Dto2D(numCoords, coords, R);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1246,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1247 | if (J) { |
1248 | const PetscInt pdim = 2; |
1249 | |
1250 | for (d = 0; d < pdim; d++) { |
1251 | J0[d*dim+0] = 0.5*(PetscRealPart(coords[1*pdim+d])(coords[1*pdim+d]) - PetscRealPart(coords[0*pdim+d])(coords[0*pdim+d])); |
1252 | J0[d*dim+1] = 0.5*(PetscRealPart(coords[2*pdim+d])(coords[2*pdim+d]) - PetscRealPart(coords[1*pdim+d])(coords[1*pdim+d])); |
1253 | } |
1254 | ierr = PetscLogFlops(8.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1254,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1255 | DMPlex_Det3D_Internal(detJ, J0); |
1256 | for (d = 0; d < dim; d++) { |
1257 | for (f = 0; f < dim; f++) { |
1258 | J[d*dim+f] = 0.0; |
1259 | for (g = 0; g < dim; g++) { |
1260 | J[d*dim+f] += R[d*dim+g]*J0[g*dim+f]; |
1261 | } |
1262 | } |
1263 | } |
1264 | ierr = PetscLogFlops(18.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1264,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1265 | } |
1266 | if (invJ) {DMPlex_Invert3D_Internal(invJ, J, *detJ);} |
1267 | } else if (numCoords == 8) { |
1268 | const PetscInt dim = 2; |
1269 | |
1270 | if (v) {for (d = 0; d < dim; d++) v[d] = PetscRealPart(coords[d])(coords[d]);} |
1271 | if (J) { |
1272 | for (d = 0; d < dim; d++) { |
1273 | J[d*dim+0] = 0.5*(PetscRealPart(coords[1*dim+d])(coords[1*dim+d]) - PetscRealPart(coords[0*dim+d])(coords[0*dim+d])); |
1274 | J[d*dim+1] = 0.5*(PetscRealPart(coords[3*dim+d])(coords[3*dim+d]) - PetscRealPart(coords[0*dim+d])(coords[0*dim+d])); |
1275 | } |
1276 | ierr = PetscLogFlops(8.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1276,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1277 | DMPlex_Det2D_Internal(detJ, J); |
1278 | } |
1279 | if (invJ) {DMPlex_Invert2D_Internal(invJ, J, *detJ);} |
1280 | } else SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "The number of coordinates for this quadrilateral is %D != 8 or 12", numCoords)return PetscError(((MPI_Comm)0x44000001),1280,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"The number of coordinates for this quadrilateral is %D != 8 or 12" ,numCoords); |
1281 | } else { |
1282 | const PetscInt Nv = 4; |
1283 | const PetscInt dimR = 2; |
1284 | const PetscInt zToPlex[4] = {0, 1, 3, 2}; |
1285 | PetscReal zOrder[12]; |
1286 | PetscReal zCoeff[12]; |
1287 | PetscInt i, j, k, l, dim; |
1288 | |
1289 | if (numCoords == 12) { |
1290 | dim = 3; |
1291 | } else if (numCoords == 8) { |
1292 | dim = 2; |
1293 | } else SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "The number of coordinates for this quadrilateral is %D != 8 or 12", numCoords)return PetscError(((MPI_Comm)0x44000001),1293,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"The number of coordinates for this quadrilateral is %D != 8 or 12" ,numCoords); |
1294 | for (i = 0; i < Nv; i++) { |
1295 | PetscInt zi = zToPlex[i]; |
1296 | |
1297 | for (j = 0; j < dim; j++) { |
1298 | zOrder[dim * i + j] = PetscRealPart(coords[dim * zi + j])(coords[dim * zi + j]); |
1299 | } |
1300 | } |
1301 | for (j = 0; j < dim; j++) { |
1302 | zCoeff[dim * 0 + j] = 0.25 * ( zOrder[dim * 0 + j] + zOrder[dim * 1 + j] + zOrder[dim * 2 + j] + zOrder[dim * 3 + j]); |
1303 | zCoeff[dim * 1 + j] = 0.25 * (- zOrder[dim * 0 + j] + zOrder[dim * 1 + j] - zOrder[dim * 2 + j] + zOrder[dim * 3 + j]); |
1304 | zCoeff[dim * 2 + j] = 0.25 * (- zOrder[dim * 0 + j] - zOrder[dim * 1 + j] + zOrder[dim * 2 + j] + zOrder[dim * 3 + j]); |
1305 | zCoeff[dim * 3 + j] = 0.25 * ( zOrder[dim * 0 + j] - zOrder[dim * 1 + j] - zOrder[dim * 2 + j] + zOrder[dim * 3 + j]); |
1306 | } |
1307 | for (i = 0; i < Nq; i++) { |
1308 | PetscReal xi = points[dimR * i], eta = points[dimR * i + 1]; |
1309 | |
1310 | if (v) { |
1311 | PetscReal extPoint[4]; |
1312 | |
1313 | extPoint[0] = 1.; |
1314 | extPoint[1] = xi; |
1315 | extPoint[2] = eta; |
1316 | extPoint[3] = xi * eta; |
1317 | for (j = 0; j < dim; j++) { |
1318 | PetscReal val = 0.; |
1319 | |
1320 | for (k = 0; k < Nv; k++) { |
1321 | val += extPoint[k] * zCoeff[dim * k + j]; |
1322 | } |
1323 | v[i * dim + j] = val; |
1324 | } |
1325 | } |
1326 | if (J) { |
1327 | PetscReal extJ[8]; |
1328 | |
1329 | extJ[0] = 0.; |
1330 | extJ[1] = 0.; |
1331 | extJ[2] = 1.; |
1332 | extJ[3] = 0.; |
1333 | extJ[4] = 0.; |
1334 | extJ[5] = 1.; |
1335 | extJ[6] = eta; |
1336 | extJ[7] = xi; |
1337 | for (j = 0; j < dim; j++) { |
1338 | for (k = 0; k < dimR; k++) { |
1339 | PetscReal val = 0.; |
1340 | |
1341 | for (l = 0; l < Nv; l++) { |
1342 | val += zCoeff[dim * l + j] * extJ[dimR * l + k]; |
1343 | } |
1344 | J[i * dim * dim + dim * j + k] = val; |
1345 | } |
1346 | } |
1347 | if (dim == 3) { /* put the cross product in the third component of the Jacobian */ |
1348 | PetscReal x, y, z; |
1349 | PetscReal *iJ = &J[i * dim * dim]; |
1350 | PetscReal norm; |
1351 | |
1352 | x = iJ[1 * dim + 0] * iJ[2 * dim + 1] - iJ[1 * dim + 1] * iJ[2 * dim + 0]; |
1353 | y = iJ[0 * dim + 1] * iJ[2 * dim + 0] - iJ[0 * dim + 0] * iJ[2 * dim + 1]; |
1354 | z = iJ[0 * dim + 0] * iJ[1 * dim + 1] - iJ[0 * dim + 1] * iJ[1 * dim + 0]; |
1355 | norm = PetscSqrtReal(x * x + y * y + z * z)sqrt(x * x + y * y + z * z); |
1356 | iJ[2] = x / norm; |
1357 | iJ[5] = y / norm; |
1358 | iJ[8] = z / norm; |
1359 | DMPlex_Det3D_Internal(&detJ[i], &J[i * dim * dim]); |
1360 | if (invJ) {DMPlex_Invert3D_Internal(&invJ[i * dim * dim], &J[i * dim * dim], detJ[i]);} |
1361 | } else { |
1362 | DMPlex_Det2D_Internal(&detJ[i], &J[i * dim * dim]); |
1363 | if (invJ) {DMPlex_Invert2D_Internal(&invJ[i * dim * dim], &J[i * dim * dim], detJ[i]);} |
1364 | } |
1365 | } |
1366 | } |
1367 | } |
1368 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordinates, e, &numCoords, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1368,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1369 | 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); |
1370 | } |
1371 | |
1372 | static PetscErrorCode DMPlexComputeTetrahedronGeometry_Internal(DM dm, PetscInt e, PetscReal v0[], PetscReal J[], PetscReal invJ[], PetscReal *detJ) |
1373 | { |
1374 | PetscSection coordSection; |
1375 | Vec coordinates; |
1376 | PetscScalar *coords = NULL((void*)0); |
1377 | const PetscInt dim = 3; |
1378 | PetscInt d; |
1379 | PetscErrorCode ierr; |
1380 | |
1381 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1381; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1382 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1382,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1383 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1383,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1384 | ierr = DMPlexVecGetClosure(dm, coordSection, coordinates, e, NULL((void*)0), &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1384,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1385 | *detJ = 0.0; |
1386 | if (v0) {for (d = 0; d < dim; d++) v0[d] = PetscRealPart(coords[d])(coords[d]);} |
1387 | if (J) { |
1388 | for (d = 0; d < dim; d++) { |
1389 | /* I orient with outward face normals */ |
1390 | J[d*dim+0] = 0.5*(PetscRealPart(coords[2*dim+d])(coords[2*dim+d]) - PetscRealPart(coords[0*dim+d])(coords[0*dim+d])); |
1391 | J[d*dim+1] = 0.5*(PetscRealPart(coords[1*dim+d])(coords[1*dim+d]) - PetscRealPart(coords[0*dim+d])(coords[0*dim+d])); |
1392 | J[d*dim+2] = 0.5*(PetscRealPart(coords[3*dim+d])(coords[3*dim+d]) - PetscRealPart(coords[0*dim+d])(coords[0*dim+d])); |
1393 | } |
1394 | ierr = PetscLogFlops(18.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1394,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1395 | DMPlex_Det3D_Internal(detJ, J); |
1396 | } |
1397 | if (invJ) {DMPlex_Invert3D_Internal(invJ, J, *detJ);} |
1398 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordinates, e, NULL((void*)0), &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1398,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1399 | 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); |
1400 | } |
1401 | |
1402 | static PetscErrorCode DMPlexComputeHexahedronGeometry_Internal(DM dm, PetscInt e, PetscInt Nq, const PetscReal points[], PetscReal v[], PetscReal J[], PetscReal invJ[], PetscReal *detJ) |
1403 | { |
1404 | PetscSection coordSection; |
1405 | Vec coordinates; |
1406 | PetscScalar *coords = NULL((void*)0); |
1407 | const PetscInt dim = 3; |
1408 | PetscInt d; |
1409 | PetscErrorCode ierr; |
1410 | |
1411 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1411; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1412 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1412,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1413 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1413,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1414 | ierr = DMPlexVecGetClosure(dm, coordSection, coordinates, e, NULL((void*)0), &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1414,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1415 | if (!Nq) { |
1416 | *detJ = 0.0; |
1417 | if (v) {for (d = 0; d < dim; d++) v[d] = PetscRealPart(coords[d])(coords[d]);} |
1418 | if (J) { |
1419 | for (d = 0; d < dim; d++) { |
1420 | J[d*dim+0] = 0.5*(PetscRealPart(coords[3*dim+d])(coords[3*dim+d]) - PetscRealPart(coords[0*dim+d])(coords[0*dim+d])); |
1421 | J[d*dim+1] = 0.5*(PetscRealPart(coords[1*dim+d])(coords[1*dim+d]) - PetscRealPart(coords[0*dim+d])(coords[0*dim+d])); |
1422 | J[d*dim+2] = 0.5*(PetscRealPart(coords[4*dim+d])(coords[4*dim+d]) - PetscRealPart(coords[0*dim+d])(coords[0*dim+d])); |
1423 | } |
1424 | ierr = PetscLogFlops(18.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1424,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1425 | DMPlex_Det3D_Internal(detJ, J); |
1426 | } |
1427 | if (invJ) {DMPlex_Invert3D_Internal(invJ, J, *detJ);} |
1428 | } else { |
1429 | const PetscInt Nv = 8; |
1430 | const PetscInt zToPlex[8] = {0, 3, 1, 2, 4, 5, 7, 6}; |
1431 | const PetscInt dim = 3; |
1432 | const PetscInt dimR = 3; |
1433 | PetscReal zOrder[24]; |
1434 | PetscReal zCoeff[24]; |
1435 | PetscInt i, j, k, l; |
1436 | |
1437 | for (i = 0; i < Nv; i++) { |
1438 | PetscInt zi = zToPlex[i]; |
1439 | |
1440 | for (j = 0; j < dim; j++) { |
1441 | zOrder[dim * i + j] = PetscRealPart(coords[dim * zi + j])(coords[dim * zi + j]); |
1442 | } |
1443 | } |
1444 | for (j = 0; j < dim; j++) { |
1445 | zCoeff[dim * 0 + j] = 0.125 * ( zOrder[dim * 0 + j] + zOrder[dim * 1 + j] + zOrder[dim * 2 + j] + zOrder[dim * 3 + j] + zOrder[dim * 4 + j] + zOrder[dim * 5 + j] + zOrder[dim * 6 + j] + zOrder[dim * 7 + j]); |
1446 | zCoeff[dim * 1 + j] = 0.125 * (- zOrder[dim * 0 + j] + zOrder[dim * 1 + j] - zOrder[dim * 2 + j] + zOrder[dim * 3 + j] - zOrder[dim * 4 + j] + zOrder[dim * 5 + j] - zOrder[dim * 6 + j] + zOrder[dim * 7 + j]); |
1447 | zCoeff[dim * 2 + j] = 0.125 * (- zOrder[dim * 0 + j] - zOrder[dim * 1 + j] + zOrder[dim * 2 + j] + zOrder[dim * 3 + j] - zOrder[dim * 4 + j] - zOrder[dim * 5 + j] + zOrder[dim * 6 + j] + zOrder[dim * 7 + j]); |
1448 | zCoeff[dim * 3 + j] = 0.125 * ( zOrder[dim * 0 + j] - zOrder[dim * 1 + j] - zOrder[dim * 2 + j] + zOrder[dim * 3 + j] + zOrder[dim * 4 + j] - zOrder[dim * 5 + j] - zOrder[dim * 6 + j] + zOrder[dim * 7 + j]); |
1449 | zCoeff[dim * 4 + j] = 0.125 * (- zOrder[dim * 0 + j] - zOrder[dim * 1 + j] - zOrder[dim * 2 + j] - zOrder[dim * 3 + j] + zOrder[dim * 4 + j] + zOrder[dim * 5 + j] + zOrder[dim * 6 + j] + zOrder[dim * 7 + j]); |
1450 | zCoeff[dim * 5 + j] = 0.125 * (+ zOrder[dim * 0 + j] - zOrder[dim * 1 + j] + zOrder[dim * 2 + j] - zOrder[dim * 3 + j] - zOrder[dim * 4 + j] + zOrder[dim * 5 + j] - zOrder[dim * 6 + j] + zOrder[dim * 7 + j]); |
1451 | zCoeff[dim * 6 + j] = 0.125 * (+ zOrder[dim * 0 + j] + zOrder[dim * 1 + j] - zOrder[dim * 2 + j] - zOrder[dim * 3 + j] - zOrder[dim * 4 + j] - zOrder[dim * 5 + j] + zOrder[dim * 6 + j] + zOrder[dim * 7 + j]); |
1452 | zCoeff[dim * 7 + j] = 0.125 * (- zOrder[dim * 0 + j] + zOrder[dim * 1 + j] + zOrder[dim * 2 + j] - zOrder[dim * 3 + j] + zOrder[dim * 4 + j] - zOrder[dim * 5 + j] - zOrder[dim * 6 + j] + zOrder[dim * 7 + j]); |
1453 | } |
1454 | for (i = 0; i < Nq; i++) { |
1455 | PetscReal xi = points[dimR * i], eta = points[dimR * i + 1], theta = points[dimR * i + 2]; |
1456 | |
1457 | if (v) { |
1458 | PetscReal extPoint[8]; |
1459 | |
1460 | extPoint[0] = 1.; |
1461 | extPoint[1] = xi; |
1462 | extPoint[2] = eta; |
1463 | extPoint[3] = xi * eta; |
1464 | extPoint[4] = theta; |
1465 | extPoint[5] = theta * xi; |
1466 | extPoint[6] = theta * eta; |
1467 | extPoint[7] = theta * eta * xi; |
1468 | for (j = 0; j < dim; j++) { |
1469 | PetscReal val = 0.; |
1470 | |
1471 | for (k = 0; k < Nv; k++) { |
1472 | val += extPoint[k] * zCoeff[dim * k + j]; |
1473 | } |
1474 | v[i * dim + j] = val; |
1475 | } |
1476 | } |
1477 | if (J) { |
1478 | PetscReal extJ[24]; |
1479 | |
1480 | extJ[0] = 0. ; extJ[1] = 0. ; extJ[2] = 0. ; |
1481 | extJ[3] = 1. ; extJ[4] = 0. ; extJ[5] = 0. ; |
1482 | extJ[6] = 0. ; extJ[7] = 1. ; extJ[8] = 0. ; |
1483 | extJ[9] = eta ; extJ[10] = xi ; extJ[11] = 0. ; |
1484 | extJ[12] = 0. ; extJ[13] = 0. ; extJ[14] = 1. ; |
1485 | extJ[15] = theta ; extJ[16] = 0. ; extJ[17] = xi ; |
1486 | extJ[18] = 0. ; extJ[19] = theta ; extJ[20] = eta ; |
1487 | extJ[21] = theta * eta; extJ[22] = theta * xi; extJ[23] = eta * xi; |
1488 | |
1489 | for (j = 0; j < dim; j++) { |
1490 | for (k = 0; k < dimR; k++) { |
1491 | PetscReal val = 0.; |
1492 | |
1493 | for (l = 0; l < Nv; l++) { |
1494 | val += zCoeff[dim * l + j] * extJ[dimR * l + k]; |
1495 | } |
1496 | J[i * dim * dim + dim * j + k] = val; |
1497 | } |
1498 | } |
1499 | DMPlex_Det3D_Internal(&detJ[i], &J[i * dim * dim]); |
1500 | if (invJ) {DMPlex_Invert3D_Internal(&invJ[i * dim * dim], &J[i * dim * dim], detJ[i]);} |
1501 | } |
1502 | } |
1503 | } |
1504 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordinates, e, NULL((void*)0), &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1504,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1505 | 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); |
1506 | } |
1507 | |
1508 | static PetscErrorCode DMPlexComputeCellGeometryFEM_Implicit(DM dm, PetscInt cell, PetscQuadrature quad, PetscReal *v, PetscReal *J, PetscReal *invJ, PetscReal *detJ) |
1509 | { |
1510 | PetscInt depth, dim, coordDim, coneSize, i; |
1511 | PetscInt Nq = 0; |
1512 | const PetscReal *points = NULL((void*)0); |
1513 | DMLabel depthLabel; |
1514 | PetscReal xi0[3] = {-1.,-1.,-1.}, v0[3], J0[9], detJ0; |
1515 | PetscBool isAffine = PETSC_TRUE; |
1516 | PetscErrorCode ierr; |
1517 | |
1518 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1518; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1519 | ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1519,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1520 | ierr = DMPlexGetConeSize(dm, cell, &coneSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1520,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1521 | ierr = DMPlexGetDepthLabel(dm, &depthLabel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1521,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1522 | ierr = DMLabelGetValue(depthLabel, cell, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1522,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1523 | if (depth == 1 && dim == 1) { |
1524 | ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1524,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1525 | } |
1526 | ierr = DMGetCoordinateDim(dm, &coordDim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1526,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1527 | if (coordDim > 3) SETERRQ1(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Unsupported coordinate dimension %D > 3", coordDim)return PetscError(PetscObjectComm((PetscObject)dm),1527,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"Unsupported coordinate dimension %D > 3" ,coordDim); |
1528 | if (quad) {ierr = PetscQuadratureGetData(quad, NULL((void*)0), NULL((void*)0), &Nq, &points, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1528,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
1529 | switch (dim) { |
1530 | case 0: |
1531 | ierr = DMPlexComputePointGeometry_Internal(dm, cell, v, J, invJ, detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1531,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1532 | isAffine = PETSC_FALSE; |
1533 | break; |
1534 | case 1: |
1535 | if (Nq) { |
1536 | ierr = DMPlexComputeLineGeometry_Internal(dm, cell, v0, J0, NULL((void*)0), &detJ0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1536,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1537 | } else { |
1538 | ierr = DMPlexComputeLineGeometry_Internal(dm, cell, v, J, invJ, detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1538,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1539 | } |
1540 | break; |
1541 | case 2: |
1542 | switch (coneSize) { |
1543 | case 3: |
1544 | if (Nq) { |
1545 | ierr = DMPlexComputeTriangleGeometry_Internal(dm, cell, v0, J0, NULL((void*)0), &detJ0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1545,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1546 | } else { |
1547 | ierr = DMPlexComputeTriangleGeometry_Internal(dm, cell, v, J, invJ, detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1547,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1548 | } |
1549 | break; |
1550 | case 4: |
1551 | ierr = DMPlexComputeRectangleGeometry_Internal(dm, cell, Nq, points, v, J, invJ, detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1551,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1552 | isAffine = PETSC_FALSE; |
1553 | break; |
1554 | default: |
1555 | SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Unsupported number of faces %D in cell %D for element geometry computation", coneSize, cell)return PetscError(PetscObjectComm((PetscObject)dm),1555,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"Unsupported number of faces %D in cell %D for element geometry computation" ,coneSize,cell); |
1556 | } |
1557 | break; |
1558 | case 3: |
1559 | switch (coneSize) { |
1560 | case 4: |
1561 | if (Nq) { |
1562 | ierr = DMPlexComputeTetrahedronGeometry_Internal(dm, cell, v0, J0, NULL((void*)0), &detJ0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1562,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1563 | } else { |
1564 | ierr = DMPlexComputeTetrahedronGeometry_Internal(dm, cell, v, J, invJ, detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1564,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1565 | } |
1566 | break; |
1567 | case 6: /* Faces */ |
1568 | case 8: /* Vertices */ |
1569 | ierr = DMPlexComputeHexahedronGeometry_Internal(dm, cell, Nq, points, v, J, invJ, detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1569,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1570 | isAffine = PETSC_FALSE; |
1571 | break; |
1572 | default: |
1573 | SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Unsupported number of faces %D in cell %D for element geometry computation", coneSize, cell)return PetscError(PetscObjectComm((PetscObject)dm),1573,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"Unsupported number of faces %D in cell %D for element geometry computation" ,coneSize,cell); |
1574 | } |
1575 | break; |
1576 | default: |
1577 | SETERRQ1(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Unsupported dimension %D for element geometry computation", dim)return PetscError(PetscObjectComm((PetscObject)dm),1577,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"Unsupported dimension %D for element geometry computation" ,dim); |
1578 | } |
1579 | if (isAffine && Nq) { |
1580 | if (v) { |
1581 | for (i = 0; i < Nq; i++) { |
1582 | CoordinatesRefToReal(coordDim, dim, xi0, v0, J0, &points[dim * i], &v[coordDim * i]); |
1583 | } |
1584 | } |
1585 | if (detJ) { |
1586 | for (i = 0; i < Nq; i++) { |
1587 | detJ[i] = detJ0; |
1588 | } |
1589 | } |
1590 | if (J) { |
1591 | PetscInt k; |
1592 | |
1593 | for (i = 0, k = 0; i < Nq; i++) { |
1594 | PetscInt j; |
1595 | |
1596 | for (j = 0; j < coordDim * coordDim; j++, k++) { |
1597 | J[k] = J0[j]; |
1598 | } |
1599 | } |
1600 | } |
1601 | if (invJ) { |
1602 | PetscInt k; |
1603 | switch (coordDim) { |
1604 | case 0: |
1605 | break; |
1606 | case 1: |
1607 | invJ[0] = 1./J0[0]; |
1608 | break; |
1609 | case 2: |
1610 | DMPlex_Invert2D_Internal(invJ, J0, detJ0); |
1611 | break; |
1612 | case 3: |
1613 | DMPlex_Invert3D_Internal(invJ, J0, detJ0); |
1614 | break; |
1615 | } |
1616 | for (i = 1, k = coordDim * coordDim; i < Nq; i++) { |
1617 | PetscInt j; |
1618 | |
1619 | for (j = 0; j < coordDim * coordDim; j++, k++) { |
1620 | invJ[k] = invJ[j]; |
1621 | } |
1622 | } |
1623 | } |
1624 | } |
1625 | 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); |
1626 | } |
1627 | |
1628 | /*@C |
1629 | DMPlexComputeCellGeometryAffineFEM - Assuming an affine map, compute the Jacobian, inverse Jacobian, and Jacobian determinant for a given cell |
1630 | |
1631 | Collective on dm |
1632 | |
1633 | Input Arguments: |
1634 | + dm - the DM |
1635 | - cell - the cell |
1636 | |
1637 | Output Arguments: |
1638 | + v0 - the translation part of this affine transform |
1639 | . J - the Jacobian of the transform from the reference element |
1640 | . invJ - the inverse of the Jacobian |
1641 | - detJ - the Jacobian determinant |
1642 | |
1643 | Level: advanced |
1644 | |
1645 | Fortran Notes: |
1646 | Since it returns arrays, this routine is only available in Fortran 90, and you must |
1647 | include petsc.h90 in your code. |
1648 | |
1649 | .seealso: DMPlexComputeCellGeometryFEM(), DMGetCoordinateSection(), DMGetCoordinates() |
1650 | @*/ |
1651 | PetscErrorCode DMPlexComputeCellGeometryAffineFEM(DM dm, PetscInt cell, PetscReal *v0, PetscReal *J, PetscReal *invJ, PetscReal *detJ) |
1652 | { |
1653 | PetscErrorCode ierr; |
1654 | |
1655 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1655; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1656 | ierr = DMPlexComputeCellGeometryFEM_Implicit(dm,cell,NULL((void*)0),v0,J,invJ,detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1656,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1657 | 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); |
1658 | } |
1659 | |
1660 | static PetscErrorCode DMPlexComputeCellGeometryFEM_FE(DM dm, PetscFE fe, PetscInt point, PetscQuadrature quad, PetscReal v[], PetscReal J[], PetscReal invJ[], PetscReal *detJ) |
1661 | { |
1662 | PetscQuadrature feQuad; |
1663 | PetscSection coordSection; |
1664 | Vec coordinates; |
1665 | PetscScalar *coords = NULL((void*)0); |
1666 | const PetscReal *quadPoints; |
1667 | PetscReal *basisDer, *basis, detJt; |
1668 | PetscInt dim, cdim, pdim, qdim, Nq, numCoords, q; |
1669 | PetscErrorCode ierr; |
1670 | |
1671 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1671; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1672 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1672,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1673 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1673,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1674 | ierr = DMPlexVecGetClosure(dm, coordSection, coordinates, point, &numCoords, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1674,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1675 | ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1675,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1676 | ierr = DMGetCoordinateDim(dm, &cdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1676,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1677 | if (!quad) { /* use the first point of the first functional of the dual space */ |
1678 | PetscDualSpace dsp; |
1679 | |
1680 | ierr = PetscFEGetDualSpace(fe, &dsp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1680,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1681 | ierr = PetscDualSpaceGetFunctional(dsp, 0, &quad);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1681,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1682 | ierr = PetscQuadratureGetData(quad, &qdim, NULL((void*)0), &Nq, &quadPoints, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1682,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1683 | Nq = 1; |
1684 | } else { |
1685 | ierr = PetscQuadratureGetData(quad, &qdim, NULL((void*)0), &Nq, &quadPoints, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1685,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1686 | } |
1687 | ierr = PetscFEGetDimension(fe, &pdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1687,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1688 | ierr = PetscFEGetQuadrature(fe, &feQuad);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1688,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1689 | if (feQuad == quad) { |
1690 | ierr = PetscFEGetDefaultTabulation(fe, &basis, J ? &basisDer : NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1690,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1691 | if (numCoords != pdim*cdim) SETERRQ4(PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "There are %d coordinates for point %d != %d*%d", numCoords, point, pdim, cdim)return PetscError(((MPI_Comm)0x44000001),1691,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,60,PETSC_ERROR_INITIAL,"There are %d coordinates for point %d != %d*%d" ,numCoords,point,pdim,cdim); |
1692 | } else { |
1693 | ierr = PetscFEGetTabulation(fe, Nq, quadPoints, &basis, J ? &basisDer : NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1693,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1694 | } |
1695 | if (qdim != dim) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Point dimension %d != quadrature dimension %d", dim, qdim)return PetscError(((MPI_Comm)0x44000001),1695,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,60,PETSC_ERROR_INITIAL,"Point dimension %d != quadrature dimension %d" ,dim,qdim); |
1696 | if (v) { |
1697 | ierr = PetscArrayzero(v, Nq*cdim)PetscMemzero(v,(Nq*cdim)*sizeof(*(v)));;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1697,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1698 | for (q = 0; q < Nq; ++q) { |
1699 | PetscInt i, k; |
1700 | |
1701 | for (k = 0; k < pdim; ++k) |
1702 | for (i = 0; i < cdim; ++i) |
1703 | v[q*cdim + i] += basis[q*pdim + k] * PetscRealPart(coords[k*cdim + i])(coords[k*cdim + i]); |
1704 | ierr = PetscLogFlops(2.0*pdim*cdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1704,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1705 | } |
1706 | } |
1707 | if (J) { |
1708 | ierr = PetscArrayzero(J, Nq*cdim*cdim)PetscMemzero(J,(Nq*cdim*cdim)*sizeof(*(J)));;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1708,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1709 | for (q = 0; q < Nq; ++q) { |
1710 | PetscInt i, j, k, c, r; |
1711 | |
1712 | /* J = dx_i/d\xi_j = sum[k=0,n-1] dN_k/d\xi_j * x_i(k) */ |
1713 | for (k = 0; k < pdim; ++k) |
1714 | for (j = 0; j < dim; ++j) |
1715 | for (i = 0; i < cdim; ++i) |
1716 | J[(q*cdim + i)*cdim + j] += basisDer[(q*pdim + k)*dim + j] * PetscRealPart(coords[k*cdim + i])(coords[k*cdim + i]); |
1717 | ierr = PetscLogFlops(2.0*pdim*dim*cdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1717,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1718 | if (cdim > dim) { |
1719 | for (c = dim; c < cdim; ++c) |
1720 | for (r = 0; r < cdim; ++r) |
1721 | J[r*cdim+c] = r == c ? 1.0 : 0.0; |
1722 | } |
1723 | if (!detJ && !invJ) continue; |
1724 | detJt = 0.; |
1725 | switch (cdim) { |
1726 | case 3: |
1727 | DMPlex_Det3D_Internal(&detJt, &J[q*cdim*dim]); |
1728 | if (invJ) {DMPlex_Invert3D_Internal(&invJ[q*cdim*dim], &J[q*cdim*dim], detJt);} |
1729 | break; |
1730 | case 2: |
1731 | DMPlex_Det2D_Internal(&detJt, &J[q*cdim*dim]); |
1732 | if (invJ) {DMPlex_Invert2D_Internal(&invJ[q*cdim*dim], &J[q*cdim*dim], detJt);} |
1733 | break; |
1734 | case 1: |
1735 | detJt = J[q*cdim*dim]; |
1736 | if (invJ) invJ[q*cdim*dim] = 1.0/detJt; |
1737 | } |
1738 | if (detJ) detJ[q] = detJt; |
1739 | } |
1740 | } |
1741 | else if (detJ || invJ) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Need J to compute invJ or detJ")return PetscError(((MPI_Comm)0x44000001),1741,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,60,PETSC_ERROR_INITIAL,"Need J to compute invJ or detJ"); |
1742 | if (feQuad != quad) { |
1743 | ierr = PetscFERestoreTabulation(fe, Nq, quadPoints, &basis, J ? &basisDer : NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1743,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1744 | } |
1745 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordinates, point, &numCoords, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1745,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1746 | 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); |
1747 | } |
1748 | |
1749 | /*@C |
1750 | DMPlexComputeCellGeometryFEM - Compute the Jacobian, inverse Jacobian, and Jacobian determinant at each quadrature point in the given cell |
1751 | |
1752 | Collective on dm |
1753 | |
1754 | Input Arguments: |
1755 | + dm - the DM |
1756 | . cell - the cell |
1757 | - quad - the quadrature containing the points in the reference element where the geometry will be evaluated. If quad == NULL, geometry will be |
1758 | evaluated at the first vertex of the reference element |
1759 | |
1760 | Output Arguments: |
1761 | + v - the image of the transformed quadrature points, otherwise the image of the first vertex in the closure of the reference element |
1762 | . J - the Jacobian of the transform from the reference element at each quadrature point |
1763 | . invJ - the inverse of the Jacobian at each quadrature point |
1764 | - detJ - the Jacobian determinant at each quadrature point |
1765 | |
1766 | Level: advanced |
1767 | |
1768 | Fortran Notes: |
1769 | Since it returns arrays, this routine is only available in Fortran 90, and you must |
1770 | include petsc.h90 in your code. |
1771 | |
1772 | .seealso: DMGetCoordinateSection(), DMGetCoordinates() |
1773 | @*/ |
1774 | PetscErrorCode DMPlexComputeCellGeometryFEM(DM dm, PetscInt cell, PetscQuadrature quad, PetscReal *v, PetscReal *J, PetscReal *invJ, PetscReal *detJ) |
1775 | { |
1776 | DM cdm; |
1777 | PetscFE fe = NULL((void*)0); |
1778 | PetscErrorCode ierr; |
1779 | |
1780 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1780; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1781 | PetscValidPointer(detJ, 7)do { if (!detJ) return PetscError(((MPI_Comm)0x44000001),1781 ,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",7); if (!PetscCheckPointer(detJ,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),1781,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",7); } while (0); |
1782 | ierr = DMGetCoordinateDM(dm, &cdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1782,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1783 | if (cdm) { |
1784 | PetscClassId id; |
1785 | PetscInt numFields; |
1786 | PetscDS prob; |
1787 | PetscObject disc; |
1788 | |
1789 | ierr = DMGetNumFields(cdm, &numFields);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1789,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1790 | if (numFields) { |
1791 | ierr = DMGetDS(cdm, &prob);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1791,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1792 | ierr = PetscDSGetDiscretization(prob,0,&disc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1792,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1793 | ierr = PetscObjectGetClassId(disc,&id);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1793,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1794 | if (id == PETSCFE_CLASSID) { |
1795 | fe = (PetscFE) disc; |
1796 | } |
1797 | } |
1798 | } |
1799 | if (!fe) {ierr = DMPlexComputeCellGeometryFEM_Implicit(dm, cell, quad, v, J, invJ, detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1799,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
1800 | else {ierr = DMPlexComputeCellGeometryFEM_FE(dm, fe, cell, quad, v, J, invJ, detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1800,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
1801 | 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); |
1802 | } |
1803 | |
1804 | static PetscErrorCode DMPlexComputeGeometryFVM_1D_Internal(DM dm, PetscInt dim, PetscInt cell, PetscReal *vol, PetscReal centroid[], PetscReal normal[]) |
1805 | { |
1806 | PetscSection coordSection; |
1807 | Vec coordinates; |
1808 | PetscScalar *coords = NULL((void*)0); |
1809 | PetscScalar tmp[2]; |
1810 | PetscInt coordSize; |
1811 | PetscErrorCode ierr; |
1812 | |
1813 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1813; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1814 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1814,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1815 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1815,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1816 | ierr = DMPlexVecGetClosure(dm, coordSection, coordinates, cell, &coordSize, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1816,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1817 | if (dim != 2) SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "We only support 2D edges right now")return PetscError(PetscObjectComm((PetscObject)dm),1817,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"We only support 2D edges right now"); |
1818 | ierr = DMLocalizeCoordinate_Internal(dm, dim, coords, &coords[dim], tmp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1818,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1819 | if (centroid) { |
1820 | centroid[0] = 0.5*PetscRealPart(coords[0] + tmp[0])(coords[0] + tmp[0]); |
1821 | centroid[1] = 0.5*PetscRealPart(coords[1] + tmp[1])(coords[1] + tmp[1]); |
1822 | } |
1823 | if (normal) { |
1824 | PetscReal norm; |
1825 | |
1826 | normal[0] = -PetscRealPart(coords[1] - tmp[1])(coords[1] - tmp[1]); |
1827 | normal[1] = PetscRealPart(coords[0] - tmp[0])(coords[0] - tmp[0]); |
1828 | norm = PetscSqrtReal(normal[0]*normal[0] + normal[1]*normal[1])sqrt(normal[0]*normal[0] + normal[1]*normal[1]); |
1829 | normal[0] /= norm; |
1830 | normal[1] /= norm; |
1831 | } |
1832 | if (vol) { |
1833 | *vol = PetscSqrtReal(PetscSqr(PetscRealPart(coords[0] - tmp[0])) + PetscSqr(PetscRealPart(coords[1] - tmp[1])))sqrt((((coords[0] - tmp[0]))*((coords[0] - tmp[0]))) + (((coords [1] - tmp[1]))*((coords[1] - tmp[1])))); |
1834 | } |
1835 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordinates, cell, &coordSize, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1835,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1836 | 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); |
1837 | } |
1838 | |
1839 | /* Centroid_i = (\sum_n A_n Cn_i ) / A */ |
1840 | static PetscErrorCode DMPlexComputeGeometryFVM_2D_Internal(DM dm, PetscInt dim, PetscInt cell, PetscReal *vol, PetscReal centroid[], PetscReal normal[]) |
1841 | { |
1842 | DMLabel depth; |
1843 | PetscSection coordSection; |
1844 | Vec coordinates; |
1845 | PetscScalar *coords = NULL((void*)0); |
1846 | PetscReal vsum = 0.0, csum[3] = {0.0, 0.0, 0.0}, vtmp, ctmp[4], v0[3], R[9]; |
1847 | PetscBool isHybrid = PETSC_FALSE; |
1848 | PetscInt fv[4] = {0, 1, 2, 3}; |
1849 | PetscInt cdepth, pEndInterior[4], tdim = 2, coordSize, numCorners, p, d, e; |
1850 | PetscErrorCode ierr; |
1851 | |
1852 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1852; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1853 | /* Must check for hybrid cells because prisms have a different orientation scheme */ |
1854 | ierr = DMPlexGetDepthLabel(dm, &depth);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1854,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1855 | ierr = DMLabelGetValue(depth, cell, &cdepth);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1855,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1856 | ierr = DMPlexGetHybridBounds(dm, &pEndInterior[3], &pEndInterior[2], &pEndInterior[1], &pEndInterior[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1856,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1857 | if ((pEndInterior[cdepth]) >=0 && (cell >= pEndInterior[cdepth])) isHybrid = PETSC_TRUE; |
1858 | |
1859 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1859,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1860 | ierr = DMPlexGetConeSize(dm, cell, &numCorners);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1860,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1861 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1861,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1862 | ierr = DMPlexVecGetClosure(dm, coordSection, coordinates, cell, &coordSize, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1862,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1863 | ierr = DMGetCoordinateDim(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1863,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1864 | /* Side faces for hybrid cells are are stored as tensor products */ |
1865 | if (isHybrid && numCorners == 4) {fv[2] = 3; fv[3] = 2;} |
1866 | |
1867 | if (dim > 2 && centroid) { |
1868 | v0[0] = PetscRealPart(coords[0])(coords[0]); |
1869 | v0[1] = PetscRealPart(coords[1])(coords[1]); |
1870 | v0[2] = PetscRealPart(coords[2])(coords[2]); |
1871 | } |
1872 | if (normal) { |
1873 | if (dim > 2) { |
1874 | const PetscReal x0 = PetscRealPart(coords[dim*fv[1]+0] - coords[0])(coords[dim*fv[1]+0] - coords[0]), x1 = PetscRealPart(coords[dim*fv[2]+0] - coords[0])(coords[dim*fv[2]+0] - coords[0]); |
1875 | const PetscReal y0 = PetscRealPart(coords[dim*fv[1]+1] - coords[1])(coords[dim*fv[1]+1] - coords[1]), y1 = PetscRealPart(coords[dim*fv[2]+1] - coords[1])(coords[dim*fv[2]+1] - coords[1]); |
1876 | const PetscReal z0 = PetscRealPart(coords[dim*fv[1]+2] - coords[2])(coords[dim*fv[1]+2] - coords[2]), z1 = PetscRealPart(coords[dim*fv[2]+2] - coords[2])(coords[dim*fv[2]+2] - coords[2]); |
1877 | PetscReal norm; |
1878 | |
1879 | normal[0] = y0*z1 - z0*y1; |
1880 | normal[1] = z0*x1 - x0*z1; |
1881 | normal[2] = x0*y1 - y0*x1; |
1882 | norm = PetscSqrtReal(normal[0]*normal[0] + normal[1]*normal[1] + normal[2]*normal[2])sqrt(normal[0]*normal[0] + normal[1]*normal[1] + normal[2]*normal [2]); |
1883 | normal[0] /= norm; |
1884 | normal[1] /= norm; |
1885 | normal[2] /= norm; |
1886 | } else { |
1887 | for (d = 0; d < dim; ++d) normal[d] = 0.0; |
1888 | } |
1889 | } |
1890 | if (dim == 3) {ierr = DMPlexComputeProjection3Dto2D(coordSize, coords, R);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1890,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
1891 | for (p = 0; p < numCorners; ++p) { |
1892 | const PetscInt pi = p < 4 ? fv[p] : p; |
1893 | const PetscInt pin = p < 3 ? fv[(p+1)%numCorners] : (p+1)%numCorners; |
1894 | /* Need to do this copy to get types right */ |
1895 | for (d = 0; d < tdim; ++d) { |
1896 | ctmp[d] = PetscRealPart(coords[pi*tdim+d])(coords[pi*tdim+d]); |
1897 | ctmp[tdim+d] = PetscRealPart(coords[pin*tdim+d])(coords[pin*tdim+d]); |
1898 | } |
1899 | Volume_Triangle_Origin_Internal(&vtmp, ctmp); |
1900 | vsum += vtmp; |
1901 | for (d = 0; d < tdim; ++d) { |
1902 | csum[d] += (ctmp[d] + ctmp[tdim+d])*vtmp; |
1903 | } |
1904 | } |
1905 | for (d = 0; d < tdim; ++d) { |
1906 | csum[d] /= (tdim+1)*vsum; |
1907 | } |
1908 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordinates, cell, &coordSize, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1908,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1909 | if (vol) *vol = PetscAbsReal(vsum)fabs(vsum); |
1910 | if (centroid) { |
1911 | if (dim > 2) { |
1912 | for (d = 0; d < dim; ++d) { |
1913 | centroid[d] = v0[d]; |
1914 | for (e = 0; e < dim; ++e) { |
1915 | centroid[d] += R[d*dim+e]*csum[e]; |
1916 | } |
1917 | } |
1918 | } else for (d = 0; d < dim; ++d) centroid[d] = csum[d]; |
1919 | } |
1920 | 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); |
1921 | } |
1922 | |
1923 | /* Centroid_i = (\sum_n V_n Cn_i ) / V */ |
1924 | static PetscErrorCode DMPlexComputeGeometryFVM_3D_Internal(DM dm, PetscInt dim, PetscInt cell, PetscReal *vol, PetscReal centroid[], PetscReal normal[]) |
1925 | { |
1926 | DMLabel depth; |
1927 | PetscSection coordSection; |
1928 | Vec coordinates; |
1929 | PetscScalar *coords = NULL((void*)0); |
1930 | PetscReal vsum = 0.0, vtmp, coordsTmp[3*3]; |
1931 | const PetscInt *faces, *facesO; |
1932 | PetscBool isHybrid = PETSC_FALSE; |
1933 | PetscInt pEndInterior[4], cdepth, numFaces, f, coordSize, numCorners, p, d; |
1934 | PetscErrorCode ierr; |
1935 | |
1936 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 1936; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1937 | if (PetscUnlikely(dim > 3)__builtin_expect(!!(dim > 3),0)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"No support for dim %D > 3",dim)return PetscError(((MPI_Comm)0x44000001),1937,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"No support for dim %D > 3",dim); |
1938 | /* Must check for hybrid cells because prisms have a different orientation scheme */ |
1939 | ierr = DMPlexGetDepthLabel(dm, &depth);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1939,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1940 | ierr = DMLabelGetValue(depth, cell, &cdepth);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1940,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1941 | ierr = DMPlexGetHybridBounds(dm, &pEndInterior[3], &pEndInterior[2], &pEndInterior[1], &pEndInterior[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1941,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1942 | if ((pEndInterior[cdepth]) >=0 && (cell >= pEndInterior[cdepth])) isHybrid = PETSC_TRUE; |
1943 | |
1944 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1944,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1945 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1945,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1946 | |
1947 | if (centroid) for (d = 0; d < dim; ++d) centroid[d] = 0.0; |
1948 | ierr = DMPlexGetConeSize(dm, cell, &numFaces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1948,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1949 | ierr = DMPlexGetCone(dm, cell, &faces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1949,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1950 | ierr = DMPlexGetConeOrientation(dm, cell, &facesO);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1950,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1951 | for (f = 0; f < numFaces; ++f) { |
1952 | PetscBool flip = isHybrid && f == 0 ? PETSC_TRUE : PETSC_FALSE; /* The first hybrid face is reversed */ |
1953 | |
1954 | ierr = DMPlexVecGetClosure(dm, coordSection, coordinates, faces[f], &coordSize, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1954,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1955 | numCorners = coordSize/dim; |
1956 | switch (numCorners) { |
1957 | case 3: |
1958 | for (d = 0; d < dim; ++d) { |
1959 | coordsTmp[0*dim+d] = PetscRealPart(coords[0*dim+d])(coords[0*dim+d]); |
1960 | coordsTmp[1*dim+d] = PetscRealPart(coords[1*dim+d])(coords[1*dim+d]); |
1961 | coordsTmp[2*dim+d] = PetscRealPart(coords[2*dim+d])(coords[2*dim+d]); |
1962 | } |
1963 | Volume_Tetrahedron_Origin_Internal(&vtmp, coordsTmp); |
1964 | if (facesO[f] < 0 || flip) vtmp = -vtmp; |
1965 | vsum += vtmp; |
1966 | if (centroid) { /* Centroid of OABC = (a+b+c)/4 */ |
1967 | for (d = 0; d < dim; ++d) { |
1968 | for (p = 0; p < 3; ++p) centroid[d] += coordsTmp[p*dim+d]*vtmp; |
1969 | } |
1970 | } |
1971 | break; |
1972 | case 4: |
1973 | { |
1974 | PetscInt fv[4] = {0, 1, 2, 3}; |
1975 | |
1976 | /* Side faces for hybrid cells are are stored as tensor products */ |
1977 | if (isHybrid && f > 1) {fv[2] = 3; fv[3] = 2;} |
1978 | /* DO FOR PYRAMID */ |
1979 | /* First tet */ |
1980 | for (d = 0; d < dim; ++d) { |
1981 | coordsTmp[0*dim+d] = PetscRealPart(coords[fv[0]*dim+d])(coords[fv[0]*dim+d]); |
1982 | coordsTmp[1*dim+d] = PetscRealPart(coords[fv[1]*dim+d])(coords[fv[1]*dim+d]); |
1983 | coordsTmp[2*dim+d] = PetscRealPart(coords[fv[3]*dim+d])(coords[fv[3]*dim+d]); |
1984 | } |
1985 | Volume_Tetrahedron_Origin_Internal(&vtmp, coordsTmp); |
1986 | if (facesO[f] < 0 || flip) vtmp = -vtmp; |
1987 | vsum += vtmp; |
1988 | if (centroid) { |
1989 | for (d = 0; d < dim; ++d) { |
1990 | for (p = 0; p < 3; ++p) centroid[d] += coordsTmp[p*dim+d]*vtmp; |
1991 | } |
1992 | } |
1993 | /* Second tet */ |
1994 | for (d = 0; d < dim; ++d) { |
1995 | coordsTmp[0*dim+d] = PetscRealPart(coords[fv[1]*dim+d])(coords[fv[1]*dim+d]); |
1996 | coordsTmp[1*dim+d] = PetscRealPart(coords[fv[2]*dim+d])(coords[fv[2]*dim+d]); |
1997 | coordsTmp[2*dim+d] = PetscRealPart(coords[fv[3]*dim+d])(coords[fv[3]*dim+d]); |
1998 | } |
1999 | Volume_Tetrahedron_Origin_Internal(&vtmp, coordsTmp); |
2000 | if (facesO[f] < 0 || flip) vtmp = -vtmp; |
2001 | vsum += vtmp; |
2002 | if (centroid) { |
2003 | for (d = 0; d < dim; ++d) { |
2004 | for (p = 0; p < 3; ++p) centroid[d] += coordsTmp[p*dim+d]*vtmp; |
2005 | } |
2006 | } |
2007 | break; |
2008 | } |
2009 | default: |
2010 | SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot handle faces with %D vertices", numCorners)return PetscError(((MPI_Comm)0x44000001),2010,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"Cannot handle faces with %D vertices" ,numCorners); |
2011 | } |
2012 | ierr = DMPlexVecRestoreClosure(dm, coordSection, coordinates, faces[f], &coordSize, &coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2012,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2013 | } |
2014 | if (vol) *vol = PetscAbsReal(vsum)fabs(vsum); |
2015 | if (normal) for (d = 0; d < dim; ++d) normal[d] = 0.0; |
2016 | if (centroid) for (d = 0; d < dim; ++d) centroid[d] /= (vsum*4); |
2017 | 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); |
2018 | } |
2019 | |
2020 | /*@C |
2021 | DMPlexComputeCellGeometryFVM - Compute the volume for a given cell |
2022 | |
2023 | Collective on dm |
2024 | |
2025 | Input Arguments: |
2026 | + dm - the DM |
2027 | - cell - the cell |
2028 | |
2029 | Output Arguments: |
2030 | + volume - the cell volume |
2031 | . centroid - the cell centroid |
2032 | - normal - the cell normal, if appropriate |
2033 | |
2034 | Level: advanced |
2035 | |
2036 | Fortran Notes: |
2037 | Since it returns arrays, this routine is only available in Fortran 90, and you must |
2038 | include petsc.h90 in your code. |
2039 | |
2040 | .seealso: DMGetCoordinateSection(), DMGetCoordinates() |
2041 | @*/ |
2042 | PetscErrorCode DMPlexComputeCellGeometryFVM(DM dm, PetscInt cell, PetscReal *vol, PetscReal centroid[], PetscReal normal[]) |
2043 | { |
2044 | PetscInt depth, dim; |
2045 | PetscErrorCode ierr; |
2046 | |
2047 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2047; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2048 | ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2048,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2049 | ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2049,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2050 | if (depth != dim) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mesh must be interpolated")return PetscError(((MPI_Comm)0x44000001),2050,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Mesh must be interpolated"); |
2051 | /* We need to keep a pointer to the depth label */ |
2052 | ierr = DMGetLabelValue(dm, "depth", cell, &depth);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2052,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2053 | /* Cone size is now the number of faces */ |
2054 | switch (depth) { |
2055 | case 1: |
2056 | ierr = DMPlexComputeGeometryFVM_1D_Internal(dm, dim, cell, vol, centroid, normal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2056,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2057 | break; |
2058 | case 2: |
2059 | ierr = DMPlexComputeGeometryFVM_2D_Internal(dm, dim, cell, vol, centroid, normal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2059,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2060 | break; |
2061 | case 3: |
2062 | ierr = DMPlexComputeGeometryFVM_3D_Internal(dm, dim, cell, vol, centroid, normal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2062,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2063 | break; |
2064 | default: |
2065 | SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Unsupported dimension %D (depth %D) for element geometry computation", dim, depth)return PetscError(PetscObjectComm((PetscObject)dm),2065,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"Unsupported dimension %D (depth %D) for element geometry computation" ,dim,depth); |
2066 | } |
2067 | 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); |
2068 | } |
2069 | |
2070 | /*@ |
2071 | DMPlexComputeGeometryFEM - Precompute cell geometry for the entire mesh |
2072 | |
2073 | Collective on dm |
2074 | |
2075 | Input Parameter: |
2076 | . dm - The DMPlex |
2077 | |
2078 | Output Parameter: |
2079 | . cellgeom - A vector with the cell geometry data for each cell |
2080 | |
2081 | Level: beginner |
2082 | |
2083 | @*/ |
2084 | PetscErrorCode DMPlexComputeGeometryFEM(DM dm, Vec *cellgeom) |
2085 | { |
2086 | DM dmCell; |
2087 | Vec coordinates; |
2088 | PetscSection coordSection, sectionCell; |
2089 | PetscScalar *cgeom; |
2090 | PetscInt cStart, cEnd, cMax, c; |
2091 | PetscErrorCode ierr; |
2092 | |
2093 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2093; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2094 | ierr = DMClone(dm, &dmCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2094,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2095 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2095,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2096 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2096,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2097 | ierr = DMSetCoordinateSection(dmCell, PETSC_DETERMINE-1, coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2097,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2098 | ierr = DMSetCoordinatesLocal(dmCell, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2098,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2099 | ierr = PetscSectionCreate(PetscObjectComm((PetscObject) dm), §ionCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2099,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2100 | ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2100,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2101 | ierr = DMPlexGetHybridBounds(dm, &cMax, NULL((void*)0), NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2101,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2102 | cEnd = cMax < 0 ? cEnd : cMax; |
2103 | ierr = PetscSectionSetChart(sectionCell, cStart, cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2103,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2104 | /* TODO This needs to be multiplied by Nq for non-affine */ |
2105 | for (c = cStart; c < cEnd; ++c) {ierr = PetscSectionSetDof(sectionCell, c, (PetscInt) PetscCeilReal(((PetscReal) sizeof(PetscFEGeom))/sizeof(PetscScalar))ceil(((PetscReal) sizeof(PetscFEGeom))/sizeof(PetscScalar)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2105,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
2106 | ierr = PetscSectionSetUp(sectionCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2106,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2107 | ierr = DMSetSection(dmCell, sectionCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2107,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2108 | ierr = PetscSectionDestroy(§ionCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2108,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2109 | ierr = DMCreateLocalVector(dmCell, cellgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2109,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2110 | ierr = VecGetArray(*cellgeom, &cgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2110,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2111 | for (c = cStart; c < cEnd; ++c) { |
2112 | PetscFEGeom *cg; |
2113 | |
2114 | ierr = DMPlexPointLocalRef(dmCell, c, cgeom, &cg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2114,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2115 | ierr = PetscArrayzero(cg, 1)PetscMemzero(cg,(1)*sizeof(*(cg)));;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2115,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2116 | ierr = DMPlexComputeCellGeometryFEM(dmCell, c, NULL((void*)0), cg->v, cg->J, cg->invJ, cg->detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2116,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2117 | if (*cg->detJ <= 0.0) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid determinant %g for element %d", cg->detJ, c)return PetscError(((MPI_Comm)0x44000001),2117,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"Invalid determinant %g for element %d" ,cg->detJ,c); |
2118 | } |
2119 | 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); |
2120 | } |
2121 | |
2122 | /*@ |
2123 | DMPlexComputeGeometryFVM - Computes the cell and face geometry for a finite volume method |
2124 | |
2125 | Input Parameter: |
2126 | . dm - The DM |
2127 | |
2128 | Output Parameters: |
2129 | + cellgeom - A Vec of PetscFVCellGeom data |
2130 | . facegeom - A Vec of PetscFVFaceGeom data |
2131 | |
2132 | Level: developer |
2133 | |
2134 | .seealso: PetscFVFaceGeom, PetscFVCellGeom, DMPlexComputeGeometryFEM() |
2135 | @*/ |
2136 | PetscErrorCode DMPlexComputeGeometryFVM(DM dm, Vec *cellgeom, Vec *facegeom) |
2137 | { |
2138 | DM dmFace, dmCell; |
2139 | DMLabel ghostLabel; |
2140 | PetscSection sectionFace, sectionCell; |
2141 | PetscSection coordSection; |
2142 | Vec coordinates; |
2143 | PetscScalar *fgeom, *cgeom; |
2144 | PetscReal minradius, gminradius; |
2145 | PetscInt dim, cStart, cEnd, cEndInterior, c, fStart, fEnd, f; |
2146 | PetscErrorCode ierr; |
2147 | |
2148 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2148; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2149 | ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2149,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2150 | ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2150,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2151 | ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2151,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2152 | /* Make cell centroids and volumes */ |
2153 | ierr = DMClone(dm, &dmCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2153,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2154 | ierr = DMSetCoordinateSection(dmCell, PETSC_DETERMINE-1, coordSection);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2154,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2155 | ierr = DMSetCoordinatesLocal(dmCell, coordinates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2155,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2156 | ierr = PetscSectionCreate(PetscObjectComm((PetscObject) dm), §ionCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2156,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2157 | ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2157,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2158 | ierr = DMPlexGetHybridBounds(dm, &cEndInterior, NULL((void*)0), NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2158,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2159 | ierr = PetscSectionSetChart(sectionCell, cStart, cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2159,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2160 | for (c = cStart; c < cEnd; ++c) {ierr = PetscSectionSetDof(sectionCell, c, (PetscInt) PetscCeilReal(((PetscReal) sizeof(PetscFVCellGeom))/sizeof(PetscScalar))ceil(((PetscReal) sizeof(PetscFVCellGeom))/sizeof(PetscScalar )));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2160,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
2161 | ierr = PetscSectionSetUp(sectionCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2161,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2162 | ierr = DMSetSection(dmCell, sectionCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2162,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2163 | ierr = PetscSectionDestroy(§ionCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2163,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2164 | ierr = DMCreateLocalVector(dmCell, cellgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2164,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2165 | if (cEndInterior < 0) { |
2166 | cEndInterior = cEnd; |
2167 | } |
2168 | ierr = VecGetArray(*cellgeom, &cgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2168,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2169 | for (c = cStart; c < cEndInterior; ++c) { |
2170 | PetscFVCellGeom *cg; |
2171 | |
2172 | ierr = DMPlexPointLocalRef(dmCell, c, cgeom, &cg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2172,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2173 | ierr = PetscArrayzero(cg, 1)PetscMemzero(cg,(1)*sizeof(*(cg)));;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2173,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2174 | ierr = DMPlexComputeCellGeometryFVM(dmCell, c, &cg->volume, cg->centroid, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2174,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2175 | } |
2176 | /* Compute face normals and minimum cell radius */ |
2177 | ierr = DMClone(dm, &dmFace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2177,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2178 | ierr = PetscSectionCreate(PetscObjectComm((PetscObject) dm), §ionFace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2178,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2179 | ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2179,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2180 | ierr = PetscSectionSetChart(sectionFace, fStart, fEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2180,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2181 | for (f = fStart; f < fEnd; ++f) {ierr = PetscSectionSetDof(sectionFace, f, (PetscInt) PetscCeilReal(((PetscReal) sizeof(PetscFVFaceGeom))/sizeof(PetscScalar))ceil(((PetscReal) sizeof(PetscFVFaceGeom))/sizeof(PetscScalar )));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2181,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
2182 | ierr = PetscSectionSetUp(sectionFace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2182,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2183 | ierr = DMSetSection(dmFace, sectionFace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2183,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2184 | ierr = PetscSectionDestroy(§ionFace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2184,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2185 | ierr = DMCreateLocalVector(dmFace, facegeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2185,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2186 | ierr = VecGetArray(*facegeom, &fgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2186,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2187 | ierr = DMGetLabel(dm, "ghost", &ghostLabel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2187,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2188 | minradius = PETSC_MAX_REAL1.7976931348623157e+308; |
2189 | for (f = fStart; f < fEnd; ++f) { |
2190 | PetscFVFaceGeom *fg; |
2191 | PetscReal area; |
2192 | PetscInt ghost = -1, d, numChildren; |
2193 | |
2194 | if (ghostLabel) {ierr = DMLabelGetValue(ghostLabel, f, &ghost);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2194,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
2195 | ierr = DMPlexGetTreeChildren(dm,f,&numChildren,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2195,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2196 | if (ghost >= 0 || numChildren) continue; |
2197 | ierr = DMPlexPointLocalRef(dmFace, f, fgeom, &fg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2197,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2198 | ierr = DMPlexComputeCellGeometryFVM(dm, f, &area, fg->centroid, fg->normal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2198,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2199 | for (d = 0; d < dim; ++d) fg->normal[d] *= area; |
2200 | /* Flip face orientation if necessary to match ordering in support, and Update minimum radius */ |
2201 | { |
2202 | PetscFVCellGeom *cL, *cR; |
2203 | PetscInt ncells; |
2204 | const PetscInt *cells; |
2205 | PetscReal *lcentroid, *rcentroid; |
2206 | PetscReal l[3], r[3], v[3]; |
2207 | |
2208 | ierr = DMPlexGetSupport(dm, f, &cells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2208,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2209 | ierr = DMPlexGetSupportSize(dm, f, &ncells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2209,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2210 | ierr = DMPlexPointLocalRead(dmCell, cells[0], cgeom, &cL);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2210,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2211 | lcentroid = cells[0] >= cEndInterior ? fg->centroid : cL->centroid; |
2212 | if (ncells > 1) { |
2213 | ierr = DMPlexPointLocalRead(dmCell, cells[1], cgeom, &cR);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2213,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2214 | rcentroid = cells[1] >= cEndInterior ? fg->centroid : cR->centroid; |
2215 | } |
2216 | else { |
2217 | rcentroid = fg->centroid; |
2218 | } |
2219 | ierr = DMLocalizeCoordinateReal_Internal(dm, dim, fg->centroid, lcentroid, l);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2219,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2220 | ierr = DMLocalizeCoordinateReal_Internal(dm, dim, fg->centroid, rcentroid, r);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2220,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2221 | DMPlex_WaxpyD_Internal(dim, -1, l, r, v); |
2222 | if (DMPlex_DotRealD_Internal(dim, fg->normal, v) < 0) { |
2223 | for (d = 0; d < dim; ++d) fg->normal[d] = -fg->normal[d]; |
2224 | } |
2225 | if (DMPlex_DotRealD_Internal(dim, fg->normal, v) <= 0) { |
2226 | if (dim == 2) SETERRQ5(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Direction for face %d could not be fixed, normal (%g,%g) v (%g,%g)", f, (double) fg->normal[0], (double) fg->normal[1], (double) v[0], (double) v[1])return PetscError(((MPI_Comm)0x44000001),2226,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,77,PETSC_ERROR_INITIAL,"Direction for face %d could not be fixed, normal (%g,%g) v (%g,%g)" ,f,(double) fg->normal[0],(double) fg->normal[1],(double ) v[0],(double) v[1]); |
2227 | if (dim == 3) SETERRQ7(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Direction for face %d could not be fixed, normal (%g,%g,%g) v (%g,%g,%g)", f, (double) fg->normal[0], (double) fg->normal[1], (double) fg->normal[2], (double) v[0], (double) v[1], (double) v[2])return PetscError(((MPI_Comm)0x44000001),2227,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,77,PETSC_ERROR_INITIAL,"Direction for face %d could not be fixed, normal (%g,%g,%g) v (%g,%g,%g)" ,f,(double) fg->normal[0],(double) fg->normal[1],(double ) fg->normal[2],(double) v[0],(double) v[1],(double) v[2]); |
2228 | SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Direction for face %d could not be fixed", f)return PetscError(((MPI_Comm)0x44000001),2228,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,77,PETSC_ERROR_INITIAL,"Direction for face %d could not be fixed" ,f); |
2229 | } |
2230 | if (cells[0] < cEndInterior) { |
2231 | DMPlex_WaxpyD_Internal(dim, -1, fg->centroid, cL->centroid, v); |
2232 | minradius = PetscMin(minradius, DMPlex_NormD_Internal(dim, v))(((minradius)<(DMPlex_NormD_Internal(dim, v))) ? (minradius ) : (DMPlex_NormD_Internal(dim, v))); |
2233 | } |
2234 | if (ncells > 1 && cells[1] < cEndInterior) { |
2235 | DMPlex_WaxpyD_Internal(dim, -1, fg->centroid, cR->centroid, v); |
2236 | minradius = PetscMin(minradius, DMPlex_NormD_Internal(dim, v))(((minradius)<(DMPlex_NormD_Internal(dim, v))) ? (minradius ) : (DMPlex_NormD_Internal(dim, v))); |
2237 | } |
2238 | } |
2239 | } |
2240 | ierr = MPIU_Allreduce(&minradius, &gminradius, 1, MPIU_REAL, MPIU_MIN, PetscObjectComm((PetscObject)dm))(PetscAllreduceBarrierCheck(PetscObjectComm((PetscObject)dm), 1,2240,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)dm))),0) || MPI_Allreduce((&minradius),(& gminradius),(1),(((MPI_Datatype)0x4c00080b)),((MPI_Op)(0x58000002 )),(PetscObjectComm((PetscObject)dm)))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2240,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2241 | ierr = DMPlexSetMinRadius(dm, gminradius);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2241,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2242 | /* Compute centroids of ghost cells */ |
2243 | for (c = cEndInterior; c < cEnd; ++c) { |
2244 | PetscFVFaceGeom *fg; |
2245 | const PetscInt *cone, *support; |
2246 | PetscInt coneSize, supportSize, s; |
2247 | |
2248 | ierr = DMPlexGetConeSize(dmCell, c, &coneSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2248,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2249 | if (coneSize != 1) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Ghost cell %d has cone size %d != 1", c, coneSize)return PetscError(((MPI_Comm)0x44000001),2249,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Ghost cell %d has cone size %d != 1" ,c,coneSize); |
2250 | ierr = DMPlexGetCone(dmCell, c, &cone);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2250,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2251 | ierr = DMPlexGetSupportSize(dmCell, cone[0], &supportSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2251,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2252 | if (supportSize != 2) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Face %d has support size %d != 2", cone[0], supportSize)return PetscError(((MPI_Comm)0x44000001),2252,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Face %d has support size %d != 2",cone [0],supportSize); |
2253 | ierr = DMPlexGetSupport(dmCell, cone[0], &support);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2253,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2254 | ierr = DMPlexPointLocalRef(dmFace, cone[0], fgeom, &fg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2254,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2255 | for (s = 0; s < 2; ++s) { |
2256 | /* Reflect ghost centroid across plane of face */ |
2257 | if (support[s] == c) { |
2258 | PetscFVCellGeom *ci; |
2259 | PetscFVCellGeom *cg; |
2260 | PetscReal c2f[3], a; |
2261 | |
2262 | ierr = DMPlexPointLocalRead(dmCell, support[(s+1)%2], cgeom, &ci);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2262,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2263 | DMPlex_WaxpyD_Internal(dim, -1, ci->centroid, fg->centroid, c2f); /* cell to face centroid */ |
2264 | a = DMPlex_DotRealD_Internal(dim, c2f, fg->normal)/DMPlex_DotRealD_Internal(dim, fg->normal, fg->normal); |
2265 | ierr = DMPlexPointLocalRef(dmCell, support[s], cgeom, &cg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2265,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2266 | DMPlex_WaxpyD_Internal(dim, 2*a, fg->normal, ci->centroid, cg->centroid); |
2267 | cg->volume = ci->volume; |
2268 | } |
2269 | } |
2270 | } |
2271 | ierr = VecRestoreArray(*facegeom, &fgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2271,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2272 | ierr = VecRestoreArray(*cellgeom, &cgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2272,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2273 | ierr = DMDestroy(&dmCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2273,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2274 | ierr = DMDestroy(&dmFace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2274,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2275 | 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); |
2276 | } |
2277 | |
2278 | /*@C |
2279 | DMPlexGetMinRadius - Returns the minimum distance from any cell centroid to a face |
2280 | |
2281 | Not collective |
2282 | |
2283 | Input Argument: |
2284 | . dm - the DM |
2285 | |
2286 | Output Argument: |
2287 | . minradius - the minium cell radius |
2288 | |
2289 | Level: developer |
2290 | |
2291 | .seealso: DMGetCoordinates() |
2292 | @*/ |
2293 | PetscErrorCode DMPlexGetMinRadius(DM dm, PetscReal *minradius) |
2294 | { |
2295 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2295; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2296 | PetscValidHeaderSpecific(dm,DM_CLASSID,1)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),2296,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if ( !PetscCheckPointer(dm,PETSC_OBJECT)) return PetscError(((MPI_Comm )0x44000001),2296,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.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),2296,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),2296,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d" ,1); } } while (0); |
2297 | PetscValidPointer(minradius,2)do { if (!minradius) return PetscError(((MPI_Comm)0x44000001) ,2297,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(minradius,PETSC_CHAR)) return PetscError (((MPI_Comm)0x44000001),2297,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",2); } while (0); |
2298 | *minradius = ((DM_Plex*) dm->data)->minradius; |
2299 | 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); |
2300 | } |
2301 | |
2302 | /*@C |
2303 | DMPlexSetMinRadius - Sets the minimum distance from the cell centroid to a face |
2304 | |
2305 | Logically collective |
2306 | |
2307 | Input Arguments: |
2308 | + dm - the DM |
2309 | - minradius - the minium cell radius |
2310 | |
2311 | Level: developer |
2312 | |
2313 | .seealso: DMSetCoordinates() |
2314 | @*/ |
2315 | PetscErrorCode DMPlexSetMinRadius(DM dm, PetscReal minradius) |
2316 | { |
2317 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2317; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2318 | PetscValidHeaderSpecific(dm,DM_CLASSID,1)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),2318,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if ( !PetscCheckPointer(dm,PETSC_OBJECT)) return PetscError(((MPI_Comm )0x44000001),2318,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.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),2318,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),2318,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d" ,1); } } while (0); |
2319 | ((DM_Plex*) dm->data)->minradius = minradius; |
2320 | 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); |
2321 | } |
2322 | |
2323 | static PetscErrorCode BuildGradientReconstruction_Internal(DM dm, PetscFV fvm, DM dmFace, PetscScalar *fgeom, DM dmCell, PetscScalar *cgeom) |
2324 | { |
2325 | DMLabel ghostLabel; |
2326 | PetscScalar *dx, *grad, **gref; |
2327 | PetscInt dim, cStart, cEnd, c, cEndInterior, maxNumFaces; |
2328 | PetscErrorCode ierr; |
2329 | |
2330 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2330; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2331 | ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2331,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2332 | ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2332,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2333 | ierr = DMPlexGetHybridBounds(dm, &cEndInterior, NULL((void*)0), NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2333,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2334 | ierr = DMPlexGetMaxSizes(dm, &maxNumFaces, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2334,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2335 | ierr = PetscFVLeastSquaresSetMaxFaces(fvm, maxNumFaces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2335,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2336 | ierr = DMGetLabel(dm, "ghost", &ghostLabel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2336,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2337 | ierr = PetscMalloc3(maxNumFaces*dim, &dx, maxNumFaces*dim, &grad, maxNumFaces, &gref)PetscMallocA(3,PETSC_FALSE,2337,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,(size_t)(maxNumFaces*dim)*sizeof(**(&dx)),(&dx),(size_t )(maxNumFaces*dim)*sizeof(**(&grad)),(&grad),(size_t) (maxNumFaces)*sizeof(**(&gref)),(&gref));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2337,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2338 | for (c = cStart; c < cEndInterior; c++) { |
2339 | const PetscInt *faces; |
2340 | PetscInt numFaces, usedFaces, f, d; |
2341 | PetscFVCellGeom *cg; |
2342 | PetscBool boundary; |
2343 | PetscInt ghost; |
2344 | |
2345 | ierr = DMPlexPointLocalRead(dmCell, c, cgeom, &cg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2345,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2346 | ierr = DMPlexGetConeSize(dm, c, &numFaces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2346,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2347 | ierr = DMPlexGetCone(dm, c, &faces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2347,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2348 | if (numFaces < dim) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Cell %D has only %D faces, not enough for gradient reconstruction", c, numFaces)return PetscError(((MPI_Comm)0x44000001),2348,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,75,PETSC_ERROR_INITIAL,"Cell %D has only %D faces, not enough for gradient reconstruction" ,c,numFaces); |
2349 | for (f = 0, usedFaces = 0; f < numFaces; ++f) { |
2350 | PetscFVCellGeom *cg1; |
2351 | PetscFVFaceGeom *fg; |
2352 | const PetscInt *fcells; |
2353 | PetscInt ncell, side; |
2354 | |
2355 | ierr = DMLabelGetValue(ghostLabel, faces[f], &ghost);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2355,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2356 | ierr = DMIsBoundaryPoint(dm, faces[f], &boundary);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2356,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2357 | if ((ghost >= 0) || boundary) continue; |
2358 | ierr = DMPlexGetSupport(dm, faces[f], &fcells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2358,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2359 | side = (c != fcells[0]); /* c is on left=0 or right=1 of face */ |
2360 | ncell = fcells[!side]; /* the neighbor */ |
2361 | ierr = DMPlexPointLocalRef(dmFace, faces[f], fgeom, &fg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2361,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2362 | ierr = DMPlexPointLocalRead(dmCell, ncell, cgeom, &cg1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2362,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2363 | for (d = 0; d < dim; ++d) dx[usedFaces*dim+d] = cg1->centroid[d] - cg->centroid[d]; |
2364 | gref[usedFaces++] = fg->grad[side]; /* Gradient reconstruction term will go here */ |
2365 | } |
2366 | if (!usedFaces) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_USER, "Mesh contains isolated cell (no neighbors). Is it intentional?")return PetscError(((MPI_Comm)0x44000001),2366,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,83,PETSC_ERROR_INITIAL,"Mesh contains isolated cell (no neighbors). Is it intentional?" ); |
2367 | ierr = PetscFVComputeGradient(fvm, usedFaces, dx, grad);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2367,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2368 | for (f = 0, usedFaces = 0; f < numFaces; ++f) { |
2369 | ierr = DMLabelGetValue(ghostLabel, faces[f], &ghost);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2369,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2370 | ierr = DMIsBoundaryPoint(dm, faces[f], &boundary);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2370,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2371 | if ((ghost >= 0) || boundary) continue; |
2372 | for (d = 0; d < dim; ++d) gref[usedFaces][d] = grad[usedFaces*dim+d]; |
2373 | ++usedFaces; |
2374 | } |
2375 | } |
2376 | ierr = PetscFree3(dx, grad, gref)PetscFreeA(3,2376,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,&(dx),&(grad),&(gref));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2376,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2377 | 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); |
2378 | } |
2379 | |
2380 | static PetscErrorCode BuildGradientReconstruction_Internal_Tree(DM dm, PetscFV fvm, DM dmFace, PetscScalar *fgeom, DM dmCell, PetscScalar *cgeom) |
2381 | { |
2382 | DMLabel ghostLabel; |
2383 | PetscScalar *dx, *grad, **gref; |
2384 | PetscInt dim, cStart, cEnd, c, cEndInterior, fStart, fEnd, f, nStart, nEnd, maxNumFaces = 0; |
2385 | PetscSection neighSec; |
2386 | PetscInt (*neighbors)[2]; |
2387 | PetscInt *counter; |
2388 | PetscErrorCode ierr; |
2389 | |
2390 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2390; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2391 | ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2391,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2392 | ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2392,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2393 | ierr = DMPlexGetHybridBounds(dm, &cEndInterior, NULL((void*)0), NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2393,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2394 | if (cEndInterior < 0) { |
2395 | cEndInterior = cEnd; |
2396 | } |
2397 | ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm),&neighSec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2397,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2398 | ierr = PetscSectionSetChart(neighSec,cStart,cEndInterior);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2398,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2399 | ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2399,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2400 | ierr = DMGetLabel(dm, "ghost", &ghostLabel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2400,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2401 | for (f = fStart; f < fEnd; f++) { |
2402 | const PetscInt *fcells; |
2403 | PetscBool boundary; |
2404 | PetscInt ghost = -1; |
2405 | PetscInt numChildren, numCells, c; |
2406 | |
2407 | if (ghostLabel) {ierr = DMLabelGetValue(ghostLabel, f, &ghost);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2407,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
2408 | ierr = DMIsBoundaryPoint(dm, f, &boundary);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2408,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2409 | ierr = DMPlexGetTreeChildren(dm, f, &numChildren, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2409,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2410 | if ((ghost >= 0) || boundary || numChildren) continue; |
2411 | ierr = DMPlexGetSupportSize(dm, f, &numCells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2411,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2412 | if (numCells == 2) { |
2413 | ierr = DMPlexGetSupport(dm, f, &fcells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2413,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2414 | for (c = 0; c < 2; c++) { |
2415 | PetscInt cell = fcells[c]; |
2416 | |
2417 | if (cell >= cStart && cell < cEndInterior) { |
2418 | ierr = PetscSectionAddDof(neighSec,cell,1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2418,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2419 | } |
2420 | } |
2421 | } |
2422 | } |
2423 | ierr = PetscSectionSetUp(neighSec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2423,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2424 | ierr = PetscSectionGetMaxDof(neighSec,&maxNumFaces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2424,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2425 | ierr = PetscFVLeastSquaresSetMaxFaces(fvm, maxNumFaces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2425,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2426 | nStart = 0; |
2427 | ierr = PetscSectionGetStorageSize(neighSec,&nEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2427,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2428 | ierr = PetscMalloc1((nEnd-nStart),&neighbors)PetscMallocA(1,PETSC_FALSE,2428,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,(size_t)((nEnd-nStart))*sizeof(**(&neighbors)),(&neighbors ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2428,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2429 | ierr = PetscCalloc1((cEndInterior-cStart),&counter)PetscMallocA(1,PETSC_TRUE,2429,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,(size_t)((cEndInterior-cStart))*sizeof(**(&counter)),(& counter));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2429,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2430 | for (f = fStart; f < fEnd; f++) { |
2431 | const PetscInt *fcells; |
2432 | PetscBool boundary; |
2433 | PetscInt ghost = -1; |
2434 | PetscInt numChildren, numCells, c; |
2435 | |
2436 | if (ghostLabel) {ierr = DMLabelGetValue(ghostLabel, f, &ghost);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2436,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
2437 | ierr = DMIsBoundaryPoint(dm, f, &boundary);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2437,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2438 | ierr = DMPlexGetTreeChildren(dm, f, &numChildren, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2438,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2439 | if ((ghost >= 0) || boundary || numChildren) continue; |
2440 | ierr = DMPlexGetSupportSize(dm, f, &numCells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2440,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2441 | if (numCells == 2) { |
2442 | ierr = DMPlexGetSupport(dm, f, &fcells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2442,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2443 | for (c = 0; c < 2; c++) { |
2444 | PetscInt cell = fcells[c], off; |
2445 | |
2446 | if (cell >= cStart && cell < cEndInterior) { |
2447 | ierr = PetscSectionGetOffset(neighSec,cell,&off);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2447,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2448 | off += counter[cell - cStart]++; |
2449 | neighbors[off][0] = f; |
2450 | neighbors[off][1] = fcells[1 - c]; |
2451 | } |
2452 | } |
2453 | } |
2454 | } |
2455 | ierr = PetscFree(counter)((*PetscTrFree)((void*)(counter),2455,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ) || ((counter) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2455,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2456 | ierr = PetscMalloc3(maxNumFaces*dim, &dx, maxNumFaces*dim, &grad, maxNumFaces, &gref)PetscMallocA(3,PETSC_FALSE,2456,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,(size_t)(maxNumFaces*dim)*sizeof(**(&dx)),(&dx),(size_t )(maxNumFaces*dim)*sizeof(**(&grad)),(&grad),(size_t) (maxNumFaces)*sizeof(**(&gref)),(&gref));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2456,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2457 | for (c = cStart; c < cEndInterior; c++) { |
2458 | PetscInt numFaces, f, d, off, ghost = -1; |
2459 | PetscFVCellGeom *cg; |
2460 | |
2461 | ierr = DMPlexPointLocalRead(dmCell, c, cgeom, &cg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2461,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2462 | ierr = PetscSectionGetDof(neighSec, c, &numFaces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2462,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2463 | ierr = PetscSectionGetOffset(neighSec, c, &off);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2463,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2464 | if (ghostLabel) {ierr = DMLabelGetValue(ghostLabel, c, &ghost);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2464,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
2465 | if (ghost < 0 && numFaces < dim) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Cell %D has only %D faces, not enough for gradient reconstruction", c, numFaces)return PetscError(((MPI_Comm)0x44000001),2465,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,75,PETSC_ERROR_INITIAL,"Cell %D has only %D faces, not enough for gradient reconstruction" ,c,numFaces); |
2466 | for (f = 0; f < numFaces; ++f) { |
2467 | PetscFVCellGeom *cg1; |
2468 | PetscFVFaceGeom *fg; |
2469 | const PetscInt *fcells; |
2470 | PetscInt ncell, side, nface; |
2471 | |
2472 | nface = neighbors[off + f][0]; |
2473 | ncell = neighbors[off + f][1]; |
2474 | ierr = DMPlexGetSupport(dm,nface,&fcells);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2474,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2475 | side = (c != fcells[0]); |
2476 | ierr = DMPlexPointLocalRef(dmFace, nface, fgeom, &fg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2476,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2477 | ierr = DMPlexPointLocalRead(dmCell, ncell, cgeom, &cg1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2477,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2478 | for (d = 0; d < dim; ++d) dx[f*dim+d] = cg1->centroid[d] - cg->centroid[d]; |
2479 | gref[f] = fg->grad[side]; /* Gradient reconstruction term will go here */ |
2480 | } |
2481 | ierr = PetscFVComputeGradient(fvm, numFaces, dx, grad);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2481,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2482 | for (f = 0; f < numFaces; ++f) { |
2483 | for (d = 0; d < dim; ++d) gref[f][d] = grad[f*dim+d]; |
2484 | } |
2485 | } |
2486 | ierr = PetscFree3(dx, grad, gref)PetscFreeA(3,2486,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,&(dx),&(grad),&(gref));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2486,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2487 | ierr = PetscSectionDestroy(&neighSec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2487,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2488 | ierr = PetscFree(neighbors)((*PetscTrFree)((void*)(neighbors),2488,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ) || ((neighbors) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2488,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2489 | 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); |
2490 | } |
2491 | |
2492 | /*@ |
2493 | DMPlexComputeGradientFVM - Compute geometric factors for gradient reconstruction, which are stored in the geometry data, and compute layout for gradient data |
2494 | |
2495 | Collective on dm |
2496 | |
2497 | Input Arguments: |
2498 | + dm - The DM |
2499 | . fvm - The PetscFV |
2500 | . faceGeometry - The face geometry from DMPlexComputeFaceGeometryFVM() |
2501 | - cellGeometry - The face geometry from DMPlexComputeCellGeometryFVM() |
2502 | |
2503 | Output Parameters: |
2504 | + faceGeometry - The geometric factors for gradient calculation are inserted |
2505 | - dmGrad - The DM describing the layout of gradient data |
2506 | |
2507 | Level: developer |
2508 | |
2509 | .seealso: DMPlexGetFaceGeometryFVM(), DMPlexGetCellGeometryFVM() |
2510 | @*/ |
2511 | PetscErrorCode DMPlexComputeGradientFVM(DM dm, PetscFV fvm, Vec faceGeometry, Vec cellGeometry, DM *dmGrad) |
2512 | { |
2513 | DM dmFace, dmCell; |
2514 | PetscScalar *fgeom, *cgeom; |
2515 | PetscSection sectionGrad, parentSection; |
2516 | PetscInt dim, pdim, cStart, cEnd, cEndInterior, c; |
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-tmp/src/dm/impls/plex/plexgeometry.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 | ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2520,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2521 | ierr = PetscFVGetNumComponents(fvm, &pdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2521,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2522 | ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2522,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2523 | ierr = DMPlexGetHybridBounds(dm, &cEndInterior, NULL((void*)0), NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2523,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2524 | /* Construct the interpolant corresponding to each face from the least-square solution over the cell neighborhood */ |
2525 | ierr = VecGetDM(faceGeometry, &dmFace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2525,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2526 | ierr = VecGetDM(cellGeometry, &dmCell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2526,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2527 | ierr = VecGetArray(faceGeometry, &fgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2527,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2528 | ierr = VecGetArray(cellGeometry, &cgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2528,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2529 | ierr = DMPlexGetTree(dm,&parentSection,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),2529,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2530 | if (!parentSection) { |
2531 | ierr = BuildGradientReconstruction_Internal(dm, fvm, dmFace, fgeom, dmCell, cgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2531,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2532 | } else { |
2533 | ierr = BuildGradientReconstruction_Internal_Tree(dm, fvm, dmFace, fgeom, dmCell, cgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2533,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2534 | } |
2535 | ierr = VecRestoreArray(faceGeometry, &fgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2535,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2536 | ierr = VecRestoreArray(cellGeometry, &cgeom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2536,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2537 | /* Create storage for gradients */ |
2538 | ierr = DMClone(dm, dmGrad);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2538,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2539 | ierr = PetscSectionCreate(PetscObjectComm((PetscObject) dm), §ionGrad);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2539,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2540 | ierr = PetscSectionSetChart(sectionGrad, cStart, cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2540,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2541 | for (c = cStart; c < cEnd; ++c) {ierr = PetscSectionSetDof(sectionGrad, c, pdim*dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2541,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} |
2542 | ierr = PetscSectionSetUp(sectionGrad);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2542,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2543 | ierr = DMSetSection(*dmGrad, sectionGrad);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2543,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2544 | ierr = PetscSectionDestroy(§ionGrad);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2544,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2545 | 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); |
2546 | } |
2547 | |
2548 | /*@ |
2549 | DMPlexGetDataFVM - Retrieve precomputed cell geometry |
2550 | |
2551 | Collective on dm |
2552 | |
2553 | Input Arguments: |
2554 | + dm - The DM |
2555 | - fvm - The PetscFV |
2556 | |
2557 | Output Parameters: |
2558 | + cellGeometry - The cell geometry |
2559 | . faceGeometry - The face geometry |
2560 | - dmGrad - The gradient matrices |
2561 | |
2562 | Level: developer |
2563 | |
2564 | .seealso: DMPlexComputeGeometryFVM() |
2565 | @*/ |
2566 | PetscErrorCode DMPlexGetDataFVM(DM dm, PetscFV fv, Vec *cellgeom, Vec *facegeom, DM *gradDM) |
2567 | { |
2568 | PetscObject cellgeomobj, facegeomobj; |
2569 | PetscErrorCode ierr; |
2570 | |
2571 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2571; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2572 | ierr = PetscObjectQuery((PetscObject) dm, "DMPlex_cellgeom_fvm", &cellgeomobj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2572,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2573 | if (!cellgeomobj) { |
2574 | Vec cellgeomInt, facegeomInt; |
2575 | |
2576 | ierr = DMPlexComputeGeometryFVM(dm, &cellgeomInt, &facegeomInt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2576,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2577 | ierr = PetscObjectCompose((PetscObject) dm, "DMPlex_cellgeom_fvm",(PetscObject)cellgeomInt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2577,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2578 | ierr = PetscObjectCompose((PetscObject) dm, "DMPlex_facegeom_fvm",(PetscObject)facegeomInt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2578,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2579 | ierr = VecDestroy(&cellgeomInt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2579,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2580 | ierr = VecDestroy(&facegeomInt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2580,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2581 | ierr = PetscObjectQuery((PetscObject) dm, "DMPlex_cellgeom_fvm", &cellgeomobj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2581,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2582 | } |
2583 | ierr = PetscObjectQuery((PetscObject) dm, "DMPlex_facegeom_fvm", &facegeomobj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2583,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2584 | if (cellgeom) *cellgeom = (Vec) cellgeomobj; |
2585 | if (facegeom) *facegeom = (Vec) facegeomobj; |
2586 | if (gradDM) { |
2587 | PetscObject gradobj; |
2588 | PetscBool computeGradients; |
2589 | |
2590 | ierr = PetscFVGetComputeGradients(fv,&computeGradients);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2590,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2591 | if (!computeGradients) { |
2592 | *gradDM = NULL((void*)0); |
2593 | 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); |
2594 | } |
2595 | ierr = PetscObjectQuery((PetscObject) dm, "DMPlex_dmgrad_fvm", &gradobj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2595,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2596 | if (!gradobj) { |
2597 | DM dmGradInt; |
2598 | |
2599 | ierr = DMPlexComputeGradientFVM(dm,fv,(Vec) facegeomobj,(Vec) cellgeomobj,&dmGradInt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2599,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2600 | ierr = PetscObjectCompose((PetscObject) dm, "DMPlex_dmgrad_fvm", (PetscObject)dmGradInt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2600,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2601 | ierr = DMDestroy(&dmGradInt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2601,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2602 | ierr = PetscObjectQuery((PetscObject) dm, "DMPlex_dmgrad_fvm", &gradobj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2602,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2603 | } |
2604 | *gradDM = (DM) gradobj; |
2605 | } |
2606 | 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); |
2607 | } |
2608 | |
2609 | static PetscErrorCode DMPlexCoordinatesToReference_NewtonUpdate(PetscInt dimC, PetscInt dimR, PetscScalar *J, PetscScalar *invJ, PetscScalar *work, PetscReal *resNeg, PetscReal *guess) |
2610 | { |
2611 | PetscInt l, m; |
2612 | |
2613 | PetscFunctionBeginHotdo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2613; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
2614 | if (dimC == dimR && dimR <= 3) { |
2615 | /* invert Jacobian, multiply */ |
2616 | PetscScalar det, idet; |
2617 | |
2618 | switch (dimR) { |
2619 | case 1: |
2620 | invJ[0] = 1./ J[0]; |
2621 | break; |
2622 | case 2: |
2623 | det = J[0] * J[3] - J[1] * J[2]; |
2624 | idet = 1./det; |
2625 | invJ[0] = J[3] * idet; |
2626 | invJ[1] = -J[1] * idet; |
2627 | invJ[2] = -J[2] * idet; |
2628 | invJ[3] = J[0] * idet; |
2629 | break; |
2630 | case 3: |
2631 | { |
2632 | invJ[0] = J[4] * J[8] - J[5] * J[7]; |
2633 | invJ[1] = J[2] * J[7] - J[1] * J[8]; |
2634 | invJ[2] = J[1] * J[5] - J[2] * J[4]; |
2635 | det = invJ[0] * J[0] + invJ[1] * J[3] + invJ[2] * J[6]; |
2636 | idet = 1./det; |
2637 | invJ[0] *= idet; |
2638 | invJ[1] *= idet; |
2639 | invJ[2] *= idet; |
2640 | invJ[3] = idet * (J[5] * J[6] - J[3] * J[8]); |
2641 | invJ[4] = idet * (J[0] * J[8] - J[2] * J[6]); |
2642 | invJ[5] = idet * (J[2] * J[3] - J[0] * J[5]); |
2643 | invJ[6] = idet * (J[3] * J[7] - J[4] * J[6]); |
2644 | invJ[7] = idet * (J[1] * J[6] - J[0] * J[7]); |
2645 | invJ[8] = idet * (J[0] * J[4] - J[1] * J[3]); |
2646 | } |
2647 | break; |
2648 | } |
2649 | for (l = 0; l < dimR; l++) { |
2650 | for (m = 0; m < dimC; m++) { |
2651 | guess[l] += PetscRealPart(invJ[l * dimC + m])(invJ[l * dimC + m]) * resNeg[m]; |
2652 | } |
2653 | } |
2654 | } else { |
2655 | #if defined(PETSC_USE_COMPLEX) |
2656 | char transpose = 'C'; |
2657 | #else |
2658 | char transpose = 'T'; |
2659 | #endif |
2660 | PetscBLASInt m = dimR; |
2661 | PetscBLASInt n = dimC; |
2662 | PetscBLASInt one = 1; |
2663 | PetscBLASInt worksize = dimR * dimC, info; |
2664 | |
2665 | for (l = 0; l < dimC; l++) {invJ[l] = resNeg[l];} |
2666 | |
2667 | PetscStackCallBLAS("LAPACKgels",LAPACKgels_(&transpose,&m,&n,&one,J,&m,invJ,&n,work,&worksize, &info))do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = "LAPACKgels"; petscstack->file[petscstack->currentsize ] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2667; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgels_(&transpose,&m,&n,&one,J,&m,invJ,& n,work,&worksize, &info); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(2667,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),2667,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); |
2668 | if (info != 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to GELS")return PetscError(((MPI_Comm)0x44000001),2668,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,76,PETSC_ERROR_INITIAL,"Bad argument to GELS"); |
2669 | |
2670 | for (l = 0; l < dimR; l++) {guess[l] += PetscRealPart(invJ[l])(invJ[l]);} |
2671 | } |
2672 | 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); |
2673 | } |
2674 | |
2675 | static PetscErrorCode DMPlexCoordinatesToReference_Tensor(DM dm, PetscInt cell, PetscInt numPoints, const PetscReal realCoords[], PetscReal refCoords[], Vec coords, PetscInt dimC, PetscInt dimR) |
2676 | { |
2677 | PetscInt coordSize, i, j, k, l, m, maxIts = 7, numV = (1 << dimR); |
2678 | PetscScalar *coordsScalar = NULL((void*)0); |
2679 | PetscReal *cellData, *cellCoords, *cellCoeffs, *extJ, *resNeg; |
2680 | PetscScalar *J, *invJ, *work; |
2681 | PetscErrorCode ierr; |
2682 | |
2683 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2683; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2684 | PetscValidHeaderSpecific(dm,DM_CLASSID,1)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),2684,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if ( !PetscCheckPointer(dm,PETSC_OBJECT)) return PetscError(((MPI_Comm )0x44000001),2684,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.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),2684,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),2684,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d" ,1); } } while (0); |
2685 | ierr = DMPlexVecGetClosure(dm, NULL((void*)0), coords, cell, &coordSize, &coordsScalar);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2685,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2686 | if (coordSize < dimC * numV) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Expecting at least %D coordinates, got %D",dimC * (1 << dimR), coordSize)return PetscError(((MPI_Comm)0x44000001),2686,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,77,PETSC_ERROR_INITIAL,"Expecting at least %D coordinates, got %D" ,dimC * (1 << dimR),coordSize); |
2687 | ierr = DMGetWorkArray(dm, 2 * coordSize + dimR + dimC, MPIU_REAL((MPI_Datatype)0x4c00080b), &cellData);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2687,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2688 | ierr = DMGetWorkArray(dm, 3 * dimR * dimC, MPIU_SCALAR((MPI_Datatype)0x4c00080b), &J);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2688,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2689 | cellCoords = &cellData[0]; |
2690 | cellCoeffs = &cellData[coordSize]; |
2691 | extJ = &cellData[2 * coordSize]; |
2692 | resNeg = &cellData[2 * coordSize + dimR]; |
2693 | invJ = &J[dimR * dimC]; |
2694 | work = &J[2 * dimR * dimC]; |
2695 | if (dimR == 2) { |
2696 | const PetscInt zToPlex[4] = {0, 1, 3, 2}; |
2697 | |
2698 | for (i = 0; i < 4; i++) { |
2699 | PetscInt plexI = zToPlex[i]; |
2700 | |
2701 | for (j = 0; j < dimC; j++) { |
2702 | cellCoords[dimC * i + j] = PetscRealPart(coordsScalar[dimC * plexI + j])(coordsScalar[dimC * plexI + j]); |
2703 | } |
2704 | } |
2705 | } else if (dimR == 3) { |
2706 | const PetscInt zToPlex[8] = {0, 3, 1, 2, 4, 5, 7, 6}; |
2707 | |
2708 | for (i = 0; i < 8; i++) { |
2709 | PetscInt plexI = zToPlex[i]; |
2710 | |
2711 | for (j = 0; j < dimC; j++) { |
2712 | cellCoords[dimC * i + j] = PetscRealPart(coordsScalar[dimC * plexI + j])(coordsScalar[dimC * plexI + j]); |
2713 | } |
2714 | } |
2715 | } else { |
2716 | for (i = 0; i < coordSize; i++) {cellCoords[i] = PetscRealPart(coordsScalar[i])(coordsScalar[i]);} |
2717 | } |
2718 | /* Perform the shuffling transform that converts values at the corners of [-1,1]^d to coefficients */ |
2719 | for (i = 0; i < dimR; i++) { |
2720 | PetscReal *swap; |
2721 | |
2722 | for (j = 0; j < (numV / 2); j++) { |
2723 | for (k = 0; k < dimC; k++) { |
2724 | cellCoeffs[dimC * j + k] = 0.5 * (cellCoords[dimC * (2 * j + 1) + k] + cellCoords[dimC * 2 * j + k]); |
2725 | cellCoeffs[dimC * (j + (numV / 2)) + k] = 0.5 * (cellCoords[dimC * (2 * j + 1) + k] - cellCoords[dimC * 2 * j + k]); |
2726 | } |
2727 | } |
2728 | |
2729 | if (i < dimR - 1) { |
2730 | swap = cellCoeffs; |
2731 | cellCoeffs = cellCoords; |
2732 | cellCoords = swap; |
2733 | } |
2734 | } |
2735 | ierr = PetscArrayzero(refCoords,numPoints * dimR)PetscMemzero(refCoords,(numPoints * dimR)*sizeof(*(refCoords) ));;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2735,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2736 | for (j = 0; j < numPoints; j++) { |
2737 | for (i = 0; i < maxIts; i++) { |
2738 | PetscReal *guess = &refCoords[dimR * j]; |
2739 | |
2740 | /* compute -residual and Jacobian */ |
2741 | for (k = 0; k < dimC; k++) {resNeg[k] = realCoords[dimC * j + k];} |
2742 | for (k = 0; k < dimC * dimR; k++) {J[k] = 0.;} |
2743 | for (k = 0; k < numV; k++) { |
2744 | PetscReal extCoord = 1.; |
2745 | for (l = 0; l < dimR; l++) { |
2746 | PetscReal coord = guess[l]; |
2747 | PetscInt dep = (k & (1 << l)) >> l; |
2748 | |
2749 | extCoord *= dep * coord + !dep; |
2750 | extJ[l] = dep; |
2751 | |
2752 | for (m = 0; m < dimR; m++) { |
2753 | PetscReal coord = guess[m]; |
2754 | PetscInt dep = ((k & (1 << m)) >> m) && (m != l); |
2755 | PetscReal mult = dep * coord + !dep; |
2756 | |
2757 | extJ[l] *= mult; |
2758 | } |
2759 | } |
2760 | for (l = 0; l < dimC; l++) { |
2761 | PetscReal coeff = cellCoeffs[dimC * k + l]; |
2762 | |
2763 | resNeg[l] -= coeff * extCoord; |
2764 | for (m = 0; m < dimR; m++) { |
2765 | J[dimR * l + m] += coeff * extJ[m]; |
2766 | } |
2767 | } |
2768 | } |
2769 | #if 0 && defined(PETSC_USE_DEBUG1) |
2770 | { |
2771 | PetscReal maxAbs = 0.; |
2772 | |
2773 | for (l = 0; l < dimC; l++) { |
2774 | maxAbs = PetscMax(maxAbs,PetscAbsReal(resNeg[l]))(((maxAbs)<(fabs(resNeg[l]))) ? (fabs(resNeg[l])) : (maxAbs )); |
2775 | } |
2776 | ierr = PetscInfo4(dm,"cell %D, point %D, iter %D: res %g\n",cell,j,i,maxAbs)PetscInfo_Private(__func__,dm,"cell %D, point %D, iter %D: res %g\n" ,cell,j,i,maxAbs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2776,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2777 | } |
2778 | #endif |
2779 | |
2780 | ierr = DMPlexCoordinatesToReference_NewtonUpdate(dimC,dimR,J,invJ,work,resNeg,guess);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2780,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2781 | } |
2782 | } |
2783 | ierr = DMRestoreWorkArray(dm, 3 * dimR * dimC, MPIU_SCALAR((MPI_Datatype)0x4c00080b), &J);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2783,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2784 | ierr = DMRestoreWorkArray(dm, 2 * coordSize + dimR + dimC, MPIU_REAL((MPI_Datatype)0x4c00080b), &cellData);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2784,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2785 | ierr = DMPlexVecRestoreClosure(dm, NULL((void*)0), coords, cell, &coordSize, &coordsScalar);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2785,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2786 | 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); |
2787 | } |
2788 | |
2789 | static PetscErrorCode DMPlexReferenceToCoordinates_Tensor(DM dm, PetscInt cell, PetscInt numPoints, const PetscReal refCoords[], PetscReal realCoords[], Vec coords, PetscInt dimC, PetscInt dimR) |
2790 | { |
2791 | PetscInt coordSize, i, j, k, l, numV = (1 << dimR); |
2792 | PetscScalar *coordsScalar = NULL((void*)0); |
2793 | PetscReal *cellData, *cellCoords, *cellCoeffs; |
2794 | PetscErrorCode ierr; |
2795 | |
2796 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2796; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2797 | PetscValidHeaderSpecific(dm,DM_CLASSID,1)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),2797,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if ( !PetscCheckPointer(dm,PETSC_OBJECT)) return PetscError(((MPI_Comm )0x44000001),2797,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.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),2797,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),2797,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d" ,1); } } while (0); |
2798 | ierr = DMPlexVecGetClosure(dm, NULL((void*)0), coords, cell, &coordSize, &coordsScalar);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2798,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2799 | if (coordSize < dimC * numV) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Expecting at least %D coordinates, got %D",dimC * (1 << dimR), coordSize)return PetscError(((MPI_Comm)0x44000001),2799,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,77,PETSC_ERROR_INITIAL,"Expecting at least %D coordinates, got %D" ,dimC * (1 << dimR),coordSize); |
2800 | ierr = DMGetWorkArray(dm, 2 * coordSize, MPIU_REAL((MPI_Datatype)0x4c00080b), &cellData);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2800,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2801 | cellCoords = &cellData[0]; |
2802 | cellCoeffs = &cellData[coordSize]; |
2803 | if (dimR == 2) { |
2804 | const PetscInt zToPlex[4] = {0, 1, 3, 2}; |
2805 | |
2806 | for (i = 0; i < 4; i++) { |
2807 | PetscInt plexI = zToPlex[i]; |
2808 | |
2809 | for (j = 0; j < dimC; j++) { |
2810 | cellCoords[dimC * i + j] = PetscRealPart(coordsScalar[dimC * plexI + j])(coordsScalar[dimC * plexI + j]); |
2811 | } |
2812 | } |
2813 | } else if (dimR == 3) { |
2814 | const PetscInt zToPlex[8] = {0, 3, 1, 2, 4, 5, 7, 6}; |
2815 | |
2816 | for (i = 0; i < 8; i++) { |
2817 | PetscInt plexI = zToPlex[i]; |
2818 | |
2819 | for (j = 0; j < dimC; j++) { |
2820 | cellCoords[dimC * i + j] = PetscRealPart(coordsScalar[dimC * plexI + j])(coordsScalar[dimC * plexI + j]); |
2821 | } |
2822 | } |
2823 | } else { |
2824 | for (i = 0; i < coordSize; i++) {cellCoords[i] = PetscRealPart(coordsScalar[i])(coordsScalar[i]);} |
2825 | } |
2826 | /* Perform the shuffling transform that converts values at the corners of [-1,1]^d to coefficients */ |
2827 | for (i = 0; i < dimR; i++) { |
2828 | PetscReal *swap; |
2829 | |
2830 | for (j = 0; j < (numV / 2); j++) { |
2831 | for (k = 0; k < dimC; k++) { |
2832 | cellCoeffs[dimC * j + k] = 0.5 * (cellCoords[dimC * (2 * j + 1) + k] + cellCoords[dimC * 2 * j + k]); |
2833 | cellCoeffs[dimC * (j + (numV / 2)) + k] = 0.5 * (cellCoords[dimC * (2 * j + 1) + k] - cellCoords[dimC * 2 * j + k]); |
2834 | } |
2835 | } |
2836 | |
2837 | if (i < dimR - 1) { |
2838 | swap = cellCoeffs; |
2839 | cellCoeffs = cellCoords; |
2840 | cellCoords = swap; |
2841 | } |
2842 | } |
2843 | ierr = PetscArrayzero(realCoords,numPoints * dimC)PetscMemzero(realCoords,(numPoints * dimC)*sizeof(*(realCoords )));;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2843,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2844 | for (j = 0; j < numPoints; j++) { |
2845 | const PetscReal *guess = &refCoords[dimR * j]; |
2846 | PetscReal *mapped = &realCoords[dimC * j]; |
2847 | |
2848 | for (k = 0; k < numV; k++) { |
2849 | PetscReal extCoord = 1.; |
2850 | for (l = 0; l < dimR; l++) { |
2851 | PetscReal coord = guess[l]; |
2852 | PetscInt dep = (k & (1 << l)) >> l; |
2853 | |
2854 | extCoord *= dep * coord + !dep; |
2855 | } |
2856 | for (l = 0; l < dimC; l++) { |
2857 | PetscReal coeff = cellCoeffs[dimC * k + l]; |
2858 | |
2859 | mapped[l] += coeff * extCoord; |
2860 | } |
2861 | } |
2862 | } |
2863 | ierr = DMRestoreWorkArray(dm, 2 * coordSize, MPIU_REAL((MPI_Datatype)0x4c00080b), &cellData);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2863,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2864 | ierr = DMPlexVecRestoreClosure(dm, NULL((void*)0), coords, cell, &coordSize, &coordsScalar);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2864,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2865 | 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); |
2866 | } |
2867 | |
2868 | /* TODO: TOBY please fix this for Nc > 1 */ |
2869 | static PetscErrorCode DMPlexCoordinatesToReference_FE(DM dm, PetscFE fe, PetscInt cell, PetscInt numPoints, const PetscReal realCoords[], PetscReal refCoords[], Vec coords, PetscInt Nc, PetscInt dimR) |
2870 | { |
2871 | PetscInt numComp, pdim, i, j, k, l, m, maxIter = 7, coordSize; |
2872 | PetscScalar *nodes = NULL((void*)0); |
2873 | PetscReal *invV, *modes; |
2874 | PetscReal *B, *D, *resNeg; |
2875 | PetscScalar *J, *invJ, *work; |
2876 | PetscErrorCode ierr; |
2877 | |
2878 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2878; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2879 | ierr = PetscFEGetDimension(fe, &pdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2879,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2880 | ierr = PetscFEGetNumComponents(fe, &numComp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2880,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2881 | if (numComp != Nc) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"coordinate discretization must have as many components (%D) as embedding dimension (!= %D)",numComp,Nc)return PetscError(PetscObjectComm((PetscObject)dm),2881,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"coordinate discretization must have as many components (%D) as embedding dimension (!= %D)" ,numComp,Nc); |
2882 | ierr = DMPlexVecGetClosure(dm, NULL((void*)0), coords, cell, &coordSize, &nodes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2882,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2883 | /* convert nodes to values in the stable evaluation basis */ |
2884 | ierr = DMGetWorkArray(dm,pdim,MPIU_REAL((MPI_Datatype)0x4c00080b),&modes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2884,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2885 | invV = fe->invV; |
2886 | for (i = 0; i < pdim; ++i) { |
2887 | modes[i] = 0.; |
2888 | for (j = 0; j < pdim; ++j) { |
2889 | modes[i] += invV[i * pdim + j] * PetscRealPart(nodes[j])(nodes[j]); |
2890 | } |
2891 | } |
2892 | ierr = DMGetWorkArray(dm,pdim * Nc + pdim * Nc * dimR + Nc,MPIU_REAL((MPI_Datatype)0x4c00080b),&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2892,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2893 | D = &B[pdim*Nc]; |
2894 | resNeg = &D[pdim*Nc * dimR]; |
2895 | ierr = DMGetWorkArray(dm,3 * Nc * dimR,MPIU_SCALAR((MPI_Datatype)0x4c00080b),&J);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2895,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2896 | invJ = &J[Nc * dimR]; |
2897 | work = &invJ[Nc * dimR]; |
2898 | for (i = 0; i < numPoints * dimR; i++) {refCoords[i] = 0.;} |
2899 | for (j = 0; j < numPoints; j++) { |
2900 | for (i = 0; i < maxIter; i++) { /* we could batch this so that we're not making big B and D arrays all the time */ |
2901 | PetscReal *guess = &refCoords[j * dimR]; |
2902 | ierr = PetscSpaceEvaluate(fe->basisSpace, 1, guess, B, D, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2902,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2903 | for (k = 0; k < Nc; k++) {resNeg[k] = realCoords[j * Nc + k];} |
2904 | for (k = 0; k < Nc * dimR; k++) {J[k] = 0.;} |
2905 | for (k = 0; k < pdim; k++) { |
2906 | for (l = 0; l < Nc; l++) { |
2907 | resNeg[l] -= modes[k] * B[k * Nc + l]; |
2908 | for (m = 0; m < dimR; m++) { |
2909 | J[l * dimR + m] += modes[k] * D[(k * Nc + l) * dimR + m]; |
2910 | } |
2911 | } |
2912 | } |
2913 | #if 0 && defined(PETSC_USE_DEBUG1) |
2914 | { |
2915 | PetscReal maxAbs = 0.; |
2916 | |
2917 | for (l = 0; l < Nc; l++) { |
2918 | maxAbs = PetscMax(maxAbs,PetscAbsReal(resNeg[l]))(((maxAbs)<(fabs(resNeg[l]))) ? (fabs(resNeg[l])) : (maxAbs )); |
2919 | } |
2920 | ierr = PetscInfo4(dm,"cell %D, point %D, iter %D: res %g\n",cell,j,i,maxAbs)PetscInfo_Private(__func__,dm,"cell %D, point %D, iter %D: res %g\n" ,cell,j,i,maxAbs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2920,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2921 | } |
2922 | #endif |
2923 | ierr = DMPlexCoordinatesToReference_NewtonUpdate(Nc,dimR,J,invJ,work,resNeg,guess);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2923,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2924 | } |
2925 | } |
2926 | ierr = DMRestoreWorkArray(dm,3 * Nc * dimR,MPIU_SCALAR((MPI_Datatype)0x4c00080b),&J);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2926,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2927 | ierr = DMRestoreWorkArray(dm,pdim * Nc + pdim * Nc * dimR + Nc,MPIU_REAL((MPI_Datatype)0x4c00080b),&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2927,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2928 | ierr = DMRestoreWorkArray(dm,pdim,MPIU_REAL((MPI_Datatype)0x4c00080b),&modes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2928,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2929 | ierr = DMPlexVecRestoreClosure(dm, NULL((void*)0), coords, cell, &coordSize, &nodes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2929,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2930 | 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); |
2931 | } |
2932 | |
2933 | /* TODO: TOBY please fix this for Nc > 1 */ |
2934 | static PetscErrorCode DMPlexReferenceToCoordinates_FE(DM dm, PetscFE fe, PetscInt cell, PetscInt numPoints, const PetscReal refCoords[], PetscReal realCoords[], Vec coords, PetscInt Nc, PetscInt dimR) |
2935 | { |
2936 | PetscInt numComp, pdim, i, j, k, l, coordSize; |
2937 | PetscScalar *nodes = NULL((void*)0); |
2938 | PetscReal *invV, *modes; |
2939 | PetscReal *B; |
2940 | PetscErrorCode ierr; |
2941 | |
2942 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 2942; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
2943 | ierr = PetscFEGetDimension(fe, &pdim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2943,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2944 | ierr = PetscFEGetNumComponents(fe, &numComp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2944,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2945 | if (numComp != Nc) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"coordinate discretization must have as many components (%D) as embedding dimension (!= %D)",numComp,Nc)return PetscError(PetscObjectComm((PetscObject)dm),2945,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"coordinate discretization must have as many components (%D) as embedding dimension (!= %D)" ,numComp,Nc); |
2946 | ierr = DMPlexVecGetClosure(dm, NULL((void*)0), coords, cell, &coordSize, &nodes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2946,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2947 | /* convert nodes to values in the stable evaluation basis */ |
2948 | ierr = DMGetWorkArray(dm,pdim,MPIU_REAL((MPI_Datatype)0x4c00080b),&modes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2948,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2949 | invV = fe->invV; |
2950 | for (i = 0; i < pdim; ++i) { |
2951 | modes[i] = 0.; |
2952 | for (j = 0; j < pdim; ++j) { |
2953 | modes[i] += invV[i * pdim + j] * PetscRealPart(nodes[j])(nodes[j]); |
2954 | } |
2955 | } |
2956 | ierr = DMGetWorkArray(dm,numPoints * pdim * Nc,MPIU_REAL((MPI_Datatype)0x4c00080b),&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2956,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2957 | ierr = PetscSpaceEvaluate(fe->basisSpace, numPoints, refCoords, B, NULL((void*)0), NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2957,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2958 | for (i = 0; i < numPoints * Nc; i++) {realCoords[i] = 0.;} |
2959 | for (j = 0; j < numPoints; j++) { |
2960 | PetscReal *mapped = &realCoords[j * Nc]; |
2961 | |
2962 | for (k = 0; k < pdim; k++) { |
2963 | for (l = 0; l < Nc; l++) { |
2964 | mapped[l] += modes[k] * B[(j * pdim + k) * Nc + l]; |
2965 | } |
2966 | } |
2967 | } |
2968 | ierr = DMRestoreWorkArray(dm,numPoints * pdim * Nc,MPIU_REAL((MPI_Datatype)0x4c00080b),&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2968,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2969 | ierr = DMRestoreWorkArray(dm,pdim,MPIU_REAL((MPI_Datatype)0x4c00080b),&modes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2969,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2970 | ierr = DMPlexVecRestoreClosure(dm, NULL((void*)0), coords, cell, &coordSize, &nodes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2970,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
2971 | 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); |
2972 | } |
2973 | |
2974 | /*@ |
2975 | DMPlexCoordinatesToReference - Pull coordinates back from the mesh to the reference element using a single element |
2976 | map. This inversion will be accurate inside the reference element, but may be inaccurate for mappings that do not |
2977 | extend uniquely outside the reference cell (e.g, most non-affine maps) |
2978 | |
2979 | Not collective |
2980 | |
2981 | Input Parameters: |
2982 | + dm - The mesh, with coordinate maps defined either by a PetscDS for the coordinate DM (see DMGetCoordinateDM()) or |
2983 | implicitly by the coordinates of the corner vertices of the cell: as an affine map for simplicial elements, or |
2984 | as a multilinear map for tensor-product elements |
2985 | . cell - the cell whose map is used. |
2986 | . numPoints - the number of points to locate |
2987 | - realCoords - (numPoints x coordinate dimension) array of coordinates (see DMGetCoordinateDim()) |
2988 | |
2989 | Output Parameters: |
2990 | . refCoords - (numPoints x dimension) array of reference coordinates (see DMGetDimension()) |
2991 | |
2992 | Level: intermediate |
2993 | |
2994 | .seealso: DMPlexReferenceToCoordinates() |
2995 | @*/ |
2996 | PetscErrorCode DMPlexCoordinatesToReference(DM dm, PetscInt cell, PetscInt numPoints, const PetscReal realCoords[], PetscReal refCoords[]) |
2997 | { |
2998 | PetscInt dimC, dimR, depth, cStart, cEnd, cEndInterior, i; |
2999 | DM coordDM = NULL((void*)0); |
3000 | Vec coords; |
3001 | PetscFE fe = NULL((void*)0); |
3002 | PetscErrorCode ierr; |
3003 | |
3004 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 3004; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
3005 | PetscValidHeaderSpecific(dm,DM_CLASSID,1)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),3005,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if ( !PetscCheckPointer(dm,PETSC_OBJECT)) return PetscError(((MPI_Comm )0x44000001),3005,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.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),3005,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),3005,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d" ,1); } } while (0); |
3006 | ierr = DMGetDimension(dm,&dimR);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3006,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3007 | ierr = DMGetCoordinateDim(dm,&dimC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3007,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3008 | if (dimR <= 0 || dimC <= 0 || numPoints <= 0) 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); |
3009 | ierr = DMPlexGetDepth(dm,&depth);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3009,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3010 | ierr = DMGetCoordinatesLocal(dm,&coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3010,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3011 | ierr = DMGetCoordinateDM(dm,&coordDM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3011,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3012 | if (coordDM) { |
3013 | PetscInt coordFields; |
3014 | |
3015 | ierr = DMGetNumFields(coordDM,&coordFields);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3015,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3016 | if (coordFields) { |
3017 | PetscClassId id; |
3018 | PetscObject disc; |
3019 | |
3020 | ierr = DMGetField(coordDM,0,NULL((void*)0),&disc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3020,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3021 | ierr = PetscObjectGetClassId(disc,&id);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3021,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3022 | if (id == PETSCFE_CLASSID) { |
3023 | fe = (PetscFE) disc; |
3024 | } |
3025 | } |
3026 | } |
3027 | ierr = DMPlexGetHeightStratum(dm,0,&cStart,&cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3027,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3028 | ierr = DMPlexGetHybridBounds(dm,&cEndInterior,NULL((void*)0),NULL((void*)0),NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3028,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3029 | cEnd = cEndInterior > 0 ? cEndInterior : cEnd; |
3030 | if (cell < cStart || cell >= cEnd) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"point %D not in cell range [%D,%D)",cell,cStart,cEnd)return PetscError(((MPI_Comm)0x44000001),3030,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"point %D not in cell range [%D,%D)", cell,cStart,cEnd); |
3031 | if (!fe) { /* implicit discretization: affine or multilinear */ |
3032 | PetscInt coneSize; |
3033 | PetscBool isSimplex, isTensor; |
3034 | |
3035 | ierr = DMPlexGetConeSize(dm,cell,&coneSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3035,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3036 | isSimplex = (coneSize == (dimR + 1)) ? PETSC_TRUE : PETSC_FALSE; |
3037 | isTensor = (coneSize == ((depth == 1) ? (1 << dimR) : (2 * dimR))) ? PETSC_TRUE : PETSC_FALSE; |
3038 | if (isSimplex) { |
3039 | PetscReal detJ, *v0, *J, *invJ; |
3040 | |
3041 | ierr = DMGetWorkArray(dm,dimC + 2 * dimC * dimC, MPIU_REAL((MPI_Datatype)0x4c00080b), &v0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3041,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3042 | J = &v0[dimC]; |
3043 | invJ = &J[dimC * dimC]; |
3044 | ierr = DMPlexComputeCellGeometryAffineFEM(dm, cell, v0, J, invJ, &detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3044,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3045 | for (i = 0; i < numPoints; i++) { /* Apply the inverse affine transformation for each point */ |
3046 | const PetscReal x0[3] = {-1.,-1.,-1.}; |
3047 | |
3048 | CoordinatesRealToRef(dimC, dimR, x0, v0, invJ, &realCoords[dimC * i], &refCoords[dimR * i]); |
3049 | } |
3050 | ierr = DMRestoreWorkArray(dm,dimC + 2 * dimC * dimC, MPIU_REAL((MPI_Datatype)0x4c00080b), &v0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3050,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3051 | } else if (isTensor) { |
3052 | ierr = DMPlexCoordinatesToReference_Tensor(coordDM, cell, numPoints, realCoords, refCoords, coords, dimC, dimR);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3052,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3053 | } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unrecognized cone size %D",coneSize)return PetscError(((MPI_Comm)0x44000001),3053,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"Unrecognized cone size %D",coneSize); |
3054 | } else { |
3055 | ierr = DMPlexCoordinatesToReference_FE(coordDM, fe, cell, numPoints, realCoords, refCoords, coords, dimC, dimR);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3055,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3056 | } |
3057 | 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); |
3058 | } |
3059 | |
3060 | /*@ |
3061 | DMPlexReferenceToCoordinates - Map references coordinates to coordinates in the the mesh for a single element map. |
3062 | |
3063 | Not collective |
3064 | |
3065 | Input Parameters: |
3066 | + dm - The mesh, with coordinate maps defined either by a PetscDS for the coordinate DM (see DMGetCoordinateDM()) or |
3067 | implicitly by the coordinates of the corner vertices of the cell: as an affine map for simplicial elements, or |
3068 | as a multilinear map for tensor-product elements |
3069 | . cell - the cell whose map is used. |
3070 | . numPoints - the number of points to locate |
3071 | + refCoords - (numPoints x dimension) array of reference coordinates (see DMGetDimension()) |
3072 | |
3073 | Output Parameters: |
3074 | . realCoords - (numPoints x coordinate dimension) array of coordinates (see DMGetCoordinateDim()) |
3075 | |
3076 | Level: intermediate |
3077 | |
3078 | .seealso: DMPlexCoordinatesToReference() |
3079 | @*/ |
3080 | PetscErrorCode DMPlexReferenceToCoordinates(DM dm, PetscInt cell, PetscInt numPoints, const PetscReal refCoords[], PetscReal realCoords[]) |
3081 | { |
3082 | PetscInt dimC, dimR, depth, cStart, cEnd, cEndInterior, i; |
3083 | DM coordDM = NULL((void*)0); |
3084 | Vec coords; |
3085 | PetscFE fe = NULL((void*)0); |
3086 | PetscErrorCode ierr; |
3087 | |
3088 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ; petscstack->line[petscstack->currentsize] = 3088; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
3089 | PetscValidHeaderSpecific(dm,DM_CLASSID,1)do { if (!dm) return PetscError(((MPI_Comm)0x44000001),3089,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if ( !PetscCheckPointer(dm,PETSC_OBJECT)) return PetscError(((MPI_Comm )0x44000001),3089,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.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),3089,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),3089,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,62,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d" ,1); } } while (0); |
3090 | ierr = DMGetDimension(dm,&dimR);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3090,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3091 | ierr = DMGetCoordinateDim(dm,&dimC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3091,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3092 | if (dimR <= 0 || dimC <= 0 || numPoints <= 0) 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); |
3093 | ierr = DMPlexGetDepth(dm,&depth);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3093,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3094 | ierr = DMGetCoordinatesLocal(dm,&coords);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3094,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3095 | ierr = DMGetCoordinateDM(dm,&coordDM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3095,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3096 | if (coordDM) { |
3097 | PetscInt coordFields; |
3098 | |
3099 | ierr = DMGetNumFields(coordDM,&coordFields);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3099,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3100 | if (coordFields) { |
3101 | PetscClassId id; |
3102 | PetscObject disc; |
3103 | |
3104 | ierr = DMGetField(coordDM,0,NULL((void*)0),&disc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3104,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3105 | ierr = PetscObjectGetClassId(disc,&id);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3105,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3106 | if (id == PETSCFE_CLASSID) { |
3107 | fe = (PetscFE) disc; |
3108 | } |
3109 | } |
3110 | } |
3111 | ierr = DMPlexGetHeightStratum(dm,0,&cStart,&cEnd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3111,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3112 | ierr = DMPlexGetHybridBounds(dm,&cEndInterior,NULL((void*)0),NULL((void*)0),NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3112,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3113 | cEnd = cEndInterior > 0 ? cEndInterior : cEnd; |
3114 | if (cell < cStart || cell >= cEnd) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"point %D not in cell range [%D,%D)",cell,cStart,cEnd)return PetscError(((MPI_Comm)0x44000001),3114,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,63,PETSC_ERROR_INITIAL,"point %D not in cell range [%D,%D)", cell,cStart,cEnd); |
3115 | if (!fe) { /* implicit discretization: affine or multilinear */ |
3116 | PetscInt coneSize; |
3117 | PetscBool isSimplex, isTensor; |
3118 | |
3119 | ierr = DMPlexGetConeSize(dm,cell,&coneSize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3119,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3120 | isSimplex = (coneSize == (dimR + 1)) ? PETSC_TRUE : PETSC_FALSE; |
3121 | isTensor = (coneSize == ((depth == 1) ? (1 << dimR) : (2 * dimR))) ? PETSC_TRUE : PETSC_FALSE; |
3122 | if (isSimplex) { |
3123 | PetscReal detJ, *v0, *J; |
3124 | |
3125 | ierr = DMGetWorkArray(dm,dimC + 2 * dimC * dimC, MPIU_REAL((MPI_Datatype)0x4c00080b), &v0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3125,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3126 | J = &v0[dimC]; |
3127 | ierr = DMPlexComputeCellGeometryAffineFEM(dm, cell, v0, J, NULL((void*)0), &detJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3127,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3128 | for (i = 0; i < numPoints; i++) { /* Apply the affine transformation for each point */ |
3129 | const PetscReal xi0[3] = {-1.,-1.,-1.}; |
3130 | |
3131 | CoordinatesRefToReal(dimC, dimR, xi0, v0, J, &refCoords[dimR * i], &realCoords[dimC * i]); |
3132 | } |
3133 | ierr = DMRestoreWorkArray(dm,dimC + 2 * dimC * dimC, MPIU_REAL((MPI_Datatype)0x4c00080b), &v0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3133,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3134 | } else if (isTensor) { |
3135 | ierr = DMPlexReferenceToCoordinates_Tensor(coordDM, cell, numPoints, refCoords, realCoords, coords, dimC, dimR);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3135,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3136 | } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unrecognized cone size %D",coneSize)return PetscError(((MPI_Comm)0x44000001),3136,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,56,PETSC_ERROR_INITIAL,"Unrecognized cone size %D",coneSize); |
3137 | } else { |
3138 | ierr = DMPlexReferenceToCoordinates_FE(coordDM, fe, cell, numPoints, refCoords, realCoords, coords, dimC, dimR);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3138,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/plex/plexgeometry.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
3139 | } |
3140 | 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); |
3141 | } |