xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision 8cbae1a6863352a3367a16c5066e48972aa35a03)
1*8cbae1a6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdm.h"   I*/
2*8cbae1a6SVijay Mahadevan 
3*8cbae1a6SVijay Mahadevan #include <petscdmmoab.h>
4*8cbae1a6SVijay Mahadevan 
5*8cbae1a6SVijay Mahadevan #undef __FUNCT__
6*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
7*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
8*8cbae1a6SVijay Mahadevan {
9*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
10*8cbae1a6SVijay Mahadevan   moab::Tag     vtag,ntag;
11*8cbae1a6SVijay Mahadevan   const PetscScalar *varray;
12*8cbae1a6SVijay Mahadevan   PetscScalar *farray;
13*8cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
14*8cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
15*8cbae1a6SVijay Mahadevan   std::string tag_name;
16*8cbae1a6SVijay Mahadevan 
17*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
18*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
19*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
20*8cbae1a6SVijay Mahadevan 
21*8cbae1a6SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
22*8cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
23*8cbae1a6SVijay Mahadevan                                           moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
24*8cbae1a6SVijay Mahadevan 
25*8cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
26*8cbae1a6SVijay Mahadevan 
27*8cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
28*8cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
29*8cbae1a6SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
30*8cbae1a6SVijay Mahadevan     /* use the entity handle and the Dof index to set the right value */
31*8cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr);
32*8cbae1a6SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
33*8cbae1a6SVijay Mahadevan   }
34*8cbae1a6SVijay Mahadevan   else {
35*8cbae1a6SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
36*8cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
37*8cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr);
38*8cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
39*8cbae1a6SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
40*8cbae1a6SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
41*8cbae1a6SVijay Mahadevan   }
42*8cbae1a6SVijay Mahadevan   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);MBERRNM(merr);
43*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
44*8cbae1a6SVijay Mahadevan }
45*8cbae1a6SVijay Mahadevan 
46*8cbae1a6SVijay Mahadevan 
47*8cbae1a6SVijay Mahadevan #undef __FUNCT__
48*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector"
49*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
50*8cbae1a6SVijay Mahadevan {
51*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
52*8cbae1a6SVijay Mahadevan   moab::Tag     vtag,ntag;
53*8cbae1a6SVijay Mahadevan   const PetscScalar   *varray;
54*8cbae1a6SVijay Mahadevan   PetscScalar   *farray;
55*8cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
56*8cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
57*8cbae1a6SVijay Mahadevan   PetscInt i,ifield;
58*8cbae1a6SVijay Mahadevan   std::string tag_name;
59*8cbae1a6SVijay Mahadevan   moab::Range::iterator iter;
60*8cbae1a6SVijay Mahadevan 
61*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
62*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
63*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
64*8cbae1a6SVijay Mahadevan 
65*8cbae1a6SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
66*8cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
67*8cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
68*8cbae1a6SVijay Mahadevan   ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
69*8cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
70*8cbae1a6SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
71*8cbae1a6SVijay Mahadevan 
72*8cbae1a6SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
73*8cbae1a6SVijay Mahadevan     for (ifield=0; ifield<dmmoab->nfields; ++ifield) {
74*8cbae1a6SVijay Mahadevan 
75*8cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
76*8cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
77*8cbae1a6SVijay Mahadevan                                             moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
78*8cbae1a6SVijay Mahadevan 
79*8cbae1a6SVijay Mahadevan       for(i=0;i<dmmoab->nloc;i++) {
80*8cbae1a6SVijay Mahadevan         if (dmmoab->bs == 1)
81*8cbae1a6SVijay Mahadevan           farray[i]=varray[ifield*dmmoab->nloc+i];
82*8cbae1a6SVijay Mahadevan         else
83*8cbae1a6SVijay Mahadevan           farray[i]=varray[i*dmmoab->nfields+ifield];
84*8cbae1a6SVijay Mahadevan       }
85*8cbae1a6SVijay Mahadevan 
86*8cbae1a6SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
87*8cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
88*8cbae1a6SVijay Mahadevan     }
89*8cbae1a6SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
90*8cbae1a6SVijay Mahadevan   }
91*8cbae1a6SVijay Mahadevan   else {
92*8cbae1a6SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
93*8cbae1a6SVijay Mahadevan 
94*8cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
95*8cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
96*8cbae1a6SVijay Mahadevan     for (ifield=0; ifield<dmmoab->nfields; ++ifield) {
97*8cbae1a6SVijay Mahadevan 
98*8cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
99*8cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
100*8cbae1a6SVijay Mahadevan                                             moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
101*8cbae1a6SVijay Mahadevan 
102*8cbae1a6SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
103*8cbae1a6SVijay Mahadevan       for(i=0; i < dmmoab->nloc; i++) {
104*8cbae1a6SVijay Mahadevan         farray[i] = varray[i*dmmoab->bs+ifield];
105*8cbae1a6SVijay Mahadevan       }
106*8cbae1a6SVijay Mahadevan 
107*8cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
108*8cbae1a6SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
109*8cbae1a6SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
110*8cbae1a6SVijay Mahadevan     }
111*8cbae1a6SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
112*8cbae1a6SVijay Mahadevan   }
113*8cbae1a6SVijay Mahadevan   ierr = PetscFree(farray);CHKERRQ(ierr);
114*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
115*8cbae1a6SVijay Mahadevan }
116*8cbae1a6SVijay Mahadevan 
117*8cbae1a6SVijay Mahadevan 
118*8cbae1a6SVijay Mahadevan #undef __FUNCT__
119*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields"
120*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields)
121*8cbae1a6SVijay Mahadevan {
122*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
123*8cbae1a6SVijay Mahadevan 
124*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
125*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
126*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
127*8cbae1a6SVijay Mahadevan 
128*8cbae1a6SVijay Mahadevan   dmmoab->fields = fields;
129*8cbae1a6SVijay Mahadevan   dmmoab->nfields = nfields;
130*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
131*8cbae1a6SVijay Mahadevan }
132*8cbae1a6SVijay Mahadevan 
133*8cbae1a6SVijay Mahadevan 
134*8cbae1a6SVijay Mahadevan #undef __FUNCT__
135*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
136*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
137*8cbae1a6SVijay Mahadevan {
138*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
139*8cbae1a6SVijay Mahadevan 
140*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
141*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
142*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
143*8cbae1a6SVijay Mahadevan 
144*8cbae1a6SVijay Mahadevan   *dof=dmmoab->gidmap[(PetscInt)point];
145*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
146*8cbae1a6SVijay Mahadevan }
147*8cbae1a6SVijay Mahadevan 
148*8cbae1a6SVijay Mahadevan 
149*8cbae1a6SVijay Mahadevan #undef __FUNCT__
150*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
151*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
152*8cbae1a6SVijay Mahadevan {
153*8cbae1a6SVijay Mahadevan   PetscInt        i;
154*8cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
155*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
156*8cbae1a6SVijay Mahadevan 
157*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
158*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
159*8cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
160*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
161*8cbae1a6SVijay Mahadevan 
162*8cbae1a6SVijay Mahadevan   if (!dof) {
163*8cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
164*8cbae1a6SVijay Mahadevan   }
165*8cbae1a6SVijay Mahadevan 
166*8cbae1a6SVijay Mahadevan   /* first get the local indices */
167*8cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
168*8cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
169*8cbae1a6SVijay Mahadevan       dof[i] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->nfields+field;
170*8cbae1a6SVijay Mahadevan   }
171*8cbae1a6SVijay Mahadevan   else {
172*8cbae1a6SVijay Mahadevan     /* assume all fields have equal distribution */
173*8cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
174*8cbae1a6SVijay Mahadevan       dof[i] = dmmoab->gidmap[(PetscInt)points[i]]+field*dmmoab->n;
175*8cbae1a6SVijay Mahadevan   }
176*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
177*8cbae1a6SVijay Mahadevan }
178*8cbae1a6SVijay Mahadevan 
179*8cbae1a6SVijay Mahadevan 
180*8cbae1a6SVijay Mahadevan #undef __FUNCT__
181*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal"
182*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
183*8cbae1a6SVijay Mahadevan {
184*8cbae1a6SVijay Mahadevan   PetscInt i,offset;
185*8cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
186*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
187*8cbae1a6SVijay Mahadevan 
188*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
189*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
190*8cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
191*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
192*8cbae1a6SVijay Mahadevan 
193*8cbae1a6SVijay Mahadevan   if (!dof) {
194*8cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
195*8cbae1a6SVijay Mahadevan   }
196*8cbae1a6SVijay Mahadevan 
197*8cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
198*8cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
199*8cbae1a6SVijay Mahadevan       dof[i] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->nfields+field;
200*8cbae1a6SVijay Mahadevan   }
201*8cbae1a6SVijay Mahadevan   else {
202*8cbae1a6SVijay Mahadevan     offset = field*dmmoab->n; /* assume all fields have equal distribution */
203*8cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
204*8cbae1a6SVijay Mahadevan       dof[i] = dmmoab->lidmap[(PetscInt)points[i]]+offset;
205*8cbae1a6SVijay Mahadevan   }
206*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
207*8cbae1a6SVijay Mahadevan }
208*8cbae1a6SVijay Mahadevan 
209*8cbae1a6SVijay Mahadevan 
210*8cbae1a6SVijay Mahadevan #undef __FUNCT__
211*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs"
212*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
213*8cbae1a6SVijay Mahadevan {
214*8cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
215*8cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
216*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
217*8cbae1a6SVijay Mahadevan 
218*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
219*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
220*8cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
221*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
222*8cbae1a6SVijay Mahadevan 
223*8cbae1a6SVijay Mahadevan   if (!dof) {
224*8cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr);
225*8cbae1a6SVijay Mahadevan   }
226*8cbae1a6SVijay Mahadevan 
227*8cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
228*8cbae1a6SVijay Mahadevan     for (field=0; field<dmmoab->nfields; ++field) {
229*8cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
230*8cbae1a6SVijay Mahadevan         dof[i*dmmoab->nfields+field] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->nfields+field;
231*8cbae1a6SVijay Mahadevan     }
232*8cbae1a6SVijay Mahadevan   }
233*8cbae1a6SVijay Mahadevan   else {
234*8cbae1a6SVijay Mahadevan     for (field=0; field<dmmoab->nfields; ++field) {
235*8cbae1a6SVijay Mahadevan       offset = field*dmmoab->n; /* assume all fields have equal distribution */
236*8cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
237*8cbae1a6SVijay Mahadevan         dof[i*dmmoab->nfields+field] = dmmoab->gidmap[(PetscInt)points[i]]+offset;
238*8cbae1a6SVijay Mahadevan     }
239*8cbae1a6SVijay Mahadevan   }
240*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
241*8cbae1a6SVijay Mahadevan }
242*8cbae1a6SVijay Mahadevan 
243*8cbae1a6SVijay Mahadevan 
244*8cbae1a6SVijay Mahadevan #undef __FUNCT__
245*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal"
246*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
247*8cbae1a6SVijay Mahadevan {
248*8cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
249*8cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
250*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
251*8cbae1a6SVijay Mahadevan 
252*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
253*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
254*8cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
255*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
256*8cbae1a6SVijay Mahadevan 
257*8cbae1a6SVijay Mahadevan   if (!dof) {
258*8cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr);
259*8cbae1a6SVijay Mahadevan   }
260*8cbae1a6SVijay Mahadevan 
261*8cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
262*8cbae1a6SVijay Mahadevan     for (field=0; field<dmmoab->nfields; ++field) {
263*8cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
264*8cbae1a6SVijay Mahadevan         dof[i*dmmoab->nfields+field] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->nfields+field;
265*8cbae1a6SVijay Mahadevan     }
266*8cbae1a6SVijay Mahadevan   }
267*8cbae1a6SVijay Mahadevan   else {
268*8cbae1a6SVijay Mahadevan     for (field=0; field<dmmoab->nfields; ++field) {
269*8cbae1a6SVijay Mahadevan       offset = field*dmmoab->n; /* assume all fields have equal distribution */
270*8cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
271*8cbae1a6SVijay Mahadevan         dof[i*dmmoab->nfields+field] = dmmoab->lidmap[(PetscInt)points[i]]+offset;
272*8cbae1a6SVijay Mahadevan     }
273*8cbae1a6SVijay Mahadevan   }
274*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
275*8cbae1a6SVijay Mahadevan }
276*8cbae1a6SVijay Mahadevan 
277*8cbae1a6SVijay Mahadevan 
278*8cbae1a6SVijay Mahadevan #undef __FUNCT__
279*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked"
280*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
281*8cbae1a6SVijay Mahadevan {
282*8cbae1a6SVijay Mahadevan   PetscInt        i;
283*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
284*8cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
285*8cbae1a6SVijay Mahadevan 
286*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
287*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
288*8cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
289*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
290*8cbae1a6SVijay Mahadevan 
291*8cbae1a6SVijay Mahadevan   if (!dof) {
292*8cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
293*8cbae1a6SVijay Mahadevan   }
294*8cbae1a6SVijay Mahadevan 
295*8cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i) {
296*8cbae1a6SVijay Mahadevan     dof[i]=dmmoab->gidmap[(PetscInt)points[i]];
297*8cbae1a6SVijay Mahadevan   }
298*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
299*8cbae1a6SVijay Mahadevan }
300*8cbae1a6SVijay Mahadevan 
301*8cbae1a6SVijay Mahadevan 
302*8cbae1a6SVijay Mahadevan #undef __FUNCT__
303*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal"
304*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
305*8cbae1a6SVijay Mahadevan {
306*8cbae1a6SVijay Mahadevan   PetscInt        i;
307*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
308*8cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
309*8cbae1a6SVijay Mahadevan 
310*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
311*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
312*8cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
313*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
314*8cbae1a6SVijay Mahadevan 
315*8cbae1a6SVijay Mahadevan   if (!dof) {
316*8cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
317*8cbae1a6SVijay Mahadevan   }
318*8cbae1a6SVijay Mahadevan 
319*8cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i)
320*8cbae1a6SVijay Mahadevan     dof[i] = dmmoab->lidmap[(PetscInt)points[i]];
321*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
322*8cbae1a6SVijay Mahadevan }
323*8cbae1a6SVijay Mahadevan 
324*8cbae1a6SVijay Mahadevan 
325*8cbae1a6SVijay Mahadevan #undef __FUNCT__
326*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlocked"
327*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof)
328*8cbae1a6SVijay Mahadevan {
329*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
330*8cbae1a6SVijay Mahadevan 
331*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
332*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
333*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
334*8cbae1a6SVijay Mahadevan 
335*8cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
336*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
337*8cbae1a6SVijay Mahadevan }
338*8cbae1a6SVijay Mahadevan 
339*8cbae1a6SVijay Mahadevan 
340*8cbae1a6SVijay Mahadevan #undef __FUNCT__
341*8cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlockedLocal"
342*8cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof)
343*8cbae1a6SVijay Mahadevan {
344*8cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
345*8cbae1a6SVijay Mahadevan 
346*8cbae1a6SVijay Mahadevan   PetscFunctionBegin;
347*8cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
348*8cbae1a6SVijay Mahadevan   PetscValidPointer(dof,2);
349*8cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
350*8cbae1a6SVijay Mahadevan 
351*8cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
352*8cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
353*8cbae1a6SVijay Mahadevan }
354*8cbae1a6SVijay Mahadevan 
355*8cbae1a6SVijay Mahadevan 
356*8cbae1a6SVijay Mahadevan 
357