xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 97ea90e6a3d8e3a721756e24ec396c3bf159d9f8)
11d72bce8STim Tautges #include <petsc-private/dmimpl.h> /*I  "petscdm.h"   I*/
2aa768e4cSTim Tautges #include <petsc-private/vecimpl.h> /*I  "petscdm.h"   I*/
31d72bce8STim Tautges 
41d72bce8STim Tautges #include <petscdmmoab.h>
588face26SJed Brown #include <MBTagConventions.hpp>
688face26SJed Brown #include <sstream>
71d72bce8STim Tautges 
81d72bce8STim Tautges typedef struct {
91d72bce8STim Tautges   PetscInt bs; /* Number of degrees of freedom on each entity, aka tag size in moab */
101d72bce8STim Tautges   PetscBool icreatedinstance; /* true if DM created moab instance internally, will destroy instance in DMDestroy */
111d72bce8STim Tautges   moab::ParallelComm *pcomm;
12a4d2169cSTim Tautges   moab::Interface *mbiface;
131d72bce8STim Tautges   moab::Tag ltog_tag; /* moab supports "global id" tags, which are usually local to global numbering */
141d72bce8STim Tautges   moab::Range range;
151d72bce8STim Tautges } DM_Moab;
161d72bce8STim Tautges 
17a4d2169cSTim Tautges typedef struct {
18a4d2169cSTim Tautges   moab::Interface    *mbiface;
19a4d2169cSTim Tautges   moab::ParallelComm *pcomm;
20a4d2169cSTim Tautges   moab::Range         tag_range; /* entities to which this tag applies */
21a4d2169cSTim Tautges   moab::Tag           tag;
22a4d2169cSTim Tautges   moab::Tag           ltog_tag;
23a4d2169cSTim Tautges   PetscInt            tag_size;
24a4d2169cSTim Tautges   PetscBool           new_tag;
25a4d2169cSTim Tautges   PetscBool           serial;
26a4d2169cSTim Tautges 
27a4d2169cSTim Tautges } Vec_MOAB;
28a4d2169cSTim Tautges 
291d72bce8STim Tautges #undef __FUNCT__
30fd349b41STim Tautges #define __FUNCT__ "DMCreateGlobalVector_Moab"
31fd349b41STim Tautges PetscErrorCode DMCreateGlobalVector_Moab(DM dm,Vec *gvec)
32fd349b41STim Tautges {
33fd349b41STim Tautges   PetscErrorCode  ierr;
34fd349b41STim Tautges   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
35fd349b41STim Tautges 
36fd349b41STim Tautges   PetscFunctionBegin;
37fd349b41STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
38fd349b41STim Tautges   PetscValidPointer(gvec,2);
39fd349b41STim Tautges   PetscInt block_size = ((DM_Moab*)dm->data)->bs;
40a4d2169cSTim Tautges   moab::Tag tag = 0;
41a4d2169cSTim Tautges   ierr = DMMoabCreateVector(dm,tag,block_size,dmmoab->range,PETSC_FALSE,PETSC_TRUE,gvec);CHKERRQ(ierr);
42fd349b41STim Tautges   PetscFunctionReturn(0);
43fd349b41STim Tautges }
44fd349b41STim Tautges 
45fd349b41STim Tautges 
46fd349b41STim Tautges #undef __FUNCT__
47fd349b41STim Tautges #define __FUNCT__ "DMCreateLocalVector_Moab"
48fd349b41STim Tautges PetscErrorCode DMCreateLocalVector_Moab(DM dm,Vec *gvec)
49fd349b41STim Tautges {
50fd349b41STim Tautges   PetscErrorCode  ierr;
51fd349b41STim Tautges   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
52fd349b41STim Tautges 
53fd349b41STim Tautges   PetscFunctionBegin;
54fd349b41STim Tautges   PetscInt bs = 1;
55fd349b41STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
56fd349b41STim Tautges   PetscValidPointer(gvec,2);
57a4d2169cSTim Tautges   moab::Tag tag = 0;
58a4d2169cSTim Tautges   ierr = DMMoabCreateVector(dm,tag,bs,dmmoab->range,PETSC_TRUE,PETSC_TRUE,gvec);CHKERRQ(ierr);
59fd349b41STim Tautges   PetscFunctionReturn(0);
60fd349b41STim Tautges }
61fd349b41STim Tautges 
62853cdec3SJed Brown #undef __FUNCT__
63853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab"
64853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm)
65853cdec3SJed Brown {
66853cdec3SJed Brown   PetscErrorCode ierr;
67853cdec3SJed Brown 
68853cdec3SJed Brown   PetscFunctionBegin;
69853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
70853cdec3SJed Brown   if (((DM_Moab*)dm->data)->icreatedinstance) {
71853cdec3SJed Brown     delete ((DM_Moab*)dm->data)->mbiface;
72853cdec3SJed Brown     ((DM_Moab*)dm->data)->mbiface = NULL;
73853cdec3SJed Brown     ((DM_Moab*)dm->data)->pcomm = NULL;
74853cdec3SJed Brown     ((DM_Moab*)dm->data)->range.~Range();
75853cdec3SJed Brown   }
76853cdec3SJed Brown   ierr = PetscFree(dm->data);CHKERRQ(ierr);
77853cdec3SJed Brown   PetscFunctionReturn(0);
78853cdec3SJed Brown }
79853cdec3SJed Brown 
80aa768e4cSTim Tautges #undef __FUNCT__
81aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
82853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
83aa768e4cSTim Tautges {
84aa768e4cSTim Tautges   DM_Moab        *moab;
85aa768e4cSTim Tautges   PetscErrorCode ierr;
86aa768e4cSTim Tautges 
87aa768e4cSTim Tautges   PetscFunctionBegin;
88aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
89aa768e4cSTim Tautges   ierr = PetscNewLog(dm,DM_Moab,&moab);CHKERRQ(ierr);
90aa768e4cSTim Tautges   dm->data = moab;
91853cdec3SJed Brown   new (moab) DM_Moab();
92aa768e4cSTim Tautges 
93*97ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
94*97ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
95*97ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
96aa768e4cSTim Tautges   PetscFunctionReturn(0);
97aa768e4cSTim Tautges }
98fd349b41STim Tautges 
99fd349b41STim Tautges #undef __FUNCT__
1001d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
1011d72bce8STim Tautges /*@
1021d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
1031d72bce8STim Tautges 
1041d72bce8STim Tautges   Collective on MPI_Comm
1051d72bce8STim Tautges 
1061d72bce8STim Tautges   Input Parameter:
1071d72bce8STim Tautges . comm - The communicator for the DMMoab object
1081d72bce8STim Tautges 
1091d72bce8STim Tautges   Output Parameter:
1101d72bce8STim Tautges . moab  - The DMMoab object
1111d72bce8STim Tautges 
1121d72bce8STim Tautges   Level: beginner
1131d72bce8STim Tautges 
1141d72bce8STim Tautges .keywords: DMMoab, create
1151d72bce8STim Tautges @*/
1161d72bce8STim Tautges PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *moab)
1171d72bce8STim Tautges {
1181d72bce8STim Tautges   PetscErrorCode ierr;
1191d72bce8STim Tautges 
1201d72bce8STim Tautges   PetscFunctionBegin;
1211d72bce8STim Tautges   PetscValidPointer(moab,2);
1221d72bce8STim Tautges   ierr = DMCreate(comm, moab);CHKERRQ(ierr);
1231d72bce8STim Tautges   ierr = DMSetType(*moab, DMMOAB);CHKERRQ(ierr);
1241d72bce8STim Tautges   PetscFunctionReturn(0);
1251d72bce8STim Tautges }
1261d72bce8STim Tautges 
1271d72bce8STim Tautges #undef __FUNCT__
128aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
1291d72bce8STim Tautges /*@
130a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
1311d72bce8STim Tautges 
1321d72bce8STim Tautges   Collective on MPI_Comm
1331d72bce8STim Tautges 
1341d72bce8STim Tautges   Input Parameter:
1351d72bce8STim Tautges . comm - The communicator for the DMMoab object
136a4d2169cSTim Tautges . moab - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
137a4d2169cSTim Tautges          along with the DMMoab
138a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
1391d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
1401d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
1411d72bce8STim Tautges 
1421d72bce8STim Tautges   Output Parameter:
1431d72bce8STim Tautges . moab  - The DMMoab object
1441d72bce8STim Tautges 
1451d72bce8STim Tautges   Level: beginner
1461d72bce8STim Tautges 
1471d72bce8STim Tautges .keywords: DMMoab, create
1481d72bce8STim Tautges @*/
149a4d2169cSTim Tautges PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag ltog_tag, moab::Range *range, DM *moab)
1501d72bce8STim Tautges {
1511d72bce8STim Tautges   PetscErrorCode ierr;
152853cdec3SJed Brown   DM_Moab        *dmmoab;
1531d72bce8STim Tautges 
1541d72bce8STim Tautges   PetscFunctionBegin;
1551d72bce8STim Tautges   PetscValidPointer(moab,2);
156853cdec3SJed Brown   ierr = DMMoabCreate(comm, moab);CHKERRQ(ierr);
157853cdec3SJed Brown   dmmoab = (DM_Moab*)(*moab)->data;
158a4d2169cSTim Tautges 
159a4d2169cSTim Tautges   if (!mbiface) {
160a4d2169cSTim Tautges     mbiface = new moab::Core();
1617d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1621d72bce8STim Tautges   }
1637d89fc02STim Tautges   else
1647d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1657d89fc02STim Tautges 
166a4d2169cSTim Tautges   if (!pcomm) {
1671d72bce8STim Tautges     PetscInt rank, nprocs;
1681d72bce8STim Tautges     MPI_Comm_rank(comm, &rank);
1691d72bce8STim Tautges     MPI_Comm_size(comm, &nprocs);
170a4d2169cSTim Tautges     pcomm = new moab::ParallelComm(mbiface, comm);
171a4d2169cSTim Tautges   }
172a4d2169cSTim Tautges 
173a4d2169cSTim Tautges     // do the initialization of the DM
174a4d2169cSTim Tautges   dmmoab->bs       = 0;
175a4d2169cSTim Tautges   dmmoab->pcomm    = pcomm;
176a4d2169cSTim Tautges   dmmoab->mbiface    = mbiface;
177a4d2169cSTim Tautges   dmmoab->ltog_tag = ltog_tag;
178a4d2169cSTim Tautges 
179a4d2169cSTim Tautges   ierr = DMMoabSetInterface(*moab, mbiface);CHKERRQ(ierr);
180a4d2169cSTim Tautges   if (!pcomm) pcomm = new moab::ParallelComm(mbiface, comm);
181a4d2169cSTim Tautges   ierr = DMMoabSetParallelComm(*moab, pcomm);CHKERRQ(ierr);
182a4d2169cSTim Tautges   if (!ltog_tag) {
183a4d2169cSTim Tautges     moab::ErrorCode merr = mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, ltog_tag);MBERRNM(merr);
184a4d2169cSTim Tautges   }
185a4d2169cSTim Tautges   if (ltog_tag) {
186a4d2169cSTim Tautges     ierr = DMMoabSetLocalToGlobalTag(*moab, ltog_tag);CHKERRQ(ierr);
187a4d2169cSTim Tautges   }
188a4d2169cSTim Tautges   if (range) {
189a4d2169cSTim Tautges     ierr = DMMoabSetRange(*moab, *range);CHKERRQ(ierr);
190a4d2169cSTim Tautges   }
1911d72bce8STim Tautges   PetscFunctionReturn(0);
1921d72bce8STim Tautges }
1931d72bce8STim Tautges 
1941d72bce8STim Tautges #undef __FUNCT__
1951d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
196aa768e4cSTim Tautges /*@
197aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
198aa768e4cSTim Tautges 
199aa768e4cSTim Tautges   Collective on MPI_Comm
200aa768e4cSTim Tautges 
201aa768e4cSTim Tautges   Input Parameter:
202aa768e4cSTim Tautges . dm    - The DMMoab object being set
203aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
204aa768e4cSTim Tautges 
205aa768e4cSTim Tautges   Level: beginner
206aa768e4cSTim Tautges 
207aa768e4cSTim Tautges .keywords: DMMoab, create
208aa768e4cSTim Tautges @*/
2091d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
2101d72bce8STim Tautges {
2111d72bce8STim Tautges   PetscFunctionBegin;
2121d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2131d72bce8STim Tautges   ((DM_Moab*)dm->data)->pcomm = pcomm;
214a4d2169cSTim Tautges   ((DM_Moab*)dm->data)->mbiface = pcomm->get_moab();
2151d72bce8STim Tautges   PetscFunctionReturn(0);
2161d72bce8STim Tautges }
2171d72bce8STim Tautges 
2181d72bce8STim Tautges 
2191d72bce8STim Tautges #undef __FUNCT__
2201d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
221aa768e4cSTim Tautges /*@
222aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
223aa768e4cSTim Tautges 
224aa768e4cSTim Tautges   Collective on MPI_Comm
225aa768e4cSTim Tautges 
226aa768e4cSTim Tautges   Input Parameter:
227aa768e4cSTim Tautges . dm    - The DMMoab object being set
228aa768e4cSTim Tautges 
229aa768e4cSTim Tautges   Output Parameter:
230aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
231aa768e4cSTim Tautges 
232aa768e4cSTim Tautges   Level: beginner
233aa768e4cSTim Tautges 
234aa768e4cSTim Tautges .keywords: DMMoab, create
235aa768e4cSTim Tautges @*/
2361d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
2371d72bce8STim Tautges {
2381d72bce8STim Tautges   PetscFunctionBegin;
2391d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2401d72bce8STim Tautges   *pcomm = ((DM_Moab*)dm->data)->pcomm;
2411d72bce8STim Tautges   PetscFunctionReturn(0);
2421d72bce8STim Tautges }
2431d72bce8STim Tautges 
2441d72bce8STim Tautges 
2451d72bce8STim Tautges #undef __FUNCT__
2461d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
247aa768e4cSTim Tautges /*@
248aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
249aa768e4cSTim Tautges 
250aa768e4cSTim Tautges   Collective on MPI_Comm
251aa768e4cSTim Tautges 
252aa768e4cSTim Tautges   Input Parameter:
253aa768e4cSTim Tautges . dm      - The DMMoab object being set
254aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
255aa768e4cSTim Tautges 
256aa768e4cSTim Tautges   Level: beginner
257aa768e4cSTim Tautges 
258aa768e4cSTim Tautges .keywords: DMMoab, create
259aa768e4cSTim Tautges @*/
260a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2611d72bce8STim Tautges {
2621d72bce8STim Tautges   PetscFunctionBegin;
2631d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2641d72bce8STim Tautges   ((DM_Moab*)dm->data)->pcomm = NULL;
265a4d2169cSTim Tautges   ((DM_Moab*)dm->data)->mbiface = mbiface;
2661d72bce8STim Tautges   PetscFunctionReturn(0);
2671d72bce8STim Tautges }
2681d72bce8STim Tautges 
2691d72bce8STim Tautges 
2701d72bce8STim Tautges #undef __FUNCT__
2711d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
272aa768e4cSTim Tautges /*@
273aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
274aa768e4cSTim Tautges 
275aa768e4cSTim Tautges   Collective on MPI_Comm
276aa768e4cSTim Tautges 
277aa768e4cSTim Tautges   Input Parameter:
278aa768e4cSTim Tautges . dm      - The DMMoab object being set
279aa768e4cSTim Tautges 
280aa768e4cSTim Tautges   Output Parameter:
281aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
282aa768e4cSTim Tautges 
283aa768e4cSTim Tautges   Level: beginner
284aa768e4cSTim Tautges 
285aa768e4cSTim Tautges .keywords: DMMoab, create
286aa768e4cSTim Tautges @*/
287a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2881d72bce8STim Tautges {
2891d72bce8STim Tautges   PetscFunctionBegin;
2901d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
291a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2921d72bce8STim Tautges   PetscFunctionReturn(0);
2931d72bce8STim Tautges }
2941d72bce8STim Tautges 
2951d72bce8STim Tautges 
2961d72bce8STim Tautges #undef __FUNCT__
2971d72bce8STim Tautges #define __FUNCT__ "DMMoabSetRange"
298aa768e4cSTim Tautges /*@
299aa768e4cSTim Tautges   DMMoabSetRange - Set the entities having DOFs on this DMMoab
300aa768e4cSTim Tautges 
301aa768e4cSTim Tautges   Collective on MPI_Comm
302aa768e4cSTim Tautges 
303aa768e4cSTim Tautges   Input Parameter:
304aa768e4cSTim Tautges . dm    - The DMMoab object being set
305aa768e4cSTim Tautges . range - The entities treated by this DMMoab
306aa768e4cSTim Tautges 
307aa768e4cSTim Tautges   Level: beginner
308aa768e4cSTim Tautges 
309aa768e4cSTim Tautges .keywords: DMMoab, create
310aa768e4cSTim Tautges @*/
3111d72bce8STim Tautges PetscErrorCode DMMoabSetRange(DM dm,moab::Range range)
3121d72bce8STim Tautges {
3131d72bce8STim Tautges   PetscFunctionBegin;
3141d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3151d72bce8STim Tautges   ((DM_Moab*)dm->data)->range = range;
3161d72bce8STim Tautges   PetscFunctionReturn(0);
3171d72bce8STim Tautges }
3181d72bce8STim Tautges 
3191d72bce8STim Tautges 
3201d72bce8STim Tautges #undef __FUNCT__
3211d72bce8STim Tautges #define __FUNCT__ "DMMoabGetRange"
322aa768e4cSTim Tautges /*@
323aa768e4cSTim Tautges   DMMoabGetRange - Get the entities having DOFs on this DMMoab
324aa768e4cSTim Tautges 
325aa768e4cSTim Tautges   Collective on MPI_Comm
326aa768e4cSTim Tautges 
327aa768e4cSTim Tautges   Input Parameter:
328aa768e4cSTim Tautges . dm    - The DMMoab object being set
329aa768e4cSTim Tautges 
330aa768e4cSTim Tautges   Output Parameter:
331aa768e4cSTim Tautges . range - The entities treated by this DMMoab
332aa768e4cSTim Tautges 
333aa768e4cSTim Tautges   Level: beginner
334aa768e4cSTim Tautges 
335aa768e4cSTim Tautges .keywords: DMMoab, create
336aa768e4cSTim Tautges @*/
3371d72bce8STim Tautges PetscErrorCode DMMoabGetRange(DM dm,moab::Range *range)
3381d72bce8STim Tautges {
3391d72bce8STim Tautges   PetscFunctionBegin;
3401d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3411d72bce8STim Tautges   *range = ((DM_Moab*)dm->data)->range;
3421d72bce8STim Tautges   PetscFunctionReturn(0);
3431d72bce8STim Tautges }
3441d72bce8STim Tautges 
3451d72bce8STim Tautges #undef __FUNCT__
3461d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
347aa768e4cSTim Tautges /*@
348aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
349aa768e4cSTim Tautges 
350aa768e4cSTim Tautges   Collective on MPI_Comm
351aa768e4cSTim Tautges 
352aa768e4cSTim Tautges   Input Parameter:
353aa768e4cSTim Tautges . dm      - The DMMoab object being set
354aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
355aa768e4cSTim Tautges 
356aa768e4cSTim Tautges   Level: beginner
357aa768e4cSTim Tautges 
358aa768e4cSTim Tautges .keywords: DMMoab, create
359aa768e4cSTim Tautges @*/
3601d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
3611d72bce8STim Tautges {
3621d72bce8STim Tautges   PetscFunctionBegin;
3631d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3641d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
3651d72bce8STim Tautges   PetscFunctionReturn(0);
3661d72bce8STim Tautges }
3671d72bce8STim Tautges 
3681d72bce8STim Tautges 
3691d72bce8STim Tautges #undef __FUNCT__
3701d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
371aa768e4cSTim Tautges /*@
372aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
373aa768e4cSTim Tautges 
374aa768e4cSTim Tautges   Collective on MPI_Comm
375aa768e4cSTim Tautges 
376aa768e4cSTim Tautges   Input Parameter:
377aa768e4cSTim Tautges . dm      - The DMMoab object being set
378aa768e4cSTim Tautges 
379aa768e4cSTim Tautges   Output Parameter:
380aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
381aa768e4cSTim Tautges 
382aa768e4cSTim Tautges   Level: beginner
383aa768e4cSTim Tautges 
384aa768e4cSTim Tautges .keywords: DMMoab, create
385aa768e4cSTim Tautges @*/
3861d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
3871d72bce8STim Tautges {
3881d72bce8STim Tautges   PetscFunctionBegin;
3891d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3901d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
3911d72bce8STim Tautges   PetscFunctionReturn(0);
3921d72bce8STim Tautges }
3931d72bce8STim Tautges 
3941d72bce8STim Tautges 
3951d72bce8STim Tautges #undef __FUNCT__
3961d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
397aa768e4cSTim Tautges /*@
398aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
399aa768e4cSTim Tautges 
400aa768e4cSTim Tautges   Collective on MPI_Comm
401aa768e4cSTim Tautges 
402aa768e4cSTim Tautges   Input Parameter:
403aa768e4cSTim Tautges . dm - The DMMoab object being set
404aa768e4cSTim Tautges . bs - The block size used with this DMMoab
405aa768e4cSTim Tautges 
406aa768e4cSTim Tautges   Level: beginner
407aa768e4cSTim Tautges 
408aa768e4cSTim Tautges .keywords: DMMoab, create
409aa768e4cSTim Tautges @*/
4101d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4111d72bce8STim Tautges {
4121d72bce8STim Tautges   PetscFunctionBegin;
4131d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4141d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4151d72bce8STim Tautges   PetscFunctionReturn(0);
4161d72bce8STim Tautges }
4171d72bce8STim Tautges 
4181d72bce8STim Tautges 
4191d72bce8STim Tautges #undef __FUNCT__
4201d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
421aa768e4cSTim Tautges /*@
422aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
423aa768e4cSTim Tautges 
424aa768e4cSTim Tautges   Collective on MPI_Comm
425aa768e4cSTim Tautges 
426aa768e4cSTim Tautges   Input Parameter:
427aa768e4cSTim Tautges . dm - The DMMoab object being set
428aa768e4cSTim Tautges 
429aa768e4cSTim Tautges   Output Parameter:
430aa768e4cSTim Tautges . bs - The block size used with this DMMoab
431aa768e4cSTim Tautges 
432aa768e4cSTim Tautges   Level: beginner
433aa768e4cSTim Tautges 
434aa768e4cSTim Tautges .keywords: DMMoab, create
435aa768e4cSTim Tautges @*/
4361d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
4371d72bce8STim Tautges {
4381d72bce8STim Tautges   PetscFunctionBegin;
4391d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4401d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
4411d72bce8STim Tautges   PetscFunctionReturn(0);
4421d72bce8STim Tautges }
4431d72bce8STim Tautges 
4441d72bce8STim Tautges 
445a4d2169cSTim Tautges // declare for use later but before they're defined
446a4d2169cSTim Tautges PetscErrorCode DMMoab_VecUserDestroy(void *user);
447a4d2169cSTim Tautges PetscErrorCode DMMoab_VecDuplicate(Vec x,Vec *y);
448a4d2169cSTim Tautges PetscErrorCode DMMoab_CreateTagName(const moab::ParallelComm *pcomm,std::string& tag_name);
449a4d2169cSTim Tautges PetscErrorCode DMMoab_CreateVector(moab::Interface *iface,moab::ParallelComm *pcomm,moab::Tag tag,PetscInt tag_size,moab::Tag ltog_tag,moab::Range range,PetscBool serial, PetscBool destroy_tag,Vec *vec);
4501d72bce8STim Tautges 
4511d72bce8STim Tautges #undef __FUNCT__
4521d72bce8STim Tautges #define __FUNCT__ "DMMoabCreateVector"
453aa768e4cSTim Tautges /*@
454aa768e4cSTim Tautges   DMMoabCreateVector - Create a Vec from either an existing tag, or a specified tag size, and a range of entities
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges   Collective on MPI_Comm
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges   Input Parameter:
459aa768e4cSTim Tautges . dm          - The DMMoab object being set
460aa768e4cSTim Tautges . tag         - If non-zero, block size will be taken from the tag size
461aa768e4cSTim Tautges . tag_size    - If tag was zero, this parameter specifies the block size; unique tag name will be generated automatically
462aa768e4cSTim Tautges . range       - If non-empty, Vec corresponds to these entities, otherwise to the entities set on the DMMoab
463aa768e4cSTim Tautges . serial      - If true, this is a serial Vec, otherwise a parallel one
464aa768e4cSTim Tautges . destroy_tag - If true, MOAB tag is destroyed with Vec, otherwise it is left on MOAB
465aa768e4cSTim Tautges 
466aa768e4cSTim Tautges   Output Parameter:
467aa768e4cSTim Tautges . vec         - The created vector
468aa768e4cSTim Tautges 
469aa768e4cSTim Tautges   Level: beginner
470aa768e4cSTim Tautges 
471aa768e4cSTim Tautges .keywords: DMMoab, create
472aa768e4cSTim Tautges @*/
473a4d2169cSTim Tautges PetscErrorCode DMMoabCreateVector(DM dm,moab::Tag tag,PetscInt tag_size,moab::Range range,PetscBool serial, PetscBool destroy_tag,Vec *vec)
4741d72bce8STim Tautges {
4751d72bce8STim Tautges   PetscErrorCode     ierr;
476a4d2169cSTim Tautges 
4771d72bce8STim Tautges   PetscFunctionBegin;
478a4d2169cSTim Tautges 
4791d72bce8STim Tautges   DM_Moab *dmmoab = (DM_Moab*)dm->data;
480a4d2169cSTim Tautges   moab::ParallelComm *pcomm = dmmoab->pcomm;
481a4d2169cSTim Tautges   moab::Interface *mbiface = dmmoab->mbiface;
482a4d2169cSTim Tautges   moab::Tag ltog_tag = dmmoab->ltog_tag;
483a4d2169cSTim Tautges 
484a4d2169cSTim Tautges   if (!tag && !tag_size) {
485a4d2169cSTim Tautges     PetscFunctionReturn(PETSC_ERR_ARG_WRONG);
486a4d2169cSTim Tautges   }
4877d89fc02STim Tautges   else {
488a4d2169cSTim Tautges     ierr = DMMoab_CreateVector(mbiface,pcomm,tag,tag_size,ltog_tag,range,serial,destroy_tag,vec);CHKERRQ(ierr);
489a4d2169cSTim Tautges   }
4901d72bce8STim Tautges   PetscFunctionReturn(0);
4911d72bce8STim Tautges }
4921d72bce8STim Tautges 
4931d72bce8STim Tautges 
4941d72bce8STim Tautges #undef __FUNCT__
495a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_CreateVector"
496a4d2169cSTim Tautges PetscErrorCode DMMoab_CreateVector(moab::Interface *mbiface,moab::ParallelComm *pcomm,moab::Tag tag,PetscInt tag_size,moab::Tag ltog_tag,moab::Range range,PetscBool serial, PetscBool destroy_tag,Vec *vec)
497a4d2169cSTim Tautges {
498a4d2169cSTim Tautges   PetscErrorCode     ierr;
499a4d2169cSTim Tautges   moab::ErrorCode    merr;
500a4d2169cSTim Tautges 
501a4d2169cSTim Tautges   PetscFunctionBegin;
502a4d2169cSTim Tautges 
503a4d2169cSTim Tautges   if (!tag) {
504a4d2169cSTim Tautges     std::string tag_name;
505a4d2169cSTim Tautges     ierr = DMMoab_CreateTagName(pcomm,tag_name);CHKERRQ(ierr);
506a4d2169cSTim Tautges 
507a4d2169cSTim Tautges       // Create the default value for the tag (all zeros):
508a4d2169cSTim Tautges     std::vector<PetscScalar> default_value(tag_size, 0.0);
509a4d2169cSTim Tautges 
510a4d2169cSTim Tautges       // Create the tag:
511a4d2169cSTim Tautges     merr = mbiface->tag_get_handle(tag_name.c_str(),tag_size,moab::MB_TYPE_DOUBLE,tag,
512a4d2169cSTim Tautges                                    moab::MB_TAG_DENSE | moab::MB_TAG_CREAT,default_value.data());MBERRNM(merr);
513a4d2169cSTim Tautges   }
514a4d2169cSTim Tautges   else {
515a4d2169cSTim Tautges 
516a4d2169cSTim Tautges       // Make sure the tag data is of type "double":
517a4d2169cSTim Tautges     moab::DataType tag_type;
518a4d2169cSTim Tautges     merr = mbiface->tag_get_data_type(tag, tag_type);MBERRNM(merr);
519a4d2169cSTim Tautges     if(tag_type != moab::MB_TYPE_DOUBLE) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Tag data type must be MB_TYPE_DOUBLE");
520a4d2169cSTim Tautges   }
521a4d2169cSTim Tautges 
522a4d2169cSTim Tautges     // Create the MOAB internal data object
523a4d2169cSTim Tautges   Vec_MOAB *vmoab;
524a4d2169cSTim Tautges   ierr = PetscMalloc(sizeof(Vec_MOAB),&vmoab);CHKERRQ(ierr);
525a4d2169cSTim Tautges   new (vmoab) Vec_MOAB();
526a4d2169cSTim Tautges   vmoab->tag = tag;
527a4d2169cSTim Tautges   vmoab->ltog_tag = ltog_tag;
528a4d2169cSTim Tautges   vmoab->mbiface = mbiface;
529a4d2169cSTim Tautges   vmoab->pcomm = pcomm;
530a4d2169cSTim Tautges   vmoab->tag_range = range;
531a4d2169cSTim Tautges   vmoab->new_tag = destroy_tag;
532a4d2169cSTim Tautges   vmoab->serial = serial;
533a4d2169cSTim Tautges   merr = mbiface->tag_get_length(tag,vmoab->tag_size);MBERR("tag_get_size", merr);
534a4d2169cSTim Tautges 
535a4d2169cSTim Tautges     // Call tag_iterate. This will cause MOAB to allocate memory for the
536a4d2169cSTim Tautges     // tag data if it hasn't already happened:
537a4d2169cSTim Tautges   int  count;
538a4d2169cSTim Tautges   void *void_ptr;
539a4d2169cSTim Tautges   merr = mbiface->tag_iterate(tag,range.begin(),range.end(),count,void_ptr);MBERRNM(merr);
540a4d2169cSTim Tautges 
541a4d2169cSTim Tautges     // Check to make sure the tag data is in a single sequence:
542a4d2169cSTim Tautges   if ((unsigned)count != range.size()) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can only create MOAB Vector for single sequence");
543a4d2169cSTim Tautges   PetscScalar *data_ptr = (PetscScalar*)void_ptr;
544a4d2169cSTim Tautges 
545a4d2169cSTim Tautges     // Create the PETSc Vector:
546a4d2169cSTim Tautges   if(!serial) {
547a4d2169cSTim Tautges       // This is an MPI Vector:
548a4d2169cSTim Tautges     ierr = VecCreateMPIWithArray(vmoab->pcomm->comm(),vmoab->tag_size,vmoab->tag_size*range.size(),
549f7b72ab5SJed Brown                                  PETSC_DECIDE,data_ptr,vec);CHKERRQ(ierr);
550a4d2169cSTim Tautges 
551a4d2169cSTim Tautges       // Vector created, manually set local to global mapping:
552a4d2169cSTim Tautges     ISLocalToGlobalMapping ltog;
553a4d2169cSTim Tautges     PetscInt               *gindices = new PetscInt[range.size()];
554a4d2169cSTim Tautges     PetscInt               count = 0;
555a4d2169cSTim Tautges     moab::Range::iterator  iter;
556a4d2169cSTim Tautges     for(iter = range.begin(); iter != range.end(); iter++) {
557a4d2169cSTim Tautges       int dof;
558a4d2169cSTim Tautges       merr = mbiface->tag_get_data(ltog_tag,&(*iter),1,&dof);MBERRNM(merr);
559a4d2169cSTim Tautges       gindices[count] = dof;
560a4d2169cSTim Tautges       count++;
561a4d2169cSTim Tautges     }
562a4d2169cSTim Tautges 
563a4d2169cSTim Tautges     ierr = ISLocalToGlobalMappingCreate(PETSC_COMM_SELF,range.size(),gindices,
564a4d2169cSTim Tautges                                         PETSC_COPY_VALUES,&ltog);CHKERRQ(ierr);
565a4d2169cSTim Tautges     ierr = VecSetLocalToGlobalMappingBlock(*vec,ltog);CHKERRQ(ierr);
566a4d2169cSTim Tautges 
567a4d2169cSTim Tautges       // Clean up:
568a4d2169cSTim Tautges     ierr = ISLocalToGlobalMappingDestroy(&ltog);CHKERRQ(ierr);
569a4d2169cSTim Tautges     delete [] gindices;
570a4d2169cSTim Tautges   } else {
571a4d2169cSTim Tautges       // This is a serial vector:
572f7b72ab5SJed Brown     ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,vmoab->tag_size,vmoab->tag_size*range.size(),data_ptr,vec);CHKERRQ(ierr);
573a4d2169cSTim Tautges   }
574a4d2169cSTim Tautges 
575a4d2169cSTim Tautges 
576a4d2169cSTim Tautges   PetscContainer moabdata;
577a4d2169cSTim Tautges   ierr = PetscContainerCreate(PETSC_COMM_SELF,&moabdata);CHKERRQ(ierr);
578a4d2169cSTim Tautges   ierr = PetscContainerSetPointer(moabdata,vmoab);CHKERRQ(ierr);
579a4d2169cSTim Tautges   ierr = PetscContainerSetUserDestroy(moabdata,DMMoab_VecUserDestroy);CHKERRQ(ierr);
580a4d2169cSTim Tautges   ierr = PetscObjectCompose((PetscObject)*vec,"MOABData",(PetscObject)moabdata);CHKERRQ(ierr);
581a4d2169cSTim Tautges   (*vec)->ops->duplicate = DMMoab_VecDuplicate;
582a4d2169cSTim Tautges 
583a4d2169cSTim Tautges   ierr = PetscContainerDestroy(&moabdata);CHKERRQ(ierr);
584a4d2169cSTim Tautges   PetscFunctionReturn(0);
585a4d2169cSTim Tautges }
586a4d2169cSTim Tautges 
587a4d2169cSTim Tautges #undef __FUNCT__
5881d72bce8STim Tautges #define __FUNCT__ "DMMoabGetVecTag"
589aa768e4cSTim Tautges /*@
590aa768e4cSTim Tautges   DMMoabGetVecTag - Get the MOAB tag associated with this Vec
591aa768e4cSTim Tautges 
592aa768e4cSTim Tautges   Collective on MPI_Comm
593aa768e4cSTim Tautges 
594aa768e4cSTim Tautges   Input Parameter:
595aa768e4cSTim Tautges . vec - Vec being queried
596aa768e4cSTim Tautges 
597aa768e4cSTim Tautges   Output Parameter:
598aa768e4cSTim Tautges . tag - Tag associated with this Vec
599aa768e4cSTim Tautges 
600aa768e4cSTim Tautges   Level: beginner
601aa768e4cSTim Tautges 
602aa768e4cSTim Tautges .keywords: DMMoab, create
603aa768e4cSTim Tautges @*/
6041d72bce8STim Tautges PetscErrorCode DMMoabGetVecTag(Vec vec,moab::Tag *tag)
6051d72bce8STim Tautges {
606a4d2169cSTim Tautges   PetscContainer  moabdata;
607a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
6081d72bce8STim Tautges   PetscErrorCode  ierr;
609a4d2169cSTim Tautges 
6101d72bce8STim Tautges   PetscFunctionBegin;
611a4d2169cSTim Tautges 
612a4d2169cSTim Tautges   // Get the MOAB private data:
613a4d2169cSTim Tautges   ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr);
614a4d2169cSTim Tautges   ierr = PetscContainerGetPointer(moabdata, (void**) &vmoab);CHKERRQ(ierr);
615a4d2169cSTim Tautges 
616a4d2169cSTim Tautges   *tag = vmoab->tag;
617a4d2169cSTim Tautges 
6181d72bce8STim Tautges   PetscFunctionReturn(0);
6191d72bce8STim Tautges }
6201d72bce8STim Tautges 
6211d72bce8STim Tautges 
6221d72bce8STim Tautges #undef __FUNCT__
6231d72bce8STim Tautges #define __FUNCT__ "DMMoabGetVecRange"
624aa768e4cSTim Tautges /*@
625aa768e4cSTim Tautges   DMMoabGetVecRange - Get the MOAB entities associated with this Vec
626aa768e4cSTim Tautges 
627aa768e4cSTim Tautges   Collective on MPI_Comm
628aa768e4cSTim Tautges 
629aa768e4cSTim Tautges   Input Parameter:
630aa768e4cSTim Tautges . vec   - Vec being queried
631aa768e4cSTim Tautges 
632aa768e4cSTim Tautges   Output Parameter:
633aa768e4cSTim Tautges . range - Entities associated with this Vec
634aa768e4cSTim Tautges 
635aa768e4cSTim Tautges   Level: beginner
636aa768e4cSTim Tautges 
637aa768e4cSTim Tautges .keywords: DMMoab, create
638aa768e4cSTim Tautges @*/
6391d72bce8STim Tautges PetscErrorCode DMMoabGetVecRange(Vec vec,moab::Range *range)
6401d72bce8STim Tautges {
641a4d2169cSTim Tautges   PetscContainer  moabdata;
642a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
6431d72bce8STim Tautges   PetscErrorCode  ierr;
644a4d2169cSTim Tautges 
6451d72bce8STim Tautges   PetscFunctionBegin;
646a4d2169cSTim Tautges 
647a4d2169cSTim Tautges   // Get the MOAB private data:
648a4d2169cSTim Tautges   ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr);
649a4d2169cSTim Tautges   ierr = PetscContainerGetPointer(moabdata, (void**) &vmoab);CHKERRQ(ierr);
650a4d2169cSTim Tautges 
651a4d2169cSTim Tautges   *range = vmoab->tag_range;
652a4d2169cSTim Tautges 
6531d72bce8STim Tautges   PetscFunctionReturn(0);
6541d72bce8STim Tautges }
6551d72bce8STim Tautges 
6561d72bce8STim Tautges 
657a4d2169cSTim Tautges #undef __FUNCT__
658a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_VecDuplicate"
659a4d2169cSTim Tautges PetscErrorCode DMMoab_VecDuplicate(Vec x,Vec *y)
660a4d2169cSTim Tautges {
661a4d2169cSTim Tautges   PetscErrorCode ierr;
662a4d2169cSTim Tautges   PetscFunctionBegin;
663a4d2169cSTim Tautges   PetscValidHeaderSpecific(x,VEC_CLASSID,1);
664a4d2169cSTim Tautges   PetscValidPointer(y,2);
665a4d2169cSTim Tautges 
666a4d2169cSTim Tautges   // Get the Vec_MOAB struct for the original vector:
667a4d2169cSTim Tautges   PetscContainer  moabdata;
668a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
669a4d2169cSTim Tautges   ierr = PetscObjectQuery((PetscObject)x,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr);
670a4d2169cSTim Tautges   ierr = PetscContainerGetPointer(moabdata, (void**)&vmoab);CHKERRQ(ierr);
671a4d2169cSTim Tautges 
6727d89fc02STim Tautges   ierr = DMMoab_CreateVector(vmoab->mbiface,vmoab->pcomm,0,vmoab->tag_size,vmoab->ltog_tag,vmoab->tag_range,vmoab->serial,PETSC_TRUE,y);CHKERRQ(ierr);
673a4d2169cSTim Tautges   PetscFunctionReturn(0);
674a4d2169cSTim Tautges }
675a4d2169cSTim Tautges 
676a4d2169cSTim Tautges 
677a4d2169cSTim Tautges #undef __FUNCT__
678a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_CreateTagName"
679a4d2169cSTim Tautges /*  DMMoab_CreateTagName
680a4d2169cSTim Tautges  *
681a4d2169cSTim Tautges  *  Creates a unique tag name that will be shared across processes. If
682a4d2169cSTim Tautges  *  pcomm is NULL, then this is a serial vector. A unique tag name
683a4d2169cSTim Tautges  *  will be returned in tag_name in either case.
684a4d2169cSTim Tautges  *
685a4d2169cSTim Tautges  *  The tag names have the format _PETSC_VEC_N where N is some integer.
686a4d2169cSTim Tautges  */
687a4d2169cSTim Tautges PetscErrorCode DMMoab_CreateTagName(const moab::ParallelComm *pcomm,std::string& tag_name)
688a4d2169cSTim Tautges {
689a4d2169cSTim Tautges   moab::ErrorCode mberr;
690a4d2169cSTim Tautges   PetscErrorCode  ierr;
691a4d2169cSTim Tautges 
692a4d2169cSTim Tautges   PetscFunctionBegin;
693a4d2169cSTim Tautges   const std::string PVEC_PREFIX      = "_PETSC_VEC_";
694a4d2169cSTim Tautges   const PetscInt    PVEC_PREFIX_SIZE = PVEC_PREFIX.size();
695a4d2169cSTim Tautges 
696a4d2169cSTim Tautges   // Check to see if there are any PETSc vectors defined:
697a4d2169cSTim Tautges   const moab::Interface  *mbiface = pcomm->get_moab();
698a4d2169cSTim Tautges   std::vector<moab::Tag> tags;
699a4d2169cSTim Tautges   PetscInt               n = 0;
700a4d2169cSTim Tautges   mberr = mbiface->tag_get_tags(tags);MBERRNM(mberr);
701a4d2169cSTim Tautges   for(unsigned i = 0; i < tags.size(); i++) {
702a4d2169cSTim Tautges     std::string s;
703a4d2169cSTim Tautges     mberr = mbiface->tag_get_name(tags[i],s);MBERRNM(mberr);
704a4d2169cSTim Tautges     if(s.find(PVEC_PREFIX) != std::string::npos){
705a4d2169cSTim Tautges       // This tag represents a PETSc vector. Find the vector number:
706a4d2169cSTim Tautges       PetscInt m;
707a4d2169cSTim Tautges       std::istringstream(s.substr(PVEC_PREFIX_SIZE)) >> m;
708a4d2169cSTim Tautges       if(m >= n) n = m+1;
709a4d2169cSTim Tautges     }
710a4d2169cSTim Tautges   }
711a4d2169cSTim Tautges 
712a4d2169cSTim Tautges   // Make sure that n is consistent across all processes:
713a4d2169cSTim Tautges   PetscInt global_n;
714a4d2169cSTim Tautges   MPI_Comm comm = PETSC_COMM_SELF;
715a4d2169cSTim Tautges   if(pcomm) comm = pcomm->comm();
716a4d2169cSTim Tautges   ierr = MPI_Allreduce(&n,&global_n,1,MPI_INT,MPI_MAX,comm);CHKERRQ(ierr);
717a4d2169cSTim Tautges 
718a4d2169cSTim Tautges   // Set the answer and return:
71988face26SJed Brown   std::ostringstream ss;
720a4d2169cSTim Tautges   ss << PVEC_PREFIX << global_n;
721a4d2169cSTim Tautges   tag_name = ss.str();
722a4d2169cSTim Tautges   PetscFunctionReturn(0);
723a4d2169cSTim Tautges }
724a4d2169cSTim Tautges 
725a4d2169cSTim Tautges 
726a4d2169cSTim Tautges #undef __FUNCT__
727a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_VecUserDestroy"
728a4d2169cSTim Tautges PetscErrorCode DMMoab_VecUserDestroy(void *user)
729a4d2169cSTim Tautges {
730a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
731a4d2169cSTim Tautges   PetscErrorCode  ierr;
732a4d2169cSTim Tautges   moab::ErrorCode merr;
733a4d2169cSTim Tautges 
734a4d2169cSTim Tautges   PetscFunctionBegin;
735a4d2169cSTim Tautges   vmoab = (Vec_MOAB*)user;
736853cdec3SJed Brown   vmoab->tag_range.~Range();
737853cdec3SJed Brown   if(vmoab->new_tag) {
738a4d2169cSTim Tautges     // Tag created via a call to VecDuplicate, delete the underlying tag in MOAB...
739a4d2169cSTim Tautges     merr = vmoab->mbiface->tag_delete(vmoab->tag);MBERRNM(merr);
740a4d2169cSTim Tautges   }
741a4d2169cSTim Tautges 
742a4d2169cSTim Tautges   ierr = PetscFree(vmoab);CHKERRQ(ierr);
743a4d2169cSTim Tautges   PetscFunctionReturn(0);
744a4d2169cSTim Tautges }
745a4d2169cSTim Tautges 
746