xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision 08401ef684002a709c6d3db98a0c9f54a8bcf1ec)
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 
1899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetGlobalFieldVector()
1999fa7e03SVijay Mahadevan @*/
208cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
218cbae1a6SVijay Mahadevan {
228cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
238cbae1a6SVijay Mahadevan   moab::Tag     vtag, ntag;
248cbae1a6SVijay Mahadevan   const PetscScalar *varray;
258cbae1a6SVijay Mahadevan   PetscScalar *farray;
268cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
278cbae1a6SVijay Mahadevan   std::string tag_name;
288cbae1a6SVijay Mahadevan 
298cbae1a6SVijay Mahadevan   PetscFunctionBegin;
308cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
318cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
328cbae1a6SVijay Mahadevan 
33*08401ef6SPierre 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);
34addae81cSVijay Mahadevan 
358cbae1a6SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
36addae81cSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
378cbae1a6SVijay Mahadevan                                          moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
388cbae1a6SVijay Mahadevan 
399566063dSJacob Faibussowitsch   PetscCall(DMMoabGetVecTag(fvec, &vtag));
408cbae1a6SVijay Mahadevan 
418cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
428cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr != moab::MB_SUCCESS) {
439566063dSJacob Faibussowitsch     PetscCall(VecGetArrayRead(fvec, &varray));
448cbae1a6SVijay Mahadevan     /* use the entity handle and the Dof index to set the right value */
458cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray); MBERRNM(merr);
469566063dSJacob Faibussowitsch     PetscCall(VecRestoreArrayRead(fvec, &varray));
478cbae1a6SVijay Mahadevan   }
488cbae1a6SVijay Mahadevan   else {
499566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(dmmoab->nloc, &farray));
508cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
518cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray); MBERRNM(merr);
528cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
538cbae1a6SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
549566063dSJacob Faibussowitsch     PetscCall(PetscFree(farray));
558cbae1a6SVijay Mahadevan   }
569daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
578cbae1a6SVijay Mahadevan   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned); MBERRNM(merr);
589daf19fdSVijay Mahadevan #endif
598cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
608cbae1a6SVijay Mahadevan }
618cbae1a6SVijay Mahadevan 
6299fa7e03SVijay Mahadevan /*@C
6399fa7e03SVijay Mahadevan   DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated
6499fa7e03SVijay Mahadevan   with all fields (components) managed by DM.
6599fa7e03SVijay Mahadevan   A useful utility when updating the DM solution after a solve, to be serialized with the mesh for
6699fa7e03SVijay Mahadevan   checkpointing purposes.
6799fa7e03SVijay Mahadevan 
6899fa7e03SVijay Mahadevan   Not Collective
6999fa7e03SVijay Mahadevan 
7099fa7e03SVijay Mahadevan   Input Parameters:
7199fa7e03SVijay Mahadevan + dm     - the discretization manager object
72a2b725a8SWilliam Gropp - fvec - the global Vector solution corresponding to all the fields managed by DM
7399fa7e03SVijay Mahadevan 
7499fa7e03SVijay Mahadevan   Level: intermediate
7599fa7e03SVijay Mahadevan 
7699fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector()
7799fa7e03SVijay Mahadevan @*/
788cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
798cbae1a6SVijay Mahadevan {
808cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
818cbae1a6SVijay Mahadevan   moab::Tag     vtag, ntag;
82f28b2503SVijay Mahadevan   const PetscScalar   *rarray;
83f28b2503SVijay Mahadevan   PetscScalar   *varray, *farray;
848cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
858cbae1a6SVijay Mahadevan   PetscInt i, ifield;
868cbae1a6SVijay Mahadevan   std::string tag_name;
878cbae1a6SVijay Mahadevan   moab::Range::iterator iter;
888cbae1a6SVijay Mahadevan 
898cbae1a6SVijay Mahadevan   PetscFunctionBegin;
908cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
918cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
928cbae1a6SVijay Mahadevan 
938cbae1a6SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
949566063dSJacob Faibussowitsch   PetscCall(DMMoabGetVecTag(fvec, &vtag));
958cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
969566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(dmmoab->nloc, &farray));
978cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr != moab::MB_SUCCESS) {
988cbae1a6SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
999566063dSJacob Faibussowitsch     PetscCall(VecGetArrayRead(fvec, &rarray));
100addae81cSVijay Mahadevan     for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
1018cbae1a6SVijay Mahadevan 
1028cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
103addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
1048cbae1a6SVijay Mahadevan                                              moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
1058cbae1a6SVijay Mahadevan 
1068cbae1a6SVijay Mahadevan       for (i = 0; i < dmmoab->nloc; i++) {
1073f1c6e43SVijay Mahadevan         farray[i] = (dmmoab->bs == 1 ? rarray[ifield * dmmoab->nloc + i] : rarray[i * dmmoab->numFields + ifield]);
1088cbae1a6SVijay Mahadevan       }
1098cbae1a6SVijay Mahadevan 
1108cbae1a6SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
1118cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
1128cbae1a6SVijay Mahadevan     }
1139566063dSJacob Faibussowitsch     PetscCall(VecRestoreArrayRead(fvec, &rarray));
1148cbae1a6SVijay Mahadevan   }
1158cbae1a6SVijay Mahadevan   else {
1169566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(dmmoab->nloc * dmmoab->numFields, &varray));
1178cbae1a6SVijay Mahadevan 
1188cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
1198cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray); MBERRNM(merr);
120addae81cSVijay Mahadevan     for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
1218cbae1a6SVijay Mahadevan 
1228cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
123addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
1248cbae1a6SVijay Mahadevan                                              moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
1258cbae1a6SVijay Mahadevan 
1268cbae1a6SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
1278cbae1a6SVijay Mahadevan       for (i = 0; i < dmmoab->nloc; i++) {
1283f1c6e43SVijay Mahadevan         farray[i] = (dmmoab->bs == 1 ? varray[ifield * dmmoab->nloc + i] : varray[i * dmmoab->numFields + ifield]);
1298cbae1a6SVijay Mahadevan       }
1308cbae1a6SVijay Mahadevan 
1318cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
1329daf19fdSVijay Mahadevan 
1339daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1348cbae1a6SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
1358cbae1a6SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal); MBERRNM(merr);
1369daf19fdSVijay Mahadevan #endif
1378cbae1a6SVijay Mahadevan     }
1389566063dSJacob Faibussowitsch     PetscCall(PetscFree(varray));
1398cbae1a6SVijay Mahadevan   }
1409566063dSJacob Faibussowitsch   PetscCall(PetscFree(farray));
1418cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1428cbae1a6SVijay Mahadevan }
1438cbae1a6SVijay Mahadevan 
14499fa7e03SVijay Mahadevan /*@C
14599fa7e03SVijay Mahadevan   DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM
14699fa7e03SVijay Mahadevan 
14799fa7e03SVijay Mahadevan   Not Collective
14899fa7e03SVijay Mahadevan 
14999fa7e03SVijay Mahadevan   Input Parameters:
15099fa7e03SVijay Mahadevan + dm     - the discretization manager object
15199fa7e03SVijay Mahadevan . numFields - the total number of fields
152a2b725a8SWilliam Gropp - fields - the array containing the names of each field (component); Can be NULL.
15399fa7e03SVijay Mahadevan 
15499fa7e03SVijay Mahadevan   Level: intermediate
15599fa7e03SVijay Mahadevan 
15699fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName()
15799fa7e03SVijay Mahadevan @*/
158f28b2503SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm, PetscInt numFields, const char* fields[])
1598cbae1a6SVijay Mahadevan {
160addae81cSVijay Mahadevan   PetscInt       i;
1618cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1628cbae1a6SVijay Mahadevan 
1638cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1648cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1658cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1668cbae1a6SVijay Mahadevan 
167addae81cSVijay Mahadevan   /* first deallocate the existing field structure */
168addae81cSVijay Mahadevan   if (dmmoab->fieldNames) {
169addae81cSVijay Mahadevan     for (i = 0; i < dmmoab->numFields; i++) {
1709566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->fieldNames[i]));
171addae81cSVijay Mahadevan     }
1729566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->fieldNames));
173addae81cSVijay Mahadevan   }
174addae81cSVijay Mahadevan 
175addae81cSVijay Mahadevan   /* now re-allocate and assign field names  */
176addae81cSVijay Mahadevan   dmmoab->numFields = numFields;
1779566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(numFields, &dmmoab->fieldNames));
178addae81cSVijay Mahadevan   if (fields) {
179addae81cSVijay Mahadevan     for (i = 0; i < dmmoab->numFields; i++) {
1809566063dSJacob Faibussowitsch       PetscCall(PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]));
181addae81cSVijay Mahadevan     }
182addae81cSVijay Mahadevan   }
1839566063dSJacob Faibussowitsch   PetscCall(DMSetNumFields(dm, numFields));
1848cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1858cbae1a6SVijay Mahadevan }
1868cbae1a6SVijay Mahadevan 
18799fa7e03SVijay Mahadevan /*@C
18899fa7e03SVijay Mahadevan   DMMoabGetFieldName - Gets the names of individual field components in multicomponent
18999fa7e03SVijay Mahadevan   vectors associated with a DMDA.
19099fa7e03SVijay Mahadevan 
19199fa7e03SVijay Mahadevan   Not Collective
19299fa7e03SVijay Mahadevan 
193d8d19677SJose E. Roman   Input Parameters:
19499fa7e03SVijay Mahadevan + dm     - the discretization manager object
195a2b725a8SWilliam Gropp - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the
19699fa7e03SVijay Mahadevan         number of degrees of freedom per node within the DMMoab
19799fa7e03SVijay Mahadevan 
19899fa7e03SVijay Mahadevan   Output Parameter:
19999fa7e03SVijay Mahadevan . fieldName - the name of the field (component)
20099fa7e03SVijay Mahadevan 
20199fa7e03SVijay Mahadevan   Level: intermediate
20299fa7e03SVijay Mahadevan 
20399fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields()
20499fa7e03SVijay Mahadevan @*/
20599fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName)
20699fa7e03SVijay Mahadevan {
20799fa7e03SVijay Mahadevan   DM_Moab        *dmmoab;
20899fa7e03SVijay Mahadevan 
20999fa7e03SVijay Mahadevan   PetscFunctionBegin;
21099fa7e03SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
21199fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
212*08401ef6SPierre 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);
21399fa7e03SVijay Mahadevan 
21499fa7e03SVijay Mahadevan   *fieldName = dmmoab->fieldNames[field];
21599fa7e03SVijay Mahadevan   PetscFunctionReturn(0);
21699fa7e03SVijay Mahadevan }
21799fa7e03SVijay Mahadevan 
218c68c6878SVijay Mahadevan /*@C
21999fa7e03SVijay Mahadevan   DMMoabSetFieldName - Sets the name of a field (component) managed by the DM
220c68c6878SVijay Mahadevan 
221c68c6878SVijay Mahadevan   Not Collective
222c68c6878SVijay Mahadevan 
223c68c6878SVijay Mahadevan   Input Parameters:
22499fa7e03SVijay Mahadevan + dm     - the discretization manager object
225c68c6878SVijay Mahadevan . field - the field number
226a2b725a8SWilliam Gropp - fieldName - the field (component) name
227c68c6878SVijay Mahadevan 
22899fa7e03SVijay Mahadevan   Level: intermediate
22995452b02SPatrick Sanan   Notes:
23095452b02SPatrick Sanan     Can only be called after DMMoabSetFields supplied with correct numFields
231c68c6878SVijay Mahadevan 
23299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields()
233c68c6878SVijay Mahadevan @*/
2345f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName)
235c68c6878SVijay Mahadevan {
236c68c6878SVijay Mahadevan   DM_Moab        *dmmoab;
237c68c6878SVijay Mahadevan 
238c68c6878SVijay Mahadevan   PetscFunctionBegin;
239c68c6878SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2405f7ae369SVijay Mahadevan   PetscValidCharPointer(fieldName, 3);
241c68c6878SVijay Mahadevan 
24299fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
243*08401ef6SPierre 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);
24499fa7e03SVijay Mahadevan 
24599fa7e03SVijay Mahadevan   if (dmmoab->fieldNames[field]) {
2469566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->fieldNames[field]));
24799fa7e03SVijay Mahadevan   }
2489566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]));
249c68c6878SVijay Mahadevan   PetscFunctionReturn(0);
250c68c6878SVijay Mahadevan }
251c68c6878SVijay Mahadevan 
25299fa7e03SVijay Mahadevan /*@C
25399fa7e03SVijay Mahadevan   DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a
25499fa7e03SVijay Mahadevan   particular MOAB EntityHandle.
25599fa7e03SVijay Mahadevan 
25699fa7e03SVijay Mahadevan   Not Collective
25799fa7e03SVijay Mahadevan 
25899fa7e03SVijay Mahadevan   Input Parameters:
25999fa7e03SVijay Mahadevan + dm     - the discretization manager object
26099fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values
261a2b725a8SWilliam Gropp - field - the field (component) index
26299fa7e03SVijay Mahadevan 
26399fa7e03SVijay Mahadevan   Output Parameter:
264a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat)
26599fa7e03SVijay Mahadevan 
26699fa7e03SVijay Mahadevan   Level: beginner
26799fa7e03SVijay Mahadevan 
26899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal()
26999fa7e03SVijay Mahadevan @*/
2708cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt* dof)
2718cbae1a6SVijay Mahadevan {
2728cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2738cbae1a6SVijay Mahadevan 
2748cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2758cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2768cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2778cbae1a6SVijay Mahadevan 
278e92d1c7cSVijay Mahadevan   *dof = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] + field * dmmoab->n :
279e92d1c7cSVijay Mahadevan               dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] * dmmoab->numFields + field);
2808cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2818cbae1a6SVijay Mahadevan }
2828cbae1a6SVijay Mahadevan 
28399fa7e03SVijay Mahadevan /*@C
28499fa7e03SVijay Mahadevan   DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an
28599fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
28699fa7e03SVijay Mahadevan 
28799fa7e03SVijay Mahadevan   Not Collective
28899fa7e03SVijay Mahadevan 
28999fa7e03SVijay Mahadevan   Input Parameters:
29099fa7e03SVijay Mahadevan + dm     - the discretization manager object
29199fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
29299fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
293a2b725a8SWilliam Gropp - field - the field (component) index
29499fa7e03SVijay Mahadevan 
29599fa7e03SVijay Mahadevan   Output Parameter:
296a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
29799fa7e03SVijay Mahadevan 
29899fa7e03SVijay Mahadevan   Level: intermediate
29999fa7e03SVijay Mahadevan 
30099fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal()
30199fa7e03SVijay Mahadevan @*/
3028cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof)
3038cbae1a6SVijay Mahadevan {
3048cbae1a6SVijay Mahadevan   PetscInt        i;
3058cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3068cbae1a6SVijay Mahadevan 
3078cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3088cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
30999fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3108cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3118cbae1a6SVijay Mahadevan 
3128cbae1a6SVijay Mahadevan   if (!dof) {
3139566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(npoints, &dof));
3148cbae1a6SVijay Mahadevan   }
3158cbae1a6SVijay Mahadevan 
3163f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
3173f1c6e43SVijay 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 */
31899fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3198cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i)
320e92d1c7cSVijay Mahadevan     dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n :
321e92d1c7cSVijay Mahadevan               dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field);
3228cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3238cbae1a6SVijay Mahadevan }
3248cbae1a6SVijay Mahadevan 
32599fa7e03SVijay Mahadevan /*@C
32699fa7e03SVijay Mahadevan   DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an
32799fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
32899fa7e03SVijay Mahadevan 
32999fa7e03SVijay Mahadevan   Not Collective
33099fa7e03SVijay Mahadevan 
33199fa7e03SVijay Mahadevan   Input Parameters:
33299fa7e03SVijay Mahadevan + dm     - the discretization manager object
33399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
33499fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
335a2b725a8SWilliam Gropp - field - the field (component) index
33699fa7e03SVijay Mahadevan 
33799fa7e03SVijay Mahadevan   Output Parameter:
338a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
33999fa7e03SVijay Mahadevan 
34099fa7e03SVijay Mahadevan   Level: intermediate
34199fa7e03SVijay Mahadevan 
34299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs()
34399fa7e03SVijay Mahadevan @*/
3448cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof)
3458cbae1a6SVijay Mahadevan {
3463f1c6e43SVijay Mahadevan   PetscInt i;
3478cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3488cbae1a6SVijay Mahadevan 
3498cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3508cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
35199fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3528cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3538cbae1a6SVijay Mahadevan 
3548cbae1a6SVijay Mahadevan   if (!dof) {
3559566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(npoints, &dof));
3568cbae1a6SVijay Mahadevan   }
3578cbae1a6SVijay Mahadevan 
3583f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
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 */
3613f1c6e43SVijay Mahadevan   for (i = 0; i < npoints; ++i) {
362e92d1c7cSVijay Mahadevan     dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
363e92d1c7cSVijay Mahadevan               dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n);
3648cbae1a6SVijay Mahadevan   }
3658cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3668cbae1a6SVijay Mahadevan }
3678cbae1a6SVijay Mahadevan 
36899fa7e03SVijay Mahadevan /*@C
36999fa7e03SVijay Mahadevan   DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an
37099fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
37199fa7e03SVijay Mahadevan 
37299fa7e03SVijay Mahadevan   Not Collective
37399fa7e03SVijay Mahadevan 
37499fa7e03SVijay Mahadevan   Input Parameters:
37599fa7e03SVijay Mahadevan + dm     - the discretization manager object
37699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
377a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
37899fa7e03SVijay Mahadevan 
37999fa7e03SVijay Mahadevan   Output Parameter:
380a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
38199fa7e03SVijay Mahadevan 
38299fa7e03SVijay Mahadevan   Level: intermediate
38399fa7e03SVijay Mahadevan 
38499fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked()
38599fa7e03SVijay Mahadevan @*/
3868cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
3878cbae1a6SVijay Mahadevan {
3888cbae1a6SVijay Mahadevan   PetscInt        i, field, offset;
3898cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3908cbae1a6SVijay Mahadevan 
3918cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3928cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
39399fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3948cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3958cbae1a6SVijay Mahadevan 
3968cbae1a6SVijay Mahadevan   if (!dof) {
3979566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof));
3988cbae1a6SVijay Mahadevan   }
3998cbae1a6SVijay Mahadevan 
4003f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
40199fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
40299fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
403addae81cSVijay Mahadevan   for (field = 0; field < dmmoab->numFields; ++field) {
40499fa7e03SVijay Mahadevan     offset = field * dmmoab->n;
4058cbae1a6SVijay Mahadevan     for (i = 0; i < npoints; ++i)
406e92d1c7cSVijay Mahadevan       dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
407e92d1c7cSVijay Mahadevan                                             dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset);
4088cbae1a6SVijay Mahadevan   }
4098cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4108cbae1a6SVijay Mahadevan }
4118cbae1a6SVijay Mahadevan 
41299fa7e03SVijay Mahadevan /*@C
41399fa7e03SVijay Mahadevan   DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an
41499fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
41599fa7e03SVijay Mahadevan 
41699fa7e03SVijay Mahadevan   Not Collective
41799fa7e03SVijay Mahadevan 
41899fa7e03SVijay Mahadevan   Input Parameters:
41999fa7e03SVijay Mahadevan + dm     - the discretization manager object
42099fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
421a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
42299fa7e03SVijay Mahadevan 
42399fa7e03SVijay Mahadevan   Output Parameter:
424a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
42599fa7e03SVijay Mahadevan 
42699fa7e03SVijay Mahadevan   Level: intermediate
42799fa7e03SVijay Mahadevan 
42899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked()
42999fa7e03SVijay Mahadevan @*/
4308cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
4318cbae1a6SVijay Mahadevan {
4328cbae1a6SVijay Mahadevan   PetscInt        i, field, offset;
4338cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4348cbae1a6SVijay Mahadevan 
4358cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4368cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
43799fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
4388cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4398cbae1a6SVijay Mahadevan 
4408cbae1a6SVijay Mahadevan   if (!dof) {
4419566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof));
4428cbae1a6SVijay Mahadevan   }
4438cbae1a6SVijay Mahadevan 
4443f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
44599fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
44699fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
447addae81cSVijay Mahadevan   for (field = 0; field < dmmoab->numFields; ++field) {
44899fa7e03SVijay Mahadevan     offset = field * dmmoab->n;
4498cbae1a6SVijay Mahadevan     for (i = 0; i < npoints; ++i)
450e92d1c7cSVijay Mahadevan       dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
451e92d1c7cSVijay Mahadevan                                             dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset);
4528cbae1a6SVijay Mahadevan   }
4538cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4548cbae1a6SVijay Mahadevan }
4558cbae1a6SVijay Mahadevan 
45699fa7e03SVijay Mahadevan /*@C
45799fa7e03SVijay Mahadevan   DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
45899fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation
45999fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
46099fa7e03SVijay Mahadevan 
46199fa7e03SVijay Mahadevan   Not Collective
46299fa7e03SVijay Mahadevan 
46399fa7e03SVijay Mahadevan   Input Parameters:
46499fa7e03SVijay Mahadevan + dm     - the discretization manager object
46599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
466a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
46799fa7e03SVijay Mahadevan 
46899fa7e03SVijay Mahadevan   Output Parameter:
469a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat)
47099fa7e03SVijay Mahadevan 
47199fa7e03SVijay Mahadevan   Level: intermediate
47299fa7e03SVijay Mahadevan 
47399fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
47499fa7e03SVijay Mahadevan @*/
4758cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
4768cbae1a6SVijay Mahadevan {
4778cbae1a6SVijay Mahadevan   PetscInt        i;
4788cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4798cbae1a6SVijay Mahadevan 
4808cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4818cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4823f1c6e43SVijay Mahadevan   PetscValidPointer(points, 3);
4838cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4848cbae1a6SVijay Mahadevan 
4858cbae1a6SVijay Mahadevan   if (!dof) {
4869566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(npoints, &dof));
4878cbae1a6SVijay Mahadevan   }
4888cbae1a6SVijay Mahadevan 
4898cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i) {
4903f1c6e43SVijay Mahadevan     dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart];
4918cbae1a6SVijay Mahadevan   }
4928cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4938cbae1a6SVijay Mahadevan }
4948cbae1a6SVijay Mahadevan 
49599fa7e03SVijay Mahadevan /*@C
49699fa7e03SVijay Mahadevan   DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
49799fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation
49899fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
49999fa7e03SVijay Mahadevan 
50099fa7e03SVijay Mahadevan   Not Collective
50199fa7e03SVijay Mahadevan 
50299fa7e03SVijay Mahadevan   Input Parameters:
50399fa7e03SVijay Mahadevan + dm     - the discretization manager object
50499fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
505a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
50699fa7e03SVijay Mahadevan 
50799fa7e03SVijay Mahadevan   Output Parameter:
508a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat)
50999fa7e03SVijay Mahadevan 
51099fa7e03SVijay Mahadevan   Level: intermediate
51199fa7e03SVijay Mahadevan 
51299fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
51399fa7e03SVijay Mahadevan @*/
5148cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
5158cbae1a6SVijay Mahadevan {
5168cbae1a6SVijay Mahadevan   PetscInt        i;
5178cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
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 
5249566063dSJacob Faibussowitsch   if (!dof) PetscCall(PetscMalloc1(npoints, &dof));
5258cbae1a6SVijay Mahadevan 
5265f80ce2aSJacob Faibussowitsch   for (i = 0; i < npoints; ++i) dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart];
5278cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5288cbae1a6SVijay Mahadevan }
5298cbae1a6SVijay Mahadevan 
53099fa7e03SVijay Mahadevan /*@C
53199fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
53299fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
53399fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
53499fa7e03SVijay Mahadevan 
53599fa7e03SVijay Mahadevan   Not Collective
53699fa7e03SVijay Mahadevan 
53799fa7e03SVijay Mahadevan   Input Parameters:
538a2b725a8SWilliam Gropp . dm     - the discretization manager object
53999fa7e03SVijay Mahadevan 
54099fa7e03SVijay Mahadevan   Output Parameter:
541a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
54299fa7e03SVijay Mahadevan 
54399fa7e03SVijay Mahadevan   Level: intermediate
54499fa7e03SVijay Mahadevan 
54599fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
54699fa7e03SVijay Mahadevan @*/
5478cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt** dof)
5488cbae1a6SVijay Mahadevan {
5498cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5508cbae1a6SVijay Mahadevan 
5518cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5528cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5538cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5548cbae1a6SVijay Mahadevan 
5558cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
5568cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5578cbae1a6SVijay Mahadevan }
5588cbae1a6SVijay Mahadevan 
55999fa7e03SVijay Mahadevan /*@C
56099fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
56199fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
56299fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
56399fa7e03SVijay Mahadevan 
56499fa7e03SVijay Mahadevan   Not Collective
56599fa7e03SVijay Mahadevan 
56699fa7e03SVijay Mahadevan   Input Parameters:
567a2b725a8SWilliam Gropp . dm     - the discretization manager object
56899fa7e03SVijay Mahadevan 
56999fa7e03SVijay Mahadevan   Output Parameter:
570a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
57199fa7e03SVijay Mahadevan 
57299fa7e03SVijay Mahadevan   Level: intermediate
57399fa7e03SVijay Mahadevan 
57499fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
57599fa7e03SVijay Mahadevan @*/
5768cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt** dof)
5778cbae1a6SVijay Mahadevan {
5788cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5798cbae1a6SVijay Mahadevan 
5808cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5818cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5828cbae1a6SVijay Mahadevan   PetscValidPointer(dof, 2);
5838cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5848cbae1a6SVijay Mahadevan 
5858cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
5868cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5878cbae1a6SVijay Mahadevan }
588