xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision 1baa6e3354bfe224b33a0c158f482508792a8a6e)
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 @*/
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 
3308401ef6SPierre 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));
47*1baa6e33SBarry 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 */
508cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray); MBERRNM(merr);
518cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
528cbae1a6SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
539566063dSJacob Faibussowitsch     PetscCall(PetscFree(farray));
548cbae1a6SVijay Mahadevan   }
559daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
568cbae1a6SVijay Mahadevan   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned); MBERRNM(merr);
579daf19fdSVijay Mahadevan #endif
588cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
598cbae1a6SVijay Mahadevan }
608cbae1a6SVijay Mahadevan 
6199fa7e03SVijay Mahadevan /*@C
6299fa7e03SVijay Mahadevan   DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated
6399fa7e03SVijay Mahadevan   with all fields (components) managed by DM.
6499fa7e03SVijay Mahadevan   A useful utility when updating the DM solution after a solve, to be serialized with the mesh for
6599fa7e03SVijay Mahadevan   checkpointing purposes.
6699fa7e03SVijay Mahadevan 
6799fa7e03SVijay Mahadevan   Not Collective
6899fa7e03SVijay Mahadevan 
6999fa7e03SVijay Mahadevan   Input Parameters:
7099fa7e03SVijay Mahadevan + dm     - the discretization manager object
71a2b725a8SWilliam Gropp - fvec - the global Vector solution corresponding to all the fields managed by DM
7299fa7e03SVijay Mahadevan 
7399fa7e03SVijay Mahadevan   Level: intermediate
7499fa7e03SVijay Mahadevan 
75db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFieldVector()`
7699fa7e03SVijay Mahadevan @*/
778cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
788cbae1a6SVijay Mahadevan {
798cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
808cbae1a6SVijay Mahadevan   moab::Tag     vtag, ntag;
81f28b2503SVijay Mahadevan   const PetscScalar   *rarray;
82f28b2503SVijay Mahadevan   PetscScalar   *varray, *farray;
838cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
848cbae1a6SVijay Mahadevan   PetscInt i, ifield;
858cbae1a6SVijay Mahadevan   std::string tag_name;
868cbae1a6SVijay Mahadevan   moab::Range::iterator iter;
878cbae1a6SVijay Mahadevan 
888cbae1a6SVijay Mahadevan   PetscFunctionBegin;
898cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
908cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
918cbae1a6SVijay Mahadevan 
928cbae1a6SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
939566063dSJacob Faibussowitsch   PetscCall(DMMoabGetVecTag(fvec, &vtag));
948cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
959566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(dmmoab->nloc, &farray));
968cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr != moab::MB_SUCCESS) {
978cbae1a6SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
989566063dSJacob Faibussowitsch     PetscCall(VecGetArrayRead(fvec, &rarray));
99addae81cSVijay Mahadevan     for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
1008cbae1a6SVijay Mahadevan 
1018cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
102addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
1038cbae1a6SVijay Mahadevan                                              moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
1048cbae1a6SVijay Mahadevan 
1058cbae1a6SVijay Mahadevan       for (i = 0; i < dmmoab->nloc; i++) {
1063f1c6e43SVijay Mahadevan         farray[i] = (dmmoab->bs == 1 ? rarray[ifield * dmmoab->nloc + i] : rarray[i * dmmoab->numFields + ifield]);
1078cbae1a6SVijay Mahadevan       }
1088cbae1a6SVijay Mahadevan 
1098cbae1a6SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
1108cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
1118cbae1a6SVijay Mahadevan     }
1129566063dSJacob Faibussowitsch     PetscCall(VecRestoreArrayRead(fvec, &rarray));
113*1baa6e33SBarry 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 */
1178cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray); MBERRNM(merr);
118addae81cSVijay Mahadevan     for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
1198cbae1a6SVijay Mahadevan 
1208cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
121addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag,
1228cbae1a6SVijay Mahadevan                                              moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr);
1238cbae1a6SVijay Mahadevan 
1248cbae1a6SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
1258cbae1a6SVijay Mahadevan       for (i = 0; i < dmmoab->nloc; i++) {
1263f1c6e43SVijay Mahadevan         farray[i] = (dmmoab->bs == 1 ? varray[ifield * dmmoab->nloc + i] : varray[i * dmmoab->numFields + ifield]);
1278cbae1a6SVijay Mahadevan       }
1288cbae1a6SVijay Mahadevan 
1298cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr);
1309daf19fdSVijay Mahadevan 
1319daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1328cbae1a6SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
1338cbae1a6SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal); 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 @*/
156f28b2503SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm, PetscInt numFields, const char* fields[])
1578cbae1a6SVijay Mahadevan {
158addae81cSVijay Mahadevan   PetscInt       i;
1598cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1608cbae1a6SVijay Mahadevan 
1618cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1628cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1638cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1648cbae1a6SVijay Mahadevan 
165addae81cSVijay Mahadevan   /* first deallocate the existing field structure */
166addae81cSVijay Mahadevan   if (dmmoab->fieldNames) {
167addae81cSVijay Mahadevan     for (i = 0; i < dmmoab->numFields; i++) {
1689566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->fieldNames[i]));
169addae81cSVijay Mahadevan     }
1709566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->fieldNames));
171addae81cSVijay Mahadevan   }
172addae81cSVijay Mahadevan 
173addae81cSVijay Mahadevan   /* now re-allocate and assign field names  */
174addae81cSVijay Mahadevan   dmmoab->numFields = numFields;
1759566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(numFields, &dmmoab->fieldNames));
176addae81cSVijay Mahadevan   if (fields) {
177addae81cSVijay Mahadevan     for (i = 0; i < dmmoab->numFields; i++) {
1789566063dSJacob Faibussowitsch       PetscCall(PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]));
179addae81cSVijay Mahadevan     }
180addae81cSVijay Mahadevan   }
1819566063dSJacob Faibussowitsch   PetscCall(DMSetNumFields(dm, numFields));
1828cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1838cbae1a6SVijay Mahadevan }
1848cbae1a6SVijay Mahadevan 
18599fa7e03SVijay Mahadevan /*@C
18699fa7e03SVijay Mahadevan   DMMoabGetFieldName - Gets the names of individual field components in multicomponent
18799fa7e03SVijay Mahadevan   vectors associated with a DMDA.
18899fa7e03SVijay Mahadevan 
18999fa7e03SVijay Mahadevan   Not Collective
19099fa7e03SVijay Mahadevan 
191d8d19677SJose E. Roman   Input Parameters:
19299fa7e03SVijay Mahadevan + dm     - the discretization manager object
193a2b725a8SWilliam Gropp - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the
19499fa7e03SVijay Mahadevan         number of degrees of freedom per node within the DMMoab
19599fa7e03SVijay Mahadevan 
19699fa7e03SVijay Mahadevan   Output Parameter:
19799fa7e03SVijay Mahadevan . fieldName - the name of the field (component)
19899fa7e03SVijay Mahadevan 
19999fa7e03SVijay Mahadevan   Level: intermediate
20099fa7e03SVijay Mahadevan 
201db781477SPatrick Sanan .seealso: `DMMoabSetFieldName()`, `DMMoabSetFields()`
20299fa7e03SVijay Mahadevan @*/
20399fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName)
20499fa7e03SVijay Mahadevan {
20599fa7e03SVijay Mahadevan   DM_Moab        *dmmoab;
20699fa7e03SVijay Mahadevan 
20799fa7e03SVijay Mahadevan   PetscFunctionBegin;
20899fa7e03SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
20999fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
21008401ef6SPierre 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);
21199fa7e03SVijay Mahadevan 
21299fa7e03SVijay Mahadevan   *fieldName = dmmoab->fieldNames[field];
21399fa7e03SVijay Mahadevan   PetscFunctionReturn(0);
21499fa7e03SVijay Mahadevan }
21599fa7e03SVijay Mahadevan 
216c68c6878SVijay Mahadevan /*@C
21799fa7e03SVijay Mahadevan   DMMoabSetFieldName - Sets the name of a field (component) managed by the DM
218c68c6878SVijay Mahadevan 
219c68c6878SVijay Mahadevan   Not Collective
220c68c6878SVijay Mahadevan 
221c68c6878SVijay Mahadevan   Input Parameters:
22299fa7e03SVijay Mahadevan + dm     - the discretization manager object
223c68c6878SVijay Mahadevan . field - the field number
224a2b725a8SWilliam Gropp - fieldName - the field (component) name
225c68c6878SVijay Mahadevan 
22699fa7e03SVijay Mahadevan   Level: intermediate
22795452b02SPatrick Sanan   Notes:
22895452b02SPatrick Sanan     Can only be called after DMMoabSetFields supplied with correct numFields
229c68c6878SVijay Mahadevan 
230db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFields()`
231c68c6878SVijay Mahadevan @*/
2325f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName)
233c68c6878SVijay Mahadevan {
234c68c6878SVijay Mahadevan   DM_Moab        *dmmoab;
235c68c6878SVijay Mahadevan 
236c68c6878SVijay Mahadevan   PetscFunctionBegin;
237c68c6878SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2385f7ae369SVijay Mahadevan   PetscValidCharPointer(fieldName, 3);
239c68c6878SVijay Mahadevan 
24099fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
24108401ef6SPierre 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);
24299fa7e03SVijay Mahadevan 
24399fa7e03SVijay Mahadevan   if (dmmoab->fieldNames[field]) {
2449566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->fieldNames[field]));
24599fa7e03SVijay Mahadevan   }
2469566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]));
247c68c6878SVijay Mahadevan   PetscFunctionReturn(0);
248c68c6878SVijay Mahadevan }
249c68c6878SVijay Mahadevan 
25099fa7e03SVijay Mahadevan /*@C
25199fa7e03SVijay Mahadevan   DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a
25299fa7e03SVijay Mahadevan   particular MOAB EntityHandle.
25399fa7e03SVijay Mahadevan 
25499fa7e03SVijay Mahadevan   Not Collective
25599fa7e03SVijay Mahadevan 
25699fa7e03SVijay Mahadevan   Input Parameters:
25799fa7e03SVijay Mahadevan + dm     - the discretization manager object
25899fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values
259a2b725a8SWilliam Gropp - field - the field (component) index
26099fa7e03SVijay Mahadevan 
26199fa7e03SVijay Mahadevan   Output Parameter:
262a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat)
26399fa7e03SVijay Mahadevan 
26499fa7e03SVijay Mahadevan   Level: beginner
26599fa7e03SVijay Mahadevan 
266db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetFieldDofsLocal()`
26799fa7e03SVijay Mahadevan @*/
2688cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt* dof)
2698cbae1a6SVijay Mahadevan {
2708cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
2718cbae1a6SVijay Mahadevan 
2728cbae1a6SVijay Mahadevan   PetscFunctionBegin;
2738cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2748cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
2758cbae1a6SVijay Mahadevan 
276e92d1c7cSVijay Mahadevan   *dof = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] + field * dmmoab->n :
277e92d1c7cSVijay Mahadevan               dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] * dmmoab->numFields + field);
2788cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2798cbae1a6SVijay Mahadevan }
2808cbae1a6SVijay Mahadevan 
28199fa7e03SVijay Mahadevan /*@C
28299fa7e03SVijay Mahadevan   DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an
28399fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
28499fa7e03SVijay Mahadevan 
28599fa7e03SVijay Mahadevan   Not Collective
28699fa7e03SVijay Mahadevan 
28799fa7e03SVijay Mahadevan   Input Parameters:
28899fa7e03SVijay Mahadevan + dm     - the discretization manager object
28999fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
29099fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
291a2b725a8SWilliam Gropp - field - the field (component) index
29299fa7e03SVijay Mahadevan 
29399fa7e03SVijay Mahadevan   Output Parameter:
294a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
29599fa7e03SVijay Mahadevan 
29699fa7e03SVijay Mahadevan   Level: intermediate
29799fa7e03SVijay Mahadevan 
298db781477SPatrick Sanan .seealso: `DMMoabGetFieldDof()`, `DMMoabGetFieldDofsLocal()`
29999fa7e03SVijay Mahadevan @*/
3008cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof)
3018cbae1a6SVijay Mahadevan {
3028cbae1a6SVijay Mahadevan   PetscInt        i;
3038cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3048cbae1a6SVijay Mahadevan 
3058cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3068cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
30799fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3088cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3098cbae1a6SVijay Mahadevan 
3108cbae1a6SVijay Mahadevan   if (!dof) {
3119566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(npoints, &dof));
3128cbae1a6SVijay Mahadevan   }
3138cbae1a6SVijay Mahadevan 
3143f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
3153f1c6e43SVijay 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 */
31699fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3178cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i)
318e92d1c7cSVijay Mahadevan     dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n :
319e92d1c7cSVijay Mahadevan               dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field);
3208cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3218cbae1a6SVijay Mahadevan }
3228cbae1a6SVijay Mahadevan 
32399fa7e03SVijay Mahadevan /*@C
32499fa7e03SVijay Mahadevan   DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an
32599fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
32699fa7e03SVijay Mahadevan 
32799fa7e03SVijay Mahadevan   Not Collective
32899fa7e03SVijay Mahadevan 
32999fa7e03SVijay Mahadevan   Input Parameters:
33099fa7e03SVijay Mahadevan + dm     - the discretization manager object
33199fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
33299fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
333a2b725a8SWilliam Gropp - field - the field (component) index
33499fa7e03SVijay Mahadevan 
33599fa7e03SVijay Mahadevan   Output Parameter:
336a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
33799fa7e03SVijay Mahadevan 
33899fa7e03SVijay Mahadevan   Level: intermediate
33999fa7e03SVijay Mahadevan 
340db781477SPatrick Sanan .seealso: `DMMoabGetFieldDof()`, `DMMoabGetFieldDofs()`
34199fa7e03SVijay Mahadevan @*/
3428cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof)
3438cbae1a6SVijay Mahadevan {
3443f1c6e43SVijay Mahadevan   PetscInt i;
3458cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3468cbae1a6SVijay Mahadevan 
3478cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3488cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
34999fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3508cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3518cbae1a6SVijay Mahadevan 
3528cbae1a6SVijay Mahadevan   if (!dof) {
3539566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(npoints, &dof));
3548cbae1a6SVijay Mahadevan   }
3558cbae1a6SVijay Mahadevan 
3563f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
35799fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
35899fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3593f1c6e43SVijay Mahadevan   for (i = 0; i < npoints; ++i) {
360e92d1c7cSVijay Mahadevan     dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
361e92d1c7cSVijay Mahadevan               dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n);
3628cbae1a6SVijay Mahadevan   }
3638cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3648cbae1a6SVijay Mahadevan }
3658cbae1a6SVijay Mahadevan 
36699fa7e03SVijay Mahadevan /*@C
36799fa7e03SVijay Mahadevan   DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an
36899fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
36999fa7e03SVijay Mahadevan 
37099fa7e03SVijay Mahadevan   Not Collective
37199fa7e03SVijay Mahadevan 
37299fa7e03SVijay Mahadevan   Input Parameters:
37399fa7e03SVijay Mahadevan + dm     - the discretization manager object
37499fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
375a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
37699fa7e03SVijay Mahadevan 
37799fa7e03SVijay Mahadevan   Output Parameter:
378a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
37999fa7e03SVijay Mahadevan 
38099fa7e03SVijay Mahadevan   Level: intermediate
38199fa7e03SVijay Mahadevan 
382db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetDofsLocal()`, `DMMoabGetDofsBlocked()`
38399fa7e03SVijay Mahadevan @*/
3848cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
3858cbae1a6SVijay Mahadevan {
3868cbae1a6SVijay Mahadevan   PetscInt        i, field, offset;
3878cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3888cbae1a6SVijay Mahadevan 
3898cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3908cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
39199fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
3928cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3938cbae1a6SVijay Mahadevan 
3948cbae1a6SVijay Mahadevan   if (!dof) {
3959566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof));
3968cbae1a6SVijay Mahadevan   }
3978cbae1a6SVijay Mahadevan 
3983f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
39999fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
40099fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
401addae81cSVijay Mahadevan   for (field = 0; field < dmmoab->numFields; ++field) {
40299fa7e03SVijay Mahadevan     offset = field * dmmoab->n;
4038cbae1a6SVijay Mahadevan     for (i = 0; i < npoints; ++i)
404e92d1c7cSVijay Mahadevan       dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
405e92d1c7cSVijay Mahadevan                                             dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset);
4068cbae1a6SVijay Mahadevan   }
4078cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4088cbae1a6SVijay Mahadevan }
4098cbae1a6SVijay Mahadevan 
41099fa7e03SVijay Mahadevan /*@C
41199fa7e03SVijay Mahadevan   DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an
41299fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
41399fa7e03SVijay Mahadevan 
41499fa7e03SVijay Mahadevan   Not Collective
41599fa7e03SVijay Mahadevan 
41699fa7e03SVijay Mahadevan   Input Parameters:
41799fa7e03SVijay Mahadevan + dm     - the discretization manager object
41899fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
419a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
42099fa7e03SVijay Mahadevan 
42199fa7e03SVijay Mahadevan   Output Parameter:
422a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
42399fa7e03SVijay Mahadevan 
42499fa7e03SVijay Mahadevan   Level: intermediate
42599fa7e03SVijay Mahadevan 
426db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlocked()`
42799fa7e03SVijay Mahadevan @*/
4288cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
4298cbae1a6SVijay Mahadevan {
4308cbae1a6SVijay Mahadevan   PetscInt        i, field, offset;
4318cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4328cbae1a6SVijay Mahadevan 
4338cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4348cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
43599fa7e03SVijay Mahadevan   PetscValidPointer(points, 3);
4368cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4378cbae1a6SVijay Mahadevan 
4388cbae1a6SVijay Mahadevan   if (!dof) {
4399566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof));
4408cbae1a6SVijay Mahadevan   }
4418cbae1a6SVijay Mahadevan 
4423f1c6e43SVijay Mahadevan   /* compute the DOF based on local blocking in the fields */
44399fa7e03SVijay Mahadevan   /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
44499fa7e03SVijay Mahadevan   /* TODO: eliminate the limitation using PetscSection to manage DOFs */
445addae81cSVijay Mahadevan   for (field = 0; field < dmmoab->numFields; ++field) {
44699fa7e03SVijay Mahadevan     offset = field * dmmoab->n;
4478cbae1a6SVijay Mahadevan     for (i = 0; i < npoints; ++i)
448e92d1c7cSVijay Mahadevan       dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field :
449e92d1c7cSVijay Mahadevan                                             dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset);
4508cbae1a6SVijay Mahadevan   }
4518cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4528cbae1a6SVijay Mahadevan }
4538cbae1a6SVijay Mahadevan 
45499fa7e03SVijay Mahadevan /*@C
45599fa7e03SVijay Mahadevan   DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
45699fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation
45799fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
45899fa7e03SVijay Mahadevan 
45999fa7e03SVijay Mahadevan   Not Collective
46099fa7e03SVijay Mahadevan 
46199fa7e03SVijay Mahadevan   Input Parameters:
46299fa7e03SVijay Mahadevan + dm     - the discretization manager object
46399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
464a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
46599fa7e03SVijay Mahadevan 
46699fa7e03SVijay Mahadevan   Output Parameter:
467a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat)
46899fa7e03SVijay Mahadevan 
46999fa7e03SVijay Mahadevan   Level: intermediate
47099fa7e03SVijay Mahadevan 
471db781477SPatrick Sanan .seealso: `DMMoabGetDofsLocal()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlockedLocal()`
47299fa7e03SVijay Mahadevan @*/
4738cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
4748cbae1a6SVijay Mahadevan {
4758cbae1a6SVijay Mahadevan   PetscInt        i;
4768cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4778cbae1a6SVijay Mahadevan 
4788cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4798cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4803f1c6e43SVijay Mahadevan   PetscValidPointer(points, 3);
4818cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4828cbae1a6SVijay Mahadevan 
4838cbae1a6SVijay Mahadevan   if (!dof) {
4849566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(npoints, &dof));
4858cbae1a6SVijay Mahadevan   }
4868cbae1a6SVijay Mahadevan 
4878cbae1a6SVijay Mahadevan   for (i = 0; i < npoints; ++i) {
4883f1c6e43SVijay Mahadevan     dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart];
4898cbae1a6SVijay Mahadevan   }
4908cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4918cbae1a6SVijay Mahadevan }
4928cbae1a6SVijay Mahadevan 
49399fa7e03SVijay Mahadevan /*@C
49499fa7e03SVijay Mahadevan   DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
49599fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation
49699fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
49799fa7e03SVijay Mahadevan 
49899fa7e03SVijay Mahadevan   Not Collective
49999fa7e03SVijay Mahadevan 
50099fa7e03SVijay Mahadevan   Input Parameters:
50199fa7e03SVijay Mahadevan + dm     - the discretization manager object
50299fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
503a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
50499fa7e03SVijay Mahadevan 
50599fa7e03SVijay Mahadevan   Output Parameter:
506a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat)
50799fa7e03SVijay Mahadevan 
50899fa7e03SVijay Mahadevan   Level: intermediate
50999fa7e03SVijay Mahadevan 
510db781477SPatrick Sanan .seealso: `DMMoabGetDofsLocal()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlockedLocal()`
51199fa7e03SVijay Mahadevan @*/
5128cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof)
5138cbae1a6SVijay Mahadevan {
5148cbae1a6SVijay Mahadevan   PetscInt        i;
5158cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5168cbae1a6SVijay Mahadevan 
5178cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5188cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5193f1c6e43SVijay Mahadevan   PetscValidPointer(points, 3);
5208cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5218cbae1a6SVijay Mahadevan 
5229566063dSJacob Faibussowitsch   if (!dof) PetscCall(PetscMalloc1(npoints, &dof));
5238cbae1a6SVijay Mahadevan 
5245f80ce2aSJacob Faibussowitsch   for (i = 0; i < npoints; ++i) dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart];
5258cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5268cbae1a6SVijay Mahadevan }
5278cbae1a6SVijay Mahadevan 
52899fa7e03SVijay Mahadevan /*@C
52999fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
53099fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
53199fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
53299fa7e03SVijay Mahadevan 
53399fa7e03SVijay Mahadevan   Not Collective
53499fa7e03SVijay Mahadevan 
53599fa7e03SVijay Mahadevan   Input Parameters:
536a2b725a8SWilliam Gropp . dm     - the discretization manager object
53799fa7e03SVijay Mahadevan 
53899fa7e03SVijay Mahadevan   Output Parameter:
539a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
54099fa7e03SVijay Mahadevan 
54199fa7e03SVijay Mahadevan   Level: intermediate
54299fa7e03SVijay Mahadevan 
543db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlockedLocal()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()`
54499fa7e03SVijay Mahadevan @*/
5458cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt** dof)
5468cbae1a6SVijay Mahadevan {
5478cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5488cbae1a6SVijay Mahadevan 
5498cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5508cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5518cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5528cbae1a6SVijay Mahadevan 
5538cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
5548cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5558cbae1a6SVijay Mahadevan }
5568cbae1a6SVijay Mahadevan 
55799fa7e03SVijay Mahadevan /*@C
55899fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
55999fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
56099fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
56199fa7e03SVijay Mahadevan 
56299fa7e03SVijay Mahadevan   Not Collective
56399fa7e03SVijay Mahadevan 
56499fa7e03SVijay Mahadevan   Input Parameters:
565a2b725a8SWilliam Gropp . dm     - the discretization manager object
56699fa7e03SVijay Mahadevan 
56799fa7e03SVijay Mahadevan   Output Parameter:
568a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
56999fa7e03SVijay Mahadevan 
57099fa7e03SVijay Mahadevan   Level: intermediate
57199fa7e03SVijay Mahadevan 
572db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlocked()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()`
57399fa7e03SVijay Mahadevan @*/
5748cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt** dof)
5758cbae1a6SVijay Mahadevan {
5768cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5778cbae1a6SVijay Mahadevan 
5788cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5798cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5808cbae1a6SVijay Mahadevan   PetscValidPointer(dof, 2);
5818cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5828cbae1a6SVijay Mahadevan 
5838cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
5848cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5858cbae1a6SVijay Mahadevan }
586