xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
28cbae1a6SVijay Mahadevan 
38cbae1a6SVijay Mahadevan #include <petscdmmoab.h>
48cbae1a6SVijay Mahadevan 
599fa7e03SVijay Mahadevan /*@C
699fa7e03SVijay Mahadevan   DMMoabSetFieldVector - Sets the vector reference that represents the solution associated
799fa7e03SVijay Mahadevan   with a particular field component.
899fa7e03SVijay Mahadevan 
999fa7e03SVijay Mahadevan   Not Collective
1099fa7e03SVijay Mahadevan 
1199fa7e03SVijay Mahadevan   Input Parameters:
1299fa7e03SVijay Mahadevan + dm     - the discretization manager object
1399fa7e03SVijay Mahadevan . ifield - the index of the field as set before via DMMoabSetFieldName.
14a2b725a8SWilliam Gropp - fvec - the Vector solution corresponding to the field (component)
1599fa7e03SVijay Mahadevan 
1699fa7e03SVijay Mahadevan   Level: intermediate
1799fa7e03SVijay Mahadevan 
18db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetGlobalFieldVector()`
1999fa7e03SVijay Mahadevan @*/
209371c9d4SSatish Balay PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) {
218cbae1a6SVijay Mahadevan   DM_Moab           *dmmoab;
228cbae1a6SVijay Mahadevan   moab::Tag          vtag, ntag;
238cbae1a6SVijay Mahadevan   const PetscScalar *varray;
248cbae1a6SVijay Mahadevan   PetscScalar       *farray;
258cbae1a6SVijay Mahadevan   moab::ErrorCode    merr;
268cbae1a6SVijay Mahadevan   std::string        tag_name;
278cbae1a6SVijay Mahadevan 
288cbae1a6SVijay Mahadevan   PetscFunctionBegin;
298cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
308cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
318cbae1a6SVijay Mahadevan 
3208401ef6SPierre Jolivet   PetscCheck(!(ifield < 0) && !(ifield >= dmmoab->numFields), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "The field %d should be positive and less than %d.", ifield, dmmoab->numFields);
33addae81cSVijay Mahadevan 
348cbae1a6SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
359371c9d4SSatish Balay   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, moab::MB_TAG_DENSE | moab::MB_TAG_CREAT);
369371c9d4SSatish Balay   MBERRNM(merr);
378cbae1a6SVijay Mahadevan 
389566063dSJacob Faibussowitsch   PetscCall(DMMoabGetVecTag(fvec, &vtag));
398cbae1a6SVijay Mahadevan 
408cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
418cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr != moab::MB_SUCCESS) {
429566063dSJacob Faibussowitsch     PetscCall(VecGetArrayRead(fvec, &varray));
438cbae1a6SVijay Mahadevan     /* use the entity handle and the Dof index to set the right value */
449371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)varray);
459371c9d4SSatish Balay     MBERRNM(merr);
469566063dSJacob Faibussowitsch     PetscCall(VecRestoreArrayRead(fvec, &varray));
471baa6e33SBarry Smith   } else {
489566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(dmmoab->nloc, &farray));
498cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
509371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void *)farray);
519371c9d4SSatish Balay     MBERRNM(merr);
529371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)farray);
539371c9d4SSatish Balay     MBERRNM(merr);
548cbae1a6SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
559566063dSJacob Faibussowitsch     PetscCall(PetscFree(farray));
568cbae1a6SVijay Mahadevan   }
579daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
589371c9d4SSatish Balay   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);
599371c9d4SSatish Balay   MBERRNM(merr);
609daf19fdSVijay Mahadevan #endif
618cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
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
74a2b725a8SWilliam Gropp - fvec - the global Vector solution corresponding to all the fields managed by DM
7599fa7e03SVijay Mahadevan 
7699fa7e03SVijay Mahadevan   Level: intermediate
7799fa7e03SVijay Mahadevan 
78db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFieldVector()`
7999fa7e03SVijay Mahadevan @*/
809371c9d4SSatish Balay PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) {
818cbae1a6SVijay Mahadevan   DM_Moab              *dmmoab;
828cbae1a6SVijay Mahadevan   moab::Tag             vtag, ntag;
83f28b2503SVijay Mahadevan   const PetscScalar    *rarray;
84f28b2503SVijay Mahadevan   PetscScalar          *varray, *farray;
858cbae1a6SVijay Mahadevan   moab::ErrorCode       merr;
868cbae1a6SVijay Mahadevan   PetscInt              i, ifield;
878cbae1a6SVijay Mahadevan   std::string           tag_name;
888cbae1a6SVijay Mahadevan   moab::Range::iterator iter;
898cbae1a6SVijay Mahadevan 
908cbae1a6SVijay Mahadevan   PetscFunctionBegin;
918cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
928cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
938cbae1a6SVijay Mahadevan 
948cbae1a6SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
959566063dSJacob Faibussowitsch   PetscCall(DMMoabGetVecTag(fvec, &vtag));
968cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
979566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(dmmoab->nloc, &farray));
988cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr != moab::MB_SUCCESS) {
998cbae1a6SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
1009566063dSJacob Faibussowitsch     PetscCall(VecGetArrayRead(fvec, &rarray));
101addae81cSVijay Mahadevan     for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
1028cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
1039371c9d4SSatish Balay       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, moab::MB_TAG_DENSE | moab::MB_TAG_CREAT);
1049371c9d4SSatish Balay       MBERRNM(merr);
1058cbae1a6SVijay Mahadevan 
1069371c9d4SSatish Balay       for (i = 0; i < dmmoab->nloc; i++) { farray[i] = (dmmoab->bs == 1 ? rarray[ifield * dmmoab->nloc + i] : rarray[i * dmmoab->numFields + ifield]); }
1078cbae1a6SVijay Mahadevan 
1088cbae1a6SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
1099371c9d4SSatish Balay       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)farray);
1109371c9d4SSatish Balay       MBERRNM(merr);
1118cbae1a6SVijay Mahadevan     }
1129566063dSJacob Faibussowitsch     PetscCall(VecRestoreArrayRead(fvec, &rarray));
1131baa6e33SBarry Smith   } else {
1149566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(dmmoab->nloc * dmmoab->numFields, &varray));
1158cbae1a6SVijay Mahadevan 
1168cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
1179371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void *)varray);
1189371c9d4SSatish Balay     MBERRNM(merr);
119addae81cSVijay Mahadevan     for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
1208cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
1219371c9d4SSatish Balay       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, moab::MB_TAG_DENSE | moab::MB_TAG_CREAT);
1229371c9d4SSatish Balay       MBERRNM(merr);
1238cbae1a6SVijay Mahadevan 
1248cbae1a6SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
1259371c9d4SSatish Balay       for (i = 0; i < dmmoab->nloc; i++) { farray[i] = (dmmoab->bs == 1 ? varray[ifield * dmmoab->nloc + i] : varray[i * dmmoab->numFields + ifield]); }
1268cbae1a6SVijay Mahadevan 
1279371c9d4SSatish Balay       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)farray);
1289371c9d4SSatish Balay       MBERRNM(merr);
1299daf19fdSVijay Mahadevan 
1309daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1318cbae1a6SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
1329371c9d4SSatish Balay       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);
1339371c9d4SSatish Balay       MBERRNM(merr);
1349daf19fdSVijay Mahadevan #endif
1358cbae1a6SVijay Mahadevan     }
1369566063dSJacob Faibussowitsch     PetscCall(PetscFree(varray));
1378cbae1a6SVijay Mahadevan   }
1389566063dSJacob Faibussowitsch   PetscCall(PetscFree(farray));
1398cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1408cbae1a6SVijay Mahadevan }
1418cbae1a6SVijay Mahadevan 
14299fa7e03SVijay Mahadevan /*@C
14399fa7e03SVijay Mahadevan   DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM
14499fa7e03SVijay Mahadevan 
14599fa7e03SVijay Mahadevan   Not Collective
14699fa7e03SVijay Mahadevan 
14799fa7e03SVijay Mahadevan   Input Parameters:
14899fa7e03SVijay Mahadevan + dm     - the discretization manager object
14999fa7e03SVijay Mahadevan . numFields - the total number of fields
150a2b725a8SWilliam Gropp - fields - the array containing the names of each field (component); Can be NULL.
15199fa7e03SVijay Mahadevan 
15299fa7e03SVijay Mahadevan   Level: intermediate
15399fa7e03SVijay Mahadevan 
154db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFieldName()`
15599fa7e03SVijay Mahadevan @*/
1569371c9d4SSatish Balay PetscErrorCode DMMoabSetFieldNames(DM dm, PetscInt numFields, const char *fields[]) {
157addae81cSVijay Mahadevan   PetscInt i;
1588cbae1a6SVijay Mahadevan   DM_Moab *dmmoab;
1598cbae1a6SVijay Mahadevan 
1608cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1618cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1628cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
1638cbae1a6SVijay Mahadevan 
164addae81cSVijay Mahadevan   /* first deallocate the existing field structure */
165addae81cSVijay Mahadevan   if (dmmoab->fieldNames) {
166*48a46eb9SPierre Jolivet     for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscFree(dmmoab->fieldNames[i]));
1679566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->fieldNames));
168addae81cSVijay Mahadevan   }
169addae81cSVijay Mahadevan 
170addae81cSVijay Mahadevan   /* now re-allocate and assign field names  */
171addae81cSVijay Mahadevan   dmmoab->numFields = numFields;
1729566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(numFields, &dmmoab->fieldNames));
173addae81cSVijay Mahadevan   if (fields) {
174*48a46eb9SPierre Jolivet     for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscStrallocpy(fields[i], (char **)&dmmoab->fieldNames[i]));
175addae81cSVijay Mahadevan   }
1769566063dSJacob Faibussowitsch   PetscCall(DMSetNumFields(dm, numFields));
1778cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1788cbae1a6SVijay Mahadevan }
1798cbae1a6SVijay Mahadevan 
18099fa7e03SVijay Mahadevan /*@C
18199fa7e03SVijay Mahadevan   DMMoabGetFieldName - Gets the names of individual field components in multicomponent
18299fa7e03SVijay Mahadevan   vectors associated with a DMDA.
18399fa7e03SVijay Mahadevan 
18499fa7e03SVijay Mahadevan   Not Collective
18599fa7e03SVijay Mahadevan 
186d8d19677SJose E. Roman   Input Parameters:
18799fa7e03SVijay Mahadevan + dm     - the discretization manager object
188a2b725a8SWilliam Gropp - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the
18999fa7e03SVijay Mahadevan         number of degrees of freedom per node within the DMMoab
19099fa7e03SVijay Mahadevan 
19199fa7e03SVijay Mahadevan   Output Parameter:
19299fa7e03SVijay Mahadevan . fieldName - the name of the field (component)
19399fa7e03SVijay Mahadevan 
19499fa7e03SVijay Mahadevan   Level: intermediate
19599fa7e03SVijay Mahadevan 
196db781477SPatrick Sanan .seealso: `DMMoabSetFieldName()`, `DMMoabSetFields()`
19799fa7e03SVijay Mahadevan @*/
1989371c9d4SSatish Balay PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName) {
19999fa7e03SVijay Mahadevan   DM_Moab *dmmoab;
20099fa7e03SVijay Mahadevan 
20199fa7e03SVijay Mahadevan   PetscFunctionBegin;
20299fa7e03SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
20399fa7e03SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
20408401ef6SPierre Jolivet   PetscCheck(!(field < 0) && !(field >= dmmoab->numFields), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields);
20599fa7e03SVijay Mahadevan 
20699fa7e03SVijay Mahadevan   *fieldName = dmmoab->fieldNames[field];
20799fa7e03SVijay Mahadevan   PetscFunctionReturn(0);
20899fa7e03SVijay Mahadevan }
20999fa7e03SVijay Mahadevan 
210c68c6878SVijay Mahadevan /*@C
21199fa7e03SVijay Mahadevan   DMMoabSetFieldName - Sets the name of a field (component) managed by the DM
212c68c6878SVijay Mahadevan 
213c68c6878SVijay Mahadevan   Not Collective
214c68c6878SVijay Mahadevan 
215c68c6878SVijay Mahadevan   Input Parameters:
21699fa7e03SVijay Mahadevan + dm     - the discretization manager object
217c68c6878SVijay Mahadevan . field - the field number
218a2b725a8SWilliam Gropp - fieldName - the field (component) name
219c68c6878SVijay Mahadevan 
22099fa7e03SVijay Mahadevan   Level: intermediate
22195452b02SPatrick Sanan   Notes:
22295452b02SPatrick Sanan     Can only be called after DMMoabSetFields supplied with correct numFields
223c68c6878SVijay Mahadevan 
224db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFields()`
225c68c6878SVijay Mahadevan @*/
2269371c9d4SSatish Balay PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName) {
227c68c6878SVijay Mahadevan   DM_Moab *dmmoab;
228c68c6878SVijay Mahadevan 
229c68c6878SVijay Mahadevan   PetscFunctionBegin;
230c68c6878SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2315f7ae369SVijay Mahadevan   PetscValidCharPointer(fieldName, 3);
232c68c6878SVijay Mahadevan 
23399fa7e03SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
23408401ef6SPierre Jolivet   PetscCheck(!(field < 0) && !(field >= dmmoab->numFields), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields);
23599fa7e03SVijay Mahadevan 
236*48a46eb9SPierre Jolivet   if (dmmoab->fieldNames[field]) PetscCall(PetscFree(dmmoab->fieldNames[field]));
2379566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(fieldName, (char **)&dmmoab->fieldNames[field]));
238c68c6878SVijay Mahadevan   PetscFunctionReturn(0);
239c68c6878SVijay Mahadevan }
240c68c6878SVijay Mahadevan 
24199fa7e03SVijay Mahadevan /*@C
24299fa7e03SVijay Mahadevan   DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a
24399fa7e03SVijay Mahadevan   particular MOAB EntityHandle.
24499fa7e03SVijay Mahadevan 
24599fa7e03SVijay Mahadevan   Not Collective
24699fa7e03SVijay Mahadevan 
24799fa7e03SVijay Mahadevan   Input Parameters:
24899fa7e03SVijay Mahadevan + dm     - the discretization manager object
24999fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values
250a2b725a8SWilliam Gropp - field - the field (component) index
25199fa7e03SVijay Mahadevan 
25299fa7e03SVijay Mahadevan   Output Parameter:
253a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat)
25499fa7e03SVijay Mahadevan 
25599fa7e03SVijay Mahadevan   Level: beginner
25699fa7e03SVijay Mahadevan 
257db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetFieldDofsLocal()`
25899fa7e03SVijay Mahadevan @*/
2599371c9d4SSatish Balay PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt *dof) {
2608cbae1a6SVijay Mahadevan   DM_Moab *dmmoab;
2618cbae1a6SVijay Mahadevan 
2628cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2638cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2648cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
2658cbae1a6SVijay Mahadevan 
2669371c9d4SSatish Balay   *dof = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] + field * dmmoab->n : dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] * dmmoab->numFields + field);
2678cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2688cbae1a6SVijay Mahadevan }
2698cbae1a6SVijay Mahadevan 
27099fa7e03SVijay Mahadevan /*@C
27199fa7e03SVijay Mahadevan   DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an
27299fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
27399fa7e03SVijay Mahadevan 
27499fa7e03SVijay Mahadevan   Not Collective
27599fa7e03SVijay Mahadevan 
27699fa7e03SVijay Mahadevan   Input Parameters:
27799fa7e03SVijay Mahadevan + dm     - the discretization manager object
27899fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
27999fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
280a2b725a8SWilliam Gropp - field - the field (component) index
28199fa7e03SVijay Mahadevan 
28299fa7e03SVijay Mahadevan   Output Parameter:
283a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
28499fa7e03SVijay Mahadevan 
28599fa7e03SVijay Mahadevan   Level: intermediate
28699fa7e03SVijay Mahadevan 
287db781477SPatrick Sanan .seealso: `DMMoabGetFieldDof()`, `DMMoabGetFieldDofsLocal()`
28899fa7e03SVijay Mahadevan @*/
2899371c9d4SSatish Balay PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt field, PetscInt *dof) {
2908cbae1a6SVijay Mahadevan   PetscInt i;
2918cbae1a6SVijay Mahadevan   DM_Moab *dmmoab;
2928cbae1a6SVijay Mahadevan 
2938cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2948cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
29599fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
2968cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
2978cbae1a6SVijay Mahadevan 
298*48a46eb9SPierre Jolivet   if (!dof) PetscCall(PetscMalloc1(npoints, &dof));
2998cbae1a6SVijay Mahadevan 
3003f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
3013f1c6e43SVijay 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 */
30299fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3038cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i)
3049371c9d4SSatish Balay     dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n : dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field);
3058cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3068cbae1a6SVijay Mahadevan }
3078cbae1a6SVijay Mahadevan 
30899fa7e03SVijay Mahadevan /*@C
30999fa7e03SVijay Mahadevan   DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an
31099fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
31199fa7e03SVijay Mahadevan 
31299fa7e03SVijay Mahadevan   Not Collective
31399fa7e03SVijay Mahadevan 
31499fa7e03SVijay Mahadevan   Input Parameters:
31599fa7e03SVijay Mahadevan + dm     - the discretization manager object
31699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
31799fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
318a2b725a8SWilliam Gropp - field - the field (component) index
31999fa7e03SVijay Mahadevan 
32099fa7e03SVijay Mahadevan   Output Parameter:
321a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
32299fa7e03SVijay Mahadevan 
32399fa7e03SVijay Mahadevan   Level: intermediate
32499fa7e03SVijay Mahadevan 
325db781477SPatrick Sanan .seealso: `DMMoabGetFieldDof()`, `DMMoabGetFieldDofs()`
32699fa7e03SVijay Mahadevan @*/
3279371c9d4SSatish Balay PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt field, PetscInt *dof) {
3283f1c6e43SVijay Mahadevan   PetscInt i;
3298cbae1a6SVijay Mahadevan   DM_Moab *dmmoab;
3308cbae1a6SVijay Mahadevan 
3318cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3328cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
33399fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3348cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
3358cbae1a6SVijay Mahadevan 
336*48a46eb9SPierre Jolivet   if (!dof) PetscCall(PetscMalloc1(npoints, &dof));
3378cbae1a6SVijay Mahadevan 
3383f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
33999fa7e03SVijay Mahadevan   /* 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 */
3413f1c6e43SVijay Mahadevan   for (i = 0; i < npoints; ++i) {
3429371c9d4SSatish Balay     dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n);
3438cbae1a6SVijay Mahadevan   }
3448cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3458cbae1a6SVijay Mahadevan }
3468cbae1a6SVijay Mahadevan 
34799fa7e03SVijay Mahadevan /*@C
34899fa7e03SVijay Mahadevan   DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an
34999fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
35099fa7e03SVijay Mahadevan 
35199fa7e03SVijay Mahadevan   Not Collective
35299fa7e03SVijay Mahadevan 
35399fa7e03SVijay Mahadevan   Input Parameters:
35499fa7e03SVijay Mahadevan + dm     - the discretization manager object
35599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
356a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
35799fa7e03SVijay Mahadevan 
35899fa7e03SVijay Mahadevan   Output Parameter:
359a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
36099fa7e03SVijay Mahadevan 
36199fa7e03SVijay Mahadevan   Level: intermediate
36299fa7e03SVijay Mahadevan 
363db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetDofsLocal()`, `DMMoabGetDofsBlocked()`
36499fa7e03SVijay Mahadevan @*/
3659371c9d4SSatish Balay PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) {
3668cbae1a6SVijay Mahadevan   PetscInt i, field, offset;
3678cbae1a6SVijay Mahadevan   DM_Moab *dmmoab;
3688cbae1a6SVijay Mahadevan 
3698cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3708cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
37199fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3728cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
3738cbae1a6SVijay Mahadevan 
374*48a46eb9SPierre Jolivet   if (!dof) PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof));
3758cbae1a6SVijay Mahadevan 
3763f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
37799fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
37899fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
379addae81cSVijay Mahadevan   for (field = 0; field < dmmoab->numFields; ++field) {
38099fa7e03SVijay Mahadevan     offset = field * dmmoab->n;
3818cbae1a6SVijay Mahadevan     for (i = 0; i < npoints; ++i)
3829371c9d4SSatish Balay       dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset);
3838cbae1a6SVijay Mahadevan   }
3848cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3858cbae1a6SVijay Mahadevan }
3868cbae1a6SVijay Mahadevan 
38799fa7e03SVijay Mahadevan /*@C
38899fa7e03SVijay Mahadevan   DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an
38999fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
39099fa7e03SVijay Mahadevan 
39199fa7e03SVijay Mahadevan   Not Collective
39299fa7e03SVijay Mahadevan 
39399fa7e03SVijay Mahadevan   Input Parameters:
39499fa7e03SVijay Mahadevan + dm     - the discretization manager object
39599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
396a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
39799fa7e03SVijay Mahadevan 
39899fa7e03SVijay Mahadevan   Output Parameter:
399a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
40099fa7e03SVijay Mahadevan 
40199fa7e03SVijay Mahadevan   Level: intermediate
40299fa7e03SVijay Mahadevan 
403db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlocked()`
40499fa7e03SVijay Mahadevan @*/
4059371c9d4SSatish Balay PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) {
4068cbae1a6SVijay Mahadevan   PetscInt i, field, offset;
4078cbae1a6SVijay Mahadevan   DM_Moab *dmmoab;
4088cbae1a6SVijay Mahadevan 
4098cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4108cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
41199fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
4128cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
4138cbae1a6SVijay Mahadevan 
414*48a46eb9SPierre Jolivet   if (!dof) PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof));
4158cbae1a6SVijay Mahadevan 
4163f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
41799fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
41899fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
419addae81cSVijay Mahadevan   for (field = 0; field < dmmoab->numFields; ++field) {
42099fa7e03SVijay Mahadevan     offset = field * dmmoab->n;
4218cbae1a6SVijay Mahadevan     for (i = 0; i < npoints; ++i)
4229371c9d4SSatish Balay       dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset);
4238cbae1a6SVijay Mahadevan   }
4248cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4258cbae1a6SVijay Mahadevan }
4268cbae1a6SVijay Mahadevan 
42799fa7e03SVijay Mahadevan /*@C
42899fa7e03SVijay Mahadevan   DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
42999fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation
43099fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
43199fa7e03SVijay Mahadevan 
43299fa7e03SVijay Mahadevan   Not Collective
43399fa7e03SVijay Mahadevan 
43499fa7e03SVijay Mahadevan   Input Parameters:
43599fa7e03SVijay Mahadevan + dm     - the discretization manager object
43699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
437a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
43899fa7e03SVijay Mahadevan 
43999fa7e03SVijay Mahadevan   Output Parameter:
440a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat)
44199fa7e03SVijay Mahadevan 
44299fa7e03SVijay Mahadevan   Level: intermediate
44399fa7e03SVijay Mahadevan 
444db781477SPatrick Sanan .seealso: `DMMoabGetDofsLocal()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlockedLocal()`
44599fa7e03SVijay Mahadevan @*/
4469371c9d4SSatish Balay PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) {
4478cbae1a6SVijay Mahadevan   PetscInt i;
4488cbae1a6SVijay Mahadevan   DM_Moab *dmmoab;
4498cbae1a6SVijay Mahadevan 
4508cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4518cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4523f1c6e43SVijay Mahadevan   PetscValidPointer(points, 3);
4538cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
4548cbae1a6SVijay Mahadevan 
455*48a46eb9SPierre Jolivet   if (!dof) PetscCall(PetscMalloc1(npoints, &dof));
4568cbae1a6SVijay Mahadevan 
4579371c9d4SSatish Balay   for (i = 0; i < npoints; ++i) { dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart]; }
4588cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4598cbae1a6SVijay Mahadevan }
4608cbae1a6SVijay Mahadevan 
46199fa7e03SVijay Mahadevan /*@C
46299fa7e03SVijay Mahadevan   DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
46399fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation
46499fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
46599fa7e03SVijay Mahadevan 
46699fa7e03SVijay Mahadevan   Not Collective
46799fa7e03SVijay Mahadevan 
46899fa7e03SVijay Mahadevan   Input Parameters:
46999fa7e03SVijay Mahadevan + dm     - the discretization manager object
47099fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
471a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
47299fa7e03SVijay Mahadevan 
47399fa7e03SVijay Mahadevan   Output Parameter:
474a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat)
47599fa7e03SVijay Mahadevan 
47699fa7e03SVijay Mahadevan   Level: intermediate
47799fa7e03SVijay Mahadevan 
478db781477SPatrick Sanan .seealso: `DMMoabGetDofsLocal()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlockedLocal()`
47999fa7e03SVijay Mahadevan @*/
4809371c9d4SSatish Balay PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) {
4818cbae1a6SVijay Mahadevan   PetscInt i;
4828cbae1a6SVijay Mahadevan   DM_Moab *dmmoab;
4838cbae1a6SVijay Mahadevan 
4848cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4858cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4863f1c6e43SVijay Mahadevan   PetscValidPointer(points, 3);
4878cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
4888cbae1a6SVijay Mahadevan 
4899566063dSJacob Faibussowitsch   if (!dof) PetscCall(PetscMalloc1(npoints, &dof));
4908cbae1a6SVijay Mahadevan 
4915f80ce2aSJacob Faibussowitsch   for (i = 0; i < npoints; ++i) dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart];
4928cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4938cbae1a6SVijay Mahadevan }
4948cbae1a6SVijay Mahadevan 
49599fa7e03SVijay Mahadevan /*@C
49699fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
49799fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
49899fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
49999fa7e03SVijay Mahadevan 
50099fa7e03SVijay Mahadevan   Not Collective
50199fa7e03SVijay Mahadevan 
50299fa7e03SVijay Mahadevan   Input Parameters:
503a2b725a8SWilliam Gropp . dm     - the discretization manager object
50499fa7e03SVijay Mahadevan 
50599fa7e03SVijay Mahadevan   Output Parameter:
506a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
50799fa7e03SVijay Mahadevan 
50899fa7e03SVijay Mahadevan   Level: intermediate
50999fa7e03SVijay Mahadevan 
510db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlockedLocal()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()`
51199fa7e03SVijay Mahadevan @*/
5129371c9d4SSatish Balay PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt **dof) {
5138cbae1a6SVijay Mahadevan   DM_Moab *dmmoab;
5148cbae1a6SVijay Mahadevan 
5158cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5168cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5178cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
5188cbae1a6SVijay Mahadevan 
5198cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
5208cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5218cbae1a6SVijay Mahadevan }
5228cbae1a6SVijay Mahadevan 
52399fa7e03SVijay Mahadevan /*@C
52499fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
52599fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
52699fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
52799fa7e03SVijay Mahadevan 
52899fa7e03SVijay Mahadevan   Not Collective
52999fa7e03SVijay Mahadevan 
53099fa7e03SVijay Mahadevan   Input Parameters:
531a2b725a8SWilliam Gropp . dm     - the discretization manager object
53299fa7e03SVijay Mahadevan 
53399fa7e03SVijay Mahadevan   Output Parameter:
534a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
53599fa7e03SVijay Mahadevan 
53699fa7e03SVijay Mahadevan   Level: intermediate
53799fa7e03SVijay Mahadevan 
538db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlocked()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()`
53999fa7e03SVijay Mahadevan @*/
5409371c9d4SSatish Balay PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt **dof) {
5418cbae1a6SVijay Mahadevan   DM_Moab *dmmoab;
5428cbae1a6SVijay Mahadevan 
5438cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5448cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5458cbae1a6SVijay Mahadevan   PetscValidPointer(dof, 2);
5468cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
5478cbae1a6SVijay Mahadevan 
5488cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
5498cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5508cbae1a6SVijay Mahadevan }
551