xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 88face26bf4686de16dc81472137d4512a291026)
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>
5*88face26SJed Brown #include <MBTagConventions.hpp>
6*88face26SJed 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 
62aa768e4cSTim Tautges EXTERN_C_BEGIN
63aa768e4cSTim Tautges #undef __FUNCT__
64aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
65aa768e4cSTim Tautges PetscErrorCode DMCreate_Moab(DM dm)
66aa768e4cSTim Tautges {
67aa768e4cSTim Tautges   DM_Moab        *moab;
68aa768e4cSTim Tautges   PetscErrorCode ierr;
69aa768e4cSTim Tautges 
70aa768e4cSTim Tautges   PetscFunctionBegin;
71aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
72aa768e4cSTim Tautges   ierr     = PetscNewLog(dm, DM_Moab, &moab);CHKERRQ(ierr);
73aa768e4cSTim Tautges   dm->data = moab;
74aa768e4cSTim Tautges 
75aa768e4cSTim Tautges   PetscFunctionReturn(0);
76aa768e4cSTim Tautges }
77aa768e4cSTim Tautges EXTERN_C_END
78aa768e4cSTim Tautges 
79fd349b41STim Tautges #undef __FUNCT__
80fd349b41STim Tautges #define __FUNCT__ "DMDestroy_Moab"
81fd349b41STim Tautges PetscErrorCode DMDestroy_Moab(DM dm)
82fd349b41STim Tautges {
83fd349b41STim Tautges   PetscFunctionBegin;
84fd349b41STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
85fd349b41STim Tautges 
86fd349b41STim Tautges   // Delete the DM_Moab:
87fd349b41STim Tautges   if(dm->data) {
88fd349b41STim Tautges     if (((DM_Moab*)dm->data)->icreatedinstance) {
89a4d2169cSTim Tautges       delete ((DM_Moab*)dm->data)->mbiface;
90a4d2169cSTim Tautges       ((DM_Moab*)dm->data)->mbiface = NULL;
91fd349b41STim Tautges       ((DM_Moab*)dm->data)->pcomm = NULL;
92fd349b41STim Tautges     }
93fd349b41STim Tautges     delete (DM_Moab*)dm->data;
94fd349b41STim Tautges     dm->data = NULL;
95fd349b41STim Tautges   }
96fd349b41STim Tautges   PetscFunctionReturn(0);
97fd349b41STim Tautges }
98fd349b41STim Tautges 
99fd349b41STim Tautges 
100fd349b41STim Tautges #undef __FUNCT__
1011d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
1021d72bce8STim Tautges /*@
1031d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
1041d72bce8STim Tautges 
1051d72bce8STim Tautges   Collective on MPI_Comm
1061d72bce8STim Tautges 
1071d72bce8STim Tautges   Input Parameter:
1081d72bce8STim Tautges . comm - The communicator for the DMMoab object
1091d72bce8STim Tautges 
1101d72bce8STim Tautges   Output Parameter:
1111d72bce8STim Tautges . moab  - The DMMoab object
1121d72bce8STim Tautges 
1131d72bce8STim Tautges   Level: beginner
1141d72bce8STim Tautges 
1151d72bce8STim Tautges .keywords: DMMoab, create
1161d72bce8STim Tautges @*/
1171d72bce8STim Tautges PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *moab)
1181d72bce8STim Tautges {
1191d72bce8STim Tautges   PetscErrorCode ierr;
1201d72bce8STim Tautges 
1211d72bce8STim Tautges   PetscFunctionBegin;
1221d72bce8STim Tautges   PetscValidPointer(moab,2);
1231d72bce8STim Tautges   ierr = DMCreate(comm, moab);CHKERRQ(ierr);
1241d72bce8STim Tautges   ierr = DMSetType(*moab, DMMOAB);CHKERRQ(ierr);
1251d72bce8STim Tautges   PetscFunctionReturn(0);
1261d72bce8STim Tautges }
1271d72bce8STim Tautges 
1281d72bce8STim Tautges #undef __FUNCT__
129aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
1301d72bce8STim Tautges /*@
131a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
1321d72bce8STim Tautges 
1331d72bce8STim Tautges   Collective on MPI_Comm
1341d72bce8STim Tautges 
1351d72bce8STim Tautges   Input Parameter:
1361d72bce8STim Tautges . comm - The communicator for the DMMoab object
137a4d2169cSTim Tautges . moab - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
138a4d2169cSTim Tautges          along with the DMMoab
139a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
1401d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
1411d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
1421d72bce8STim Tautges 
1431d72bce8STim Tautges   Output Parameter:
1441d72bce8STim Tautges . moab  - The DMMoab object
1451d72bce8STim Tautges 
1461d72bce8STim Tautges   Level: beginner
1471d72bce8STim Tautges 
1481d72bce8STim Tautges .keywords: DMMoab, create
1491d72bce8STim Tautges @*/
150a4d2169cSTim Tautges PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag ltog_tag, moab::Range *range, DM *moab)
1511d72bce8STim Tautges {
1521d72bce8STim Tautges   PetscErrorCode ierr;
1531d72bce8STim Tautges 
1541d72bce8STim Tautges   PetscFunctionBegin;
1551d72bce8STim Tautges   PetscValidPointer(moab,2);
1561d72bce8STim Tautges   ierr = DMCreate(comm, moab);CHKERRQ(ierr);
1571d72bce8STim Tautges   ierr = DMSetType(*moab, DMMOAB);CHKERRQ(ierr);
1587d89fc02STim Tautges   DM_Moab *dmmoab = new DM_Moab;
1597d89fc02STim Tautges   (*moab)->data      = dmmoab;
160a4d2169cSTim Tautges 
161a4d2169cSTim Tautges   if (!mbiface) {
162a4d2169cSTim Tautges     mbiface = new moab::Core();
1637d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1641d72bce8STim Tautges   }
1657d89fc02STim Tautges   else
1667d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1677d89fc02STim Tautges 
168a4d2169cSTim Tautges   if (!pcomm) {
1691d72bce8STim Tautges     PetscInt rank, nprocs;
1701d72bce8STim Tautges     MPI_Comm_rank(comm, &rank);
1711d72bce8STim Tautges     MPI_Comm_size(comm, &nprocs);
172a4d2169cSTim Tautges     pcomm = new moab::ParallelComm(mbiface, comm);
173a4d2169cSTim Tautges   }
174a4d2169cSTim Tautges 
175a4d2169cSTim Tautges     // do the initialization of the DM
176a4d2169cSTim Tautges   dmmoab->bs       = 0;
177a4d2169cSTim Tautges   dmmoab->pcomm    = pcomm;
178a4d2169cSTim Tautges   dmmoab->mbiface    = mbiface;
179a4d2169cSTim Tautges   dmmoab->ltog_tag = ltog_tag;
180a4d2169cSTim Tautges 
181a4d2169cSTim Tautges     // initialize various functions
182a4d2169cSTim Tautges   (*moab)->ops->createglobalvector              = DMCreateGlobalVector_Moab;
183a4d2169cSTim Tautges   (*moab)->ops->createlocalvector               = DMCreateLocalVector_Moab;
184a4d2169cSTim Tautges   (*moab)->ops->destroy                         = DMDestroy_Moab;
185a4d2169cSTim Tautges 
186a4d2169cSTim Tautges   ierr = DMMoabSetInterface(*moab, mbiface);CHKERRQ(ierr);
187a4d2169cSTim Tautges   if (!pcomm) pcomm = new moab::ParallelComm(mbiface, comm);
188a4d2169cSTim Tautges   ierr = DMMoabSetParallelComm(*moab, pcomm);CHKERRQ(ierr);
189a4d2169cSTim Tautges   if (!ltog_tag) {
190a4d2169cSTim Tautges     moab::ErrorCode merr = mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, ltog_tag);MBERRNM(merr);
191a4d2169cSTim Tautges   }
192a4d2169cSTim Tautges   if (ltog_tag) {
193a4d2169cSTim Tautges     ierr = DMMoabSetLocalToGlobalTag(*moab, ltog_tag);CHKERRQ(ierr);
194a4d2169cSTim Tautges   }
195a4d2169cSTim Tautges   if (range) {
196a4d2169cSTim Tautges     ierr = DMMoabSetRange(*moab, *range);CHKERRQ(ierr);
197a4d2169cSTim Tautges   }
1981d72bce8STim Tautges   PetscFunctionReturn(0);
1991d72bce8STim Tautges }
2001d72bce8STim Tautges 
2011d72bce8STim Tautges #undef __FUNCT__
2021d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
203aa768e4cSTim Tautges /*@
204aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
205aa768e4cSTim Tautges 
206aa768e4cSTim Tautges   Collective on MPI_Comm
207aa768e4cSTim Tautges 
208aa768e4cSTim Tautges   Input Parameter:
209aa768e4cSTim Tautges . dm    - The DMMoab object being set
210aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
211aa768e4cSTim Tautges 
212aa768e4cSTim Tautges   Level: beginner
213aa768e4cSTim Tautges 
214aa768e4cSTim Tautges .keywords: DMMoab, create
215aa768e4cSTim Tautges @*/
2161d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
2171d72bce8STim Tautges {
2181d72bce8STim Tautges   PetscFunctionBegin;
2191d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2201d72bce8STim Tautges   ((DM_Moab*)dm->data)->pcomm = pcomm;
221a4d2169cSTim Tautges   ((DM_Moab*)dm->data)->mbiface = pcomm->get_moab();
2221d72bce8STim Tautges   PetscFunctionReturn(0);
2231d72bce8STim Tautges }
2241d72bce8STim Tautges 
2251d72bce8STim Tautges 
2261d72bce8STim Tautges #undef __FUNCT__
2271d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
228aa768e4cSTim Tautges /*@
229aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
230aa768e4cSTim Tautges 
231aa768e4cSTim Tautges   Collective on MPI_Comm
232aa768e4cSTim Tautges 
233aa768e4cSTim Tautges   Input Parameter:
234aa768e4cSTim Tautges . dm    - The DMMoab object being set
235aa768e4cSTim Tautges 
236aa768e4cSTim Tautges   Output Parameter:
237aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
238aa768e4cSTim Tautges 
239aa768e4cSTim Tautges   Level: beginner
240aa768e4cSTim Tautges 
241aa768e4cSTim Tautges .keywords: DMMoab, create
242aa768e4cSTim Tautges @*/
2431d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
2441d72bce8STim Tautges {
2451d72bce8STim Tautges   PetscFunctionBegin;
2461d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2471d72bce8STim Tautges   *pcomm = ((DM_Moab*)dm->data)->pcomm;
2481d72bce8STim Tautges   PetscFunctionReturn(0);
2491d72bce8STim Tautges }
2501d72bce8STim Tautges 
2511d72bce8STim Tautges 
2521d72bce8STim Tautges #undef __FUNCT__
2531d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
254aa768e4cSTim Tautges /*@
255aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
256aa768e4cSTim Tautges 
257aa768e4cSTim Tautges   Collective on MPI_Comm
258aa768e4cSTim Tautges 
259aa768e4cSTim Tautges   Input Parameter:
260aa768e4cSTim Tautges . dm      - The DMMoab object being set
261aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
262aa768e4cSTim Tautges 
263aa768e4cSTim Tautges   Level: beginner
264aa768e4cSTim Tautges 
265aa768e4cSTim Tautges .keywords: DMMoab, create
266aa768e4cSTim Tautges @*/
267a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2681d72bce8STim Tautges {
2691d72bce8STim Tautges   PetscFunctionBegin;
2701d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2711d72bce8STim Tautges   ((DM_Moab*)dm->data)->pcomm = NULL;
272a4d2169cSTim Tautges   ((DM_Moab*)dm->data)->mbiface = mbiface;
2731d72bce8STim Tautges   PetscFunctionReturn(0);
2741d72bce8STim Tautges }
2751d72bce8STim Tautges 
2761d72bce8STim Tautges 
2771d72bce8STim Tautges #undef __FUNCT__
2781d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
279aa768e4cSTim Tautges /*@
280aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
281aa768e4cSTim Tautges 
282aa768e4cSTim Tautges   Collective on MPI_Comm
283aa768e4cSTim Tautges 
284aa768e4cSTim Tautges   Input Parameter:
285aa768e4cSTim Tautges . dm      - The DMMoab object being set
286aa768e4cSTim Tautges 
287aa768e4cSTim Tautges   Output Parameter:
288aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
289aa768e4cSTim Tautges 
290aa768e4cSTim Tautges   Level: beginner
291aa768e4cSTim Tautges 
292aa768e4cSTim Tautges .keywords: DMMoab, create
293aa768e4cSTim Tautges @*/
294a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2951d72bce8STim Tautges {
2961d72bce8STim Tautges   PetscFunctionBegin;
2971d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
298a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2991d72bce8STim Tautges   PetscFunctionReturn(0);
3001d72bce8STim Tautges }
3011d72bce8STim Tautges 
3021d72bce8STim Tautges 
3031d72bce8STim Tautges #undef __FUNCT__
3041d72bce8STim Tautges #define __FUNCT__ "DMMoabSetRange"
305aa768e4cSTim Tautges /*@
306aa768e4cSTim Tautges   DMMoabSetRange - Set the entities having DOFs on this DMMoab
307aa768e4cSTim Tautges 
308aa768e4cSTim Tautges   Collective on MPI_Comm
309aa768e4cSTim Tautges 
310aa768e4cSTim Tautges   Input Parameter:
311aa768e4cSTim Tautges . dm    - The DMMoab object being set
312aa768e4cSTim Tautges . range - The entities treated by this DMMoab
313aa768e4cSTim Tautges 
314aa768e4cSTim Tautges   Level: beginner
315aa768e4cSTim Tautges 
316aa768e4cSTim Tautges .keywords: DMMoab, create
317aa768e4cSTim Tautges @*/
3181d72bce8STim Tautges PetscErrorCode DMMoabSetRange(DM dm,moab::Range range)
3191d72bce8STim Tautges {
3201d72bce8STim Tautges   PetscFunctionBegin;
3211d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3221d72bce8STim Tautges   ((DM_Moab*)dm->data)->range = range;
3231d72bce8STim Tautges   PetscFunctionReturn(0);
3241d72bce8STim Tautges }
3251d72bce8STim Tautges 
3261d72bce8STim Tautges 
3271d72bce8STim Tautges #undef __FUNCT__
3281d72bce8STim Tautges #define __FUNCT__ "DMMoabGetRange"
329aa768e4cSTim Tautges /*@
330aa768e4cSTim Tautges   DMMoabGetRange - Get the entities having DOFs on this DMMoab
331aa768e4cSTim Tautges 
332aa768e4cSTim Tautges   Collective on MPI_Comm
333aa768e4cSTim Tautges 
334aa768e4cSTim Tautges   Input Parameter:
335aa768e4cSTim Tautges . dm    - The DMMoab object being set
336aa768e4cSTim Tautges 
337aa768e4cSTim Tautges   Output Parameter:
338aa768e4cSTim Tautges . range - The entities treated by this DMMoab
339aa768e4cSTim Tautges 
340aa768e4cSTim Tautges   Level: beginner
341aa768e4cSTim Tautges 
342aa768e4cSTim Tautges .keywords: DMMoab, create
343aa768e4cSTim Tautges @*/
3441d72bce8STim Tautges PetscErrorCode DMMoabGetRange(DM dm,moab::Range *range)
3451d72bce8STim Tautges {
3461d72bce8STim Tautges   PetscFunctionBegin;
3471d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3481d72bce8STim Tautges   *range = ((DM_Moab*)dm->data)->range;
3491d72bce8STim Tautges   PetscFunctionReturn(0);
3501d72bce8STim Tautges }
3511d72bce8STim Tautges 
3521d72bce8STim Tautges #undef __FUNCT__
3531d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
354aa768e4cSTim Tautges /*@
355aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
356aa768e4cSTim Tautges 
357aa768e4cSTim Tautges   Collective on MPI_Comm
358aa768e4cSTim Tautges 
359aa768e4cSTim Tautges   Input Parameter:
360aa768e4cSTim Tautges . dm      - The DMMoab object being set
361aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
362aa768e4cSTim Tautges 
363aa768e4cSTim Tautges   Level: beginner
364aa768e4cSTim Tautges 
365aa768e4cSTim Tautges .keywords: DMMoab, create
366aa768e4cSTim Tautges @*/
3671d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
3681d72bce8STim Tautges {
3691d72bce8STim Tautges   PetscFunctionBegin;
3701d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3711d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
3721d72bce8STim Tautges   PetscFunctionReturn(0);
3731d72bce8STim Tautges }
3741d72bce8STim Tautges 
3751d72bce8STim Tautges 
3761d72bce8STim Tautges #undef __FUNCT__
3771d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
378aa768e4cSTim Tautges /*@
379aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
380aa768e4cSTim Tautges 
381aa768e4cSTim Tautges   Collective on MPI_Comm
382aa768e4cSTim Tautges 
383aa768e4cSTim Tautges   Input Parameter:
384aa768e4cSTim Tautges . dm      - The DMMoab object being set
385aa768e4cSTim Tautges 
386aa768e4cSTim Tautges   Output Parameter:
387aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
388aa768e4cSTim Tautges 
389aa768e4cSTim Tautges   Level: beginner
390aa768e4cSTim Tautges 
391aa768e4cSTim Tautges .keywords: DMMoab, create
392aa768e4cSTim Tautges @*/
3931d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
3941d72bce8STim Tautges {
3951d72bce8STim Tautges   PetscFunctionBegin;
3961d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3971d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
3981d72bce8STim Tautges   PetscFunctionReturn(0);
3991d72bce8STim Tautges }
4001d72bce8STim Tautges 
4011d72bce8STim Tautges 
4021d72bce8STim Tautges #undef __FUNCT__
4031d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
404aa768e4cSTim Tautges /*@
405aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
406aa768e4cSTim Tautges 
407aa768e4cSTim Tautges   Collective on MPI_Comm
408aa768e4cSTim Tautges 
409aa768e4cSTim Tautges   Input Parameter:
410aa768e4cSTim Tautges . dm - The DMMoab object being set
411aa768e4cSTim Tautges . bs - The block size used with this DMMoab
412aa768e4cSTim Tautges 
413aa768e4cSTim Tautges   Level: beginner
414aa768e4cSTim Tautges 
415aa768e4cSTim Tautges .keywords: DMMoab, create
416aa768e4cSTim Tautges @*/
4171d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4181d72bce8STim Tautges {
4191d72bce8STim Tautges   PetscFunctionBegin;
4201d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4211d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4221d72bce8STim Tautges   PetscFunctionReturn(0);
4231d72bce8STim Tautges }
4241d72bce8STim Tautges 
4251d72bce8STim Tautges 
4261d72bce8STim Tautges #undef __FUNCT__
4271d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
428aa768e4cSTim Tautges /*@
429aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
430aa768e4cSTim Tautges 
431aa768e4cSTim Tautges   Collective on MPI_Comm
432aa768e4cSTim Tautges 
433aa768e4cSTim Tautges   Input Parameter:
434aa768e4cSTim Tautges . dm - The DMMoab object being set
435aa768e4cSTim Tautges 
436aa768e4cSTim Tautges   Output Parameter:
437aa768e4cSTim Tautges . bs - The block size used with this DMMoab
438aa768e4cSTim Tautges 
439aa768e4cSTim Tautges   Level: beginner
440aa768e4cSTim Tautges 
441aa768e4cSTim Tautges .keywords: DMMoab, create
442aa768e4cSTim Tautges @*/
4431d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
4441d72bce8STim Tautges {
4451d72bce8STim Tautges   PetscFunctionBegin;
4461d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4471d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
4481d72bce8STim Tautges   PetscFunctionReturn(0);
4491d72bce8STim Tautges }
4501d72bce8STim Tautges 
4511d72bce8STim Tautges 
452a4d2169cSTim Tautges // declare for use later but before they're defined
453a4d2169cSTim Tautges PetscErrorCode DMMoab_VecUserDestroy(void *user);
454a4d2169cSTim Tautges PetscErrorCode DMMoab_VecDuplicate(Vec x,Vec *y);
455a4d2169cSTim Tautges PetscErrorCode DMMoab_CreateTagName(const moab::ParallelComm *pcomm,std::string& tag_name);
456a4d2169cSTim 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);
4571d72bce8STim Tautges 
4581d72bce8STim Tautges #undef __FUNCT__
4591d72bce8STim Tautges #define __FUNCT__ "DMMoabCreateVector"
460aa768e4cSTim Tautges /*@
461aa768e4cSTim Tautges   DMMoabCreateVector - Create a Vec from either an existing tag, or a specified tag size, and a range of entities
462aa768e4cSTim Tautges 
463aa768e4cSTim Tautges   Collective on MPI_Comm
464aa768e4cSTim Tautges 
465aa768e4cSTim Tautges   Input Parameter:
466aa768e4cSTim Tautges . dm          - The DMMoab object being set
467aa768e4cSTim Tautges . tag         - If non-zero, block size will be taken from the tag size
468aa768e4cSTim Tautges . tag_size    - If tag was zero, this parameter specifies the block size; unique tag name will be generated automatically
469aa768e4cSTim Tautges . range       - If non-empty, Vec corresponds to these entities, otherwise to the entities set on the DMMoab
470aa768e4cSTim Tautges . serial      - If true, this is a serial Vec, otherwise a parallel one
471aa768e4cSTim Tautges . destroy_tag - If true, MOAB tag is destroyed with Vec, otherwise it is left on MOAB
472aa768e4cSTim Tautges 
473aa768e4cSTim Tautges   Output Parameter:
474aa768e4cSTim Tautges . vec         - The created vector
475aa768e4cSTim Tautges 
476aa768e4cSTim Tautges   Level: beginner
477aa768e4cSTim Tautges 
478aa768e4cSTim Tautges .keywords: DMMoab, create
479aa768e4cSTim Tautges @*/
480a4d2169cSTim Tautges PetscErrorCode DMMoabCreateVector(DM dm,moab::Tag tag,PetscInt tag_size,moab::Range range,PetscBool serial, PetscBool destroy_tag,Vec *vec)
4811d72bce8STim Tautges {
4821d72bce8STim Tautges   PetscErrorCode     ierr;
483a4d2169cSTim Tautges 
4841d72bce8STim Tautges   PetscFunctionBegin;
485a4d2169cSTim Tautges 
4861d72bce8STim Tautges   DM_Moab *dmmoab = (DM_Moab*)dm->data;
487a4d2169cSTim Tautges   moab::ParallelComm *pcomm = dmmoab->pcomm;
488a4d2169cSTim Tautges   moab::Interface *mbiface = dmmoab->mbiface;
489a4d2169cSTim Tautges   moab::Tag ltog_tag = dmmoab->ltog_tag;
490a4d2169cSTim Tautges 
491a4d2169cSTim Tautges   if (!tag && !tag_size) {
492a4d2169cSTim Tautges     PetscFunctionReturn(PETSC_ERR_ARG_WRONG);
493a4d2169cSTim Tautges   }
4947d89fc02STim Tautges   else {
495a4d2169cSTim Tautges     ierr = DMMoab_CreateVector(mbiface,pcomm,tag,tag_size,ltog_tag,range,serial,destroy_tag,vec);CHKERRQ(ierr);
496a4d2169cSTim Tautges   }
4971d72bce8STim Tautges   PetscFunctionReturn(0);
4981d72bce8STim Tautges }
4991d72bce8STim Tautges 
5001d72bce8STim Tautges 
5011d72bce8STim Tautges #undef __FUNCT__
502a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_CreateVector"
503a4d2169cSTim 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)
504a4d2169cSTim Tautges {
505a4d2169cSTim Tautges   PetscErrorCode     ierr;
506a4d2169cSTim Tautges   moab::ErrorCode    merr;
507a4d2169cSTim Tautges 
508a4d2169cSTim Tautges   PetscFunctionBegin;
509a4d2169cSTim Tautges 
510a4d2169cSTim Tautges   if (!tag) {
511a4d2169cSTim Tautges     std::string tag_name;
512a4d2169cSTim Tautges     ierr = DMMoab_CreateTagName(pcomm,tag_name);CHKERRQ(ierr);
513a4d2169cSTim Tautges 
514a4d2169cSTim Tautges       // Create the default value for the tag (all zeros):
515a4d2169cSTim Tautges     std::vector<PetscScalar> default_value(tag_size, 0.0);
516a4d2169cSTim Tautges 
517a4d2169cSTim Tautges       // Create the tag:
518a4d2169cSTim Tautges     merr = mbiface->tag_get_handle(tag_name.c_str(),tag_size,moab::MB_TYPE_DOUBLE,tag,
519a4d2169cSTim Tautges                                    moab::MB_TAG_DENSE | moab::MB_TAG_CREAT,default_value.data());MBERRNM(merr);
520a4d2169cSTim Tautges   }
521a4d2169cSTim Tautges   else {
522a4d2169cSTim Tautges 
523a4d2169cSTim Tautges       // Make sure the tag data is of type "double":
524a4d2169cSTim Tautges     moab::DataType tag_type;
525a4d2169cSTim Tautges     merr = mbiface->tag_get_data_type(tag, tag_type);MBERRNM(merr);
526a4d2169cSTim Tautges     if(tag_type != moab::MB_TYPE_DOUBLE) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Tag data type must be MB_TYPE_DOUBLE");
527a4d2169cSTim Tautges   }
528a4d2169cSTim Tautges 
529a4d2169cSTim Tautges     // Create the MOAB internal data object
530a4d2169cSTim Tautges   Vec_MOAB *vmoab;
531a4d2169cSTim Tautges   ierr = PetscMalloc(sizeof(Vec_MOAB),&vmoab);CHKERRQ(ierr);
532a4d2169cSTim Tautges   new (vmoab) Vec_MOAB();
533a4d2169cSTim Tautges   vmoab->tag = tag;
534a4d2169cSTim Tautges   vmoab->ltog_tag = ltog_tag;
535a4d2169cSTim Tautges   vmoab->mbiface = mbiface;
536a4d2169cSTim Tautges   vmoab->pcomm = pcomm;
537a4d2169cSTim Tautges   vmoab->tag_range = range;
538a4d2169cSTim Tautges   vmoab->new_tag = destroy_tag;
539a4d2169cSTim Tautges   vmoab->serial = serial;
540a4d2169cSTim Tautges   merr = mbiface->tag_get_length(tag,vmoab->tag_size);MBERR("tag_get_size", merr);
541a4d2169cSTim Tautges 
542a4d2169cSTim Tautges     // Call tag_iterate. This will cause MOAB to allocate memory for the
543a4d2169cSTim Tautges     // tag data if it hasn't already happened:
544a4d2169cSTim Tautges   int  count;
545a4d2169cSTim Tautges   void *void_ptr;
546a4d2169cSTim Tautges   merr = mbiface->tag_iterate(tag,range.begin(),range.end(),count,void_ptr);MBERRNM(merr);
547a4d2169cSTim Tautges 
548a4d2169cSTim Tautges     // Check to make sure the tag data is in a single sequence:
549a4d2169cSTim Tautges   if ((unsigned)count != range.size()) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can only create MOAB Vector for single sequence");
550a4d2169cSTim Tautges   PetscScalar *data_ptr = (PetscScalar*)void_ptr;
551a4d2169cSTim Tautges 
552a4d2169cSTim Tautges     // Create the PETSc Vector:
553a4d2169cSTim Tautges   if(!serial) {
554a4d2169cSTim Tautges       // This is an MPI Vector:
555a4d2169cSTim Tautges     ierr = VecCreateMPIWithArray(vmoab->pcomm->comm(),vmoab->tag_size,vmoab->tag_size*range.size(),
556f7b72ab5SJed Brown                                  PETSC_DECIDE,data_ptr,vec);CHKERRQ(ierr);
557a4d2169cSTim Tautges 
558a4d2169cSTim Tautges       // Vector created, manually set local to global mapping:
559a4d2169cSTim Tautges     ISLocalToGlobalMapping ltog;
560a4d2169cSTim Tautges     PetscInt               *gindices = new PetscInt[range.size()];
561a4d2169cSTim Tautges     PetscInt               count = 0;
562a4d2169cSTim Tautges     moab::Range::iterator  iter;
563a4d2169cSTim Tautges     for(iter = range.begin(); iter != range.end(); iter++) {
564a4d2169cSTim Tautges       int dof;
565a4d2169cSTim Tautges       merr = mbiface->tag_get_data(ltog_tag,&(*iter),1,&dof);MBERRNM(merr);
566a4d2169cSTim Tautges       gindices[count] = dof;
567a4d2169cSTim Tautges       count++;
568a4d2169cSTim Tautges     }
569a4d2169cSTim Tautges 
570a4d2169cSTim Tautges     ierr = ISLocalToGlobalMappingCreate(PETSC_COMM_SELF,range.size(),gindices,
571a4d2169cSTim Tautges                                         PETSC_COPY_VALUES,&ltog);CHKERRQ(ierr);
572a4d2169cSTim Tautges     ierr = VecSetLocalToGlobalMappingBlock(*vec,ltog);CHKERRQ(ierr);
573a4d2169cSTim Tautges 
574a4d2169cSTim Tautges       // Clean up:
575a4d2169cSTim Tautges     ierr = ISLocalToGlobalMappingDestroy(&ltog);CHKERRQ(ierr);
576a4d2169cSTim Tautges     delete [] gindices;
577a4d2169cSTim Tautges   } else {
578a4d2169cSTim Tautges       // This is a serial vector:
579f7b72ab5SJed Brown     ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,vmoab->tag_size,vmoab->tag_size*range.size(),data_ptr,vec);CHKERRQ(ierr);
580a4d2169cSTim Tautges   }
581a4d2169cSTim Tautges 
582a4d2169cSTim Tautges 
583a4d2169cSTim Tautges   PetscContainer moabdata;
584a4d2169cSTim Tautges   ierr = PetscContainerCreate(PETSC_COMM_SELF,&moabdata);CHKERRQ(ierr);
585a4d2169cSTim Tautges   ierr = PetscContainerSetPointer(moabdata,vmoab);CHKERRQ(ierr);
586a4d2169cSTim Tautges   ierr = PetscContainerSetUserDestroy(moabdata,DMMoab_VecUserDestroy);CHKERRQ(ierr);
587a4d2169cSTim Tautges   ierr = PetscObjectCompose((PetscObject)*vec,"MOABData",(PetscObject)moabdata);CHKERRQ(ierr);
588a4d2169cSTim Tautges   (*vec)->ops->duplicate = DMMoab_VecDuplicate;
589a4d2169cSTim Tautges 
590a4d2169cSTim Tautges   ierr = PetscContainerDestroy(&moabdata);CHKERRQ(ierr);
591a4d2169cSTim Tautges   PetscFunctionReturn(0);
592a4d2169cSTim Tautges }
593a4d2169cSTim Tautges 
594a4d2169cSTim Tautges #undef __FUNCT__
5951d72bce8STim Tautges #define __FUNCT__ "DMMoabGetVecTag"
596aa768e4cSTim Tautges /*@
597aa768e4cSTim Tautges   DMMoabGetVecTag - Get the MOAB tag associated with this Vec
598aa768e4cSTim Tautges 
599aa768e4cSTim Tautges   Collective on MPI_Comm
600aa768e4cSTim Tautges 
601aa768e4cSTim Tautges   Input Parameter:
602aa768e4cSTim Tautges . vec - Vec being queried
603aa768e4cSTim Tautges 
604aa768e4cSTim Tautges   Output Parameter:
605aa768e4cSTim Tautges . tag - Tag associated with this Vec
606aa768e4cSTim Tautges 
607aa768e4cSTim Tautges   Level: beginner
608aa768e4cSTim Tautges 
609aa768e4cSTim Tautges .keywords: DMMoab, create
610aa768e4cSTim Tautges @*/
6111d72bce8STim Tautges PetscErrorCode DMMoabGetVecTag(Vec vec,moab::Tag *tag)
6121d72bce8STim Tautges {
613a4d2169cSTim Tautges   PetscContainer  moabdata;
614a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
6151d72bce8STim Tautges   PetscErrorCode  ierr;
616a4d2169cSTim Tautges 
6171d72bce8STim Tautges   PetscFunctionBegin;
618a4d2169cSTim Tautges 
619a4d2169cSTim Tautges   // Get the MOAB private data:
620a4d2169cSTim Tautges   ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr);
621a4d2169cSTim Tautges   ierr = PetscContainerGetPointer(moabdata, (void**) &vmoab);CHKERRQ(ierr);
622a4d2169cSTim Tautges 
623a4d2169cSTim Tautges   *tag = vmoab->tag;
624a4d2169cSTim Tautges 
6251d72bce8STim Tautges   PetscFunctionReturn(0);
6261d72bce8STim Tautges }
6271d72bce8STim Tautges 
6281d72bce8STim Tautges 
6291d72bce8STim Tautges #undef __FUNCT__
6301d72bce8STim Tautges #define __FUNCT__ "DMMoabGetVecRange"
631aa768e4cSTim Tautges /*@
632aa768e4cSTim Tautges   DMMoabGetVecRange - Get the MOAB entities associated with this Vec
633aa768e4cSTim Tautges 
634aa768e4cSTim Tautges   Collective on MPI_Comm
635aa768e4cSTim Tautges 
636aa768e4cSTim Tautges   Input Parameter:
637aa768e4cSTim Tautges . vec   - Vec being queried
638aa768e4cSTim Tautges 
639aa768e4cSTim Tautges   Output Parameter:
640aa768e4cSTim Tautges . range - Entities associated with this Vec
641aa768e4cSTim Tautges 
642aa768e4cSTim Tautges   Level: beginner
643aa768e4cSTim Tautges 
644aa768e4cSTim Tautges .keywords: DMMoab, create
645aa768e4cSTim Tautges @*/
6461d72bce8STim Tautges PetscErrorCode DMMoabGetVecRange(Vec vec,moab::Range *range)
6471d72bce8STim Tautges {
648a4d2169cSTim Tautges   PetscContainer  moabdata;
649a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
6501d72bce8STim Tautges   PetscErrorCode  ierr;
651a4d2169cSTim Tautges 
6521d72bce8STim Tautges   PetscFunctionBegin;
653a4d2169cSTim Tautges 
654a4d2169cSTim Tautges   // Get the MOAB private data:
655a4d2169cSTim Tautges   ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr);
656a4d2169cSTim Tautges   ierr = PetscContainerGetPointer(moabdata, (void**) &vmoab);CHKERRQ(ierr);
657a4d2169cSTim Tautges 
658a4d2169cSTim Tautges   *range = vmoab->tag_range;
659a4d2169cSTim Tautges 
6601d72bce8STim Tautges   PetscFunctionReturn(0);
6611d72bce8STim Tautges }
6621d72bce8STim Tautges 
6631d72bce8STim Tautges 
664a4d2169cSTim Tautges #undef __FUNCT__
665a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_VecDuplicate"
666a4d2169cSTim Tautges PetscErrorCode DMMoab_VecDuplicate(Vec x,Vec *y)
667a4d2169cSTim Tautges {
668a4d2169cSTim Tautges   PetscErrorCode ierr;
669a4d2169cSTim Tautges   PetscFunctionBegin;
670a4d2169cSTim Tautges   PetscValidHeaderSpecific(x,VEC_CLASSID,1);
671a4d2169cSTim Tautges   PetscValidPointer(y,2);
672a4d2169cSTim Tautges 
673a4d2169cSTim Tautges   // Get the Vec_MOAB struct for the original vector:
674a4d2169cSTim Tautges   PetscContainer  moabdata;
675a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
676a4d2169cSTim Tautges   ierr = PetscObjectQuery((PetscObject)x,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr);
677a4d2169cSTim Tautges   ierr = PetscContainerGetPointer(moabdata, (void**)&vmoab);CHKERRQ(ierr);
678a4d2169cSTim Tautges 
6797d89fc02STim 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);
680a4d2169cSTim Tautges   PetscFunctionReturn(0);
681a4d2169cSTim Tautges }
682a4d2169cSTim Tautges 
683a4d2169cSTim Tautges 
684a4d2169cSTim Tautges #undef __FUNCT__
685a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_CreateTagName"
686a4d2169cSTim Tautges /*  DMMoab_CreateTagName
687a4d2169cSTim Tautges  *
688a4d2169cSTim Tautges  *  Creates a unique tag name that will be shared across processes. If
689a4d2169cSTim Tautges  *  pcomm is NULL, then this is a serial vector. A unique tag name
690a4d2169cSTim Tautges  *  will be returned in tag_name in either case.
691a4d2169cSTim Tautges  *
692a4d2169cSTim Tautges  *  The tag names have the format _PETSC_VEC_N where N is some integer.
693a4d2169cSTim Tautges  */
694a4d2169cSTim Tautges PetscErrorCode DMMoab_CreateTagName(const moab::ParallelComm *pcomm,std::string& tag_name)
695a4d2169cSTim Tautges {
696a4d2169cSTim Tautges   moab::ErrorCode mberr;
697a4d2169cSTim Tautges   PetscErrorCode  ierr;
698a4d2169cSTim Tautges 
699a4d2169cSTim Tautges   PetscFunctionBegin;
700a4d2169cSTim Tautges   const std::string PVEC_PREFIX      = "_PETSC_VEC_";
701a4d2169cSTim Tautges   const PetscInt    PVEC_PREFIX_SIZE = PVEC_PREFIX.size();
702a4d2169cSTim Tautges 
703a4d2169cSTim Tautges   // Check to see if there are any PETSc vectors defined:
704a4d2169cSTim Tautges   const moab::Interface  *mbiface = pcomm->get_moab();
705a4d2169cSTim Tautges   std::vector<moab::Tag> tags;
706a4d2169cSTim Tautges   PetscInt               n = 0;
707a4d2169cSTim Tautges   mberr = mbiface->tag_get_tags(tags);MBERRNM(mberr);
708a4d2169cSTim Tautges   for(unsigned i = 0; i < tags.size(); i++) {
709a4d2169cSTim Tautges     std::string s;
710a4d2169cSTim Tautges     mberr = mbiface->tag_get_name(tags[i],s);MBERRNM(mberr);
711a4d2169cSTim Tautges     if(s.find(PVEC_PREFIX) != std::string::npos){
712a4d2169cSTim Tautges       // This tag represents a PETSc vector. Find the vector number:
713a4d2169cSTim Tautges       PetscInt m;
714a4d2169cSTim Tautges       std::istringstream(s.substr(PVEC_PREFIX_SIZE)) >> m;
715a4d2169cSTim Tautges       if(m >= n) n = m+1;
716a4d2169cSTim Tautges     }
717a4d2169cSTim Tautges   }
718a4d2169cSTim Tautges 
719a4d2169cSTim Tautges   // Make sure that n is consistent across all processes:
720a4d2169cSTim Tautges   PetscInt global_n;
721a4d2169cSTim Tautges   MPI_Comm comm = PETSC_COMM_SELF;
722a4d2169cSTim Tautges   if(pcomm) comm = pcomm->comm();
723a4d2169cSTim Tautges   ierr = MPI_Allreduce(&n,&global_n,1,MPI_INT,MPI_MAX,comm);CHKERRQ(ierr);
724a4d2169cSTim Tautges 
725a4d2169cSTim Tautges   // Set the answer and return:
726*88face26SJed Brown   std::ostringstream ss;
727a4d2169cSTim Tautges   ss << PVEC_PREFIX << global_n;
728a4d2169cSTim Tautges   tag_name = ss.str();
729a4d2169cSTim Tautges   PetscFunctionReturn(0);
730a4d2169cSTim Tautges }
731a4d2169cSTim Tautges 
732a4d2169cSTim Tautges 
733a4d2169cSTim Tautges #undef __FUNCT__
734a4d2169cSTim Tautges #define __FUNCT__ "DMMoab_VecUserDestroy"
735a4d2169cSTim Tautges PetscErrorCode DMMoab_VecUserDestroy(void *user)
736a4d2169cSTim Tautges {
737a4d2169cSTim Tautges   Vec_MOAB        *vmoab;
738a4d2169cSTim Tautges   PetscErrorCode  ierr;
739a4d2169cSTim Tautges   moab::ErrorCode merr;
740a4d2169cSTim Tautges 
741a4d2169cSTim Tautges   PetscFunctionBegin;
742a4d2169cSTim Tautges   vmoab = (Vec_MOAB*)user;
743a4d2169cSTim Tautges   if(vmoab->new_tag == PETSC_TRUE) {
744a4d2169cSTim Tautges     // Tag created via a call to VecDuplicate, delete the underlying tag in MOAB...
745a4d2169cSTim Tautges     merr = vmoab->mbiface->tag_delete(vmoab->tag);MBERRNM(merr);
746a4d2169cSTim Tautges   }
747a4d2169cSTim Tautges 
748a4d2169cSTim Tautges   ierr = PetscFree(vmoab);CHKERRQ(ierr);
749a4d2169cSTim Tautges   PetscFunctionReturn(0);
750a4d2169cSTim Tautges }
751a4d2169cSTim Tautges 
752