xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 853cdec3194134057905d1a28d2ce93e6a3dcb13)
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 
62*853cdec3SJed Brown #undef __FUNCT__
63*853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab"
64*853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm)
65*853cdec3SJed Brown {
66*853cdec3SJed Brown   PetscErrorCode ierr;
67*853cdec3SJed Brown 
68*853cdec3SJed Brown   PetscFunctionBegin;
69*853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
70*853cdec3SJed Brown   if (((DM_Moab*)dm->data)->icreatedinstance) {
71*853cdec3SJed Brown     delete ((DM_Moab*)dm->data)->mbiface;
72*853cdec3SJed Brown     ((DM_Moab*)dm->data)->mbiface = NULL;
73*853cdec3SJed Brown     ((DM_Moab*)dm->data)->pcomm = NULL;
74*853cdec3SJed Brown     ((DM_Moab*)dm->data)->range.~Range();
75*853cdec3SJed Brown   }
76*853cdec3SJed Brown   ierr = PetscFree(dm->data);CHKERRQ(ierr);
77*853cdec3SJed Brown   PetscFunctionReturn(0);
78*853cdec3SJed Brown }
79*853cdec3SJed Brown 
80aa768e4cSTim Tautges #undef __FUNCT__
81aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
82*853cdec3SJed 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;
91*853cdec3SJed Brown   new (moab) DM_Moab();
92aa768e4cSTim Tautges 
93aa768e4cSTim Tautges   PetscFunctionReturn(0);
94aa768e4cSTim Tautges }
95fd349b41STim Tautges 
96fd349b41STim Tautges #undef __FUNCT__
971d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
981d72bce8STim Tautges /*@
991d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
1001d72bce8STim Tautges 
1011d72bce8STim Tautges   Collective on MPI_Comm
1021d72bce8STim Tautges 
1031d72bce8STim Tautges   Input Parameter:
1041d72bce8STim Tautges . comm - The communicator for the DMMoab object
1051d72bce8STim Tautges 
1061d72bce8STim Tautges   Output Parameter:
1071d72bce8STim Tautges . moab  - The DMMoab object
1081d72bce8STim Tautges 
1091d72bce8STim Tautges   Level: beginner
1101d72bce8STim Tautges 
1111d72bce8STim Tautges .keywords: DMMoab, create
1121d72bce8STim Tautges @*/
1131d72bce8STim Tautges PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *moab)
1141d72bce8STim Tautges {
1151d72bce8STim Tautges   PetscErrorCode ierr;
1161d72bce8STim Tautges 
1171d72bce8STim Tautges   PetscFunctionBegin;
1181d72bce8STim Tautges   PetscValidPointer(moab,2);
1191d72bce8STim Tautges   ierr = DMCreate(comm, moab);CHKERRQ(ierr);
1201d72bce8STim Tautges   ierr = DMSetType(*moab, DMMOAB);CHKERRQ(ierr);
1211d72bce8STim Tautges   PetscFunctionReturn(0);
1221d72bce8STim Tautges }
1231d72bce8STim Tautges 
1241d72bce8STim Tautges #undef __FUNCT__
125aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
1261d72bce8STim Tautges /*@
127a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
1281d72bce8STim Tautges 
1291d72bce8STim Tautges   Collective on MPI_Comm
1301d72bce8STim Tautges 
1311d72bce8STim Tautges   Input Parameter:
1321d72bce8STim Tautges . comm - The communicator for the DMMoab object
133a4d2169cSTim Tautges . moab - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
134a4d2169cSTim Tautges          along with the DMMoab
135a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
1361d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
1371d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
1381d72bce8STim Tautges 
1391d72bce8STim Tautges   Output Parameter:
1401d72bce8STim Tautges . moab  - The DMMoab object
1411d72bce8STim Tautges 
1421d72bce8STim Tautges   Level: beginner
1431d72bce8STim Tautges 
1441d72bce8STim Tautges .keywords: DMMoab, create
1451d72bce8STim Tautges @*/
146a4d2169cSTim Tautges PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag ltog_tag, moab::Range *range, DM *moab)
1471d72bce8STim Tautges {
1481d72bce8STim Tautges   PetscErrorCode ierr;
149*853cdec3SJed Brown   DM_Moab        *dmmoab;
1501d72bce8STim Tautges 
1511d72bce8STim Tautges   PetscFunctionBegin;
1521d72bce8STim Tautges   PetscValidPointer(moab,2);
153*853cdec3SJed Brown   ierr = DMMoabCreate(comm, moab);CHKERRQ(ierr);
154*853cdec3SJed Brown   dmmoab = (DM_Moab*)(*moab)->data;
155a4d2169cSTim Tautges 
156a4d2169cSTim Tautges   if (!mbiface) {
157a4d2169cSTim Tautges     mbiface = new moab::Core();
1587d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1591d72bce8STim Tautges   }
1607d89fc02STim Tautges   else
1617d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1627d89fc02STim Tautges 
163a4d2169cSTim Tautges   if (!pcomm) {
1641d72bce8STim Tautges     PetscInt rank, nprocs;
1651d72bce8STim Tautges     MPI_Comm_rank(comm, &rank);
1661d72bce8STim Tautges     MPI_Comm_size(comm, &nprocs);
167a4d2169cSTim Tautges     pcomm = new moab::ParallelComm(mbiface, comm);
168a4d2169cSTim Tautges   }
169a4d2169cSTim Tautges 
170a4d2169cSTim Tautges     // do the initialization of the DM
171a4d2169cSTim Tautges   dmmoab->bs       = 0;
172a4d2169cSTim Tautges   dmmoab->pcomm    = pcomm;
173a4d2169cSTim Tautges   dmmoab->mbiface    = mbiface;
174a4d2169cSTim Tautges   dmmoab->ltog_tag = ltog_tag;
175a4d2169cSTim Tautges 
176a4d2169cSTim Tautges     // initialize various functions
177a4d2169cSTim Tautges   (*moab)->ops->createglobalvector              = DMCreateGlobalVector_Moab;
178a4d2169cSTim Tautges   (*moab)->ops->createlocalvector               = DMCreateLocalVector_Moab;
179a4d2169cSTim Tautges   (*moab)->ops->destroy                         = DMDestroy_Moab;
180a4d2169cSTim Tautges 
181a4d2169cSTim Tautges   ierr = DMMoabSetInterface(*moab, mbiface);CHKERRQ(ierr);
182a4d2169cSTim Tautges   if (!pcomm) pcomm = new moab::ParallelComm(mbiface, comm);
183a4d2169cSTim Tautges   ierr = DMMoabSetParallelComm(*moab, pcomm);CHKERRQ(ierr);
184a4d2169cSTim Tautges   if (!ltog_tag) {
185a4d2169cSTim Tautges     moab::ErrorCode merr = mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, ltog_tag);MBERRNM(merr);
186a4d2169cSTim Tautges   }
187a4d2169cSTim Tautges   if (ltog_tag) {
188a4d2169cSTim Tautges     ierr = DMMoabSetLocalToGlobalTag(*moab, ltog_tag);CHKERRQ(ierr);
189a4d2169cSTim Tautges   }
190a4d2169cSTim Tautges   if (range) {
191a4d2169cSTim Tautges     ierr = DMMoabSetRange(*moab, *range);CHKERRQ(ierr);
192a4d2169cSTim Tautges   }
1931d72bce8STim Tautges   PetscFunctionReturn(0);
1941d72bce8STim Tautges }
1951d72bce8STim Tautges 
1961d72bce8STim Tautges #undef __FUNCT__
1971d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
198aa768e4cSTim Tautges /*@
199aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
200aa768e4cSTim Tautges 
201aa768e4cSTim Tautges   Collective on MPI_Comm
202aa768e4cSTim Tautges 
203aa768e4cSTim Tautges   Input Parameter:
204aa768e4cSTim Tautges . dm    - The DMMoab object being set
205aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
206aa768e4cSTim Tautges 
207aa768e4cSTim Tautges   Level: beginner
208aa768e4cSTim Tautges 
209aa768e4cSTim Tautges .keywords: DMMoab, create
210aa768e4cSTim Tautges @*/
2111d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
2121d72bce8STim Tautges {
2131d72bce8STim Tautges   PetscFunctionBegin;
2141d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2151d72bce8STim Tautges   ((DM_Moab*)dm->data)->pcomm = pcomm;
216a4d2169cSTim Tautges   ((DM_Moab*)dm->data)->mbiface = pcomm->get_moab();
2171d72bce8STim Tautges   PetscFunctionReturn(0);
2181d72bce8STim Tautges }
2191d72bce8STim Tautges 
2201d72bce8STim Tautges 
2211d72bce8STim Tautges #undef __FUNCT__
2221d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
223aa768e4cSTim Tautges /*@
224aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
225aa768e4cSTim Tautges 
226aa768e4cSTim Tautges   Collective on MPI_Comm
227aa768e4cSTim Tautges 
228aa768e4cSTim Tautges   Input Parameter:
229aa768e4cSTim Tautges . dm    - The DMMoab object being set
230aa768e4cSTim Tautges 
231aa768e4cSTim Tautges   Output Parameter:
232aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
233aa768e4cSTim Tautges 
234aa768e4cSTim Tautges   Level: beginner
235aa768e4cSTim Tautges 
236aa768e4cSTim Tautges .keywords: DMMoab, create
237aa768e4cSTim Tautges @*/
2381d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
2391d72bce8STim Tautges {
2401d72bce8STim Tautges   PetscFunctionBegin;
2411d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2421d72bce8STim Tautges   *pcomm = ((DM_Moab*)dm->data)->pcomm;
2431d72bce8STim Tautges   PetscFunctionReturn(0);
2441d72bce8STim Tautges }
2451d72bce8STim Tautges 
2461d72bce8STim Tautges 
2471d72bce8STim Tautges #undef __FUNCT__
2481d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
249aa768e4cSTim Tautges /*@
250aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
251aa768e4cSTim Tautges 
252aa768e4cSTim Tautges   Collective on MPI_Comm
253aa768e4cSTim Tautges 
254aa768e4cSTim Tautges   Input Parameter:
255aa768e4cSTim Tautges . dm      - The DMMoab object being set
256aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
257aa768e4cSTim Tautges 
258aa768e4cSTim Tautges   Level: beginner
259aa768e4cSTim Tautges 
260aa768e4cSTim Tautges .keywords: DMMoab, create
261aa768e4cSTim Tautges @*/
262a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2631d72bce8STim Tautges {
2641d72bce8STim Tautges   PetscFunctionBegin;
2651d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2661d72bce8STim Tautges   ((DM_Moab*)dm->data)->pcomm = NULL;
267a4d2169cSTim Tautges   ((DM_Moab*)dm->data)->mbiface = mbiface;
2681d72bce8STim Tautges   PetscFunctionReturn(0);
2691d72bce8STim Tautges }
2701d72bce8STim Tautges 
2711d72bce8STim Tautges 
2721d72bce8STim Tautges #undef __FUNCT__
2731d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
274aa768e4cSTim Tautges /*@
275aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
276aa768e4cSTim Tautges 
277aa768e4cSTim Tautges   Collective on MPI_Comm
278aa768e4cSTim Tautges 
279aa768e4cSTim Tautges   Input Parameter:
280aa768e4cSTim Tautges . dm      - The DMMoab object being set
281aa768e4cSTim Tautges 
282aa768e4cSTim Tautges   Output Parameter:
283aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
284aa768e4cSTim Tautges 
285aa768e4cSTim Tautges   Level: beginner
286aa768e4cSTim Tautges 
287aa768e4cSTim Tautges .keywords: DMMoab, create
288aa768e4cSTim Tautges @*/
289a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2901d72bce8STim Tautges {
2911d72bce8STim Tautges   PetscFunctionBegin;
2921d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
293a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2941d72bce8STim Tautges   PetscFunctionReturn(0);
2951d72bce8STim Tautges }
2961d72bce8STim Tautges 
2971d72bce8STim Tautges 
2981d72bce8STim Tautges #undef __FUNCT__
2991d72bce8STim Tautges #define __FUNCT__ "DMMoabSetRange"
300aa768e4cSTim Tautges /*@
301aa768e4cSTim Tautges   DMMoabSetRange - Set the entities having DOFs on this DMMoab
302aa768e4cSTim Tautges 
303aa768e4cSTim Tautges   Collective on MPI_Comm
304aa768e4cSTim Tautges 
305aa768e4cSTim Tautges   Input Parameter:
306aa768e4cSTim Tautges . dm    - The DMMoab object being set
307aa768e4cSTim Tautges . range - The entities treated by this DMMoab
308aa768e4cSTim Tautges 
309aa768e4cSTim Tautges   Level: beginner
310aa768e4cSTim Tautges 
311aa768e4cSTim Tautges .keywords: DMMoab, create
312aa768e4cSTim Tautges @*/
3131d72bce8STim Tautges PetscErrorCode DMMoabSetRange(DM dm,moab::Range range)
3141d72bce8STim Tautges {
3151d72bce8STim Tautges   PetscFunctionBegin;
3161d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3171d72bce8STim Tautges   ((DM_Moab*)dm->data)->range = range;
3181d72bce8STim Tautges   PetscFunctionReturn(0);
3191d72bce8STim Tautges }
3201d72bce8STim Tautges 
3211d72bce8STim Tautges 
3221d72bce8STim Tautges #undef __FUNCT__
3231d72bce8STim Tautges #define __FUNCT__ "DMMoabGetRange"
324aa768e4cSTim Tautges /*@
325aa768e4cSTim Tautges   DMMoabGetRange - Get the entities having DOFs on this DMMoab
326aa768e4cSTim Tautges 
327aa768e4cSTim Tautges   Collective on MPI_Comm
328aa768e4cSTim Tautges 
329aa768e4cSTim Tautges   Input Parameter:
330aa768e4cSTim Tautges . dm    - The DMMoab object being set
331aa768e4cSTim Tautges 
332aa768e4cSTim Tautges   Output Parameter:
333aa768e4cSTim Tautges . range - The entities treated by this DMMoab
334aa768e4cSTim Tautges 
335aa768e4cSTim Tautges   Level: beginner
336aa768e4cSTim Tautges 
337aa768e4cSTim Tautges .keywords: DMMoab, create
338aa768e4cSTim Tautges @*/
3391d72bce8STim Tautges PetscErrorCode DMMoabGetRange(DM dm,moab::Range *range)
3401d72bce8STim Tautges {
3411d72bce8STim Tautges   PetscFunctionBegin;
3421d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3431d72bce8STim Tautges   *range = ((DM_Moab*)dm->data)->range;
3441d72bce8STim Tautges   PetscFunctionReturn(0);
3451d72bce8STim Tautges }
3461d72bce8STim Tautges 
3471d72bce8STim Tautges #undef __FUNCT__
3481d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
349aa768e4cSTim Tautges /*@
350aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
351aa768e4cSTim Tautges 
352aa768e4cSTim Tautges   Collective on MPI_Comm
353aa768e4cSTim Tautges 
354aa768e4cSTim Tautges   Input Parameter:
355aa768e4cSTim Tautges . dm      - The DMMoab object being set
356aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
357aa768e4cSTim Tautges 
358aa768e4cSTim Tautges   Level: beginner
359aa768e4cSTim Tautges 
360aa768e4cSTim Tautges .keywords: DMMoab, create
361aa768e4cSTim Tautges @*/
3621d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
3631d72bce8STim Tautges {
3641d72bce8STim Tautges   PetscFunctionBegin;
3651d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3661d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
3671d72bce8STim Tautges   PetscFunctionReturn(0);
3681d72bce8STim Tautges }
3691d72bce8STim Tautges 
3701d72bce8STim Tautges 
3711d72bce8STim Tautges #undef __FUNCT__
3721d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
373aa768e4cSTim Tautges /*@
374aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
375aa768e4cSTim Tautges 
376aa768e4cSTim Tautges   Collective on MPI_Comm
377aa768e4cSTim Tautges 
378aa768e4cSTim Tautges   Input Parameter:
379aa768e4cSTim Tautges . dm      - The DMMoab object being set
380aa768e4cSTim Tautges 
381aa768e4cSTim Tautges   Output Parameter:
382aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
383aa768e4cSTim Tautges 
384aa768e4cSTim Tautges   Level: beginner
385aa768e4cSTim Tautges 
386aa768e4cSTim Tautges .keywords: DMMoab, create
387aa768e4cSTim Tautges @*/
3881d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
3891d72bce8STim Tautges {
3901d72bce8STim Tautges   PetscFunctionBegin;
3911d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3921d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
3931d72bce8STim Tautges   PetscFunctionReturn(0);
3941d72bce8STim Tautges }
3951d72bce8STim Tautges 
3961d72bce8STim Tautges 
3971d72bce8STim Tautges #undef __FUNCT__
3981d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
399aa768e4cSTim Tautges /*@
400aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
401aa768e4cSTim Tautges 
402aa768e4cSTim Tautges   Collective on MPI_Comm
403aa768e4cSTim Tautges 
404aa768e4cSTim Tautges   Input Parameter:
405aa768e4cSTim Tautges . dm - The DMMoab object being set
406aa768e4cSTim Tautges . bs - The block size used with this DMMoab
407aa768e4cSTim Tautges 
408aa768e4cSTim Tautges   Level: beginner
409aa768e4cSTim Tautges 
410aa768e4cSTim Tautges .keywords: DMMoab, create
411aa768e4cSTim Tautges @*/
4121d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4131d72bce8STim Tautges {
4141d72bce8STim Tautges   PetscFunctionBegin;
4151d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4161d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4171d72bce8STim Tautges   PetscFunctionReturn(0);
4181d72bce8STim Tautges }
4191d72bce8STim Tautges 
4201d72bce8STim Tautges 
4211d72bce8STim Tautges #undef __FUNCT__
4221d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
423aa768e4cSTim Tautges /*@
424aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
425aa768e4cSTim Tautges 
426aa768e4cSTim Tautges   Collective on MPI_Comm
427aa768e4cSTim Tautges 
428aa768e4cSTim Tautges   Input Parameter:
429aa768e4cSTim Tautges . dm - The DMMoab object being set
430aa768e4cSTim Tautges 
431aa768e4cSTim Tautges   Output Parameter:
432aa768e4cSTim Tautges . bs - The block size used with this DMMoab
433aa768e4cSTim Tautges 
434aa768e4cSTim Tautges   Level: beginner
435aa768e4cSTim Tautges 
436aa768e4cSTim Tautges .keywords: DMMoab, create
437aa768e4cSTim Tautges @*/
4381d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
4391d72bce8STim Tautges {
4401d72bce8STim Tautges   PetscFunctionBegin;
4411d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4421d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
4431d72bce8STim Tautges   PetscFunctionReturn(0);
4441d72bce8STim Tautges }
4451d72bce8STim Tautges 
4461d72bce8STim Tautges 
447a4d2169cSTim Tautges // declare for use later but before they're defined
448a4d2169cSTim Tautges PetscErrorCode DMMoab_VecUserDestroy(void *user);
449a4d2169cSTim Tautges PetscErrorCode DMMoab_VecDuplicate(Vec x,Vec *y);
450a4d2169cSTim Tautges PetscErrorCode DMMoab_CreateTagName(const moab::ParallelComm *pcomm,std::string& tag_name);
451a4d2169cSTim 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);
4521d72bce8STim Tautges 
4531d72bce8STim Tautges #undef __FUNCT__
4541d72bce8STim Tautges #define __FUNCT__ "DMMoabCreateVector"
455aa768e4cSTim Tautges /*@
456aa768e4cSTim Tautges   DMMoabCreateVector - Create a Vec from either an existing tag, or a specified tag size, and a range of entities
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges   Collective on MPI_Comm
459aa768e4cSTim Tautges 
460aa768e4cSTim Tautges   Input Parameter:
461aa768e4cSTim Tautges . dm          - The DMMoab object being set
462aa768e4cSTim Tautges . tag         - If non-zero, block size will be taken from the tag size
463aa768e4cSTim Tautges . tag_size    - If tag was zero, this parameter specifies the block size; unique tag name will be generated automatically
464aa768e4cSTim Tautges . range       - If non-empty, Vec corresponds to these entities, otherwise to the entities set on the DMMoab
465aa768e4cSTim Tautges . serial      - If true, this is a serial Vec, otherwise a parallel one
466aa768e4cSTim Tautges . destroy_tag - If true, MOAB tag is destroyed with Vec, otherwise it is left on MOAB
467aa768e4cSTim Tautges 
468aa768e4cSTim Tautges   Output Parameter:
469aa768e4cSTim Tautges . vec         - The created vector
470aa768e4cSTim Tautges 
471aa768e4cSTim Tautges   Level: beginner
472aa768e4cSTim Tautges 
473aa768e4cSTim Tautges .keywords: DMMoab, create
474aa768e4cSTim Tautges @*/
475a4d2169cSTim Tautges PetscErrorCode DMMoabCreateVector(DM dm,moab::Tag tag,PetscInt tag_size,moab::Range range,PetscBool serial, PetscBool destroy_tag,Vec *vec)
4761d72bce8STim Tautges {
4771d72bce8STim Tautges   PetscErrorCode     ierr;
478a4d2169cSTim Tautges 
4791d72bce8STim Tautges   PetscFunctionBegin;
480a4d2169cSTim Tautges 
4811d72bce8STim Tautges   DM_Moab *dmmoab = (DM_Moab*)dm->data;
482a4d2169cSTim Tautges   moab::ParallelComm *pcomm = dmmoab->pcomm;
483a4d2169cSTim Tautges   moab::Interface *mbiface = dmmoab->mbiface;
484a4d2169cSTim Tautges   moab::Tag ltog_tag = dmmoab->ltog_tag;
485a4d2169cSTim Tautges 
486a4d2169cSTim Tautges   if (!tag && !tag_size) {
487a4d2169cSTim Tautges     PetscFunctionReturn(PETSC_ERR_ARG_WRONG);
488a4d2169cSTim Tautges   }
4897d89fc02STim Tautges   else {
490a4d2169cSTim Tautges     ierr = DMMoab_CreateVector(mbiface,pcomm,tag,tag_size,ltog_tag,range,serial,destroy_tag,vec);CHKERRQ(ierr);
491a4d2169cSTim Tautges   }
4921d72bce8STim Tautges   PetscFunctionReturn(0);
4931d72bce8STim Tautges }
4941d72bce8STim Tautges 
4951d72bce8STim Tautges 
4961d72bce8STim Tautges #undef __FUNCT__
497a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_CreateVector"
498a4d2169cSTim 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)
499a4d2169cSTim Tautges {
500a4d2169cSTim Tautges   PetscErrorCode     ierr;
501a4d2169cSTim Tautges   moab::ErrorCode    merr;
502a4d2169cSTim Tautges 
503a4d2169cSTim Tautges   PetscFunctionBegin;
504a4d2169cSTim Tautges 
505a4d2169cSTim Tautges   if (!tag) {
506a4d2169cSTim Tautges     std::string tag_name;
507a4d2169cSTim Tautges     ierr = DMMoab_CreateTagName(pcomm,tag_name);CHKERRQ(ierr);
508a4d2169cSTim Tautges 
509a4d2169cSTim Tautges       // Create the default value for the tag (all zeros):
510a4d2169cSTim Tautges     std::vector<PetscScalar> default_value(tag_size, 0.0);
511a4d2169cSTim Tautges 
512a4d2169cSTim Tautges       // Create the tag:
513a4d2169cSTim Tautges     merr = mbiface->tag_get_handle(tag_name.c_str(),tag_size,moab::MB_TYPE_DOUBLE,tag,
514a4d2169cSTim Tautges                                    moab::MB_TAG_DENSE | moab::MB_TAG_CREAT,default_value.data());MBERRNM(merr);
515a4d2169cSTim Tautges   }
516a4d2169cSTim Tautges   else {
517a4d2169cSTim Tautges 
518a4d2169cSTim Tautges       // Make sure the tag data is of type "double":
519a4d2169cSTim Tautges     moab::DataType tag_type;
520a4d2169cSTim Tautges     merr = mbiface->tag_get_data_type(tag, tag_type);MBERRNM(merr);
521a4d2169cSTim Tautges     if(tag_type != moab::MB_TYPE_DOUBLE) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Tag data type must be MB_TYPE_DOUBLE");
522a4d2169cSTim Tautges   }
523a4d2169cSTim Tautges 
524a4d2169cSTim Tautges     // Create the MOAB internal data object
525a4d2169cSTim Tautges   Vec_MOAB *vmoab;
526a4d2169cSTim Tautges   ierr = PetscMalloc(sizeof(Vec_MOAB),&vmoab);CHKERRQ(ierr);
527a4d2169cSTim Tautges   new (vmoab) Vec_MOAB();
528a4d2169cSTim Tautges   vmoab->tag = tag;
529a4d2169cSTim Tautges   vmoab->ltog_tag = ltog_tag;
530a4d2169cSTim Tautges   vmoab->mbiface = mbiface;
531a4d2169cSTim Tautges   vmoab->pcomm = pcomm;
532a4d2169cSTim Tautges   vmoab->tag_range = range;
533a4d2169cSTim Tautges   vmoab->new_tag = destroy_tag;
534a4d2169cSTim Tautges   vmoab->serial = serial;
535a4d2169cSTim Tautges   merr = mbiface->tag_get_length(tag,vmoab->tag_size);MBERR("tag_get_size", merr);
536a4d2169cSTim Tautges 
537a4d2169cSTim Tautges     // Call tag_iterate. This will cause MOAB to allocate memory for the
538a4d2169cSTim Tautges     // tag data if it hasn't already happened:
539a4d2169cSTim Tautges   int  count;
540a4d2169cSTim Tautges   void *void_ptr;
541a4d2169cSTim Tautges   merr = mbiface->tag_iterate(tag,range.begin(),range.end(),count,void_ptr);MBERRNM(merr);
542a4d2169cSTim Tautges 
543a4d2169cSTim Tautges     // Check to make sure the tag data is in a single sequence:
544a4d2169cSTim Tautges   if ((unsigned)count != range.size()) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can only create MOAB Vector for single sequence");
545a4d2169cSTim Tautges   PetscScalar *data_ptr = (PetscScalar*)void_ptr;
546a4d2169cSTim Tautges 
547a4d2169cSTim Tautges     // Create the PETSc Vector:
548a4d2169cSTim Tautges   if(!serial) {
549a4d2169cSTim Tautges       // This is an MPI Vector:
550a4d2169cSTim Tautges     ierr = VecCreateMPIWithArray(vmoab->pcomm->comm(),vmoab->tag_size,vmoab->tag_size*range.size(),
551f7b72ab5SJed Brown                                  PETSC_DECIDE,data_ptr,vec);CHKERRQ(ierr);
552a4d2169cSTim Tautges 
553a4d2169cSTim Tautges       // Vector created, manually set local to global mapping:
554a4d2169cSTim Tautges     ISLocalToGlobalMapping ltog;
555a4d2169cSTim Tautges     PetscInt               *gindices = new PetscInt[range.size()];
556a4d2169cSTim Tautges     PetscInt               count = 0;
557a4d2169cSTim Tautges     moab::Range::iterator  iter;
558a4d2169cSTim Tautges     for(iter = range.begin(); iter != range.end(); iter++) {
559a4d2169cSTim Tautges       int dof;
560a4d2169cSTim Tautges       merr = mbiface->tag_get_data(ltog_tag,&(*iter),1,&dof);MBERRNM(merr);
561a4d2169cSTim Tautges       gindices[count] = dof;
562a4d2169cSTim Tautges       count++;
563a4d2169cSTim Tautges     }
564a4d2169cSTim Tautges 
565a4d2169cSTim Tautges     ierr = ISLocalToGlobalMappingCreate(PETSC_COMM_SELF,range.size(),gindices,
566a4d2169cSTim Tautges                                         PETSC_COPY_VALUES,&ltog);CHKERRQ(ierr);
567a4d2169cSTim Tautges     ierr = VecSetLocalToGlobalMappingBlock(*vec,ltog);CHKERRQ(ierr);
568a4d2169cSTim Tautges 
569a4d2169cSTim Tautges       // Clean up:
570a4d2169cSTim Tautges     ierr = ISLocalToGlobalMappingDestroy(&ltog);CHKERRQ(ierr);
571a4d2169cSTim Tautges     delete [] gindices;
572a4d2169cSTim Tautges   } else {
573a4d2169cSTim Tautges       // This is a serial vector:
574f7b72ab5SJed Brown     ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,vmoab->tag_size,vmoab->tag_size*range.size(),data_ptr,vec);CHKERRQ(ierr);
575a4d2169cSTim Tautges   }
576a4d2169cSTim Tautges 
577a4d2169cSTim Tautges 
578a4d2169cSTim Tautges   PetscContainer moabdata;
579a4d2169cSTim Tautges   ierr = PetscContainerCreate(PETSC_COMM_SELF,&moabdata);CHKERRQ(ierr);
580a4d2169cSTim Tautges   ierr = PetscContainerSetPointer(moabdata,vmoab);CHKERRQ(ierr);
581a4d2169cSTim Tautges   ierr = PetscContainerSetUserDestroy(moabdata,DMMoab_VecUserDestroy);CHKERRQ(ierr);
582a4d2169cSTim Tautges   ierr = PetscObjectCompose((PetscObject)*vec,"MOABData",(PetscObject)moabdata);CHKERRQ(ierr);
583a4d2169cSTim Tautges   (*vec)->ops->duplicate = DMMoab_VecDuplicate;
584a4d2169cSTim Tautges 
585a4d2169cSTim Tautges   ierr = PetscContainerDestroy(&moabdata);CHKERRQ(ierr);
586a4d2169cSTim Tautges   PetscFunctionReturn(0);
587a4d2169cSTim Tautges }
588a4d2169cSTim Tautges 
589a4d2169cSTim Tautges #undef __FUNCT__
5901d72bce8STim Tautges #define __FUNCT__ "DMMoabGetVecTag"
591aa768e4cSTim Tautges /*@
592aa768e4cSTim Tautges   DMMoabGetVecTag - Get the MOAB tag associated with this Vec
593aa768e4cSTim Tautges 
594aa768e4cSTim Tautges   Collective on MPI_Comm
595aa768e4cSTim Tautges 
596aa768e4cSTim Tautges   Input Parameter:
597aa768e4cSTim Tautges . vec - Vec being queried
598aa768e4cSTim Tautges 
599aa768e4cSTim Tautges   Output Parameter:
600aa768e4cSTim Tautges . tag - Tag associated with this Vec
601aa768e4cSTim Tautges 
602aa768e4cSTim Tautges   Level: beginner
603aa768e4cSTim Tautges 
604aa768e4cSTim Tautges .keywords: DMMoab, create
605aa768e4cSTim Tautges @*/
6061d72bce8STim Tautges PetscErrorCode DMMoabGetVecTag(Vec vec,moab::Tag *tag)
6071d72bce8STim Tautges {
608a4d2169cSTim Tautges   PetscContainer  moabdata;
609a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
6101d72bce8STim Tautges   PetscErrorCode  ierr;
611a4d2169cSTim Tautges 
6121d72bce8STim Tautges   PetscFunctionBegin;
613a4d2169cSTim Tautges 
614a4d2169cSTim Tautges   // Get the MOAB private data:
615a4d2169cSTim Tautges   ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr);
616a4d2169cSTim Tautges   ierr = PetscContainerGetPointer(moabdata, (void**) &vmoab);CHKERRQ(ierr);
617a4d2169cSTim Tautges 
618a4d2169cSTim Tautges   *tag = vmoab->tag;
619a4d2169cSTim Tautges 
6201d72bce8STim Tautges   PetscFunctionReturn(0);
6211d72bce8STim Tautges }
6221d72bce8STim Tautges 
6231d72bce8STim Tautges 
6241d72bce8STim Tautges #undef __FUNCT__
6251d72bce8STim Tautges #define __FUNCT__ "DMMoabGetVecRange"
626aa768e4cSTim Tautges /*@
627aa768e4cSTim Tautges   DMMoabGetVecRange - Get the MOAB entities associated with this Vec
628aa768e4cSTim Tautges 
629aa768e4cSTim Tautges   Collective on MPI_Comm
630aa768e4cSTim Tautges 
631aa768e4cSTim Tautges   Input Parameter:
632aa768e4cSTim Tautges . vec   - Vec being queried
633aa768e4cSTim Tautges 
634aa768e4cSTim Tautges   Output Parameter:
635aa768e4cSTim Tautges . range - Entities associated with this Vec
636aa768e4cSTim Tautges 
637aa768e4cSTim Tautges   Level: beginner
638aa768e4cSTim Tautges 
639aa768e4cSTim Tautges .keywords: DMMoab, create
640aa768e4cSTim Tautges @*/
6411d72bce8STim Tautges PetscErrorCode DMMoabGetVecRange(Vec vec,moab::Range *range)
6421d72bce8STim Tautges {
643a4d2169cSTim Tautges   PetscContainer  moabdata;
644a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
6451d72bce8STim Tautges   PetscErrorCode  ierr;
646a4d2169cSTim Tautges 
6471d72bce8STim Tautges   PetscFunctionBegin;
648a4d2169cSTim Tautges 
649a4d2169cSTim Tautges   // Get the MOAB private data:
650a4d2169cSTim Tautges   ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr);
651a4d2169cSTim Tautges   ierr = PetscContainerGetPointer(moabdata, (void**) &vmoab);CHKERRQ(ierr);
652a4d2169cSTim Tautges 
653a4d2169cSTim Tautges   *range = vmoab->tag_range;
654a4d2169cSTim Tautges 
6551d72bce8STim Tautges   PetscFunctionReturn(0);
6561d72bce8STim Tautges }
6571d72bce8STim Tautges 
6581d72bce8STim Tautges 
659a4d2169cSTim Tautges #undef __FUNCT__
660a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_VecDuplicate"
661a4d2169cSTim Tautges PetscErrorCode DMMoab_VecDuplicate(Vec x,Vec *y)
662a4d2169cSTim Tautges {
663a4d2169cSTim Tautges   PetscErrorCode ierr;
664a4d2169cSTim Tautges   PetscFunctionBegin;
665a4d2169cSTim Tautges   PetscValidHeaderSpecific(x,VEC_CLASSID,1);
666a4d2169cSTim Tautges   PetscValidPointer(y,2);
667a4d2169cSTim Tautges 
668a4d2169cSTim Tautges   // Get the Vec_MOAB struct for the original vector:
669a4d2169cSTim Tautges   PetscContainer  moabdata;
670a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
671a4d2169cSTim Tautges   ierr = PetscObjectQuery((PetscObject)x,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr);
672a4d2169cSTim Tautges   ierr = PetscContainerGetPointer(moabdata, (void**)&vmoab);CHKERRQ(ierr);
673a4d2169cSTim Tautges 
6747d89fc02STim 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);
675a4d2169cSTim Tautges   PetscFunctionReturn(0);
676a4d2169cSTim Tautges }
677a4d2169cSTim Tautges 
678a4d2169cSTim Tautges 
679a4d2169cSTim Tautges #undef __FUNCT__
680a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_CreateTagName"
681a4d2169cSTim Tautges /*  DMMoab_CreateTagName
682a4d2169cSTim Tautges  *
683a4d2169cSTim Tautges  *  Creates a unique tag name that will be shared across processes. If
684a4d2169cSTim Tautges  *  pcomm is NULL, then this is a serial vector. A unique tag name
685a4d2169cSTim Tautges  *  will be returned in tag_name in either case.
686a4d2169cSTim Tautges  *
687a4d2169cSTim Tautges  *  The tag names have the format _PETSC_VEC_N where N is some integer.
688a4d2169cSTim Tautges  */
689a4d2169cSTim Tautges PetscErrorCode DMMoab_CreateTagName(const moab::ParallelComm *pcomm,std::string& tag_name)
690a4d2169cSTim Tautges {
691a4d2169cSTim Tautges   moab::ErrorCode mberr;
692a4d2169cSTim Tautges   PetscErrorCode  ierr;
693a4d2169cSTim Tautges 
694a4d2169cSTim Tautges   PetscFunctionBegin;
695a4d2169cSTim Tautges   const std::string PVEC_PREFIX      = "_PETSC_VEC_";
696a4d2169cSTim Tautges   const PetscInt    PVEC_PREFIX_SIZE = PVEC_PREFIX.size();
697a4d2169cSTim Tautges 
698a4d2169cSTim Tautges   // Check to see if there are any PETSc vectors defined:
699a4d2169cSTim Tautges   const moab::Interface  *mbiface = pcomm->get_moab();
700a4d2169cSTim Tautges   std::vector<moab::Tag> tags;
701a4d2169cSTim Tautges   PetscInt               n = 0;
702a4d2169cSTim Tautges   mberr = mbiface->tag_get_tags(tags);MBERRNM(mberr);
703a4d2169cSTim Tautges   for(unsigned i = 0; i < tags.size(); i++) {
704a4d2169cSTim Tautges     std::string s;
705a4d2169cSTim Tautges     mberr = mbiface->tag_get_name(tags[i],s);MBERRNM(mberr);
706a4d2169cSTim Tautges     if(s.find(PVEC_PREFIX) != std::string::npos){
707a4d2169cSTim Tautges       // This tag represents a PETSc vector. Find the vector number:
708a4d2169cSTim Tautges       PetscInt m;
709a4d2169cSTim Tautges       std::istringstream(s.substr(PVEC_PREFIX_SIZE)) >> m;
710a4d2169cSTim Tautges       if(m >= n) n = m+1;
711a4d2169cSTim Tautges     }
712a4d2169cSTim Tautges   }
713a4d2169cSTim Tautges 
714a4d2169cSTim Tautges   // Make sure that n is consistent across all processes:
715a4d2169cSTim Tautges   PetscInt global_n;
716a4d2169cSTim Tautges   MPI_Comm comm = PETSC_COMM_SELF;
717a4d2169cSTim Tautges   if(pcomm) comm = pcomm->comm();
718a4d2169cSTim Tautges   ierr = MPI_Allreduce(&n,&global_n,1,MPI_INT,MPI_MAX,comm);CHKERRQ(ierr);
719a4d2169cSTim Tautges 
720a4d2169cSTim Tautges   // Set the answer and return:
72188face26SJed Brown   std::ostringstream ss;
722a4d2169cSTim Tautges   ss << PVEC_PREFIX << global_n;
723a4d2169cSTim Tautges   tag_name = ss.str();
724a4d2169cSTim Tautges   PetscFunctionReturn(0);
725a4d2169cSTim Tautges }
726a4d2169cSTim Tautges 
727a4d2169cSTim Tautges 
728a4d2169cSTim Tautges #undef __FUNCT__
729a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_VecUserDestroy"
730a4d2169cSTim Tautges PetscErrorCode DMMoab_VecUserDestroy(void *user)
731a4d2169cSTim Tautges {
732a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
733a4d2169cSTim Tautges   PetscErrorCode  ierr;
734a4d2169cSTim Tautges   moab::ErrorCode merr;
735a4d2169cSTim Tautges 
736a4d2169cSTim Tautges   PetscFunctionBegin;
737a4d2169cSTim Tautges   vmoab = (Vec_MOAB*)user;
738*853cdec3SJed Brown   vmoab->tag_range.~Range();
739*853cdec3SJed Brown   if(vmoab->new_tag) {
740a4d2169cSTim Tautges     // Tag created via a call to VecDuplicate, delete the underlying tag in MOAB...
741a4d2169cSTim Tautges     merr = vmoab->mbiface->tag_delete(vmoab->tag);MBERRNM(merr);
742a4d2169cSTim Tautges   }
743a4d2169cSTim Tautges 
744a4d2169cSTim Tautges   ierr = PetscFree(vmoab);CHKERRQ(ierr);
745a4d2169cSTim Tautges   PetscFunctionReturn(0);
746a4d2169cSTim Tautges }
747a4d2169cSTim Tautges 
748