xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision 7ae5e5b63e531d1144854fb663ae16bda2a50fcf)
1b8ecf6d3SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
28cbae1a6SVijay Mahadevan 
38cbae1a6SVijay Mahadevan #include <petscdmmoab.h>
48cbae1a6SVijay Mahadevan 
58cbae1a6SVijay Mahadevan #undef __FUNCT__
68cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
799fa7e03SVijay Mahadevan /*@C
899fa7e03SVijay Mahadevan   DMMoabSetFieldVector - Sets the vector reference that represents the solution associated
999fa7e03SVijay Mahadevan   with a particular field component.
1099fa7e03SVijay Mahadevan 
1199fa7e03SVijay Mahadevan   Not Collective
1299fa7e03SVijay Mahadevan 
1399fa7e03SVijay Mahadevan   Input Parameters:
1499fa7e03SVijay Mahadevan + dm     - the discretization manager object
1599fa7e03SVijay Mahadevan . ifield - the index of the field as set before via DMMoabSetFieldName.
16b8ecf6d3SVijay Mahadevan . fvec - the Vector solution corresponding to the field (component)
1799fa7e03SVijay Mahadevan 
1899fa7e03SVijay Mahadevan   Level: intermediate
1999fa7e03SVijay Mahadevan 
2099fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution
2199fa7e03SVijay Mahadevan 
2299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetGlobalFieldVector()
2399fa7e03SVijay Mahadevan @*/
248cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
258cbae1a6SVijay Mahadevan {
268cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
278cbae1a6SVijay Mahadevan   moab::Tag     vtag,ntag;
288cbae1a6SVijay Mahadevan   const PetscScalar *varray;
298cbae1a6SVijay Mahadevan   PetscScalar *farray;
308cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
318cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
328cbae1a6SVijay Mahadevan   std::string tag_name;
338cbae1a6SVijay Mahadevan 
348cbae1a6SVijay Mahadevan   PetscFunctionBegin;
358cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
368cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
378cbae1a6SVijay Mahadevan 
38addae81cSVijay 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);
39addae81cSVijay Mahadevan 
408cbae1a6SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
41addae81cSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
428cbae1a6SVijay Mahadevan                                           moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
438cbae1a6SVijay Mahadevan 
448cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
458cbae1a6SVijay Mahadevan 
468cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
478cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
488cbae1a6SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
498cbae1a6SVijay Mahadevan     /* use the entity handle and the Dof index to set the right value */
508cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr);
518cbae1a6SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
528cbae1a6SVijay Mahadevan   }
538cbae1a6SVijay Mahadevan   else {
54*7ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->nloc,&farray);CHKERRQ(ierr);
558cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
568cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr);
578cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
588cbae1a6SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
598cbae1a6SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
608cbae1a6SVijay Mahadevan   }
618cbae1a6SVijay Mahadevan   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);MBERRNM(merr);
628cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
638cbae1a6SVijay Mahadevan }
648cbae1a6SVijay Mahadevan 
658cbae1a6SVijay Mahadevan 
668cbae1a6SVijay Mahadevan #undef __FUNCT__
678cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector"
6899fa7e03SVijay Mahadevan /*@C
6999fa7e03SVijay Mahadevan   DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated
7099fa7e03SVijay Mahadevan   with all fields (components) managed by DM.
7199fa7e03SVijay Mahadevan   A useful utility when updating the DM solution after a solve, to be serialized with the mesh for
7299fa7e03SVijay Mahadevan   checkpointing purposes.
7399fa7e03SVijay Mahadevan 
7499fa7e03SVijay Mahadevan   Not Collective
7599fa7e03SVijay Mahadevan 
7699fa7e03SVijay Mahadevan   Input Parameters:
7799fa7e03SVijay Mahadevan + dm     - the discretization manager object
78b8ecf6d3SVijay Mahadevan . fvec - the global Vector solution corresponding to all the fields managed by DM
7999fa7e03SVijay Mahadevan 
8099fa7e03SVijay Mahadevan   Level: intermediate
8199fa7e03SVijay Mahadevan 
8299fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution
8399fa7e03SVijay Mahadevan 
8499fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector()
8599fa7e03SVijay Mahadevan @*/
868cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
878cbae1a6SVijay Mahadevan {
888cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
898cbae1a6SVijay Mahadevan   moab::Tag     vtag,ntag;
90f28b2503SVijay Mahadevan   const PetscScalar   *rarray;
91f28b2503SVijay Mahadevan   PetscScalar   *varray,*farray;
928cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
938cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
948cbae1a6SVijay Mahadevan   PetscInt i,ifield;
958cbae1a6SVijay Mahadevan   std::string tag_name;
968cbae1a6SVijay Mahadevan   moab::Range::iterator iter;
978cbae1a6SVijay Mahadevan 
988cbae1a6SVijay Mahadevan   PetscFunctionBegin;
998cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1008cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1018cbae1a6SVijay Mahadevan 
1028cbae1a6SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
1038cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
1048cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
105*7ae5e5b6SVijay Mahadevan   ierr = PetscMalloc1(dmmoab->nloc,&farray);CHKERRQ(ierr);
1068cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
1078cbae1a6SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
1088cbae1a6SVijay Mahadevan 
109f28b2503SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&rarray);CHKERRQ(ierr);
110addae81cSVijay Mahadevan     for (ifield=0; ifield<dmmoab->numFields; ++ifield) {
1118cbae1a6SVijay Mahadevan 
1128cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
113addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
1148cbae1a6SVijay Mahadevan                                             moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
1158cbae1a6SVijay Mahadevan 
1168cbae1a6SVijay Mahadevan       for(i=0;i<dmmoab->nloc;i++) {
1178cbae1a6SVijay Mahadevan         if (dmmoab->bs == 1)
118f28b2503SVijay Mahadevan           farray[i]=rarray[ifield*dmmoab->nloc+i];
1198cbae1a6SVijay Mahadevan         else
120f28b2503SVijay Mahadevan           farray[i]=rarray[i*dmmoab->numFields+ifield];
1218cbae1a6SVijay Mahadevan       }
1228cbae1a6SVijay Mahadevan 
1238cbae1a6SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
1248cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
1258cbae1a6SVijay Mahadevan     }
126f28b2503SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&rarray);CHKERRQ(ierr);
1278cbae1a6SVijay Mahadevan   }
1288cbae1a6SVijay Mahadevan   else {
129*7ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->nloc*dmmoab->numFields,&varray);CHKERRQ(ierr);
1308cbae1a6SVijay Mahadevan 
1318cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
1328cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
133addae81cSVijay Mahadevan     for (ifield=0; ifield<dmmoab->numFields; ++ifield) {
1348cbae1a6SVijay Mahadevan 
1358cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
136addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
1378cbae1a6SVijay Mahadevan                                             moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
1388cbae1a6SVijay Mahadevan 
1398cbae1a6SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
1408cbae1a6SVijay Mahadevan       for(i=0; i < dmmoab->nloc; i++) {
141f28b2503SVijay Mahadevan         if (dmmoab->bs == 1)
142f28b2503SVijay Mahadevan           farray[i]=varray[ifield*dmmoab->nloc+i];
143f28b2503SVijay Mahadevan         else
144f28b2503SVijay Mahadevan           farray[i]=varray[i*dmmoab->numFields+ifield];
1458cbae1a6SVijay Mahadevan       }
1468cbae1a6SVijay Mahadevan 
1478cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
1488cbae1a6SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
1498cbae1a6SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
1508cbae1a6SVijay Mahadevan     }
1518cbae1a6SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
1528cbae1a6SVijay Mahadevan   }
1538cbae1a6SVijay Mahadevan   ierr = PetscFree(farray);CHKERRQ(ierr);
1548cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1558cbae1a6SVijay Mahadevan }
1568cbae1a6SVijay Mahadevan 
1578cbae1a6SVijay Mahadevan 
1588cbae1a6SVijay Mahadevan #undef __FUNCT__
15999fa7e03SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldNames"
16099fa7e03SVijay Mahadevan /*@C
16199fa7e03SVijay Mahadevan   DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM
16299fa7e03SVijay Mahadevan 
16399fa7e03SVijay Mahadevan   Not Collective
16499fa7e03SVijay Mahadevan 
16599fa7e03SVijay Mahadevan   Input Parameters:
16699fa7e03SVijay Mahadevan + dm     - the discretization manager object
16799fa7e03SVijay Mahadevan . numFields - the total number of fields
168b8ecf6d3SVijay Mahadevan . fields - the array containing the names of each field (component); Can be NULL.
16999fa7e03SVijay Mahadevan 
17099fa7e03SVijay Mahadevan   Level: intermediate
17199fa7e03SVijay Mahadevan 
17299fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name
17399fa7e03SVijay Mahadevan 
17499fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName()
17599fa7e03SVijay Mahadevan @*/
176f28b2503SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm,PetscInt numFields,const char* fields[])
1778cbae1a6SVijay Mahadevan {
178addae81cSVijay Mahadevan   PetscErrorCode ierr;
179addae81cSVijay Mahadevan   PetscInt       i;
1808cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1818cbae1a6SVijay Mahadevan 
1828cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1838cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1848cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1858cbae1a6SVijay Mahadevan 
186addae81cSVijay Mahadevan   /* first deallocate the existing field structure */
187addae81cSVijay Mahadevan   if (dmmoab->fieldNames) {
188addae81cSVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
189addae81cSVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
190addae81cSVijay Mahadevan     }
191addae81cSVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
192addae81cSVijay Mahadevan   }
193addae81cSVijay Mahadevan 
194addae81cSVijay Mahadevan   /* now re-allocate and assign field names  */
195addae81cSVijay Mahadevan   dmmoab->numFields = numFields;
196f28b2503SVijay Mahadevan   ierr = PetscMalloc(numFields*sizeof(char*),&dmmoab->fieldNames);CHKERRQ(ierr);
197addae81cSVijay Mahadevan   if (fields) {
198addae81cSVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
199addae81cSVijay Mahadevan       ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr);
200addae81cSVijay Mahadevan     }
201addae81cSVijay Mahadevan   }
2028cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2038cbae1a6SVijay Mahadevan }
2048cbae1a6SVijay Mahadevan 
20599fa7e03SVijay Mahadevan 
20699fa7e03SVijay Mahadevan #undef __FUNCT__
20799fa7e03SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldName"
20899fa7e03SVijay Mahadevan /*@C
20999fa7e03SVijay Mahadevan   DMMoabGetFieldName - Gets the names of individual field components in multicomponent
21099fa7e03SVijay Mahadevan   vectors associated with a DMDA.
21199fa7e03SVijay Mahadevan 
21299fa7e03SVijay Mahadevan   Not Collective
21399fa7e03SVijay Mahadevan 
21499fa7e03SVijay Mahadevan   Input Parameter:
21599fa7e03SVijay Mahadevan + dm     - the discretization manager object
216b8ecf6d3SVijay Mahadevan . field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the
21799fa7e03SVijay Mahadevan         number of degrees of freedom per node within the DMMoab
21899fa7e03SVijay Mahadevan 
21999fa7e03SVijay Mahadevan   Output Parameter:
22099fa7e03SVijay Mahadevan . fieldName - the name of the field (component)
22199fa7e03SVijay Mahadevan 
22299fa7e03SVijay Mahadevan   Level: intermediate
22399fa7e03SVijay Mahadevan 
22499fa7e03SVijay Mahadevan .keywords: discretization manager, get, component name
22599fa7e03SVijay Mahadevan 
22699fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields()
22799fa7e03SVijay Mahadevan @*/
22899fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName)
22999fa7e03SVijay Mahadevan {
23099fa7e03SVijay Mahadevan   DM_Moab        *dmmoab;
23199fa7e03SVijay Mahadevan 
23299fa7e03SVijay Mahadevan   PetscFunctionBegin;
23399fa7e03SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
23499fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
23599fa7e03SVijay 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);
23699fa7e03SVijay Mahadevan 
23799fa7e03SVijay Mahadevan   *fieldName = dmmoab->fieldNames[field];
23899fa7e03SVijay Mahadevan   PetscFunctionReturn(0);
23999fa7e03SVijay Mahadevan }
24099fa7e03SVijay Mahadevan 
24199fa7e03SVijay Mahadevan 
242c68c6878SVijay Mahadevan #undef __FUNCT__
243c68c6878SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldName"
244c68c6878SVijay Mahadevan /*@C
24599fa7e03SVijay Mahadevan   DMMoabSetFieldName - Sets the name of a field (component) managed by the DM
246c68c6878SVijay Mahadevan 
247c68c6878SVijay Mahadevan   Not Collective
248c68c6878SVijay Mahadevan 
249c68c6878SVijay Mahadevan   Input Parameters:
25099fa7e03SVijay Mahadevan + dm     - the discretization manager object
251c68c6878SVijay Mahadevan . field - the field number
252b8ecf6d3SVijay Mahadevan . fieldName - the field (component) name
253c68c6878SVijay Mahadevan 
25499fa7e03SVijay Mahadevan   Level: intermediate
25599fa7e03SVijay Mahadevan   Notes: Can only be called after DMMoabSetFields supplied with correct numFields
256c68c6878SVijay Mahadevan 
25799fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name
25899fa7e03SVijay Mahadevan 
25999fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields()
260c68c6878SVijay Mahadevan @*/
2615f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName)
262c68c6878SVijay Mahadevan {
263c68c6878SVijay Mahadevan   PetscErrorCode ierr;
264c68c6878SVijay Mahadevan   DM_Moab        *dmmoab;
265c68c6878SVijay Mahadevan 
266c68c6878SVijay Mahadevan   PetscFunctionBegin;
267c68c6878SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2685f7ae369SVijay Mahadevan   PetscValidCharPointer(fieldName,3);
269c68c6878SVijay Mahadevan 
27099fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
271c68c6878SVijay 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);
27299fa7e03SVijay Mahadevan 
27399fa7e03SVijay Mahadevan   if (dmmoab->fieldNames[field]) {
274c68c6878SVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr);
27599fa7e03SVijay Mahadevan   }
2765f7ae369SVijay Mahadevan   ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr);
277c68c6878SVijay Mahadevan   PetscFunctionReturn(0);
278c68c6878SVijay Mahadevan }
279c68c6878SVijay Mahadevan 
2808cbae1a6SVijay Mahadevan 
2818cbae1a6SVijay Mahadevan #undef __FUNCT__
2828cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
28399fa7e03SVijay Mahadevan /*@C
28499fa7e03SVijay Mahadevan   DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a
28599fa7e03SVijay Mahadevan   particular MOAB EntityHandle.
28699fa7e03SVijay Mahadevan 
28799fa7e03SVijay Mahadevan   Not Collective
28899fa7e03SVijay Mahadevan 
28999fa7e03SVijay Mahadevan   Input Parameters:
29099fa7e03SVijay Mahadevan + dm     - the discretization manager object
29199fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values
292b8ecf6d3SVijay Mahadevan . field - the field (component) index
29399fa7e03SVijay Mahadevan 
29499fa7e03SVijay Mahadevan   Output Parameter:
29599fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat)
29699fa7e03SVijay Mahadevan 
29799fa7e03SVijay Mahadevan   Level: beginner
29899fa7e03SVijay Mahadevan 
29999fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degree of freedom
30099fa7e03SVijay Mahadevan 
30199fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal()
30299fa7e03SVijay Mahadevan @*/
3038cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
3048cbae1a6SVijay Mahadevan {
3058cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3068cbae1a6SVijay Mahadevan 
3078cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3088cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3098cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3108cbae1a6SVijay Mahadevan 
3118cbae1a6SVijay Mahadevan   *dof=dmmoab->gidmap[(PetscInt)point];
3128cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3138cbae1a6SVijay Mahadevan }
3148cbae1a6SVijay Mahadevan 
3158cbae1a6SVijay Mahadevan 
3168cbae1a6SVijay Mahadevan #undef __FUNCT__
3178cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
31899fa7e03SVijay Mahadevan /*@C
31999fa7e03SVijay Mahadevan   DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an
32099fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
32199fa7e03SVijay Mahadevan 
32299fa7e03SVijay Mahadevan   Not Collective
32399fa7e03SVijay Mahadevan 
32499fa7e03SVijay Mahadevan   Input Parameters:
32599fa7e03SVijay Mahadevan + dm     - the discretization manager object
32699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
32799fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
328b8ecf6d3SVijay Mahadevan . field - the field (component) index
32999fa7e03SVijay Mahadevan 
33099fa7e03SVijay Mahadevan   Output Parameter:
33199fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
33299fa7e03SVijay Mahadevan 
33399fa7e03SVijay Mahadevan   Level: intermediate
33499fa7e03SVijay Mahadevan 
33599fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
33699fa7e03SVijay Mahadevan 
33799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal()
33899fa7e03SVijay Mahadevan @*/
3398cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
3408cbae1a6SVijay Mahadevan {
3418cbae1a6SVijay Mahadevan   PetscInt        i;
3428cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3438cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3448cbae1a6SVijay Mahadevan 
3458cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3468cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
34799fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
3488cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3498cbae1a6SVijay Mahadevan 
3508cbae1a6SVijay Mahadevan   if (!dof) {
351*7ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
3528cbae1a6SVijay Mahadevan   }
3538cbae1a6SVijay Mahadevan 
35499fa7e03SVijay Mahadevan   if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */
3558cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
356addae81cSVijay Mahadevan       dof[i] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
3578cbae1a6SVijay Mahadevan   }
3588cbae1a6SVijay Mahadevan   else {
35999fa7e03SVijay Mahadevan     /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
36099fa7e03SVijay Mahadevan     /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3618cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
3628cbae1a6SVijay Mahadevan       dof[i] = dmmoab->gidmap[(PetscInt)points[i]]+field*dmmoab->n;
3638cbae1a6SVijay Mahadevan   }
3648cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3658cbae1a6SVijay Mahadevan }
3668cbae1a6SVijay Mahadevan 
3678cbae1a6SVijay Mahadevan 
3688cbae1a6SVijay Mahadevan #undef __FUNCT__
3698cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal"
37099fa7e03SVijay Mahadevan /*@C
37199fa7e03SVijay Mahadevan   DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an
37299fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
37399fa7e03SVijay Mahadevan 
37499fa7e03SVijay Mahadevan   Not Collective
37599fa7e03SVijay Mahadevan 
37699fa7e03SVijay Mahadevan   Input Parameters:
37799fa7e03SVijay Mahadevan + dm     - the discretization manager object
37899fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
37999fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
380b8ecf6d3SVijay Mahadevan . field - the field (component) index
38199fa7e03SVijay Mahadevan 
38299fa7e03SVijay Mahadevan   Output Parameter:
38399fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
38499fa7e03SVijay Mahadevan 
38599fa7e03SVijay Mahadevan   Level: intermediate
38699fa7e03SVijay Mahadevan 
38799fa7e03SVijay Mahadevan .keywords: discretization manager, get, local degrees of freedom
38899fa7e03SVijay Mahadevan 
38999fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs()
39099fa7e03SVijay Mahadevan @*/
3918cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
3928cbae1a6SVijay Mahadevan {
3938cbae1a6SVijay Mahadevan   PetscInt i,offset;
3948cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3958cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3968cbae1a6SVijay Mahadevan 
3978cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3988cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
39999fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
4008cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4018cbae1a6SVijay Mahadevan 
4028cbae1a6SVijay Mahadevan   if (!dof) {
403*7ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
4048cbae1a6SVijay Mahadevan   }
4058cbae1a6SVijay Mahadevan 
40699fa7e03SVijay Mahadevan   if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */
4078cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
408addae81cSVijay Mahadevan       dof[i] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
4098cbae1a6SVijay Mahadevan   }
4108cbae1a6SVijay Mahadevan   else {
41199fa7e03SVijay Mahadevan     /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
41299fa7e03SVijay Mahadevan     /* TODO: eliminate the limitation using PetscSection to manage DOFs */
41399fa7e03SVijay Mahadevan     offset = field*dmmoab->n;
4148cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
4158cbae1a6SVijay Mahadevan       dof[i] = dmmoab->lidmap[(PetscInt)points[i]]+offset;
4168cbae1a6SVijay Mahadevan   }
4178cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4188cbae1a6SVijay Mahadevan }
4198cbae1a6SVijay Mahadevan 
4208cbae1a6SVijay Mahadevan 
4218cbae1a6SVijay Mahadevan #undef __FUNCT__
4228cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs"
42399fa7e03SVijay Mahadevan /*@C
42499fa7e03SVijay Mahadevan   DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an
42599fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
42699fa7e03SVijay Mahadevan 
42799fa7e03SVijay Mahadevan   Not Collective
42899fa7e03SVijay Mahadevan 
42999fa7e03SVijay Mahadevan   Input Parameters:
43099fa7e03SVijay Mahadevan + dm     - the discretization manager object
43199fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
43299fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
43399fa7e03SVijay Mahadevan 
43499fa7e03SVijay Mahadevan   Output Parameter:
43599fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
43699fa7e03SVijay Mahadevan 
43799fa7e03SVijay Mahadevan   Level: intermediate
43899fa7e03SVijay Mahadevan 
43999fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
44099fa7e03SVijay Mahadevan 
44199fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked()
44299fa7e03SVijay Mahadevan @*/
4438cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
4448cbae1a6SVijay Mahadevan {
4458cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
4468cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
4478cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4488cbae1a6SVijay Mahadevan 
4498cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4508cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
45199fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
4528cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4538cbae1a6SVijay Mahadevan 
4548cbae1a6SVijay Mahadevan   if (!dof) {
455*7ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->numFields*npoints,&dof);CHKERRQ(ierr);
4568cbae1a6SVijay Mahadevan   }
4578cbae1a6SVijay Mahadevan 
45899fa7e03SVijay Mahadevan   if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */
459addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
4608cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
461addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
4628cbae1a6SVijay Mahadevan     }
4638cbae1a6SVijay Mahadevan   }
4648cbae1a6SVijay Mahadevan   else {
46599fa7e03SVijay Mahadevan     /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
46699fa7e03SVijay Mahadevan     /* TODO: eliminate the limitation using PetscSection to manage DOFs */
467addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
46899fa7e03SVijay Mahadevan       offset = field*dmmoab->n;
4698cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
470addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]+offset;
4718cbae1a6SVijay Mahadevan     }
4728cbae1a6SVijay Mahadevan   }
4738cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4748cbae1a6SVijay Mahadevan }
4758cbae1a6SVijay Mahadevan 
4768cbae1a6SVijay Mahadevan 
4778cbae1a6SVijay Mahadevan #undef __FUNCT__
4788cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal"
47999fa7e03SVijay Mahadevan /*@C
48099fa7e03SVijay Mahadevan   DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an
48199fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
48299fa7e03SVijay Mahadevan 
48399fa7e03SVijay Mahadevan   Not Collective
48499fa7e03SVijay Mahadevan 
48599fa7e03SVijay Mahadevan   Input Parameters:
48699fa7e03SVijay Mahadevan + dm     - the discretization manager object
48799fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
48899fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
48999fa7e03SVijay Mahadevan 
49099fa7e03SVijay Mahadevan   Output Parameter:
49199fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
49299fa7e03SVijay Mahadevan 
49399fa7e03SVijay Mahadevan   Level: intermediate
49499fa7e03SVijay Mahadevan 
49599fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
49699fa7e03SVijay Mahadevan 
49799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked()
49899fa7e03SVijay Mahadevan @*/
4998cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
5008cbae1a6SVijay Mahadevan {
5018cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
5028cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
5038cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5048cbae1a6SVijay Mahadevan 
5058cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5068cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
50799fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
5088cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5098cbae1a6SVijay Mahadevan 
5108cbae1a6SVijay Mahadevan   if (!dof) {
511*7ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(dmmoab->numFields*npoints,&dof);CHKERRQ(ierr);
5128cbae1a6SVijay Mahadevan   }
5138cbae1a6SVijay Mahadevan 
51499fa7e03SVijay Mahadevan   if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */
515addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
5168cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
517addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
5188cbae1a6SVijay Mahadevan     }
5198cbae1a6SVijay Mahadevan   }
5208cbae1a6SVijay Mahadevan   else {
52199fa7e03SVijay Mahadevan     /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
52299fa7e03SVijay Mahadevan     /* TODO: eliminate the limitation using PetscSection to manage DOFs */
523addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
52499fa7e03SVijay Mahadevan       offset = field*dmmoab->n;
5258cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
526addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]+offset;
5278cbae1a6SVijay Mahadevan     }
5288cbae1a6SVijay Mahadevan   }
5298cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5308cbae1a6SVijay Mahadevan }
5318cbae1a6SVijay Mahadevan 
5328cbae1a6SVijay Mahadevan 
5338cbae1a6SVijay Mahadevan #undef __FUNCT__
5348cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked"
53599fa7e03SVijay Mahadevan /*@C
53699fa7e03SVijay Mahadevan   DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
53799fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing 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 global 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 DMMoabGetDofsBlocked(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);
5648cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
5658cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5668cbae1a6SVijay Mahadevan 
5678cbae1a6SVijay Mahadevan   if (!dof) {
568*7ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
5698cbae1a6SVijay Mahadevan   }
5708cbae1a6SVijay Mahadevan 
5718cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i) {
5728cbae1a6SVijay Mahadevan     dof[i]=dmmoab->gidmap[(PetscInt)points[i]];
5738cbae1a6SVijay Mahadevan   }
5748cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5758cbae1a6SVijay Mahadevan }
5768cbae1a6SVijay Mahadevan 
5778cbae1a6SVijay Mahadevan 
5788cbae1a6SVijay Mahadevan #undef __FUNCT__
5798cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal"
58099fa7e03SVijay Mahadevan /*@C
58199fa7e03SVijay Mahadevan   DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
58299fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation
58399fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
58499fa7e03SVijay Mahadevan 
58599fa7e03SVijay Mahadevan   Not Collective
58699fa7e03SVijay Mahadevan 
58799fa7e03SVijay Mahadevan   Input Parameters:
58899fa7e03SVijay Mahadevan + dm     - the discretization manager object
58999fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
59099fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
59199fa7e03SVijay Mahadevan 
59299fa7e03SVijay Mahadevan   Output Parameter:
59399fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat)
59499fa7e03SVijay Mahadevan 
59599fa7e03SVijay Mahadevan   Level: intermediate
59699fa7e03SVijay Mahadevan 
59799fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
59899fa7e03SVijay Mahadevan 
59999fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
60099fa7e03SVijay Mahadevan @*/
6018cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
6028cbae1a6SVijay Mahadevan {
6038cbae1a6SVijay Mahadevan   PetscInt        i;
6048cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
6058cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
6068cbae1a6SVijay Mahadevan 
6078cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6088cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6098cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
6108cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6118cbae1a6SVijay Mahadevan 
6128cbae1a6SVijay Mahadevan   if (!dof) {
613*7ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr);
6148cbae1a6SVijay Mahadevan   }
6158cbae1a6SVijay Mahadevan 
6168cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i)
6178cbae1a6SVijay Mahadevan     dof[i] = dmmoab->lidmap[(PetscInt)points[i]];
6188cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6198cbae1a6SVijay Mahadevan }
6208cbae1a6SVijay Mahadevan 
6218cbae1a6SVijay Mahadevan 
6228cbae1a6SVijay Mahadevan #undef __FUNCT__
6238cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlocked"
62499fa7e03SVijay Mahadevan /*@C
62599fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
62699fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
62799fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
62899fa7e03SVijay Mahadevan 
62999fa7e03SVijay Mahadevan   Not Collective
63099fa7e03SVijay Mahadevan 
63199fa7e03SVijay Mahadevan   Input Parameters:
63299fa7e03SVijay Mahadevan + dm     - the discretization manager object
63399fa7e03SVijay Mahadevan 
63499fa7e03SVijay Mahadevan   Output Parameter:
63599fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
63699fa7e03SVijay Mahadevan 
63799fa7e03SVijay Mahadevan   Level: intermediate
63899fa7e03SVijay Mahadevan 
63999fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom
64099fa7e03SVijay Mahadevan 
64199fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
64299fa7e03SVijay Mahadevan @*/
6438cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof)
6448cbae1a6SVijay Mahadevan {
6458cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
6468cbae1a6SVijay Mahadevan 
6478cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6488cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6498cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6508cbae1a6SVijay Mahadevan 
6518cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
6528cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6538cbae1a6SVijay Mahadevan }
6548cbae1a6SVijay Mahadevan 
6558cbae1a6SVijay Mahadevan 
6568cbae1a6SVijay Mahadevan #undef __FUNCT__
6578cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlockedLocal"
65899fa7e03SVijay Mahadevan /*@C
65999fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
66099fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
66199fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
66299fa7e03SVijay Mahadevan 
66399fa7e03SVijay Mahadevan   Not Collective
66499fa7e03SVijay Mahadevan 
66599fa7e03SVijay Mahadevan   Input Parameters:
66699fa7e03SVijay Mahadevan + dm     - the discretization manager object
66799fa7e03SVijay Mahadevan 
66899fa7e03SVijay Mahadevan   Output Parameter:
66999fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
67099fa7e03SVijay Mahadevan 
67199fa7e03SVijay Mahadevan   Level: intermediate
67299fa7e03SVijay Mahadevan 
67399fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom
67499fa7e03SVijay Mahadevan 
67599fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
67699fa7e03SVijay Mahadevan @*/
6778cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof)
6788cbae1a6SVijay Mahadevan {
6798cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
6808cbae1a6SVijay Mahadevan 
6818cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6828cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6838cbae1a6SVijay Mahadevan   PetscValidPointer(dof,2);
6848cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6858cbae1a6SVijay Mahadevan 
6868cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
6878cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6888cbae1a6SVijay Mahadevan }
6898cbae1a6SVijay Mahadevan 
690