xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision 9daf19fd0d22011a060902ed53673b48ac0c4e7d)
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   }
59*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
608cbae1a6SVijay Mahadevan   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);MBERRNM(merr);
61*9daf19fdSVijay 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
76b8ecf6d3SVijay Mahadevan . 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);
139*9daf19fdSVijay Mahadevan 
140*9daf19fdSVijay 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);
143*9daf19fdSVijay 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
160b8ecf6d3SVijay Mahadevan . 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   }
1948cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1958cbae1a6SVijay Mahadevan }
1968cbae1a6SVijay Mahadevan 
19799fa7e03SVijay Mahadevan 
19899fa7e03SVijay Mahadevan /*@C
19999fa7e03SVijay Mahadevan   DMMoabGetFieldName - Gets the names of individual field components in multicomponent
20099fa7e03SVijay Mahadevan   vectors associated with a DMDA.
20199fa7e03SVijay Mahadevan 
20299fa7e03SVijay Mahadevan   Not Collective
20399fa7e03SVijay Mahadevan 
20499fa7e03SVijay Mahadevan   Input Parameter:
20599fa7e03SVijay Mahadevan + dm     - the discretization manager object
206b8ecf6d3SVijay Mahadevan . field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the
20799fa7e03SVijay Mahadevan         number of degrees of freedom per node within the DMMoab
20899fa7e03SVijay Mahadevan 
20999fa7e03SVijay Mahadevan   Output Parameter:
21099fa7e03SVijay Mahadevan . fieldName - the name of the field (component)
21199fa7e03SVijay Mahadevan 
21299fa7e03SVijay Mahadevan   Level: intermediate
21399fa7e03SVijay Mahadevan 
21499fa7e03SVijay Mahadevan .keywords: discretization manager, get, component name
21599fa7e03SVijay Mahadevan 
21699fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields()
21799fa7e03SVijay Mahadevan @*/
21899fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName)
21999fa7e03SVijay Mahadevan {
22099fa7e03SVijay Mahadevan   DM_Moab        *dmmoab;
22199fa7e03SVijay Mahadevan 
22299fa7e03SVijay Mahadevan   PetscFunctionBegin;
22399fa7e03SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
22499fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
22599fa7e03SVijay 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);
22699fa7e03SVijay Mahadevan 
22799fa7e03SVijay Mahadevan   *fieldName = dmmoab->fieldNames[field];
22899fa7e03SVijay Mahadevan   PetscFunctionReturn(0);
22999fa7e03SVijay Mahadevan }
23099fa7e03SVijay Mahadevan 
23199fa7e03SVijay Mahadevan 
232c68c6878SVijay Mahadevan /*@C
23399fa7e03SVijay Mahadevan   DMMoabSetFieldName - Sets the name of a field (component) managed by the DM
234c68c6878SVijay Mahadevan 
235c68c6878SVijay Mahadevan   Not Collective
236c68c6878SVijay Mahadevan 
237c68c6878SVijay Mahadevan   Input Parameters:
23899fa7e03SVijay Mahadevan + dm     - the discretization manager object
239c68c6878SVijay Mahadevan . field - the field number
240b8ecf6d3SVijay Mahadevan . fieldName - the field (component) name
241c68c6878SVijay Mahadevan 
24299fa7e03SVijay Mahadevan   Level: intermediate
24399fa7e03SVijay Mahadevan   Notes: Can only be called after DMMoabSetFields supplied with correct numFields
244c68c6878SVijay Mahadevan 
24599fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name
24699fa7e03SVijay Mahadevan 
24799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields()
248c68c6878SVijay Mahadevan @*/
2495f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName)
250c68c6878SVijay Mahadevan {
251c68c6878SVijay Mahadevan   PetscErrorCode ierr;
252c68c6878SVijay Mahadevan   DM_Moab        *dmmoab;
253c68c6878SVijay Mahadevan 
254c68c6878SVijay Mahadevan   PetscFunctionBegin;
255c68c6878SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2565f7ae369SVijay Mahadevan   PetscValidCharPointer(fieldName,3);
257c68c6878SVijay Mahadevan 
25899fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
259c68c6878SVijay 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);
26099fa7e03SVijay Mahadevan 
26199fa7e03SVijay Mahadevan   if (dmmoab->fieldNames[field]) {
262c68c6878SVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr);
26399fa7e03SVijay Mahadevan   }
2645f7ae369SVijay Mahadevan   ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr);
265c68c6878SVijay Mahadevan   PetscFunctionReturn(0);
266c68c6878SVijay Mahadevan }
267c68c6878SVijay Mahadevan 
2688cbae1a6SVijay Mahadevan 
26999fa7e03SVijay Mahadevan /*@C
27099fa7e03SVijay Mahadevan   DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a
27199fa7e03SVijay Mahadevan   particular MOAB EntityHandle.
27299fa7e03SVijay Mahadevan 
27399fa7e03SVijay Mahadevan   Not Collective
27499fa7e03SVijay Mahadevan 
27599fa7e03SVijay Mahadevan   Input Parameters:
27699fa7e03SVijay Mahadevan + dm     - the discretization manager object
27799fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values
278b8ecf6d3SVijay Mahadevan . field - the field (component) index
27999fa7e03SVijay Mahadevan 
28099fa7e03SVijay Mahadevan   Output Parameter:
28199fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat)
28299fa7e03SVijay Mahadevan 
28399fa7e03SVijay Mahadevan   Level: beginner
28499fa7e03SVijay Mahadevan 
28599fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degree of freedom
28699fa7e03SVijay Mahadevan 
28799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal()
28899fa7e03SVijay Mahadevan @*/
2898cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
2908cbae1a6SVijay Mahadevan {
2918cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2928cbae1a6SVijay Mahadevan 
2938cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2948cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2958cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2968cbae1a6SVijay Mahadevan 
2973f1c6e43SVijay Mahadevan   *dof=dmmoab->gidmap[((PetscInt)point-dmmoab->seqstart)]*dmmoab->numFields+field;
2988cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2998cbae1a6SVijay Mahadevan }
3008cbae1a6SVijay Mahadevan 
3018cbae1a6SVijay Mahadevan 
30299fa7e03SVijay Mahadevan /*@C
30399fa7e03SVijay Mahadevan   DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an
30499fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
30599fa7e03SVijay Mahadevan 
30699fa7e03SVijay Mahadevan   Not Collective
30799fa7e03SVijay Mahadevan 
30899fa7e03SVijay Mahadevan   Input Parameters:
30999fa7e03SVijay Mahadevan + dm     - the discretization manager object
31099fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
31199fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
312b8ecf6d3SVijay Mahadevan . field - the field (component) index
31399fa7e03SVijay Mahadevan 
31499fa7e03SVijay Mahadevan   Output Parameter:
31599fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
31699fa7e03SVijay Mahadevan 
31799fa7e03SVijay Mahadevan   Level: intermediate
31899fa7e03SVijay Mahadevan 
31999fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
32099fa7e03SVijay Mahadevan 
32199fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal()
32299fa7e03SVijay Mahadevan @*/
3238cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
3248cbae1a6SVijay Mahadevan {
3258cbae1a6SVijay Mahadevan   PetscInt        i;
3268cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3278cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3288cbae1a6SVijay Mahadevan 
3298cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3308cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
33199fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
3328cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3338cbae1a6SVijay Mahadevan 
3348cbae1a6SVijay Mahadevan   if (!dof) {
3357ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
3368cbae1a6SVijay Mahadevan   }
3378cbae1a6SVijay Mahadevan 
3383f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
3393f1c6e43SVijay 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 */
34099fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3418cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i)
3423f1c6e43SVijay Mahadevan     dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]+field*dmmoab->n :
3433f1c6e43SVijay Mahadevan                                 dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field);
3448cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3458cbae1a6SVijay Mahadevan }
3468cbae1a6SVijay Mahadevan 
3478cbae1a6SVijay Mahadevan 
34899fa7e03SVijay Mahadevan /*@C
34999fa7e03SVijay Mahadevan   DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an
35099fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
35199fa7e03SVijay Mahadevan 
35299fa7e03SVijay Mahadevan   Not Collective
35399fa7e03SVijay Mahadevan 
35499fa7e03SVijay Mahadevan   Input Parameters:
35599fa7e03SVijay Mahadevan + dm     - the discretization manager object
35699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
35799fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
358b8ecf6d3SVijay Mahadevan . field - the field (component) index
35999fa7e03SVijay Mahadevan 
36099fa7e03SVijay Mahadevan   Output Parameter:
36199fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
36299fa7e03SVijay Mahadevan 
36399fa7e03SVijay Mahadevan   Level: intermediate
36499fa7e03SVijay Mahadevan 
36599fa7e03SVijay Mahadevan .keywords: discretization manager, get, local degrees of freedom
36699fa7e03SVijay Mahadevan 
36799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs()
36899fa7e03SVijay Mahadevan @*/
3698cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
3708cbae1a6SVijay Mahadevan {
3713f1c6e43SVijay Mahadevan   PetscInt i;
3728cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3738cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3748cbae1a6SVijay Mahadevan 
3758cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3768cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
37799fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
3788cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3798cbae1a6SVijay Mahadevan 
3808cbae1a6SVijay Mahadevan   if (!dof) {
3817ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
3828cbae1a6SVijay Mahadevan   }
3838cbae1a6SVijay Mahadevan 
3843f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
38599fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
38699fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3873f1c6e43SVijay Mahadevan   for (i=0; i<npoints; ++i) {
3883f1c6e43SVijay Mahadevan     dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field :
3893f1c6e43SVijay Mahadevan                                dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]+field*dmmoab->n);
3908cbae1a6SVijay Mahadevan   }
3918cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3928cbae1a6SVijay Mahadevan }
3938cbae1a6SVijay Mahadevan 
3948cbae1a6SVijay Mahadevan 
39599fa7e03SVijay Mahadevan /*@C
39699fa7e03SVijay Mahadevan   DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an
39799fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
39899fa7e03SVijay Mahadevan 
39999fa7e03SVijay Mahadevan   Not Collective
40099fa7e03SVijay Mahadevan 
40199fa7e03SVijay Mahadevan   Input Parameters:
40299fa7e03SVijay Mahadevan + dm     - the discretization manager object
40399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
40499fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
40599fa7e03SVijay Mahadevan 
40699fa7e03SVijay Mahadevan   Output Parameter:
40799fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
40899fa7e03SVijay Mahadevan 
40999fa7e03SVijay Mahadevan   Level: intermediate
41099fa7e03SVijay Mahadevan 
41199fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
41299fa7e03SVijay Mahadevan 
41399fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked()
41499fa7e03SVijay Mahadevan @*/
4158cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
4168cbae1a6SVijay Mahadevan {
4178cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
4188cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
4198cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4208cbae1a6SVijay Mahadevan 
4218cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4228cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
42399fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
4248cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4258cbae1a6SVijay Mahadevan 
4268cbae1a6SVijay Mahadevan   if (!dof) {
4277ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->numFields*npoints,&dof);CHKERRQ(ierr);
4288cbae1a6SVijay Mahadevan   }
4298cbae1a6SVijay Mahadevan 
4303f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
43199fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
43299fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
433addae81cSVijay Mahadevan   for (field=0; field<dmmoab->numFields; ++field) {
43499fa7e03SVijay Mahadevan     offset = field*dmmoab->n;
4358cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
4363f1c6e43SVijay Mahadevan       dof[i*dmmoab->numFields+field] = (dmmoab->bs > 1 ? dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field :
4373f1c6e43SVijay Mahadevan                                                          dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]+offset);
4388cbae1a6SVijay Mahadevan   }
4398cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4408cbae1a6SVijay Mahadevan }
4418cbae1a6SVijay Mahadevan 
4423f1c6e43SVijay Mahadevan #undef __FUNCT__
4433f1c6e43SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal"
44499fa7e03SVijay Mahadevan /*@C
44599fa7e03SVijay Mahadevan   DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an
44699fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
44799fa7e03SVijay Mahadevan 
44899fa7e03SVijay Mahadevan   Not Collective
44999fa7e03SVijay Mahadevan 
45099fa7e03SVijay Mahadevan   Input Parameters:
45199fa7e03SVijay Mahadevan + dm     - the discretization manager object
45299fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
45399fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
45499fa7e03SVijay Mahadevan 
45599fa7e03SVijay Mahadevan   Output Parameter:
45699fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
45799fa7e03SVijay Mahadevan 
45899fa7e03SVijay Mahadevan   Level: intermediate
45999fa7e03SVijay Mahadevan 
46099fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
46199fa7e03SVijay Mahadevan 
46299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked()
46399fa7e03SVijay Mahadevan @*/
4648cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
4658cbae1a6SVijay Mahadevan {
4668cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
4678cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
4688cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4698cbae1a6SVijay Mahadevan 
4708cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4718cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
47299fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
4738cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4748cbae1a6SVijay Mahadevan 
4758cbae1a6SVijay Mahadevan   if (!dof) {
4767ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->numFields*npoints,&dof);CHKERRQ(ierr);
4778cbae1a6SVijay Mahadevan   }
4788cbae1a6SVijay Mahadevan 
4793f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
48099fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
48199fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
482addae81cSVijay Mahadevan   for (field=0; field<dmmoab->numFields; ++field) {
48399fa7e03SVijay Mahadevan     offset = field*dmmoab->n;
4848cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
4853f1c6e43SVijay Mahadevan       dof[i*dmmoab->numFields+field] = (dmmoab->bs > 1 ? dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field :
4863f1c6e43SVijay Mahadevan                                                          dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]+offset);
4878cbae1a6SVijay Mahadevan   }
4888cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4898cbae1a6SVijay Mahadevan }
4908cbae1a6SVijay Mahadevan 
4918cbae1a6SVijay Mahadevan 
49299fa7e03SVijay Mahadevan /*@C
49399fa7e03SVijay Mahadevan   DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
49499fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation
49599fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
49699fa7e03SVijay Mahadevan 
49799fa7e03SVijay Mahadevan   Not Collective
49899fa7e03SVijay Mahadevan 
49999fa7e03SVijay Mahadevan   Input Parameters:
50099fa7e03SVijay Mahadevan + dm     - the discretization manager object
50199fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
50299fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
50399fa7e03SVijay Mahadevan 
50499fa7e03SVijay Mahadevan   Output Parameter:
50599fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat)
50699fa7e03SVijay Mahadevan 
50799fa7e03SVijay Mahadevan   Level: intermediate
50899fa7e03SVijay Mahadevan 
50999fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
51099fa7e03SVijay Mahadevan 
51199fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
51299fa7e03SVijay Mahadevan @*/
5138cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
5148cbae1a6SVijay Mahadevan {
5158cbae1a6SVijay Mahadevan   PetscInt        i;
5168cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5178cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
5188cbae1a6SVijay Mahadevan 
5198cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5208cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5213f1c6e43SVijay Mahadevan   PetscValidPointer(points,3);
5228cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5238cbae1a6SVijay Mahadevan 
5248cbae1a6SVijay Mahadevan   if (!dof) {
5257ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
5268cbae1a6SVijay Mahadevan   }
5278cbae1a6SVijay Mahadevan 
5288cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i) {
5293f1c6e43SVijay Mahadevan     dof[i]=dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart];
5308cbae1a6SVijay Mahadevan   }
5318cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5328cbae1a6SVijay Mahadevan }
5338cbae1a6SVijay Mahadevan 
5348cbae1a6SVijay Mahadevan 
53599fa7e03SVijay Mahadevan /*@C
53699fa7e03SVijay Mahadevan   DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
53799fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation
53899fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
53999fa7e03SVijay Mahadevan 
54099fa7e03SVijay Mahadevan   Not Collective
54199fa7e03SVijay Mahadevan 
54299fa7e03SVijay Mahadevan   Input Parameters:
54399fa7e03SVijay Mahadevan + dm     - the discretization manager object
54499fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
54599fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
54699fa7e03SVijay Mahadevan 
54799fa7e03SVijay Mahadevan   Output Parameter:
54899fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat)
54999fa7e03SVijay Mahadevan 
55099fa7e03SVijay Mahadevan   Level: intermediate
55199fa7e03SVijay Mahadevan 
55299fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
55399fa7e03SVijay Mahadevan 
55499fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
55599fa7e03SVijay Mahadevan @*/
5568cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
5578cbae1a6SVijay Mahadevan {
5588cbae1a6SVijay Mahadevan   PetscInt        i;
5598cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5608cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
5618cbae1a6SVijay Mahadevan 
5628cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5638cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5643f1c6e43SVijay Mahadevan   PetscValidPointer(points,3);
5658cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5668cbae1a6SVijay Mahadevan 
5678cbae1a6SVijay Mahadevan   if (!dof) {
5687ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
5698cbae1a6SVijay Mahadevan   }
5708cbae1a6SVijay Mahadevan 
5718cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i)
5723f1c6e43SVijay Mahadevan     dof[i]=dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart];
5738cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5748cbae1a6SVijay Mahadevan }
5758cbae1a6SVijay Mahadevan 
5768cbae1a6SVijay Mahadevan 
57799fa7e03SVijay Mahadevan /*@C
57899fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
57999fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
58099fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
58199fa7e03SVijay Mahadevan 
58299fa7e03SVijay Mahadevan   Not Collective
58399fa7e03SVijay Mahadevan 
58499fa7e03SVijay Mahadevan   Input Parameters:
58599fa7e03SVijay Mahadevan + dm     - the discretization manager object
58699fa7e03SVijay Mahadevan 
58799fa7e03SVijay Mahadevan   Output Parameter:
58899fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
58999fa7e03SVijay Mahadevan 
59099fa7e03SVijay Mahadevan   Level: intermediate
59199fa7e03SVijay Mahadevan 
59299fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom
59399fa7e03SVijay Mahadevan 
59499fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
59599fa7e03SVijay Mahadevan @*/
5968cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof)
5978cbae1a6SVijay Mahadevan {
5988cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5998cbae1a6SVijay Mahadevan 
6008cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6018cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6028cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6038cbae1a6SVijay Mahadevan 
6048cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
6058cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6068cbae1a6SVijay Mahadevan }
6078cbae1a6SVijay Mahadevan 
6088cbae1a6SVijay Mahadevan 
60999fa7e03SVijay Mahadevan /*@C
61099fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
61199fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
61299fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
61399fa7e03SVijay Mahadevan 
61499fa7e03SVijay Mahadevan   Not Collective
61599fa7e03SVijay Mahadevan 
61699fa7e03SVijay Mahadevan   Input Parameters:
61799fa7e03SVijay Mahadevan + dm     - the discretization manager object
61899fa7e03SVijay Mahadevan 
61999fa7e03SVijay Mahadevan   Output Parameter:
62099fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
62199fa7e03SVijay Mahadevan 
62299fa7e03SVijay Mahadevan   Level: intermediate
62399fa7e03SVijay Mahadevan 
62499fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom
62599fa7e03SVijay Mahadevan 
62699fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
62799fa7e03SVijay Mahadevan @*/
6288cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof)
6298cbae1a6SVijay Mahadevan {
6308cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
6318cbae1a6SVijay Mahadevan 
6328cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6338cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6348cbae1a6SVijay Mahadevan   PetscValidPointer(dof,2);
6358cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6368cbae1a6SVijay Mahadevan 
6378cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
6388cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6398cbae1a6SVijay Mahadevan }
6408cbae1a6SVijay Mahadevan 
641