xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision d8d19677bbccf95218448bee62e6b87f4513e133)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
28cbae1a6SVijay Mahadevan 
38cbae1a6SVijay Mahadevan #include <petscdmmoab.h>
48cbae1a6SVijay Mahadevan 
599fa7e03SVijay Mahadevan /*@C
699fa7e03SVijay Mahadevan   DMMoabSetFieldVector - Sets the vector reference that represents the solution associated
799fa7e03SVijay Mahadevan   with a particular field component.
899fa7e03SVijay Mahadevan 
999fa7e03SVijay Mahadevan   Not Collective
1099fa7e03SVijay Mahadevan 
1199fa7e03SVijay Mahadevan   Input Parameters:
1299fa7e03SVijay Mahadevan + dm     - the discretization manager object
1399fa7e03SVijay Mahadevan . ifield - the index of the field as set before via DMMoabSetFieldName.
14a2b725a8SWilliam Gropp - fvec - the Vector solution corresponding to the field (component)
1599fa7e03SVijay Mahadevan 
1699fa7e03SVijay Mahadevan   Level: intermediate
1799fa7e03SVijay Mahadevan 
1899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetGlobalFieldVector()
1999fa7e03SVijay Mahadevan @*/
208cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
218cbae1a6SVijay Mahadevan {
228cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
238cbae1a6SVijay Mahadevan   moab::Tag     vtag, ntag;
248cbae1a6SVijay Mahadevan   const PetscScalar *varray;
258cbae1a6SVijay Mahadevan   PetscScalar *farray;
268cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
278cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
288cbae1a6SVijay Mahadevan   std::string tag_name;
298cbae1a6SVijay Mahadevan 
308cbae1a6SVijay Mahadevan   PetscFunctionBegin;
318cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
328cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
338cbae1a6SVijay Mahadevan 
34addae81cSVijay 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);
35addae81cSVijay Mahadevan 
368cbae1a6SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
37addae81cSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
388cbae1a6SVijay Mahadevan                                          moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
398cbae1a6SVijay Mahadevan 
408cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec, &vtag);CHKERRQ(ierr);
418cbae1a6SVijay Mahadevan 
428cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
438cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr != moab::MB_SUCCESS) {
448cbae1a6SVijay Mahadevan     ierr = VecGetArrayRead(fvec, &varray);CHKERRQ(ierr);
458cbae1a6SVijay Mahadevan     /* use the entity handle and the Dof index to set the right value */
468cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray); MBERRNM(merr);
478cbae1a6SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec, &varray);CHKERRQ(ierr);
488cbae1a6SVijay Mahadevan   }
498cbae1a6SVijay Mahadevan   else {
507ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->nloc, &farray);CHKERRQ(ierr);
518cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
528cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray); MBERRNM(merr);
538cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
548cbae1a6SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
558cbae1a6SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
568cbae1a6SVijay Mahadevan   }
579daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
588cbae1a6SVijay Mahadevan   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned); MBERRNM(merr);
599daf19fdSVijay Mahadevan #endif
608cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
618cbae1a6SVijay Mahadevan }
628cbae1a6SVijay Mahadevan 
6399fa7e03SVijay Mahadevan /*@C
6499fa7e03SVijay Mahadevan   DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated
6599fa7e03SVijay Mahadevan   with all fields (components) managed by DM.
6699fa7e03SVijay Mahadevan   A useful utility when updating the DM solution after a solve, to be serialized with the mesh for
6799fa7e03SVijay Mahadevan   checkpointing purposes.
6899fa7e03SVijay Mahadevan 
6999fa7e03SVijay Mahadevan   Not Collective
7099fa7e03SVijay Mahadevan 
7199fa7e03SVijay Mahadevan   Input Parameters:
7299fa7e03SVijay Mahadevan + dm     - the discretization manager object
73a2b725a8SWilliam Gropp - fvec - the global Vector solution corresponding to all the fields managed by DM
7499fa7e03SVijay Mahadevan 
7599fa7e03SVijay Mahadevan   Level: intermediate
7699fa7e03SVijay Mahadevan 
7799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector()
7899fa7e03SVijay Mahadevan @*/
798cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
808cbae1a6SVijay Mahadevan {
818cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
828cbae1a6SVijay Mahadevan   moab::Tag     vtag, ntag;
83f28b2503SVijay Mahadevan   const PetscScalar   *rarray;
84f28b2503SVijay Mahadevan   PetscScalar   *varray, *farray;
858cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
868cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
878cbae1a6SVijay Mahadevan   PetscInt i, ifield;
888cbae1a6SVijay Mahadevan   std::string tag_name;
898cbae1a6SVijay Mahadevan   moab::Range::iterator iter;
908cbae1a6SVijay Mahadevan 
918cbae1a6SVijay Mahadevan   PetscFunctionBegin;
928cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
938cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
948cbae1a6SVijay Mahadevan 
958cbae1a6SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
968cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec, &vtag);CHKERRQ(ierr);
978cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
987ae5e5b6SVijay Mahadevan   ierr = PetscMalloc1(dmmoab->nloc, &farray);CHKERRQ(ierr);
998cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr != moab::MB_SUCCESS) {
1008cbae1a6SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
101f28b2503SVijay Mahadevan     ierr = VecGetArrayRead(fvec, &rarray);CHKERRQ(ierr);
102addae81cSVijay Mahadevan     for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
1038cbae1a6SVijay Mahadevan 
1048cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
105addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
1068cbae1a6SVijay Mahadevan                                              moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
1078cbae1a6SVijay Mahadevan 
1088cbae1a6SVijay Mahadevan       for (i = 0; i < dmmoab->nloc; i++) {
1093f1c6e43SVijay Mahadevan         farray[i] = (dmmoab->bs == 1 ? rarray[ifield * dmmoab->nloc + i] : rarray[i * dmmoab->numFields + ifield]);
1108cbae1a6SVijay Mahadevan       }
1118cbae1a6SVijay Mahadevan 
1128cbae1a6SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
1138cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
1148cbae1a6SVijay Mahadevan     }
115f28b2503SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec, &rarray);CHKERRQ(ierr);
1168cbae1a6SVijay Mahadevan   }
1178cbae1a6SVijay Mahadevan   else {
1187ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->nloc * dmmoab->numFields, &varray);CHKERRQ(ierr);
1198cbae1a6SVijay Mahadevan 
1208cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
1218cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray); MBERRNM(merr);
122addae81cSVijay Mahadevan     for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
1238cbae1a6SVijay Mahadevan 
1248cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
125addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
1268cbae1a6SVijay Mahadevan                                              moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
1278cbae1a6SVijay Mahadevan 
1288cbae1a6SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
1298cbae1a6SVijay Mahadevan       for (i = 0; i < dmmoab->nloc; i++) {
1303f1c6e43SVijay Mahadevan         farray[i] = (dmmoab->bs == 1 ? varray[ifield * dmmoab->nloc + i] : varray[i * dmmoab->numFields + ifield]);
1318cbae1a6SVijay Mahadevan       }
1328cbae1a6SVijay Mahadevan 
1338cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
1349daf19fdSVijay Mahadevan 
1359daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1368cbae1a6SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
1378cbae1a6SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal); MBERRNM(merr);
1389daf19fdSVijay Mahadevan #endif
1398cbae1a6SVijay Mahadevan     }
1408cbae1a6SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
1418cbae1a6SVijay Mahadevan   }
1428cbae1a6SVijay Mahadevan   ierr = PetscFree(farray);CHKERRQ(ierr);
1438cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1448cbae1a6SVijay Mahadevan }
1458cbae1a6SVijay Mahadevan 
14699fa7e03SVijay Mahadevan /*@C
14799fa7e03SVijay Mahadevan   DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM
14899fa7e03SVijay Mahadevan 
14999fa7e03SVijay Mahadevan   Not Collective
15099fa7e03SVijay Mahadevan 
15199fa7e03SVijay Mahadevan   Input Parameters:
15299fa7e03SVijay Mahadevan + dm     - the discretization manager object
15399fa7e03SVijay Mahadevan . numFields - the total number of fields
154a2b725a8SWilliam Gropp - fields - the array containing the names of each field (component); Can be NULL.
15599fa7e03SVijay Mahadevan 
15699fa7e03SVijay Mahadevan   Level: intermediate
15799fa7e03SVijay Mahadevan 
15899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName()
15999fa7e03SVijay Mahadevan @*/
160f28b2503SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm, PetscInt numFields, const char* fields[])
1618cbae1a6SVijay Mahadevan {
162addae81cSVijay Mahadevan   PetscErrorCode ierr;
163addae81cSVijay Mahadevan   PetscInt       i;
1648cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1658cbae1a6SVijay Mahadevan 
1668cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1678cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1688cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1698cbae1a6SVijay Mahadevan 
170addae81cSVijay Mahadevan   /* first deallocate the existing field structure */
171addae81cSVijay Mahadevan   if (dmmoab->fieldNames) {
172addae81cSVijay Mahadevan     for (i = 0; i < dmmoab->numFields; i++) {
173addae81cSVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
174addae81cSVijay Mahadevan     }
175addae81cSVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
176addae81cSVijay Mahadevan   }
177addae81cSVijay Mahadevan 
178addae81cSVijay Mahadevan   /* now re-allocate and assign field names  */
179addae81cSVijay Mahadevan   dmmoab->numFields = numFields;
18095dccacaSBarry Smith   ierr = PetscMalloc1(numFields, &dmmoab->fieldNames);CHKERRQ(ierr);
181addae81cSVijay Mahadevan   if (fields) {
182addae81cSVijay Mahadevan     for (i = 0; i < dmmoab->numFields; i++) {
183addae81cSVijay Mahadevan       ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr);
184addae81cSVijay Mahadevan     }
185addae81cSVijay Mahadevan   }
18663d025dbSVijay Mahadevan   ierr = DMSetNumFields(dm, numFields);CHKERRQ(ierr);
1878cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1888cbae1a6SVijay Mahadevan }
1898cbae1a6SVijay Mahadevan 
19099fa7e03SVijay Mahadevan /*@C
19199fa7e03SVijay Mahadevan   DMMoabGetFieldName - Gets the names of individual field components in multicomponent
19299fa7e03SVijay Mahadevan   vectors associated with a DMDA.
19399fa7e03SVijay Mahadevan 
19499fa7e03SVijay Mahadevan   Not Collective
19599fa7e03SVijay Mahadevan 
196*d8d19677SJose E. Roman   Input Parameters:
19799fa7e03SVijay Mahadevan + dm     - the discretization manager object
198a2b725a8SWilliam Gropp - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the
19999fa7e03SVijay Mahadevan         number of degrees of freedom per node within the DMMoab
20099fa7e03SVijay Mahadevan 
20199fa7e03SVijay Mahadevan   Output Parameter:
20299fa7e03SVijay Mahadevan . fieldName - the name of the field (component)
20399fa7e03SVijay Mahadevan 
20499fa7e03SVijay Mahadevan   Level: intermediate
20599fa7e03SVijay Mahadevan 
20699fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields()
20799fa7e03SVijay Mahadevan @*/
20899fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName)
20999fa7e03SVijay Mahadevan {
21099fa7e03SVijay Mahadevan   DM_Moab        *dmmoab;
21199fa7e03SVijay Mahadevan 
21299fa7e03SVijay Mahadevan   PetscFunctionBegin;
21399fa7e03SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
21499fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
21599fa7e03SVijay 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);
21699fa7e03SVijay Mahadevan 
21799fa7e03SVijay Mahadevan   *fieldName = dmmoab->fieldNames[field];
21899fa7e03SVijay Mahadevan   PetscFunctionReturn(0);
21999fa7e03SVijay Mahadevan }
22099fa7e03SVijay Mahadevan 
221c68c6878SVijay Mahadevan /*@C
22299fa7e03SVijay Mahadevan   DMMoabSetFieldName - Sets the name of a field (component) managed by the DM
223c68c6878SVijay Mahadevan 
224c68c6878SVijay Mahadevan   Not Collective
225c68c6878SVijay Mahadevan 
226c68c6878SVijay Mahadevan   Input Parameters:
22799fa7e03SVijay Mahadevan + dm     - the discretization manager object
228c68c6878SVijay Mahadevan . field - the field number
229a2b725a8SWilliam Gropp - fieldName - the field (component) name
230c68c6878SVijay Mahadevan 
23199fa7e03SVijay Mahadevan   Level: intermediate
23295452b02SPatrick Sanan   Notes:
23395452b02SPatrick Sanan     Can only be called after DMMoabSetFields supplied with correct numFields
234c68c6878SVijay Mahadevan 
23599fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields()
236c68c6878SVijay Mahadevan @*/
2375f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName)
238c68c6878SVijay Mahadevan {
239c68c6878SVijay Mahadevan   PetscErrorCode ierr;
240c68c6878SVijay Mahadevan   DM_Moab        *dmmoab;
241c68c6878SVijay Mahadevan 
242c68c6878SVijay Mahadevan   PetscFunctionBegin;
243c68c6878SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2445f7ae369SVijay Mahadevan   PetscValidCharPointer(fieldName, 3);
245c68c6878SVijay Mahadevan 
24699fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
247c68c6878SVijay 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);
24899fa7e03SVijay Mahadevan 
24999fa7e03SVijay Mahadevan   if (dmmoab->fieldNames[field]) {
250c68c6878SVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr);
25199fa7e03SVijay Mahadevan   }
2525f7ae369SVijay Mahadevan   ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr);
253c68c6878SVijay Mahadevan   PetscFunctionReturn(0);
254c68c6878SVijay Mahadevan }
255c68c6878SVijay Mahadevan 
25699fa7e03SVijay Mahadevan /*@C
25799fa7e03SVijay Mahadevan   DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a
25899fa7e03SVijay Mahadevan   particular MOAB EntityHandle.
25999fa7e03SVijay Mahadevan 
26099fa7e03SVijay Mahadevan   Not Collective
26199fa7e03SVijay Mahadevan 
26299fa7e03SVijay Mahadevan   Input Parameters:
26399fa7e03SVijay Mahadevan + dm     - the discretization manager object
26499fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values
265a2b725a8SWilliam Gropp - field - the field (component) index
26699fa7e03SVijay Mahadevan 
26799fa7e03SVijay Mahadevan   Output Parameter:
268a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat)
26999fa7e03SVijay Mahadevan 
27099fa7e03SVijay Mahadevan   Level: beginner
27199fa7e03SVijay Mahadevan 
27299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal()
27399fa7e03SVijay Mahadevan @*/
2748cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt* dof)
2758cbae1a6SVijay Mahadevan {
2768cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2778cbae1a6SVijay Mahadevan 
2788cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2798cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2808cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2818cbae1a6SVijay Mahadevan 
282e92d1c7cSVijay Mahadevan   *dof = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] + field * dmmoab->n :
283e92d1c7cSVijay Mahadevan               dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] * dmmoab->numFields + field);
2848cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2858cbae1a6SVijay Mahadevan }
2868cbae1a6SVijay Mahadevan 
28799fa7e03SVijay Mahadevan /*@C
28899fa7e03SVijay Mahadevan   DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an
28999fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
29099fa7e03SVijay Mahadevan 
29199fa7e03SVijay Mahadevan   Not Collective
29299fa7e03SVijay Mahadevan 
29399fa7e03SVijay Mahadevan   Input Parameters:
29499fa7e03SVijay Mahadevan + dm     - the discretization manager object
29599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
29699fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
297a2b725a8SWilliam Gropp - field - the field (component) index
29899fa7e03SVijay Mahadevan 
29999fa7e03SVijay Mahadevan   Output Parameter:
300a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
30199fa7e03SVijay Mahadevan 
30299fa7e03SVijay Mahadevan   Level: intermediate
30399fa7e03SVijay Mahadevan 
30499fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal()
30599fa7e03SVijay Mahadevan @*/
3068cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof)
3078cbae1a6SVijay Mahadevan {
3088cbae1a6SVijay Mahadevan   PetscInt        i;
3098cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3108cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3118cbae1a6SVijay Mahadevan 
3128cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3138cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
31499fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3158cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3168cbae1a6SVijay Mahadevan 
3178cbae1a6SVijay Mahadevan   if (!dof) {
3187ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr);
3198cbae1a6SVijay Mahadevan   }
3208cbae1a6SVijay Mahadevan 
3213f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
3223f1c6e43SVijay Mahadevan   /* We also assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
32399fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3248cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i)
325e92d1c7cSVijay Mahadevan     dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n :
326e92d1c7cSVijay Mahadevan               dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field);
3278cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3288cbae1a6SVijay Mahadevan }
3298cbae1a6SVijay Mahadevan 
33099fa7e03SVijay Mahadevan /*@C
33199fa7e03SVijay Mahadevan   DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an
33299fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
33399fa7e03SVijay Mahadevan 
33499fa7e03SVijay Mahadevan   Not Collective
33599fa7e03SVijay Mahadevan 
33699fa7e03SVijay Mahadevan   Input Parameters:
33799fa7e03SVijay Mahadevan + dm     - the discretization manager object
33899fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
33999fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
340a2b725a8SWilliam Gropp - field - the field (component) index
34199fa7e03SVijay Mahadevan 
34299fa7e03SVijay Mahadevan   Output Parameter:
343a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
34499fa7e03SVijay Mahadevan 
34599fa7e03SVijay Mahadevan   Level: intermediate
34699fa7e03SVijay Mahadevan 
34799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs()
34899fa7e03SVijay Mahadevan @*/
3498cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof)
3508cbae1a6SVijay Mahadevan {
3513f1c6e43SVijay Mahadevan   PetscInt i;
3528cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3538cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3548cbae1a6SVijay Mahadevan 
3558cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3568cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
35799fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3588cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3598cbae1a6SVijay Mahadevan 
3608cbae1a6SVijay Mahadevan   if (!dof) {
3617ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr);
3628cbae1a6SVijay Mahadevan   }
3638cbae1a6SVijay Mahadevan 
3643f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
36599fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
36699fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3673f1c6e43SVijay Mahadevan   for (i = 0; i < npoints; ++i) {
368e92d1c7cSVijay Mahadevan     dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
369e92d1c7cSVijay Mahadevan               dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n);
3708cbae1a6SVijay Mahadevan   }
3718cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3728cbae1a6SVijay Mahadevan }
3738cbae1a6SVijay Mahadevan 
37499fa7e03SVijay Mahadevan /*@C
37599fa7e03SVijay Mahadevan   DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an
37699fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
37799fa7e03SVijay Mahadevan 
37899fa7e03SVijay Mahadevan   Not Collective
37999fa7e03SVijay Mahadevan 
38099fa7e03SVijay Mahadevan   Input Parameters:
38199fa7e03SVijay Mahadevan + dm     - the discretization manager object
38299fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
383a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
38499fa7e03SVijay Mahadevan 
38599fa7e03SVijay Mahadevan   Output Parameter:
386a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
38799fa7e03SVijay Mahadevan 
38899fa7e03SVijay Mahadevan   Level: intermediate
38999fa7e03SVijay Mahadevan 
39099fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked()
39199fa7e03SVijay Mahadevan @*/
3928cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
3938cbae1a6SVijay Mahadevan {
3948cbae1a6SVijay Mahadevan   PetscInt        i, field, offset;
3958cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3968cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3978cbae1a6SVijay Mahadevan 
3988cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3998cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
40099fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
4018cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4028cbae1a6SVijay Mahadevan 
4038cbae1a6SVijay Mahadevan   if (!dof) {
4047ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->numFields * npoints, &dof);CHKERRQ(ierr);
4058cbae1a6SVijay Mahadevan   }
4068cbae1a6SVijay Mahadevan 
4073f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
40899fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
40999fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
410addae81cSVijay Mahadevan   for (field = 0; field < dmmoab->numFields; ++field) {
41199fa7e03SVijay Mahadevan     offset = field * dmmoab->n;
4128cbae1a6SVijay Mahadevan     for (i = 0; i < npoints; ++i)
413e92d1c7cSVijay Mahadevan       dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
414e92d1c7cSVijay Mahadevan                                             dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset);
4158cbae1a6SVijay Mahadevan   }
4168cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4178cbae1a6SVijay Mahadevan }
4188cbae1a6SVijay Mahadevan 
41999fa7e03SVijay Mahadevan /*@C
42099fa7e03SVijay Mahadevan   DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an
42199fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
42299fa7e03SVijay Mahadevan 
42399fa7e03SVijay Mahadevan   Not Collective
42499fa7e03SVijay Mahadevan 
42599fa7e03SVijay Mahadevan   Input Parameters:
42699fa7e03SVijay Mahadevan + dm     - the discretization manager object
42799fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
428a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
42999fa7e03SVijay Mahadevan 
43099fa7e03SVijay Mahadevan   Output Parameter:
431a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
43299fa7e03SVijay Mahadevan 
43399fa7e03SVijay Mahadevan   Level: intermediate
43499fa7e03SVijay Mahadevan 
43599fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked()
43699fa7e03SVijay Mahadevan @*/
4378cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
4388cbae1a6SVijay Mahadevan {
4398cbae1a6SVijay Mahadevan   PetscInt        i, field, offset;
4408cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
4418cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4428cbae1a6SVijay Mahadevan 
4438cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4448cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
44599fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
4468cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4478cbae1a6SVijay Mahadevan 
4488cbae1a6SVijay Mahadevan   if (!dof) {
4497ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->numFields * npoints, &dof);CHKERRQ(ierr);
4508cbae1a6SVijay Mahadevan   }
4518cbae1a6SVijay Mahadevan 
4523f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
45399fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
45499fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
455addae81cSVijay Mahadevan   for (field = 0; field < dmmoab->numFields; ++field) {
45699fa7e03SVijay Mahadevan     offset = field * dmmoab->n;
4578cbae1a6SVijay Mahadevan     for (i = 0; i < npoints; ++i)
458e92d1c7cSVijay Mahadevan       dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
459e92d1c7cSVijay Mahadevan                                             dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset);
4608cbae1a6SVijay Mahadevan   }
4618cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4628cbae1a6SVijay Mahadevan }
4638cbae1a6SVijay Mahadevan 
46499fa7e03SVijay Mahadevan /*@C
46599fa7e03SVijay Mahadevan   DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
46699fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation
46799fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
46899fa7e03SVijay Mahadevan 
46999fa7e03SVijay Mahadevan   Not Collective
47099fa7e03SVijay Mahadevan 
47199fa7e03SVijay Mahadevan   Input Parameters:
47299fa7e03SVijay Mahadevan + dm     - the discretization manager object
47399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
474a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
47599fa7e03SVijay Mahadevan 
47699fa7e03SVijay Mahadevan   Output Parameter:
477a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat)
47899fa7e03SVijay Mahadevan 
47999fa7e03SVijay Mahadevan   Level: intermediate
48099fa7e03SVijay Mahadevan 
48199fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
48299fa7e03SVijay Mahadevan @*/
4838cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
4848cbae1a6SVijay Mahadevan {
4858cbae1a6SVijay Mahadevan   PetscInt        i;
4868cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4878cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
4888cbae1a6SVijay Mahadevan 
4898cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4908cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4913f1c6e43SVijay Mahadevan   PetscValidPointer(points, 3);
4928cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4938cbae1a6SVijay Mahadevan 
4948cbae1a6SVijay Mahadevan   if (!dof) {
4957ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr);
4968cbae1a6SVijay Mahadevan   }
4978cbae1a6SVijay Mahadevan 
4988cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i) {
4993f1c6e43SVijay Mahadevan     dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart];
5008cbae1a6SVijay Mahadevan   }
5018cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5028cbae1a6SVijay Mahadevan }
5038cbae1a6SVijay Mahadevan 
50499fa7e03SVijay Mahadevan /*@C
50599fa7e03SVijay Mahadevan   DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
50699fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation
50799fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
50899fa7e03SVijay Mahadevan 
50999fa7e03SVijay Mahadevan   Not Collective
51099fa7e03SVijay Mahadevan 
51199fa7e03SVijay Mahadevan   Input Parameters:
51299fa7e03SVijay Mahadevan + dm     - the discretization manager object
51399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
514a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
51599fa7e03SVijay Mahadevan 
51699fa7e03SVijay Mahadevan   Output Parameter:
517a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat)
51899fa7e03SVijay Mahadevan 
51999fa7e03SVijay Mahadevan   Level: intermediate
52099fa7e03SVijay Mahadevan 
52199fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
52299fa7e03SVijay Mahadevan @*/
5238cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
5248cbae1a6SVijay Mahadevan {
5258cbae1a6SVijay Mahadevan   PetscInt        i;
5268cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5278cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
5288cbae1a6SVijay Mahadevan 
5298cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5308cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5313f1c6e43SVijay Mahadevan   PetscValidPointer(points, 3);
5328cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5338cbae1a6SVijay Mahadevan 
5348cbae1a6SVijay Mahadevan   if (!dof) {
5357ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr);
5368cbae1a6SVijay Mahadevan   }
5378cbae1a6SVijay Mahadevan 
5388cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i)
5393f1c6e43SVijay Mahadevan     dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart];
5408cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5418cbae1a6SVijay Mahadevan }
5428cbae1a6SVijay Mahadevan 
54399fa7e03SVijay Mahadevan /*@C
54499fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
54599fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
54699fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
54799fa7e03SVijay Mahadevan 
54899fa7e03SVijay Mahadevan   Not Collective
54999fa7e03SVijay Mahadevan 
55099fa7e03SVijay Mahadevan   Input Parameters:
551a2b725a8SWilliam Gropp . dm     - the discretization manager object
55299fa7e03SVijay Mahadevan 
55399fa7e03SVijay Mahadevan   Output Parameter:
554a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
55599fa7e03SVijay Mahadevan 
55699fa7e03SVijay Mahadevan   Level: intermediate
55799fa7e03SVijay Mahadevan 
55899fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
55999fa7e03SVijay Mahadevan @*/
5608cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt** dof)
5618cbae1a6SVijay Mahadevan {
5628cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5638cbae1a6SVijay Mahadevan 
5648cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5658cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5668cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5678cbae1a6SVijay Mahadevan 
5688cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
5698cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5708cbae1a6SVijay Mahadevan }
5718cbae1a6SVijay Mahadevan 
57299fa7e03SVijay Mahadevan /*@C
57399fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
57499fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
57599fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
57699fa7e03SVijay Mahadevan 
57799fa7e03SVijay Mahadevan   Not Collective
57899fa7e03SVijay Mahadevan 
57999fa7e03SVijay Mahadevan   Input Parameters:
580a2b725a8SWilliam Gropp . dm     - the discretization manager object
58199fa7e03SVijay Mahadevan 
58299fa7e03SVijay Mahadevan   Output Parameter:
583a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
58499fa7e03SVijay Mahadevan 
58599fa7e03SVijay Mahadevan   Level: intermediate
58699fa7e03SVijay Mahadevan 
58799fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
58899fa7e03SVijay Mahadevan @*/
5898cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt** dof)
5908cbae1a6SVijay Mahadevan {
5918cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5928cbae1a6SVijay Mahadevan 
5938cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5948cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5958cbae1a6SVijay Mahadevan   PetscValidPointer(dof, 2);
5968cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5978cbae1a6SVijay Mahadevan 
5988cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
5998cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6008cbae1a6SVijay Mahadevan }
6018cbae1a6SVijay Mahadevan 
602