xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision 3f1c6e43b297ee9cd09759ca24f8d38b0ebd8168)
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.
14b8ecf6d3SVijay Mahadevan . 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   }
598cbae1a6SVijay Mahadevan   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);MBERRNM(merr);
608cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
618cbae1a6SVijay Mahadevan }
628cbae1a6SVijay Mahadevan 
638cbae1a6SVijay Mahadevan 
6499fa7e03SVijay Mahadevan /*@C
6599fa7e03SVijay Mahadevan   DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated
6699fa7e03SVijay Mahadevan   with all fields (components) managed by DM.
6799fa7e03SVijay Mahadevan   A useful utility when updating the DM solution after a solve, to be serialized with the mesh for
6899fa7e03SVijay Mahadevan   checkpointing purposes.
6999fa7e03SVijay Mahadevan 
7099fa7e03SVijay Mahadevan   Not Collective
7199fa7e03SVijay Mahadevan 
7299fa7e03SVijay Mahadevan   Input Parameters:
7399fa7e03SVijay Mahadevan + dm     - the discretization manager object
74b8ecf6d3SVijay Mahadevan . fvec - the global Vector solution corresponding to all the fields managed by DM
7599fa7e03SVijay Mahadevan 
7699fa7e03SVijay Mahadevan   Level: intermediate
7799fa7e03SVijay Mahadevan 
7899fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution
7999fa7e03SVijay Mahadevan 
8099fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector()
8199fa7e03SVijay Mahadevan @*/
828cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
838cbae1a6SVijay Mahadevan {
848cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
858cbae1a6SVijay Mahadevan   moab::Tag     vtag,ntag;
86f28b2503SVijay Mahadevan   const PetscScalar   *rarray;
87f28b2503SVijay Mahadevan   PetscScalar   *varray,*farray;
888cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
898cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
908cbae1a6SVijay Mahadevan   PetscInt i,ifield;
918cbae1a6SVijay Mahadevan   std::string tag_name;
928cbae1a6SVijay Mahadevan   moab::Range::iterator iter;
938cbae1a6SVijay Mahadevan 
948cbae1a6SVijay Mahadevan   PetscFunctionBegin;
958cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
968cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
978cbae1a6SVijay Mahadevan 
988cbae1a6SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
998cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
1008cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
1017ae5e5b6SVijay Mahadevan   ierr = PetscMalloc1(dmmoab->nloc,&farray);CHKERRQ(ierr);
1028cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
1038cbae1a6SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
104f28b2503SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&rarray);CHKERRQ(ierr);
105addae81cSVijay Mahadevan     for (ifield=0; ifield<dmmoab->numFields; ++ifield) {
1068cbae1a6SVijay Mahadevan 
1078cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
108addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
1098cbae1a6SVijay Mahadevan                                             moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
1108cbae1a6SVijay Mahadevan 
1118cbae1a6SVijay Mahadevan       for(i=0;i<dmmoab->nloc;i++) {
112*3f1c6e43SVijay Mahadevan         farray[i]=(dmmoab->bs == 1 ? rarray[ifield*dmmoab->nloc+i] : rarray[i*dmmoab->numFields+ifield]);
1138cbae1a6SVijay Mahadevan       }
1148cbae1a6SVijay Mahadevan 
1158cbae1a6SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
1168cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
1178cbae1a6SVijay Mahadevan     }
118f28b2503SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&rarray);CHKERRQ(ierr);
1198cbae1a6SVijay Mahadevan   }
1208cbae1a6SVijay Mahadevan   else {
1217ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->nloc*dmmoab->numFields,&varray);CHKERRQ(ierr);
1228cbae1a6SVijay Mahadevan 
1238cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
1248cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
125addae81cSVijay Mahadevan     for (ifield=0; ifield<dmmoab->numFields; ++ifield) {
1268cbae1a6SVijay Mahadevan 
1278cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
128addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
1298cbae1a6SVijay Mahadevan                                             moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
1308cbae1a6SVijay Mahadevan 
1318cbae1a6SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
1328cbae1a6SVijay Mahadevan       for(i=0; i < dmmoab->nloc; i++) {
133*3f1c6e43SVijay Mahadevan         farray[i]=(dmmoab->bs == 1 ? varray[ifield*dmmoab->nloc+i] : varray[i*dmmoab->numFields+ifield]);
1348cbae1a6SVijay Mahadevan       }
1358cbae1a6SVijay Mahadevan 
1368cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
1378cbae1a6SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
1388cbae1a6SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
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 
1468cbae1a6SVijay Mahadevan 
14799fa7e03SVijay Mahadevan /*@C
14899fa7e03SVijay Mahadevan   DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM
14999fa7e03SVijay Mahadevan 
15099fa7e03SVijay Mahadevan   Not Collective
15199fa7e03SVijay Mahadevan 
15299fa7e03SVijay Mahadevan   Input Parameters:
15399fa7e03SVijay Mahadevan + dm     - the discretization manager object
15499fa7e03SVijay Mahadevan . numFields - the total number of fields
155b8ecf6d3SVijay Mahadevan . fields - the array containing the names of each field (component); Can be NULL.
15699fa7e03SVijay Mahadevan 
15799fa7e03SVijay Mahadevan   Level: intermediate
15899fa7e03SVijay Mahadevan 
15999fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name
16099fa7e03SVijay Mahadevan 
16199fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName()
16299fa7e03SVijay Mahadevan @*/
163f28b2503SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm,PetscInt numFields,const char* fields[])
1648cbae1a6SVijay Mahadevan {
165addae81cSVijay Mahadevan   PetscErrorCode ierr;
166addae81cSVijay Mahadevan   PetscInt       i;
1678cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1688cbae1a6SVijay Mahadevan 
1698cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1708cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1718cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1728cbae1a6SVijay Mahadevan 
173addae81cSVijay Mahadevan   /* first deallocate the existing field structure */
174addae81cSVijay Mahadevan   if (dmmoab->fieldNames) {
175addae81cSVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
176addae81cSVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
177addae81cSVijay Mahadevan     }
178addae81cSVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
179addae81cSVijay Mahadevan   }
180addae81cSVijay Mahadevan 
181addae81cSVijay Mahadevan   /* now re-allocate and assign field names  */
182addae81cSVijay Mahadevan   dmmoab->numFields = numFields;
18395dccacaSBarry Smith   ierr = PetscMalloc1(numFields,&dmmoab->fieldNames);CHKERRQ(ierr);
184addae81cSVijay Mahadevan   if (fields) {
185addae81cSVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
186addae81cSVijay Mahadevan       ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr);
187addae81cSVijay Mahadevan     }
188addae81cSVijay Mahadevan   }
1898cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1908cbae1a6SVijay Mahadevan }
1918cbae1a6SVijay Mahadevan 
19299fa7e03SVijay Mahadevan 
19399fa7e03SVijay Mahadevan /*@C
19499fa7e03SVijay Mahadevan   DMMoabGetFieldName - Gets the names of individual field components in multicomponent
19599fa7e03SVijay Mahadevan   vectors associated with a DMDA.
19699fa7e03SVijay Mahadevan 
19799fa7e03SVijay Mahadevan   Not Collective
19899fa7e03SVijay Mahadevan 
19999fa7e03SVijay Mahadevan   Input Parameter:
20099fa7e03SVijay Mahadevan + dm     - the discretization manager object
201b8ecf6d3SVijay Mahadevan . field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the
20299fa7e03SVijay Mahadevan         number of degrees of freedom per node within the DMMoab
20399fa7e03SVijay Mahadevan 
20499fa7e03SVijay Mahadevan   Output Parameter:
20599fa7e03SVijay Mahadevan . fieldName - the name of the field (component)
20699fa7e03SVijay Mahadevan 
20799fa7e03SVijay Mahadevan   Level: intermediate
20899fa7e03SVijay Mahadevan 
20999fa7e03SVijay Mahadevan .keywords: discretization manager, get, component name
21099fa7e03SVijay Mahadevan 
21199fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields()
21299fa7e03SVijay Mahadevan @*/
21399fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName)
21499fa7e03SVijay Mahadevan {
21599fa7e03SVijay Mahadevan   DM_Moab        *dmmoab;
21699fa7e03SVijay Mahadevan 
21799fa7e03SVijay Mahadevan   PetscFunctionBegin;
21899fa7e03SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
21999fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
22099fa7e03SVijay 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);
22199fa7e03SVijay Mahadevan 
22299fa7e03SVijay Mahadevan   *fieldName = dmmoab->fieldNames[field];
22399fa7e03SVijay Mahadevan   PetscFunctionReturn(0);
22499fa7e03SVijay Mahadevan }
22599fa7e03SVijay Mahadevan 
22699fa7e03SVijay Mahadevan 
227c68c6878SVijay Mahadevan /*@C
22899fa7e03SVijay Mahadevan   DMMoabSetFieldName - Sets the name of a field (component) managed by the DM
229c68c6878SVijay Mahadevan 
230c68c6878SVijay Mahadevan   Not Collective
231c68c6878SVijay Mahadevan 
232c68c6878SVijay Mahadevan   Input Parameters:
23399fa7e03SVijay Mahadevan + dm     - the discretization manager object
234c68c6878SVijay Mahadevan . field - the field number
235b8ecf6d3SVijay Mahadevan . fieldName - the field (component) name
236c68c6878SVijay Mahadevan 
23799fa7e03SVijay Mahadevan   Level: intermediate
23899fa7e03SVijay Mahadevan   Notes: Can only be called after DMMoabSetFields supplied with correct numFields
239c68c6878SVijay Mahadevan 
24099fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name
24199fa7e03SVijay Mahadevan 
24299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields()
243c68c6878SVijay Mahadevan @*/
2445f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName)
245c68c6878SVijay Mahadevan {
246c68c6878SVijay Mahadevan   PetscErrorCode ierr;
247c68c6878SVijay Mahadevan   DM_Moab        *dmmoab;
248c68c6878SVijay Mahadevan 
249c68c6878SVijay Mahadevan   PetscFunctionBegin;
250c68c6878SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2515f7ae369SVijay Mahadevan   PetscValidCharPointer(fieldName,3);
252c68c6878SVijay Mahadevan 
25399fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
254c68c6878SVijay 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);
25599fa7e03SVijay Mahadevan 
25699fa7e03SVijay Mahadevan   if (dmmoab->fieldNames[field]) {
257c68c6878SVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr);
25899fa7e03SVijay Mahadevan   }
2595f7ae369SVijay Mahadevan   ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr);
260c68c6878SVijay Mahadevan   PetscFunctionReturn(0);
261c68c6878SVijay Mahadevan }
262c68c6878SVijay Mahadevan 
2638cbae1a6SVijay Mahadevan 
26499fa7e03SVijay Mahadevan /*@C
26599fa7e03SVijay Mahadevan   DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a
26699fa7e03SVijay Mahadevan   particular MOAB EntityHandle.
26799fa7e03SVijay Mahadevan 
26899fa7e03SVijay Mahadevan   Not Collective
26999fa7e03SVijay Mahadevan 
27099fa7e03SVijay Mahadevan   Input Parameters:
27199fa7e03SVijay Mahadevan + dm     - the discretization manager object
27299fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values
273b8ecf6d3SVijay Mahadevan . field - the field (component) index
27499fa7e03SVijay Mahadevan 
27599fa7e03SVijay Mahadevan   Output Parameter:
27699fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat)
27799fa7e03SVijay Mahadevan 
27899fa7e03SVijay Mahadevan   Level: beginner
27999fa7e03SVijay Mahadevan 
28099fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degree of freedom
28199fa7e03SVijay Mahadevan 
28299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal()
28399fa7e03SVijay Mahadevan @*/
2848cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
2858cbae1a6SVijay Mahadevan {
2868cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2878cbae1a6SVijay Mahadevan 
2888cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2898cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2908cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2918cbae1a6SVijay Mahadevan 
292*3f1c6e43SVijay Mahadevan   *dof=dmmoab->gidmap[((PetscInt)point-dmmoab->seqstart)]*dmmoab->numFields+field;
2938cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2948cbae1a6SVijay Mahadevan }
2958cbae1a6SVijay Mahadevan 
2968cbae1a6SVijay Mahadevan 
29799fa7e03SVijay Mahadevan /*@C
29899fa7e03SVijay Mahadevan   DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an
29999fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
30099fa7e03SVijay Mahadevan 
30199fa7e03SVijay Mahadevan   Not Collective
30299fa7e03SVijay Mahadevan 
30399fa7e03SVijay Mahadevan   Input Parameters:
30499fa7e03SVijay Mahadevan + dm     - the discretization manager object
30599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
30699fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
307b8ecf6d3SVijay Mahadevan . field - the field (component) index
30899fa7e03SVijay Mahadevan 
30999fa7e03SVijay Mahadevan   Output Parameter:
31099fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
31199fa7e03SVijay Mahadevan 
31299fa7e03SVijay Mahadevan   Level: intermediate
31399fa7e03SVijay Mahadevan 
31499fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
31599fa7e03SVijay Mahadevan 
31699fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal()
31799fa7e03SVijay Mahadevan @*/
3188cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
3198cbae1a6SVijay Mahadevan {
3208cbae1a6SVijay Mahadevan   PetscInt        i;
3218cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3228cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3238cbae1a6SVijay Mahadevan 
3248cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3258cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
32699fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
3278cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3288cbae1a6SVijay Mahadevan 
3298cbae1a6SVijay Mahadevan   if (!dof) {
3307ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
3318cbae1a6SVijay Mahadevan   }
3328cbae1a6SVijay Mahadevan 
333*3f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
334*3f1c6e43SVijay 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 */
33599fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3368cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i)
337*3f1c6e43SVijay Mahadevan     dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]+field*dmmoab->n :
338*3f1c6e43SVijay Mahadevan                                 dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field);
3398cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3408cbae1a6SVijay Mahadevan }
3418cbae1a6SVijay Mahadevan 
3428cbae1a6SVijay Mahadevan 
34399fa7e03SVijay Mahadevan /*@C
34499fa7e03SVijay Mahadevan   DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an
34599fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
34699fa7e03SVijay Mahadevan 
34799fa7e03SVijay Mahadevan   Not Collective
34899fa7e03SVijay Mahadevan 
34999fa7e03SVijay Mahadevan   Input Parameters:
35099fa7e03SVijay Mahadevan + dm     - the discretization manager object
35199fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
35299fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
353b8ecf6d3SVijay Mahadevan . field - the field (component) index
35499fa7e03SVijay Mahadevan 
35599fa7e03SVijay Mahadevan   Output Parameter:
35699fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
35799fa7e03SVijay Mahadevan 
35899fa7e03SVijay Mahadevan   Level: intermediate
35999fa7e03SVijay Mahadevan 
36099fa7e03SVijay Mahadevan .keywords: discretization manager, get, local degrees of freedom
36199fa7e03SVijay Mahadevan 
36299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs()
36399fa7e03SVijay Mahadevan @*/
3648cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
3658cbae1a6SVijay Mahadevan {
366*3f1c6e43SVijay Mahadevan   PetscInt i;
3678cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3688cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3698cbae1a6SVijay Mahadevan 
3708cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3718cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
37299fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
3738cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3748cbae1a6SVijay Mahadevan 
3758cbae1a6SVijay Mahadevan   if (!dof) {
3767ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
3778cbae1a6SVijay Mahadevan   }
3788cbae1a6SVijay Mahadevan 
379*3f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
38099fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
38199fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
382*3f1c6e43SVijay Mahadevan   for (i=0; i<npoints; ++i) {
383*3f1c6e43SVijay Mahadevan     dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field :
384*3f1c6e43SVijay Mahadevan                                dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]+field*dmmoab->n);
3858cbae1a6SVijay Mahadevan   }
3868cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3878cbae1a6SVijay Mahadevan }
3888cbae1a6SVijay Mahadevan 
3898cbae1a6SVijay Mahadevan 
39099fa7e03SVijay Mahadevan /*@C
39199fa7e03SVijay Mahadevan   DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an
39299fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
39399fa7e03SVijay Mahadevan 
39499fa7e03SVijay Mahadevan   Not Collective
39599fa7e03SVijay Mahadevan 
39699fa7e03SVijay Mahadevan   Input Parameters:
39799fa7e03SVijay Mahadevan + dm     - the discretization manager object
39899fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
39999fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
40099fa7e03SVijay Mahadevan 
40199fa7e03SVijay Mahadevan   Output Parameter:
40299fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
40399fa7e03SVijay Mahadevan 
40499fa7e03SVijay Mahadevan   Level: intermediate
40599fa7e03SVijay Mahadevan 
40699fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
40799fa7e03SVijay Mahadevan 
40899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked()
40999fa7e03SVijay Mahadevan @*/
4108cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
4118cbae1a6SVijay Mahadevan {
4128cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
4138cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
4148cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4158cbae1a6SVijay Mahadevan 
4168cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4178cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
41899fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
4198cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4208cbae1a6SVijay Mahadevan 
4218cbae1a6SVijay Mahadevan   if (!dof) {
4227ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->numFields*npoints,&dof);CHKERRQ(ierr);
4238cbae1a6SVijay Mahadevan   }
4248cbae1a6SVijay Mahadevan 
425*3f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
42699fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
42799fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
428addae81cSVijay Mahadevan   for (field=0; field<dmmoab->numFields; ++field) {
42999fa7e03SVijay Mahadevan     offset = field*dmmoab->n;
4308cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
431*3f1c6e43SVijay Mahadevan       dof[i*dmmoab->numFields+field] = (dmmoab->bs > 1 ? dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field :
432*3f1c6e43SVijay Mahadevan                                                          dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]+offset);
4338cbae1a6SVijay Mahadevan   }
4348cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4358cbae1a6SVijay Mahadevan }
4368cbae1a6SVijay Mahadevan 
437*3f1c6e43SVijay Mahadevan #undef __FUNCT__
438*3f1c6e43SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal"
43999fa7e03SVijay Mahadevan /*@C
44099fa7e03SVijay Mahadevan   DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an
44199fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
44299fa7e03SVijay Mahadevan 
44399fa7e03SVijay Mahadevan   Not Collective
44499fa7e03SVijay Mahadevan 
44599fa7e03SVijay Mahadevan   Input Parameters:
44699fa7e03SVijay Mahadevan + dm     - the discretization manager object
44799fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
44899fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
44999fa7e03SVijay Mahadevan 
45099fa7e03SVijay Mahadevan   Output Parameter:
45199fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
45299fa7e03SVijay Mahadevan 
45399fa7e03SVijay Mahadevan   Level: intermediate
45499fa7e03SVijay Mahadevan 
45599fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
45699fa7e03SVijay Mahadevan 
45799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked()
45899fa7e03SVijay Mahadevan @*/
4598cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
4608cbae1a6SVijay Mahadevan {
4618cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
4628cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
4638cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4648cbae1a6SVijay Mahadevan 
4658cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4668cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
46799fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
4688cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4698cbae1a6SVijay Mahadevan 
4708cbae1a6SVijay Mahadevan   if (!dof) {
4717ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->numFields*npoints,&dof);CHKERRQ(ierr);
4728cbae1a6SVijay Mahadevan   }
4738cbae1a6SVijay Mahadevan 
474*3f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
47599fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
47699fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
477addae81cSVijay Mahadevan   for (field=0; field<dmmoab->numFields; ++field) {
47899fa7e03SVijay Mahadevan     offset = field*dmmoab->n;
4798cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
480*3f1c6e43SVijay Mahadevan       dof[i*dmmoab->numFields+field] = (dmmoab->bs > 1 ? dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field :
481*3f1c6e43SVijay Mahadevan                                                          dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]+offset);
4828cbae1a6SVijay Mahadevan   }
4838cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4848cbae1a6SVijay Mahadevan }
4858cbae1a6SVijay Mahadevan 
4868cbae1a6SVijay Mahadevan 
48799fa7e03SVijay Mahadevan /*@C
48899fa7e03SVijay Mahadevan   DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
48999fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation
49099fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
49199fa7e03SVijay Mahadevan 
49299fa7e03SVijay Mahadevan   Not Collective
49399fa7e03SVijay Mahadevan 
49499fa7e03SVijay Mahadevan   Input Parameters:
49599fa7e03SVijay Mahadevan + dm     - the discretization manager object
49699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
49799fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
49899fa7e03SVijay Mahadevan 
49999fa7e03SVijay Mahadevan   Output Parameter:
50099fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat)
50199fa7e03SVijay Mahadevan 
50299fa7e03SVijay Mahadevan   Level: intermediate
50399fa7e03SVijay Mahadevan 
50499fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
50599fa7e03SVijay Mahadevan 
50699fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
50799fa7e03SVijay Mahadevan @*/
5088cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
5098cbae1a6SVijay Mahadevan {
5108cbae1a6SVijay Mahadevan   PetscInt        i;
5118cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5128cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
5138cbae1a6SVijay Mahadevan 
5148cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5158cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
516*3f1c6e43SVijay Mahadevan   PetscValidPointer(points,3);
5178cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5188cbae1a6SVijay Mahadevan 
5198cbae1a6SVijay Mahadevan   if (!dof) {
5207ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
5218cbae1a6SVijay Mahadevan   }
5228cbae1a6SVijay Mahadevan 
5238cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i) {
524*3f1c6e43SVijay Mahadevan     dof[i]=dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart];
5258cbae1a6SVijay Mahadevan   }
5268cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5278cbae1a6SVijay Mahadevan }
5288cbae1a6SVijay Mahadevan 
5298cbae1a6SVijay Mahadevan 
53099fa7e03SVijay Mahadevan /*@C
53199fa7e03SVijay Mahadevan   DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
53299fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation
53399fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
53499fa7e03SVijay Mahadevan 
53599fa7e03SVijay Mahadevan   Not Collective
53699fa7e03SVijay Mahadevan 
53799fa7e03SVijay Mahadevan   Input Parameters:
53899fa7e03SVijay Mahadevan + dm     - the discretization manager object
53999fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
54099fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
54199fa7e03SVijay Mahadevan 
54299fa7e03SVijay Mahadevan   Output Parameter:
54399fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat)
54499fa7e03SVijay Mahadevan 
54599fa7e03SVijay Mahadevan   Level: intermediate
54699fa7e03SVijay Mahadevan 
54799fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
54899fa7e03SVijay Mahadevan 
54999fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
55099fa7e03SVijay Mahadevan @*/
5518cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
5528cbae1a6SVijay Mahadevan {
5538cbae1a6SVijay Mahadevan   PetscInt        i;
5548cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5558cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
5568cbae1a6SVijay Mahadevan 
5578cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5588cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
559*3f1c6e43SVijay Mahadevan   PetscValidPointer(points,3);
5608cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5618cbae1a6SVijay Mahadevan 
5628cbae1a6SVijay Mahadevan   if (!dof) {
5637ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
5648cbae1a6SVijay Mahadevan   }
5658cbae1a6SVijay Mahadevan 
5668cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i)
567*3f1c6e43SVijay Mahadevan     dof[i]=dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart];
5688cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5698cbae1a6SVijay Mahadevan }
5708cbae1a6SVijay Mahadevan 
5718cbae1a6SVijay Mahadevan 
57299fa7e03SVijay Mahadevan /*@C
57399fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlocked - Gets the global 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:
58099fa7e03SVijay Mahadevan + dm     - the discretization manager object
58199fa7e03SVijay Mahadevan 
58299fa7e03SVijay Mahadevan   Output Parameter:
58399fa7e03SVijay Mahadevan + dof - the blocked global 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 .keywords: discretization manager, get, blocked degrees of freedom
58899fa7e03SVijay Mahadevan 
58999fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
59099fa7e03SVijay Mahadevan @*/
5918cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof)
5928cbae1a6SVijay Mahadevan {
5938cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5948cbae1a6SVijay Mahadevan 
5958cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5968cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5978cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5988cbae1a6SVijay Mahadevan 
5998cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
6008cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6018cbae1a6SVijay Mahadevan }
6028cbae1a6SVijay Mahadevan 
6038cbae1a6SVijay Mahadevan 
60499fa7e03SVijay Mahadevan /*@C
60599fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
60699fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
60799fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
60899fa7e03SVijay Mahadevan 
60999fa7e03SVijay Mahadevan   Not Collective
61099fa7e03SVijay Mahadevan 
61199fa7e03SVijay Mahadevan   Input Parameters:
61299fa7e03SVijay Mahadevan + dm     - the discretization manager object
61399fa7e03SVijay Mahadevan 
61499fa7e03SVijay Mahadevan   Output Parameter:
61599fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
61699fa7e03SVijay Mahadevan 
61799fa7e03SVijay Mahadevan   Level: intermediate
61899fa7e03SVijay Mahadevan 
61999fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom
62099fa7e03SVijay Mahadevan 
62199fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
62299fa7e03SVijay Mahadevan @*/
6238cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof)
6248cbae1a6SVijay Mahadevan {
6258cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
6268cbae1a6SVijay Mahadevan 
6278cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6288cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6298cbae1a6SVijay Mahadevan   PetscValidPointer(dof,2);
6308cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6318cbae1a6SVijay Mahadevan 
6328cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
6338cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6348cbae1a6SVijay Mahadevan }
6358cbae1a6SVijay Mahadevan 
636