Bug Summary

File:dm/impls/swarm/swarmpic.c
Warning:line 176, column 31
The left operand of '+' is a garbage value

Annotated Source Code

[?] Use j/k keys for keyboard navigation

1#define PETSCDM_DLL
2#include <petsc/private/dmswarmimpl.h> /*I "petscdmswarm.h" I*/
3#include <petscsf.h>
4#include <petscdmda.h>
5#include <petscdmplex.h>
6#include "../src/dm/impls/swarm/data_bucket.h"
7
8/*
9 Error chceking macto to ensure the swarm type is correct and that a cell DM has been set
10*/
11#define DMSWARMPICVALID(dm){ DM_Swarm *_swarm = (DM_Swarm*)(dm)->data; if (_swarm->
swarm_type != DMSWARM_PIC) return PetscError(PetscObjectComm(
(PetscObject)(dm)),11,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarm-PIC. You must call DMSwarmSetType(dm,DMSWARM_PIC)"
); else if (!_swarm->dmcell) return PetscError(PetscObjectComm
((PetscObject)(dm)),11,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarmPIC if the cell DM is set. You must call DMSwarmSetCellDM(dm,celldm)"
); }
\
12{ \
13 DM_Swarm *_swarm = (DM_Swarm*)(dm)->data; \
14 if (_swarm->swarm_type != DMSWARM_PIC) SETERRQ(PetscObjectComm((PetscObject)(dm)),PETSC_ERR_SUP,"Only valid for DMSwarm-PIC. You must call DMSwarmSetType(dm,DMSWARM_PIC)")return PetscError(PetscObjectComm((PetscObject)(dm)),14,__func__
,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarm-PIC. You must call DMSwarmSetType(dm,DMSWARM_PIC)"
)
; \
15 else \
16 if (!_swarm->dmcell) SETERRQ(PetscObjectComm((PetscObject)(dm)),PETSC_ERR_SUP,"Only valid for DMSwarmPIC if the cell DM is set. You must call DMSwarmSetCellDM(dm,celldm)")return PetscError(PetscObjectComm((PetscObject)(dm)),16,__func__
,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarmPIC if the cell DM is set. You must call DMSwarmSetCellDM(dm,celldm)"
)
; \
17}
18
19/* Coordinate insertition/addition API */
20/*@C
21 DMSwarmSetPointsUniformCoordinates - Set point coordinates in a DMSwarm on a regular (ijk) grid
22
23 Collective on dm
24
25 Input parameters:
26+ dm - the DMSwarm
27. min - minimum coordinate values in the x, y, z directions (array of length dim)
28. max - maximum coordinate values in the x, y, z directions (array of length dim)
29. npoints - number of points in each spatial direction (array of length dim)
30- mode - indicates whether to append points to the swarm (ADD_VALUES), or over-ride existing points (INSERT_VALUES)
31
32 Level: beginner
33
34 Notes:
35 When using mode = INSERT_VALUES, this method will reset the number of particles in the DMSwarm
36 to be npoints[0]*npoints[1] (2D) or npoints[0]*npoints[1]*npoints[2] (3D). When using mode = ADD_VALUES,
37 new points will be appended to any already existing in the DMSwarm
38
39.seealso: DMSwarmSetType(), DMSwarmSetCellDM(), DMSwarmType
40@*/
41PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode DMSwarmSetPointsUniformCoordinates(DM dm,PetscReal min[],PetscReal max[],PetscInt npoints[],InsertMode mode)
42{
43 PetscErrorCode ierr;
44 PetscReal gmin[] = {PETSC_MAX_REAL1.7976931348623157e+308 ,PETSC_MAX_REAL1.7976931348623157e+308, PETSC_MAX_REAL1.7976931348623157e+308};
45 PetscReal gmax[] = {PETSC_MIN_REAL(-1.7976931348623157e+308), PETSC_MIN_REAL(-1.7976931348623157e+308), PETSC_MIN_REAL(-1.7976931348623157e+308)};
46 PetscInt i,j,k,N,bs,b,n_estimate,n_curr,n_new_est,p,n_found;
1
'n_curr' declared without an initial value
47 Vec coorlocal;
48 const PetscScalar *_coor;
49 DM celldm;
50 PetscReal dx[3];
51 PetscInt _npoints[] = { 0, 0, 1 };
52 Vec pos;
53 PetscScalar *_pos;
54 PetscReal *swarm_coor;
55 PetscInt *swarm_cellid;
56 PetscSF sfcell = NULL((void*)0);
57 const PetscSFNode *LA_sfcell;
58
59 PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize
< 64)) { petscstack->function[petscstack->currentsize
] = __func__; petscstack->file[petscstack->currentsize]
= "/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
; petscstack->line[petscstack->currentsize] = 59; petscstack
->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack
->currentsize++; } if (petscstack) { petscstack->hotdepth
+= (PETSC_FALSE || petscstack->hotdepth); } ; } while (0)
; ; } while (0)
;
60 DMSWARMPICVALID(dm){ DM_Swarm *_swarm = (DM_Swarm*)(dm)->data; if (_swarm->
swarm_type != DMSWARM_PIC) return PetscError(PetscObjectComm(
(PetscObject)(dm)),60,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarm-PIC. You must call DMSwarmSetType(dm,DMSWARM_PIC)"
); else if (!_swarm->dmcell) return PetscError(PetscObjectComm
((PetscObject)(dm)),60,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarmPIC if the cell DM is set. You must call DMSwarmSetCellDM(dm,celldm)"
); }
;
61 ierr = DMSwarmGetCellDM(dm,&celldm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),61,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
62 ierr = DMGetCoordinatesLocal(celldm,&coorlocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),62,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
63 ierr = VecGetSize(coorlocal,&N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),63,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
64 ierr = VecGetBlockSize(coorlocal,&bs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),64,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
65 N = N / bs;
66 ierr = VecGetArrayRead(coorlocal,&_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),66,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
67 for (i=0; i<N; i++) {
2
Assuming 'i' is >= 'N'
3
Loop condition is false. Execution continues on line 73
68 for (b=0; b<bs; b++) {
69 gmin[b] = PetscMin(gmin[b],PetscRealPart(_coor[bs*i+b]))(((gmin[b])<((_coor[bs*i+b]))) ? (gmin[b]) : ((_coor[bs*i+
b])))
;
70 gmax[b] = PetscMax(gmax[b],PetscRealPart(_coor[bs*i+b]))(((gmax[b])<((_coor[bs*i+b]))) ? ((_coor[bs*i+b])) : (gmax
[b]))
;
71 }
72 }
73 ierr = VecRestoreArrayRead(coorlocal,&_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),73,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
74
75 for (b=0; b<bs; b++) {
4
Assuming 'b' is < 'bs'
5
Loop condition is true. Entering loop body
8
Assuming 'b' is < 'bs'
9
Loop condition is true. Entering loop body
12
Assuming 'b' is >= 'bs'
13
Loop condition is false. Execution continues on line 86
76 if (npoints[b] > 1) {
6
Assuming the condition is false
7
Taking false branch
10
Assuming the condition is false
11
Taking false branch
77 dx[b] = (max[b] - min[b])/((PetscReal)(npoints[b]-1));
78 } else {
79 dx[b] = 0.0;
80 }
81
82 _npoints[b] = npoints[b];
83 }
84
85 /* determine number of points living in the bounding box */
86 n_estimate = 0;
87 for (k=0; k<_npoints[2]; k++) {
14
Loop condition is true. Entering loop body
32
Loop condition is false. Execution continues on line 110
88 for (j=0; j<_npoints[1]; j++) {
15
Assuming the condition is true
16
Loop condition is true. Entering loop body
31
Loop condition is false. Execution continues on line 87
89 for (i=0; i<_npoints[0]; i++) {
17
Assuming the condition is true
18
Loop condition is true. Entering loop body
30
Loop condition is false. Execution continues on line 88
90 PetscReal xp[] = {0.0,0.0,0.0};
91 PetscInt ijk[3];
92 PetscBool point_inside = PETSC_TRUE;
93
94 ijk[0] = i;
95 ijk[1] = j;
96 ijk[2] = k;
97 for (b=0; b<bs; b++) {
19
Loop condition is true. Entering loop body
20
Loop condition is true. Entering loop body
21
Loop condition is false. Execution continues on line 100
98 xp[b] = min[b] + ijk[b] * dx[b];
99 }
100 for (b=0; b<bs; b++) {
22
Loop condition is true. Entering loop body
25
Loop condition is true. Entering loop body
28
Loop condition is false. Execution continues on line 104
101 if (xp[b] < gmin[b]) { point_inside = PETSC_FALSE; }
23
Taking false branch
26
Taking false branch
102 if (xp[b] > gmax[b]) { point_inside = PETSC_FALSE; }
24
Taking false branch
27
Taking true branch
103 }
104 if (point_inside) { n_estimate++; }
29
Taking false branch
105 }
106 }
107 }
108
109 /* create candidate list */
110 ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001),&pos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),110,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
111 ierr = VecSetSizes(pos,bs*n_estimate,PETSC_DECIDE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),111,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
112 ierr = VecSetBlockSize(pos,bs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),112,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
113 ierr = VecSetFromOptions(pos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),113,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
114 ierr = VecGetArray(pos,&_pos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),114,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
115
116 n_estimate = 0;
117 for (k=0; k<_npoints[2]; k++) {
33
Loop condition is true. Entering loop body
52
Loop condition is false. Execution continues on line 143
118 for (j=0; j<_npoints[1]; j++) {
34
Loop condition is true. Entering loop body
51
Loop condition is false. Execution continues on line 117
119 for (i=0; i<_npoints[0]; i++) {
35
Loop condition is true. Entering loop body
50
Loop condition is false. Execution continues on line 118
120 PetscReal xp[] = {0.0,0.0,0.0};
121 PetscInt ijk[3];
122 PetscBool point_inside = PETSC_TRUE;
123
124 ijk[0] = i;
125 ijk[1] = j;
126 ijk[2] = k;
127 for (b=0; b<bs; b++) {
36
Loop condition is true. Entering loop body
37
Loop condition is true. Entering loop body
38
Loop condition is false. Execution continues on line 130
128 xp[b] = min[b] + ijk[b] * dx[b];
129 }
130 for (b=0; b<bs; b++) {
39
Loop condition is true. Entering loop body
42
Loop condition is true. Entering loop body
45
Loop condition is false. Execution continues on line 134
131 if (xp[b] < gmin[b]) { point_inside = PETSC_FALSE; }
40
Taking false branch
43
Taking false branch
132 if (xp[b] > gmax[b]) { point_inside = PETSC_FALSE; }
41
Taking false branch
44
Taking false branch
133 }
134 if (point_inside) {
46
Taking true branch
135 for (b=0; b<bs; b++) {
47
Loop condition is true. Entering loop body
48
Loop condition is true. Entering loop body
49
Loop condition is false. Execution continues on line 138
136 _pos[bs*n_estimate+b] = xp[b];
137 }
138 n_estimate++;
139 }
140 }
141 }
142 }
143 ierr = VecRestoreArray(pos,&_pos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),143,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
144
145 /* locate points */
146 ierr = DMLocatePoints(celldm,pos,DM_POINTLOCATION_NONE,&sfcell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),146,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
147
148 ierr = PetscSFGetGraph(sfcell, NULL((void*)0), NULL((void*)0), NULL((void*)0), &LA_sfcell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),148,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
149 n_found = 0;
150 for (p=0; p<n_estimate; p++) {
53
Loop condition is true. Entering loop body
56
Loop condition is false. Execution continues on line 157
151 if (LA_sfcell[p].index != DMLOCATEPOINT_POINT_NOT_FOUND-367) {
54
Assuming the condition is true
55
Taking true branch
152 n_found++;
153 }
154 }
155
156 /* adjust size */
157 if (mode == ADD_VALUES) {
57
Assuming 'mode' is not equal to ADD_VALUES
58
Taking false branch
158 ierr = DMSwarmGetLocalSize(dm,&n_curr);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),158,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
159 n_new_est = n_curr + n_found;
160 ierr = DMSwarmSetLocalSizes(dm,n_new_est,-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),160,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
161 }
162 if (mode == INSERT_VALUES) {
59
Assuming 'mode' is not equal to INSERT_VALUES
60
Taking false branch
163 n_curr = 0;
164 n_new_est = n_found;
165 ierr = DMSwarmSetLocalSizes(dm,n_new_est,-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),165,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
166 }
167
168 /* initialize new coords, cell owners, pid */
169 ierr = VecGetArrayRead(pos,&_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),169,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
170 ierr = DMSwarmGetField(dm,DMSwarmPICField_coor,NULL((void*)0),NULL((void*)0),(void**)&swarm_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),170,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
171 ierr = DMSwarmGetField(dm,DMSwarmPICField_cellid,NULL((void*)0),NULL((void*)0),(void**)&swarm_cellid);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),171,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
172 n_found = 0;
173 for (p=0; p<n_estimate; p++) {
61
Loop condition is true. Entering loop body
174 if (LA_sfcell[p].index != DMLOCATEPOINT_POINT_NOT_FOUND-367) {
62
Taking true branch
175 for (b=0; b<bs; b++) {
63
Loop condition is true. Entering loop body
176 swarm_coor[bs*(n_curr + n_found) + b] = PetscRealPart(_coor[bs*p+b])(_coor[bs*p+b]);
64
The left operand of '+' is a garbage value
177 }
178 swarm_cellid[n_curr + n_found] = LA_sfcell[p].index;
179 n_found++;
180 }
181 }
182 ierr = DMSwarmRestoreField(dm,DMSwarmPICField_cellid,NULL((void*)0),NULL((void*)0),(void**)&swarm_cellid);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),182,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
183 ierr = DMSwarmRestoreField(dm,DMSwarmPICField_coor,NULL((void*)0),NULL((void*)0),(void**)&swarm_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),183,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
184 ierr = VecRestoreArrayRead(pos,&_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),184,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
185
186 ierr = PetscSFDestroy(&sfcell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),186,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
187 ierr = VecDestroy(&pos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),187,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
188
189 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)
;
190}
191
192/*@C
193 DMSwarmSetPointCoordinates - Set point coordinates in a DMSwarm from a user defined list
194
195 Collective on dm
196
197 Input parameters:
198+ dm - the DMSwarm
199. npoints - the number of points to insert
200. coor - the coordinate values
201. redundant - if set to PETSC_TRUE, it is assumed that npoints and coor[] are only valid on rank 0 and should be broadcast to other ranks
202- mode - indicates whether to append points to the swarm (ADD_VALUES), or over-ride existing points (INSERT_VALUES)
203
204 Level: beginner
205
206 Notes:
207 If the user has specified redundant = PETSC_FALSE, the cell DM will attempt to locate the coordinates provided by coor[] within
208 its sub-domain. If they any values within coor[] are not located in the sub-domain, they will be ignored and will not get
209 added to the DMSwarm.
210
211.seealso: DMSwarmSetType(), DMSwarmSetCellDM(), DMSwarmType, DMSwarmSetPointsUniformCoordinates()
212@*/
213PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode DMSwarmSetPointCoordinates(DM dm,PetscInt npoints,PetscReal coor[],PetscBool redundant,InsertMode mode)
214{
215 PetscErrorCode ierr;
216 PetscReal gmin[] = {PETSC_MAX_REAL1.7976931348623157e+308 ,PETSC_MAX_REAL1.7976931348623157e+308, PETSC_MAX_REAL1.7976931348623157e+308};
217 PetscReal gmax[] = {PETSC_MIN_REAL(-1.7976931348623157e+308), PETSC_MIN_REAL(-1.7976931348623157e+308), PETSC_MIN_REAL(-1.7976931348623157e+308)};
218 PetscInt i,N,bs,b,n_estimate,n_curr,n_new_est,p,n_found;
219 Vec coorlocal;
220 const PetscScalar *_coor;
221 DM celldm;
222 Vec pos;
223 PetscScalar *_pos;
224 PetscReal *swarm_coor;
225 PetscInt *swarm_cellid;
226 PetscSF sfcell = NULL((void*)0);
227 const PetscSFNode *LA_sfcell;
228 PetscReal *my_coor;
229 PetscInt my_npoints;
230 PetscMPIInt rank;
231 MPI_Comm comm;
232
233 PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize
< 64)) { petscstack->function[petscstack->currentsize
] = __func__; petscstack->file[petscstack->currentsize]
= "/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
; petscstack->line[petscstack->currentsize] = 233; petscstack
->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack
->currentsize++; } if (petscstack) { petscstack->hotdepth
+= (PETSC_FALSE || petscstack->hotdepth); } ; } while (0)
; ; } while (0)
;
234 DMSWARMPICVALID(dm){ DM_Swarm *_swarm = (DM_Swarm*)(dm)->data; if (_swarm->
swarm_type != DMSWARM_PIC) return PetscError(PetscObjectComm(
(PetscObject)(dm)),234,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarm-PIC. You must call DMSwarmSetType(dm,DMSWARM_PIC)"
); else if (!_swarm->dmcell) return PetscError(PetscObjectComm
((PetscObject)(dm)),234,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarmPIC if the cell DM is set. You must call DMSwarmSetCellDM(dm,celldm)"
); }
;
235 ierr = PetscObjectGetComm((PetscObject)dm,&comm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),235,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
236 ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),236,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
237
238 ierr = DMSwarmGetCellDM(dm,&celldm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),238,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
239 ierr = DMGetCoordinatesLocal(celldm,&coorlocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),239,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
240 ierr = VecGetSize(coorlocal,&N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),240,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
241 ierr = VecGetBlockSize(coorlocal,&bs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),241,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
242 N = N / bs;
243 ierr = VecGetArrayRead(coorlocal,&_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),243,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
244 for (i=0; i<N; i++) {
245 for (b=0; b<bs; b++) {
246 gmin[b] = PetscMin(gmin[b],PetscRealPart(_coor[bs*i+b]))(((gmin[b])<((_coor[bs*i+b]))) ? (gmin[b]) : ((_coor[bs*i+
b])))
;
247 gmax[b] = PetscMax(gmax[b],PetscRealPart(_coor[bs*i+b]))(((gmax[b])<((_coor[bs*i+b]))) ? ((_coor[bs*i+b])) : (gmax
[b]))
;
248 }
249 }
250 ierr = VecRestoreArrayRead(coorlocal,&_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),250,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
251
252 /* broadcast points from rank 0 if requested */
253 if (redundant) {
254 my_npoints = npoints;
255 ierr = MPI_Bcast(&my_npoints,1,MPIU_INT,0,comm)((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast
((&my_npoints),(1),(((MPI_Datatype)0x4c000405)),(0),(comm
)))
;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),255,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
256
257 if (rank > 0) { /* allocate space */
258 ierr = PetscMalloc1(bs*my_npoints,&my_coor)PetscMallocA(1,PETSC_FALSE,258,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,(size_t)(bs*my_npoints)*sizeof(**(&my_coor)),(&my_coor
))
;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),258,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
259 } else {
260 my_coor = coor;
261 }
262 ierr = MPI_Bcast(my_coor,bs*my_npoints,MPIU_REAL,0,comm)((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast
((my_coor),(bs*my_npoints),(((MPI_Datatype)0x4c00080b)),(0),(
comm)))
;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),262,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
263 } else {
264 my_npoints = npoints;
265 my_coor = coor;
266 }
267
268 /* determine the number of points living in the bounding box */
269 n_estimate = 0;
270 for (i=0; i<my_npoints; i++) {
271 PetscBool point_inside = PETSC_TRUE;
272
273 for (b=0; b<bs; b++) {
274 if (my_coor[bs*i+b] < gmin[b]) { point_inside = PETSC_FALSE; }
275 if (my_coor[bs*i+b] > gmax[b]) { point_inside = PETSC_FALSE; }
276 }
277 if (point_inside) { n_estimate++; }
278 }
279
280 /* create candidate list */
281 ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001),&pos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),281,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
282 ierr = VecSetSizes(pos,bs*n_estimate,PETSC_DECIDE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),282,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
283 ierr = VecSetBlockSize(pos,bs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),283,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
284 ierr = VecSetFromOptions(pos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),284,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
285 ierr = VecGetArray(pos,&_pos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),285,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
286
287 n_estimate = 0;
288 for (i=0; i<my_npoints; i++) {
289 PetscBool point_inside = PETSC_TRUE;
290
291 for (b=0; b<bs; b++) {
292 if (my_coor[bs*i+b] < gmin[b]) { point_inside = PETSC_FALSE; }
293 if (my_coor[bs*i+b] > gmax[b]) { point_inside = PETSC_FALSE; }
294 }
295 if (point_inside) {
296 for (b=0; b<bs; b++) {
297 _pos[bs*n_estimate+b] = my_coor[bs*i+b];
298 }
299 n_estimate++;
300 }
301 }
302 ierr = VecRestoreArray(pos,&_pos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),302,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
303
304 /* locate points */
305 ierr = DMLocatePoints(celldm,pos,DM_POINTLOCATION_NONE,&sfcell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),305,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
306
307 ierr = PetscSFGetGraph(sfcell, NULL((void*)0), NULL((void*)0), NULL((void*)0), &LA_sfcell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),307,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
308 n_found = 0;
309 for (p=0; p<n_estimate; p++) {
310 if (LA_sfcell[p].index != DMLOCATEPOINT_POINT_NOT_FOUND-367) {
311 n_found++;
312 }
313 }
314
315 /* adjust size */
316 if (mode == ADD_VALUES) {
317 ierr = DMSwarmGetLocalSize(dm,&n_curr);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),317,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
318 n_new_est = n_curr + n_found;
319 ierr = DMSwarmSetLocalSizes(dm,n_new_est,-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),319,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
320 }
321 if (mode == INSERT_VALUES) {
322 n_curr = 0;
323 n_new_est = n_found;
324 ierr = DMSwarmSetLocalSizes(dm,n_new_est,-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),324,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
325 }
326
327 /* initialize new coords, cell owners, pid */
328 ierr = VecGetArrayRead(pos,&_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),328,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
329 ierr = DMSwarmGetField(dm,DMSwarmPICField_coor,NULL((void*)0),NULL((void*)0),(void**)&swarm_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),329,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
330 ierr = DMSwarmGetField(dm,DMSwarmPICField_cellid,NULL((void*)0),NULL((void*)0),(void**)&swarm_cellid);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),330,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
331 n_found = 0;
332 for (p=0; p<n_estimate; p++) {
333 if (LA_sfcell[p].index != DMLOCATEPOINT_POINT_NOT_FOUND-367) {
334 for (b=0; b<bs; b++) {
335 swarm_coor[bs*(n_curr + n_found) + b] = PetscRealPart(_coor[bs*p+b])(_coor[bs*p+b]);
336 }
337 swarm_cellid[n_curr + n_found] = LA_sfcell[p].index;
338 n_found++;
339 }
340 }
341 ierr = DMSwarmRestoreField(dm,DMSwarmPICField_cellid,NULL((void*)0),NULL((void*)0),(void**)&swarm_cellid);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),341,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
342 ierr = DMSwarmRestoreField(dm,DMSwarmPICField_coor,NULL((void*)0),NULL((void*)0),(void**)&swarm_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),342,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
343 ierr = VecRestoreArrayRead(pos,&_coor);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),343,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
344
345 if (redundant) {
346 if (rank > 0) {
347 ierr = PetscFree(my_coor)((*PetscTrFree)((void*)(my_coor),347,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
) || ((my_coor) = 0,0))
;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),347,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
348 }
349 }
350 ierr = PetscSFDestroy(&sfcell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),350,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
351 ierr = VecDestroy(&pos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),351,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
352
353 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)
;
354}
355
356extern PetscErrorCode private_DMSwarmInsertPointsUsingCellDM_DA(DM,DM,DMSwarmPICLayoutType,PetscInt);
357extern PetscErrorCode private_DMSwarmInsertPointsUsingCellDM_PLEX(DM,DM,DMSwarmPICLayoutType,PetscInt);
358
359/*@C
360 DMSwarmInsertPointsUsingCellDM - Insert point coordinates within each cell
361
362 Not collective
363
364 Input parameters:
365+ dm - the DMSwarm
366. layout_type - method used to fill each cell with the cell DM
367- fill_param - parameter controlling how many points per cell are added (the meaning of this parameter is dependent on the layout type)
368
369 Level: beginner
370
371 Notes:
372
373 The insert method will reset any previous defined points within the DMSwarm.
374
375 When using a DMDA both 2D and 3D are supported for all layout types provided you are using DMDA_ELEMENT_Q1.
376
377 When using a DMPLEX the following case are supported:
378 (i ) DMSWARMPIC_LAYOUT_REGULAR: 2D (triangle),
379 (ii ) DMSWARMPIC_LAYOUT_GAUSS: 2D and 3D provided the cell is a tri/tet or a quad/hex,
380 (iii) DMSWARMPIC_LAYOUT_SUBDIVISION: 2D and 3D for quad/hex and 2D tri.
381
382.seealso: DMSwarmPICLayoutType, DMSwarmSetType(), DMSwarmSetCellDM(), DMSwarmType
383@*/
384PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode DMSwarmInsertPointsUsingCellDM(DM dm,DMSwarmPICLayoutType layout_type,PetscInt fill_param)
385{
386 PetscErrorCode ierr;
387 DM celldm;
388 PetscBool isDA,isPLEX;
389
390 PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize
< 64)) { petscstack->function[petscstack->currentsize
] = __func__; petscstack->file[petscstack->currentsize]
= "/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
; petscstack->line[petscstack->currentsize] = 390; petscstack
->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack
->currentsize++; } if (petscstack) { petscstack->hotdepth
+= (PETSC_FALSE || petscstack->hotdepth); } ; } while (0)
; ; } while (0)
;
391 DMSWARMPICVALID(dm){ DM_Swarm *_swarm = (DM_Swarm*)(dm)->data; if (_swarm->
swarm_type != DMSWARM_PIC) return PetscError(PetscObjectComm(
(PetscObject)(dm)),391,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarm-PIC. You must call DMSwarmSetType(dm,DMSWARM_PIC)"
); else if (!_swarm->dmcell) return PetscError(PetscObjectComm
((PetscObject)(dm)),391,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarmPIC if the cell DM is set. You must call DMSwarmSetCellDM(dm,celldm)"
); }
;
392 ierr = DMSwarmGetCellDM(dm,&celldm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),392,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
393 ierr = PetscObjectTypeCompare((PetscObject)celldm,DMDA"da",&isDA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),393,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
394 ierr = PetscObjectTypeCompare((PetscObject)celldm,DMPLEX"plex",&isPLEX);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),394,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
395 if (isDA) {
396 ierr = private_DMSwarmInsertPointsUsingCellDM_DA(dm,celldm,layout_type,fill_param);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),396,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
397 } else if (isPLEX) {
398 ierr = private_DMSwarmInsertPointsUsingCellDM_PLEX(dm,celldm,layout_type,fill_param);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),398,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
399 } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Only supported for cell DMs of type DMDA and DMPLEX")return PetscError(PetscObjectComm((PetscObject)dm),399,__func__
,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only supported for cell DMs of type DMDA and DMPLEX"
)
;
400
401 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)
;
402}
403
404
405extern PetscErrorCode private_DMSwarmSetPointCoordinatesCellwise_PLEX(DM,DM,PetscInt,PetscReal*);
406
407/*@C
408 DMSwarmSetPointCoordinatesCellwise - Insert point coordinates (defined over the reference cell) within each cell
409
410 Not collective
411
412 Input parameters:
413+ dm - the DMSwarm
414. celldm - the cell DM
415. npoints - the number of points to insert in each cell
416- xi - the coordinates (defined in the local coordinate system for each cell) to insert
417
418 Level: beginner
419
420 Notes:
421 The method will reset any previous defined points within the DMSwarm.
422 Only supported for DMPLEX. If you are using a DMDA it is recommended to either use
423 DMSwarmInsertPointsUsingCellDM(), or extract and set the coordinates yourself the following code
424
425$ PetscReal *coor;
426$ DMSwarmGetField(dm,DMSwarmPICField_coor,NULL,NULL,(void**)&coor);
427$ // user code to define the coordinates here
428$ DMSwarmRestoreField(dm,DMSwarmPICField_coor,NULL,NULL,(void**)&coor);
429
430.seealso: DMSwarmSetCellDM(), DMSwarmInsertPointsUsingCellDM()
431@*/
432PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode DMSwarmSetPointCoordinatesCellwise(DM dm,PetscInt npoints,PetscReal xi[])
433{
434 PetscErrorCode ierr;
435 DM celldm;
436 PetscBool isDA,isPLEX;
437
438 PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize
< 64)) { petscstack->function[petscstack->currentsize
] = __func__; petscstack->file[petscstack->currentsize]
= "/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
; petscstack->line[petscstack->currentsize] = 438; petscstack
->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack
->currentsize++; } if (petscstack) { petscstack->hotdepth
+= (PETSC_FALSE || petscstack->hotdepth); } ; } while (0)
; ; } while (0)
;
439 DMSWARMPICVALID(dm){ DM_Swarm *_swarm = (DM_Swarm*)(dm)->data; if (_swarm->
swarm_type != DMSWARM_PIC) return PetscError(PetscObjectComm(
(PetscObject)(dm)),439,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarm-PIC. You must call DMSwarmSetType(dm,DMSWARM_PIC)"
); else if (!_swarm->dmcell) return PetscError(PetscObjectComm
((PetscObject)(dm)),439,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarmPIC if the cell DM is set. You must call DMSwarmSetCellDM(dm,celldm)"
); }
;
440 ierr = DMSwarmGetCellDM(dm,&celldm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),440,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
441 ierr = PetscObjectTypeCompare((PetscObject)celldm,DMDA"da",&isDA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),441,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
442 ierr = PetscObjectTypeCompare((PetscObject)celldm,DMPLEX"plex",&isPLEX);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),442,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
443 if (isDA) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Only supported for cell DMs of type DMPLEX. Recommended you use DMSwarmInsertPointsUsingCellDM()")return PetscError(PetscObjectComm((PetscObject)dm),443,__func__
,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only supported for cell DMs of type DMPLEX. Recommended you use DMSwarmInsertPointsUsingCellDM()"
)
;
444 else if (isPLEX) {
445 ierr = private_DMSwarmSetPointCoordinatesCellwise_PLEX(dm,celldm,npoints,xi);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),445,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
446 } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Only supported for cell DMs of type DMDA and DMPLEX")return PetscError(PetscObjectComm((PetscObject)dm),446,__func__
,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only supported for cell DMs of type DMDA and DMPLEX"
)
;
447
448 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)
;
449}
450
451
452/* Field projection API */
453extern PetscErrorCode private_DMSwarmProjectFields_DA(DM swarm,DM celldm,PetscInt project_type,PetscInt nfields,DMSwarmDataField dfield[],Vec vecs[]);
454extern PetscErrorCode private_DMSwarmProjectFields_PLEX(DM swarm,DM celldm,PetscInt project_type,PetscInt nfields,DMSwarmDataField dfield[],Vec vecs[]);
455
456/*@C
457 DMSwarmProjectFields - Project a set of swarm fields onto the cell DM
458
459 Collective on dm
460
461 Input parameters:
462+ dm - the DMSwarm
463. nfields - the number of swarm fields to project
464. fieldnames - the textual names of the swarm fields to project
465. fields - an array of Vec's of length nfields
466- reuse - flag indicating whether the array and contents of fields should be re-used or internally allocated
467
468 Currently, the only available projection method consists of
469 phi_i = \sum_{p=0}^{np} N_i(x_p) phi_p dJ / \sum_{p=0}^{np} N_i(x_p) dJ
470 where phi_p is the swarm field at point p,
471 N_i() is the cell DM basis function at vertex i,
472 dJ is the determinant of the cell Jacobian and
473 phi_i is the projected vertex value of the field phi.
474
475 Level: beginner
476
477 Notes:
478
479 If reuse = PETSC_FALSE, this function will allocate the array of Vec's, and each individual Vec.
480 The user is responsible for destroying both the array and the individual Vec objects.
481
482 Only swarm fields registered with data type = PETSC_REAL can be projected onto the cell DM.
483
484 Only swarm fields of block size = 1 can currently be projected.
485
486 The only projection methods currently only support the DA (2D) and PLEX (triangles 2D).
487
488.seealso: DMSwarmSetType(), DMSwarmSetCellDM(), DMSwarmType
489@*/
490PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode DMSwarmProjectFields(DM dm,PetscInt nfields,const char *fieldnames[],Vec **fields,PetscBool reuse)
491{
492 DM_Swarm *swarm = (DM_Swarm*)dm->data;
493 DMSwarmDataField *gfield;
494 DM celldm;
495 PetscBool isDA,isPLEX;
496 Vec *vecs;
497 PetscInt f,nvecs;
498 PetscInt project_type = 0;
499 PetscErrorCode ierr;
500
501 PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize
< 64)) { petscstack->function[petscstack->currentsize
] = __func__; petscstack->file[petscstack->currentsize]
= "/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
; petscstack->line[petscstack->currentsize] = 501; petscstack
->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack
->currentsize++; } if (petscstack) { petscstack->hotdepth
+= (PETSC_FALSE || petscstack->hotdepth); } ; } while (0)
; ; } while (0)
;
502 DMSWARMPICVALID(dm){ DM_Swarm *_swarm = (DM_Swarm*)(dm)->data; if (_swarm->
swarm_type != DMSWARM_PIC) return PetscError(PetscObjectComm(
(PetscObject)(dm)),502,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarm-PIC. You must call DMSwarmSetType(dm,DMSWARM_PIC)"
); else if (!_swarm->dmcell) return PetscError(PetscObjectComm
((PetscObject)(dm)),502,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only valid for DMSwarmPIC if the cell DM is set. You must call DMSwarmSetCellDM(dm,celldm)"
); }
;
503 ierr = DMSwarmGetCellDM(dm,&celldm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),503,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
504 ierr = PetscMalloc1(nfields,&gfield)PetscMallocA(1,PETSC_FALSE,504,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,(size_t)(nfields)*sizeof(**(&gfield)),(&gfield))
;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),504,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
505 nvecs = 0;
506 for (f=0; f<nfields; f++) {
507 ierr = DMSwarmDataBucketGetDMSwarmDataFieldByName(swarm->db,fieldnames[f],&gfield[f]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),507,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
508 if (gfield[f]->petsc_type != PETSC_REALPETSC_DOUBLE) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Projection only valid for fields using a data type = PETSC_REAL")return PetscError(PetscObjectComm((PetscObject)dm),508,__func__
,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Projection only valid for fields using a data type = PETSC_REAL"
)
;
509 if (gfield[f]->bs != 1) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Projection only valid for fields with block size = 1")return PetscError(PetscObjectComm((PetscObject)dm),509,__func__
,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Projection only valid for fields with block size = 1"
)
;
510 nvecs += gfield[f]->bs;
511 }
512 if (!reuse) {
513 ierr = PetscMalloc1(nvecs,&vecs)PetscMallocA(1,PETSC_FALSE,513,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,(size_t)(nvecs)*sizeof(**(&vecs)),(&vecs))
;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),513,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
514 for (f=0; f<nvecs; f++) {
515 ierr = DMCreateGlobalVector(celldm,&vecs[f]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),515,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
516 ierr = PetscObjectSetName((PetscObject)vecs[f],gfield[f]->name);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),516,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
517 }
518 } else {
519 vecs = *fields;
520 }
521
522 ierr = PetscObjectTypeCompare((PetscObject)celldm,DMDA"da",&isDA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),522,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
523 ierr = PetscObjectTypeCompare((PetscObject)celldm,DMPLEX"plex",&isPLEX);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),523,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
524 if (isDA) {
525 ierr = private_DMSwarmProjectFields_DA(dm,celldm,project_type,nfields,gfield,vecs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),525,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
526 } else if (isPLEX) {
527 ierr = private_DMSwarmProjectFields_PLEX(dm,celldm,project_type,nfields,gfield,vecs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),527,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
528 } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Only supported for cell DMs of type DMDA and DMPLEX")return PetscError(PetscObjectComm((PetscObject)dm),528,__func__
,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Only supported for cell DMs of type DMDA and DMPLEX"
)
;
529
530 ierr = PetscFree(gfield)((*PetscTrFree)((void*)(gfield),530,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
) || ((gfield) = 0,0))
;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),530,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
531 if (!reuse) {
532 *fields = vecs;
533 }
534
535 PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize
> 0) { petscstack->currentsize--; petscstack->function
[petscstack->currentsize] = 0; petscstack->file[petscstack
->currentsize] = 0; petscstack->line[petscstack->currentsize
] = 0; petscstack->petscroutine[petscstack->currentsize
] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth =
(((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack->
hotdepth-1)); } ; } while (0); return(0);} while (0)
;
536}
537
538/*@C
539 DMSwarmCreatePointPerCellCount - Count the number of points within all cells in the cell DM
540
541 Not collective
542
543 Input parameter:
544. dm - the DMSwarm
545
546 Output parameters:
547+ ncells - the number of cells in the cell DM (optional argument, pass NULL to ignore)
548- count - array of length ncells containing the number of points per cell
549
550 Level: beginner
551
552 Notes:
553 The array count is allocated internally and must be free'd by the user.
554
555.seealso: DMSwarmSetType(), DMSwarmSetCellDM(), DMSwarmType
556@*/
557PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode DMSwarmCreatePointPerCellCount(DM dm,PetscInt *ncells,PetscInt **count)
558{
559 PetscErrorCode ierr;
560 PetscBool isvalid;
561 PetscInt nel;
562 PetscInt *sum;
563
564 PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize
< 64)) { petscstack->function[petscstack->currentsize
] = __func__; petscstack->file[petscstack->currentsize]
= "/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
; petscstack->line[petscstack->currentsize] = 564; petscstack
->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack
->currentsize++; } if (petscstack) { petscstack->hotdepth
+= (PETSC_FALSE || petscstack->hotdepth); } ; } while (0)
; ; } while (0)
;
565 ierr = DMSwarmSortGetIsValid(dm,&isvalid);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),565,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
566 nel = 0;
567 if (isvalid) {
568 PetscInt e;
569
570 ierr = DMSwarmSortGetSizes(dm,&nel,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),570,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
571
572 ierr = PetscMalloc1(nel,&sum)PetscMallocA(1,PETSC_FALSE,572,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,(size_t)(nel)*sizeof(**(&sum)),(&sum))
;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),572,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
573 for (e=0; e<nel; e++) {
574 ierr = DMSwarmSortGetNumberOfPointsPerCell(dm,e,&sum[e]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),574,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
575 }
576 } else {
577 DM celldm;
578 PetscBool isda,isplex,isshell;
579 PetscInt p,npoints;
580 PetscInt *swarm_cellid;
581
582 /* get the number of cells */
583 ierr = DMSwarmGetCellDM(dm,&celldm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),583,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
584 ierr = PetscObjectTypeCompare((PetscObject)celldm,DMDA"da",&isda);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),584,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
585 ierr = PetscObjectTypeCompare((PetscObject)celldm,DMPLEX"plex",&isplex);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),585,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
586 ierr = PetscObjectTypeCompare((PetscObject)celldm,DMSHELL"shell",&isshell);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),586,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
587 if (isda) {
588 PetscInt _nel,_npe;
589 const PetscInt *_element;
590
591 ierr = DMDAGetElements(celldm,&_nel,&_npe,&_element);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),591,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
592 nel = _nel;
593 ierr = DMDARestoreElements(celldm,&_nel,&_npe,&_element);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),593,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
594 } else if (isplex) {
595 PetscInt ps,pe;
596
597 ierr = DMPlexGetHeightStratum(celldm,0,&ps,&pe);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),597,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
598 nel = pe - ps;
599 } else if (isshell) {
600 PetscErrorCode (*method_DMShellGetNumberOfCells)(DM,PetscInt*);
601
602 ierr = PetscObjectQueryFunction((PetscObject)celldm,"DMGetNumberOfCells_C",&method_DMShellGetNumberOfCells)PetscObjectQueryFunction_Private(((PetscObject)celldm),("DMGetNumberOfCells_C"
),(PetscVoidFunction*)(&method_DMShellGetNumberOfCells))
;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),602,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
603 if (method_DMShellGetNumberOfCells) {
604 ierr = method_DMShellGetNumberOfCells(celldm,&nel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),604,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
605 } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Cannot determine the number of cells for the DMSHELL object. User must provide a method via PetscObjectComposeFunction( (PetscObject)shelldm, \"DMGetNumberOfCells_C\", your_function_to_compute_number_of_cells );")return PetscError(PetscObjectComm((PetscObject)dm),605,__func__
,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Cannot determine the number of cells for the DMSHELL object. User must provide a method via PetscObjectComposeFunction( (PetscObject)shelldm, \"DMGetNumberOfCells_C\", your_function_to_compute_number_of_cells );"
)
;
606 } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Cannot determine the number of cells for a DM not of type DA, PLEX or SHELL")return PetscError(PetscObjectComm((PetscObject)dm),606,__func__
,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,56,PETSC_ERROR_INITIAL,"Cannot determine the number of cells for a DM not of type DA, PLEX or SHELL"
)
;
607
608 ierr = PetscMalloc1(nel,&sum)PetscMallocA(1,PETSC_FALSE,608,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,(size_t)(nel)*sizeof(**(&sum)),(&sum))
;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),608,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
609 ierr = PetscArrayzero(sum,nel)PetscMemzero(sum,(nel)*sizeof(*(sum)));;CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),609,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
610 ierr = DMSwarmGetLocalSize(dm,&npoints);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),610,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
611 ierr = DMSwarmGetField(dm,DMSwarmPICField_cellid,NULL((void*)0),NULL((void*)0),(void**)&swarm_cellid);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),611,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
612 for (p=0; p<npoints; p++) {
613 if (swarm_cellid[p] != DMLOCATEPOINT_POINT_NOT_FOUND-367) {
614 sum[ swarm_cellid[p] ]++;
615 }
616 }
617 ierr = DMSwarmRestoreField(dm,DMSwarmPICField_cellid,NULL((void*)0),NULL((void*)0),(void**)&swarm_cellid);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm
)0x44000001),617,__func__,"/sandbox/petsc/petsc.next-tmp/src/dm/impls/swarm/swarmpic.c"
,ierr,PETSC_ERROR_REPEAT," ");} while (0)
;
618 }
619 if (ncells) { *ncells = nel; }
620 *count = sum;
621 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)
;
622}