xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 032b8ab68d4668ecf17e7ef7c62e7a29937bca10)
1*032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.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 
8a4d2169cSTim Tautges 
91d72bce8STim Tautges #undef __FUNCT__
10*032b8ab6SVijay Mahadevan #define __FUNCT__ "DMGlobalToLocalBegin_Moab"
11*032b8ab6SVijay Mahadevan PetscErrorCode  DMGlobalToLocalBegin_Moab(DM dm,Vec g,InsertMode mode,Vec l)
12fd349b41STim Tautges {
13fd349b41STim Tautges   PetscErrorCode    ierr;
14fd349b41STim Tautges   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
15fd349b41STim Tautges 
16fd349b41STim Tautges   PetscFunctionBegin;
17*032b8ab6SVijay Mahadevan   ierr = VecScatterBegin(dmmoab->ltog_sendrecv,g,l,mode,SCATTER_FORWARD/*SCATTER_FORWARD*/);CHKERRQ(ierr);
18fd349b41STim Tautges   PetscFunctionReturn(0);
19fd349b41STim Tautges }
20fd349b41STim Tautges 
21fd349b41STim Tautges 
22fd349b41STim Tautges #undef __FUNCT__
23*032b8ab6SVijay Mahadevan #define __FUNCT__ "DMGlobalToLocalEnd_Moab"
24*032b8ab6SVijay Mahadevan PetscErrorCode  DMGlobalToLocalEnd_Moab(DM dm,Vec g,InsertMode mode,Vec l)
25fd349b41STim Tautges {
26fd349b41STim Tautges   PetscErrorCode    ierr;
27fd349b41STim Tautges   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
28fd349b41STim Tautges 
29fd349b41STim Tautges   PetscFunctionBegin;
30*032b8ab6SVijay Mahadevan   ierr = VecScatterEnd(dmmoab->ltog_sendrecv,g,l,mode,SCATTER_FORWARD/*SCATTER_FORWARD*/);CHKERRQ(ierr);
31fd349b41STim Tautges   PetscFunctionReturn(0);
32fd349b41STim Tautges }
33fd349b41STim Tautges 
34*032b8ab6SVijay Mahadevan 
35*032b8ab6SVijay Mahadevan #undef __FUNCT__
36*032b8ab6SVijay Mahadevan #define __FUNCT__ "DMLocalToGlobalBegin_Moab"
37*032b8ab6SVijay Mahadevan PetscErrorCode  DMLocalToGlobalBegin_Moab(DM dm,Vec l,InsertMode mode,Vec g)
38*032b8ab6SVijay Mahadevan {
39*032b8ab6SVijay Mahadevan   PetscErrorCode    ierr;
40*032b8ab6SVijay Mahadevan   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
41*032b8ab6SVijay Mahadevan 
42*032b8ab6SVijay Mahadevan   PetscFunctionBegin;
43*032b8ab6SVijay Mahadevan //  PetscPrintf(PETSC_COMM_WORLD,"\n Inside local-global begin. Printing global and local vecs.\n");
44*032b8ab6SVijay Mahadevan //  ierr = VecView(g, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
45*032b8ab6SVijay Mahadevan //  ierr = VecView(l, PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);
46*032b8ab6SVijay Mahadevan   ierr = VecScatterBegin(dmmoab->ltog_sendrecv,l,g,mode,SCATTER_REVERSE);CHKERRQ(ierr);
47*032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
48*032b8ab6SVijay Mahadevan }
49*032b8ab6SVijay Mahadevan 
50*032b8ab6SVijay Mahadevan 
51*032b8ab6SVijay Mahadevan #undef __FUNCT__
52*032b8ab6SVijay Mahadevan #define __FUNCT__ "DMLocalToGlobalEnd_Moab"
53*032b8ab6SVijay Mahadevan PetscErrorCode  DMLocalToGlobalEnd_Moab(DM dm,Vec l,InsertMode mode,Vec g)
54*032b8ab6SVijay Mahadevan {
55*032b8ab6SVijay Mahadevan   PetscErrorCode    ierr;
56*032b8ab6SVijay Mahadevan   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
57*032b8ab6SVijay Mahadevan 
58*032b8ab6SVijay Mahadevan   PetscFunctionBegin;
59*032b8ab6SVijay Mahadevan   ierr = VecScatterEnd(dmmoab->ltog_sendrecv,l,g,mode,SCATTER_REVERSE);CHKERRQ(ierr);
60*032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
61*032b8ab6SVijay Mahadevan }
62*032b8ab6SVijay Mahadevan 
63*032b8ab6SVijay Mahadevan 
64853cdec3SJed Brown #undef __FUNCT__
65853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab"
66853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm)
67853cdec3SJed Brown {
68853cdec3SJed Brown   PetscErrorCode ierr;
69*032b8ab6SVijay Mahadevan   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
70853cdec3SJed Brown 
71853cdec3SJed Brown   PetscFunctionBegin;
72853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
73*032b8ab6SVijay Mahadevan   if (dmmoab->icreatedinstance) {
74*032b8ab6SVijay Mahadevan     delete dmmoab->mbiface;
75853cdec3SJed Brown   }
76*032b8ab6SVijay Mahadevan   dmmoab->mbiface = NULL;
77*032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
78*032b8ab6SVijay Mahadevan   delete dmmoab->vlocal;
79*032b8ab6SVijay Mahadevan   delete dmmoab->vowned;
80*032b8ab6SVijay Mahadevan   delete dmmoab->vghost;
81*032b8ab6SVijay Mahadevan   delete dmmoab->elocal;
82*032b8ab6SVijay Mahadevan   delete dmmoab->eghost;
83*032b8ab6SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
84*032b8ab6SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
85853cdec3SJed Brown   ierr = PetscFree(dm->data);CHKERRQ(ierr);
86853cdec3SJed Brown   PetscFunctionReturn(0);
87853cdec3SJed Brown }
88853cdec3SJed Brown 
89aa768e4cSTim Tautges #undef __FUNCT__
90*032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
91*032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm)
92*032b8ab6SVijay Mahadevan {
93*032b8ab6SVijay Mahadevan   PetscErrorCode          ierr;
94*032b8ab6SVijay Mahadevan   moab::ErrorCode         merr;
95*032b8ab6SVijay Mahadevan   Vec                     local, global;
96*032b8ab6SVijay Mahadevan   IS                      from;
97*032b8ab6SVijay Mahadevan   moab::Range::iterator   iter;
98*032b8ab6SVijay Mahadevan   PetscInt                bs, *gsindices;
99*032b8ab6SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
100*032b8ab6SVijay Mahadevan   PetscInt                count,dof,totsize;
101*032b8ab6SVijay Mahadevan 
102*032b8ab6SVijay Mahadevan   PetscFunctionBegin;
103*032b8ab6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
104*032b8ab6SVijay Mahadevan   /* Get the local and shared vertices and cache it */
105*032b8ab6SVijay Mahadevan   if (dmmoab->mbiface == PETSC_NULL || dmmoab->pcomm == PETSC_NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp.");
106*032b8ab6SVijay Mahadevan 
107*032b8ab6SVijay Mahadevan   /* store the current mesh dimension */
108*032b8ab6SVijay Mahadevan   merr = dmmoab->mbiface->get_dimension(dmmoab->dim);MBERRNM(merr);
109*032b8ab6SVijay Mahadevan 
110*032b8ab6SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh */
111*032b8ab6SVijay Mahadevan   if (dmmoab->vlocal->empty()) {
112*032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(0,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
113*032b8ab6SVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
114*032b8ab6SVijay Mahadevan 
115*032b8ab6SVijay Mahadevan     /* filter based on parallel status */
116*032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
117*032b8ab6SVijay Mahadevan     *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
118*032b8ab6SVijay Mahadevan 
119*032b8ab6SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
120*032b8ab6SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
121*032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
122*032b8ab6SVijay Mahadevan   }
123*032b8ab6SVijay Mahadevan 
124*032b8ab6SVijay Mahadevan //  PetscPrintf(PETSC_COMM_SELF, "\n Local vertices size = %D and shared vertices = %D", dmmoab->vowned->size(), dmmoab->vghost->size());
125*032b8ab6SVijay Mahadevan //  PetscPrintf(PETSC_COMM_SELF, "\n Global vertices size = %D and local vertices = %D", dmmoab->n, dmmoab->nloc);
126*032b8ab6SVijay Mahadevan 
127*032b8ab6SVijay Mahadevan   /* get the information about the local elements in the mesh */
128*032b8ab6SVijay Mahadevan   {
129*032b8ab6SVijay Mahadevan     dmmoab->elocal->clear();
130*032b8ab6SVijay Mahadevan     dmmoab->eghost->clear();
131*032b8ab6SVijay Mahadevan //    PetscPrintf(PETSC_COMM_SELF, "\n Getting all elements of dimension = %D", dmmoab->dim);
132*032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(0, dmmoab->dim, *dmmoab->elocal, true);CHKERRQ(merr);
133*032b8ab6SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
134*032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
135*032b8ab6SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
136*032b8ab6SVijay Mahadevan 
137*032b8ab6SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
138*032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
139*032b8ab6SVijay Mahadevan //    PetscPrintf(PETSC_COMM_SELF, "\n Global elements = %D and local elements = %D", dmmoab->nele, dmmoab->neleloc);
140*032b8ab6SVijay Mahadevan   }
141*032b8ab6SVijay Mahadevan 
142*032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
143*032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
144*032b8ab6SVijay Mahadevan     // Get the global ID tag. The global ID tag is applied to each
145*032b8ab6SVijay Mahadevan     // vertex. It acts as an global identifier which MOAB uses to
146*032b8ab6SVijay Mahadevan     // assemble the individual pieces of the mesh:
147*032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
148*032b8ab6SVijay Mahadevan   }
149*032b8ab6SVijay Mahadevan 
150*032b8ab6SVijay Mahadevan   {
151*032b8ab6SVijay Mahadevan     count=0;
152*032b8ab6SVijay Mahadevan     totsize=dmmoab->vlocal->size();
153*032b8ab6SVijay Mahadevan     ierr = PetscMalloc(totsize*sizeof(PetscInt), &gsindices);CHKERRQ(ierr);
154*032b8ab6SVijay Mahadevan     /* first get the local indices */
155*032b8ab6SVijay Mahadevan     for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
156*032b8ab6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&(*iter),1,&dof);MBERRNM(merr);
157*032b8ab6SVijay Mahadevan       gsindices[count++] = (dof);
158*032b8ab6SVijay Mahadevan     }
159*032b8ab6SVijay Mahadevan     /* now get the ghosted indices */
160*032b8ab6SVijay Mahadevan     for(iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++) {
161*032b8ab6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&(*iter),1,&dof);MBERRNM(merr);
162*032b8ab6SVijay Mahadevan       gsindices[count++] = (dof);
163*032b8ab6SVijay Mahadevan     }
164*032b8ab6SVijay Mahadevan 
165*032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
166*032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
167*032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
168*032b8ab6SVijay Mahadevan 
169*032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
170*032b8ab6SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,gsindices,PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
171*032b8ab6SVijay Mahadevan //    ierr = ISCreateGeneral(((PetscObject)dm)->comm,totsize*bs,gsindices,PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
172*032b8ab6SVijay Mahadevan 
173*032b8ab6SVijay Mahadevan     PetscInt gsiz, lsiz;
174*032b8ab6SVijay Mahadevan     VecGetLocalSize(global,&gsiz);
175*032b8ab6SVijay Mahadevan     VecGetLocalSize(local,&lsiz);
176*032b8ab6SVijay Mahadevan //    PetscPrintf(PETSC_COMM_SELF, "\n Global vec size = %D and local vec size = %D; Local=%D; Ghosted=%D; Start=%D\n Printing From and To IS \n", gsiz, lsiz, dmmoab->nloc, dmmoab->nghost, gsindices[0]);
177*032b8ab6SVijay Mahadevan //    ISView(from, PETSC_VIEWER_STDOUT_WORLD);
178*032b8ab6SVijay Mahadevan 
179*032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
180*032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
181*032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
182*032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
183*032b8ab6SVijay Mahadevan     ierr = PetscFree(gsindices);CHKERRQ(ierr);
184*032b8ab6SVijay Mahadevan 
185*032b8ab6SVijay Mahadevan     /* create the local to global mapping for all indices */
186*032b8ab6SVijay Mahadevan //    ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->nghost*bs,gsindices,PETSC_OWN_POINTER,&dmmoab->ltog_map);CHKERRQ(ierr);
187*032b8ab6SVijay Mahadevan   }
188*032b8ab6SVijay Mahadevan 
189*032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
190*032b8ab6SVijay Mahadevan }
191*032b8ab6SVijay Mahadevan 
192*032b8ab6SVijay Mahadevan #undef __FUNCT__
193aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
194853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
195aa768e4cSTim Tautges {
196aa768e4cSTim Tautges   PetscErrorCode ierr;
197aa768e4cSTim Tautges 
198aa768e4cSTim Tautges   PetscFunctionBegin;
199aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
200*032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
201*032b8ab6SVijay Mahadevan 
202*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
203*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
204*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
205*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
206*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
207*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
208*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
209*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
210*032b8ab6SVijay Mahadevan 
211*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
212*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
213*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
214*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
215*032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
216aa768e4cSTim Tautges 
21797ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
21897ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
219*032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
220*032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
22197ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
222*032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
223*032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
224*032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
225*032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
226aa768e4cSTim Tautges   PetscFunctionReturn(0);
227aa768e4cSTim Tautges }
228fd349b41STim Tautges 
229fd349b41STim Tautges #undef __FUNCT__
2301d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2311d72bce8STim Tautges /*@
2321d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2331d72bce8STim Tautges 
2341d72bce8STim Tautges   Collective on MPI_Comm
2351d72bce8STim Tautges 
2361d72bce8STim Tautges   Input Parameter:
2371d72bce8STim Tautges . comm - The communicator for the DMMoab object
2381d72bce8STim Tautges 
2391d72bce8STim Tautges   Output Parameter:
240*032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2411d72bce8STim Tautges 
2421d72bce8STim Tautges   Level: beginner
2431d72bce8STim Tautges 
2441d72bce8STim Tautges .keywords: DMMoab, create
2451d72bce8STim Tautges @*/
246*032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
2471d72bce8STim Tautges {
2481d72bce8STim Tautges   PetscErrorCode ierr;
2491d72bce8STim Tautges 
2501d72bce8STim Tautges   PetscFunctionBegin;
251*032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
252*032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
253*032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
2541d72bce8STim Tautges   PetscFunctionReturn(0);
2551d72bce8STim Tautges }
2561d72bce8STim Tautges 
2571d72bce8STim Tautges #undef __FUNCT__
258aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
2591d72bce8STim Tautges /*@
260a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
2611d72bce8STim Tautges 
2621d72bce8STim Tautges   Collective on MPI_Comm
2631d72bce8STim Tautges 
2641d72bce8STim Tautges   Input Parameter:
2651d72bce8STim Tautges . comm - The communicator for the DMMoab object
266*032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
267a4d2169cSTim Tautges          along with the DMMoab
268a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
2691d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
2701d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
2711d72bce8STim Tautges 
2721d72bce8STim Tautges   Output Parameter:
273*032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2741d72bce8STim Tautges 
275*032b8ab6SVijay Mahadevan   Level: intermediate
2761d72bce8STim Tautges 
2771d72bce8STim Tautges .keywords: DMMoab, create
2781d72bce8STim Tautges @*/
279*032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
2801d72bce8STim Tautges {
2811d72bce8STim Tautges   PetscErrorCode ierr;
282*032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
283853cdec3SJed Brown   DM_Moab        *dmmoab;
2841d72bce8STim Tautges 
2851d72bce8STim Tautges   PetscFunctionBegin;
286*032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
287*032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
288*032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
289a4d2169cSTim Tautges 
290a4d2169cSTim Tautges   if (!mbiface) {
291a4d2169cSTim Tautges     mbiface = new moab::Core();
2927d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
2931d72bce8STim Tautges   }
2947d89fc02STim Tautges   else
2957d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
2967d89fc02STim Tautges 
297a4d2169cSTim Tautges   if (!pcomm) {
298*032b8ab6SVijay Mahadevan     moab::EntityHandle rootset,partnset;
2991d72bce8STim Tautges     PetscInt rank, nprocs;
300*032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
301*032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
302*032b8ab6SVijay Mahadevan 
303*032b8ab6SVijay Mahadevan     // Create root sets for each mesh.  Then pass these
304*032b8ab6SVijay Mahadevan     // to the load_file functions to be populated.
305*032b8ab6SVijay Mahadevan     merr = mbiface->create_meshset(moab::MESHSET_SET, rootset);
306*032b8ab6SVijay Mahadevan     MBERR("Creating root set failed", merr);
307*032b8ab6SVijay Mahadevan     merr = mbiface->create_meshset(moab::MESHSET_SET, partnset);
308*032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
309*032b8ab6SVijay Mahadevan 
310*032b8ab6SVijay Mahadevan     // Create the parallel communicator object with the partition handle associated with MOAB
311*032b8ab6SVijay Mahadevan     pcomm = moab::ParallelComm::get_pcomm(mbiface, partnset, &comm);
312*032b8ab6SVijay Mahadevan   }
313*032b8ab6SVijay Mahadevan 
314*032b8ab6SVijay Mahadevan   if (!ltog_tag) {
315*032b8ab6SVijay Mahadevan     merr = mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, *ltog_tag);MBERRNM(merr);
316*032b8ab6SVijay Mahadevan   }
317*032b8ab6SVijay Mahadevan   else {
318*032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
319a4d2169cSTim Tautges   }
320a4d2169cSTim Tautges 
321a4d2169cSTim Tautges     // do the initialization of the DM
322*032b8ab6SVijay Mahadevan   dmmoab->bs       = 1;
323*032b8ab6SVijay Mahadevan   ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
324*032b8ab6SVijay Mahadevan   dmmoab->ltog_tag = *ltog_tag;
325a4d2169cSTim Tautges   if (range) {
326*032b8ab6SVijay Mahadevan     ierr = DMMoabSetRange(*dmb, range);CHKERRQ(ierr);
327a4d2169cSTim Tautges   }
3281d72bce8STim Tautges   PetscFunctionReturn(0);
3291d72bce8STim Tautges }
3301d72bce8STim Tautges 
3311d72bce8STim Tautges #undef __FUNCT__
3321d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
333aa768e4cSTim Tautges /*@
334aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
335aa768e4cSTim Tautges 
336aa768e4cSTim Tautges   Collective on MPI_Comm
337aa768e4cSTim Tautges 
338aa768e4cSTim Tautges   Input Parameter:
339aa768e4cSTim Tautges . dm    - The DMMoab object being set
340aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
341aa768e4cSTim Tautges 
342aa768e4cSTim Tautges   Level: beginner
343aa768e4cSTim Tautges 
344aa768e4cSTim Tautges .keywords: DMMoab, create
345aa768e4cSTim Tautges @*/
3461d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
3471d72bce8STim Tautges {
348*032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
349*032b8ab6SVijay Mahadevan 
3501d72bce8STim Tautges   PetscFunctionBegin;
3511d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
352*032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
353*032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
354*032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3551d72bce8STim Tautges   PetscFunctionReturn(0);
3561d72bce8STim Tautges }
3571d72bce8STim Tautges 
3581d72bce8STim Tautges 
3591d72bce8STim Tautges #undef __FUNCT__
3601d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
361aa768e4cSTim Tautges /*@
362aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
363aa768e4cSTim Tautges 
364aa768e4cSTim Tautges   Collective on MPI_Comm
365aa768e4cSTim Tautges 
366aa768e4cSTim Tautges   Input Parameter:
367aa768e4cSTim Tautges . dm    - The DMMoab object being set
368aa768e4cSTim Tautges 
369aa768e4cSTim Tautges   Output Parameter:
370aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
371aa768e4cSTim Tautges 
372aa768e4cSTim Tautges   Level: beginner
373aa768e4cSTim Tautges 
374aa768e4cSTim Tautges .keywords: DMMoab, create
375aa768e4cSTim Tautges @*/
3761d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
3771d72bce8STim Tautges {
3781d72bce8STim Tautges   PetscFunctionBegin;
3791d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
380*032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
3811d72bce8STim Tautges   PetscFunctionReturn(0);
3821d72bce8STim Tautges }
3831d72bce8STim Tautges 
3841d72bce8STim Tautges 
3851d72bce8STim Tautges #undef __FUNCT__
3861d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
387aa768e4cSTim Tautges /*@
388aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
389aa768e4cSTim Tautges 
390aa768e4cSTim Tautges   Collective on MPI_Comm
391aa768e4cSTim Tautges 
392aa768e4cSTim Tautges   Input Parameter:
393aa768e4cSTim Tautges . dm      - The DMMoab object being set
394aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
395aa768e4cSTim Tautges 
396aa768e4cSTim Tautges   Level: beginner
397aa768e4cSTim Tautges 
398aa768e4cSTim Tautges .keywords: DMMoab, create
399aa768e4cSTim Tautges @*/
400a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4011d72bce8STim Tautges {
402*032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
403*032b8ab6SVijay Mahadevan 
4041d72bce8STim Tautges   PetscFunctionBegin;
4051d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
406*032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
407*032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
408*032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4091d72bce8STim Tautges   PetscFunctionReturn(0);
4101d72bce8STim Tautges }
4111d72bce8STim Tautges 
4121d72bce8STim Tautges 
4131d72bce8STim Tautges #undef __FUNCT__
4141d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
415aa768e4cSTim Tautges /*@
416aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
417aa768e4cSTim Tautges 
418aa768e4cSTim Tautges   Collective on MPI_Comm
419aa768e4cSTim Tautges 
420aa768e4cSTim Tautges   Input Parameter:
421aa768e4cSTim Tautges . dm      - The DMMoab object being set
422aa768e4cSTim Tautges 
423aa768e4cSTim Tautges   Output Parameter:
424aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
425aa768e4cSTim Tautges 
426aa768e4cSTim Tautges   Level: beginner
427aa768e4cSTim Tautges 
428aa768e4cSTim Tautges .keywords: DMMoab, create
429aa768e4cSTim Tautges @*/
430a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4311d72bce8STim Tautges {
4329426e041SSatish Balay   PetscErrorCode   ierr;
433cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
434cabb514dSBarry Smith 
4351d72bce8STim Tautges   PetscFunctionBegin;
4361d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
437cabb514dSBarry Smith   ierr = PetscCitationsRegister("@techreport{tautges_moab:_2004,\n  type = {{SAND2004-1592}},\n  title = {{MOAB:} A Mesh-Oriented Database},  institution = {Sandia National Laboratories},\n  author = {Tautges, T. J. and Meyers, R. and Merkley, K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n",&cite);CHKERRQ(ierr);
438a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
4391d72bce8STim Tautges   PetscFunctionReturn(0);
4401d72bce8STim Tautges }
4411d72bce8STim Tautges 
4421d72bce8STim Tautges 
4431d72bce8STim Tautges #undef __FUNCT__
4441d72bce8STim Tautges #define __FUNCT__ "DMMoabSetRange"
445aa768e4cSTim Tautges /*@
446aa768e4cSTim Tautges   DMMoabSetRange - Set the entities having DOFs on this DMMoab
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges   Collective on MPI_Comm
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges   Input Parameter:
451aa768e4cSTim Tautges . dm    - The DMMoab object being set
452aa768e4cSTim Tautges . range - The entities treated by this DMMoab
453aa768e4cSTim Tautges 
454aa768e4cSTim Tautges   Level: beginner
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges .keywords: DMMoab, create
457aa768e4cSTim Tautges @*/
458*032b8ab6SVijay Mahadevan PetscErrorCode DMMoabSetRange(DM dm,moab::Range *range)
4591d72bce8STim Tautges {
460*032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
461*032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
462*032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
463*032b8ab6SVijay Mahadevan 
4641d72bce8STim Tautges   PetscFunctionBegin;
4651d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
466*032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
467*032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
468*032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
469*032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
470*032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
471*032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
472*032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
473*032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
474*032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4751d72bce8STim Tautges   PetscFunctionReturn(0);
4761d72bce8STim Tautges }
4771d72bce8STim Tautges 
4781d72bce8STim Tautges 
4791d72bce8STim Tautges #undef __FUNCT__
4801d72bce8STim Tautges #define __FUNCT__ "DMMoabGetRange"
481aa768e4cSTim Tautges /*@
482aa768e4cSTim Tautges   DMMoabGetRange - Get the entities having DOFs on this DMMoab
483aa768e4cSTim Tautges 
484aa768e4cSTim Tautges   Collective on MPI_Comm
485aa768e4cSTim Tautges 
486aa768e4cSTim Tautges   Input Parameter:
487aa768e4cSTim Tautges . dm    - The DMMoab object being set
488aa768e4cSTim Tautges 
489aa768e4cSTim Tautges   Output Parameter:
490aa768e4cSTim Tautges . range - The entities treated by this DMMoab
491aa768e4cSTim Tautges 
492aa768e4cSTim Tautges   Level: beginner
493aa768e4cSTim Tautges 
494aa768e4cSTim Tautges .keywords: DMMoab, create
495aa768e4cSTim Tautges @*/
496*032b8ab6SVijay Mahadevan PetscErrorCode DMMoabGetRange(DM dm,moab::Range **range)
4971d72bce8STim Tautges {
4981d72bce8STim Tautges   PetscFunctionBegin;
4991d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
500*032b8ab6SVijay Mahadevan   *range = ((DM_Moab*)dm->data)->vowned;
5011d72bce8STim Tautges   PetscFunctionReturn(0);
5021d72bce8STim Tautges }
5031d72bce8STim Tautges 
5041d72bce8STim Tautges #undef __FUNCT__
5051d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
506aa768e4cSTim Tautges /*@
507aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
508aa768e4cSTim Tautges 
509aa768e4cSTim Tautges   Collective on MPI_Comm
510aa768e4cSTim Tautges 
511aa768e4cSTim Tautges   Input Parameter:
512aa768e4cSTim Tautges . dm      - The DMMoab object being set
513aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
514aa768e4cSTim Tautges 
515aa768e4cSTim Tautges   Level: beginner
516aa768e4cSTim Tautges 
517aa768e4cSTim Tautges .keywords: DMMoab, create
518aa768e4cSTim Tautges @*/
5191d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
5201d72bce8STim Tautges {
5211d72bce8STim Tautges   PetscFunctionBegin;
5221d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5231d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
5241d72bce8STim Tautges   PetscFunctionReturn(0);
5251d72bce8STim Tautges }
5261d72bce8STim Tautges 
5271d72bce8STim Tautges 
5281d72bce8STim Tautges #undef __FUNCT__
5291d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
530aa768e4cSTim Tautges /*@
531aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
532aa768e4cSTim Tautges 
533aa768e4cSTim Tautges   Collective on MPI_Comm
534aa768e4cSTim Tautges 
535aa768e4cSTim Tautges   Input Parameter:
536aa768e4cSTim Tautges . dm      - The DMMoab object being set
537aa768e4cSTim Tautges 
538aa768e4cSTim Tautges   Output Parameter:
539aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
540aa768e4cSTim Tautges 
541aa768e4cSTim Tautges   Level: beginner
542aa768e4cSTim Tautges 
543aa768e4cSTim Tautges .keywords: DMMoab, create
544aa768e4cSTim Tautges @*/
5451d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
5461d72bce8STim Tautges {
5471d72bce8STim Tautges   PetscFunctionBegin;
5481d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5491d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
5501d72bce8STim Tautges   PetscFunctionReturn(0);
5511d72bce8STim Tautges }
5521d72bce8STim Tautges 
5531d72bce8STim Tautges 
5541d72bce8STim Tautges #undef __FUNCT__
5551d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
556aa768e4cSTim Tautges /*@
557aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
558aa768e4cSTim Tautges 
559aa768e4cSTim Tautges   Collective on MPI_Comm
560aa768e4cSTim Tautges 
561aa768e4cSTim Tautges   Input Parameter:
562aa768e4cSTim Tautges . dm - The DMMoab object being set
563aa768e4cSTim Tautges . bs - The block size used with this DMMoab
564aa768e4cSTim Tautges 
565aa768e4cSTim Tautges   Level: beginner
566aa768e4cSTim Tautges 
567aa768e4cSTim Tautges .keywords: DMMoab, create
568aa768e4cSTim Tautges @*/
5691d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
5701d72bce8STim Tautges {
5711d72bce8STim Tautges   PetscFunctionBegin;
5721d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5731d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
5741d72bce8STim Tautges   PetscFunctionReturn(0);
5751d72bce8STim Tautges }
5761d72bce8STim Tautges 
5771d72bce8STim Tautges 
5781d72bce8STim Tautges #undef __FUNCT__
5791d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
580aa768e4cSTim Tautges /*@
581aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
582aa768e4cSTim Tautges 
583aa768e4cSTim Tautges   Collective on MPI_Comm
584aa768e4cSTim Tautges 
585aa768e4cSTim Tautges   Input Parameter:
586aa768e4cSTim Tautges . dm - The DMMoab object being set
587aa768e4cSTim Tautges 
588aa768e4cSTim Tautges   Output Parameter:
589aa768e4cSTim Tautges . bs - The block size used with this DMMoab
590aa768e4cSTim Tautges 
591aa768e4cSTim Tautges   Level: beginner
592aa768e4cSTim Tautges 
593aa768e4cSTim Tautges .keywords: DMMoab, create
594aa768e4cSTim Tautges @*/
5951d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
5961d72bce8STim Tautges {
5971d72bce8STim Tautges   PetscFunctionBegin;
5981d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5991d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
6001d72bce8STim Tautges   PetscFunctionReturn(0);
6011d72bce8STim Tautges }
6021d72bce8STim Tautges 
603