xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision a2b725a8db0d6bf6cc2a1c6df7dd8029aadfff6e)
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.
14*a2b725a8SWilliam Gropp - fvec - the Vector solution corresponding to the field (component)
1599fa7e03SVijay Mahadevan 
1699fa7e03SVijay Mahadevan   Level: intermediate
1799fa7e03SVijay Mahadevan 
1899fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution
1999fa7e03SVijay Mahadevan 
2099fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetGlobalFieldVector()
2199fa7e03SVijay Mahadevan @*/
228cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
238cbae1a6SVijay Mahadevan {
248cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
258cbae1a6SVijay Mahadevan   moab::Tag     vtag, ntag;
268cbae1a6SVijay Mahadevan   const PetscScalar *varray;
278cbae1a6SVijay Mahadevan   PetscScalar *farray;
288cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
298cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
308cbae1a6SVijay Mahadevan   std::string tag_name;
318cbae1a6SVijay Mahadevan 
328cbae1a6SVijay Mahadevan   PetscFunctionBegin;
338cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
348cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
358cbae1a6SVijay Mahadevan 
36addae81cSVijay 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);
37addae81cSVijay Mahadevan 
388cbae1a6SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
39addae81cSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
408cbae1a6SVijay Mahadevan                                          moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
418cbae1a6SVijay Mahadevan 
428cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec, &vtag);CHKERRQ(ierr);
438cbae1a6SVijay Mahadevan 
448cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
458cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr != moab::MB_SUCCESS) {
468cbae1a6SVijay Mahadevan     ierr = VecGetArrayRead(fvec, &varray);CHKERRQ(ierr);
478cbae1a6SVijay Mahadevan     /* use the entity handle and the Dof index to set the right value */
488cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray); MBERRNM(merr);
498cbae1a6SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec, &varray);CHKERRQ(ierr);
508cbae1a6SVijay Mahadevan   }
518cbae1a6SVijay Mahadevan   else {
527ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->nloc, &farray);CHKERRQ(ierr);
538cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
548cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray); MBERRNM(merr);
558cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
568cbae1a6SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
578cbae1a6SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
588cbae1a6SVijay Mahadevan   }
599daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
608cbae1a6SVijay Mahadevan   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned); MBERRNM(merr);
619daf19fdSVijay Mahadevan #endif
628cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
638cbae1a6SVijay Mahadevan }
648cbae1a6SVijay Mahadevan 
658cbae1a6SVijay Mahadevan 
6699fa7e03SVijay Mahadevan /*@C
6799fa7e03SVijay Mahadevan   DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated
6899fa7e03SVijay Mahadevan   with all fields (components) managed by DM.
6999fa7e03SVijay Mahadevan   A useful utility when updating the DM solution after a solve, to be serialized with the mesh for
7099fa7e03SVijay Mahadevan   checkpointing purposes.
7199fa7e03SVijay Mahadevan 
7299fa7e03SVijay Mahadevan   Not Collective
7399fa7e03SVijay Mahadevan 
7499fa7e03SVijay Mahadevan   Input Parameters:
7599fa7e03SVijay Mahadevan + dm     - the discretization manager object
76*a2b725a8SWilliam Gropp - fvec - the global Vector solution corresponding to all the fields managed by DM
7799fa7e03SVijay Mahadevan 
7899fa7e03SVijay Mahadevan   Level: intermediate
7999fa7e03SVijay Mahadevan 
8099fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution
8199fa7e03SVijay Mahadevan 
8299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector()
8399fa7e03SVijay Mahadevan @*/
848cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
858cbae1a6SVijay Mahadevan {
868cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
878cbae1a6SVijay Mahadevan   moab::Tag     vtag, ntag;
88f28b2503SVijay Mahadevan   const PetscScalar   *rarray;
89f28b2503SVijay Mahadevan   PetscScalar   *varray, *farray;
908cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
918cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
928cbae1a6SVijay Mahadevan   PetscInt i, ifield;
938cbae1a6SVijay Mahadevan   std::string tag_name;
948cbae1a6SVijay Mahadevan   moab::Range::iterator iter;
958cbae1a6SVijay Mahadevan 
968cbae1a6SVijay Mahadevan   PetscFunctionBegin;
978cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
988cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
998cbae1a6SVijay Mahadevan 
1008cbae1a6SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
1018cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec, &vtag);CHKERRQ(ierr);
1028cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
1037ae5e5b6SVijay Mahadevan   ierr = PetscMalloc1(dmmoab->nloc, &farray);CHKERRQ(ierr);
1048cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr != moab::MB_SUCCESS) {
1058cbae1a6SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
106f28b2503SVijay Mahadevan     ierr = VecGetArrayRead(fvec, &rarray);CHKERRQ(ierr);
107addae81cSVijay Mahadevan     for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
1088cbae1a6SVijay Mahadevan 
1098cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
110addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
1118cbae1a6SVijay Mahadevan                                              moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
1128cbae1a6SVijay Mahadevan 
1138cbae1a6SVijay Mahadevan       for (i = 0; i < dmmoab->nloc; i++) {
1143f1c6e43SVijay Mahadevan         farray[i] = (dmmoab->bs == 1 ? rarray[ifield * dmmoab->nloc + i] : rarray[i * dmmoab->numFields + ifield]);
1158cbae1a6SVijay Mahadevan       }
1168cbae1a6SVijay Mahadevan 
1178cbae1a6SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
1188cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
1198cbae1a6SVijay Mahadevan     }
120f28b2503SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec, &rarray);CHKERRQ(ierr);
1218cbae1a6SVijay Mahadevan   }
1228cbae1a6SVijay Mahadevan   else {
1237ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->nloc * dmmoab->numFields, &varray);CHKERRQ(ierr);
1248cbae1a6SVijay Mahadevan 
1258cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
1268cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray); MBERRNM(merr);
127addae81cSVijay Mahadevan     for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
1288cbae1a6SVijay Mahadevan 
1298cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
130addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
1318cbae1a6SVijay Mahadevan                                              moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
1328cbae1a6SVijay Mahadevan 
1338cbae1a6SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
1348cbae1a6SVijay Mahadevan       for (i = 0; i < dmmoab->nloc; i++) {
1353f1c6e43SVijay Mahadevan         farray[i] = (dmmoab->bs == 1 ? varray[ifield * dmmoab->nloc + i] : varray[i * dmmoab->numFields + ifield]);
1368cbae1a6SVijay Mahadevan       }
1378cbae1a6SVijay Mahadevan 
1388cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
1399daf19fdSVijay Mahadevan 
1409daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1418cbae1a6SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
1428cbae1a6SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal); MBERRNM(merr);
1439daf19fdSVijay Mahadevan #endif
1448cbae1a6SVijay Mahadevan     }
1458cbae1a6SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
1468cbae1a6SVijay Mahadevan   }
1478cbae1a6SVijay Mahadevan   ierr = PetscFree(farray);CHKERRQ(ierr);
1488cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1498cbae1a6SVijay Mahadevan }
1508cbae1a6SVijay Mahadevan 
1518cbae1a6SVijay Mahadevan 
15299fa7e03SVijay Mahadevan /*@C
15399fa7e03SVijay Mahadevan   DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM
15499fa7e03SVijay Mahadevan 
15599fa7e03SVijay Mahadevan   Not Collective
15699fa7e03SVijay Mahadevan 
15799fa7e03SVijay Mahadevan   Input Parameters:
15899fa7e03SVijay Mahadevan + dm     - the discretization manager object
15999fa7e03SVijay Mahadevan . numFields - the total number of fields
160*a2b725a8SWilliam Gropp - fields - the array containing the names of each field (component); Can be NULL.
16199fa7e03SVijay Mahadevan 
16299fa7e03SVijay Mahadevan   Level: intermediate
16399fa7e03SVijay Mahadevan 
16499fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name
16599fa7e03SVijay Mahadevan 
16699fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName()
16799fa7e03SVijay Mahadevan @*/
168f28b2503SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm, PetscInt numFields, const char* fields[])
1698cbae1a6SVijay Mahadevan {
170addae81cSVijay Mahadevan   PetscErrorCode ierr;
171addae81cSVijay Mahadevan   PetscInt       i;
1728cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1738cbae1a6SVijay Mahadevan 
1748cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1758cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1768cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1778cbae1a6SVijay Mahadevan 
178addae81cSVijay Mahadevan   /* first deallocate the existing field structure */
179addae81cSVijay Mahadevan   if (dmmoab->fieldNames) {
180addae81cSVijay Mahadevan     for (i = 0; i < dmmoab->numFields; i++) {
181addae81cSVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
182addae81cSVijay Mahadevan     }
183addae81cSVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
184addae81cSVijay Mahadevan   }
185addae81cSVijay Mahadevan 
186addae81cSVijay Mahadevan   /* now re-allocate and assign field names  */
187addae81cSVijay Mahadevan   dmmoab->numFields = numFields;
18895dccacaSBarry Smith   ierr = PetscMalloc1(numFields, &dmmoab->fieldNames);CHKERRQ(ierr);
189addae81cSVijay Mahadevan   if (fields) {
190addae81cSVijay Mahadevan     for (i = 0; i < dmmoab->numFields; i++) {
191addae81cSVijay Mahadevan       ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr);
192addae81cSVijay Mahadevan     }
193addae81cSVijay Mahadevan   }
19463d025dbSVijay Mahadevan   ierr = DMSetNumFields(dm, numFields);CHKERRQ(ierr);
1958cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1968cbae1a6SVijay Mahadevan }
1978cbae1a6SVijay Mahadevan 
19899fa7e03SVijay Mahadevan 
19999fa7e03SVijay Mahadevan /*@C
20099fa7e03SVijay Mahadevan   DMMoabGetFieldName - Gets the names of individual field components in multicomponent
20199fa7e03SVijay Mahadevan   vectors associated with a DMDA.
20299fa7e03SVijay Mahadevan 
20399fa7e03SVijay Mahadevan   Not Collective
20499fa7e03SVijay Mahadevan 
20599fa7e03SVijay Mahadevan   Input Parameter:
20699fa7e03SVijay Mahadevan + dm     - the discretization manager object
207*a2b725a8SWilliam Gropp - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the
20899fa7e03SVijay Mahadevan         number of degrees of freedom per node within the DMMoab
20999fa7e03SVijay Mahadevan 
21099fa7e03SVijay Mahadevan   Output Parameter:
21199fa7e03SVijay Mahadevan . fieldName - the name of the field (component)
21299fa7e03SVijay Mahadevan 
21399fa7e03SVijay Mahadevan   Level: intermediate
21499fa7e03SVijay Mahadevan 
21599fa7e03SVijay Mahadevan .keywords: discretization manager, get, component name
21699fa7e03SVijay Mahadevan 
21799fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields()
21899fa7e03SVijay Mahadevan @*/
21999fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName)
22099fa7e03SVijay Mahadevan {
22199fa7e03SVijay Mahadevan   DM_Moab        *dmmoab;
22299fa7e03SVijay Mahadevan 
22399fa7e03SVijay Mahadevan   PetscFunctionBegin;
22499fa7e03SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
22599fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
22699fa7e03SVijay 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);
22799fa7e03SVijay Mahadevan 
22899fa7e03SVijay Mahadevan   *fieldName = dmmoab->fieldNames[field];
22999fa7e03SVijay Mahadevan   PetscFunctionReturn(0);
23099fa7e03SVijay Mahadevan }
23199fa7e03SVijay Mahadevan 
23299fa7e03SVijay Mahadevan 
233c68c6878SVijay Mahadevan /*@C
23499fa7e03SVijay Mahadevan   DMMoabSetFieldName - Sets the name of a field (component) managed by the DM
235c68c6878SVijay Mahadevan 
236c68c6878SVijay Mahadevan   Not Collective
237c68c6878SVijay Mahadevan 
238c68c6878SVijay Mahadevan   Input Parameters:
23999fa7e03SVijay Mahadevan + dm     - the discretization manager object
240c68c6878SVijay Mahadevan . field - the field number
241*a2b725a8SWilliam Gropp - fieldName - the field (component) name
242c68c6878SVijay Mahadevan 
24399fa7e03SVijay Mahadevan   Level: intermediate
24495452b02SPatrick Sanan   Notes:
24595452b02SPatrick Sanan     Can only be called after DMMoabSetFields supplied with correct numFields
246c68c6878SVijay Mahadevan 
24799fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name
24899fa7e03SVijay Mahadevan 
24999fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields()
250c68c6878SVijay Mahadevan @*/
2515f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName)
252c68c6878SVijay Mahadevan {
253c68c6878SVijay Mahadevan   PetscErrorCode ierr;
254c68c6878SVijay Mahadevan   DM_Moab        *dmmoab;
255c68c6878SVijay Mahadevan 
256c68c6878SVijay Mahadevan   PetscFunctionBegin;
257c68c6878SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2585f7ae369SVijay Mahadevan   PetscValidCharPointer(fieldName, 3);
259c68c6878SVijay Mahadevan 
26099fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
261c68c6878SVijay 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);
26299fa7e03SVijay Mahadevan 
26399fa7e03SVijay Mahadevan   if (dmmoab->fieldNames[field]) {
264c68c6878SVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr);
26599fa7e03SVijay Mahadevan   }
2665f7ae369SVijay Mahadevan   ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr);
267c68c6878SVijay Mahadevan   PetscFunctionReturn(0);
268c68c6878SVijay Mahadevan }
269c68c6878SVijay Mahadevan 
2708cbae1a6SVijay Mahadevan 
27199fa7e03SVijay Mahadevan /*@C
27299fa7e03SVijay Mahadevan   DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a
27399fa7e03SVijay Mahadevan   particular MOAB EntityHandle.
27499fa7e03SVijay Mahadevan 
27599fa7e03SVijay Mahadevan   Not Collective
27699fa7e03SVijay Mahadevan 
27799fa7e03SVijay Mahadevan   Input Parameters:
27899fa7e03SVijay Mahadevan + dm     - the discretization manager object
27999fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values
280*a2b725a8SWilliam Gropp - field - the field (component) index
28199fa7e03SVijay Mahadevan 
28299fa7e03SVijay Mahadevan   Output Parameter:
283*a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat)
28499fa7e03SVijay Mahadevan 
28599fa7e03SVijay Mahadevan   Level: beginner
28699fa7e03SVijay Mahadevan 
28799fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degree of freedom
28899fa7e03SVijay Mahadevan 
28999fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal()
29099fa7e03SVijay Mahadevan @*/
2918cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt* dof)
2928cbae1a6SVijay Mahadevan {
2938cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2948cbae1a6SVijay Mahadevan 
2958cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2968cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2978cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2988cbae1a6SVijay Mahadevan 
299e92d1c7cSVijay Mahadevan   *dof = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] + field * dmmoab->n :
300e92d1c7cSVijay Mahadevan               dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] * dmmoab->numFields + field);
3018cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3028cbae1a6SVijay Mahadevan }
3038cbae1a6SVijay Mahadevan 
3048cbae1a6SVijay Mahadevan 
30599fa7e03SVijay Mahadevan /*@C
30699fa7e03SVijay Mahadevan   DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an
30799fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
30899fa7e03SVijay Mahadevan 
30999fa7e03SVijay Mahadevan   Not Collective
31099fa7e03SVijay Mahadevan 
31199fa7e03SVijay Mahadevan   Input Parameters:
31299fa7e03SVijay Mahadevan + dm     - the discretization manager object
31399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
31499fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
315*a2b725a8SWilliam Gropp - field - the field (component) index
31699fa7e03SVijay Mahadevan 
31799fa7e03SVijay Mahadevan   Output Parameter:
318*a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
31999fa7e03SVijay Mahadevan 
32099fa7e03SVijay Mahadevan   Level: intermediate
32199fa7e03SVijay Mahadevan 
32299fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
32399fa7e03SVijay Mahadevan 
32499fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal()
32599fa7e03SVijay Mahadevan @*/
3268cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof)
3278cbae1a6SVijay Mahadevan {
3288cbae1a6SVijay Mahadevan   PetscInt        i;
3298cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3308cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3318cbae1a6SVijay Mahadevan 
3328cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3338cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
33499fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3358cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3368cbae1a6SVijay Mahadevan 
3378cbae1a6SVijay Mahadevan   if (!dof) {
3387ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr);
3398cbae1a6SVijay Mahadevan   }
3408cbae1a6SVijay Mahadevan 
3413f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
3423f1c6e43SVijay 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 */
34399fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3448cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i)
345e92d1c7cSVijay Mahadevan     dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n :
346e92d1c7cSVijay Mahadevan               dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field);
3478cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3488cbae1a6SVijay Mahadevan }
3498cbae1a6SVijay Mahadevan 
3508cbae1a6SVijay Mahadevan 
35199fa7e03SVijay Mahadevan /*@C
35299fa7e03SVijay Mahadevan   DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an
35399fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
35499fa7e03SVijay Mahadevan 
35599fa7e03SVijay Mahadevan   Not Collective
35699fa7e03SVijay Mahadevan 
35799fa7e03SVijay Mahadevan   Input Parameters:
35899fa7e03SVijay Mahadevan + dm     - the discretization manager object
35999fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
36099fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
361*a2b725a8SWilliam Gropp - field - the field (component) index
36299fa7e03SVijay Mahadevan 
36399fa7e03SVijay Mahadevan   Output Parameter:
364*a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
36599fa7e03SVijay Mahadevan 
36699fa7e03SVijay Mahadevan   Level: intermediate
36799fa7e03SVijay Mahadevan 
36899fa7e03SVijay Mahadevan .keywords: discretization manager, get, local degrees of freedom
36999fa7e03SVijay Mahadevan 
37099fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs()
37199fa7e03SVijay Mahadevan @*/
3728cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof)
3738cbae1a6SVijay Mahadevan {
3743f1c6e43SVijay Mahadevan   PetscInt i;
3758cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3768cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3778cbae1a6SVijay Mahadevan 
3788cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3798cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
38099fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3818cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3828cbae1a6SVijay Mahadevan 
3838cbae1a6SVijay Mahadevan   if (!dof) {
3847ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr);
3858cbae1a6SVijay Mahadevan   }
3868cbae1a6SVijay Mahadevan 
3873f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
38899fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
38999fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3903f1c6e43SVijay Mahadevan   for (i = 0; i < npoints; ++i) {
391e92d1c7cSVijay Mahadevan     dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
392e92d1c7cSVijay Mahadevan               dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n);
3938cbae1a6SVijay Mahadevan   }
3948cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3958cbae1a6SVijay Mahadevan }
3968cbae1a6SVijay Mahadevan 
3978cbae1a6SVijay Mahadevan 
39899fa7e03SVijay Mahadevan /*@C
39999fa7e03SVijay Mahadevan   DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an
40099fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
40199fa7e03SVijay Mahadevan 
40299fa7e03SVijay Mahadevan   Not Collective
40399fa7e03SVijay Mahadevan 
40499fa7e03SVijay Mahadevan   Input Parameters:
40599fa7e03SVijay Mahadevan + dm     - the discretization manager object
40699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
407*a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
40899fa7e03SVijay Mahadevan 
40999fa7e03SVijay Mahadevan   Output Parameter:
410*a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
41199fa7e03SVijay Mahadevan 
41299fa7e03SVijay Mahadevan   Level: intermediate
41399fa7e03SVijay Mahadevan 
41499fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
41599fa7e03SVijay Mahadevan 
41699fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked()
41799fa7e03SVijay Mahadevan @*/
4188cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
4198cbae1a6SVijay Mahadevan {
4208cbae1a6SVijay Mahadevan   PetscInt        i, field, offset;
4218cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
4228cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4238cbae1a6SVijay Mahadevan 
4248cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4258cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
42699fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
4278cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4288cbae1a6SVijay Mahadevan 
4298cbae1a6SVijay Mahadevan   if (!dof) {
4307ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->numFields * npoints, &dof);CHKERRQ(ierr);
4318cbae1a6SVijay Mahadevan   }
4328cbae1a6SVijay Mahadevan 
4333f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
43499fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
43599fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
436addae81cSVijay Mahadevan   for (field = 0; field < dmmoab->numFields; ++field) {
43799fa7e03SVijay Mahadevan     offset = field * dmmoab->n;
4388cbae1a6SVijay Mahadevan     for (i = 0; i < npoints; ++i)
439e92d1c7cSVijay Mahadevan       dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
440e92d1c7cSVijay Mahadevan                                             dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset);
4418cbae1a6SVijay Mahadevan   }
4428cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4438cbae1a6SVijay Mahadevan }
4448cbae1a6SVijay Mahadevan 
44599fa7e03SVijay Mahadevan /*@C
44699fa7e03SVijay Mahadevan   DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an
44799fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
44899fa7e03SVijay Mahadevan 
44999fa7e03SVijay Mahadevan   Not Collective
45099fa7e03SVijay Mahadevan 
45199fa7e03SVijay Mahadevan   Input Parameters:
45299fa7e03SVijay Mahadevan + dm     - the discretization manager object
45399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
454*a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
45599fa7e03SVijay Mahadevan 
45699fa7e03SVijay Mahadevan   Output Parameter:
457*a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
45899fa7e03SVijay Mahadevan 
45999fa7e03SVijay Mahadevan   Level: intermediate
46099fa7e03SVijay Mahadevan 
46199fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
46299fa7e03SVijay Mahadevan 
46399fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked()
46499fa7e03SVijay Mahadevan @*/
4658cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
4668cbae1a6SVijay Mahadevan {
4678cbae1a6SVijay Mahadevan   PetscInt        i, field, offset;
4688cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
4698cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4708cbae1a6SVijay Mahadevan 
4718cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4728cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
47399fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
4748cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4758cbae1a6SVijay Mahadevan 
4768cbae1a6SVijay Mahadevan   if (!dof) {
4777ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->numFields * npoints, &dof);CHKERRQ(ierr);
4788cbae1a6SVijay Mahadevan   }
4798cbae1a6SVijay Mahadevan 
4803f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
48199fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
48299fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
483addae81cSVijay Mahadevan   for (field = 0; field < dmmoab->numFields; ++field) {
48499fa7e03SVijay Mahadevan     offset = field * dmmoab->n;
4858cbae1a6SVijay Mahadevan     for (i = 0; i < npoints; ++i)
486e92d1c7cSVijay Mahadevan       dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
487e92d1c7cSVijay Mahadevan                                             dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset);
4888cbae1a6SVijay Mahadevan   }
4898cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4908cbae1a6SVijay Mahadevan }
4918cbae1a6SVijay Mahadevan 
4928cbae1a6SVijay Mahadevan 
49399fa7e03SVijay Mahadevan /*@C
49499fa7e03SVijay Mahadevan   DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
49599fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation
49699fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
49799fa7e03SVijay Mahadevan 
49899fa7e03SVijay Mahadevan   Not Collective
49999fa7e03SVijay Mahadevan 
50099fa7e03SVijay Mahadevan   Input Parameters:
50199fa7e03SVijay Mahadevan + dm     - the discretization manager object
50299fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
503*a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
50499fa7e03SVijay Mahadevan 
50599fa7e03SVijay Mahadevan   Output Parameter:
506*a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat)
50799fa7e03SVijay Mahadevan 
50899fa7e03SVijay Mahadevan   Level: intermediate
50999fa7e03SVijay Mahadevan 
51099fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
51199fa7e03SVijay Mahadevan 
51299fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
51399fa7e03SVijay Mahadevan @*/
5148cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
5158cbae1a6SVijay Mahadevan {
5168cbae1a6SVijay Mahadevan   PetscInt        i;
5178cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5188cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
5198cbae1a6SVijay Mahadevan 
5208cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5218cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5223f1c6e43SVijay Mahadevan   PetscValidPointer(points, 3);
5238cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5248cbae1a6SVijay Mahadevan 
5258cbae1a6SVijay Mahadevan   if (!dof) {
5267ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr);
5278cbae1a6SVijay Mahadevan   }
5288cbae1a6SVijay Mahadevan 
5298cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i) {
5303f1c6e43SVijay Mahadevan     dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart];
5318cbae1a6SVijay Mahadevan   }
5328cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5338cbae1a6SVijay Mahadevan }
5348cbae1a6SVijay Mahadevan 
5358cbae1a6SVijay Mahadevan 
53699fa7e03SVijay Mahadevan /*@C
53799fa7e03SVijay Mahadevan   DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
53899fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation
53999fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
54099fa7e03SVijay Mahadevan 
54199fa7e03SVijay Mahadevan   Not Collective
54299fa7e03SVijay Mahadevan 
54399fa7e03SVijay Mahadevan   Input Parameters:
54499fa7e03SVijay Mahadevan + dm     - the discretization manager object
54599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
546*a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
54799fa7e03SVijay Mahadevan 
54899fa7e03SVijay Mahadevan   Output Parameter:
549*a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat)
55099fa7e03SVijay Mahadevan 
55199fa7e03SVijay Mahadevan   Level: intermediate
55299fa7e03SVijay Mahadevan 
55399fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
55499fa7e03SVijay Mahadevan 
55599fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
55699fa7e03SVijay Mahadevan @*/
5578cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
5588cbae1a6SVijay Mahadevan {
5598cbae1a6SVijay Mahadevan   PetscInt        i;
5608cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5618cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
5628cbae1a6SVijay Mahadevan 
5638cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5648cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5653f1c6e43SVijay Mahadevan   PetscValidPointer(points, 3);
5668cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5678cbae1a6SVijay Mahadevan 
5688cbae1a6SVijay Mahadevan   if (!dof) {
5697ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr);
5708cbae1a6SVijay Mahadevan   }
5718cbae1a6SVijay Mahadevan 
5728cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i)
5733f1c6e43SVijay Mahadevan     dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart];
5748cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5758cbae1a6SVijay Mahadevan }
5768cbae1a6SVijay Mahadevan 
5778cbae1a6SVijay Mahadevan 
57899fa7e03SVijay Mahadevan /*@C
57999fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
58099fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
58199fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
58299fa7e03SVijay Mahadevan 
58399fa7e03SVijay Mahadevan   Not Collective
58499fa7e03SVijay Mahadevan 
58599fa7e03SVijay Mahadevan   Input Parameters:
586*a2b725a8SWilliam Gropp . dm     - the discretization manager object
58799fa7e03SVijay Mahadevan 
58899fa7e03SVijay Mahadevan   Output Parameter:
589*a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
59099fa7e03SVijay Mahadevan 
59199fa7e03SVijay Mahadevan   Level: intermediate
59299fa7e03SVijay Mahadevan 
59399fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom
59499fa7e03SVijay Mahadevan 
59599fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
59699fa7e03SVijay Mahadevan @*/
5978cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt** dof)
5988cbae1a6SVijay Mahadevan {
5998cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
6008cbae1a6SVijay Mahadevan 
6018cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6028cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6038cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6048cbae1a6SVijay Mahadevan 
6058cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
6068cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6078cbae1a6SVijay Mahadevan }
6088cbae1a6SVijay Mahadevan 
6098cbae1a6SVijay Mahadevan 
61099fa7e03SVijay Mahadevan /*@C
61199fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
61299fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
61399fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
61499fa7e03SVijay Mahadevan 
61599fa7e03SVijay Mahadevan   Not Collective
61699fa7e03SVijay Mahadevan 
61799fa7e03SVijay Mahadevan   Input Parameters:
618*a2b725a8SWilliam Gropp . dm     - the discretization manager object
61999fa7e03SVijay Mahadevan 
62099fa7e03SVijay Mahadevan   Output Parameter:
621*a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
62299fa7e03SVijay Mahadevan 
62399fa7e03SVijay Mahadevan   Level: intermediate
62499fa7e03SVijay Mahadevan 
62599fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom
62699fa7e03SVijay Mahadevan 
62799fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
62899fa7e03SVijay Mahadevan @*/
6298cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt** dof)
6308cbae1a6SVijay Mahadevan {
6318cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
6328cbae1a6SVijay Mahadevan 
6338cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6348cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6358cbae1a6SVijay Mahadevan   PetscValidPointer(dof, 2);
6368cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6378cbae1a6SVijay Mahadevan 
6388cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
6398cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6408cbae1a6SVijay Mahadevan }
6418cbae1a6SVijay Mahadevan 
642