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 @*/ 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); 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 */ 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 62*3ba16761SJacob 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 @*/ 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); 948cbae1a6SVijay Mahadevan 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) { 1048cbae1a6SVijay Mahadevan /* 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) { 1228cbae1a6SVijay Mahadevan /* 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)); 141*3ba16761SJacob 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 152a2b725a8SWilliam Gropp - 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 @*/ 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); 1658cbae1a6SVijay Mahadevan 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)); 180*3ba16761SJacob 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 @*/ 201d71ae5a4SJacob Faibussowitsch 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); 20799fa7e03SVijay Mahadevan 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]; 211*3ba16761SJacob 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 22595452b02SPatrick Sanan Notes: 22695452b02SPatrick Sanan Can only be called after DMMoabSetFields supplied with correct numFields 227c68c6878SVijay Mahadevan 228db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFields()` 229c68c6878SVijay Mahadevan @*/ 230d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName) 231d71ae5a4SJacob Faibussowitsch { 232c68c6878SVijay Mahadevan DM_Moab *dmmoab; 233c68c6878SVijay Mahadevan 234c68c6878SVijay Mahadevan PetscFunctionBegin; 235c68c6878SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2365f7ae369SVijay Mahadevan PetscValidCharPointer(fieldName, 3); 237c68c6878SVijay Mahadevan 23899fa7e03SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 23908401ef6SPierre 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); 24099fa7e03SVijay Mahadevan 24148a46eb9SPierre Jolivet if (dmmoab->fieldNames[field]) PetscCall(PetscFree(dmmoab->fieldNames[field])); 2429566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(fieldName, (char **)&dmmoab->fieldNames[field])); 243*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 244c68c6878SVijay Mahadevan } 245c68c6878SVijay Mahadevan 24699fa7e03SVijay Mahadevan /*@C 24799fa7e03SVijay Mahadevan DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a 24899fa7e03SVijay Mahadevan particular MOAB EntityHandle. 24999fa7e03SVijay Mahadevan 25099fa7e03SVijay Mahadevan Not Collective 25199fa7e03SVijay Mahadevan 25299fa7e03SVijay Mahadevan Input Parameters: 25399fa7e03SVijay Mahadevan + dm - the discretization manager object 25499fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values 255a2b725a8SWilliam Gropp - field - the field (component) index 25699fa7e03SVijay Mahadevan 25799fa7e03SVijay Mahadevan Output Parameter: 258a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat) 25999fa7e03SVijay Mahadevan 26099fa7e03SVijay Mahadevan Level: beginner 26199fa7e03SVijay Mahadevan 262db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetFieldDofsLocal()` 26399fa7e03SVijay Mahadevan @*/ 264d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt *dof) 265d71ae5a4SJacob Faibussowitsch { 2668cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2678cbae1a6SVijay Mahadevan 2688cbae1a6SVijay Mahadevan PetscFunctionBegin; 2698cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2708cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 2718cbae1a6SVijay Mahadevan 2729371c9d4SSatish 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); 273*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2748cbae1a6SVijay Mahadevan } 2758cbae1a6SVijay Mahadevan 27699fa7e03SVijay Mahadevan /*@C 27799fa7e03SVijay Mahadevan DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an 27899fa7e03SVijay Mahadevan array of MOAB EntityHandles. 27999fa7e03SVijay Mahadevan 28099fa7e03SVijay Mahadevan Not Collective 28199fa7e03SVijay Mahadevan 28299fa7e03SVijay Mahadevan Input Parameters: 28399fa7e03SVijay Mahadevan + dm - the discretization manager object 28499fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 28599fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 286a2b725a8SWilliam Gropp - field - the field (component) index 28799fa7e03SVijay Mahadevan 28899fa7e03SVijay Mahadevan Output Parameter: 289a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 29099fa7e03SVijay Mahadevan 29199fa7e03SVijay Mahadevan Level: intermediate 29299fa7e03SVijay Mahadevan 293db781477SPatrick Sanan .seealso: `DMMoabGetFieldDof()`, `DMMoabGetFieldDofsLocal()` 29499fa7e03SVijay Mahadevan @*/ 295d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt field, PetscInt *dof) 296d71ae5a4SJacob Faibussowitsch { 2978cbae1a6SVijay Mahadevan PetscInt i; 2988cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2998cbae1a6SVijay Mahadevan 3008cbae1a6SVijay Mahadevan PetscFunctionBegin; 3018cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 30299fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3038cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 3048cbae1a6SVijay Mahadevan 30548a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(npoints, &dof)); 3068cbae1a6SVijay Mahadevan 3073f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 3083f1c6e43SVijay 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 */ 30999fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3108cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 3119371c9d4SSatish 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); 312*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3138cbae1a6SVijay Mahadevan } 3148cbae1a6SVijay Mahadevan 31599fa7e03SVijay Mahadevan /*@C 31699fa7e03SVijay Mahadevan DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an 31799fa7e03SVijay Mahadevan array of MOAB EntityHandles. 31899fa7e03SVijay Mahadevan 31999fa7e03SVijay Mahadevan Not Collective 32099fa7e03SVijay Mahadevan 32199fa7e03SVijay Mahadevan Input Parameters: 32299fa7e03SVijay Mahadevan + dm - the discretization manager object 32399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 32499fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 325a2b725a8SWilliam Gropp - field - the field (component) index 32699fa7e03SVijay Mahadevan 32799fa7e03SVijay Mahadevan Output Parameter: 328a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 32999fa7e03SVijay Mahadevan 33099fa7e03SVijay Mahadevan Level: intermediate 33199fa7e03SVijay Mahadevan 332db781477SPatrick Sanan .seealso: `DMMoabGetFieldDof()`, `DMMoabGetFieldDofs()` 33399fa7e03SVijay Mahadevan @*/ 334d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt field, PetscInt *dof) 335d71ae5a4SJacob Faibussowitsch { 3363f1c6e43SVijay Mahadevan PetscInt i; 3378cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3388cbae1a6SVijay Mahadevan 3398cbae1a6SVijay Mahadevan PetscFunctionBegin; 3408cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 34199fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3428cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 3438cbae1a6SVijay Mahadevan 34448a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(npoints, &dof)); 3458cbae1a6SVijay Mahadevan 3463f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 34799fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 34899fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3493f1c6e43SVijay Mahadevan for (i = 0; i < npoints; ++i) { 3509371c9d4SSatish 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); 3518cbae1a6SVijay Mahadevan } 352*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3538cbae1a6SVijay Mahadevan } 3548cbae1a6SVijay Mahadevan 35599fa7e03SVijay Mahadevan /*@C 35699fa7e03SVijay Mahadevan DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an 35799fa7e03SVijay Mahadevan array of MOAB EntityHandles. 35899fa7e03SVijay Mahadevan 35999fa7e03SVijay Mahadevan Not Collective 36099fa7e03SVijay Mahadevan 36199fa7e03SVijay Mahadevan Input Parameters: 36299fa7e03SVijay Mahadevan + dm - the discretization manager object 36399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 364a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 36599fa7e03SVijay Mahadevan 36699fa7e03SVijay Mahadevan Output Parameter: 367a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 36899fa7e03SVijay Mahadevan 36999fa7e03SVijay Mahadevan Level: intermediate 37099fa7e03SVijay Mahadevan 371db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetDofsLocal()`, `DMMoabGetDofsBlocked()` 37299fa7e03SVijay Mahadevan @*/ 373d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) 374d71ae5a4SJacob Faibussowitsch { 3758cbae1a6SVijay Mahadevan PetscInt i, field, offset; 3768cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3778cbae1a6SVijay Mahadevan 3788cbae1a6SVijay Mahadevan PetscFunctionBegin; 3798cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 38099fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3818cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 3828cbae1a6SVijay Mahadevan 38348a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof)); 3848cbae1a6SVijay Mahadevan 3853f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 38699fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 38799fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 388addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) { 38999fa7e03SVijay Mahadevan offset = field * dmmoab->n; 3908cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 3919371c9d4SSatish 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); 3928cbae1a6SVijay Mahadevan } 393*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3948cbae1a6SVijay Mahadevan } 3958cbae1a6SVijay Mahadevan 39699fa7e03SVijay Mahadevan /*@C 39799fa7e03SVijay Mahadevan DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an 39899fa7e03SVijay Mahadevan array of MOAB EntityHandles. 39999fa7e03SVijay Mahadevan 40099fa7e03SVijay Mahadevan Not Collective 40199fa7e03SVijay Mahadevan 40299fa7e03SVijay Mahadevan Input Parameters: 40399fa7e03SVijay Mahadevan + dm - the discretization manager object 40499fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 405a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 40699fa7e03SVijay Mahadevan 40799fa7e03SVijay Mahadevan Output Parameter: 408a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 40999fa7e03SVijay Mahadevan 41099fa7e03SVijay Mahadevan Level: intermediate 41199fa7e03SVijay Mahadevan 412db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlocked()` 41399fa7e03SVijay Mahadevan @*/ 414d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) 415d71ae5a4SJacob Faibussowitsch { 4168cbae1a6SVijay Mahadevan PetscInt i, field, offset; 4178cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4188cbae1a6SVijay Mahadevan 4198cbae1a6SVijay Mahadevan PetscFunctionBegin; 4208cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 42199fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 4228cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 4238cbae1a6SVijay Mahadevan 42448a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof)); 4258cbae1a6SVijay Mahadevan 4263f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 42799fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 42899fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 429addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) { 43099fa7e03SVijay Mahadevan offset = field * dmmoab->n; 4318cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 4329371c9d4SSatish 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); 4338cbae1a6SVijay Mahadevan } 434*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4358cbae1a6SVijay Mahadevan } 4368cbae1a6SVijay Mahadevan 43799fa7e03SVijay Mahadevan /*@C 43899fa7e03SVijay Mahadevan DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 43999fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation 44099fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 44199fa7e03SVijay Mahadevan 44299fa7e03SVijay Mahadevan Not Collective 44399fa7e03SVijay Mahadevan 44499fa7e03SVijay Mahadevan Input Parameters: 44599fa7e03SVijay Mahadevan + dm - the discretization manager object 44699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 447a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 44899fa7e03SVijay Mahadevan 44999fa7e03SVijay Mahadevan Output Parameter: 450a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) 45199fa7e03SVijay Mahadevan 45299fa7e03SVijay Mahadevan Level: intermediate 45399fa7e03SVijay Mahadevan 454db781477SPatrick Sanan .seealso: `DMMoabGetDofsLocal()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlockedLocal()` 45599fa7e03SVijay Mahadevan @*/ 456d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) 457d71ae5a4SJacob Faibussowitsch { 4588cbae1a6SVijay Mahadevan PetscInt i; 4598cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4608cbae1a6SVijay Mahadevan 4618cbae1a6SVijay Mahadevan PetscFunctionBegin; 4628cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4633f1c6e43SVijay Mahadevan PetscValidPointer(points, 3); 4648cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 4658cbae1a6SVijay Mahadevan 46648a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(npoints, &dof)); 4678cbae1a6SVijay Mahadevan 468ad540459SPierre Jolivet for (i = 0; i < npoints; ++i) dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart]; 469*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4708cbae1a6SVijay Mahadevan } 4718cbae1a6SVijay Mahadevan 47299fa7e03SVijay Mahadevan /*@C 47399fa7e03SVijay Mahadevan DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 47499fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation 47599fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 47699fa7e03SVijay Mahadevan 47799fa7e03SVijay Mahadevan Not Collective 47899fa7e03SVijay Mahadevan 47999fa7e03SVijay Mahadevan Input Parameters: 48099fa7e03SVijay Mahadevan + dm - the discretization manager object 48199fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 482a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 48399fa7e03SVijay Mahadevan 48499fa7e03SVijay Mahadevan Output Parameter: 485a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) 48699fa7e03SVijay Mahadevan 48799fa7e03SVijay Mahadevan Level: intermediate 48899fa7e03SVijay Mahadevan 489db781477SPatrick Sanan .seealso: `DMMoabGetDofsLocal()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlockedLocal()` 49099fa7e03SVijay Mahadevan @*/ 491d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) 492d71ae5a4SJacob Faibussowitsch { 4938cbae1a6SVijay Mahadevan PetscInt i; 4948cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4958cbae1a6SVijay Mahadevan 4968cbae1a6SVijay Mahadevan PetscFunctionBegin; 4978cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4983f1c6e43SVijay Mahadevan PetscValidPointer(points, 3); 4998cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 5008cbae1a6SVijay Mahadevan 5019566063dSJacob Faibussowitsch if (!dof) PetscCall(PetscMalloc1(npoints, &dof)); 5028cbae1a6SVijay Mahadevan 5035f80ce2aSJacob Faibussowitsch for (i = 0; i < npoints; ++i) dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart]; 504*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5058cbae1a6SVijay Mahadevan } 5068cbae1a6SVijay Mahadevan 50799fa7e03SVijay Mahadevan /*@C 50899fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 50999fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 51099fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 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 522db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlockedLocal()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()` 52399fa7e03SVijay Mahadevan @*/ 524d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt **dof) 525d71ae5a4SJacob Faibussowitsch { 5268cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5278cbae1a6SVijay Mahadevan 5288cbae1a6SVijay Mahadevan PetscFunctionBegin; 5298cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5308cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 5318cbae1a6SVijay Mahadevan 5328cbae1a6SVijay Mahadevan *dof = dmmoab->gidmap; 533*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5348cbae1a6SVijay Mahadevan } 5358cbae1a6SVijay Mahadevan 53699fa7e03SVijay Mahadevan /*@C 53799fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 53899fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 53999fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 54099fa7e03SVijay Mahadevan 54199fa7e03SVijay Mahadevan Not Collective 54299fa7e03SVijay Mahadevan 54399fa7e03SVijay Mahadevan Input Parameters: 544a2b725a8SWilliam Gropp . dm - the discretization manager object 54599fa7e03SVijay Mahadevan 54699fa7e03SVijay Mahadevan Output Parameter: 547a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 54899fa7e03SVijay Mahadevan 54999fa7e03SVijay Mahadevan Level: intermediate 55099fa7e03SVijay Mahadevan 551db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlocked()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()` 55299fa7e03SVijay Mahadevan @*/ 553d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt **dof) 554d71ae5a4SJacob Faibussowitsch { 5558cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5568cbae1a6SVijay Mahadevan 5578cbae1a6SVijay Mahadevan PetscFunctionBegin; 5588cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5598cbae1a6SVijay Mahadevan PetscValidPointer(dof, 2); 5608cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 5618cbae1a6SVijay Mahadevan 5628cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap; 563*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5648cbae1a6SVijay Mahadevan } 565