1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/
2af0996ceSBarry Smith #include <petsc/private/vecimpl.h>
3032b8ab6SVijay Mahadevan
4032b8ab6SVijay Mahadevan #include <petscdmmoab.h>
5032b8ab6SVijay Mahadevan #include <MBTagConventions.hpp>
6032b8ab6SVijay Mahadevan
79c368985SVijay Mahadevan #define USE_NATIVE_PETSCVEC
89c368985SVijay Mahadevan
9f6829af0SVijay Mahadevan /* declare some private DMMoab specific overrides */
1049abdd8aSBarry Smith static PetscErrorCode DMCreateVector_Moab_Private(DM, moab::Tag, const moab::Range *, PetscBool, PetscBool, Vec *);
112a8381b2SBarry Smith static PetscErrorCode DMVecCtxDestroy_Moab(PetscCtxRt);
1249abdd8aSBarry Smith static PetscErrorCode DMVecDuplicate_Moab(Vec, Vec *);
139daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1449abdd8aSBarry Smith static PetscErrorCode DMVecCreateTagName_Moab_Private(moab::Interface *, moab::ParallelComm *, char **);
159daf19fdSVijay Mahadevan #else
1649abdd8aSBarry Smith static PetscErrorCode DMVecCreateTagName_Moab_Private(moab::Interface *, char **);
179daf19fdSVijay Mahadevan #endif
18032b8ab6SVijay Mahadevan
19b8ecf6d3SVijay Mahadevan /*@C
20f6829af0SVijay Mahadevan DMMoabCreateVector - Create a Vec from either an existing tag, or a specified tag size, and a range of entities
21f6829af0SVijay Mahadevan
22d083f849SBarry Smith Collective
23f6829af0SVijay Mahadevan
24d8d19677SJose E. Roman Input Parameters:
25b8ecf6d3SVijay Mahadevan + dm - The DMMoab object being set
26f6829af0SVijay Mahadevan . tag - If non-zero, block size will be taken from the tag size
27f6829af0SVijay Mahadevan . range - If non-empty, Vec corresponds to these entities, otherwise to the entities set on the DMMoab
28f6829af0SVijay Mahadevan . is_global_vec - If true, this is a local representation of the Vec (including ghosts in parallel), otherwise a truly parallel one
29a2b725a8SWilliam Gropp - destroy_tag - If true, MOAB tag is destroyed with Vec, otherwise it is left on MOAB
30f6829af0SVijay Mahadevan
31f6829af0SVijay Mahadevan Output Parameter:
32f6829af0SVijay Mahadevan . vec - The created vector
33f6829af0SVijay Mahadevan
34f6829af0SVijay Mahadevan Level: beginner
35f6829af0SVijay Mahadevan
36db781477SPatrick Sanan .seealso: `VecCreate()`
37f6829af0SVijay Mahadevan @*/
DMMoabCreateVector(DM dm,moab::Tag tag,const moab::Range * range,PetscBool is_global_vec,PetscBool destroy_tag,Vec * vec)38d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateVector(DM dm, moab::Tag tag, const moab::Range *range, PetscBool is_global_vec, PetscBool destroy_tag, Vec *vec)
39d71ae5a4SJacob Faibussowitsch {
40f6829af0SVijay Mahadevan PetscFunctionBegin;
417a8be351SBarry Smith PetscCheck(tag || (range && !range->empty()), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Both tag and range cannot be null.");
42f6829af0SVijay Mahadevan
439566063dSJacob Faibussowitsch PetscCall(DMCreateVector_Moab_Private(dm, tag, range, is_global_vec, destroy_tag, vec));
443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
45f6829af0SVijay Mahadevan }
46f6829af0SVijay Mahadevan
47b8ecf6d3SVijay Mahadevan /*@C
48f6829af0SVijay Mahadevan DMMoabGetVecTag - Get the MOAB tag associated with this Vec
49f6829af0SVijay Mahadevan
50f6829af0SVijay Mahadevan Input Parameter:
51f6829af0SVijay Mahadevan . vec - Vec being queried
52f6829af0SVijay Mahadevan
53f6829af0SVijay Mahadevan Output Parameter:
54f6829af0SVijay Mahadevan . tag - Tag associated with this Vec. NULL if vec is a native PETSc Vec.
55f6829af0SVijay Mahadevan
56f6829af0SVijay Mahadevan Level: beginner
57f6829af0SVijay Mahadevan
58db781477SPatrick Sanan .seealso: `DMMoabCreateVector()`, `DMMoabGetVecRange()`
59f6829af0SVijay Mahadevan @*/
DMMoabGetVecTag(Vec vec,moab::Tag * tag)60d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVecTag(Vec vec, moab::Tag *tag)
61d71ae5a4SJacob Faibussowitsch {
62f6829af0SVijay Mahadevan PetscContainer moabdata;
63f6829af0SVijay Mahadevan Vec_MOAB *vmoab;
64f6829af0SVijay Mahadevan
65f6829af0SVijay Mahadevan PetscFunctionBegin;
664f572ea9SToby Isaac PetscAssertPointer(tag, 2);
67f6829af0SVijay Mahadevan
68f6829af0SVijay Mahadevan /* Get the MOAB private data */
699566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)vec, "MOABData", (PetscObject *)&moabdata));
702a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &vmoab));
71f6829af0SVijay Mahadevan
72f6829af0SVijay Mahadevan *tag = vmoab->tag;
733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
74f6829af0SVijay Mahadevan }
75f6829af0SVijay Mahadevan
76b8ecf6d3SVijay Mahadevan /*@C
77f6829af0SVijay Mahadevan DMMoabGetVecRange - Get the MOAB entities associated with this Vec
78f6829af0SVijay Mahadevan
79f6829af0SVijay Mahadevan Input Parameter:
80f6829af0SVijay Mahadevan . vec - Vec being queried
81f6829af0SVijay Mahadevan
82f6829af0SVijay Mahadevan Output Parameter:
83f6829af0SVijay Mahadevan . range - Entities associated with this Vec. NULL if vec is a native PETSc Vec.
84f6829af0SVijay Mahadevan
85f6829af0SVijay Mahadevan Level: beginner
86f6829af0SVijay Mahadevan
87db781477SPatrick Sanan .seealso: `DMMoabCreateVector()`, `DMMoabGetVecTag()`
88f6829af0SVijay Mahadevan @*/
DMMoabGetVecRange(Vec vec,moab::Range * range)89d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVecRange(Vec vec, moab::Range *range)
90d71ae5a4SJacob Faibussowitsch {
91f6829af0SVijay Mahadevan PetscContainer moabdata;
92f6829af0SVijay Mahadevan Vec_MOAB *vmoab;
93f6829af0SVijay Mahadevan
94f6829af0SVijay Mahadevan PetscFunctionBegin;
954f572ea9SToby Isaac PetscAssertPointer(range, 2);
96f6829af0SVijay Mahadevan
97f6829af0SVijay Mahadevan /* Get the MOAB private data handle */
989566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)vec, "MOABData", (PetscObject *)&moabdata));
992a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &vmoab));
100f6829af0SVijay Mahadevan *range = *vmoab->tag_range;
1013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
102f6829af0SVijay Mahadevan }
103f6829af0SVijay Mahadevan
104b8ecf6d3SVijay Mahadevan /*@C
105f6829af0SVijay Mahadevan DMMoabVecGetArray - Returns the writable direct access array to the local representation of MOAB tag data for the underlying vector using locally owned+ghosted range of entities
106f6829af0SVijay Mahadevan
107d083f849SBarry Smith Collective
108f6829af0SVijay Mahadevan
109d8d19677SJose E. Roman Input Parameters:
110a2b725a8SWilliam Gropp + dm - The DMMoab object being set
111a2b725a8SWilliam Gropp - vec - The Vector whose underlying data is requested
112f6829af0SVijay Mahadevan
113f6829af0SVijay Mahadevan Output Parameter:
114f6829af0SVijay Mahadevan . array - The local data array
115f6829af0SVijay Mahadevan
116f6829af0SVijay Mahadevan Level: intermediate
117f6829af0SVijay Mahadevan
118db781477SPatrick Sanan .seealso: `DMMoabVecRestoreArray()`, `DMMoabVecGetArrayRead()`, `DMMoabVecRestoreArrayRead()`
119f6829af0SVijay Mahadevan @*/
DMMoabVecGetArray(DM dm,Vec vec,void * array)120d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabVecGetArray(DM dm, Vec vec, void *array)
121d71ae5a4SJacob Faibussowitsch {
122f6829af0SVijay Mahadevan DM_Moab *dmmoab;
123f6829af0SVijay Mahadevan moab::ErrorCode merr;
124f6829af0SVijay Mahadevan PetscInt count, i, f;
125f6829af0SVijay Mahadevan moab::Tag vtag;
126f6829af0SVijay Mahadevan PetscScalar **varray;
127f6829af0SVijay Mahadevan PetscScalar *marray;
128f6829af0SVijay Mahadevan PetscContainer moabdata;
129f6829af0SVijay Mahadevan Vec_MOAB *vmoab, *xmoab;
130f6829af0SVijay Mahadevan
131f6829af0SVijay Mahadevan PetscFunctionBegin;
132f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
133f6829af0SVijay Mahadevan PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
1344f572ea9SToby Isaac PetscAssertPointer(array, 3);
135f6829af0SVijay Mahadevan dmmoab = (DM_Moab *)dm->data;
136f6829af0SVijay Mahadevan
137f6829af0SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */
1389566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)vec, "MOABData", (PetscObject *)&moabdata));
1392a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &vmoab));
140f6829af0SVijay Mahadevan
141f6829af0SVijay Mahadevan /* Get the real scalar array handle */
142f6829af0SVijay Mahadevan varray = reinterpret_cast<PetscScalar **>(array);
143f6829af0SVijay Mahadevan
144f6829af0SVijay Mahadevan if (vmoab->is_native_vec) {
145f6829af0SVijay Mahadevan /* get the local representation of the arrays from Vectors */
1469566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &vmoab->local));
1479566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalBegin(dm, vec, INSERT_VALUES, vmoab->local));
1489566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalEnd(dm, vec, INSERT_VALUES, vmoab->local));
149f6829af0SVijay Mahadevan
150f6829af0SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */
1519566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)vmoab->local, "MOABData", (PetscObject *)&moabdata));
1522a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &xmoab));
153f6829af0SVijay Mahadevan
154f6829af0SVijay Mahadevan /* get the local representation of the arrays from Vectors */
1559566063dSJacob Faibussowitsch PetscCall(VecGhostGetLocalForm(vmoab->local, &xmoab->local));
1569566063dSJacob Faibussowitsch PetscCall(VecGhostUpdateBegin(vmoab->local, INSERT_VALUES, SCATTER_FORWARD));
1579566063dSJacob Faibussowitsch PetscCall(VecGhostUpdateEnd(vmoab->local, INSERT_VALUES, SCATTER_FORWARD));
158f6829af0SVijay Mahadevan
1599566063dSJacob Faibussowitsch PetscCall(VecGetArray(xmoab->local, varray));
1601baa6e33SBarry Smith } else {
161f6829af0SVijay Mahadevan /* Get the MOAB private data */
1629566063dSJacob Faibussowitsch PetscCall(DMMoabGetVecTag(vec, &vtag));
163f6829af0SVijay Mahadevan
1649daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
165f6829af0SVijay Mahadevan /* exchange the data into ghost cells first */
1669371c9d4SSatish Balay merr = dmmoab->pcomm->exchange_tags(vtag, *dmmoab->vlocal);
1679371c9d4SSatish Balay MBERRNM(merr);
1689daf19fdSVijay Mahadevan #endif
169f6829af0SVijay Mahadevan
1709566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((dmmoab->nloc + dmmoab->nghost) * dmmoab->numFields, varray));
171f6829af0SVijay Mahadevan
172f6829af0SVijay Mahadevan /* Get the array data for local entities */
1739371c9d4SSatish Balay merr = dmmoab->mbiface->tag_iterate(vtag, dmmoab->vlocal->begin(), dmmoab->vlocal->end(), count, reinterpret_cast<void *&>(marray), false);
1749371c9d4SSatish Balay MBERRNM(merr);
1751dca8a05SBarry Smith PetscCheck(count == dmmoab->nloc + dmmoab->nghost, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between local vertices and tag partition for Vec. %" PetscInt_FMT " != %" PetscInt_FMT ".", count, dmmoab->nloc + dmmoab->nghost);
176f6829af0SVijay Mahadevan
177f6829af0SVijay Mahadevan i = 0;
178f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vlocal->begin(); iter != dmmoab->vlocal->end(); iter++) {
1799371c9d4SSatish Balay for (f = 0; f < dmmoab->numFields; f++, i++) (*varray)[dmmoab->lidmap[(PetscInt)*iter - dmmoab->seqstart] * dmmoab->numFields + f] = marray[i];
1803f1c6e43SVijay Mahadevan //(*varray)[dmmoab->llmap[dmmoab->lidmap[((PetscInt)*iter-dmmoab->seqstart)]*dmmoab->numFields+f]]=marray[i];
181f6829af0SVijay Mahadevan }
182f6829af0SVijay Mahadevan }
1833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
184f6829af0SVijay Mahadevan }
185f6829af0SVijay Mahadevan
186b8ecf6d3SVijay Mahadevan /*@C
187f6829af0SVijay Mahadevan DMMoabVecRestoreArray - Restores the writable direct access array obtained via DMMoabVecGetArray
188f6829af0SVijay Mahadevan
189d083f849SBarry Smith Collective
190f6829af0SVijay Mahadevan
191d8d19677SJose E. Roman Input Parameters:
192f6829af0SVijay Mahadevan + dm - The DMMoab object being set
193f6829af0SVijay Mahadevan . vec - The Vector whose underlying data is requested
194a2b725a8SWilliam Gropp - array - The local data array
195f6829af0SVijay Mahadevan
196f6829af0SVijay Mahadevan Level: intermediate
197f6829af0SVijay Mahadevan
198db781477SPatrick Sanan .seealso: `DMMoabVecGetArray()`, `DMMoabVecGetArrayRead()`, `DMMoabVecRestoreArrayRead()`
199f6829af0SVijay Mahadevan @*/
DMMoabVecRestoreArray(DM dm,Vec vec,void * array)200d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabVecRestoreArray(DM dm, Vec vec, void *array)
201d71ae5a4SJacob Faibussowitsch {
202f6829af0SVijay Mahadevan DM_Moab *dmmoab;
203f6829af0SVijay Mahadevan moab::ErrorCode merr;
204f6829af0SVijay Mahadevan moab::Tag vtag;
205f6829af0SVijay Mahadevan PetscInt count, i, f;
206f6829af0SVijay Mahadevan PetscScalar **varray;
207f6829af0SVijay Mahadevan PetscScalar *marray;
208f6829af0SVijay Mahadevan PetscContainer moabdata;
209f6829af0SVijay Mahadevan Vec_MOAB *vmoab, *xmoab;
210f6829af0SVijay Mahadevan
211f6829af0SVijay Mahadevan PetscFunctionBegin;
212f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
213f6829af0SVijay Mahadevan PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
2144f572ea9SToby Isaac PetscAssertPointer(array, 3);
215f6829af0SVijay Mahadevan dmmoab = (DM_Moab *)dm->data;
216f6829af0SVijay Mahadevan
217f6829af0SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */
2189566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)vec, "MOABData", (PetscObject *)&moabdata));
2192a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &vmoab));
220f6829af0SVijay Mahadevan
221f6829af0SVijay Mahadevan /* Get the real scalar array handle */
222f6829af0SVijay Mahadevan varray = reinterpret_cast<PetscScalar **>(array);
223f6829af0SVijay Mahadevan
224f6829af0SVijay Mahadevan if (vmoab->is_native_vec) {
225f6829af0SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */
2269566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)vmoab->local, "MOABData", (PetscObject *)&moabdata));
2272a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &xmoab));
228f6829af0SVijay Mahadevan
229f6829af0SVijay Mahadevan /* get the local representation of the arrays from Vectors */
2309566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(xmoab->local, varray));
2319566063dSJacob Faibussowitsch PetscCall(VecGhostUpdateBegin(vmoab->local, ADD_VALUES, SCATTER_REVERSE));
2329566063dSJacob Faibussowitsch PetscCall(VecGhostUpdateEnd(vmoab->local, ADD_VALUES, SCATTER_REVERSE));
2339566063dSJacob Faibussowitsch PetscCall(VecGhostRestoreLocalForm(vmoab->local, &xmoab->local));
234f6829af0SVijay Mahadevan
235f6829af0SVijay Mahadevan /* restore local pieces */
2369566063dSJacob Faibussowitsch PetscCall(DMLocalToGlobalBegin(dm, vmoab->local, INSERT_VALUES, vec));
2379566063dSJacob Faibussowitsch PetscCall(DMLocalToGlobalEnd(dm, vmoab->local, INSERT_VALUES, vec));
2389566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &vmoab->local));
2399371c9d4SSatish Balay } else {
240f6829af0SVijay Mahadevan /* Get the MOAB private data */
2419566063dSJacob Faibussowitsch PetscCall(DMMoabGetVecTag(vec, &vtag));
242f6829af0SVijay Mahadevan
243f6829af0SVijay Mahadevan /* Get the array data for local entities */
2449371c9d4SSatish Balay merr = dmmoab->mbiface->tag_iterate(vtag, dmmoab->vlocal->begin(), dmmoab->vlocal->end(), count, reinterpret_cast<void *&>(marray), false);
2459371c9d4SSatish Balay MBERRNM(merr);
2461dca8a05SBarry Smith PetscCheck(count == dmmoab->nloc + dmmoab->nghost, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between local vertices and tag partition for Vec. %" PetscInt_FMT " != %" PetscInt_FMT ".", count, dmmoab->nloc + dmmoab->nghost);
247f6829af0SVijay Mahadevan
248f6829af0SVijay Mahadevan i = 0;
249f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vlocal->begin(); iter != dmmoab->vlocal->end(); iter++) {
2509371c9d4SSatish Balay for (f = 0; f < dmmoab->numFields; f++, i++) marray[i] = (*varray)[dmmoab->lidmap[(PetscInt)*iter - dmmoab->seqstart] * dmmoab->numFields + f];
2513f1c6e43SVijay Mahadevan //marray[i] = (*varray)[dmmoab->llmap[dmmoab->lidmap[((PetscInt)*iter-dmmoab->seqstart)]*dmmoab->numFields+f]];
252f6829af0SVijay Mahadevan }
253f6829af0SVijay Mahadevan
2549daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
255f6829af0SVijay Mahadevan /* reduce the tags correctly -> should probably let the user choose how to reduce in the future
256f6829af0SVijay Mahadevan For all FEM residual based assembly calculations, MPI_SUM should serve well */
2579371c9d4SSatish Balay merr = dmmoab->pcomm->reduce_tags(vtag, MPI_SUM, *dmmoab->vlocal);
2589371c9d4SSatish Balay MBERRV(dmmoab->mbiface, merr);
2599daf19fdSVijay Mahadevan #endif
2609566063dSJacob Faibussowitsch PetscCall(PetscFree(*varray));
261f6829af0SVijay Mahadevan }
2623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
263f6829af0SVijay Mahadevan }
264f6829af0SVijay Mahadevan
265b8ecf6d3SVijay Mahadevan /*@C
266f6829af0SVijay Mahadevan DMMoabVecGetArrayRead - Returns the read-only direct access array to the local representation of MOAB tag data for the underlying vector using locally owned+ghosted range of entities
267f6829af0SVijay Mahadevan
268d083f849SBarry Smith Collective
269f6829af0SVijay Mahadevan
270d8d19677SJose E. Roman Input Parameters:
271f6829af0SVijay Mahadevan + dm - The DMMoab object being set
272a2b725a8SWilliam Gropp - vec - The Vector whose underlying data is requested
273f6829af0SVijay Mahadevan
274f6829af0SVijay Mahadevan Output Parameter:
275f6829af0SVijay Mahadevan . array - The local data array
276f6829af0SVijay Mahadevan
277f6829af0SVijay Mahadevan Level: intermediate
278f6829af0SVijay Mahadevan
279db781477SPatrick Sanan .seealso: `DMMoabVecRestoreArrayRead()`, `DMMoabVecGetArray()`, `DMMoabVecRestoreArray()`
280f6829af0SVijay Mahadevan @*/
DMMoabVecGetArrayRead(DM dm,Vec vec,void * array)281d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabVecGetArrayRead(DM dm, Vec vec, void *array)
282d71ae5a4SJacob Faibussowitsch {
283f6829af0SVijay Mahadevan DM_Moab *dmmoab;
284f6829af0SVijay Mahadevan moab::ErrorCode merr;
285f6829af0SVijay Mahadevan PetscInt count, i, f;
286f6829af0SVijay Mahadevan moab::Tag vtag;
287f6829af0SVijay Mahadevan PetscScalar **varray;
288f6829af0SVijay Mahadevan PetscScalar *marray;
289f6829af0SVijay Mahadevan PetscContainer moabdata;
290f6829af0SVijay Mahadevan Vec_MOAB *vmoab, *xmoab;
291f6829af0SVijay Mahadevan
292f6829af0SVijay Mahadevan PetscFunctionBegin;
293f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
294f6829af0SVijay Mahadevan PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
2954f572ea9SToby Isaac PetscAssertPointer(array, 3);
296f6829af0SVijay Mahadevan dmmoab = (DM_Moab *)dm->data;
297f6829af0SVijay Mahadevan
298f6829af0SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */
2999566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)vec, "MOABData", (PetscObject *)&moabdata));
3002a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &vmoab));
301f6829af0SVijay Mahadevan
302f6829af0SVijay Mahadevan /* Get the real scalar array handle */
303f6829af0SVijay Mahadevan varray = reinterpret_cast<PetscScalar **>(array);
304f6829af0SVijay Mahadevan
305f6829af0SVijay Mahadevan if (vmoab->is_native_vec) {
306f6829af0SVijay Mahadevan /* get the local representation of the arrays from Vectors */
3079566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &vmoab->local));
3089566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalBegin(dm, vec, INSERT_VALUES, vmoab->local));
3099566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalEnd(dm, vec, INSERT_VALUES, vmoab->local));
310f6829af0SVijay Mahadevan
311f6829af0SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */
3129566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)vmoab->local, "MOABData", (PetscObject *)&moabdata));
3132a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &xmoab));
314f6829af0SVijay Mahadevan
315f6829af0SVijay Mahadevan /* get the local representation of the arrays from Vectors */
3169566063dSJacob Faibussowitsch PetscCall(VecGhostGetLocalForm(vmoab->local, &xmoab->local));
3179566063dSJacob Faibussowitsch PetscCall(VecGhostUpdateBegin(vmoab->local, INSERT_VALUES, SCATTER_FORWARD));
3189566063dSJacob Faibussowitsch PetscCall(VecGhostUpdateEnd(vmoab->local, INSERT_VALUES, SCATTER_FORWARD));
3199566063dSJacob Faibussowitsch PetscCall(VecGetArray(xmoab->local, varray));
3209371c9d4SSatish Balay } else {
321f6829af0SVijay Mahadevan /* Get the MOAB private data */
3229566063dSJacob Faibussowitsch PetscCall(DMMoabGetVecTag(vec, &vtag));
323f6829af0SVijay Mahadevan
3249daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
325f6829af0SVijay Mahadevan /* exchange the data into ghost cells first */
3269371c9d4SSatish Balay merr = dmmoab->pcomm->exchange_tags(vtag, *dmmoab->vlocal);
3279371c9d4SSatish Balay MBERRNM(merr);
3289daf19fdSVijay Mahadevan #endif
3299566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((dmmoab->nloc + dmmoab->nghost) * dmmoab->numFields, varray));
330f6829af0SVijay Mahadevan
331f6829af0SVijay Mahadevan /* Get the array data for local entities */
3329371c9d4SSatish Balay merr = dmmoab->mbiface->tag_iterate(vtag, dmmoab->vlocal->begin(), dmmoab->vlocal->end(), count, reinterpret_cast<void *&>(marray), false);
3339371c9d4SSatish Balay MBERRNM(merr);
3341dca8a05SBarry Smith PetscCheck(count == dmmoab->nloc + dmmoab->nghost, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between local vertices and tag partition for Vec. %" PetscInt_FMT " != %" PetscInt_FMT ".", count, dmmoab->nloc + dmmoab->nghost);
335f6829af0SVijay Mahadevan
336f6829af0SVijay Mahadevan i = 0;
337f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vlocal->begin(); iter != dmmoab->vlocal->end(); iter++) {
3389371c9d4SSatish Balay for (f = 0; f < dmmoab->numFields; f++, i++) (*varray)[dmmoab->lidmap[(PetscInt)*iter - dmmoab->seqstart] * dmmoab->numFields + f] = marray[i];
3393f1c6e43SVijay Mahadevan //(*varray)[dmmoab->llmap[dmmoab->lidmap[((PetscInt)*iter-dmmoab->seqstart)]*dmmoab->numFields+f]]=marray[i];
340f6829af0SVijay Mahadevan }
341f6829af0SVijay Mahadevan }
3423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
343f6829af0SVijay Mahadevan }
344f6829af0SVijay Mahadevan
345b8ecf6d3SVijay Mahadevan /*@C
3464597dd3dSJose E. Roman DMMoabVecRestoreArrayRead - Restores the read-only direct access array obtained via DMMoabVecGetArray
347f6829af0SVijay Mahadevan
348d083f849SBarry Smith Collective
349f6829af0SVijay Mahadevan
35097bb3fdcSJose E. Roman Input Parameters:
351f6829af0SVijay Mahadevan + dm - The DMMoab object being set
352f6829af0SVijay Mahadevan . vec - The Vector whose underlying data is requested
353a2b725a8SWilliam Gropp - array - The local data array
354f6829af0SVijay Mahadevan
355f6829af0SVijay Mahadevan Level: intermediate
356f6829af0SVijay Mahadevan
357db781477SPatrick Sanan .seealso: `DMMoabVecGetArrayRead()`, `DMMoabVecGetArray()`, `DMMoabVecRestoreArray()`
358f6829af0SVijay Mahadevan @*/
DMMoabVecRestoreArrayRead(DM dm,Vec vec,void * array)359d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabVecRestoreArrayRead(DM dm, Vec vec, void *array)
360d71ae5a4SJacob Faibussowitsch {
361f6829af0SVijay Mahadevan PetscScalar **varray;
362f6829af0SVijay Mahadevan PetscContainer moabdata;
363f6829af0SVijay Mahadevan Vec_MOAB *vmoab, *xmoab;
364f6829af0SVijay Mahadevan
365f6829af0SVijay Mahadevan PetscFunctionBegin;
366f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
367f6829af0SVijay Mahadevan PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
3684f572ea9SToby Isaac PetscAssertPointer(array, 3);
369f6829af0SVijay Mahadevan
370f6829af0SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */
3719566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)vec, "MOABData", (PetscObject *)&moabdata));
3722a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &vmoab));
373f6829af0SVijay Mahadevan
374f6829af0SVijay Mahadevan /* Get the real scalar array handle */
375f6829af0SVijay Mahadevan varray = reinterpret_cast<PetscScalar **>(array);
376f6829af0SVijay Mahadevan
377f6829af0SVijay Mahadevan if (vmoab->is_native_vec) {
378f6829af0SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */
3799566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)vmoab->local, "MOABData", (PetscObject *)&moabdata));
3802a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &xmoab));
381f6829af0SVijay Mahadevan
382f6829af0SVijay Mahadevan /* restore the local representation of the arrays from Vectors */
3839566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(xmoab->local, varray));
3849566063dSJacob Faibussowitsch PetscCall(VecGhostRestoreLocalForm(vmoab->local, &xmoab->local));
385f6829af0SVijay Mahadevan
386f6829af0SVijay Mahadevan /* restore local pieces */
3879566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &vmoab->local));
3889371c9d4SSatish Balay } else {
389f6829af0SVijay Mahadevan /* Nothing to do but just free the memory allocated before */
3909566063dSJacob Faibussowitsch PetscCall(PetscFree(*varray));
391f6829af0SVijay Mahadevan }
3923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
393f6829af0SVijay Mahadevan }
394f6829af0SVijay Mahadevan
DMCreateVector_Moab_Private(DM dm,moab::Tag tag,const moab::Range * userrange,PetscBool is_global_vec,PetscBool destroy_tag,Vec * vec)39566976f2fSJacob Faibussowitsch static PetscErrorCode DMCreateVector_Moab_Private(DM dm, moab::Tag tag, const moab::Range *userrange, PetscBool is_global_vec, PetscBool destroy_tag, Vec *vec)
396d71ae5a4SJacob Faibussowitsch {
397032b8ab6SVijay Mahadevan moab::ErrorCode merr;
398032b8ab6SVijay Mahadevan PetscBool is_newtag;
399351b8a77SVijay Mahadevan const moab::Range *range;
400bb8f3634SVijay Mahadevan PetscInt count, lnative_vec, gnative_vec;
4019088682fSVijay Mahadevan std::string ttname;
402c4427235SVijay Mahadevan PetscScalar *data_ptr, *defaultvals;
403032b8ab6SVijay Mahadevan
404db66d124SVijay Mahadevan Vec_MOAB *vmoab;
405032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)dm->data;
4069daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
407032b8ab6SVijay Mahadevan moab::ParallelComm *pcomm = dmmoab->pcomm;
4089daf19fdSVijay Mahadevan #endif
409032b8ab6SVijay Mahadevan moab::Interface *mbiface = dmmoab->mbiface;
410032b8ab6SVijay Mahadevan
411032b8ab6SVijay Mahadevan PetscFunctionBegin;
41208401ef6SPierre Jolivet PetscCheck(sizeof(PetscReal) == sizeof(PetscScalar), PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "MOAB tags only support Real types (Complex-type unsupported)");
413032b8ab6SVijay Mahadevan if (!userrange) range = dmmoab->vowned;
414032b8ab6SVijay Mahadevan else range = userrange;
4157a8be351SBarry Smith PetscCheck(range, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Input range cannot be empty or call DMSetUp first.");
416032b8ab6SVijay Mahadevan
417*beceaeb6SBarry Smith #if !defined(USE_NATIVE_PETSCVEC)
418bb8f3634SVijay Mahadevan /* If the tag data is in a single sequence, use PETSc native vector since tag_iterate isn't useful anymore */
419bb8f3634SVijay Mahadevan lnative_vec = (range->psize() - 1);
4203ac71f70SVijay Mahadevan #else
4213ac71f70SVijay Mahadevan lnative_vec = 1; /* NOTE: Testing PETSc vector: will force to create native vector all the time */
4226465f021SVijay Mahadevan // lnative_vec=0; /* NOTE: Testing MOAB vector: will force to create MOAB tag_iterate based vector all the time */
423f6829af0SVijay Mahadevan #endif
4243ac71f70SVijay Mahadevan
4259daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
42657508eceSPierre Jolivet PetscCallMPI(MPIU_Allreduce(&lnative_vec, &gnative_vec, 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm));
4279daf19fdSVijay Mahadevan #else
4289daf19fdSVijay Mahadevan gnative_vec = lnative_vec;
4299daf19fdSVijay Mahadevan #endif
430bb8f3634SVijay Mahadevan
431bb8f3634SVijay Mahadevan /* Create the MOAB internal data object */
4329566063dSJacob Faibussowitsch PetscCall(PetscNew(&vmoab));
433bb8f3634SVijay Mahadevan vmoab->is_native_vec = (gnative_vec > 0 ? PETSC_TRUE : PETSC_FALSE);
434bb8f3634SVijay Mahadevan
435bb8f3634SVijay Mahadevan if (!vmoab->is_native_vec) {
4363ac71f70SVijay Mahadevan merr = moab::MB_SUCCESS;
43764e1c140SVijay Mahadevan if (tag != 0) merr = mbiface->tag_get_name(tag, ttname);
43864e1c140SVijay Mahadevan if (!ttname.length() || merr != moab::MB_SUCCESS) {
439db66d124SVijay Mahadevan /* get the new name for the anonymous MOABVec -> the tag_name will be destroyed along with Tag */
440c528d872SBarry Smith char *tag_name = NULL;
4419daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
4429566063dSJacob Faibussowitsch PetscCall(DMVecCreateTagName_Moab_Private(mbiface, pcomm, &tag_name));
4439daf19fdSVijay Mahadevan #else
4449566063dSJacob Faibussowitsch PetscCall(DMVecCreateTagName_Moab_Private(mbiface, &tag_name));
4459daf19fdSVijay Mahadevan #endif
446032b8ab6SVijay Mahadevan is_newtag = PETSC_TRUE;
447032b8ab6SVijay Mahadevan
448db66d124SVijay Mahadevan /* Create the default value for the tag (all zeros) */
4499566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(dmmoab->numFields, &defaultvals));
450032b8ab6SVijay Mahadevan
451db66d124SVijay Mahadevan /* Create the tag */
4529371c9d4SSatish Balay merr = mbiface->tag_get_handle(tag_name, dmmoab->numFields, moab::MB_TYPE_DOUBLE, tag, moab::MB_TAG_DENSE | moab::MB_TAG_CREAT, defaultvals);
4539371c9d4SSatish Balay MBERRNM(merr);
4549566063dSJacob Faibussowitsch PetscCall(PetscFree(tag_name));
4559566063dSJacob Faibussowitsch PetscCall(PetscFree(defaultvals));
4569371c9d4SSatish Balay } else {
457db66d124SVijay Mahadevan /* Make sure the tag data is of type "double" */
458032b8ab6SVijay Mahadevan moab::DataType tag_type;
4599371c9d4SSatish Balay merr = mbiface->tag_get_data_type(tag, tag_type);
4609371c9d4SSatish Balay MBERRNM(merr);
4611dca8a05SBarry Smith PetscCheck(tag_type == moab::MB_TYPE_DOUBLE, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Tag data type must be MB_TYPE_DOUBLE");
462032b8ab6SVijay Mahadevan is_newtag = destroy_tag;
463032b8ab6SVijay Mahadevan }
464032b8ab6SVijay Mahadevan
465032b8ab6SVijay Mahadevan vmoab->tag = tag;
466bb8f3634SVijay Mahadevan vmoab->new_tag = is_newtag;
467bb8f3634SVijay Mahadevan }
468032b8ab6SVijay Mahadevan vmoab->mbiface = mbiface;
4699daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
470032b8ab6SVijay Mahadevan vmoab->pcomm = pcomm;
4719daf19fdSVijay Mahadevan #endif
472032b8ab6SVijay Mahadevan vmoab->is_global_vec = is_global_vec;
473bb8f3634SVijay Mahadevan vmoab->tag_size = dmmoab->bs;
474032b8ab6SVijay Mahadevan
475bb8f3634SVijay Mahadevan if (vmoab->is_native_vec) {
476bb8f3634SVijay Mahadevan /* Create the PETSc Vector directly and attach our functions accordingly */
477bb8f3634SVijay Mahadevan if (!is_global_vec) {
478bb8f3634SVijay Mahadevan /* This is an MPI Vector with ghosted padding */
47957508eceSPierre Jolivet PetscCall(VecCreateGhostBlock(((PetscObject)dm)->comm, dmmoab->bs, dmmoab->numFields * dmmoab->nloc, dmmoab->numFields * dmmoab->n, dmmoab->nghost, &dmmoab->gsindices[dmmoab->nloc], vec));
4805f80ce2aSJacob Faibussowitsch } else {
481bb8f3634SVijay Mahadevan /* This is an MPI/SEQ Vector */
48257508eceSPierre Jolivet PetscCall(VecCreate(((PetscObject)dm)->comm, vec));
4839566063dSJacob Faibussowitsch PetscCall(VecSetSizes(*vec, dmmoab->numFields * dmmoab->nloc, PETSC_DECIDE));
4849566063dSJacob Faibussowitsch PetscCall(VecSetBlockSize(*vec, dmmoab->bs));
4859566063dSJacob Faibussowitsch PetscCall(VecSetType(*vec, VECMPI));
486bb8f3634SVijay Mahadevan }
4875f80ce2aSJacob Faibussowitsch } else {
488db66d124SVijay Mahadevan /* Call tag_iterate. This will cause MOAB to allocate memory for the
489db66d124SVijay Mahadevan tag data if it hasn't already happened */
4909371c9d4SSatish Balay merr = mbiface->tag_iterate(tag, range->begin(), range->end(), count, (void *&)data_ptr);
4919371c9d4SSatish Balay MBERRNM(merr);
492032b8ab6SVijay Mahadevan
493bb8f3634SVijay Mahadevan /* set the reference for vector range */
494bb8f3634SVijay Mahadevan vmoab->tag_range = new moab::Range(*range);
4959371c9d4SSatish Balay merr = mbiface->tag_get_length(tag, dmmoab->numFields);
4969371c9d4SSatish Balay MBERRNM(merr);
497032b8ab6SVijay Mahadevan
498db66d124SVijay Mahadevan /* Create the PETSc Vector
499db66d124SVijay Mahadevan Query MOAB mesh to check if there are any ghosted entities
500032b8ab6SVijay Mahadevan -> if we do, create a ghosted vector to map correctly to the same layout
501032b8ab6SVijay Mahadevan -> else, create a non-ghosted parallel vector */
502bb8f3634SVijay Mahadevan if (!is_global_vec) {
503db66d124SVijay Mahadevan /* This is an MPI Vector with ghosted padding */
50457508eceSPierre Jolivet PetscCall(VecCreateGhostBlockWithArray(((PetscObject)dm)->comm, dmmoab->bs, dmmoab->numFields * dmmoab->nloc, dmmoab->numFields * dmmoab->n, dmmoab->nghost, &dmmoab->gsindices[dmmoab->nloc], data_ptr, vec));
5055f80ce2aSJacob Faibussowitsch } else {
506bb8f3634SVijay Mahadevan /* This is an MPI Vector without ghosted padding */
50757508eceSPierre Jolivet PetscCall(VecCreateMPIWithArray(((PetscObject)dm)->comm, dmmoab->bs, dmmoab->numFields * range->size(), PETSC_DECIDE, data_ptr, vec));
508032b8ab6SVijay Mahadevan }
509bb8f3634SVijay Mahadevan }
5109566063dSJacob Faibussowitsch PetscCall(VecSetFromOptions(*vec));
511032b8ab6SVijay Mahadevan
512f6829af0SVijay Mahadevan /* create a container and store the internal MOAB data for faster access based on Entities etc */
51349abdd8aSBarry Smith PetscCall(PetscObjectContainerCompose((PetscObject)*vec, "MOABData", vmoab, DMVecCtxDestroy_Moab));
514f6829af0SVijay Mahadevan (*vec)->ops->duplicate = DMVecDuplicate_Moab;
515032b8ab6SVijay Mahadevan
516db66d124SVijay Mahadevan /* Vector created, manually set local to global mapping */
51748a46eb9SPierre Jolivet if (dmmoab->ltog_map) PetscCall(VecSetLocalToGlobalMapping(*vec, dmmoab->ltog_map));
518032b8ab6SVijay Mahadevan
519032b8ab6SVijay Mahadevan /* set the DM reference to the vector */
5209566063dSJacob Faibussowitsch PetscCall(VecSetDM(*vec, dm));
5213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
522032b8ab6SVijay Mahadevan }
523032b8ab6SVijay Mahadevan
524f6829af0SVijay Mahadevan /* DMVecCreateTagName_Moab_Private
525032b8ab6SVijay Mahadevan *
526032b8ab6SVijay Mahadevan * Creates a unique tag name that will be shared across processes. If
527032b8ab6SVijay Mahadevan * pcomm is NULL, then this is a serial vector. A unique tag name
528032b8ab6SVijay Mahadevan * will be returned in tag_name in either case.
529032b8ab6SVijay Mahadevan *
530032b8ab6SVijay Mahadevan * The tag names have the format _PETSC_VEC_N where N is some integer.
531032b8ab6SVijay Mahadevan *
532032b8ab6SVijay Mahadevan * NOTE: The tag_name is allocated in this routine; The user needs to free
533032b8ab6SVijay Mahadevan * the character array.
534032b8ab6SVijay Mahadevan */
5359daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
DMVecCreateTagName_Moab_Private(moab::Interface * mbiface,moab::ParallelComm * pcomm,char ** tag_name)5369daf19fdSVijay Mahadevan PetscErrorCode DMVecCreateTagName_Moab_Private(moab::Interface *mbiface, moab::ParallelComm *pcomm, char **tag_name)
5379daf19fdSVijay Mahadevan #else
53866976f2fSJacob Faibussowitsch static PetscErrorCode DMVecCreateTagName_Moab_Private(moab::Interface *mbiface, char **tag_name)
5399daf19fdSVijay Mahadevan #endif
540032b8ab6SVijay Mahadevan {
541032b8ab6SVijay Mahadevan moab::ErrorCode mberr;
542032b8ab6SVijay Mahadevan PetscInt n, global_n;
543032b8ab6SVijay Mahadevan moab::Tag indexTag;
544032b8ab6SVijay Mahadevan
545032b8ab6SVijay Mahadevan PetscFunctionBegin;
546032b8ab6SVijay Mahadevan const char *PVEC_PREFIX = "__PETSC_VEC_";
5479566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(PETSC_MAX_PATH_LEN, tag_name));
548032b8ab6SVijay Mahadevan
549032b8ab6SVijay Mahadevan moab::EntityHandle rootset = mbiface->get_root_set();
550032b8ab6SVijay Mahadevan
5519daf19fdSVijay Mahadevan /* Check to see if there are any PETSc vectors defined */
552f0b74427SPierre Jolivet /* Create a tag in MOAB mesh to index and keep track of number of PETSc vec tags */
5539371c9d4SSatish Balay mberr = mbiface->tag_get_handle("__PETSC_VECS__", 1, moab::MB_TYPE_INTEGER, indexTag, moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT, 0);
5549371c9d4SSatish Balay MBERRNM(mberr);
555032b8ab6SVijay Mahadevan mberr = mbiface->tag_get_data(indexTag, &rootset, 1, &n);
556032b8ab6SVijay Mahadevan if (mberr == moab::MB_TAG_NOT_FOUND) n = 0; /* this is the first temporary vector */
557032b8ab6SVijay Mahadevan else MBERRNM(mberr);
558032b8ab6SVijay Mahadevan
559032b8ab6SVijay Mahadevan /* increment the new value of n */
560032b8ab6SVijay Mahadevan ++n;
561032b8ab6SVijay Mahadevan
5629daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
563efd17f3eSVijay Mahadevan /* Make sure that n is consistent across all processes */
564462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&n, &global_n, 1, MPI_INT, MPI_MAX, pcomm->comm()));
5659daf19fdSVijay Mahadevan #else
5669daf19fdSVijay Mahadevan global_n = n;
5679daf19fdSVijay Mahadevan #endif
568032b8ab6SVijay Mahadevan
569efd17f3eSVijay Mahadevan /* Set the new name accordingly and return */
57063a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(*tag_name, PETSC_MAX_PATH_LEN - 1, "%s_%" PetscInt_FMT, PVEC_PREFIX, global_n));
5719371c9d4SSatish Balay mberr = mbiface->tag_set_data(indexTag, &rootset, 1, (const void *)&global_n);
5729371c9d4SSatish Balay MBERRNM(mberr);
5733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
574032b8ab6SVijay Mahadevan }
575032b8ab6SVijay Mahadevan
DMCreateGlobalVector_Moab(DM dm,Vec * gvec)576d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM dm, Vec *gvec)
577d71ae5a4SJacob Faibussowitsch {
578f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)dm->data;
579f6829af0SVijay Mahadevan
580f6829af0SVijay Mahadevan PetscFunctionBegin;
581f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5824f572ea9SToby Isaac PetscAssertPointer(gvec, 2);
5839566063dSJacob Faibussowitsch PetscCall(DMCreateVector_Moab_Private(dm, NULL, dmmoab->vowned, PETSC_TRUE, PETSC_TRUE, gvec));
5843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
585f6829af0SVijay Mahadevan }
586f6829af0SVijay Mahadevan
DMCreateLocalVector_Moab(DM dm,Vec * lvec)587d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM dm, Vec *lvec)
588d71ae5a4SJacob Faibussowitsch {
589f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)dm->data;
590f6829af0SVijay Mahadevan
591f6829af0SVijay Mahadevan PetscFunctionBegin;
592f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5934f572ea9SToby Isaac PetscAssertPointer(lvec, 2);
5949566063dSJacob Faibussowitsch PetscCall(DMCreateVector_Moab_Private(dm, NULL, dmmoab->vlocal, PETSC_FALSE, PETSC_TRUE, lvec));
5953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
596f6829af0SVijay Mahadevan }
597f6829af0SVijay Mahadevan
DMVecDuplicate_Moab(Vec x,Vec * y)59866976f2fSJacob Faibussowitsch static PetscErrorCode DMVecDuplicate_Moab(Vec x, Vec *y)
599d71ae5a4SJacob Faibussowitsch {
600f6829af0SVijay Mahadevan DM dm;
601f6829af0SVijay Mahadevan PetscContainer moabdata;
602f6829af0SVijay Mahadevan Vec_MOAB *vmoab;
603f6829af0SVijay Mahadevan
604f6829af0SVijay Mahadevan PetscFunctionBegin;
605f6829af0SVijay Mahadevan PetscValidHeaderSpecific(x, VEC_CLASSID, 1);
6064f572ea9SToby Isaac PetscAssertPointer(y, 2);
607f6829af0SVijay Mahadevan
608f6829af0SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */
6099566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)x, "MOABData", (PetscObject *)&moabdata));
6102a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(moabdata, &vmoab));
611f6829af0SVijay Mahadevan
6129566063dSJacob Faibussowitsch PetscCall(VecGetDM(x, &dm));
613f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
614f6829af0SVijay Mahadevan
6159566063dSJacob Faibussowitsch PetscCall(DMCreateVector_Moab_Private(dm, NULL, vmoab->tag_range, vmoab->is_global_vec, PETSC_TRUE, y));
6169566063dSJacob Faibussowitsch PetscCall(VecSetDM(*y, dm));
6173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
618f6829af0SVijay Mahadevan }
619f6829af0SVijay Mahadevan
DMVecCtxDestroy_Moab(PetscCtxRt ctx)6202a8381b2SBarry Smith static PetscErrorCode DMVecCtxDestroy_Moab(PetscCtxRt ctx)
621d71ae5a4SJacob Faibussowitsch {
6222a8381b2SBarry Smith Vec_MOAB *vmoab = *(Vec_MOAB **)ctx;
623032b8ab6SVijay Mahadevan moab::ErrorCode merr;
624032b8ab6SVijay Mahadevan
625032b8ab6SVijay Mahadevan PetscFunctionBegin;
626032b8ab6SVijay Mahadevan if (vmoab->new_tag && vmoab->tag) {
627efd17f3eSVijay Mahadevan /* Tag was created via a call to VecDuplicate, delete the underlying tag in MOAB */
6289371c9d4SSatish Balay merr = vmoab->mbiface->tag_delete(vmoab->tag);
6299371c9d4SSatish Balay MBERRNM(merr);
630032b8ab6SVijay Mahadevan }
631032b8ab6SVijay Mahadevan delete vmoab->tag_range;
632c528d872SBarry Smith vmoab->tag = NULL;
633c528d872SBarry Smith vmoab->mbiface = NULL;
6349daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
635c528d872SBarry Smith vmoab->pcomm = NULL;
6369daf19fdSVijay Mahadevan #endif
6379566063dSJacob Faibussowitsch PetscCall(PetscFree(vmoab));
6383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
639032b8ab6SVijay Mahadevan }
640032b8ab6SVijay Mahadevan
DMGlobalToLocalBegin_Moab(DM dm,Vec g,InsertMode mode,Vec l)641d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM dm, Vec g, InsertMode mode, Vec l)
642d71ae5a4SJacob Faibussowitsch {
643db66d124SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)dm->data;
644db66d124SVijay Mahadevan
645db66d124SVijay Mahadevan PetscFunctionBegin;
6469566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(dmmoab->ltog_sendrecv, g, l, mode, SCATTER_REVERSE));
6473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
648db66d124SVijay Mahadevan }
649db66d124SVijay Mahadevan
DMGlobalToLocalEnd_Moab(DM dm,Vec g,InsertMode mode,Vec l)650d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM dm, Vec g, InsertMode mode, Vec l)
651d71ae5a4SJacob Faibussowitsch {
652db66d124SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)dm->data;
653db66d124SVijay Mahadevan
654db66d124SVijay Mahadevan PetscFunctionBegin;
6559566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(dmmoab->ltog_sendrecv, g, l, mode, SCATTER_REVERSE));
6563ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
657db66d124SVijay Mahadevan }
658db66d124SVijay Mahadevan
DMLocalToGlobalBegin_Moab(DM dm,Vec l,InsertMode mode,Vec g)659d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM dm, Vec l, InsertMode mode, Vec g)
660d71ae5a4SJacob Faibussowitsch {
661db66d124SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)dm->data;
662db66d124SVijay Mahadevan
663db66d124SVijay Mahadevan PetscFunctionBegin;
6649566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(dmmoab->ltog_sendrecv, l, g, mode, SCATTER_FORWARD));
6653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
666db66d124SVijay Mahadevan }
667db66d124SVijay Mahadevan
DMLocalToGlobalEnd_Moab(DM dm,Vec l,InsertMode mode,Vec g)668d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM dm, Vec l, InsertMode mode, Vec g)
669d71ae5a4SJacob Faibussowitsch {
670db66d124SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)dm->data;
671db66d124SVijay Mahadevan
672db66d124SVijay Mahadevan PetscFunctionBegin;
6739566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(dmmoab->ltog_sendrecv, l, g, mode, SCATTER_FORWARD));
6743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
675db66d124SVijay Mahadevan }
676