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. 14b8ecf6d3SVijay Mahadevan . 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 } 59*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 608cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);MBERRNM(merr); 61*9daf19fdSVijay 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 76b8ecf6d3SVijay Mahadevan . 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); 139*9daf19fdSVijay Mahadevan 140*9daf19fdSVijay 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); 143*9daf19fdSVijay 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 160b8ecf6d3SVijay Mahadevan . 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 } 1948cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1958cbae1a6SVijay Mahadevan } 1968cbae1a6SVijay Mahadevan 19799fa7e03SVijay Mahadevan 19899fa7e03SVijay Mahadevan /*@C 19999fa7e03SVijay Mahadevan DMMoabGetFieldName - Gets the names of individual field components in multicomponent 20099fa7e03SVijay Mahadevan vectors associated with a DMDA. 20199fa7e03SVijay Mahadevan 20299fa7e03SVijay Mahadevan Not Collective 20399fa7e03SVijay Mahadevan 20499fa7e03SVijay Mahadevan Input Parameter: 20599fa7e03SVijay Mahadevan + dm - the discretization manager object 206b8ecf6d3SVijay Mahadevan . field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the 20799fa7e03SVijay Mahadevan number of degrees of freedom per node within the DMMoab 20899fa7e03SVijay Mahadevan 20999fa7e03SVijay Mahadevan Output Parameter: 21099fa7e03SVijay Mahadevan . fieldName - the name of the field (component) 21199fa7e03SVijay Mahadevan 21299fa7e03SVijay Mahadevan Level: intermediate 21399fa7e03SVijay Mahadevan 21499fa7e03SVijay Mahadevan .keywords: discretization manager, get, component name 21599fa7e03SVijay Mahadevan 21699fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields() 21799fa7e03SVijay Mahadevan @*/ 21899fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName) 21999fa7e03SVijay Mahadevan { 22099fa7e03SVijay Mahadevan DM_Moab *dmmoab; 22199fa7e03SVijay Mahadevan 22299fa7e03SVijay Mahadevan PetscFunctionBegin; 22399fa7e03SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 22499fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 22599fa7e03SVijay 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); 22699fa7e03SVijay Mahadevan 22799fa7e03SVijay Mahadevan *fieldName = dmmoab->fieldNames[field]; 22899fa7e03SVijay Mahadevan PetscFunctionReturn(0); 22999fa7e03SVijay Mahadevan } 23099fa7e03SVijay Mahadevan 23199fa7e03SVijay Mahadevan 232c68c6878SVijay Mahadevan /*@C 23399fa7e03SVijay Mahadevan DMMoabSetFieldName - Sets the name of a field (component) managed by the DM 234c68c6878SVijay Mahadevan 235c68c6878SVijay Mahadevan Not Collective 236c68c6878SVijay Mahadevan 237c68c6878SVijay Mahadevan Input Parameters: 23899fa7e03SVijay Mahadevan + dm - the discretization manager object 239c68c6878SVijay Mahadevan . field - the field number 240b8ecf6d3SVijay Mahadevan . fieldName - the field (component) name 241c68c6878SVijay Mahadevan 24299fa7e03SVijay Mahadevan Level: intermediate 24399fa7e03SVijay Mahadevan Notes: Can only be called after DMMoabSetFields supplied with correct numFields 244c68c6878SVijay Mahadevan 24599fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name 24699fa7e03SVijay Mahadevan 24799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields() 248c68c6878SVijay Mahadevan @*/ 2495f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName) 250c68c6878SVijay Mahadevan { 251c68c6878SVijay Mahadevan PetscErrorCode ierr; 252c68c6878SVijay Mahadevan DM_Moab *dmmoab; 253c68c6878SVijay Mahadevan 254c68c6878SVijay Mahadevan PetscFunctionBegin; 255c68c6878SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2565f7ae369SVijay Mahadevan PetscValidCharPointer(fieldName,3); 257c68c6878SVijay Mahadevan 25899fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 259c68c6878SVijay 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); 26099fa7e03SVijay Mahadevan 26199fa7e03SVijay Mahadevan if (dmmoab->fieldNames[field]) { 262c68c6878SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr); 26399fa7e03SVijay Mahadevan } 2645f7ae369SVijay Mahadevan ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr); 265c68c6878SVijay Mahadevan PetscFunctionReturn(0); 266c68c6878SVijay Mahadevan } 267c68c6878SVijay Mahadevan 2688cbae1a6SVijay Mahadevan 26999fa7e03SVijay Mahadevan /*@C 27099fa7e03SVijay Mahadevan DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a 27199fa7e03SVijay Mahadevan particular MOAB EntityHandle. 27299fa7e03SVijay Mahadevan 27399fa7e03SVijay Mahadevan Not Collective 27499fa7e03SVijay Mahadevan 27599fa7e03SVijay Mahadevan Input Parameters: 27699fa7e03SVijay Mahadevan + dm - the discretization manager object 27799fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values 278b8ecf6d3SVijay Mahadevan . field - the field (component) index 27999fa7e03SVijay Mahadevan 28099fa7e03SVijay Mahadevan Output Parameter: 28199fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat) 28299fa7e03SVijay Mahadevan 28399fa7e03SVijay Mahadevan Level: beginner 28499fa7e03SVijay Mahadevan 28599fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degree of freedom 28699fa7e03SVijay Mahadevan 28799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal() 28899fa7e03SVijay Mahadevan @*/ 2898cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 2908cbae1a6SVijay Mahadevan { 2918cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2928cbae1a6SVijay Mahadevan 2938cbae1a6SVijay Mahadevan PetscFunctionBegin; 2948cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2958cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 2968cbae1a6SVijay Mahadevan 2973f1c6e43SVijay Mahadevan *dof=dmmoab->gidmap[((PetscInt)point-dmmoab->seqstart)]*dmmoab->numFields+field; 2988cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 2998cbae1a6SVijay Mahadevan } 3008cbae1a6SVijay Mahadevan 3018cbae1a6SVijay Mahadevan 30299fa7e03SVijay Mahadevan /*@C 30399fa7e03SVijay Mahadevan DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an 30499fa7e03SVijay Mahadevan array of MOAB EntityHandles. 30599fa7e03SVijay Mahadevan 30699fa7e03SVijay Mahadevan Not Collective 30799fa7e03SVijay Mahadevan 30899fa7e03SVijay Mahadevan Input Parameters: 30999fa7e03SVijay Mahadevan + dm - the discretization manager object 31099fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 31199fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 312b8ecf6d3SVijay Mahadevan . field - the field (component) index 31399fa7e03SVijay Mahadevan 31499fa7e03SVijay Mahadevan Output Parameter: 31599fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 31699fa7e03SVijay Mahadevan 31799fa7e03SVijay Mahadevan Level: intermediate 31899fa7e03SVijay Mahadevan 31999fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 32099fa7e03SVijay Mahadevan 32199fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal() 32299fa7e03SVijay Mahadevan @*/ 3238cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 3248cbae1a6SVijay Mahadevan { 3258cbae1a6SVijay Mahadevan PetscInt i; 3268cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3278cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3288cbae1a6SVijay Mahadevan 3298cbae1a6SVijay Mahadevan PetscFunctionBegin; 3308cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 33199fa7e03SVijay Mahadevan PetscValidPointer(points,3); 3328cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3338cbae1a6SVijay Mahadevan 3348cbae1a6SVijay Mahadevan if (!dof) { 3357ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr); 3368cbae1a6SVijay Mahadevan } 3378cbae1a6SVijay Mahadevan 3383f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 3393f1c6e43SVijay 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 */ 34099fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3418cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 3423f1c6e43SVijay Mahadevan dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]+field*dmmoab->n : 3433f1c6e43SVijay Mahadevan dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field); 3448cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3458cbae1a6SVijay Mahadevan } 3468cbae1a6SVijay Mahadevan 3478cbae1a6SVijay Mahadevan 34899fa7e03SVijay Mahadevan /*@C 34999fa7e03SVijay Mahadevan DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an 35099fa7e03SVijay Mahadevan array of MOAB EntityHandles. 35199fa7e03SVijay Mahadevan 35299fa7e03SVijay Mahadevan Not Collective 35399fa7e03SVijay Mahadevan 35499fa7e03SVijay Mahadevan Input Parameters: 35599fa7e03SVijay Mahadevan + dm - the discretization manager object 35699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 35799fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 358b8ecf6d3SVijay Mahadevan . field - the field (component) index 35999fa7e03SVijay Mahadevan 36099fa7e03SVijay Mahadevan Output Parameter: 36199fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 36299fa7e03SVijay Mahadevan 36399fa7e03SVijay Mahadevan Level: intermediate 36499fa7e03SVijay Mahadevan 36599fa7e03SVijay Mahadevan .keywords: discretization manager, get, local degrees of freedom 36699fa7e03SVijay Mahadevan 36799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs() 36899fa7e03SVijay Mahadevan @*/ 3698cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 3708cbae1a6SVijay Mahadevan { 3713f1c6e43SVijay Mahadevan PetscInt i; 3728cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3738cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3748cbae1a6SVijay Mahadevan 3758cbae1a6SVijay Mahadevan PetscFunctionBegin; 3768cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 37799fa7e03SVijay Mahadevan PetscValidPointer(points,3); 3788cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3798cbae1a6SVijay Mahadevan 3808cbae1a6SVijay Mahadevan if (!dof) { 3817ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr); 3828cbae1a6SVijay Mahadevan } 3838cbae1a6SVijay Mahadevan 3843f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 38599fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 38699fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3873f1c6e43SVijay Mahadevan for (i=0; i<npoints; ++i) { 3883f1c6e43SVijay Mahadevan dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field : 3893f1c6e43SVijay Mahadevan dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]+field*dmmoab->n); 3908cbae1a6SVijay Mahadevan } 3918cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3928cbae1a6SVijay Mahadevan } 3938cbae1a6SVijay Mahadevan 3948cbae1a6SVijay Mahadevan 39599fa7e03SVijay Mahadevan /*@C 39699fa7e03SVijay Mahadevan DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an 39799fa7e03SVijay Mahadevan array of MOAB EntityHandles. 39899fa7e03SVijay Mahadevan 39999fa7e03SVijay Mahadevan Not Collective 40099fa7e03SVijay Mahadevan 40199fa7e03SVijay Mahadevan Input Parameters: 40299fa7e03SVijay Mahadevan + dm - the discretization manager object 40399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 40499fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 40599fa7e03SVijay Mahadevan 40699fa7e03SVijay Mahadevan Output Parameter: 40799fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 40899fa7e03SVijay Mahadevan 40999fa7e03SVijay Mahadevan Level: intermediate 41099fa7e03SVijay Mahadevan 41199fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 41299fa7e03SVijay Mahadevan 41399fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked() 41499fa7e03SVijay Mahadevan @*/ 4158cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 4168cbae1a6SVijay Mahadevan { 4178cbae1a6SVijay Mahadevan PetscInt i,field,offset; 4188cbae1a6SVijay Mahadevan PetscErrorCode ierr; 4198cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4208cbae1a6SVijay Mahadevan 4218cbae1a6SVijay Mahadevan PetscFunctionBegin; 4228cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 42399fa7e03SVijay Mahadevan PetscValidPointer(points,3); 4248cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4258cbae1a6SVijay Mahadevan 4268cbae1a6SVijay Mahadevan if (!dof) { 4277ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->numFields*npoints,&dof);CHKERRQ(ierr); 4288cbae1a6SVijay Mahadevan } 4298cbae1a6SVijay Mahadevan 4303f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 43199fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 43299fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 433addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 43499fa7e03SVijay Mahadevan offset = field*dmmoab->n; 4358cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 4363f1c6e43SVijay Mahadevan dof[i*dmmoab->numFields+field] = (dmmoab->bs > 1 ? dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field : 4373f1c6e43SVijay Mahadevan dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]+offset); 4388cbae1a6SVijay Mahadevan } 4398cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4408cbae1a6SVijay Mahadevan } 4418cbae1a6SVijay Mahadevan 4423f1c6e43SVijay Mahadevan #undef __FUNCT__ 4433f1c6e43SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal" 44499fa7e03SVijay Mahadevan /*@C 44599fa7e03SVijay Mahadevan DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an 44699fa7e03SVijay Mahadevan array of MOAB EntityHandles. 44799fa7e03SVijay Mahadevan 44899fa7e03SVijay Mahadevan Not Collective 44999fa7e03SVijay Mahadevan 45099fa7e03SVijay Mahadevan Input Parameters: 45199fa7e03SVijay Mahadevan + dm - the discretization manager object 45299fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 45399fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 45499fa7e03SVijay Mahadevan 45599fa7e03SVijay Mahadevan Output Parameter: 45699fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 45799fa7e03SVijay Mahadevan 45899fa7e03SVijay Mahadevan Level: intermediate 45999fa7e03SVijay Mahadevan 46099fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 46199fa7e03SVijay Mahadevan 46299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked() 46399fa7e03SVijay Mahadevan @*/ 4648cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 4658cbae1a6SVijay Mahadevan { 4668cbae1a6SVijay Mahadevan PetscInt i,field,offset; 4678cbae1a6SVijay Mahadevan PetscErrorCode ierr; 4688cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4698cbae1a6SVijay Mahadevan 4708cbae1a6SVijay Mahadevan PetscFunctionBegin; 4718cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 47299fa7e03SVijay Mahadevan PetscValidPointer(points,3); 4738cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4748cbae1a6SVijay Mahadevan 4758cbae1a6SVijay Mahadevan if (!dof) { 4767ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->numFields*npoints,&dof);CHKERRQ(ierr); 4778cbae1a6SVijay Mahadevan } 4788cbae1a6SVijay Mahadevan 4793f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 48099fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 48199fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 482addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 48399fa7e03SVijay Mahadevan offset = field*dmmoab->n; 4848cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 4853f1c6e43SVijay Mahadevan dof[i*dmmoab->numFields+field] = (dmmoab->bs > 1 ? dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]*dmmoab->numFields+field : 4863f1c6e43SVijay Mahadevan dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]+offset); 4878cbae1a6SVijay Mahadevan } 4888cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4898cbae1a6SVijay Mahadevan } 4908cbae1a6SVijay Mahadevan 4918cbae1a6SVijay Mahadevan 49299fa7e03SVijay Mahadevan /*@C 49399fa7e03SVijay Mahadevan DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 49499fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation 49599fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 49699fa7e03SVijay Mahadevan 49799fa7e03SVijay Mahadevan Not Collective 49899fa7e03SVijay Mahadevan 49999fa7e03SVijay Mahadevan Input Parameters: 50099fa7e03SVijay Mahadevan + dm - the discretization manager object 50199fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 50299fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 50399fa7e03SVijay Mahadevan 50499fa7e03SVijay Mahadevan Output Parameter: 50599fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) 50699fa7e03SVijay Mahadevan 50799fa7e03SVijay Mahadevan Level: intermediate 50899fa7e03SVijay Mahadevan 50999fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 51099fa7e03SVijay Mahadevan 51199fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 51299fa7e03SVijay Mahadevan @*/ 5138cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 5148cbae1a6SVijay Mahadevan { 5158cbae1a6SVijay Mahadevan PetscInt i; 5168cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5178cbae1a6SVijay Mahadevan PetscErrorCode ierr; 5188cbae1a6SVijay Mahadevan 5198cbae1a6SVijay Mahadevan PetscFunctionBegin; 5208cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5213f1c6e43SVijay Mahadevan PetscValidPointer(points,3); 5228cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5238cbae1a6SVijay Mahadevan 5248cbae1a6SVijay Mahadevan if (!dof) { 5257ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr); 5268cbae1a6SVijay Mahadevan } 5278cbae1a6SVijay Mahadevan 5288cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) { 5293f1c6e43SVijay Mahadevan dof[i]=dmmoab->gidmap[(PetscInt)points[i]-dmmoab->seqstart]; 5308cbae1a6SVijay Mahadevan } 5318cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5328cbae1a6SVijay Mahadevan } 5338cbae1a6SVijay Mahadevan 5348cbae1a6SVijay Mahadevan 53599fa7e03SVijay Mahadevan /*@C 53699fa7e03SVijay Mahadevan DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 53799fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation 53899fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 53999fa7e03SVijay Mahadevan 54099fa7e03SVijay Mahadevan Not Collective 54199fa7e03SVijay Mahadevan 54299fa7e03SVijay Mahadevan Input Parameters: 54399fa7e03SVijay Mahadevan + dm - the discretization manager object 54499fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 54599fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 54699fa7e03SVijay Mahadevan 54799fa7e03SVijay Mahadevan Output Parameter: 54899fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) 54999fa7e03SVijay Mahadevan 55099fa7e03SVijay Mahadevan Level: intermediate 55199fa7e03SVijay Mahadevan 55299fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 55399fa7e03SVijay Mahadevan 55499fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 55599fa7e03SVijay Mahadevan @*/ 5568cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 5578cbae1a6SVijay Mahadevan { 5588cbae1a6SVijay Mahadevan PetscInt i; 5598cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5608cbae1a6SVijay Mahadevan PetscErrorCode ierr; 5618cbae1a6SVijay Mahadevan 5628cbae1a6SVijay Mahadevan PetscFunctionBegin; 5638cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5643f1c6e43SVijay Mahadevan PetscValidPointer(points,3); 5658cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5668cbae1a6SVijay Mahadevan 5678cbae1a6SVijay Mahadevan if (!dof) { 5687ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr); 5698cbae1a6SVijay Mahadevan } 5708cbae1a6SVijay Mahadevan 5718cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 5723f1c6e43SVijay Mahadevan dof[i]=dmmoab->lidmap[(PetscInt)points[i]-dmmoab->seqstart]; 5738cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5748cbae1a6SVijay Mahadevan } 5758cbae1a6SVijay Mahadevan 5768cbae1a6SVijay Mahadevan 57799fa7e03SVijay Mahadevan /*@C 57899fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 57999fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 58099fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 58199fa7e03SVijay Mahadevan 58299fa7e03SVijay Mahadevan Not Collective 58399fa7e03SVijay Mahadevan 58499fa7e03SVijay Mahadevan Input Parameters: 58599fa7e03SVijay Mahadevan + dm - the discretization manager object 58699fa7e03SVijay Mahadevan 58799fa7e03SVijay Mahadevan Output Parameter: 58899fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 58999fa7e03SVijay Mahadevan 59099fa7e03SVijay Mahadevan Level: intermediate 59199fa7e03SVijay Mahadevan 59299fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom 59399fa7e03SVijay Mahadevan 59499fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 59599fa7e03SVijay Mahadevan @*/ 5968cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof) 5978cbae1a6SVijay Mahadevan { 5988cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5998cbae1a6SVijay Mahadevan 6008cbae1a6SVijay Mahadevan PetscFunctionBegin; 6018cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6028cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6038cbae1a6SVijay Mahadevan 6048cbae1a6SVijay Mahadevan *dof = dmmoab->gidmap; 6058cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6068cbae1a6SVijay Mahadevan } 6078cbae1a6SVijay Mahadevan 6088cbae1a6SVijay Mahadevan 60999fa7e03SVijay Mahadevan /*@C 61099fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 61199fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 61299fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 61399fa7e03SVijay Mahadevan 61499fa7e03SVijay Mahadevan Not Collective 61599fa7e03SVijay Mahadevan 61699fa7e03SVijay Mahadevan Input Parameters: 61799fa7e03SVijay Mahadevan + dm - the discretization manager object 61899fa7e03SVijay Mahadevan 61999fa7e03SVijay Mahadevan Output Parameter: 62099fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 62199fa7e03SVijay Mahadevan 62299fa7e03SVijay Mahadevan Level: intermediate 62399fa7e03SVijay Mahadevan 62499fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom 62599fa7e03SVijay Mahadevan 62699fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 62799fa7e03SVijay Mahadevan @*/ 6288cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof) 6298cbae1a6SVijay Mahadevan { 6308cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 6318cbae1a6SVijay Mahadevan 6328cbae1a6SVijay Mahadevan PetscFunctionBegin; 6338cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6348cbae1a6SVijay Mahadevan PetscValidPointer(dof,2); 6358cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6368cbae1a6SVijay Mahadevan 6378cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap; 6388cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6398cbae1a6SVijay Mahadevan } 6408cbae1a6SVijay Mahadevan 641