18cbae1a6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I "petscdm.h" I*/ 28cbae1a6SVijay Mahadevan 38cbae1a6SVijay Mahadevan #include <petscdmmoab.h> 48cbae1a6SVijay Mahadevan 58cbae1a6SVijay Mahadevan #undef __FUNCT__ 68cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 7*99fa7e03SVijay Mahadevan /*@C 8*99fa7e03SVijay Mahadevan DMMoabSetFieldVector - Sets the vector reference that represents the solution associated 9*99fa7e03SVijay Mahadevan with a particular field component. 10*99fa7e03SVijay Mahadevan 11*99fa7e03SVijay Mahadevan Not Collective 12*99fa7e03SVijay Mahadevan 13*99fa7e03SVijay Mahadevan Input Parameters: 14*99fa7e03SVijay Mahadevan + dm - the discretization manager object 15*99fa7e03SVijay Mahadevan . ifield - the index of the field as set before via DMMoabSetFieldName. 16*99fa7e03SVijay Mahadevan - fvec - the Vector solution corresponding to the field (component) 17*99fa7e03SVijay Mahadevan 18*99fa7e03SVijay Mahadevan Level: intermediate 19*99fa7e03SVijay Mahadevan 20*99fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution 21*99fa7e03SVijay Mahadevan 22*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetGlobalFieldVector() 23*99fa7e03SVijay 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 { 548cbae1a6SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&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" 68*99fa7e03SVijay Mahadevan /*@C 69*99fa7e03SVijay Mahadevan DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated 70*99fa7e03SVijay Mahadevan with all fields (components) managed by DM. 71*99fa7e03SVijay Mahadevan A useful utility when updating the DM solution after a solve, to be serialized with the mesh for 72*99fa7e03SVijay Mahadevan checkpointing purposes. 73*99fa7e03SVijay Mahadevan 74*99fa7e03SVijay Mahadevan Not Collective 75*99fa7e03SVijay Mahadevan 76*99fa7e03SVijay Mahadevan Input Parameters: 77*99fa7e03SVijay Mahadevan + dm - the discretization manager object 78*99fa7e03SVijay Mahadevan - fvec - the global Vector solution corresponding to all the fields managed by DM 79*99fa7e03SVijay Mahadevan 80*99fa7e03SVijay Mahadevan Level: intermediate 81*99fa7e03SVijay Mahadevan 82*99fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution 83*99fa7e03SVijay Mahadevan 84*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector() 85*99fa7e03SVijay Mahadevan @*/ 868cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) 878cbae1a6SVijay Mahadevan { 888cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 898cbae1a6SVijay Mahadevan moab::Tag vtag,ntag; 908cbae1a6SVijay Mahadevan const PetscScalar *varray; 918cbae1a6SVijay Mahadevan PetscScalar *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); 1058cbae1a6SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&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 1098cbae1a6SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);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) 1188cbae1a6SVijay Mahadevan farray[i]=varray[ifield*dmmoab->nloc+i]; 1198cbae1a6SVijay Mahadevan else 120addae81cSVijay Mahadevan farray[i]=varray[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 } 1268cbae1a6SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 1278cbae1a6SVijay Mahadevan } 1288cbae1a6SVijay Mahadevan else { 1298cbae1a6SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&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++) { 1418cbae1a6SVijay Mahadevan farray[i] = varray[i*dmmoab->bs+ifield]; 1428cbae1a6SVijay Mahadevan } 1438cbae1a6SVijay Mahadevan 1448cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 1458cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 1468cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 1478cbae1a6SVijay Mahadevan } 1488cbae1a6SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 1498cbae1a6SVijay Mahadevan } 1508cbae1a6SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 1518cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1528cbae1a6SVijay Mahadevan } 1538cbae1a6SVijay Mahadevan 1548cbae1a6SVijay Mahadevan 1558cbae1a6SVijay Mahadevan #undef __FUNCT__ 156*99fa7e03SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldNames" 157*99fa7e03SVijay Mahadevan /*@C 158*99fa7e03SVijay Mahadevan DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM 159*99fa7e03SVijay Mahadevan 160*99fa7e03SVijay Mahadevan Not Collective 161*99fa7e03SVijay Mahadevan 162*99fa7e03SVijay Mahadevan Input Parameters: 163*99fa7e03SVijay Mahadevan + dm - the discretization manager object 164*99fa7e03SVijay Mahadevan . numFields - the total number of fields 165*99fa7e03SVijay Mahadevan - fields - the array containing the names of each field (component); Can be NULL. 166*99fa7e03SVijay Mahadevan 167*99fa7e03SVijay Mahadevan Level: intermediate 168*99fa7e03SVijay Mahadevan 169*99fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name 170*99fa7e03SVijay Mahadevan 171*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName() 172*99fa7e03SVijay Mahadevan @*/ 173*99fa7e03SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm,PetscInt numFields,const char** fields) 1748cbae1a6SVijay Mahadevan { 175addae81cSVijay Mahadevan PetscErrorCode ierr; 176addae81cSVijay Mahadevan PetscInt i; 1778cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 1788cbae1a6SVijay Mahadevan 1798cbae1a6SVijay Mahadevan PetscFunctionBegin; 1808cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1818cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1828cbae1a6SVijay Mahadevan 183addae81cSVijay Mahadevan /* first deallocate the existing field structure */ 184addae81cSVijay Mahadevan if (dmmoab->fieldNames) { 185addae81cSVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 186addae81cSVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 187addae81cSVijay Mahadevan } 188addae81cSVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 189addae81cSVijay Mahadevan } 190addae81cSVijay Mahadevan 191addae81cSVijay Mahadevan /* now re-allocate and assign field names */ 192addae81cSVijay Mahadevan dmmoab->numFields = numFields; 193addae81cSVijay Mahadevan ierr = PetscMalloc(sizeof(char*)*numFields,&dmmoab->fieldNames);CHKERRQ(ierr); 194addae81cSVijay Mahadevan if (fields) { 195addae81cSVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 196addae81cSVijay Mahadevan ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr); 197addae81cSVijay Mahadevan } 198addae81cSVijay Mahadevan } 1998cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 2008cbae1a6SVijay Mahadevan } 2018cbae1a6SVijay Mahadevan 202*99fa7e03SVijay Mahadevan 203*99fa7e03SVijay Mahadevan #undef __FUNCT__ 204*99fa7e03SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldName" 205*99fa7e03SVijay Mahadevan /*@C 206*99fa7e03SVijay Mahadevan DMMoabGetFieldName - Gets the names of individual field components in multicomponent 207*99fa7e03SVijay Mahadevan vectors associated with a DMDA. 208*99fa7e03SVijay Mahadevan 209*99fa7e03SVijay Mahadevan Not Collective 210*99fa7e03SVijay Mahadevan 211*99fa7e03SVijay Mahadevan Input Parameter: 212*99fa7e03SVijay Mahadevan + dm - the discretization manager object 213*99fa7e03SVijay Mahadevan - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the 214*99fa7e03SVijay Mahadevan number of degrees of freedom per node within the DMMoab 215*99fa7e03SVijay Mahadevan 216*99fa7e03SVijay Mahadevan Output Parameter: 217*99fa7e03SVijay Mahadevan . fieldName - the name of the field (component) 218*99fa7e03SVijay Mahadevan 219*99fa7e03SVijay Mahadevan Level: intermediate 220*99fa7e03SVijay Mahadevan 221*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, component name 222*99fa7e03SVijay Mahadevan 223*99fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields() 224*99fa7e03SVijay Mahadevan @*/ 225*99fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName) 226*99fa7e03SVijay Mahadevan { 227*99fa7e03SVijay Mahadevan DM_Moab *dmmoab; 228*99fa7e03SVijay Mahadevan 229*99fa7e03SVijay Mahadevan PetscFunctionBegin; 230*99fa7e03SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 231*99fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 232*99fa7e03SVijay 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); 233*99fa7e03SVijay Mahadevan 234*99fa7e03SVijay Mahadevan *fieldName = dmmoab->fieldNames[field]; 235*99fa7e03SVijay Mahadevan PetscFunctionReturn(0); 236*99fa7e03SVijay Mahadevan } 237*99fa7e03SVijay Mahadevan 238*99fa7e03SVijay Mahadevan 239c68c6878SVijay Mahadevan #undef __FUNCT__ 240c68c6878SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldName" 241c68c6878SVijay Mahadevan /*@C 242*99fa7e03SVijay Mahadevan DMMoabSetFieldName - Sets the name of a field (component) managed by the DM 243c68c6878SVijay Mahadevan 244c68c6878SVijay Mahadevan Not Collective 245c68c6878SVijay Mahadevan 246c68c6878SVijay Mahadevan Input Parameters: 247*99fa7e03SVijay Mahadevan + dm - the discretization manager object 248c68c6878SVijay Mahadevan . field - the field number 249*99fa7e03SVijay Mahadevan - fieldName - the field (component) name 250c68c6878SVijay Mahadevan 251*99fa7e03SVijay Mahadevan Level: intermediate 252*99fa7e03SVijay Mahadevan Notes: Can only be called after DMMoabSetFields supplied with correct numFields 253c68c6878SVijay Mahadevan 254*99fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name 255*99fa7e03SVijay Mahadevan 256*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields() 257c68c6878SVijay Mahadevan @*/ 258*99fa7e03SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char **fieldName) 259c68c6878SVijay Mahadevan { 260c68c6878SVijay Mahadevan PetscErrorCode ierr; 261c68c6878SVijay Mahadevan DM_Moab *dmmoab; 262c68c6878SVijay Mahadevan 263c68c6878SVijay Mahadevan PetscFunctionBegin; 264c68c6878SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 265*99fa7e03SVijay Mahadevan PetscValidPointer(fieldName,3); 266*99fa7e03SVijay Mahadevan PetscValidCharPointer(*fieldName,3); 267c68c6878SVijay Mahadevan 268*99fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 269c68c6878SVijay 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); 270*99fa7e03SVijay Mahadevan 271*99fa7e03SVijay Mahadevan if (dmmoab->fieldNames[field]) { 272c68c6878SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr); 273*99fa7e03SVijay Mahadevan } 274*99fa7e03SVijay Mahadevan ierr = PetscStrallocpy(*fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr); 275c68c6878SVijay Mahadevan PetscFunctionReturn(0); 276c68c6878SVijay Mahadevan } 277c68c6878SVijay Mahadevan 2788cbae1a6SVijay Mahadevan 2798cbae1a6SVijay Mahadevan #undef __FUNCT__ 2808cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 281*99fa7e03SVijay Mahadevan /*@C 282*99fa7e03SVijay Mahadevan DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a 283*99fa7e03SVijay Mahadevan particular MOAB EntityHandle. 284*99fa7e03SVijay Mahadevan 285*99fa7e03SVijay Mahadevan Not Collective 286*99fa7e03SVijay Mahadevan 287*99fa7e03SVijay Mahadevan Input Parameters: 288*99fa7e03SVijay Mahadevan + dm - the discretization manager object 289*99fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values 290*99fa7e03SVijay Mahadevan - field - the field (component) index 291*99fa7e03SVijay Mahadevan 292*99fa7e03SVijay Mahadevan Output Parameter: 293*99fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat) 294*99fa7e03SVijay Mahadevan 295*99fa7e03SVijay Mahadevan Level: beginner 296*99fa7e03SVijay Mahadevan 297*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degree of freedom 298*99fa7e03SVijay Mahadevan 299*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal() 300*99fa7e03SVijay Mahadevan @*/ 3018cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 3028cbae1a6SVijay Mahadevan { 3038cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3048cbae1a6SVijay Mahadevan 3058cbae1a6SVijay Mahadevan PetscFunctionBegin; 3068cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3078cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3088cbae1a6SVijay Mahadevan 3098cbae1a6SVijay Mahadevan *dof=dmmoab->gidmap[(PetscInt)point]; 3108cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3118cbae1a6SVijay Mahadevan } 3128cbae1a6SVijay Mahadevan 3138cbae1a6SVijay Mahadevan 3148cbae1a6SVijay Mahadevan #undef __FUNCT__ 3158cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 316*99fa7e03SVijay Mahadevan /*@C 317*99fa7e03SVijay Mahadevan DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an 318*99fa7e03SVijay Mahadevan array of MOAB EntityHandles. 319*99fa7e03SVijay Mahadevan 320*99fa7e03SVijay Mahadevan Not Collective 321*99fa7e03SVijay Mahadevan 322*99fa7e03SVijay Mahadevan Input Parameters: 323*99fa7e03SVijay Mahadevan + dm - the discretization manager object 324*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 325*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 326*99fa7e03SVijay Mahadevan - field - the field (component) index 327*99fa7e03SVijay Mahadevan 328*99fa7e03SVijay Mahadevan Output Parameter: 329*99fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 330*99fa7e03SVijay Mahadevan 331*99fa7e03SVijay Mahadevan Level: intermediate 332*99fa7e03SVijay Mahadevan 333*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 334*99fa7e03SVijay Mahadevan 335*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal() 336*99fa7e03SVijay Mahadevan @*/ 3378cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 3388cbae1a6SVijay Mahadevan { 3398cbae1a6SVijay Mahadevan PetscInt i; 3408cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3418cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3428cbae1a6SVijay Mahadevan 3438cbae1a6SVijay Mahadevan PetscFunctionBegin; 3448cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 345*99fa7e03SVijay Mahadevan PetscValidPointer(points,3); 3468cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3478cbae1a6SVijay Mahadevan 3488cbae1a6SVijay Mahadevan if (!dof) { 3498cbae1a6SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 3508cbae1a6SVijay Mahadevan } 3518cbae1a6SVijay Mahadevan 352*99fa7e03SVijay Mahadevan if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */ 3538cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 354addae81cSVijay Mahadevan dof[i] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 3558cbae1a6SVijay Mahadevan } 3568cbae1a6SVijay Mahadevan else { 357*99fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 358*99fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3598cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 3608cbae1a6SVijay Mahadevan dof[i] = dmmoab->gidmap[(PetscInt)points[i]]+field*dmmoab->n; 3618cbae1a6SVijay Mahadevan } 3628cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3638cbae1a6SVijay Mahadevan } 3648cbae1a6SVijay Mahadevan 3658cbae1a6SVijay Mahadevan 3668cbae1a6SVijay Mahadevan #undef __FUNCT__ 3678cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal" 368*99fa7e03SVijay Mahadevan /*@C 369*99fa7e03SVijay Mahadevan DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an 370*99fa7e03SVijay Mahadevan array of MOAB EntityHandles. 371*99fa7e03SVijay Mahadevan 372*99fa7e03SVijay Mahadevan Not Collective 373*99fa7e03SVijay Mahadevan 374*99fa7e03SVijay Mahadevan Input Parameters: 375*99fa7e03SVijay Mahadevan + dm - the discretization manager object 376*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 377*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 378*99fa7e03SVijay Mahadevan - field - the field (component) index 379*99fa7e03SVijay Mahadevan 380*99fa7e03SVijay Mahadevan Output Parameter: 381*99fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 382*99fa7e03SVijay Mahadevan 383*99fa7e03SVijay Mahadevan Level: intermediate 384*99fa7e03SVijay Mahadevan 385*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, local degrees of freedom 386*99fa7e03SVijay Mahadevan 387*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs() 388*99fa7e03SVijay Mahadevan @*/ 3898cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 3908cbae1a6SVijay Mahadevan { 3918cbae1a6SVijay Mahadevan PetscInt i,offset; 3928cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3938cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3948cbae1a6SVijay Mahadevan 3958cbae1a6SVijay Mahadevan PetscFunctionBegin; 3968cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 397*99fa7e03SVijay Mahadevan PetscValidPointer(points,3); 3988cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3998cbae1a6SVijay Mahadevan 4008cbae1a6SVijay Mahadevan if (!dof) { 4018cbae1a6SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 4028cbae1a6SVijay Mahadevan } 4038cbae1a6SVijay Mahadevan 404*99fa7e03SVijay Mahadevan if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */ 4058cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 406addae81cSVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 4078cbae1a6SVijay Mahadevan } 4088cbae1a6SVijay Mahadevan else { 409*99fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 410*99fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 411*99fa7e03SVijay Mahadevan offset = field*dmmoab->n; 4128cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 4138cbae1a6SVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i]]+offset; 4148cbae1a6SVijay Mahadevan } 4158cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4168cbae1a6SVijay Mahadevan } 4178cbae1a6SVijay Mahadevan 4188cbae1a6SVijay Mahadevan 4198cbae1a6SVijay Mahadevan #undef __FUNCT__ 4208cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs" 421*99fa7e03SVijay Mahadevan /*@C 422*99fa7e03SVijay Mahadevan DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an 423*99fa7e03SVijay Mahadevan array of MOAB EntityHandles. 424*99fa7e03SVijay Mahadevan 425*99fa7e03SVijay Mahadevan Not Collective 426*99fa7e03SVijay Mahadevan 427*99fa7e03SVijay Mahadevan Input Parameters: 428*99fa7e03SVijay Mahadevan + dm - the discretization manager object 429*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 430*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 431*99fa7e03SVijay Mahadevan 432*99fa7e03SVijay Mahadevan Output Parameter: 433*99fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 434*99fa7e03SVijay Mahadevan 435*99fa7e03SVijay Mahadevan Level: intermediate 436*99fa7e03SVijay Mahadevan 437*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 438*99fa7e03SVijay Mahadevan 439*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked() 440*99fa7e03SVijay Mahadevan @*/ 4418cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 4428cbae1a6SVijay Mahadevan { 4438cbae1a6SVijay Mahadevan PetscInt i,field,offset; 4448cbae1a6SVijay Mahadevan PetscErrorCode ierr; 4458cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4468cbae1a6SVijay Mahadevan 4478cbae1a6SVijay Mahadevan PetscFunctionBegin; 4488cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 449*99fa7e03SVijay Mahadevan PetscValidPointer(points,3); 4508cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4518cbae1a6SVijay Mahadevan 4528cbae1a6SVijay Mahadevan if (!dof) { 453addae81cSVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->numFields*npoints, &dof);CHKERRQ(ierr); 4548cbae1a6SVijay Mahadevan } 4558cbae1a6SVijay Mahadevan 456*99fa7e03SVijay Mahadevan if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */ 457addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 4588cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 459addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 4608cbae1a6SVijay Mahadevan } 4618cbae1a6SVijay Mahadevan } 4628cbae1a6SVijay Mahadevan else { 463*99fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 464*99fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 465addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 466*99fa7e03SVijay Mahadevan offset = field*dmmoab->n; 4678cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 468addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]+offset; 4698cbae1a6SVijay Mahadevan } 4708cbae1a6SVijay Mahadevan } 4718cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4728cbae1a6SVijay Mahadevan } 4738cbae1a6SVijay Mahadevan 4748cbae1a6SVijay Mahadevan 4758cbae1a6SVijay Mahadevan #undef __FUNCT__ 4768cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal" 477*99fa7e03SVijay Mahadevan /*@C 478*99fa7e03SVijay Mahadevan DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an 479*99fa7e03SVijay Mahadevan array of MOAB EntityHandles. 480*99fa7e03SVijay Mahadevan 481*99fa7e03SVijay Mahadevan Not Collective 482*99fa7e03SVijay Mahadevan 483*99fa7e03SVijay Mahadevan Input Parameters: 484*99fa7e03SVijay Mahadevan + dm - the discretization manager object 485*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 486*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 487*99fa7e03SVijay Mahadevan 488*99fa7e03SVijay Mahadevan Output Parameter: 489*99fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 490*99fa7e03SVijay Mahadevan 491*99fa7e03SVijay Mahadevan Level: intermediate 492*99fa7e03SVijay Mahadevan 493*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 494*99fa7e03SVijay Mahadevan 495*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked() 496*99fa7e03SVijay Mahadevan @*/ 4978cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 4988cbae1a6SVijay Mahadevan { 4998cbae1a6SVijay Mahadevan PetscInt i,field,offset; 5008cbae1a6SVijay Mahadevan PetscErrorCode ierr; 5018cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5028cbae1a6SVijay Mahadevan 5038cbae1a6SVijay Mahadevan PetscFunctionBegin; 5048cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 505*99fa7e03SVijay Mahadevan PetscValidPointer(points,3); 5068cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5078cbae1a6SVijay Mahadevan 5088cbae1a6SVijay Mahadevan if (!dof) { 509addae81cSVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->numFields*npoints, &dof);CHKERRQ(ierr); 5108cbae1a6SVijay Mahadevan } 5118cbae1a6SVijay Mahadevan 512*99fa7e03SVijay Mahadevan if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */ 513addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 5148cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 515addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 5168cbae1a6SVijay Mahadevan } 5178cbae1a6SVijay Mahadevan } 5188cbae1a6SVijay Mahadevan else { 519*99fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 520*99fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 521addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 522*99fa7e03SVijay Mahadevan offset = field*dmmoab->n; 5238cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 524addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]+offset; 5258cbae1a6SVijay Mahadevan } 5268cbae1a6SVijay Mahadevan } 5278cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5288cbae1a6SVijay Mahadevan } 5298cbae1a6SVijay Mahadevan 5308cbae1a6SVijay Mahadevan 5318cbae1a6SVijay Mahadevan #undef __FUNCT__ 5328cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked" 533*99fa7e03SVijay Mahadevan /*@C 534*99fa7e03SVijay Mahadevan DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 535*99fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation 536*99fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 537*99fa7e03SVijay Mahadevan 538*99fa7e03SVijay Mahadevan Not Collective 539*99fa7e03SVijay Mahadevan 540*99fa7e03SVijay Mahadevan Input Parameters: 541*99fa7e03SVijay Mahadevan + dm - the discretization manager object 542*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 543*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 544*99fa7e03SVijay Mahadevan 545*99fa7e03SVijay Mahadevan Output Parameter: 546*99fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) 547*99fa7e03SVijay Mahadevan 548*99fa7e03SVijay Mahadevan Level: intermediate 549*99fa7e03SVijay Mahadevan 550*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 551*99fa7e03SVijay Mahadevan 552*99fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 553*99fa7e03SVijay Mahadevan @*/ 5548cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 5558cbae1a6SVijay Mahadevan { 5568cbae1a6SVijay Mahadevan PetscInt i; 5578cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5588cbae1a6SVijay Mahadevan PetscErrorCode ierr; 5598cbae1a6SVijay Mahadevan 5608cbae1a6SVijay Mahadevan PetscFunctionBegin; 5618cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5628cbae1a6SVijay Mahadevan PetscValidPointer(points,2); 5638cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5648cbae1a6SVijay Mahadevan 5658cbae1a6SVijay Mahadevan if (!dof) { 5668cbae1a6SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 5678cbae1a6SVijay Mahadevan } 5688cbae1a6SVijay Mahadevan 5698cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) { 5708cbae1a6SVijay Mahadevan dof[i]=dmmoab->gidmap[(PetscInt)points[i]]; 5718cbae1a6SVijay Mahadevan } 5728cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5738cbae1a6SVijay Mahadevan } 5748cbae1a6SVijay Mahadevan 5758cbae1a6SVijay Mahadevan 5768cbae1a6SVijay Mahadevan #undef __FUNCT__ 5778cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal" 578*99fa7e03SVijay Mahadevan /*@C 579*99fa7e03SVijay Mahadevan DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 580*99fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation 581*99fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 582*99fa7e03SVijay Mahadevan 583*99fa7e03SVijay Mahadevan Not Collective 584*99fa7e03SVijay Mahadevan 585*99fa7e03SVijay Mahadevan Input Parameters: 586*99fa7e03SVijay Mahadevan + dm - the discretization manager object 587*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 588*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 589*99fa7e03SVijay Mahadevan 590*99fa7e03SVijay Mahadevan Output Parameter: 591*99fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) 592*99fa7e03SVijay Mahadevan 593*99fa7e03SVijay Mahadevan Level: intermediate 594*99fa7e03SVijay Mahadevan 595*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom 596*99fa7e03SVijay Mahadevan 597*99fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 598*99fa7e03SVijay Mahadevan @*/ 5998cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 6008cbae1a6SVijay Mahadevan { 6018cbae1a6SVijay Mahadevan PetscInt i; 6028cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 6038cbae1a6SVijay Mahadevan PetscErrorCode ierr; 6048cbae1a6SVijay Mahadevan 6058cbae1a6SVijay Mahadevan PetscFunctionBegin; 6068cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6078cbae1a6SVijay Mahadevan PetscValidPointer(points,2); 6088cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6098cbae1a6SVijay Mahadevan 6108cbae1a6SVijay Mahadevan if (!dof) { 6118cbae1a6SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 6128cbae1a6SVijay Mahadevan } 6138cbae1a6SVijay Mahadevan 6148cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 6158cbae1a6SVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i]]; 6168cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6178cbae1a6SVijay Mahadevan } 6188cbae1a6SVijay Mahadevan 6198cbae1a6SVijay Mahadevan 6208cbae1a6SVijay Mahadevan #undef __FUNCT__ 6218cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlocked" 622*99fa7e03SVijay Mahadevan /*@C 623*99fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 624*99fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 625*99fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 626*99fa7e03SVijay Mahadevan 627*99fa7e03SVijay Mahadevan Not Collective 628*99fa7e03SVijay Mahadevan 629*99fa7e03SVijay Mahadevan Input Parameters: 630*99fa7e03SVijay Mahadevan + dm - the discretization manager object 631*99fa7e03SVijay Mahadevan 632*99fa7e03SVijay Mahadevan Output Parameter: 633*99fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 634*99fa7e03SVijay Mahadevan 635*99fa7e03SVijay Mahadevan Level: intermediate 636*99fa7e03SVijay Mahadevan 637*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom 638*99fa7e03SVijay Mahadevan 639*99fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 640*99fa7e03SVijay Mahadevan @*/ 6418cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof) 6428cbae1a6SVijay Mahadevan { 6438cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 6448cbae1a6SVijay Mahadevan 6458cbae1a6SVijay Mahadevan PetscFunctionBegin; 6468cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6478cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6488cbae1a6SVijay Mahadevan 6498cbae1a6SVijay Mahadevan *dof = dmmoab->gidmap; 6508cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6518cbae1a6SVijay Mahadevan } 6528cbae1a6SVijay Mahadevan 6538cbae1a6SVijay Mahadevan 6548cbae1a6SVijay Mahadevan #undef __FUNCT__ 6558cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlockedLocal" 656*99fa7e03SVijay Mahadevan /*@C 657*99fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 658*99fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 659*99fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 660*99fa7e03SVijay Mahadevan 661*99fa7e03SVijay Mahadevan Not Collective 662*99fa7e03SVijay Mahadevan 663*99fa7e03SVijay Mahadevan Input Parameters: 664*99fa7e03SVijay Mahadevan + dm - the discretization manager object 665*99fa7e03SVijay Mahadevan 666*99fa7e03SVijay Mahadevan Output Parameter: 667*99fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 668*99fa7e03SVijay Mahadevan 669*99fa7e03SVijay Mahadevan Level: intermediate 670*99fa7e03SVijay Mahadevan 671*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom 672*99fa7e03SVijay Mahadevan 673*99fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 674*99fa7e03SVijay Mahadevan @*/ 6758cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof) 6768cbae1a6SVijay Mahadevan { 6778cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 6788cbae1a6SVijay Mahadevan 6798cbae1a6SVijay Mahadevan PetscFunctionBegin; 6808cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6818cbae1a6SVijay Mahadevan PetscValidPointer(dof,2); 6828cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6838cbae1a6SVijay Mahadevan 6848cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap; 6858cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 6868cbae1a6SVijay Mahadevan } 6878cbae1a6SVijay Mahadevan 688