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" 78cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 88cbae1a6SVijay Mahadevan { 98cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 108cbae1a6SVijay Mahadevan moab::Tag vtag,ntag; 118cbae1a6SVijay Mahadevan const PetscScalar *varray; 128cbae1a6SVijay Mahadevan PetscScalar *farray; 138cbae1a6SVijay Mahadevan moab::ErrorCode merr; 148cbae1a6SVijay Mahadevan PetscErrorCode ierr; 158cbae1a6SVijay Mahadevan std::string tag_name; 168cbae1a6SVijay Mahadevan 178cbae1a6SVijay Mahadevan PetscFunctionBegin; 188cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 198cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 208cbae1a6SVijay Mahadevan 21addae81cSVijay 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); 22addae81cSVijay Mahadevan 238cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 24addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 258cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr); 268cbae1a6SVijay Mahadevan 278cbae1a6SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 288cbae1a6SVijay Mahadevan 298cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 308cbae1a6SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 318cbae1a6SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 328cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 338cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr); 348cbae1a6SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 358cbae1a6SVijay Mahadevan } 368cbae1a6SVijay Mahadevan else { 378cbae1a6SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr); 388cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 398cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr); 408cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 418cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 428cbae1a6SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 438cbae1a6SVijay Mahadevan } 448cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);MBERRNM(merr); 458cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 468cbae1a6SVijay Mahadevan } 478cbae1a6SVijay Mahadevan 488cbae1a6SVijay Mahadevan 498cbae1a6SVijay Mahadevan #undef __FUNCT__ 508cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector" 518cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) 528cbae1a6SVijay Mahadevan { 538cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 548cbae1a6SVijay Mahadevan moab::Tag vtag,ntag; 558cbae1a6SVijay Mahadevan const PetscScalar *varray; 568cbae1a6SVijay Mahadevan PetscScalar *farray; 578cbae1a6SVijay Mahadevan moab::ErrorCode merr; 588cbae1a6SVijay Mahadevan PetscErrorCode ierr; 598cbae1a6SVijay Mahadevan PetscInt i,ifield; 608cbae1a6SVijay Mahadevan std::string tag_name; 618cbae1a6SVijay Mahadevan moab::Range::iterator iter; 628cbae1a6SVijay Mahadevan 638cbae1a6SVijay Mahadevan PetscFunctionBegin; 648cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 658cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 668cbae1a6SVijay Mahadevan 678cbae1a6SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */ 688cbae1a6SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 698cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 708cbae1a6SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr); 718cbae1a6SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 728cbae1a6SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */ 738cbae1a6SVijay Mahadevan 748cbae1a6SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 75addae81cSVijay Mahadevan for (ifield=0; ifield<dmmoab->numFields; ++ifield) { 768cbae1a6SVijay Mahadevan 778cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 78addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 798cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr); 808cbae1a6SVijay Mahadevan 818cbae1a6SVijay Mahadevan for(i=0;i<dmmoab->nloc;i++) { 828cbae1a6SVijay Mahadevan if (dmmoab->bs == 1) 838cbae1a6SVijay Mahadevan farray[i]=varray[ifield*dmmoab->nloc+i]; 848cbae1a6SVijay Mahadevan else 85addae81cSVijay Mahadevan farray[i]=varray[i*dmmoab->numFields+ifield]; 868cbae1a6SVijay Mahadevan } 878cbae1a6SVijay Mahadevan 888cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 898cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 908cbae1a6SVijay Mahadevan } 918cbae1a6SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 928cbae1a6SVijay Mahadevan } 938cbae1a6SVijay Mahadevan else { 948cbae1a6SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr); 958cbae1a6SVijay Mahadevan 968cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 978cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 98addae81cSVijay Mahadevan for (ifield=0; ifield<dmmoab->numFields; ++ifield) { 998cbae1a6SVijay Mahadevan 1008cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 101addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 1028cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr); 1038cbae1a6SVijay Mahadevan 1048cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1058cbae1a6SVijay Mahadevan for(i=0; i < dmmoab->nloc; i++) { 1068cbae1a6SVijay Mahadevan farray[i] = varray[i*dmmoab->bs+ifield]; 1078cbae1a6SVijay Mahadevan } 1088cbae1a6SVijay Mahadevan 1098cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 1108cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 1118cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 1128cbae1a6SVijay Mahadevan } 1138cbae1a6SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 1148cbae1a6SVijay Mahadevan } 1158cbae1a6SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 1168cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1178cbae1a6SVijay Mahadevan } 1188cbae1a6SVijay Mahadevan 1198cbae1a6SVijay Mahadevan 1208cbae1a6SVijay Mahadevan #undef __FUNCT__ 1218cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields" 122addae81cSVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt numFields,const char** fields) 1238cbae1a6SVijay Mahadevan { 124addae81cSVijay Mahadevan PetscErrorCode ierr; 125addae81cSVijay Mahadevan PetscInt i; 1268cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 1278cbae1a6SVijay Mahadevan 1288cbae1a6SVijay Mahadevan PetscFunctionBegin; 1298cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1308cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1318cbae1a6SVijay Mahadevan 132addae81cSVijay Mahadevan /* first deallocate the existing field structure */ 133addae81cSVijay Mahadevan if (dmmoab->fieldNames) { 134addae81cSVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 135addae81cSVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 136addae81cSVijay Mahadevan } 137addae81cSVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 138addae81cSVijay Mahadevan } 139addae81cSVijay Mahadevan 140addae81cSVijay Mahadevan /* now re-allocate and assign field names */ 141addae81cSVijay Mahadevan dmmoab->numFields = numFields; 142addae81cSVijay Mahadevan ierr = PetscMalloc(sizeof(char*)*numFields,&dmmoab->fieldNames);CHKERRQ(ierr); 143addae81cSVijay Mahadevan if (fields) { 144addae81cSVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 145addae81cSVijay Mahadevan ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr); 146addae81cSVijay Mahadevan } 147addae81cSVijay Mahadevan } 1488cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1498cbae1a6SVijay Mahadevan } 1508cbae1a6SVijay Mahadevan 151*c68c6878SVijay Mahadevan #undef __FUNCT__ 152*c68c6878SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldName" 153*c68c6878SVijay Mahadevan /*@C 154*c68c6878SVijay Mahadevan DMMoabSetFieldName - Sets the name of a field in the DM 155*c68c6878SVijay Mahadevan 156*c68c6878SVijay Mahadevan Not Collective 157*c68c6878SVijay Mahadevan 158*c68c6878SVijay Mahadevan Input Parameters: 159*c68c6878SVijay Mahadevan + dm - the DM object 160*c68c6878SVijay Mahadevan . field - the field number 161*c68c6878SVijay Mahadevan - fieldName - the field name 162*c68c6878SVijay Mahadevan 163*c68c6878SVijay Mahadevan Level: developer 164*c68c6878SVijay Mahadevan Note: Needs to be called after DMMoabSetFields with correct numFields 165*c68c6878SVijay Mahadevan 166*c68c6878SVijay Mahadevan .seealso: DMMoabSetFields() 167*c68c6878SVijay Mahadevan @*/ 168*c68c6878SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char fieldName[]) 169*c68c6878SVijay Mahadevan { 170*c68c6878SVijay Mahadevan PetscErrorCode ierr; 171*c68c6878SVijay Mahadevan DM_Moab *dmmoab; 172*c68c6878SVijay Mahadevan 173*c68c6878SVijay Mahadevan PetscFunctionBegin; 174*c68c6878SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 175*c68c6878SVijay Mahadevan PetscValidCharPointer(fieldName,3); 176*c68c6878SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 177*c68c6878SVijay Mahadevan 178*c68c6878SVijay 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); 179*c68c6878SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr); 180*c68c6878SVijay Mahadevan ierr = PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr); 181*c68c6878SVijay Mahadevan PetscFunctionReturn(0); 182*c68c6878SVijay Mahadevan } 183*c68c6878SVijay Mahadevan 1848cbae1a6SVijay Mahadevan 1858cbae1a6SVijay Mahadevan #undef __FUNCT__ 1868cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 1878cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 1888cbae1a6SVijay Mahadevan { 1898cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 1908cbae1a6SVijay Mahadevan 1918cbae1a6SVijay Mahadevan PetscFunctionBegin; 1928cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1938cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1948cbae1a6SVijay Mahadevan 1958cbae1a6SVijay Mahadevan *dof=dmmoab->gidmap[(PetscInt)point]; 1968cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1978cbae1a6SVijay Mahadevan } 1988cbae1a6SVijay Mahadevan 1998cbae1a6SVijay Mahadevan 2008cbae1a6SVijay Mahadevan #undef __FUNCT__ 2018cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 2028cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 2038cbae1a6SVijay Mahadevan { 2048cbae1a6SVijay Mahadevan PetscInt i; 2058cbae1a6SVijay Mahadevan PetscErrorCode ierr; 2068cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2078cbae1a6SVijay Mahadevan 2088cbae1a6SVijay Mahadevan PetscFunctionBegin; 2098cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2108cbae1a6SVijay Mahadevan PetscValidPointer(points,2); 2118cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 2128cbae1a6SVijay Mahadevan 2138cbae1a6SVijay Mahadevan if (!dof) { 2148cbae1a6SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 2158cbae1a6SVijay Mahadevan } 2168cbae1a6SVijay Mahadevan 2178cbae1a6SVijay Mahadevan /* first get the local indices */ 2188cbae1a6SVijay Mahadevan if (dmmoab->bs > 1) { 2198cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 220addae81cSVijay Mahadevan dof[i] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 2218cbae1a6SVijay Mahadevan } 2228cbae1a6SVijay Mahadevan else { 2238cbae1a6SVijay Mahadevan /* assume all fields have equal distribution */ 2248cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 2258cbae1a6SVijay Mahadevan dof[i] = dmmoab->gidmap[(PetscInt)points[i]]+field*dmmoab->n; 2268cbae1a6SVijay Mahadevan } 2278cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 2288cbae1a6SVijay Mahadevan } 2298cbae1a6SVijay Mahadevan 2308cbae1a6SVijay Mahadevan 2318cbae1a6SVijay Mahadevan #undef __FUNCT__ 2328cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal" 2338cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 2348cbae1a6SVijay Mahadevan { 2358cbae1a6SVijay Mahadevan PetscInt i,offset; 2368cbae1a6SVijay Mahadevan PetscErrorCode ierr; 2378cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2388cbae1a6SVijay Mahadevan 2398cbae1a6SVijay Mahadevan PetscFunctionBegin; 2408cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2418cbae1a6SVijay Mahadevan PetscValidPointer(points,2); 2428cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 2438cbae1a6SVijay Mahadevan 2448cbae1a6SVijay Mahadevan if (!dof) { 2458cbae1a6SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 2468cbae1a6SVijay Mahadevan } 2478cbae1a6SVijay Mahadevan 2488cbae1a6SVijay Mahadevan if (dmmoab->bs > 1) { 2498cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 250addae81cSVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 2518cbae1a6SVijay Mahadevan } 2528cbae1a6SVijay Mahadevan else { 2538cbae1a6SVijay Mahadevan offset = field*dmmoab->n; /* assume all fields have equal distribution */ 2548cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 2558cbae1a6SVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i]]+offset; 2568cbae1a6SVijay Mahadevan } 2578cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 2588cbae1a6SVijay Mahadevan } 2598cbae1a6SVijay Mahadevan 2608cbae1a6SVijay Mahadevan 2618cbae1a6SVijay Mahadevan #undef __FUNCT__ 2628cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs" 2638cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 2648cbae1a6SVijay Mahadevan { 2658cbae1a6SVijay Mahadevan PetscInt i,field,offset; 2668cbae1a6SVijay Mahadevan PetscErrorCode ierr; 2678cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2688cbae1a6SVijay Mahadevan 2698cbae1a6SVijay Mahadevan PetscFunctionBegin; 2708cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2718cbae1a6SVijay Mahadevan PetscValidPointer(points,2); 2728cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 2738cbae1a6SVijay Mahadevan 2748cbae1a6SVijay Mahadevan if (!dof) { 275addae81cSVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->numFields*npoints, &dof);CHKERRQ(ierr); 2768cbae1a6SVijay Mahadevan } 2778cbae1a6SVijay Mahadevan 2788cbae1a6SVijay Mahadevan if (dmmoab->bs > 1) { 279addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 2808cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 281addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 2828cbae1a6SVijay Mahadevan } 2838cbae1a6SVijay Mahadevan } 2848cbae1a6SVijay Mahadevan else { 285addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 2868cbae1a6SVijay Mahadevan offset = field*dmmoab->n; /* assume all fields have equal distribution */ 2878cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 288addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]+offset; 2898cbae1a6SVijay Mahadevan } 2908cbae1a6SVijay Mahadevan } 2918cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 2928cbae1a6SVijay Mahadevan } 2938cbae1a6SVijay Mahadevan 2948cbae1a6SVijay Mahadevan 2958cbae1a6SVijay Mahadevan #undef __FUNCT__ 2968cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal" 2978cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 2988cbae1a6SVijay Mahadevan { 2998cbae1a6SVijay Mahadevan PetscInt i,field,offset; 3008cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3018cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3028cbae1a6SVijay Mahadevan 3038cbae1a6SVijay Mahadevan PetscFunctionBegin; 3048cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3058cbae1a6SVijay Mahadevan PetscValidPointer(points,2); 3068cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3078cbae1a6SVijay Mahadevan 3088cbae1a6SVijay Mahadevan if (!dof) { 309addae81cSVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->numFields*npoints, &dof);CHKERRQ(ierr); 3108cbae1a6SVijay Mahadevan } 3118cbae1a6SVijay Mahadevan 3128cbae1a6SVijay Mahadevan if (dmmoab->bs > 1) { 313addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 3148cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 315addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field; 3168cbae1a6SVijay Mahadevan } 3178cbae1a6SVijay Mahadevan } 3188cbae1a6SVijay Mahadevan else { 319addae81cSVijay Mahadevan for (field=0; field<dmmoab->numFields; ++field) { 3208cbae1a6SVijay Mahadevan offset = field*dmmoab->n; /* assume all fields have equal distribution */ 3218cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 322addae81cSVijay Mahadevan dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]+offset; 3238cbae1a6SVijay Mahadevan } 3248cbae1a6SVijay Mahadevan } 3258cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3268cbae1a6SVijay Mahadevan } 3278cbae1a6SVijay Mahadevan 3288cbae1a6SVijay Mahadevan 3298cbae1a6SVijay Mahadevan #undef __FUNCT__ 3308cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked" 3318cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 3328cbae1a6SVijay Mahadevan { 3338cbae1a6SVijay Mahadevan PetscInt i; 3348cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3358cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3368cbae1a6SVijay Mahadevan 3378cbae1a6SVijay Mahadevan PetscFunctionBegin; 3388cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3398cbae1a6SVijay Mahadevan PetscValidPointer(points,2); 3408cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3418cbae1a6SVijay Mahadevan 3428cbae1a6SVijay Mahadevan if (!dof) { 3438cbae1a6SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 3448cbae1a6SVijay Mahadevan } 3458cbae1a6SVijay Mahadevan 3468cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) { 3478cbae1a6SVijay Mahadevan dof[i]=dmmoab->gidmap[(PetscInt)points[i]]; 3488cbae1a6SVijay Mahadevan } 3498cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3508cbae1a6SVijay Mahadevan } 3518cbae1a6SVijay Mahadevan 3528cbae1a6SVijay Mahadevan 3538cbae1a6SVijay Mahadevan #undef __FUNCT__ 3548cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal" 3558cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 3568cbae1a6SVijay Mahadevan { 3578cbae1a6SVijay Mahadevan PetscInt i; 3588cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3598cbae1a6SVijay Mahadevan PetscErrorCode ierr; 3608cbae1a6SVijay Mahadevan 3618cbae1a6SVijay Mahadevan PetscFunctionBegin; 3628cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3638cbae1a6SVijay Mahadevan PetscValidPointer(points,2); 3648cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3658cbae1a6SVijay Mahadevan 3668cbae1a6SVijay Mahadevan if (!dof) { 3678cbae1a6SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 3688cbae1a6SVijay Mahadevan } 3698cbae1a6SVijay Mahadevan 3708cbae1a6SVijay Mahadevan for (i=0; i<npoints; ++i) 3718cbae1a6SVijay Mahadevan dof[i] = dmmoab->lidmap[(PetscInt)points[i]]; 3728cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3738cbae1a6SVijay Mahadevan } 3748cbae1a6SVijay Mahadevan 3758cbae1a6SVijay Mahadevan 3768cbae1a6SVijay Mahadevan #undef __FUNCT__ 3778cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlocked" 3788cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof) 3798cbae1a6SVijay Mahadevan { 3808cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3818cbae1a6SVijay Mahadevan 3828cbae1a6SVijay Mahadevan PetscFunctionBegin; 3838cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3848cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3858cbae1a6SVijay Mahadevan 3868cbae1a6SVijay Mahadevan *dof = dmmoab->gidmap; 3878cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3888cbae1a6SVijay Mahadevan } 3898cbae1a6SVijay Mahadevan 3908cbae1a6SVijay Mahadevan 3918cbae1a6SVijay Mahadevan #undef __FUNCT__ 3928cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlockedLocal" 3938cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof) 3948cbae1a6SVijay Mahadevan { 3958cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3968cbae1a6SVijay Mahadevan 3978cbae1a6SVijay Mahadevan PetscFunctionBegin; 3988cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3998cbae1a6SVijay Mahadevan PetscValidPointer(dof,2); 4008cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4018cbae1a6SVijay Mahadevan 4028cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap; 4038cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4048cbae1a6SVijay Mahadevan } 4058cbae1a6SVijay Mahadevan 4068cbae1a6SVijay Mahadevan 4078cbae1a6SVijay Mahadevan 408