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. 14*a2b725a8SWilliam Gropp - fvec - the Vector solution corresponding to the field (component) 1599fa7e03SVijay Mahadevan 1699fa7e03SVijay Mahadevan Level: intermediate 1799fa7e03SVijay Mahadevan 1899fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution 1999fa7e03SVijay Mahadevan 2099fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetGlobalFieldVector() 2199fa7e03SVijay Mahadevan @*/ 228cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 238cbae1a6SVijay Mahadevan { 248cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 258cbae1a6SVijay Mahadevan moab::Tag vtag, ntag; 268cbae1a6SVijay Mahadevan const PetscScalar *varray; 278cbae1a6SVijay Mahadevan PetscScalar *farray; 288cbae1a6SVijay Mahadevan moab::ErrorCode merr; 298cbae1a6SVijay Mahadevan PetscErrorCode ierr; 308cbae1a6SVijay Mahadevan std::string tag_name; 318cbae1a6SVijay Mahadevan 328cbae1a6SVijay Mahadevan PetscFunctionBegin; 338cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 348cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 358cbae1a6SVijay Mahadevan 36addae81cSVijay 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); 37addae81cSVijay Mahadevan 388cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 39addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, 408cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr); 418cbae1a6SVijay Mahadevan 428cbae1a6SVijay Mahadevan ierr = DMMoabGetVecTag(fvec, &vtag);CHKERRQ(ierr); 438cbae1a6SVijay Mahadevan 448cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 458cbae1a6SVijay Mahadevan if (!tag_name.length() && merr != moab::MB_SUCCESS) { 468cbae1a6SVijay Mahadevan ierr = VecGetArrayRead(fvec, &varray);CHKERRQ(ierr); 478cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 488cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray); MBERRNM(merr); 498cbae1a6SVijay Mahadevan ierr = VecRestoreArrayRead(fvec, &varray);CHKERRQ(ierr); 508cbae1a6SVijay Mahadevan } 518cbae1a6SVijay Mahadevan else { 527ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->nloc, &farray);CHKERRQ(ierr); 538cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 548cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray); MBERRNM(merr); 558cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr); 568cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 578cbae1a6SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 588cbae1a6SVijay Mahadevan } 599daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 608cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned); MBERRNM(merr); 619daf19fdSVijay Mahadevan #endif 628cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 638cbae1a6SVijay Mahadevan } 648cbae1a6SVijay Mahadevan 658cbae1a6SVijay Mahadevan 6699fa7e03SVijay Mahadevan /*@C 6799fa7e03SVijay Mahadevan DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated 6899fa7e03SVijay Mahadevan with all fields (components) managed by DM. 6999fa7e03SVijay Mahadevan A useful utility when updating the DM solution after a solve, to be serialized with the mesh for 7099fa7e03SVijay Mahadevan checkpointing purposes. 7199fa7e03SVijay Mahadevan 7299fa7e03SVijay Mahadevan Not Collective 7399fa7e03SVijay Mahadevan 7499fa7e03SVijay Mahadevan Input Parameters: 7599fa7e03SVijay Mahadevan + dm - the discretization manager object 76*a2b725a8SWilliam Gropp - fvec - the global Vector solution corresponding to all the fields managed by DM 7799fa7e03SVijay Mahadevan 7899fa7e03SVijay Mahadevan Level: intermediate 7999fa7e03SVijay Mahadevan 8099fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution 8199fa7e03SVijay Mahadevan 8299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector() 8399fa7e03SVijay Mahadevan @*/ 848cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) 858cbae1a6SVijay Mahadevan { 868cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 878cbae1a6SVijay Mahadevan moab::Tag vtag, ntag; 88f28b2503SVijay Mahadevan const PetscScalar *rarray; 89f28b2503SVijay Mahadevan PetscScalar *varray, *farray; 908cbae1a6SVijay Mahadevan moab::ErrorCode merr; 918cbae1a6SVijay Mahadevan PetscErrorCode ierr; 928cbae1a6SVijay Mahadevan PetscInt i, ifield; 938cbae1a6SVijay Mahadevan std::string tag_name; 948cbae1a6SVijay Mahadevan moab::Range::iterator iter; 958cbae1a6SVijay Mahadevan 968cbae1a6SVijay Mahadevan PetscFunctionBegin; 978cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 988cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 998cbae1a6SVijay Mahadevan 1008cbae1a6SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */ 1018cbae1a6SVijay Mahadevan ierr = DMMoabGetVecTag(fvec, &vtag);CHKERRQ(ierr); 1028cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 1037ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->nloc, &farray);CHKERRQ(ierr); 1048cbae1a6SVijay Mahadevan if (!tag_name.length() && merr != moab::MB_SUCCESS) { 1058cbae1a6SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */ 106f28b2503SVijay Mahadevan ierr = VecGetArrayRead(fvec, &rarray);CHKERRQ(ierr); 107addae81cSVijay Mahadevan for (ifield = 0; ifield < dmmoab->numFields; ++ifield) { 1088cbae1a6SVijay Mahadevan 1098cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 110addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, 1118cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr); 1128cbae1a6SVijay Mahadevan 1138cbae1a6SVijay Mahadevan for (i = 0; i < dmmoab->nloc; i++) { 1143f1c6e43SVijay Mahadevan farray[i] = (dmmoab->bs == 1 ? rarray[ifield * dmmoab->nloc + i] : rarray[i * dmmoab->numFields + ifield]); 1158cbae1a6SVijay Mahadevan } 1168cbae1a6SVijay Mahadevan 1178cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 1188cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr); 1198cbae1a6SVijay Mahadevan } 120f28b2503SVijay Mahadevan ierr = VecRestoreArrayRead(fvec, &rarray);CHKERRQ(ierr); 1218cbae1a6SVijay Mahadevan } 1228cbae1a6SVijay Mahadevan else { 1237ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->nloc * dmmoab->numFields, &varray);CHKERRQ(ierr); 1248cbae1a6SVijay Mahadevan 1258cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1268cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray); MBERRNM(merr); 127addae81cSVijay Mahadevan for (ifield = 0; ifield < dmmoab->numFields; ++ifield) { 1288cbae1a6SVijay Mahadevan 1298cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 130addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, 1318cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr); 1328cbae1a6SVijay Mahadevan 1338cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1348cbae1a6SVijay Mahadevan for (i = 0; i < dmmoab->nloc; i++) { 1353f1c6e43SVijay Mahadevan farray[i] = (dmmoab->bs == 1 ? varray[ifield * dmmoab->nloc + i] : varray[i * dmmoab->numFields + ifield]); 1368cbae1a6SVijay Mahadevan } 1378cbae1a6SVijay Mahadevan 1388cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr); 1399daf19fdSVijay Mahadevan 1409daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1418cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 1428cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal); MBERRNM(merr); 1439daf19fdSVijay Mahadevan #endif 1448cbae1a6SVijay Mahadevan } 1458cbae1a6SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 1468cbae1a6SVijay Mahadevan } 1478cbae1a6SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 1488cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1498cbae1a6SVijay Mahadevan } 1508cbae1a6SVijay Mahadevan 1518cbae1a6SVijay Mahadevan 15299fa7e03SVijay Mahadevan /*@C 15399fa7e03SVijay Mahadevan DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM 15499fa7e03SVijay Mahadevan 15599fa7e03SVijay Mahadevan Not Collective 15699fa7e03SVijay Mahadevan 15799fa7e03SVijay Mahadevan Input Parameters: 15899fa7e03SVijay Mahadevan + dm - the discretization manager object 15999fa7e03SVijay Mahadevan . numFields - the total number of fields 160*a2b725a8SWilliam Gropp - fields - the array containing the names of each field (component); Can be NULL. 16199fa7e03SVijay Mahadevan 16299fa7e03SVijay Mahadevan Level: intermediate 16399fa7e03SVijay Mahadevan 16499fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name 16599fa7e03SVijay Mahadevan 16699fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName() 16799fa7e03SVijay Mahadevan @*/ 168f28b2503SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm, PetscInt numFields, const char* fields[]) 1698cbae1a6SVijay Mahadevan { 170addae81cSVijay Mahadevan PetscErrorCode ierr; 171addae81cSVijay Mahadevan PetscInt i; 1728cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 1738cbae1a6SVijay Mahadevan 1748cbae1a6SVijay Mahadevan PetscFunctionBegin; 1758cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1768cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1778cbae1a6SVijay Mahadevan 178addae81cSVijay Mahadevan /* first deallocate the existing field structure */ 179addae81cSVijay Mahadevan if (dmmoab->fieldNames) { 180addae81cSVijay Mahadevan for (i = 0; i < dmmoab->numFields; i++) { 181addae81cSVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 182addae81cSVijay Mahadevan } 183addae81cSVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 184addae81cSVijay Mahadevan } 185addae81cSVijay Mahadevan 186addae81cSVijay Mahadevan /* now re-allocate and assign field names */ 187addae81cSVijay Mahadevan dmmoab->numFields = numFields; 18895dccacaSBarry Smith ierr = PetscMalloc1(numFields, &dmmoab->fieldNames);CHKERRQ(ierr); 189addae81cSVijay Mahadevan if (fields) { 190addae81cSVijay Mahadevan for (i = 0; i < dmmoab->numFields; i++) { 191addae81cSVijay Mahadevan ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr); 192addae81cSVijay Mahadevan } 193addae81cSVijay Mahadevan } 19463d025dbSVijay Mahadevan ierr = DMSetNumFields(dm, numFields);CHKERRQ(ierr); 1958cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1968cbae1a6SVijay Mahadevan } 1978cbae1a6SVijay Mahadevan 19899fa7e03SVijay Mahadevan 19999fa7e03SVijay Mahadevan /*@C 20099fa7e03SVijay Mahadevan DMMoabGetFieldName - Gets the names of individual field components in multicomponent 20199fa7e03SVijay Mahadevan vectors associated with a DMDA. 20299fa7e03SVijay Mahadevan 20399fa7e03SVijay Mahadevan Not Collective 20499fa7e03SVijay Mahadevan 20599fa7e03SVijay Mahadevan Input Parameter: 20699fa7e03SVijay Mahadevan + dm - the discretization manager object 207*a2b725a8SWilliam Gropp - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the 20899fa7e03SVijay Mahadevan number of degrees of freedom per node within the DMMoab 20999fa7e03SVijay Mahadevan 21099fa7e03SVijay Mahadevan Output Parameter: 21199fa7e03SVijay Mahadevan . fieldName - the name of the field (component) 21299fa7e03SVijay Mahadevan 21399fa7e03SVijay Mahadevan Level: intermediate 21499fa7e03SVijay Mahadevan 21599fa7e03SVijay Mahadevan .keywords: discretization manager, get, component name 21699fa7e03SVijay Mahadevan 21799fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields() 21899fa7e03SVijay Mahadevan @*/ 21999fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName) 22099fa7e03SVijay Mahadevan { 22199fa7e03SVijay Mahadevan DM_Moab *dmmoab; 22299fa7e03SVijay Mahadevan 22399fa7e03SVijay Mahadevan PetscFunctionBegin; 22499fa7e03SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 22599fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 22699fa7e03SVijay 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); 22799fa7e03SVijay Mahadevan 22899fa7e03SVijay Mahadevan *fieldName = dmmoab->fieldNames[field]; 22999fa7e03SVijay Mahadevan PetscFunctionReturn(0); 23099fa7e03SVijay Mahadevan } 23199fa7e03SVijay Mahadevan 23299fa7e03SVijay Mahadevan 233c68c6878SVijay Mahadevan /*@C 23499fa7e03SVijay Mahadevan DMMoabSetFieldName - Sets the name of a field (component) managed by the DM 235c68c6878SVijay Mahadevan 236c68c6878SVijay Mahadevan Not Collective 237c68c6878SVijay Mahadevan 238c68c6878SVijay Mahadevan Input Parameters: 23999fa7e03SVijay Mahadevan + dm - the discretization manager object 240c68c6878SVijay Mahadevan . field - the field number 241*a2b725a8SWilliam Gropp - fieldName - the field (component) name 242c68c6878SVijay Mahadevan 24399fa7e03SVijay Mahadevan Level: intermediate 24495452b02SPatrick Sanan Notes: 24595452b02SPatrick Sanan Can only be called after DMMoabSetFields supplied with correct numFields 246c68c6878SVijay Mahadevan 24799fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name 24899fa7e03SVijay Mahadevan 24999fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields() 250c68c6878SVijay Mahadevan @*/ 2515f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName) 252c68c6878SVijay Mahadevan { 253c68c6878SVijay Mahadevan PetscErrorCode ierr; 254c68c6878SVijay Mahadevan DM_Moab *dmmoab; 255c68c6878SVijay Mahadevan 256c68c6878SVijay Mahadevan PetscFunctionBegin; 257c68c6878SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2585f7ae369SVijay Mahadevan PetscValidCharPointer(fieldName, 3); 259c68c6878SVijay Mahadevan 26099fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 261c68c6878SVijay 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); 26299fa7e03SVijay Mahadevan 26399fa7e03SVijay Mahadevan if (dmmoab->fieldNames[field]) { 264c68c6878SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr); 26599fa7e03SVijay Mahadevan } 2665f7ae369SVijay Mahadevan ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr); 267c68c6878SVijay Mahadevan PetscFunctionReturn(0); 268c68c6878SVijay Mahadevan } 269c68c6878SVijay Mahadevan 2708cbae1a6SVijay Mahadevan 27199fa7e03SVijay Mahadevan /*@C 27299fa7e03SVijay Mahadevan DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a 27399fa7e03SVijay Mahadevan particular MOAB EntityHandle. 27499fa7e03SVijay Mahadevan 27599fa7e03SVijay Mahadevan Not Collective 27699fa7e03SVijay Mahadevan 27799fa7e03SVijay Mahadevan Input Parameters: 27899fa7e03SVijay Mahadevan + dm - the discretization manager object 27999fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values 280*a2b725a8SWilliam Gropp - field - the field (component) index 28199fa7e03SVijay Mahadevan 28299fa7e03SVijay Mahadevan Output Parameter: 283*a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat) 28499fa7e03SVijay Mahadevan 28599fa7e03SVijay Mahadevan Level: beginner 28699fa7e03SVijay Mahadevan 28799fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degree of freedom 28899fa7e03SVijay Mahadevan 28999fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal() 29099fa7e03SVijay Mahadevan @*/ 2918cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt* dof) 2928cbae1a6SVijay Mahadevan { 2938cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2948cbae1a6SVijay Mahadevan 2958cbae1a6SVijay Mahadevan PetscFunctionBegin; 2968cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2978cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 2988cbae1a6SVijay Mahadevan 299e92d1c7cSVijay Mahadevan *dof = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] + field * dmmoab->n : 300e92d1c7cSVijay Mahadevan dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] * dmmoab->numFields + field); 3018cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3028cbae1a6SVijay Mahadevan } 3038cbae1a6SVijay Mahadevan 3048cbae1a6SVijay Mahadevan 30599fa7e03SVijay Mahadevan /*@C 30699fa7e03SVijay Mahadevan DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an 30799fa7e03SVijay Mahadevan array of MOAB EntityHandles. 30899fa7e03SVijay Mahadevan 30999fa7e03SVijay Mahadevan Not Collective 31099fa7e03SVijay Mahadevan 31199fa7e03SVijay Mahadevan Input Parameters: 31299fa7e03SVijay Mahadevan + dm - the discretization manager object 31399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 31499fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 315*a2b725a8SWilliam Gropp - field - the field (component) index 31699fa7e03SVijay Mahadevan 31799fa7e03SVijay Mahadevan Output Parameter: 318*a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 31999fa7e03SVijay Mahadevan 32099fa7e03SVijay Mahadevan Level: intermediate 32199fa7e03SVijay Mahadevan 32299fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 32399fa7e03SVijay Mahadevan 32499fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal() 32599fa7e03SVijay Mahadevan @*/ 3268cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof) 3278cbae1a6SVijay Mahadevan { 3288cbae1a6SVijay Mahadevan PetscInt i; 3298cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3308cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3318cbae1a6SVijay Mahadevan 3328cbae1a6SVijay Mahadevan PetscFunctionBegin; 3338cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 33499fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3358cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3368cbae1a6SVijay Mahadevan 3378cbae1a6SVijay Mahadevan if (!dof) { 3387ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr); 3398cbae1a6SVijay Mahadevan } 3408cbae1a6SVijay Mahadevan 3413f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 3423f1c6e43SVijay 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 */ 34399fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3448cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 345e92d1c7cSVijay Mahadevan dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n : 346e92d1c7cSVijay Mahadevan dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field); 3478cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3488cbae1a6SVijay Mahadevan } 3498cbae1a6SVijay Mahadevan 3508cbae1a6SVijay Mahadevan 35199fa7e03SVijay Mahadevan /*@C 35299fa7e03SVijay Mahadevan DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an 35399fa7e03SVijay Mahadevan array of MOAB EntityHandles. 35499fa7e03SVijay Mahadevan 35599fa7e03SVijay Mahadevan Not Collective 35699fa7e03SVijay Mahadevan 35799fa7e03SVijay Mahadevan Input Parameters: 35899fa7e03SVijay Mahadevan + dm - the discretization manager object 35999fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 36099fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 361*a2b725a8SWilliam Gropp - field - the field (component) index 36299fa7e03SVijay Mahadevan 36399fa7e03SVijay Mahadevan Output Parameter: 364*a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 36599fa7e03SVijay Mahadevan 36699fa7e03SVijay Mahadevan Level: intermediate 36799fa7e03SVijay Mahadevan 36899fa7e03SVijay Mahadevan .keywords: discretization manager, get, local degrees of freedom 36999fa7e03SVijay Mahadevan 37099fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs() 37199fa7e03SVijay Mahadevan @*/ 3728cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof) 3738cbae1a6SVijay Mahadevan { 3743f1c6e43SVijay Mahadevan PetscInt i; 3758cbae1a6SVijay Mahadevan PetscErrorCode ierr; 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 3838cbae1a6SVijay Mahadevan if (!dof) { 3847ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr); 3858cbae1a6SVijay Mahadevan } 3868cbae1a6SVijay Mahadevan 3873f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 38899fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 38999fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3903f1c6e43SVijay Mahadevan for (i = 0; i < npoints; ++i) { 391e92d1c7cSVijay Mahadevan dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : 392e92d1c7cSVijay Mahadevan dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n); 3938cbae1a6SVijay Mahadevan } 3948cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3958cbae1a6SVijay Mahadevan } 3968cbae1a6SVijay Mahadevan 3978cbae1a6SVijay Mahadevan 39899fa7e03SVijay Mahadevan /*@C 39999fa7e03SVijay Mahadevan DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an 40099fa7e03SVijay Mahadevan array of MOAB EntityHandles. 40199fa7e03SVijay Mahadevan 40299fa7e03SVijay Mahadevan Not Collective 40399fa7e03SVijay Mahadevan 40499fa7e03SVijay Mahadevan Input Parameters: 40599fa7e03SVijay Mahadevan + dm - the discretization manager object 40699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 407*a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 40899fa7e03SVijay Mahadevan 40999fa7e03SVijay Mahadevan Output Parameter: 410*a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 41199fa7e03SVijay Mahadevan 41299fa7e03SVijay Mahadevan Level: intermediate 41399fa7e03SVijay Mahadevan 41499fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 41599fa7e03SVijay Mahadevan 41699fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked() 41799fa7e03SVijay Mahadevan @*/ 4188cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 4198cbae1a6SVijay Mahadevan { 4208cbae1a6SVijay Mahadevan PetscInt i, field, offset; 4218cbae1a6SVijay Mahadevan PetscErrorCode ierr; 4228cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4238cbae1a6SVijay Mahadevan 4248cbae1a6SVijay Mahadevan PetscFunctionBegin; 4258cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 42699fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 4278cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4288cbae1a6SVijay Mahadevan 4298cbae1a6SVijay Mahadevan if (!dof) { 4307ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->numFields * npoints, &dof);CHKERRQ(ierr); 4318cbae1a6SVijay Mahadevan } 4328cbae1a6SVijay Mahadevan 4333f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 43499fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 43599fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 436addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) { 43799fa7e03SVijay Mahadevan offset = field * dmmoab->n; 4388cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 439e92d1c7cSVijay Mahadevan dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : 440e92d1c7cSVijay Mahadevan dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset); 4418cbae1a6SVijay Mahadevan } 4428cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4438cbae1a6SVijay Mahadevan } 4448cbae1a6SVijay Mahadevan 44599fa7e03SVijay Mahadevan /*@C 44699fa7e03SVijay Mahadevan DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an 44799fa7e03SVijay Mahadevan array of MOAB EntityHandles. 44899fa7e03SVijay Mahadevan 44999fa7e03SVijay Mahadevan Not Collective 45099fa7e03SVijay Mahadevan 45199fa7e03SVijay Mahadevan Input Parameters: 45299fa7e03SVijay Mahadevan + dm - the discretization manager object 45399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 454*a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 45599fa7e03SVijay Mahadevan 45699fa7e03SVijay Mahadevan Output Parameter: 457*a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 45899fa7e03SVijay Mahadevan 45999fa7e03SVijay Mahadevan Level: intermediate 46099fa7e03SVijay Mahadevan 46199fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 46299fa7e03SVijay Mahadevan 46399fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked() 46499fa7e03SVijay Mahadevan @*/ 4658cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 4668cbae1a6SVijay Mahadevan { 4678cbae1a6SVijay Mahadevan PetscInt i, field, offset; 4688cbae1a6SVijay Mahadevan PetscErrorCode ierr; 4698cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4708cbae1a6SVijay Mahadevan 4718cbae1a6SVijay Mahadevan PetscFunctionBegin; 4728cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 47399fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 4748cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4758cbae1a6SVijay Mahadevan 4768cbae1a6SVijay Mahadevan if (!dof) { 4777ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->numFields * npoints, &dof);CHKERRQ(ierr); 4788cbae1a6SVijay Mahadevan } 4798cbae1a6SVijay Mahadevan 4803f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 48199fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 48299fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 483addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) { 48499fa7e03SVijay Mahadevan offset = field * dmmoab->n; 4858cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 486e92d1c7cSVijay Mahadevan dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : 487e92d1c7cSVijay Mahadevan dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset); 4888cbae1a6SVijay Mahadevan } 4898cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4908cbae1a6SVijay Mahadevan } 4918cbae1a6SVijay Mahadevan 4928cbae1a6SVijay Mahadevan 49399fa7e03SVijay Mahadevan /*@C 49499fa7e03SVijay Mahadevan DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 49599fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation 49699fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 49799fa7e03SVijay Mahadevan 49899fa7e03SVijay Mahadevan Not Collective 49999fa7e03SVijay Mahadevan 50099fa7e03SVijay Mahadevan Input Parameters: 50199fa7e03SVijay Mahadevan + dm - the discretization manager object 50299fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 503*a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 50499fa7e03SVijay Mahadevan 50599fa7e03SVijay Mahadevan Output Parameter: 506*a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) 50799fa7e03SVijay Mahadevan 50899fa7e03SVijay Mahadevan Level: intermediate 50999fa7e03SVijay Mahadevan 51099fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 51199fa7e03SVijay Mahadevan 51299fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 51399fa7e03SVijay Mahadevan @*/ 5148cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 5158cbae1a6SVijay Mahadevan { 5168cbae1a6SVijay Mahadevan PetscInt i; 5178cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5188cbae1a6SVijay Mahadevan PetscErrorCode ierr; 5198cbae1a6SVijay Mahadevan 5208cbae1a6SVijay Mahadevan PetscFunctionBegin; 5218cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5223f1c6e43SVijay Mahadevan PetscValidPointer(points, 3); 5238cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5248cbae1a6SVijay Mahadevan 5258cbae1a6SVijay Mahadevan if (!dof) { 5267ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr); 5278cbae1a6SVijay Mahadevan } 5288cbae1a6SVijay Mahadevan 5298cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) { 5303f1c6e43SVijay Mahadevan dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart]; 5318cbae1a6SVijay Mahadevan } 5328cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5338cbae1a6SVijay Mahadevan } 5348cbae1a6SVijay Mahadevan 5358cbae1a6SVijay Mahadevan 53699fa7e03SVijay Mahadevan /*@C 53799fa7e03SVijay Mahadevan DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 53899fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation 53999fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 54099fa7e03SVijay Mahadevan 54199fa7e03SVijay Mahadevan Not Collective 54299fa7e03SVijay Mahadevan 54399fa7e03SVijay Mahadevan Input Parameters: 54499fa7e03SVijay Mahadevan + dm - the discretization manager object 54599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 546*a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 54799fa7e03SVijay Mahadevan 54899fa7e03SVijay Mahadevan Output Parameter: 549*a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) 55099fa7e03SVijay Mahadevan 55199fa7e03SVijay Mahadevan Level: intermediate 55299fa7e03SVijay Mahadevan 55399fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 55499fa7e03SVijay Mahadevan 55599fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 55699fa7e03SVijay Mahadevan @*/ 5578cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 5588cbae1a6SVijay Mahadevan { 5598cbae1a6SVijay Mahadevan PetscInt i; 5608cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5618cbae1a6SVijay Mahadevan PetscErrorCode ierr; 5628cbae1a6SVijay Mahadevan 5638cbae1a6SVijay Mahadevan PetscFunctionBegin; 5648cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5653f1c6e43SVijay Mahadevan PetscValidPointer(points, 3); 5668cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5678cbae1a6SVijay Mahadevan 5688cbae1a6SVijay Mahadevan if (!dof) { 5697ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints, &dof);CHKERRQ(ierr); 5708cbae1a6SVijay Mahadevan } 5718cbae1a6SVijay Mahadevan 5728cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 5733f1c6e43SVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart]; 5748cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5758cbae1a6SVijay Mahadevan } 5768cbae1a6SVijay Mahadevan 5778cbae1a6SVijay Mahadevan 57899fa7e03SVijay Mahadevan /*@C 57999fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 58099fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 58199fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 58299fa7e03SVijay Mahadevan 58399fa7e03SVijay Mahadevan Not Collective 58499fa7e03SVijay Mahadevan 58599fa7e03SVijay Mahadevan Input Parameters: 586*a2b725a8SWilliam Gropp . dm - the discretization manager object 58799fa7e03SVijay Mahadevan 58899fa7e03SVijay Mahadevan Output Parameter: 589*a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 59099fa7e03SVijay Mahadevan 59199fa7e03SVijay Mahadevan Level: intermediate 59299fa7e03SVijay Mahadevan 59399fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom 59499fa7e03SVijay Mahadevan 59599fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 59699fa7e03SVijay Mahadevan @*/ 5978cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt** dof) 5988cbae1a6SVijay Mahadevan { 5998cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 6008cbae1a6SVijay Mahadevan 6018cbae1a6SVijay Mahadevan PetscFunctionBegin; 6028cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6038cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6048cbae1a6SVijay Mahadevan 6058cbae1a6SVijay Mahadevan *dof = dmmoab->gidmap; 6068cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6078cbae1a6SVijay Mahadevan } 6088cbae1a6SVijay Mahadevan 6098cbae1a6SVijay Mahadevan 61099fa7e03SVijay Mahadevan /*@C 61199fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 61299fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 61399fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 61499fa7e03SVijay Mahadevan 61599fa7e03SVijay Mahadevan Not Collective 61699fa7e03SVijay Mahadevan 61799fa7e03SVijay Mahadevan Input Parameters: 618*a2b725a8SWilliam Gropp . dm - the discretization manager object 61999fa7e03SVijay Mahadevan 62099fa7e03SVijay Mahadevan Output Parameter: 621*a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 62299fa7e03SVijay Mahadevan 62399fa7e03SVijay Mahadevan Level: intermediate 62499fa7e03SVijay Mahadevan 62599fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom 62699fa7e03SVijay Mahadevan 62799fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 62899fa7e03SVijay Mahadevan @*/ 6298cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt** dof) 6308cbae1a6SVijay Mahadevan { 6318cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 6328cbae1a6SVijay Mahadevan 6338cbae1a6SVijay Mahadevan PetscFunctionBegin; 6348cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6358cbae1a6SVijay Mahadevan PetscValidPointer(dof, 2); 6368cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6378cbae1a6SVijay Mahadevan 6388cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap; 6398cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6408cbae1a6SVijay Mahadevan } 6418cbae1a6SVijay Mahadevan 642