xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision c68c6878db9b6cc7634213adaf78bf225090a995)
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 
21addae81cSVijay 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);
22addae81cSVijay Mahadevan 
238cbae1a6SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
24addae81cSVijay 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);
75addae81cSVijay 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 */
78addae81cSVijay 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
85addae81cSVijay 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);
98addae81cSVijay 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 */
101addae81cSVijay 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"
122addae81cSVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt numFields,const char** fields)
1238cbae1a6SVijay Mahadevan {
124addae81cSVijay Mahadevan   PetscErrorCode ierr;
125addae81cSVijay 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 
132addae81cSVijay Mahadevan   /* first deallocate the existing field structure */
133addae81cSVijay Mahadevan   if (dmmoab->fieldNames) {
134addae81cSVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
135addae81cSVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
136addae81cSVijay Mahadevan     }
137addae81cSVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
138addae81cSVijay Mahadevan   }
139addae81cSVijay Mahadevan 
140addae81cSVijay Mahadevan   /* now re-allocate and assign field names  */
141addae81cSVijay Mahadevan   dmmoab->numFields = numFields;
142addae81cSVijay Mahadevan   ierr = PetscMalloc(sizeof(char*)*numFields,&dmmoab->fieldNames);CHKERRQ(ierr);
143addae81cSVijay Mahadevan   if (fields) {
144addae81cSVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
145addae81cSVijay Mahadevan       ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr);
146addae81cSVijay Mahadevan     }
147addae81cSVijay Mahadevan   }
1488cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1498cbae1a6SVijay Mahadevan }
1508cbae1a6SVijay Mahadevan 
151*c68c6878SVijay Mahadevan #undef __FUNCT__
152*c68c6878SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldName"
153*c68c6878SVijay Mahadevan /*@C
154*c68c6878SVijay Mahadevan   DMMoabSetFieldName - Sets the name of a field in the DM
155*c68c6878SVijay Mahadevan 
156*c68c6878SVijay Mahadevan   Not Collective
157*c68c6878SVijay Mahadevan 
158*c68c6878SVijay Mahadevan   Input Parameters:
159*c68c6878SVijay Mahadevan + dm     - the DM object
160*c68c6878SVijay Mahadevan . field - the field number
161*c68c6878SVijay Mahadevan - fieldName - the field name
162*c68c6878SVijay Mahadevan 
163*c68c6878SVijay Mahadevan   Level: developer
164*c68c6878SVijay Mahadevan   Note: Needs to be called after DMMoabSetFields with correct numFields
165*c68c6878SVijay Mahadevan 
166*c68c6878SVijay Mahadevan .seealso: DMMoabSetFields()
167*c68c6878SVijay Mahadevan @*/
168*c68c6878SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char fieldName[])
169*c68c6878SVijay Mahadevan {
170*c68c6878SVijay Mahadevan   PetscErrorCode ierr;
171*c68c6878SVijay Mahadevan   DM_Moab        *dmmoab;
172*c68c6878SVijay Mahadevan 
173*c68c6878SVijay Mahadevan   PetscFunctionBegin;
174*c68c6878SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
175*c68c6878SVijay Mahadevan   PetscValidCharPointer(fieldName,3);
176*c68c6878SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
177*c68c6878SVijay Mahadevan 
178*c68c6878SVijay Mahadevan   if ((field < 0) || (field >= dmmoab->numFields)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields);
179*c68c6878SVijay Mahadevan   ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr);
180*c68c6878SVijay Mahadevan   ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr);
181*c68c6878SVijay Mahadevan   PetscFunctionReturn(0);
182*c68c6878SVijay Mahadevan }
183*c68c6878SVijay Mahadevan 
1848cbae1a6SVijay Mahadevan 
1858cbae1a6SVijay Mahadevan #undef __FUNCT__
1868cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
1878cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
1888cbae1a6SVijay Mahadevan {
1898cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1908cbae1a6SVijay Mahadevan 
1918cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1928cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1938cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1948cbae1a6SVijay Mahadevan 
1958cbae1a6SVijay Mahadevan   *dof=dmmoab->gidmap[(PetscInt)point];
1968cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1978cbae1a6SVijay Mahadevan }
1988cbae1a6SVijay Mahadevan 
1998cbae1a6SVijay Mahadevan 
2008cbae1a6SVijay Mahadevan #undef __FUNCT__
2018cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
2028cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
2038cbae1a6SVijay Mahadevan {
2048cbae1a6SVijay Mahadevan   PetscInt        i;
2058cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
2068cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2078cbae1a6SVijay Mahadevan 
2088cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2098cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2108cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
2118cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2128cbae1a6SVijay Mahadevan 
2138cbae1a6SVijay Mahadevan   if (!dof) {
2148cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
2158cbae1a6SVijay Mahadevan   }
2168cbae1a6SVijay Mahadevan 
2178cbae1a6SVijay Mahadevan   /* first get the local indices */
2188cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
2198cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
220addae81cSVijay Mahadevan       dof[i] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
2218cbae1a6SVijay Mahadevan   }
2228cbae1a6SVijay Mahadevan   else {
2238cbae1a6SVijay Mahadevan     /* assume all fields have equal distribution */
2248cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
2258cbae1a6SVijay Mahadevan       dof[i] = dmmoab->gidmap[(PetscInt)points[i]]+field*dmmoab->n;
2268cbae1a6SVijay Mahadevan   }
2278cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2288cbae1a6SVijay Mahadevan }
2298cbae1a6SVijay Mahadevan 
2308cbae1a6SVijay Mahadevan 
2318cbae1a6SVijay Mahadevan #undef __FUNCT__
2328cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal"
2338cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
2348cbae1a6SVijay Mahadevan {
2358cbae1a6SVijay Mahadevan   PetscInt i,offset;
2368cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
2378cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2388cbae1a6SVijay Mahadevan 
2398cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2408cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2418cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
2428cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2438cbae1a6SVijay Mahadevan 
2448cbae1a6SVijay Mahadevan   if (!dof) {
2458cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
2468cbae1a6SVijay Mahadevan   }
2478cbae1a6SVijay Mahadevan 
2488cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
2498cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
250addae81cSVijay Mahadevan       dof[i] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
2518cbae1a6SVijay Mahadevan   }
2528cbae1a6SVijay Mahadevan   else {
2538cbae1a6SVijay Mahadevan     offset = field*dmmoab->n; /* assume all fields have equal distribution */
2548cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
2558cbae1a6SVijay Mahadevan       dof[i] = dmmoab->lidmap[(PetscInt)points[i]]+offset;
2568cbae1a6SVijay Mahadevan   }
2578cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2588cbae1a6SVijay Mahadevan }
2598cbae1a6SVijay Mahadevan 
2608cbae1a6SVijay Mahadevan 
2618cbae1a6SVijay Mahadevan #undef __FUNCT__
2628cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs"
2638cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
2648cbae1a6SVijay Mahadevan {
2658cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
2668cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
2678cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2688cbae1a6SVijay Mahadevan 
2698cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2708cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2718cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
2728cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2738cbae1a6SVijay Mahadevan 
2748cbae1a6SVijay Mahadevan   if (!dof) {
275addae81cSVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->numFields*npoints, &dof);CHKERRQ(ierr);
2768cbae1a6SVijay Mahadevan   }
2778cbae1a6SVijay Mahadevan 
2788cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
279addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
2808cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
281addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
2828cbae1a6SVijay Mahadevan     }
2838cbae1a6SVijay Mahadevan   }
2848cbae1a6SVijay Mahadevan   else {
285addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
2868cbae1a6SVijay Mahadevan       offset = field*dmmoab->n; /* assume all fields have equal distribution */
2878cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
288addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]+offset;
2898cbae1a6SVijay Mahadevan     }
2908cbae1a6SVijay Mahadevan   }
2918cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2928cbae1a6SVijay Mahadevan }
2938cbae1a6SVijay Mahadevan 
2948cbae1a6SVijay Mahadevan 
2958cbae1a6SVijay Mahadevan #undef __FUNCT__
2968cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal"
2978cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
2988cbae1a6SVijay Mahadevan {
2998cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
3008cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3018cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3028cbae1a6SVijay Mahadevan 
3038cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3048cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3058cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
3068cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3078cbae1a6SVijay Mahadevan 
3088cbae1a6SVijay Mahadevan   if (!dof) {
309addae81cSVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->numFields*npoints, &dof);CHKERRQ(ierr);
3108cbae1a6SVijay Mahadevan   }
3118cbae1a6SVijay Mahadevan 
3128cbae1a6SVijay Mahadevan   if (dmmoab->bs > 1) {
313addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
3148cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
315addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
3168cbae1a6SVijay Mahadevan     }
3178cbae1a6SVijay Mahadevan   }
3188cbae1a6SVijay Mahadevan   else {
319addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
3208cbae1a6SVijay Mahadevan       offset = field*dmmoab->n; /* assume all fields have equal distribution */
3218cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
322addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]+offset;
3238cbae1a6SVijay Mahadevan     }
3248cbae1a6SVijay Mahadevan   }
3258cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3268cbae1a6SVijay Mahadevan }
3278cbae1a6SVijay Mahadevan 
3288cbae1a6SVijay Mahadevan 
3298cbae1a6SVijay Mahadevan #undef __FUNCT__
3308cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked"
3318cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
3328cbae1a6SVijay Mahadevan {
3338cbae1a6SVijay Mahadevan   PetscInt        i;
3348cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3358cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3368cbae1a6SVijay Mahadevan 
3378cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3388cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3398cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
3408cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3418cbae1a6SVijay Mahadevan 
3428cbae1a6SVijay Mahadevan   if (!dof) {
3438cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
3448cbae1a6SVijay Mahadevan   }
3458cbae1a6SVijay Mahadevan 
3468cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i) {
3478cbae1a6SVijay Mahadevan     dof[i]=dmmoab->gidmap[(PetscInt)points[i]];
3488cbae1a6SVijay Mahadevan   }
3498cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3508cbae1a6SVijay Mahadevan }
3518cbae1a6SVijay Mahadevan 
3528cbae1a6SVijay Mahadevan 
3538cbae1a6SVijay Mahadevan #undef __FUNCT__
3548cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal"
3558cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
3568cbae1a6SVijay Mahadevan {
3578cbae1a6SVijay Mahadevan   PetscInt        i;
3588cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3598cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3608cbae1a6SVijay Mahadevan 
3618cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3628cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3638cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
3648cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3658cbae1a6SVijay Mahadevan 
3668cbae1a6SVijay Mahadevan   if (!dof) {
3678cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
3688cbae1a6SVijay Mahadevan   }
3698cbae1a6SVijay Mahadevan 
3708cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i)
3718cbae1a6SVijay Mahadevan     dof[i] = dmmoab->lidmap[(PetscInt)points[i]];
3728cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3738cbae1a6SVijay Mahadevan }
3748cbae1a6SVijay Mahadevan 
3758cbae1a6SVijay Mahadevan 
3768cbae1a6SVijay Mahadevan #undef __FUNCT__
3778cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlocked"
3788cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof)
3798cbae1a6SVijay Mahadevan {
3808cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3818cbae1a6SVijay Mahadevan 
3828cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3838cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3848cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3858cbae1a6SVijay Mahadevan 
3868cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
3878cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3888cbae1a6SVijay Mahadevan }
3898cbae1a6SVijay Mahadevan 
3908cbae1a6SVijay Mahadevan 
3918cbae1a6SVijay Mahadevan #undef __FUNCT__
3928cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlockedLocal"
3938cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof)
3948cbae1a6SVijay Mahadevan {
3958cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3968cbae1a6SVijay Mahadevan 
3978cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3988cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3998cbae1a6SVijay Mahadevan   PetscValidPointer(dof,2);
4008cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4018cbae1a6SVijay Mahadevan 
4028cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
4038cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4048cbae1a6SVijay Mahadevan }
4058cbae1a6SVijay Mahadevan 
4068cbae1a6SVijay Mahadevan 
4078cbae1a6SVijay Mahadevan 
408