xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision addae81c55a48339b26979e5daec8973d7dc1542)
18cbae1a6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdm.h"   I*/
28cbae1a6SVijay Mahadevan 
38cbae1a6SVijay Mahadevan #include <petscdmmoab.h>
48cbae1a6SVijay Mahadevan 
58cbae1a6SVijay Mahadevan #undef __FUNCT__
68cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
78cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
88cbae1a6SVijay Mahadevan {
98cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
108cbae1a6SVijay Mahadevan   moab::Tag     vtag,ntag;
118cbae1a6SVijay Mahadevan   const PetscScalar *varray;
128cbae1a6SVijay Mahadevan   PetscScalar *farray;
138cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
148cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
158cbae1a6SVijay Mahadevan   std::string tag_name;
168cbae1a6SVijay Mahadevan 
178cbae1a6SVijay Mahadevan   PetscFunctionBegin;
188cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
198cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
208cbae1a6SVijay Mahadevan 
21*addae81cSVijay Mahadevan   if ((ifield < 0) || (ifield >= dmmoab->numFields)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "The field %d should be positive and less than %d.", ifield, dmmoab->numFields);
22*addae81cSVijay Mahadevan 
238cbae1a6SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
24*addae81cSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
258cbae1a6SVijay Mahadevan                                           moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
268cbae1a6SVijay Mahadevan 
278cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
288cbae1a6SVijay Mahadevan 
298cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
308cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
318cbae1a6SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
328cbae1a6SVijay Mahadevan     /* use the entity handle and the Dof index to set the right value */
338cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr);
348cbae1a6SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
358cbae1a6SVijay Mahadevan   }
368cbae1a6SVijay Mahadevan   else {
378cbae1a6SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
388cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
398cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr);
408cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
418cbae1a6SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
428cbae1a6SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
438cbae1a6SVijay Mahadevan   }
448cbae1a6SVijay Mahadevan   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);MBERRNM(merr);
458cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
468cbae1a6SVijay Mahadevan }
478cbae1a6SVijay Mahadevan 
488cbae1a6SVijay Mahadevan 
498cbae1a6SVijay Mahadevan #undef __FUNCT__
508cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector"
518cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
528cbae1a6SVijay Mahadevan {
538cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
548cbae1a6SVijay Mahadevan   moab::Tag     vtag,ntag;
558cbae1a6SVijay Mahadevan   const PetscScalar   *varray;
568cbae1a6SVijay Mahadevan   PetscScalar   *farray;
578cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
588cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
598cbae1a6SVijay Mahadevan   PetscInt i,ifield;
608cbae1a6SVijay Mahadevan   std::string tag_name;
618cbae1a6SVijay Mahadevan   moab::Range::iterator iter;
628cbae1a6SVijay Mahadevan 
638cbae1a6SVijay Mahadevan   PetscFunctionBegin;
648cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
658cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
668cbae1a6SVijay Mahadevan 
678cbae1a6SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
688cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
698cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
708cbae1a6SVijay Mahadevan   ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
718cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
728cbae1a6SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
738cbae1a6SVijay Mahadevan 
748cbae1a6SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
75*addae81cSVijay Mahadevan     for (ifield=0; ifield<dmmoab->numFields; ++ifield) {
768cbae1a6SVijay Mahadevan 
778cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
78*addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
798cbae1a6SVijay Mahadevan                                             moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
808cbae1a6SVijay Mahadevan 
818cbae1a6SVijay Mahadevan       for(i=0;i<dmmoab->nloc;i++) {
828cbae1a6SVijay Mahadevan         if (dmmoab->bs == 1)
838cbae1a6SVijay Mahadevan           farray[i]=varray[ifield*dmmoab->nloc+i];
848cbae1a6SVijay Mahadevan         else
85*addae81cSVijay Mahadevan           farray[i]=varray[i*dmmoab->numFields+ifield];
868cbae1a6SVijay Mahadevan       }
878cbae1a6SVijay Mahadevan 
888cbae1a6SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
898cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
908cbae1a6SVijay Mahadevan     }
918cbae1a6SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
928cbae1a6SVijay Mahadevan   }
938cbae1a6SVijay Mahadevan   else {
948cbae1a6SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
958cbae1a6SVijay Mahadevan 
968cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
978cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
98*addae81cSVijay Mahadevan     for (ifield=0; ifield<dmmoab->numFields; ++ifield) {
998cbae1a6SVijay Mahadevan 
1008cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
101*addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
1028cbae1a6SVijay Mahadevan                                             moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
1038cbae1a6SVijay Mahadevan 
1048cbae1a6SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
1058cbae1a6SVijay Mahadevan       for(i=0; i < dmmoab->nloc; i++) {
1068cbae1a6SVijay Mahadevan         farray[i] = varray[i*dmmoab->bs+ifield];
1078cbae1a6SVijay Mahadevan       }
1088cbae1a6SVijay Mahadevan 
1098cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
1108cbae1a6SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
1118cbae1a6SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
1128cbae1a6SVijay Mahadevan     }
1138cbae1a6SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
1148cbae1a6SVijay Mahadevan   }
1158cbae1a6SVijay Mahadevan   ierr = PetscFree(farray);CHKERRQ(ierr);
1168cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1178cbae1a6SVijay Mahadevan }
1188cbae1a6SVijay Mahadevan 
1198cbae1a6SVijay Mahadevan 
1208cbae1a6SVijay Mahadevan #undef __FUNCT__
1218cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields"
122*addae81cSVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt numFields,const char** fields)
1238cbae1a6SVijay Mahadevan {
124*addae81cSVijay Mahadevan   PetscErrorCode ierr;
125*addae81cSVijay Mahadevan   PetscInt       i;
1268cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1278cbae1a6SVijay Mahadevan 
1288cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1298cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1308cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1318cbae1a6SVijay Mahadevan 
132*addae81cSVijay Mahadevan   /* first deallocate the existing field structure */
133*addae81cSVijay Mahadevan   if (dmmoab->fieldNames) {
134*addae81cSVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
135*addae81cSVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
136*addae81cSVijay Mahadevan     }
137*addae81cSVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
138*addae81cSVijay Mahadevan   }
139*addae81cSVijay Mahadevan 
140*addae81cSVijay Mahadevan   /* now re-allocate and assign field names  */
141*addae81cSVijay Mahadevan   dmmoab->numFields = numFields;
142*addae81cSVijay Mahadevan   ierr = PetscMalloc(sizeof(char*)*numFields,&dmmoab->fieldNames);CHKERRQ(ierr);
143*addae81cSVijay Mahadevan   if (fields) {
144*addae81cSVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
145*addae81cSVijay Mahadevan       ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr);
146*addae81cSVijay Mahadevan     }
147*addae81cSVijay Mahadevan   }
1488cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1498cbae1a6SVijay Mahadevan }
1508cbae1a6SVijay Mahadevan 
1518cbae1a6SVijay Mahadevan 
1528cbae1a6SVijay Mahadevan #undef __FUNCT__
1538cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
1548cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
1558cbae1a6SVijay Mahadevan {
1568cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1578cbae1a6SVijay Mahadevan 
1588cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1598cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1608cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1618cbae1a6SVijay Mahadevan 
1628cbae1a6SVijay Mahadevan   *dof=dmmoab->gidmap[(PetscInt)point];
1638cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1648cbae1a6SVijay Mahadevan }
1658cbae1a6SVijay Mahadevan 
1668cbae1a6SVijay Mahadevan 
1678cbae1a6SVijay Mahadevan #undef __FUNCT__
1688cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
1698cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
1708cbae1a6SVijay Mahadevan {
1718cbae1a6SVijay Mahadevan   PetscInt        i;
1728cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
1738cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1748cbae1a6SVijay Mahadevan 
1758cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1768cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1778cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
1788cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1798cbae1a6SVijay Mahadevan 
1808cbae1a6SVijay Mahadevan   if (!dof) {
1818cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
1828cbae1a6SVijay Mahadevan   }
1838cbae1a6SVijay Mahadevan 
1848cbae1a6SVijay Mahadevan   /* first get the local indices */
1858cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
1868cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
187*addae81cSVijay Mahadevan       dof[i] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
1888cbae1a6SVijay Mahadevan   }
1898cbae1a6SVijay Mahadevan   else {
1908cbae1a6SVijay Mahadevan     /* assume all fields have equal distribution */
1918cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
1928cbae1a6SVijay Mahadevan       dof[i] = dmmoab->gidmap[(PetscInt)points[i]]+field*dmmoab->n;
1938cbae1a6SVijay Mahadevan   }
1948cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1958cbae1a6SVijay Mahadevan }
1968cbae1a6SVijay Mahadevan 
1978cbae1a6SVijay Mahadevan 
1988cbae1a6SVijay Mahadevan #undef __FUNCT__
1998cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal"
2008cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
2018cbae1a6SVijay Mahadevan {
2028cbae1a6SVijay Mahadevan   PetscInt i,offset;
2038cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
2048cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2058cbae1a6SVijay Mahadevan 
2068cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2078cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2088cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
2098cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2108cbae1a6SVijay Mahadevan 
2118cbae1a6SVijay Mahadevan   if (!dof) {
2128cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
2138cbae1a6SVijay Mahadevan   }
2148cbae1a6SVijay Mahadevan 
2158cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
2168cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
217*addae81cSVijay Mahadevan       dof[i] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
2188cbae1a6SVijay Mahadevan   }
2198cbae1a6SVijay Mahadevan   else {
2208cbae1a6SVijay Mahadevan     offset = field*dmmoab->n; /* assume all fields have equal distribution */
2218cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
2228cbae1a6SVijay Mahadevan       dof[i] = dmmoab->lidmap[(PetscInt)points[i]]+offset;
2238cbae1a6SVijay Mahadevan   }
2248cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2258cbae1a6SVijay Mahadevan }
2268cbae1a6SVijay Mahadevan 
2278cbae1a6SVijay Mahadevan 
2288cbae1a6SVijay Mahadevan #undef __FUNCT__
2298cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs"
2308cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
2318cbae1a6SVijay Mahadevan {
2328cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
2338cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
2348cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2358cbae1a6SVijay Mahadevan 
2368cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2378cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2388cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
2398cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2408cbae1a6SVijay Mahadevan 
2418cbae1a6SVijay Mahadevan   if (!dof) {
242*addae81cSVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->numFields*npoints, &dof);CHKERRQ(ierr);
2438cbae1a6SVijay Mahadevan   }
2448cbae1a6SVijay Mahadevan 
2458cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
246*addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
2478cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
248*addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
2498cbae1a6SVijay Mahadevan     }
2508cbae1a6SVijay Mahadevan   }
2518cbae1a6SVijay Mahadevan   else {
252*addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
2538cbae1a6SVijay Mahadevan       offset = field*dmmoab->n; /* assume all fields have equal distribution */
2548cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
255*addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]+offset;
2568cbae1a6SVijay Mahadevan     }
2578cbae1a6SVijay Mahadevan   }
2588cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2598cbae1a6SVijay Mahadevan }
2608cbae1a6SVijay Mahadevan 
2618cbae1a6SVijay Mahadevan 
2628cbae1a6SVijay Mahadevan #undef __FUNCT__
2638cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal"
2648cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
2658cbae1a6SVijay Mahadevan {
2668cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
2678cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
2688cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2698cbae1a6SVijay Mahadevan 
2708cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2718cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2728cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
2738cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2748cbae1a6SVijay Mahadevan 
2758cbae1a6SVijay Mahadevan   if (!dof) {
276*addae81cSVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->numFields*npoints, &dof);CHKERRQ(ierr);
2778cbae1a6SVijay Mahadevan   }
2788cbae1a6SVijay Mahadevan 
2798cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
280*addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
2818cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
282*addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
2838cbae1a6SVijay Mahadevan     }
2848cbae1a6SVijay Mahadevan   }
2858cbae1a6SVijay Mahadevan   else {
286*addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
2878cbae1a6SVijay Mahadevan       offset = field*dmmoab->n; /* assume all fields have equal distribution */
2888cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
289*addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]+offset;
2908cbae1a6SVijay Mahadevan     }
2918cbae1a6SVijay Mahadevan   }
2928cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2938cbae1a6SVijay Mahadevan }
2948cbae1a6SVijay Mahadevan 
2958cbae1a6SVijay Mahadevan 
2968cbae1a6SVijay Mahadevan #undef __FUNCT__
2978cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked"
2988cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
2998cbae1a6SVijay Mahadevan {
3008cbae1a6SVijay Mahadevan   PetscInt        i;
3018cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3028cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3038cbae1a6SVijay Mahadevan 
3048cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3058cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3068cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
3078cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3088cbae1a6SVijay Mahadevan 
3098cbae1a6SVijay Mahadevan   if (!dof) {
3108cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
3118cbae1a6SVijay Mahadevan   }
3128cbae1a6SVijay Mahadevan 
3138cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i) {
3148cbae1a6SVijay Mahadevan     dof[i]=dmmoab->gidmap[(PetscInt)points[i]];
3158cbae1a6SVijay Mahadevan   }
3168cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3178cbae1a6SVijay Mahadevan }
3188cbae1a6SVijay Mahadevan 
3198cbae1a6SVijay Mahadevan 
3208cbae1a6SVijay Mahadevan #undef __FUNCT__
3218cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal"
3228cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
3238cbae1a6SVijay Mahadevan {
3248cbae1a6SVijay Mahadevan   PetscInt        i;
3258cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3268cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3278cbae1a6SVijay Mahadevan 
3288cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3298cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3308cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
3318cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3328cbae1a6SVijay Mahadevan 
3338cbae1a6SVijay Mahadevan   if (!dof) {
3348cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
3358cbae1a6SVijay Mahadevan   }
3368cbae1a6SVijay Mahadevan 
3378cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i)
3388cbae1a6SVijay Mahadevan     dof[i] = dmmoab->lidmap[(PetscInt)points[i]];
3398cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3408cbae1a6SVijay Mahadevan }
3418cbae1a6SVijay Mahadevan 
3428cbae1a6SVijay Mahadevan 
3438cbae1a6SVijay Mahadevan #undef __FUNCT__
3448cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlocked"
3458cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof)
3468cbae1a6SVijay Mahadevan {
3478cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3488cbae1a6SVijay Mahadevan 
3498cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3508cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3518cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3528cbae1a6SVijay Mahadevan 
3538cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
3548cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3558cbae1a6SVijay Mahadevan }
3568cbae1a6SVijay Mahadevan 
3578cbae1a6SVijay Mahadevan 
3588cbae1a6SVijay Mahadevan #undef __FUNCT__
3598cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlockedLocal"
3608cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof)
3618cbae1a6SVijay Mahadevan {
3628cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3638cbae1a6SVijay Mahadevan 
3648cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3658cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3668cbae1a6SVijay Mahadevan   PetscValidPointer(dof,2);
3678cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3688cbae1a6SVijay Mahadevan 
3698cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
3708cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3718cbae1a6SVijay Mahadevan }
3728cbae1a6SVijay Mahadevan 
3738cbae1a6SVijay Mahadevan 
3748cbae1a6SVijay Mahadevan 
375