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 @*/
DMMoabSetFieldVector(DM dm,PetscInt ifield,Vec fvec)20d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
21d71ae5a4SJacob Faibussowitsch {
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);
3157508eceSPierre Jolivet 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
35*f0b74427SPierre Jolivet /* Create a tag in MOAB mesh to index and keep track of number of PETSc vec tags */
369371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, moab::MB_TAG_DENSE | moab::MB_TAG_CREAT);
379371c9d4SSatish Balay 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 */
459371c9d4SSatish Balay merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)varray);
469371c9d4SSatish Balay MBERRNM(merr);
479566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(fvec, &varray));
481baa6e33SBarry Smith } else {
499566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(dmmoab->nloc, &farray));
508cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */
519371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void *)farray);
529371c9d4SSatish Balay MBERRNM(merr);
539371c9d4SSatish Balay merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)farray);
549371c9d4SSatish Balay MBERRNM(merr);
558cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */
569566063dSJacob Faibussowitsch PetscCall(PetscFree(farray));
578cbae1a6SVijay Mahadevan }
589daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
599371c9d4SSatish Balay merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);
609371c9d4SSatish Balay MBERRNM(merr);
619daf19fdSVijay Mahadevan #endif
623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
638cbae1a6SVijay Mahadevan }
648cbae1a6SVijay Mahadevan
6599fa7e03SVijay Mahadevan /*@C
6699fa7e03SVijay Mahadevan DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated
6799fa7e03SVijay Mahadevan with all fields (components) managed by DM.
6899fa7e03SVijay Mahadevan A useful utility when updating the DM solution after a solve, to be serialized with the mesh for
6999fa7e03SVijay Mahadevan checkpointing purposes.
7099fa7e03SVijay Mahadevan
7199fa7e03SVijay Mahadevan Not Collective
7299fa7e03SVijay Mahadevan
7399fa7e03SVijay Mahadevan Input Parameters:
7499fa7e03SVijay Mahadevan + dm - the discretization manager object
75a2b725a8SWilliam Gropp - fvec - the global Vector solution corresponding to all the fields managed by DM
7699fa7e03SVijay Mahadevan
7799fa7e03SVijay Mahadevan Level: intermediate
7899fa7e03SVijay Mahadevan
79db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFieldVector()`
8099fa7e03SVijay Mahadevan @*/
DMMoabSetGlobalFieldVector(DM dm,Vec fvec)81d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
82d71ae5a4SJacob Faibussowitsch {
838cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
848cbae1a6SVijay Mahadevan moab::Tag vtag, ntag;
85f28b2503SVijay Mahadevan const PetscScalar *rarray;
86f28b2503SVijay Mahadevan PetscScalar *varray, *farray;
878cbae1a6SVijay Mahadevan moab::ErrorCode merr;
888cbae1a6SVijay Mahadevan PetscInt i, ifield;
898cbae1a6SVijay Mahadevan std::string tag_name;
908cbae1a6SVijay Mahadevan moab::Range::iterator iter;
918cbae1a6SVijay Mahadevan
928cbae1a6SVijay Mahadevan PetscFunctionBegin;
938cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
9457508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
958cbae1a6SVijay Mahadevan
968cbae1a6SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
979566063dSJacob Faibussowitsch PetscCall(DMMoabGetVecTag(fvec, &vtag));
988cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
999566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(dmmoab->nloc, &farray));
1008cbae1a6SVijay Mahadevan if (!tag_name.length() && merr != moab::MB_SUCCESS) {
1018cbae1a6SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
1029566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(fvec, &rarray));
103addae81cSVijay Mahadevan for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
104*f0b74427SPierre Jolivet /* Create a tag in MOAB mesh to index and keep track of number of PETSc vec tags */
1059371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, moab::MB_TAG_DENSE | moab::MB_TAG_CREAT);
1069371c9d4SSatish Balay MBERRNM(merr);
1078cbae1a6SVijay Mahadevan
108ad540459SPierre Jolivet for (i = 0; i < dmmoab->nloc; i++) farray[i] = (dmmoab->bs == 1 ? rarray[ifield * dmmoab->nloc + i] : rarray[i * dmmoab->numFields + ifield]);
1098cbae1a6SVijay Mahadevan
1108cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */
1119371c9d4SSatish Balay merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)farray);
1129371c9d4SSatish Balay MBERRNM(merr);
1138cbae1a6SVijay Mahadevan }
1149566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(fvec, &rarray));
1151baa6e33SBarry Smith } 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 */
1199371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void *)varray);
1209371c9d4SSatish Balay MBERRNM(merr);
121addae81cSVijay Mahadevan for (ifield = 0; ifield < dmmoab->numFields; ++ifield) {
122*f0b74427SPierre Jolivet /* Create a tag in MOAB mesh to index and keep track of number of PETSc vec tags */
1239371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, moab::MB_TAG_DENSE | moab::MB_TAG_CREAT);
1249371c9d4SSatish Balay MBERRNM(merr);
1258cbae1a6SVijay Mahadevan
1268cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */
127ad540459SPierre Jolivet for (i = 0; i < dmmoab->nloc; i++) farray[i] = (dmmoab->bs == 1 ? varray[ifield * dmmoab->nloc + i] : varray[i * dmmoab->numFields + ifield]);
1288cbae1a6SVijay Mahadevan
1299371c9d4SSatish Balay merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)farray);
1309371c9d4SSatish Balay MBERRNM(merr);
1319daf19fdSVijay Mahadevan
1329daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1338cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */
1349371c9d4SSatish Balay merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);
1359371c9d4SSatish Balay MBERRNM(merr);
1369daf19fdSVijay Mahadevan #endif
1378cbae1a6SVijay Mahadevan }
1389566063dSJacob Faibussowitsch PetscCall(PetscFree(varray));
1398cbae1a6SVijay Mahadevan }
1409566063dSJacob Faibussowitsch PetscCall(PetscFree(farray));
1413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
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
152dc9a610eSPierre Jolivet - fields - the array containing the names of each field (component); Can be `NULL`.
15399fa7e03SVijay Mahadevan
15499fa7e03SVijay Mahadevan Level: intermediate
15599fa7e03SVijay Mahadevan
156db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFieldName()`
15799fa7e03SVijay Mahadevan @*/
DMMoabSetFieldNames(DM dm,PetscInt numFields,const char * fields[])158d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetFieldNames(DM dm, PetscInt numFields, const char *fields[])
159d71ae5a4SJacob Faibussowitsch {
160addae81cSVijay Mahadevan PetscInt i;
1618cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
1628cbae1a6SVijay Mahadevan
1638cbae1a6SVijay Mahadevan PetscFunctionBegin;
1648cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
16557508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
1668cbae1a6SVijay Mahadevan
167addae81cSVijay Mahadevan /* first deallocate the existing field structure */
168addae81cSVijay Mahadevan if (dmmoab->fieldNames) {
16948a46eb9SPierre Jolivet for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscFree(dmmoab->fieldNames[i]));
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) {
17748a46eb9SPierre Jolivet for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscStrallocpy(fields[i], (char **)&dmmoab->fieldNames[i]));
178addae81cSVijay Mahadevan }
1799566063dSJacob Faibussowitsch PetscCall(DMSetNumFields(dm, numFields));
1803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1818cbae1a6SVijay Mahadevan }
1828cbae1a6SVijay Mahadevan
18399fa7e03SVijay Mahadevan /*@C
18499fa7e03SVijay Mahadevan DMMoabGetFieldName - Gets the names of individual field components in multicomponent
18599fa7e03SVijay Mahadevan vectors associated with a DMDA.
18699fa7e03SVijay Mahadevan
18799fa7e03SVijay Mahadevan Not Collective
18899fa7e03SVijay Mahadevan
189d8d19677SJose E. Roman Input Parameters:
19099fa7e03SVijay Mahadevan + dm - the discretization manager object
191a2b725a8SWilliam Gropp - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the
19299fa7e03SVijay Mahadevan number of degrees of freedom per node within the DMMoab
19399fa7e03SVijay Mahadevan
19499fa7e03SVijay Mahadevan Output Parameter:
19599fa7e03SVijay Mahadevan . fieldName - the name of the field (component)
19699fa7e03SVijay Mahadevan
19799fa7e03SVijay Mahadevan Level: intermediate
19899fa7e03SVijay Mahadevan
199db781477SPatrick Sanan .seealso: `DMMoabSetFieldName()`, `DMMoabSetFields()`
20099fa7e03SVijay Mahadevan @*/
DMMoabGetFieldName(DM dm,PetscInt field,const char * fieldName[])201cc4c1da9SBarry Smith PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char *fieldName[])
202d71ae5a4SJacob Faibussowitsch {
20399fa7e03SVijay Mahadevan DM_Moab *dmmoab;
20499fa7e03SVijay Mahadevan
20599fa7e03SVijay Mahadevan PetscFunctionBegin;
20699fa7e03SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
20757508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
20808401ef6SPierre 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);
20999fa7e03SVijay Mahadevan
21099fa7e03SVijay Mahadevan *fieldName = dmmoab->fieldNames[field];
2113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21299fa7e03SVijay Mahadevan }
21399fa7e03SVijay Mahadevan
214c68c6878SVijay Mahadevan /*@C
21599fa7e03SVijay Mahadevan DMMoabSetFieldName - Sets the name of a field (component) managed by the DM
216c68c6878SVijay Mahadevan
217c68c6878SVijay Mahadevan Not Collective
218c68c6878SVijay Mahadevan
219c68c6878SVijay Mahadevan Input Parameters:
22099fa7e03SVijay Mahadevan + dm - the discretization manager object
221c68c6878SVijay Mahadevan . field - the field number
222a2b725a8SWilliam Gropp - fieldName - the field (component) name
223c68c6878SVijay Mahadevan
22499fa7e03SVijay Mahadevan Level: intermediate
22560225df5SJacob Faibussowitsch
22695452b02SPatrick Sanan Notes:
22795452b02SPatrick Sanan Can only be called after DMMoabSetFields supplied with correct numFields
228c68c6878SVijay Mahadevan
229db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFields()`
230c68c6878SVijay Mahadevan @*/
DMMoabSetFieldName(DM dm,PetscInt field,const char * fieldName)231d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName)
232d71ae5a4SJacob Faibussowitsch {
233c68c6878SVijay Mahadevan DM_Moab *dmmoab;
234c68c6878SVijay Mahadevan
235c68c6878SVijay Mahadevan PetscFunctionBegin;
236c68c6878SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2374f572ea9SToby Isaac PetscAssertPointer(fieldName, 3);
238c68c6878SVijay Mahadevan
23957508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
24008401ef6SPierre 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);
24199fa7e03SVijay Mahadevan
24248a46eb9SPierre Jolivet if (dmmoab->fieldNames[field]) PetscCall(PetscFree(dmmoab->fieldNames[field]));
2439566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(fieldName, (char **)&dmmoab->fieldNames[field]));
2443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
245c68c6878SVijay Mahadevan }
246c68c6878SVijay Mahadevan
24799fa7e03SVijay Mahadevan /*@C
24899fa7e03SVijay Mahadevan DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a
24999fa7e03SVijay Mahadevan particular MOAB EntityHandle.
25099fa7e03SVijay Mahadevan
25199fa7e03SVijay Mahadevan Not Collective
25299fa7e03SVijay Mahadevan
25399fa7e03SVijay Mahadevan Input Parameters:
25499fa7e03SVijay Mahadevan + dm - the discretization manager object
25599fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values
256a2b725a8SWilliam Gropp - field - the field (component) index
25799fa7e03SVijay Mahadevan
25899fa7e03SVijay Mahadevan Output Parameter:
259a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat)
26099fa7e03SVijay Mahadevan
26199fa7e03SVijay Mahadevan Level: beginner
26299fa7e03SVijay Mahadevan
263db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetFieldDofsLocal()`
26499fa7e03SVijay Mahadevan @*/
DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt * dof)265d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt *dof)
266d71ae5a4SJacob Faibussowitsch {
2678cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
2688cbae1a6SVijay Mahadevan
2698cbae1a6SVijay Mahadevan PetscFunctionBegin;
2708cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
27157508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
2728cbae1a6SVijay Mahadevan
2739371c9d4SSatish 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);
2743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2758cbae1a6SVijay Mahadevan }
2768cbae1a6SVijay Mahadevan
27799fa7e03SVijay Mahadevan /*@C
27899fa7e03SVijay Mahadevan DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an
27999fa7e03SVijay Mahadevan array of MOAB EntityHandles.
28099fa7e03SVijay Mahadevan
28199fa7e03SVijay Mahadevan Not Collective
28299fa7e03SVijay Mahadevan
28399fa7e03SVijay Mahadevan Input Parameters:
28499fa7e03SVijay Mahadevan + dm - the discretization manager object
28599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
28699fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
287a2b725a8SWilliam Gropp - field - the field (component) index
28899fa7e03SVijay Mahadevan
28999fa7e03SVijay Mahadevan Output Parameter:
290a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
29199fa7e03SVijay Mahadevan
29299fa7e03SVijay Mahadevan Level: intermediate
29399fa7e03SVijay Mahadevan
294db781477SPatrick Sanan .seealso: `DMMoabGetFieldDof()`, `DMMoabGetFieldDofsLocal()`
29599fa7e03SVijay Mahadevan @*/
DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle * points,PetscInt field,PetscInt * dof)296d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt field, PetscInt *dof)
297d71ae5a4SJacob Faibussowitsch {
2988cbae1a6SVijay Mahadevan PetscInt i;
2998cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
3008cbae1a6SVijay Mahadevan
3018cbae1a6SVijay Mahadevan PetscFunctionBegin;
3028cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3034f572ea9SToby Isaac PetscAssertPointer(points, 3);
30457508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
3058cbae1a6SVijay Mahadevan
30648a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(npoints, &dof));
3078cbae1a6SVijay Mahadevan
3083f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */
3093f1c6e43SVijay 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 */
31099fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3118cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i)
3129371c9d4SSatish 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);
3133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3148cbae1a6SVijay Mahadevan }
3158cbae1a6SVijay Mahadevan
31699fa7e03SVijay Mahadevan /*@C
31799fa7e03SVijay Mahadevan DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an
31899fa7e03SVijay Mahadevan array of MOAB EntityHandles.
31999fa7e03SVijay Mahadevan
32099fa7e03SVijay Mahadevan Not Collective
32199fa7e03SVijay Mahadevan
32299fa7e03SVijay Mahadevan Input Parameters:
32399fa7e03SVijay Mahadevan + dm - the discretization manager object
32499fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
32599fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
326a2b725a8SWilliam Gropp - field - the field (component) index
32799fa7e03SVijay Mahadevan
32899fa7e03SVijay Mahadevan Output Parameter:
329a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
33099fa7e03SVijay Mahadevan
33199fa7e03SVijay Mahadevan Level: intermediate
33299fa7e03SVijay Mahadevan
333db781477SPatrick Sanan .seealso: `DMMoabGetFieldDof()`, `DMMoabGetFieldDofs()`
33499fa7e03SVijay Mahadevan @*/
DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle * points,PetscInt field,PetscInt * dof)335d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt field, PetscInt *dof)
336d71ae5a4SJacob Faibussowitsch {
3373f1c6e43SVijay Mahadevan PetscInt i;
3388cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
3398cbae1a6SVijay Mahadevan
3408cbae1a6SVijay Mahadevan PetscFunctionBegin;
3418cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3424f572ea9SToby Isaac PetscAssertPointer(points, 3);
34357508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
3448cbae1a6SVijay Mahadevan
34548a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(npoints, &dof));
3468cbae1a6SVijay Mahadevan
3473f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */
34899fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
34999fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3503f1c6e43SVijay Mahadevan for (i = 0; i < npoints; ++i) {
3519371c9d4SSatish 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);
3528cbae1a6SVijay Mahadevan }
3533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3548cbae1a6SVijay Mahadevan }
3558cbae1a6SVijay Mahadevan
35699fa7e03SVijay Mahadevan /*@C
35799fa7e03SVijay Mahadevan DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an
35899fa7e03SVijay Mahadevan array of MOAB EntityHandles.
35999fa7e03SVijay Mahadevan
36099fa7e03SVijay Mahadevan Not Collective
36199fa7e03SVijay Mahadevan
36299fa7e03SVijay Mahadevan Input Parameters:
36399fa7e03SVijay Mahadevan + dm - the discretization manager object
36499fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
365a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
36699fa7e03SVijay Mahadevan
36799fa7e03SVijay Mahadevan Output Parameter:
368a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
36999fa7e03SVijay Mahadevan
37099fa7e03SVijay Mahadevan Level: intermediate
37199fa7e03SVijay Mahadevan
372db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetDofsLocal()`, `DMMoabGetDofsBlocked()`
37399fa7e03SVijay Mahadevan @*/
DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle * points,PetscInt * dof)374d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof)
375d71ae5a4SJacob Faibussowitsch {
3768cbae1a6SVijay Mahadevan PetscInt i, field, offset;
3778cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
3788cbae1a6SVijay Mahadevan
3798cbae1a6SVijay Mahadevan PetscFunctionBegin;
3808cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3814f572ea9SToby Isaac PetscAssertPointer(points, 3);
38257508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
3838cbae1a6SVijay Mahadevan
38448a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof));
3858cbae1a6SVijay Mahadevan
3863f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */
38799fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
38899fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */
389addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) {
39099fa7e03SVijay Mahadevan offset = field * dmmoab->n;
3918cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i)
3929371c9d4SSatish 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);
3938cbae1a6SVijay Mahadevan }
3943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3958cbae1a6SVijay Mahadevan }
3968cbae1a6SVijay Mahadevan
39799fa7e03SVijay Mahadevan /*@C
39899fa7e03SVijay Mahadevan DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an
39999fa7e03SVijay Mahadevan array of MOAB EntityHandles.
40099fa7e03SVijay Mahadevan
40199fa7e03SVijay Mahadevan Not Collective
40299fa7e03SVijay Mahadevan
40399fa7e03SVijay Mahadevan Input Parameters:
40499fa7e03SVijay Mahadevan + dm - the discretization manager object
40599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
406a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
40799fa7e03SVijay Mahadevan
40899fa7e03SVijay Mahadevan Output Parameter:
409a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
41099fa7e03SVijay Mahadevan
41199fa7e03SVijay Mahadevan Level: intermediate
41299fa7e03SVijay Mahadevan
413db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlocked()`
41499fa7e03SVijay Mahadevan @*/
DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle * points,PetscInt * dof)415d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof)
416d71ae5a4SJacob Faibussowitsch {
4178cbae1a6SVijay Mahadevan PetscInt i, field, offset;
4188cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
4198cbae1a6SVijay Mahadevan
4208cbae1a6SVijay Mahadevan PetscFunctionBegin;
4218cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4224f572ea9SToby Isaac PetscAssertPointer(points, 3);
42357508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
4248cbae1a6SVijay Mahadevan
42548a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof));
4268cbae1a6SVijay Mahadevan
4273f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */
42899fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
42999fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */
430addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) {
43199fa7e03SVijay Mahadevan offset = field * dmmoab->n;
4328cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i)
4339371c9d4SSatish 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);
4348cbae1a6SVijay Mahadevan }
4353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4368cbae1a6SVijay Mahadevan }
4378cbae1a6SVijay Mahadevan
43899fa7e03SVijay Mahadevan /*@C
43999fa7e03SVijay Mahadevan DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
44099fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation
44199fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located.
44299fa7e03SVijay Mahadevan
44399fa7e03SVijay Mahadevan Not Collective
44499fa7e03SVijay Mahadevan
44599fa7e03SVijay Mahadevan Input Parameters:
44699fa7e03SVijay Mahadevan + dm - the discretization manager object
44799fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
448a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
44999fa7e03SVijay Mahadevan
45099fa7e03SVijay Mahadevan Output Parameter:
451a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat)
45299fa7e03SVijay Mahadevan
45399fa7e03SVijay Mahadevan Level: intermediate
45499fa7e03SVijay Mahadevan
455db781477SPatrick Sanan .seealso: `DMMoabGetDofsLocal()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlockedLocal()`
45699fa7e03SVijay Mahadevan @*/
DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle * points,PetscInt * dof)457d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof)
458d71ae5a4SJacob Faibussowitsch {
4598cbae1a6SVijay Mahadevan PetscInt i;
4608cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
4618cbae1a6SVijay Mahadevan
4628cbae1a6SVijay Mahadevan PetscFunctionBegin;
4638cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4644f572ea9SToby Isaac PetscAssertPointer(points, 3);
46557508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
4668cbae1a6SVijay Mahadevan
46748a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(npoints, &dof));
4688cbae1a6SVijay Mahadevan
469ad540459SPierre Jolivet for (i = 0; i < npoints; ++i) dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart];
4703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4718cbae1a6SVijay Mahadevan }
4728cbae1a6SVijay Mahadevan
47399fa7e03SVijay Mahadevan /*@C
47499fa7e03SVijay Mahadevan DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
47599fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation
47699fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located.
47799fa7e03SVijay Mahadevan
47899fa7e03SVijay Mahadevan Not Collective
47999fa7e03SVijay Mahadevan
48099fa7e03SVijay Mahadevan Input Parameters:
48199fa7e03SVijay Mahadevan + dm - the discretization manager object
48299fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
483a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
48499fa7e03SVijay Mahadevan
48599fa7e03SVijay Mahadevan Output Parameter:
486a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat)
48799fa7e03SVijay Mahadevan
48899fa7e03SVijay Mahadevan Level: intermediate
48999fa7e03SVijay Mahadevan
49042747ad1SJacob Faibussowitsch .seealso: `DMMoabGetDofsLocal()`, `DMMoabGetDofs()`
49199fa7e03SVijay Mahadevan @*/
DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle * points,PetscInt * dof)492d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof)
493d71ae5a4SJacob Faibussowitsch {
4948cbae1a6SVijay Mahadevan PetscInt i;
4958cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
4968cbae1a6SVijay Mahadevan
4978cbae1a6SVijay Mahadevan PetscFunctionBegin;
4988cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4994f572ea9SToby Isaac PetscAssertPointer(points, 3);
50057508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
5018cbae1a6SVijay Mahadevan
5029566063dSJacob Faibussowitsch if (!dof) PetscCall(PetscMalloc1(npoints, &dof));
5038cbae1a6SVijay Mahadevan
5045f80ce2aSJacob Faibussowitsch for (i = 0; i < npoints; ++i) dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart];
5053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
5068cbae1a6SVijay Mahadevan }
5078cbae1a6SVijay Mahadevan
50899fa7e03SVijay Mahadevan /*@C
50999fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
510a4e35b19SJacob Faibussowitsch array of locally owned MOAB mesh vertices.
51199fa7e03SVijay Mahadevan
51299fa7e03SVijay Mahadevan Not Collective
51399fa7e03SVijay Mahadevan
51499fa7e03SVijay Mahadevan Input Parameters:
515a2b725a8SWilliam Gropp . dm - the discretization manager object
51699fa7e03SVijay Mahadevan
51799fa7e03SVijay Mahadevan Output Parameter:
518a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
51999fa7e03SVijay Mahadevan
52099fa7e03SVijay Mahadevan Level: intermediate
52199fa7e03SVijay Mahadevan
522a4e35b19SJacob Faibussowitsch Note:
523a4e35b19SJacob Faibussowitsch It's utility is when performing Finite-Difference type calculations where vertex traversal is
524a4e35b19SJacob Faibussowitsch faster than element-wise assembly that is typically done in FEM calculations.
525a4e35b19SJacob Faibussowitsch
526db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlockedLocal()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()`
52799fa7e03SVijay Mahadevan @*/
DMMoabGetVertexDofsBlocked(DM dm,PetscInt ** dof)528d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt **dof)
529d71ae5a4SJacob Faibussowitsch {
5308cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
5318cbae1a6SVijay Mahadevan
5328cbae1a6SVijay Mahadevan PetscFunctionBegin;
5338cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
53457508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
5358cbae1a6SVijay Mahadevan
5368cbae1a6SVijay Mahadevan *dof = dmmoab->gidmap;
5373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
5388cbae1a6SVijay Mahadevan }
5398cbae1a6SVijay Mahadevan
54099fa7e03SVijay Mahadevan /*@C
54199fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
542a4e35b19SJacob Faibussowitsch array of locally owned MOAB mesh vertices.
54399fa7e03SVijay Mahadevan
54499fa7e03SVijay Mahadevan Not Collective
54599fa7e03SVijay Mahadevan
54699fa7e03SVijay Mahadevan Input Parameters:
547a2b725a8SWilliam Gropp . dm - the discretization manager object
54899fa7e03SVijay Mahadevan
54999fa7e03SVijay Mahadevan Output Parameter:
550a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
55199fa7e03SVijay Mahadevan
55299fa7e03SVijay Mahadevan Level: intermediate
55399fa7e03SVijay Mahadevan
554a4e35b19SJacob Faibussowitsch Note:
555a4e35b19SJacob Faibussowitsch It's utility is when performing Finite-Difference type calculations where vertex traversal is
556a4e35b19SJacob Faibussowitsch faster than element-wise assembly that is typically done in FEM calculations.
557a4e35b19SJacob Faibussowitsch
558db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlocked()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()`
55999fa7e03SVijay Mahadevan @*/
DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt ** dof)560d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt **dof)
561d71ae5a4SJacob Faibussowitsch {
5628cbae1a6SVijay Mahadevan DM_Moab *dmmoab;
5638cbae1a6SVijay Mahadevan
5648cbae1a6SVijay Mahadevan PetscFunctionBegin;
5658cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5664f572ea9SToby Isaac PetscAssertPointer(dof, 2);
56757508eceSPierre Jolivet dmmoab = (DM_Moab *)dm->data;
5688cbae1a6SVijay Mahadevan
5698cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap;
5703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
5718cbae1a6SVijay Mahadevan }
572