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 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 @*/ 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)); 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 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)); 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 @*/ 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]; 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 @*/ 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 23999fa7e03SVijay Mahadevan 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 @*/ 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); 2718cbae1a6SVijay Mahadevan 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 @*/ 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); 3048cbae1a6SVijay Mahadevan 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 @*/ 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); 3438cbae1a6SVijay Mahadevan 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 @*/ 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); 3828cbae1a6SVijay Mahadevan 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 @*/ 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); 4238cbae1a6SVijay Mahadevan 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 @*/ 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); 4658cbae1a6SVijay Mahadevan 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 @*/ 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); 5008cbae1a6SVijay Mahadevan 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 510*a4e35b19SJacob 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 522*a4e35b19SJacob Faibussowitsch Note: 523*a4e35b19SJacob Faibussowitsch It's utility is when performing Finite-Difference type calculations where vertex traversal is 524*a4e35b19SJacob Faibussowitsch faster than element-wise assembly that is typically done in FEM calculations. 525*a4e35b19SJacob Faibussowitsch 526db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlockedLocal()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()` 52799fa7e03SVijay Mahadevan @*/ 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); 5348cbae1a6SVijay Mahadevan 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 542*a4e35b19SJacob 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 554*a4e35b19SJacob Faibussowitsch Note: 555*a4e35b19SJacob Faibussowitsch It's utility is when performing Finite-Difference type calculations where vertex traversal is 556*a4e35b19SJacob Faibussowitsch faster than element-wise assembly that is typically done in FEM calculations. 557*a4e35b19SJacob Faibussowitsch 558db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlocked()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()` 55999fa7e03SVijay Mahadevan @*/ 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); 5678cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 5688cbae1a6SVijay Mahadevan 5698cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap; 5703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5718cbae1a6SVijay Mahadevan } 572