1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 28cbae1a6SVijay Mahadevan 38cbae1a6SVijay Mahadevan #include <petscdmmoab.h> 48cbae1a6SVijay Mahadevan 599fa7e03SVijay Mahadevan /*@C 699fa7e03SVijay Mahadevan DMMoabSetFieldVector - Sets the vector reference that represents the solution associated 799fa7e03SVijay Mahadevan with a particular field component. 899fa7e03SVijay Mahadevan 999fa7e03SVijay Mahadevan Not Collective 1099fa7e03SVijay Mahadevan 1199fa7e03SVijay Mahadevan Input Parameters: 1299fa7e03SVijay Mahadevan + dm - the discretization manager object 1399fa7e03SVijay Mahadevan . ifield - the index of the field as set before via DMMoabSetFieldName. 14a2b725a8SWilliam Gropp - fvec - the Vector solution corresponding to the field (component) 1599fa7e03SVijay Mahadevan 1699fa7e03SVijay Mahadevan Level: intermediate 1799fa7e03SVijay Mahadevan 1899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetGlobalFieldVector() 1999fa7e03SVijay Mahadevan @*/ 208cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 218cbae1a6SVijay Mahadevan { 228cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 238cbae1a6SVijay Mahadevan moab::Tag vtag, ntag; 248cbae1a6SVijay Mahadevan const PetscScalar *varray; 258cbae1a6SVijay Mahadevan PetscScalar *farray; 268cbae1a6SVijay Mahadevan moab::ErrorCode merr; 278cbae1a6SVijay Mahadevan PetscErrorCode ierr; 288cbae1a6SVijay Mahadevan std::string tag_name; 298cbae1a6SVijay Mahadevan 308cbae1a6SVijay Mahadevan PetscFunctionBegin; 318cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 328cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 338cbae1a6SVijay Mahadevan 34addae81cSVijay Mahadevan if ((ifield < 0) || (ifield >= dmmoab->numFields)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "The field %d should be positive and less than %d.", ifield, dmmoab->numFields); 35addae81cSVijay Mahadevan 368cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 37addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, 388cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr); 398cbae1a6SVijay Mahadevan 408cbae1a6SVijay Mahadevan ierr = DMMoabGetVecTag(fvec, &vtag);CHKERRQ(ierr); 418cbae1a6SVijay Mahadevan 428cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 438cbae1a6SVijay Mahadevan if (!tag_name.length() && merr != moab::MB_SUCCESS) { 448cbae1a6SVijay Mahadevan ierr = VecGetArrayRead(fvec, &varray);CHKERRQ(ierr); 458cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 468cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray); MBERRNM(merr); 478cbae1a6SVijay Mahadevan ierr = VecRestoreArrayRead(fvec, &varray);CHKERRQ(ierr); 488cbae1a6SVijay Mahadevan } 498cbae1a6SVijay Mahadevan else { 507ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->nloc, &farray);CHKERRQ(ierr); 518cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 528cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray); MBERRNM(merr); 538cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr); 548cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 558cbae1a6SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 568cbae1a6SVijay Mahadevan } 579daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 588cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned); MBERRNM(merr); 599daf19fdSVijay Mahadevan #endif 608cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 618cbae1a6SVijay Mahadevan } 628cbae1a6SVijay Mahadevan 6399fa7e03SVijay Mahadevan /*@C 6499fa7e03SVijay Mahadevan DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated 6599fa7e03SVijay Mahadevan with all fields (components) managed by DM. 6699fa7e03SVijay Mahadevan A useful utility when updating the DM solution after a solve, to be serialized with the mesh for 6799fa7e03SVijay Mahadevan checkpointing purposes. 6899fa7e03SVijay Mahadevan 6999fa7e03SVijay Mahadevan Not Collective 7099fa7e03SVijay Mahadevan 7199fa7e03SVijay Mahadevan Input Parameters: 7299fa7e03SVijay Mahadevan + dm - the discretization manager object 73a2b725a8SWilliam Gropp - fvec - the global Vector solution corresponding to all the fields managed by DM 7499fa7e03SVijay Mahadevan 7599fa7e03SVijay Mahadevan Level: intermediate 7699fa7e03SVijay Mahadevan 7799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector() 7899fa7e03SVijay Mahadevan @*/ 798cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) 808cbae1a6SVijay Mahadevan { 818cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 828cbae1a6SVijay Mahadevan moab::Tag vtag, ntag; 83f28b2503SVijay Mahadevan const PetscScalar *rarray; 84f28b2503SVijay Mahadevan PetscScalar *varray, *farray; 858cbae1a6SVijay Mahadevan moab::ErrorCode merr; 868cbae1a6SVijay Mahadevan PetscErrorCode ierr; 878cbae1a6SVijay Mahadevan PetscInt i, ifield; 888cbae1a6SVijay Mahadevan std::string tag_name; 898cbae1a6SVijay Mahadevan moab::Range::iterator iter; 908cbae1a6SVijay Mahadevan 918cbae1a6SVijay Mahadevan PetscFunctionBegin; 928cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 938cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 948cbae1a6SVijay Mahadevan 958cbae1a6SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */ 968cbae1a6SVijay Mahadevan ierr = DMMoabGetVecTag(fvec, &vtag);CHKERRQ(ierr); 978cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 987ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->nloc, &farray);CHKERRQ(ierr); 998cbae1a6SVijay Mahadevan if (!tag_name.length() && merr != moab::MB_SUCCESS) { 1008cbae1a6SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */ 101f28b2503SVijay Mahadevan ierr = VecGetArrayRead(fvec, &rarray);CHKERRQ(ierr); 102addae81cSVijay Mahadevan for (ifield = 0; ifield < dmmoab->numFields; ++ifield) { 1038cbae1a6SVijay Mahadevan 1048cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 105addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, 1068cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr); 1078cbae1a6SVijay Mahadevan 1088cbae1a6SVijay Mahadevan for (i = 0; i < dmmoab->nloc; i++) { 1093f1c6e43SVijay Mahadevan farray[i] = (dmmoab->bs == 1 ? rarray[ifield * dmmoab->nloc + i] : rarray[i * dmmoab->numFields + ifield]); 1108cbae1a6SVijay Mahadevan } 1118cbae1a6SVijay Mahadevan 1128cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 1138cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr); 1148cbae1a6SVijay Mahadevan } 115f28b2503SVijay Mahadevan ierr = VecRestoreArrayRead(fvec, &rarray);CHKERRQ(ierr); 1168cbae1a6SVijay Mahadevan } 1178cbae1a6SVijay Mahadevan else { 1187ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->nloc * dmmoab->numFields, &varray);CHKERRQ(ierr); 1198cbae1a6SVijay Mahadevan 1208cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1218cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray); MBERRNM(merr); 122addae81cSVijay Mahadevan for (ifield = 0; ifield < dmmoab->numFields; ++ifield) { 1238cbae1a6SVijay Mahadevan 1248cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 125addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, 1268cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr); 1278cbae1a6SVijay Mahadevan 1288cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1298cbae1a6SVijay Mahadevan for (i = 0; i < dmmoab->nloc; i++) { 1303f1c6e43SVijay Mahadevan farray[i] = (dmmoab->bs == 1 ? varray[ifield * dmmoab->nloc + i] : varray[i * dmmoab->numFields + ifield]); 1318cbae1a6SVijay Mahadevan } 1328cbae1a6SVijay Mahadevan 1338cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr); 1349daf19fdSVijay Mahadevan 1359daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1368cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 1378cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal); MBERRNM(merr); 1389daf19fdSVijay Mahadevan #endif 1398cbae1a6SVijay Mahadevan } 1408cbae1a6SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 1418cbae1a6SVijay Mahadevan } 1428cbae1a6SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 1438cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1448cbae1a6SVijay Mahadevan } 1458cbae1a6SVijay Mahadevan 14699fa7e03SVijay Mahadevan /*@C 14799fa7e03SVijay Mahadevan DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM 14899fa7e03SVijay Mahadevan 14999fa7e03SVijay Mahadevan Not Collective 15099fa7e03SVijay Mahadevan 15199fa7e03SVijay Mahadevan Input Parameters: 15299fa7e03SVijay Mahadevan + dm - the discretization manager object 15399fa7e03SVijay Mahadevan . numFields - the total number of fields 154a2b725a8SWilliam Gropp - fields - the array containing the names of each field (component); Can be NULL. 15599fa7e03SVijay Mahadevan 15699fa7e03SVijay Mahadevan Level: intermediate 15799fa7e03SVijay Mahadevan 15899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName() 15999fa7e03SVijay Mahadevan @*/ 160f28b2503SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm, PetscInt numFields, const char* fields[]) 1618cbae1a6SVijay Mahadevan { 162addae81cSVijay Mahadevan PetscErrorCode ierr; 163addae81cSVijay Mahadevan PetscInt i; 1648cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 1658cbae1a6SVijay Mahadevan 1668cbae1a6SVijay Mahadevan PetscFunctionBegin; 1678cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1688cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1698cbae1a6SVijay Mahadevan 170addae81cSVijay Mahadevan /* first deallocate the existing field structure */ 171addae81cSVijay Mahadevan if (dmmoab->fieldNames) { 172addae81cSVijay Mahadevan for (i = 0; i < dmmoab->numFields; i++) { 173addae81cSVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 174addae81cSVijay Mahadevan } 175addae81cSVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 176addae81cSVijay Mahadevan } 177addae81cSVijay Mahadevan 178addae81cSVijay Mahadevan /* now re-allocate and assign field names */ 179addae81cSVijay Mahadevan dmmoab->numFields = numFields; 18095dccacaSBarry Smith ierr = PetscMalloc1(numFields, &dmmoab->fieldNames);CHKERRQ(ierr); 181addae81cSVijay Mahadevan if (fields) { 182addae81cSVijay Mahadevan for (i = 0; i < dmmoab->numFields; i++) { 183addae81cSVijay Mahadevan ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr); 184addae81cSVijay Mahadevan } 185addae81cSVijay Mahadevan } 18663d025dbSVijay Mahadevan ierr = DMSetNumFields(dm, numFields);CHKERRQ(ierr); 1878cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1888cbae1a6SVijay Mahadevan } 1898cbae1a6SVijay Mahadevan 19099fa7e03SVijay Mahadevan /*@C 19199fa7e03SVijay Mahadevan DMMoabGetFieldName - Gets the names of individual field components in multicomponent 19299fa7e03SVijay Mahadevan vectors associated with a DMDA. 19399fa7e03SVijay Mahadevan 19499fa7e03SVijay Mahadevan Not Collective 19599fa7e03SVijay Mahadevan 196*d8d19677SJose E. Roman Input Parameters: 19799fa7e03SVijay Mahadevan + dm - the discretization manager object 198a2b725a8SWilliam Gropp - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the 19999fa7e03SVijay Mahadevan number of degrees of freedom per node within the DMMoab 20099fa7e03SVijay Mahadevan 20199fa7e03SVijay Mahadevan Output Parameter: 20299fa7e03SVijay Mahadevan . fieldName - the name of the field (component) 20399fa7e03SVijay Mahadevan 20499fa7e03SVijay Mahadevan Level: intermediate 20599fa7e03SVijay Mahadevan 20699fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields() 20799fa7e03SVijay Mahadevan @*/ 20899fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName) 20999fa7e03SVijay Mahadevan { 21099fa7e03SVijay Mahadevan DM_Moab *dmmoab; 21199fa7e03SVijay Mahadevan 21299fa7e03SVijay Mahadevan PetscFunctionBegin; 21399fa7e03SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 21499fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 21599fa7e03SVijay Mahadevan if ((field < 0) || (field >= dmmoab->numFields)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields); 21699fa7e03SVijay Mahadevan 21799fa7e03SVijay Mahadevan *fieldName = dmmoab->fieldNames[field]; 21899fa7e03SVijay Mahadevan PetscFunctionReturn(0); 21999fa7e03SVijay Mahadevan } 22099fa7e03SVijay Mahadevan 221c68c6878SVijay Mahadevan /*@C 22299fa7e03SVijay Mahadevan DMMoabSetFieldName - Sets the name of a field (component) managed by the DM 223c68c6878SVijay Mahadevan 224c68c6878SVijay Mahadevan Not Collective 225c68c6878SVijay Mahadevan 226c68c6878SVijay Mahadevan Input Parameters: 22799fa7e03SVijay Mahadevan + dm - the discretization manager object 228c68c6878SVijay Mahadevan . field - the field number 229a2b725a8SWilliam Gropp - fieldName - the field (component) name 230c68c6878SVijay Mahadevan 23199fa7e03SVijay Mahadevan Level: intermediate 23295452b02SPatrick Sanan Notes: 23395452b02SPatrick Sanan Can only be called after DMMoabSetFields supplied with correct numFields 234c68c6878SVijay Mahadevan 23599fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields() 236c68c6878SVijay Mahadevan @*/ 2375f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName) 238c68c6878SVijay Mahadevan { 239c68c6878SVijay Mahadevan PetscErrorCode ierr; 240c68c6878SVijay Mahadevan DM_Moab *dmmoab; 241c68c6878SVijay Mahadevan 242c68c6878SVijay Mahadevan PetscFunctionBegin; 243c68c6878SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2445f7ae369SVijay Mahadevan PetscValidCharPointer(fieldName, 3); 245c68c6878SVijay Mahadevan 24699fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 247c68c6878SVijay Mahadevan if ((field < 0) || (field >= dmmoab->numFields)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields); 24899fa7e03SVijay Mahadevan 24999fa7e03SVijay Mahadevan if (dmmoab->fieldNames[field]) { 250c68c6878SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr); 25199fa7e03SVijay Mahadevan } 2525f7ae369SVijay Mahadevan ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr); 253c68c6878SVijay Mahadevan PetscFunctionReturn(0); 254c68c6878SVijay Mahadevan } 255c68c6878SVijay Mahadevan 25699fa7e03SVijay Mahadevan /*@C 25799fa7e03SVijay Mahadevan DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a 25899fa7e03SVijay Mahadevan particular MOAB EntityHandle. 25999fa7e03SVijay Mahadevan 26099fa7e03SVijay Mahadevan Not Collective 26199fa7e03SVijay Mahadevan 26299fa7e03SVijay Mahadevan Input Parameters: 26399fa7e03SVijay Mahadevan + dm - the discretization manager object 26499fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values 265a2b725a8SWilliam Gropp - field - the field (component) index 26699fa7e03SVijay Mahadevan 26799fa7e03SVijay Mahadevan Output Parameter: 268a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat) 26999fa7e03SVijay Mahadevan 27099fa7e03SVijay Mahadevan Level: beginner 27199fa7e03SVijay Mahadevan 27299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal() 27399fa7e03SVijay Mahadevan @*/ 2748cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt* dof) 2758cbae1a6SVijay Mahadevan { 2768cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2778cbae1a6SVijay Mahadevan 2788cbae1a6SVijay Mahadevan PetscFunctionBegin; 2798cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2808cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 2818cbae1a6SVijay Mahadevan 282e92d1c7cSVijay Mahadevan *dof = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] + field * dmmoab->n : 283e92d1c7cSVijay Mahadevan dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] * dmmoab->numFields + field); 2848cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 2858cbae1a6SVijay Mahadevan } 2868cbae1a6SVijay Mahadevan 28799fa7e03SVijay Mahadevan /*@C 28899fa7e03SVijay Mahadevan DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an 28999fa7e03SVijay Mahadevan array of MOAB EntityHandles. 29099fa7e03SVijay Mahadevan 29199fa7e03SVijay Mahadevan Not Collective 29299fa7e03SVijay Mahadevan 29399fa7e03SVijay Mahadevan Input Parameters: 29499fa7e03SVijay Mahadevan + dm - the discretization manager object 29599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 29699fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 297a2b725a8SWilliam Gropp - field - the field (component) index 29899fa7e03SVijay Mahadevan 29999fa7e03SVijay Mahadevan Output Parameter: 300a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 30199fa7e03SVijay Mahadevan 30299fa7e03SVijay Mahadevan Level: intermediate 30399fa7e03SVijay Mahadevan 30499fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal() 30599fa7e03SVijay Mahadevan @*/ 3068cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof) 3078cbae1a6SVijay Mahadevan { 3088cbae1a6SVijay Mahadevan PetscInt i; 3098cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3108cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3118cbae1a6SVijay Mahadevan 3128cbae1a6SVijay Mahadevan PetscFunctionBegin; 3138cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 31499fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3158cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3168cbae1a6SVijay Mahadevan 3178cbae1a6SVijay Mahadevan if (!dof) { 3187ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr); 3198cbae1a6SVijay Mahadevan } 3208cbae1a6SVijay Mahadevan 3213f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 3223f1c6e43SVijay 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 */ 32399fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3248cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 325e92d1c7cSVijay Mahadevan dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n : 326e92d1c7cSVijay Mahadevan dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field); 3278cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3288cbae1a6SVijay Mahadevan } 3298cbae1a6SVijay Mahadevan 33099fa7e03SVijay Mahadevan /*@C 33199fa7e03SVijay Mahadevan DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an 33299fa7e03SVijay Mahadevan array of MOAB EntityHandles. 33399fa7e03SVijay Mahadevan 33499fa7e03SVijay Mahadevan Not Collective 33599fa7e03SVijay Mahadevan 33699fa7e03SVijay Mahadevan Input Parameters: 33799fa7e03SVijay Mahadevan + dm - the discretization manager object 33899fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 33999fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 340a2b725a8SWilliam Gropp - field - the field (component) index 34199fa7e03SVijay Mahadevan 34299fa7e03SVijay Mahadevan Output Parameter: 343a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 34499fa7e03SVijay Mahadevan 34599fa7e03SVijay Mahadevan Level: intermediate 34699fa7e03SVijay Mahadevan 34799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs() 34899fa7e03SVijay Mahadevan @*/ 3498cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof) 3508cbae1a6SVijay Mahadevan { 3513f1c6e43SVijay Mahadevan PetscInt i; 3528cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3538cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3548cbae1a6SVijay Mahadevan 3558cbae1a6SVijay Mahadevan PetscFunctionBegin; 3568cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 35799fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3588cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3598cbae1a6SVijay Mahadevan 3608cbae1a6SVijay Mahadevan if (!dof) { 3617ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr); 3628cbae1a6SVijay Mahadevan } 3638cbae1a6SVijay Mahadevan 3643f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 36599fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 36699fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3673f1c6e43SVijay Mahadevan for (i = 0; i < npoints; ++i) { 368e92d1c7cSVijay Mahadevan dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : 369e92d1c7cSVijay Mahadevan dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n); 3708cbae1a6SVijay Mahadevan } 3718cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3728cbae1a6SVijay Mahadevan } 3738cbae1a6SVijay Mahadevan 37499fa7e03SVijay Mahadevan /*@C 37599fa7e03SVijay Mahadevan DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an 37699fa7e03SVijay Mahadevan array of MOAB EntityHandles. 37799fa7e03SVijay Mahadevan 37899fa7e03SVijay Mahadevan Not Collective 37999fa7e03SVijay Mahadevan 38099fa7e03SVijay Mahadevan Input Parameters: 38199fa7e03SVijay Mahadevan + dm - the discretization manager object 38299fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 383a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 38499fa7e03SVijay Mahadevan 38599fa7e03SVijay Mahadevan Output Parameter: 386a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 38799fa7e03SVijay Mahadevan 38899fa7e03SVijay Mahadevan Level: intermediate 38999fa7e03SVijay Mahadevan 39099fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked() 39199fa7e03SVijay Mahadevan @*/ 3928cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 3938cbae1a6SVijay Mahadevan { 3948cbae1a6SVijay Mahadevan PetscInt i, field, offset; 3958cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3968cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3978cbae1a6SVijay Mahadevan 3988cbae1a6SVijay Mahadevan PetscFunctionBegin; 3998cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 40099fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 4018cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4028cbae1a6SVijay Mahadevan 4038cbae1a6SVijay Mahadevan if (!dof) { 4047ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->numFields * npoints, &dof);CHKERRQ(ierr); 4058cbae1a6SVijay Mahadevan } 4068cbae1a6SVijay Mahadevan 4073f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 40899fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 40999fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 410addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) { 41199fa7e03SVijay Mahadevan offset = field * dmmoab->n; 4128cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 413e92d1c7cSVijay Mahadevan dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : 414e92d1c7cSVijay Mahadevan dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset); 4158cbae1a6SVijay Mahadevan } 4168cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4178cbae1a6SVijay Mahadevan } 4188cbae1a6SVijay Mahadevan 41999fa7e03SVijay Mahadevan /*@C 42099fa7e03SVijay Mahadevan DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an 42199fa7e03SVijay Mahadevan array of MOAB EntityHandles. 42299fa7e03SVijay Mahadevan 42399fa7e03SVijay Mahadevan Not Collective 42499fa7e03SVijay Mahadevan 42599fa7e03SVijay Mahadevan Input Parameters: 42699fa7e03SVijay Mahadevan + dm - the discretization manager object 42799fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 428a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 42999fa7e03SVijay Mahadevan 43099fa7e03SVijay Mahadevan Output Parameter: 431a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 43299fa7e03SVijay Mahadevan 43399fa7e03SVijay Mahadevan Level: intermediate 43499fa7e03SVijay Mahadevan 43599fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked() 43699fa7e03SVijay Mahadevan @*/ 4378cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 4388cbae1a6SVijay Mahadevan { 4398cbae1a6SVijay Mahadevan PetscInt i, field, offset; 4408cbae1a6SVijay Mahadevan PetscErrorCode ierr; 4418cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4428cbae1a6SVijay Mahadevan 4438cbae1a6SVijay Mahadevan PetscFunctionBegin; 4448cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 44599fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 4468cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4478cbae1a6SVijay Mahadevan 4488cbae1a6SVijay Mahadevan if (!dof) { 4497ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->numFields * npoints, &dof);CHKERRQ(ierr); 4508cbae1a6SVijay Mahadevan } 4518cbae1a6SVijay Mahadevan 4523f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 45399fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 45499fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 455addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) { 45699fa7e03SVijay Mahadevan offset = field * dmmoab->n; 4578cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 458e92d1c7cSVijay Mahadevan dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : 459e92d1c7cSVijay Mahadevan dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset); 4608cbae1a6SVijay Mahadevan } 4618cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4628cbae1a6SVijay Mahadevan } 4638cbae1a6SVijay Mahadevan 46499fa7e03SVijay Mahadevan /*@C 46599fa7e03SVijay Mahadevan DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 46699fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation 46799fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 46899fa7e03SVijay Mahadevan 46999fa7e03SVijay Mahadevan Not Collective 47099fa7e03SVijay Mahadevan 47199fa7e03SVijay Mahadevan Input Parameters: 47299fa7e03SVijay Mahadevan + dm - the discretization manager object 47399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 474a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 47599fa7e03SVijay Mahadevan 47699fa7e03SVijay Mahadevan Output Parameter: 477a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) 47899fa7e03SVijay Mahadevan 47999fa7e03SVijay Mahadevan Level: intermediate 48099fa7e03SVijay Mahadevan 48199fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 48299fa7e03SVijay Mahadevan @*/ 4838cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 4848cbae1a6SVijay Mahadevan { 4858cbae1a6SVijay Mahadevan PetscInt i; 4868cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4878cbae1a6SVijay Mahadevan PetscErrorCode ierr; 4888cbae1a6SVijay Mahadevan 4898cbae1a6SVijay Mahadevan PetscFunctionBegin; 4908cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4913f1c6e43SVijay Mahadevan PetscValidPointer(points, 3); 4928cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4938cbae1a6SVijay Mahadevan 4948cbae1a6SVijay Mahadevan if (!dof) { 4957ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr); 4968cbae1a6SVijay Mahadevan } 4978cbae1a6SVijay Mahadevan 4988cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) { 4993f1c6e43SVijay Mahadevan dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart]; 5008cbae1a6SVijay Mahadevan } 5018cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5028cbae1a6SVijay Mahadevan } 5038cbae1a6SVijay Mahadevan 50499fa7e03SVijay Mahadevan /*@C 50599fa7e03SVijay Mahadevan DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 50699fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation 50799fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 50899fa7e03SVijay Mahadevan 50999fa7e03SVijay Mahadevan Not Collective 51099fa7e03SVijay Mahadevan 51199fa7e03SVijay Mahadevan Input Parameters: 51299fa7e03SVijay Mahadevan + dm - the discretization manager object 51399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 514a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 51599fa7e03SVijay Mahadevan 51699fa7e03SVijay Mahadevan Output Parameter: 517a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) 51899fa7e03SVijay Mahadevan 51999fa7e03SVijay Mahadevan Level: intermediate 52099fa7e03SVijay Mahadevan 52199fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 52299fa7e03SVijay Mahadevan @*/ 5238cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 5248cbae1a6SVijay Mahadevan { 5258cbae1a6SVijay Mahadevan PetscInt i; 5268cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5278cbae1a6SVijay Mahadevan PetscErrorCode ierr; 5288cbae1a6SVijay Mahadevan 5298cbae1a6SVijay Mahadevan PetscFunctionBegin; 5308cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5313f1c6e43SVijay Mahadevan PetscValidPointer(points, 3); 5328cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5338cbae1a6SVijay Mahadevan 5348cbae1a6SVijay Mahadevan if (!dof) { 5357ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr); 5368cbae1a6SVijay Mahadevan } 5378cbae1a6SVijay Mahadevan 5388cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 5393f1c6e43SVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart]; 5408cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5418cbae1a6SVijay Mahadevan } 5428cbae1a6SVijay Mahadevan 54399fa7e03SVijay Mahadevan /*@C 54499fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 54599fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 54699fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 54799fa7e03SVijay Mahadevan 54899fa7e03SVijay Mahadevan Not Collective 54999fa7e03SVijay Mahadevan 55099fa7e03SVijay Mahadevan Input Parameters: 551a2b725a8SWilliam Gropp . dm - the discretization manager object 55299fa7e03SVijay Mahadevan 55399fa7e03SVijay Mahadevan Output Parameter: 554a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 55599fa7e03SVijay Mahadevan 55699fa7e03SVijay Mahadevan Level: intermediate 55799fa7e03SVijay Mahadevan 55899fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 55999fa7e03SVijay Mahadevan @*/ 5608cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt** dof) 5618cbae1a6SVijay Mahadevan { 5628cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5638cbae1a6SVijay Mahadevan 5648cbae1a6SVijay Mahadevan PetscFunctionBegin; 5658cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5668cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5678cbae1a6SVijay Mahadevan 5688cbae1a6SVijay Mahadevan *dof = dmmoab->gidmap; 5698cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5708cbae1a6SVijay Mahadevan } 5718cbae1a6SVijay Mahadevan 57299fa7e03SVijay Mahadevan /*@C 57399fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 57499fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 57599fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 57699fa7e03SVijay Mahadevan 57799fa7e03SVijay Mahadevan Not Collective 57899fa7e03SVijay Mahadevan 57999fa7e03SVijay Mahadevan Input Parameters: 580a2b725a8SWilliam Gropp . dm - the discretization manager object 58199fa7e03SVijay Mahadevan 58299fa7e03SVijay Mahadevan Output Parameter: 583a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 58499fa7e03SVijay Mahadevan 58599fa7e03SVijay Mahadevan Level: intermediate 58699fa7e03SVijay Mahadevan 58799fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 58899fa7e03SVijay Mahadevan @*/ 5898cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt** dof) 5908cbae1a6SVijay Mahadevan { 5918cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5928cbae1a6SVijay Mahadevan 5938cbae1a6SVijay Mahadevan PetscFunctionBegin; 5948cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5958cbae1a6SVijay Mahadevan PetscValidPointer(dof, 2); 5968cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5978cbae1a6SVijay Mahadevan 5988cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap; 5998cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6008cbae1a6SVijay Mahadevan } 6018cbae1a6SVijay Mahadevan 602