1b8ecf6d3SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 28cbae1a6SVijay Mahadevan 38cbae1a6SVijay Mahadevan #include <petscdmmoab.h> 48cbae1a6SVijay Mahadevan 58cbae1a6SVijay Mahadevan #undef __FUNCT__ 68cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 799fa7e03SVijay Mahadevan /*@C 899fa7e03SVijay Mahadevan DMMoabSetFieldVector - Sets the vector reference that represents the solution associated 999fa7e03SVijay Mahadevan with a particular field component. 1099fa7e03SVijay Mahadevan 1199fa7e03SVijay Mahadevan Not Collective 1299fa7e03SVijay Mahadevan 1399fa7e03SVijay Mahadevan Input Parameters: 1499fa7e03SVijay Mahadevan + dm - the discretization manager object 1599fa7e03SVijay Mahadevan . ifield - the index of the field as set before via DMMoabSetFieldName. 16b8ecf6d3SVijay Mahadevan . fvec - the Vector solution corresponding to the field (component) 1799fa7e03SVijay Mahadevan 1899fa7e03SVijay Mahadevan Level: intermediate 1999fa7e03SVijay Mahadevan 2099fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution 2199fa7e03SVijay Mahadevan 2299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetGlobalFieldVector() 2399fa7e03SVijay Mahadevan @*/ 248cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 258cbae1a6SVijay Mahadevan { 268cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 278cbae1a6SVijay Mahadevan moab::Tag vtag,ntag; 288cbae1a6SVijay Mahadevan const PetscScalar *varray; 298cbae1a6SVijay Mahadevan PetscScalar *farray; 308cbae1a6SVijay Mahadevan moab::ErrorCode merr; 318cbae1a6SVijay Mahadevan PetscErrorCode ierr; 328cbae1a6SVijay Mahadevan std::string tag_name; 338cbae1a6SVijay Mahadevan 348cbae1a6SVijay Mahadevan PetscFunctionBegin; 358cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 368cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 378cbae1a6SVijay Mahadevan 38addae81cSVijay 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); 39addae81cSVijay Mahadevan 408cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 41addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 428cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr); 438cbae1a6SVijay Mahadevan 448cbae1a6SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 458cbae1a6SVijay Mahadevan 468cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 478cbae1a6SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 488cbae1a6SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 498cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 508cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr); 518cbae1a6SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 528cbae1a6SVijay Mahadevan } 538cbae1a6SVijay Mahadevan else { 54*7ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->nloc,&farray);CHKERRQ(ierr); 558cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 568cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr); 578cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 588cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 598cbae1a6SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 608cbae1a6SVijay Mahadevan } 618cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);MBERRNM(merr); 628cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 638cbae1a6SVijay Mahadevan } 648cbae1a6SVijay Mahadevan 658cbae1a6SVijay Mahadevan 668cbae1a6SVijay Mahadevan #undef __FUNCT__ 678cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector" 6899fa7e03SVijay Mahadevan /*@C 6999fa7e03SVijay Mahadevan DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated 7099fa7e03SVijay Mahadevan with all fields (components) managed by DM. 7199fa7e03SVijay Mahadevan A useful utility when updating the DM solution after a solve, to be serialized with the mesh for 7299fa7e03SVijay Mahadevan checkpointing purposes. 7399fa7e03SVijay Mahadevan 7499fa7e03SVijay Mahadevan Not Collective 7599fa7e03SVijay Mahadevan 7699fa7e03SVijay Mahadevan Input Parameters: 7799fa7e03SVijay Mahadevan + dm - the discretization manager object 78b8ecf6d3SVijay Mahadevan . fvec - the global Vector solution corresponding to all the fields managed by DM 7999fa7e03SVijay Mahadevan 8099fa7e03SVijay Mahadevan Level: intermediate 8199fa7e03SVijay Mahadevan 8299fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution 8399fa7e03SVijay Mahadevan 8499fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector() 8599fa7e03SVijay Mahadevan @*/ 868cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) 878cbae1a6SVijay Mahadevan { 888cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 898cbae1a6SVijay Mahadevan moab::Tag vtag,ntag; 90f28b2503SVijay Mahadevan const PetscScalar *rarray; 91f28b2503SVijay Mahadevan PetscScalar *varray,*farray; 928cbae1a6SVijay Mahadevan moab::ErrorCode merr; 938cbae1a6SVijay Mahadevan PetscErrorCode ierr; 948cbae1a6SVijay Mahadevan PetscInt i,ifield; 958cbae1a6SVijay Mahadevan std::string tag_name; 968cbae1a6SVijay Mahadevan moab::Range::iterator iter; 978cbae1a6SVijay Mahadevan 988cbae1a6SVijay Mahadevan PetscFunctionBegin; 998cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1008cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1018cbae1a6SVijay Mahadevan 1028cbae1a6SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */ 1038cbae1a6SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 1048cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 105*7ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->nloc,&farray);CHKERRQ(ierr); 1068cbae1a6SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 1078cbae1a6SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */ 1088cbae1a6SVijay Mahadevan 109f28b2503SVijay Mahadevan ierr = VecGetArrayRead(fvec,&rarray);CHKERRQ(ierr); 110addae81cSVijay Mahadevan for (ifield=0; ifield<dmmoab->numFields; ++ifield) { 1118cbae1a6SVijay Mahadevan 1128cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 113addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 1148cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr); 1158cbae1a6SVijay Mahadevan 1168cbae1a6SVijay Mahadevan for(i=0;i<dmmoab->nloc;i++) { 1178cbae1a6SVijay Mahadevan if (dmmoab->bs == 1) 118f28b2503SVijay Mahadevan farray[i]=rarray[ifield*dmmoab->nloc+i]; 1198cbae1a6SVijay Mahadevan else 120f28b2503SVijay Mahadevan farray[i]=rarray[i*dmmoab->numFields+ifield]; 1218cbae1a6SVijay Mahadevan } 1228cbae1a6SVijay Mahadevan 1238cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 1248cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 1258cbae1a6SVijay Mahadevan } 126f28b2503SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&rarray);CHKERRQ(ierr); 1278cbae1a6SVijay Mahadevan } 1288cbae1a6SVijay Mahadevan else { 129*7ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->nloc*dmmoab->numFields,&varray);CHKERRQ(ierr); 1308cbae1a6SVijay Mahadevan 1318cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1328cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 133addae81cSVijay Mahadevan for (ifield=0; ifield<dmmoab->numFields; ++ifield) { 1348cbae1a6SVijay Mahadevan 1358cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 136addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 1378cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr); 1388cbae1a6SVijay Mahadevan 1398cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1408cbae1a6SVijay Mahadevan for(i=0; i < dmmoab->nloc; i++) { 141f28b2503SVijay Mahadevan if (dmmoab->bs == 1) 142f28b2503SVijay Mahadevan farray[i]=varray[ifield*dmmoab->nloc+i]; 143f28b2503SVijay Mahadevan else 144f28b2503SVijay Mahadevan farray[i]=varray[i*dmmoab->numFields+ifield]; 1458cbae1a6SVijay Mahadevan } 1468cbae1a6SVijay Mahadevan 1478cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 1488cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 1498cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 1508cbae1a6SVijay Mahadevan } 1518cbae1a6SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 1528cbae1a6SVijay Mahadevan } 1538cbae1a6SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 1548cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1558cbae1a6SVijay Mahadevan } 1568cbae1a6SVijay Mahadevan 1578cbae1a6SVijay Mahadevan 1588cbae1a6SVijay Mahadevan #undef __FUNCT__ 15999fa7e03SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldNames" 16099fa7e03SVijay Mahadevan /*@C 16199fa7e03SVijay Mahadevan DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM 16299fa7e03SVijay Mahadevan 16399fa7e03SVijay Mahadevan Not Collective 16499fa7e03SVijay Mahadevan 16599fa7e03SVijay Mahadevan Input Parameters: 16699fa7e03SVijay Mahadevan + dm - the discretization manager object 16799fa7e03SVijay Mahadevan . numFields - the total number of fields 168b8ecf6d3SVijay Mahadevan . fields - the array containing the names of each field (component); Can be NULL. 16999fa7e03SVijay Mahadevan 17099fa7e03SVijay Mahadevan Level: intermediate 17199fa7e03SVijay Mahadevan 17299fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name 17399fa7e03SVijay Mahadevan 17499fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName() 17599fa7e03SVijay Mahadevan @*/ 176f28b2503SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm,PetscInt numFields,const char* fields[]) 1778cbae1a6SVijay Mahadevan { 178addae81cSVijay Mahadevan PetscErrorCode ierr; 179addae81cSVijay Mahadevan PetscInt i; 1808cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 1818cbae1a6SVijay Mahadevan 1828cbae1a6SVijay Mahadevan PetscFunctionBegin; 1838cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1848cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1858cbae1a6SVijay Mahadevan 186addae81cSVijay Mahadevan /* first deallocate the existing field structure */ 187addae81cSVijay Mahadevan if (dmmoab->fieldNames) { 188addae81cSVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 189addae81cSVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 190addae81cSVijay Mahadevan } 191addae81cSVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 192addae81cSVijay Mahadevan } 193addae81cSVijay Mahadevan 194addae81cSVijay Mahadevan /* now re-allocate and assign field names */ 195addae81cSVijay Mahadevan dmmoab->numFields = numFields; 196f28b2503SVijay Mahadevan ierr = PetscMalloc(numFields*sizeof(char*),&dmmoab->fieldNames);CHKERRQ(ierr); 197addae81cSVijay Mahadevan if (fields) { 198addae81cSVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 199addae81cSVijay Mahadevan ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr); 200addae81cSVijay Mahadevan } 201addae81cSVijay Mahadevan } 2028cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 2038cbae1a6SVijay Mahadevan } 2048cbae1a6SVijay Mahadevan 20599fa7e03SVijay Mahadevan 20699fa7e03SVijay Mahadevan #undef __FUNCT__ 20799fa7e03SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldName" 20899fa7e03SVijay Mahadevan /*@C 20999fa7e03SVijay Mahadevan DMMoabGetFieldName - Gets the names of individual field components in multicomponent 21099fa7e03SVijay Mahadevan vectors associated with a DMDA. 21199fa7e03SVijay Mahadevan 21299fa7e03SVijay Mahadevan Not Collective 21399fa7e03SVijay Mahadevan 21499fa7e03SVijay Mahadevan Input Parameter: 21599fa7e03SVijay Mahadevan + dm - the discretization manager object 216b8ecf6d3SVijay Mahadevan . field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the 21799fa7e03SVijay Mahadevan number of degrees of freedom per node within the DMMoab 21899fa7e03SVijay Mahadevan 21999fa7e03SVijay Mahadevan Output Parameter: 22099fa7e03SVijay Mahadevan . fieldName - the name of the field (component) 22199fa7e03SVijay Mahadevan 22299fa7e03SVijay Mahadevan Level: intermediate 22399fa7e03SVijay Mahadevan 22499fa7e03SVijay Mahadevan .keywords: discretization manager, get, component name 22599fa7e03SVijay Mahadevan 22699fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields() 22799fa7e03SVijay Mahadevan @*/ 22899fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName) 22999fa7e03SVijay Mahadevan { 23099fa7e03SVijay Mahadevan DM_Moab *dmmoab; 23199fa7e03SVijay Mahadevan 23299fa7e03SVijay Mahadevan PetscFunctionBegin; 23399fa7e03SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 23499fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 23599fa7e03SVijay 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); 23699fa7e03SVijay Mahadevan 23799fa7e03SVijay Mahadevan *fieldName = dmmoab->fieldNames[field]; 23899fa7e03SVijay Mahadevan PetscFunctionReturn(0); 23999fa7e03SVijay Mahadevan } 24099fa7e03SVijay Mahadevan 24199fa7e03SVijay Mahadevan 242c68c6878SVijay Mahadevan #undef __FUNCT__ 243c68c6878SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldName" 244c68c6878SVijay Mahadevan /*@C 24599fa7e03SVijay Mahadevan DMMoabSetFieldName - Sets the name of a field (component) managed by the DM 246c68c6878SVijay Mahadevan 247c68c6878SVijay Mahadevan Not Collective 248c68c6878SVijay Mahadevan 249c68c6878SVijay Mahadevan Input Parameters: 25099fa7e03SVijay Mahadevan + dm - the discretization manager object 251c68c6878SVijay Mahadevan . field - the field number 252b8ecf6d3SVijay Mahadevan . fieldName - the field (component) name 253c68c6878SVijay Mahadevan 25499fa7e03SVijay Mahadevan Level: intermediate 25599fa7e03SVijay Mahadevan Notes: Can only be called after DMMoabSetFields supplied with correct numFields 256c68c6878SVijay Mahadevan 25799fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name 25899fa7e03SVijay Mahadevan 25999fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields() 260c68c6878SVijay Mahadevan @*/ 2615f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName) 262c68c6878SVijay Mahadevan { 263c68c6878SVijay Mahadevan PetscErrorCode ierr; 264c68c6878SVijay Mahadevan DM_Moab *dmmoab; 265c68c6878SVijay Mahadevan 266c68c6878SVijay Mahadevan PetscFunctionBegin; 267c68c6878SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2685f7ae369SVijay Mahadevan PetscValidCharPointer(fieldName,3); 269c68c6878SVijay Mahadevan 27099fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 271c68c6878SVijay 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); 27299fa7e03SVijay Mahadevan 27399fa7e03SVijay Mahadevan if (dmmoab->fieldNames[field]) { 274c68c6878SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr); 27599fa7e03SVijay Mahadevan } 2765f7ae369SVijay Mahadevan ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr); 277c68c6878SVijay Mahadevan PetscFunctionReturn(0); 278c68c6878SVijay Mahadevan } 279c68c6878SVijay Mahadevan 2808cbae1a6SVijay Mahadevan 2818cbae1a6SVijay Mahadevan #undef __FUNCT__ 2828cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 28399fa7e03SVijay Mahadevan /*@C 28499fa7e03SVijay Mahadevan DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a 28599fa7e03SVijay Mahadevan particular MOAB EntityHandle. 28699fa7e03SVijay Mahadevan 28799fa7e03SVijay Mahadevan Not Collective 28899fa7e03SVijay Mahadevan 28999fa7e03SVijay Mahadevan Input Parameters: 29099fa7e03SVijay Mahadevan + dm - the discretization manager object 29199fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values 292b8ecf6d3SVijay Mahadevan . field - the field (component) index 29399fa7e03SVijay Mahadevan 29499fa7e03SVijay Mahadevan Output Parameter: 29599fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat) 29699fa7e03SVijay Mahadevan 29799fa7e03SVijay Mahadevan Level: beginner 29899fa7e03SVijay Mahadevan 29999fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degree of freedom 30099fa7e03SVijay Mahadevan 30199fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal() 30299fa7e03SVijay Mahadevan @*/ 3038cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 3048cbae1a6SVijay Mahadevan { 3058cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3068cbae1a6SVijay Mahadevan 3078cbae1a6SVijay Mahadevan PetscFunctionBegin; 3088cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3098cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3108cbae1a6SVijay Mahadevan 3118cbae1a6SVijay Mahadevan *dof=dmmoab->gidmap[(PetscInt)point]; 3128cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3138cbae1a6SVijay Mahadevan } 3148cbae1a6SVijay Mahadevan 3158cbae1a6SVijay Mahadevan 3168cbae1a6SVijay Mahadevan #undef __FUNCT__ 3178cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 31899fa7e03SVijay Mahadevan /*@C 31999fa7e03SVijay Mahadevan DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an 32099fa7e03SVijay Mahadevan array of MOAB EntityHandles. 32199fa7e03SVijay Mahadevan 32299fa7e03SVijay Mahadevan Not Collective 32399fa7e03SVijay Mahadevan 32499fa7e03SVijay Mahadevan Input Parameters: 32599fa7e03SVijay Mahadevan + dm - the discretization manager object 32699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 32799fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 328b8ecf6d3SVijay Mahadevan . field - the field (component) index 32999fa7e03SVijay Mahadevan 33099fa7e03SVijay Mahadevan Output Parameter: 33199fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 33299fa7e03SVijay Mahadevan 33399fa7e03SVijay Mahadevan Level: intermediate 33499fa7e03SVijay Mahadevan 33599fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 33699fa7e03SVijay Mahadevan 33799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal() 33899fa7e03SVijay Mahadevan @*/ 3398cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 3408cbae1a6SVijay Mahadevan { 3418cbae1a6SVijay Mahadevan PetscInt i; 3428cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3438cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3448cbae1a6SVijay Mahadevan 3458cbae1a6SVijay Mahadevan PetscFunctionBegin; 3468cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 34799fa7e03SVijay Mahadevan PetscValidPointer(points,3); 3488cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3498cbae1a6SVijay Mahadevan 3508cbae1a6SVijay Mahadevan if (!dof) { 351*7ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr); 3528cbae1a6SVijay Mahadevan } 3538cbae1a6SVijay Mahadevan 35499fa7e03SVijay Mahadevan if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */ 3558cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 356addae81cSVijay Mahadevan dof[i] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 3578cbae1a6SVijay Mahadevan } 3588cbae1a6SVijay Mahadevan else { 35999fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 36099fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3618cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 3628cbae1a6SVijay Mahadevan dof[i] = dmmoab->gidmap[(PetscInt)points[i]]+field*dmmoab->n; 3638cbae1a6SVijay Mahadevan } 3648cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3658cbae1a6SVijay Mahadevan } 3668cbae1a6SVijay Mahadevan 3678cbae1a6SVijay Mahadevan 3688cbae1a6SVijay Mahadevan #undef __FUNCT__ 3698cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal" 37099fa7e03SVijay Mahadevan /*@C 37199fa7e03SVijay Mahadevan DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an 37299fa7e03SVijay Mahadevan array of MOAB EntityHandles. 37399fa7e03SVijay Mahadevan 37499fa7e03SVijay Mahadevan Not Collective 37599fa7e03SVijay Mahadevan 37699fa7e03SVijay Mahadevan Input Parameters: 37799fa7e03SVijay Mahadevan + dm - the discretization manager object 37899fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 37999fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 380b8ecf6d3SVijay Mahadevan . field - the field (component) index 38199fa7e03SVijay Mahadevan 38299fa7e03SVijay Mahadevan Output Parameter: 38399fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 38499fa7e03SVijay Mahadevan 38599fa7e03SVijay Mahadevan Level: intermediate 38699fa7e03SVijay Mahadevan 38799fa7e03SVijay Mahadevan .keywords: discretization manager, get, local degrees of freedom 38899fa7e03SVijay Mahadevan 38999fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs() 39099fa7e03SVijay Mahadevan @*/ 3918cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 3928cbae1a6SVijay Mahadevan { 3938cbae1a6SVijay Mahadevan PetscInt i,offset; 3948cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3958cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3968cbae1a6SVijay Mahadevan 3978cbae1a6SVijay Mahadevan PetscFunctionBegin; 3988cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 39999fa7e03SVijay Mahadevan PetscValidPointer(points,3); 4008cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4018cbae1a6SVijay Mahadevan 4028cbae1a6SVijay Mahadevan if (!dof) { 403*7ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr); 4048cbae1a6SVijay Mahadevan } 4058cbae1a6SVijay Mahadevan 40699fa7e03SVijay Mahadevan if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */ 4078cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 408addae81cSVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 4098cbae1a6SVijay Mahadevan } 4108cbae1a6SVijay Mahadevan else { 41199fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 41299fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 41399fa7e03SVijay Mahadevan offset = field*dmmoab->n; 4148cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 4158cbae1a6SVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i]]+offset; 4168cbae1a6SVijay Mahadevan } 4178cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4188cbae1a6SVijay Mahadevan } 4198cbae1a6SVijay Mahadevan 4208cbae1a6SVijay Mahadevan 4218cbae1a6SVijay Mahadevan #undef __FUNCT__ 4228cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs" 42399fa7e03SVijay Mahadevan /*@C 42499fa7e03SVijay Mahadevan DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an 42599fa7e03SVijay Mahadevan array of MOAB EntityHandles. 42699fa7e03SVijay Mahadevan 42799fa7e03SVijay Mahadevan Not Collective 42899fa7e03SVijay Mahadevan 42999fa7e03SVijay Mahadevan Input Parameters: 43099fa7e03SVijay Mahadevan + dm - the discretization manager object 43199fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 43299fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 43399fa7e03SVijay Mahadevan 43499fa7e03SVijay Mahadevan Output Parameter: 43599fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 43699fa7e03SVijay Mahadevan 43799fa7e03SVijay Mahadevan Level: intermediate 43899fa7e03SVijay Mahadevan 43999fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 44099fa7e03SVijay Mahadevan 44199fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked() 44299fa7e03SVijay Mahadevan @*/ 4438cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 4448cbae1a6SVijay Mahadevan { 4458cbae1a6SVijay Mahadevan PetscInt i,field,offset; 4468cbae1a6SVijay Mahadevan PetscErrorCode ierr; 4478cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4488cbae1a6SVijay Mahadevan 4498cbae1a6SVijay Mahadevan PetscFunctionBegin; 4508cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 45199fa7e03SVijay Mahadevan PetscValidPointer(points,3); 4528cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4538cbae1a6SVijay Mahadevan 4548cbae1a6SVijay Mahadevan if (!dof) { 455*7ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->numFields*npoints,&dof);CHKERRQ(ierr); 4568cbae1a6SVijay Mahadevan } 4578cbae1a6SVijay Mahadevan 45899fa7e03SVijay Mahadevan if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */ 459addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 4608cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 461addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 4628cbae1a6SVijay Mahadevan } 4638cbae1a6SVijay Mahadevan } 4648cbae1a6SVijay Mahadevan else { 46599fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 46699fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 467addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 46899fa7e03SVijay Mahadevan offset = field*dmmoab->n; 4698cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 470addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]+offset; 4718cbae1a6SVijay Mahadevan } 4728cbae1a6SVijay Mahadevan } 4738cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4748cbae1a6SVijay Mahadevan } 4758cbae1a6SVijay Mahadevan 4768cbae1a6SVijay Mahadevan 4778cbae1a6SVijay Mahadevan #undef __FUNCT__ 4788cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal" 47999fa7e03SVijay Mahadevan /*@C 48099fa7e03SVijay Mahadevan DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an 48199fa7e03SVijay Mahadevan array of MOAB EntityHandles. 48299fa7e03SVijay Mahadevan 48399fa7e03SVijay Mahadevan Not Collective 48499fa7e03SVijay Mahadevan 48599fa7e03SVijay Mahadevan Input Parameters: 48699fa7e03SVijay Mahadevan + dm - the discretization manager object 48799fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 48899fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 48999fa7e03SVijay Mahadevan 49099fa7e03SVijay Mahadevan Output Parameter: 49199fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 49299fa7e03SVijay Mahadevan 49399fa7e03SVijay Mahadevan Level: intermediate 49499fa7e03SVijay Mahadevan 49599fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 49699fa7e03SVijay Mahadevan 49799fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked() 49899fa7e03SVijay Mahadevan @*/ 4998cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 5008cbae1a6SVijay Mahadevan { 5018cbae1a6SVijay Mahadevan PetscInt i,field,offset; 5028cbae1a6SVijay Mahadevan PetscErrorCode ierr; 5038cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5048cbae1a6SVijay Mahadevan 5058cbae1a6SVijay Mahadevan PetscFunctionBegin; 5068cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 50799fa7e03SVijay Mahadevan PetscValidPointer(points,3); 5088cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5098cbae1a6SVijay Mahadevan 5108cbae1a6SVijay Mahadevan if (!dof) { 511*7ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(dmmoab->numFields*npoints,&dof);CHKERRQ(ierr); 5128cbae1a6SVijay Mahadevan } 5138cbae1a6SVijay Mahadevan 51499fa7e03SVijay Mahadevan if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */ 515addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 5168cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 517addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 5188cbae1a6SVijay Mahadevan } 5198cbae1a6SVijay Mahadevan } 5208cbae1a6SVijay Mahadevan else { 52199fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 52299fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 523addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 52499fa7e03SVijay Mahadevan offset = field*dmmoab->n; 5258cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 526addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]+offset; 5278cbae1a6SVijay Mahadevan } 5288cbae1a6SVijay Mahadevan } 5298cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5308cbae1a6SVijay Mahadevan } 5318cbae1a6SVijay Mahadevan 5328cbae1a6SVijay Mahadevan 5338cbae1a6SVijay Mahadevan #undef __FUNCT__ 5348cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked" 53599fa7e03SVijay Mahadevan /*@C 53699fa7e03SVijay Mahadevan DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 53799fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing 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 global 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 DMMoabGetDofsBlocked(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); 5648cbae1a6SVijay Mahadevan PetscValidPointer(points,2); 5658cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5668cbae1a6SVijay Mahadevan 5678cbae1a6SVijay Mahadevan if (!dof) { 568*7ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr); 5698cbae1a6SVijay Mahadevan } 5708cbae1a6SVijay Mahadevan 5718cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) { 5728cbae1a6SVijay Mahadevan dof[i]=dmmoab->gidmap[(PetscInt)points[i]]; 5738cbae1a6SVijay Mahadevan } 5748cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5758cbae1a6SVijay Mahadevan } 5768cbae1a6SVijay Mahadevan 5778cbae1a6SVijay Mahadevan 5788cbae1a6SVijay Mahadevan #undef __FUNCT__ 5798cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal" 58099fa7e03SVijay Mahadevan /*@C 58199fa7e03SVijay Mahadevan DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 58299fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation 58399fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 58499fa7e03SVijay Mahadevan 58599fa7e03SVijay Mahadevan Not Collective 58699fa7e03SVijay Mahadevan 58799fa7e03SVijay Mahadevan Input Parameters: 58899fa7e03SVijay Mahadevan + dm - the discretization manager object 58999fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 59099fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 59199fa7e03SVijay Mahadevan 59299fa7e03SVijay Mahadevan Output Parameter: 59399fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) 59499fa7e03SVijay Mahadevan 59599fa7e03SVijay Mahadevan Level: intermediate 59699fa7e03SVijay Mahadevan 59799fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 59899fa7e03SVijay Mahadevan 59999fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 60099fa7e03SVijay Mahadevan @*/ 6018cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 6028cbae1a6SVijay Mahadevan { 6038cbae1a6SVijay Mahadevan PetscInt i; 6048cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 6058cbae1a6SVijay Mahadevan PetscErrorCode ierr; 6068cbae1a6SVijay Mahadevan 6078cbae1a6SVijay Mahadevan PetscFunctionBegin; 6088cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6098cbae1a6SVijay Mahadevan PetscValidPointer(points,2); 6108cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6118cbae1a6SVijay Mahadevan 6128cbae1a6SVijay Mahadevan if (!dof) { 613*7ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(npoints,&dof);CHKERRQ(ierr); 6148cbae1a6SVijay Mahadevan } 6158cbae1a6SVijay Mahadevan 6168cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 6178cbae1a6SVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i]]; 6188cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6198cbae1a6SVijay Mahadevan } 6208cbae1a6SVijay Mahadevan 6218cbae1a6SVijay Mahadevan 6228cbae1a6SVijay Mahadevan #undef __FUNCT__ 6238cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlocked" 62499fa7e03SVijay Mahadevan /*@C 62599fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 62699fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 62799fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 62899fa7e03SVijay Mahadevan 62999fa7e03SVijay Mahadevan Not Collective 63099fa7e03SVijay Mahadevan 63199fa7e03SVijay Mahadevan Input Parameters: 63299fa7e03SVijay Mahadevan + dm - the discretization manager object 63399fa7e03SVijay Mahadevan 63499fa7e03SVijay Mahadevan Output Parameter: 63599fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 63699fa7e03SVijay Mahadevan 63799fa7e03SVijay Mahadevan Level: intermediate 63899fa7e03SVijay Mahadevan 63999fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom 64099fa7e03SVijay Mahadevan 64199fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 64299fa7e03SVijay Mahadevan @*/ 6438cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof) 6448cbae1a6SVijay Mahadevan { 6458cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 6468cbae1a6SVijay Mahadevan 6478cbae1a6SVijay Mahadevan PetscFunctionBegin; 6488cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6498cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6508cbae1a6SVijay Mahadevan 6518cbae1a6SVijay Mahadevan *dof = dmmoab->gidmap; 6528cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6538cbae1a6SVijay Mahadevan } 6548cbae1a6SVijay Mahadevan 6558cbae1a6SVijay Mahadevan 6568cbae1a6SVijay Mahadevan #undef __FUNCT__ 6578cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlockedLocal" 65899fa7e03SVijay Mahadevan /*@C 65999fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 66099fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 66199fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 66299fa7e03SVijay Mahadevan 66399fa7e03SVijay Mahadevan Not Collective 66499fa7e03SVijay Mahadevan 66599fa7e03SVijay Mahadevan Input Parameters: 66699fa7e03SVijay Mahadevan + dm - the discretization manager object 66799fa7e03SVijay Mahadevan 66899fa7e03SVijay Mahadevan Output Parameter: 66999fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 67099fa7e03SVijay Mahadevan 67199fa7e03SVijay Mahadevan Level: intermediate 67299fa7e03SVijay Mahadevan 67399fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom 67499fa7e03SVijay Mahadevan 67599fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 67699fa7e03SVijay Mahadevan @*/ 6778cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof) 6788cbae1a6SVijay Mahadevan { 6798cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 6808cbae1a6SVijay Mahadevan 6818cbae1a6SVijay Mahadevan PetscFunctionBegin; 6828cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6838cbae1a6SVijay Mahadevan PetscValidPointer(dof,2); 6848cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6858cbae1a6SVijay Mahadevan 6868cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap; 6878cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6888cbae1a6SVijay Mahadevan } 6898cbae1a6SVijay Mahadevan 690