1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I "petscdm.h" I*/ 2032b8ab6SVijay Mahadevan #include <petsc-private/vecimpl.h> /*I "petscdm.h" I*/ 3032b8ab6SVijay Mahadevan 4032b8ab6SVijay Mahadevan #include <petscdmmoab.h> 5032b8ab6SVijay Mahadevan #include <MBTagConventions.hpp> 6032b8ab6SVijay Mahadevan 7032b8ab6SVijay Mahadevan // declare for use later but before they're defined 8032b8ab6SVijay Mahadevan static PetscErrorCode DMMoab_VecUserDestroy(void *user); 9032b8ab6SVijay Mahadevan static PetscErrorCode DMMoab_VecDuplicate(Vec x,Vec *y); 10032b8ab6SVijay Mahadevan static PetscErrorCode DMMoab_VecCreateTagName_Private(moab::ParallelComm *pcomm,char** tag_name); 11032b8ab6SVijay Mahadevan 12032b8ab6SVijay Mahadevan #undef __FUNCT__ 13032b8ab6SVijay Mahadevan #define __FUNCT__ "DMMoab_CreateVector_Private" 14bb8f3634SVijay Mahadevan PetscErrorCode DMMoab_CreateVector_Private(DM dm,moab::Tag tag,moab::Range* userrange,PetscBool is_global_vec,PetscBool destroy_tag,Vec *vec) 15032b8ab6SVijay Mahadevan { 16032b8ab6SVijay Mahadevan PetscErrorCode ierr; 17032b8ab6SVijay Mahadevan moab::ErrorCode merr; 18032b8ab6SVijay Mahadevan PetscBool is_newtag; 19032b8ab6SVijay Mahadevan moab::Range *range; 20bb8f3634SVijay Mahadevan PetscInt count,lnative_vec,gnative_vec; 219088682fSVijay Mahadevan std::string ttname; 22032b8ab6SVijay Mahadevan PetscScalar *data_ptr; 23bb8f3634SVijay Mahadevan ISLocalToGlobalMapping ltogb; 24032b8ab6SVijay Mahadevan 25db66d124SVijay Mahadevan Vec_MOAB *vmoab; 26032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 27032b8ab6SVijay Mahadevan moab::ParallelComm *pcomm = dmmoab->pcomm; 28032b8ab6SVijay Mahadevan moab::Interface *mbiface = dmmoab->mbiface; 29032b8ab6SVijay Mahadevan 30032b8ab6SVijay Mahadevan PetscFunctionBegin; 31032b8ab6SVijay Mahadevan if(!userrange) range = dmmoab->vowned; 32032b8ab6SVijay Mahadevan else range = userrange; 33db66d124SVijay Mahadevan if(!range) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Input range cannot be empty or call DMSetUp first."); 34032b8ab6SVijay Mahadevan 35bb8f3634SVijay Mahadevan /* If the tag data is in a single sequence, use PETSc native vector since tag_iterate isn't useful anymore */ 36bb8f3634SVijay Mahadevan lnative_vec=(range->psize()-1); 37bb8f3634SVijay Mahadevan 38*6d9eb265SVijay Mahadevan lnative_vec=1; /* NOTE: Testing PETSc vector: will force to create native vector all the time */ 39bb8f3634SVijay Mahadevan ierr = MPI_Allreduce(&lnative_vec, &gnative_vec, 1, MPI_INT, MPI_MAX, pcomm->comm());CHKERRQ(ierr); 40bb8f3634SVijay Mahadevan 41bb8f3634SVijay Mahadevan /* Create the MOAB internal data object */ 42bb8f3634SVijay Mahadevan ierr = PetscNew(Vec_MOAB,&vmoab);CHKERRQ(ierr); 43bb8f3634SVijay Mahadevan vmoab->is_native_vec=(gnative_vec>0?PETSC_TRUE:PETSC_FALSE); 44bb8f3634SVijay Mahadevan 45bb8f3634SVijay Mahadevan if (!vmoab->is_native_vec) { 469088682fSVijay Mahadevan merr = mbiface->tag_get_name(tag, ttname); 479088682fSVijay Mahadevan if (!ttname.length() && merr !=moab::MB_SUCCESS) { 48db66d124SVijay Mahadevan /* get the new name for the anonymous MOABVec -> the tag_name will be destroyed along with Tag */ 49032b8ab6SVijay Mahadevan char *tag_name = PETSC_NULL; 50032b8ab6SVijay Mahadevan ierr = DMMoab_VecCreateTagName_Private(pcomm,&tag_name);CHKERRQ(ierr); 51032b8ab6SVijay Mahadevan is_newtag = PETSC_TRUE; 52032b8ab6SVijay Mahadevan 53db66d124SVijay Mahadevan /* Create the default value for the tag (all zeros) */ 54bb8f3634SVijay Mahadevan std::vector<PetscScalar> default_value(dmmoab->nfields, 0.0); 55032b8ab6SVijay Mahadevan 56db66d124SVijay Mahadevan /* Create the tag */ 57bb8f3634SVijay Mahadevan merr = mbiface->tag_get_handle(tag_name,dmmoab->nfields,moab::MB_TYPE_DOUBLE,tag, 58032b8ab6SVijay Mahadevan moab::MB_TAG_DENSE|moab::MB_TAG_CREAT,default_value.data());MBERRNM(merr); 59032b8ab6SVijay Mahadevan ierr = PetscFree(tag_name);CHKERRQ(ierr); 60032b8ab6SVijay Mahadevan } 61032b8ab6SVijay Mahadevan else { 62db66d124SVijay Mahadevan /* Make sure the tag data is of type "double" */ 63032b8ab6SVijay Mahadevan moab::DataType tag_type; 64032b8ab6SVijay Mahadevan merr = mbiface->tag_get_data_type(tag, tag_type);MBERRNM(merr); 65032b8ab6SVijay Mahadevan if(tag_type != moab::MB_TYPE_DOUBLE) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Tag data type must be MB_TYPE_DOUBLE"); 66032b8ab6SVijay Mahadevan is_newtag = destroy_tag; 67032b8ab6SVijay Mahadevan } 68032b8ab6SVijay Mahadevan 69032b8ab6SVijay Mahadevan vmoab->tag = tag; 70bb8f3634SVijay Mahadevan vmoab->new_tag = is_newtag; 71bb8f3634SVijay Mahadevan } 72032b8ab6SVijay Mahadevan vmoab->mbiface = mbiface; 73032b8ab6SVijay Mahadevan vmoab->pcomm = pcomm; 74032b8ab6SVijay Mahadevan vmoab->is_global_vec = is_global_vec; 75bb8f3634SVijay Mahadevan vmoab->tag_size=dmmoab->bs; 76032b8ab6SVijay Mahadevan 77bb8f3634SVijay Mahadevan if (vmoab->is_native_vec) { 78fc418013SVijay Mahadevan 79bb8f3634SVijay Mahadevan /* Create the PETSc Vector directly and attach our functions accordingly */ 80bb8f3634SVijay Mahadevan if (!is_global_vec) { 81bb8f3634SVijay Mahadevan /* This is an MPI Vector with ghosted padding */ 82bb8f3634SVijay Mahadevan ierr = VecCreateGhostBlock(pcomm->comm(),dmmoab->bs,dmmoab->nfields*dmmoab->nloc, 83bb8f3634SVijay Mahadevan dmmoab->nfields*dmmoab->n,dmmoab->nghost,&dmmoab->gsindices[dmmoab->nloc],vec);CHKERRQ(ierr); 84bb8f3634SVijay Mahadevan } 85bb8f3634SVijay Mahadevan else { 86bb8f3634SVijay Mahadevan /* This is an MPI/SEQ Vector */ 87bb8f3634SVijay Mahadevan ierr = VecCreate(pcomm->comm(),vec);CHKERRQ(ierr); 88bb8f3634SVijay Mahadevan ierr = VecSetSizes(*vec,dmmoab->nfields*dmmoab->nloc,PETSC_DECIDE);CHKERRQ(ierr); 89bb8f3634SVijay Mahadevan ierr = VecSetBlockSize(*vec,dmmoab->bs);CHKERRQ(ierr); 90bb8f3634SVijay Mahadevan ierr = VecSetType(*vec, VECMPI);CHKERRQ(ierr); 91bb8f3634SVijay Mahadevan } 92bb8f3634SVijay Mahadevan } 93bb8f3634SVijay Mahadevan else { 94db66d124SVijay Mahadevan /* Call tag_iterate. This will cause MOAB to allocate memory for the 95db66d124SVijay Mahadevan tag data if it hasn't already happened */ 96032b8ab6SVijay Mahadevan merr = mbiface->tag_iterate(tag,range->begin(),range->end(),count,(void*&)data_ptr);MBERRNM(merr); 97032b8ab6SVijay Mahadevan 98bb8f3634SVijay Mahadevan /* set the reference for vector range */ 99bb8f3634SVijay Mahadevan vmoab->tag_range = new moab::Range(*range); 100bb8f3634SVijay Mahadevan merr = mbiface->tag_get_length(tag,dmmoab->nfields);MBERRNM(merr); 101032b8ab6SVijay Mahadevan 102db66d124SVijay Mahadevan /* Create the PETSc Vector 103db66d124SVijay Mahadevan Query MOAB mesh to check if there are any ghosted entities 104032b8ab6SVijay Mahadevan -> if we do, create a ghosted vector to map correctly to the same layout 105032b8ab6SVijay Mahadevan -> else, create a non-ghosted parallel vector */ 106bb8f3634SVijay Mahadevan if (!is_global_vec) { 107db66d124SVijay Mahadevan /* This is an MPI Vector with ghosted padding */ 108bb8f3634SVijay Mahadevan ierr = VecCreateGhostBlockWithArray(pcomm->comm(),dmmoab->bs,dmmoab->nfields*dmmoab->nloc, 109bb8f3634SVijay Mahadevan dmmoab->nfields*dmmoab->n,dmmoab->nghost,&dmmoab->gsindices[dmmoab->nloc],data_ptr,vec);CHKERRQ(ierr); 110032b8ab6SVijay Mahadevan } 111032b8ab6SVijay Mahadevan else { 112bb8f3634SVijay Mahadevan /* This is an MPI Vector without ghosted padding */ 113bb8f3634SVijay Mahadevan ierr = VecCreateMPIWithArray(pcomm->comm(),dmmoab->bs,dmmoab->nfields*range->size(), 114bb8f3634SVijay Mahadevan PETSC_DECIDE,data_ptr,vec);CHKERRQ(ierr); 115032b8ab6SVijay Mahadevan } 116bb8f3634SVijay Mahadevan } 117bb8f3634SVijay Mahadevan ierr = VecSetFromOptions(*vec);CHKERRQ(ierr); 118032b8ab6SVijay Mahadevan 119032b8ab6SVijay Mahadevan PetscContainer moabdata; 120bb8f3634SVijay Mahadevan ierr = PetscContainerCreate(PETSC_COMM_WORLD,&moabdata);CHKERRQ(ierr); 121032b8ab6SVijay Mahadevan ierr = PetscContainerSetPointer(moabdata,vmoab);CHKERRQ(ierr); 122032b8ab6SVijay Mahadevan ierr = PetscContainerSetUserDestroy(moabdata,DMMoab_VecUserDestroy);CHKERRQ(ierr); 123032b8ab6SVijay Mahadevan ierr = PetscObjectCompose((PetscObject)*vec,"MOABData",(PetscObject)moabdata);CHKERRQ(ierr); 124032b8ab6SVijay Mahadevan (*vec)->ops->duplicate = DMMoab_VecDuplicate; 125032b8ab6SVijay Mahadevan ierr = PetscContainerDestroy(&moabdata);CHKERRQ(ierr); 126032b8ab6SVijay Mahadevan 127db66d124SVijay Mahadevan /* Vector created, manually set local to global mapping */ 128*6d9eb265SVijay Mahadevan if (dmmoab->ltog_map) { 129bb8f3634SVijay Mahadevan ierr = VecSetLocalToGlobalMapping(*vec,dmmoab->ltog_map);CHKERRQ(ierr); 130bb8f3634SVijay Mahadevan ierr = ISLocalToGlobalMappingBlock(dmmoab->ltog_map,dmmoab->bs,<ogb); 131bb8f3634SVijay Mahadevan ierr = VecSetLocalToGlobalMappingBlock(*vec,ltogb);CHKERRQ(ierr); 132bb8f3634SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(<ogb);CHKERRQ(ierr); 133*6d9eb265SVijay Mahadevan } 134032b8ab6SVijay Mahadevan 135032b8ab6SVijay Mahadevan /* set the DM reference to the vector */ 136032b8ab6SVijay Mahadevan ierr = VecSetDM(*vec, dm);CHKERRQ(ierr); 137032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 138032b8ab6SVijay Mahadevan } 139032b8ab6SVijay Mahadevan 140032b8ab6SVijay Mahadevan 141032b8ab6SVijay Mahadevan #undef __FUNCT__ 142032b8ab6SVijay Mahadevan #define __FUNCT__ "DMMoabCreateVector" 143032b8ab6SVijay Mahadevan /*@ 144032b8ab6SVijay Mahadevan DMMoabCreateVector - Create a Vec from either an existing tag, or a specified tag size, and a range of entities 145032b8ab6SVijay Mahadevan 146032b8ab6SVijay Mahadevan Collective on MPI_Comm 147032b8ab6SVijay Mahadevan 148032b8ab6SVijay Mahadevan Input Parameter: 149032b8ab6SVijay Mahadevan . dm - The DMMoab object being set 150032b8ab6SVijay Mahadevan . tag - If non-zero, block size will be taken from the tag size 151032b8ab6SVijay Mahadevan . range - If non-empty, Vec corresponds to these entities, otherwise to the entities set on the DMMoab 152032b8ab6SVijay Mahadevan . is_global_vec - If true, this is a local representation of the Vec (including ghosts in parallel), otherwise a truly parallel one 153032b8ab6SVijay Mahadevan . destroy_tag - If true, MOAB tag is destroyed with Vec, otherwise it is left on MOAB 154032b8ab6SVijay Mahadevan 155032b8ab6SVijay Mahadevan Output Parameter: 156032b8ab6SVijay Mahadevan . vec - The created vector 157032b8ab6SVijay Mahadevan 158032b8ab6SVijay Mahadevan Level: beginner 159032b8ab6SVijay Mahadevan 160032b8ab6SVijay Mahadevan .keywords: DMMoab, create 161032b8ab6SVijay Mahadevan @*/ 162bb8f3634SVijay Mahadevan PetscErrorCode DMMoabCreateVector(DM dm,moab::Tag tag,moab::Range* range,PetscBool is_global_vec,PetscBool destroy_tag,Vec *vec) 163032b8ab6SVijay Mahadevan { 164032b8ab6SVijay Mahadevan PetscErrorCode ierr; 165032b8ab6SVijay Mahadevan 166032b8ab6SVijay Mahadevan PetscFunctionBegin; 167bb8f3634SVijay Mahadevan if(!tag && (!range || range->empty())) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Both tag and range cannot be null."); 168032b8ab6SVijay Mahadevan 169bb8f3634SVijay Mahadevan ierr = DMMoab_CreateVector_Private(dm,tag,range,is_global_vec,destroy_tag,vec);CHKERRQ(ierr); 170032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 171032b8ab6SVijay Mahadevan } 172032b8ab6SVijay Mahadevan 173032b8ab6SVijay Mahadevan 174032b8ab6SVijay Mahadevan #undef __FUNCT__ 175032b8ab6SVijay Mahadevan #define __FUNCT__ "DMCreateGlobalVector_Moab" 176032b8ab6SVijay Mahadevan PetscErrorCode DMCreateGlobalVector_Moab(DM dm,Vec *gvec) 177032b8ab6SVijay Mahadevan { 178032b8ab6SVijay Mahadevan PetscErrorCode ierr; 179032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 180032b8ab6SVijay Mahadevan 181032b8ab6SVijay Mahadevan PetscFunctionBegin; 182032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 183032b8ab6SVijay Mahadevan PetscValidPointer(gvec,2); 184bb8f3634SVijay Mahadevan ierr = DMMoab_CreateVector_Private(dm,PETSC_NULL,dmmoab->vowned,PETSC_TRUE,PETSC_TRUE,gvec);CHKERRQ(ierr); 185032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 186032b8ab6SVijay Mahadevan } 187032b8ab6SVijay Mahadevan 188032b8ab6SVijay Mahadevan 189032b8ab6SVijay Mahadevan #undef __FUNCT__ 190032b8ab6SVijay Mahadevan #define __FUNCT__ "DMCreateLocalVector_Moab" 191032b8ab6SVijay Mahadevan PetscErrorCode DMCreateLocalVector_Moab(DM dm,Vec *lvec) 192032b8ab6SVijay Mahadevan { 193032b8ab6SVijay Mahadevan PetscErrorCode ierr; 194032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 195032b8ab6SVijay Mahadevan 196032b8ab6SVijay Mahadevan PetscFunctionBegin; 197032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 198032b8ab6SVijay Mahadevan PetscValidPointer(lvec,2); 199bb8f3634SVijay Mahadevan ierr = DMMoab_CreateVector_Private(dm,PETSC_NULL,dmmoab->vlocal,PETSC_FALSE,PETSC_TRUE,lvec);CHKERRQ(ierr); 200032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 201032b8ab6SVijay Mahadevan } 202032b8ab6SVijay Mahadevan 203032b8ab6SVijay Mahadevan 204032b8ab6SVijay Mahadevan #undef __FUNCT__ 205032b8ab6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVecTag" 206032b8ab6SVijay Mahadevan /*@ 207032b8ab6SVijay Mahadevan DMMoabGetVecTag - Get the MOAB tag associated with this Vec 208032b8ab6SVijay Mahadevan 209032b8ab6SVijay Mahadevan Input Parameter: 210032b8ab6SVijay Mahadevan . vec - Vec being queried 211032b8ab6SVijay Mahadevan 212032b8ab6SVijay Mahadevan Output Parameter: 213032b8ab6SVijay Mahadevan . tag - Tag associated with this Vec 214032b8ab6SVijay Mahadevan 215032b8ab6SVijay Mahadevan Level: beginner 216032b8ab6SVijay Mahadevan 217032b8ab6SVijay Mahadevan .keywords: DMMoab, create 218032b8ab6SVijay Mahadevan @*/ 219032b8ab6SVijay Mahadevan PetscErrorCode DMMoabGetVecTag(Vec vec,moab::Tag *tag) 220032b8ab6SVijay Mahadevan { 221032b8ab6SVijay Mahadevan PetscContainer moabdata; 222032b8ab6SVijay Mahadevan Vec_MOAB *vmoab; 223032b8ab6SVijay Mahadevan PetscErrorCode ierr; 224032b8ab6SVijay Mahadevan 225032b8ab6SVijay Mahadevan PetscFunctionBegin; 226032b8ab6SVijay Mahadevan PetscValidPointer(tag,2); 227032b8ab6SVijay Mahadevan 228efd17f3eSVijay Mahadevan /* Get the MOAB private data */ 229032b8ab6SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 230032b8ab6SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**) &vmoab);CHKERRQ(ierr); 231032b8ab6SVijay Mahadevan 232032b8ab6SVijay Mahadevan *tag = vmoab->tag; 233032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 234032b8ab6SVijay Mahadevan } 235032b8ab6SVijay Mahadevan 236032b8ab6SVijay Mahadevan 237032b8ab6SVijay Mahadevan #undef __FUNCT__ 238032b8ab6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVecRange" 239032b8ab6SVijay Mahadevan /*@ 240032b8ab6SVijay Mahadevan DMMoabGetVecRange - Get the MOAB entities associated with this Vec 241032b8ab6SVijay Mahadevan 242032b8ab6SVijay Mahadevan Input Parameter: 243032b8ab6SVijay Mahadevan . vec - Vec being queried 244032b8ab6SVijay Mahadevan 245032b8ab6SVijay Mahadevan Output Parameter: 246032b8ab6SVijay Mahadevan . range - Entities associated with this Vec 247032b8ab6SVijay Mahadevan 248032b8ab6SVijay Mahadevan Level: beginner 249032b8ab6SVijay Mahadevan 250032b8ab6SVijay Mahadevan .keywords: DMMoab, create 251032b8ab6SVijay Mahadevan @*/ 252032b8ab6SVijay Mahadevan PetscErrorCode DMMoabGetVecRange(Vec vec,moab::Range *range) 253032b8ab6SVijay Mahadevan { 254032b8ab6SVijay Mahadevan PetscContainer moabdata; 255032b8ab6SVijay Mahadevan Vec_MOAB *vmoab; 256032b8ab6SVijay Mahadevan PetscErrorCode ierr; 257032b8ab6SVijay Mahadevan 258032b8ab6SVijay Mahadevan PetscFunctionBegin; 259032b8ab6SVijay Mahadevan PetscValidPointer(range,2); 260032b8ab6SVijay Mahadevan 261efd17f3eSVijay Mahadevan /* Get the MOAB private data handle */ 262032b8ab6SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 263032b8ab6SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**) &vmoab);CHKERRQ(ierr); 264032b8ab6SVijay Mahadevan 265032b8ab6SVijay Mahadevan *range = *vmoab->tag_range; 266032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 267032b8ab6SVijay Mahadevan } 268032b8ab6SVijay Mahadevan 269032b8ab6SVijay Mahadevan 270032b8ab6SVijay Mahadevan #undef __FUNCT__ 271032b8ab6SVijay Mahadevan #define __FUNCT__ "DMMoab_VecDuplicate" 272032b8ab6SVijay Mahadevan PetscErrorCode DMMoab_VecDuplicate(Vec x,Vec *y) 273032b8ab6SVijay Mahadevan { 274032b8ab6SVijay Mahadevan PetscErrorCode ierr; 275032b8ab6SVijay Mahadevan DM dm; 276032b8ab6SVijay Mahadevan PetscContainer moabdata; 277032b8ab6SVijay Mahadevan Vec_MOAB *vmoab; 278032b8ab6SVijay Mahadevan 279032b8ab6SVijay Mahadevan PetscFunctionBegin; 280032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(x,VEC_CLASSID,1); 281032b8ab6SVijay Mahadevan PetscValidPointer(y,2); 282032b8ab6SVijay Mahadevan 283efd17f3eSVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */ 284032b8ab6SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)x,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 285032b8ab6SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**)&vmoab);CHKERRQ(ierr); 286032b8ab6SVijay Mahadevan 287032b8ab6SVijay Mahadevan ierr = VecGetDM(x, &dm);CHKERRQ(ierr); 288032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 289032b8ab6SVijay Mahadevan 290bb8f3634SVijay Mahadevan ierr = DMMoab_CreateVector_Private(dm,PETSC_NULL,vmoab->tag_range,vmoab->is_global_vec,PETSC_TRUE,y);CHKERRQ(ierr); 291032b8ab6SVijay Mahadevan ierr = VecSetDM(*y, dm);CHKERRQ(ierr); 292032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 293032b8ab6SVijay Mahadevan } 294032b8ab6SVijay Mahadevan 295032b8ab6SVijay Mahadevan 296032b8ab6SVijay Mahadevan #undef __FUNCT__ 297032b8ab6SVijay Mahadevan #define __FUNCT__ "DMMoab_VecCreateTagName_Private" 298032b8ab6SVijay Mahadevan /* DMMoab_VecCreateTagName_Private 299032b8ab6SVijay Mahadevan * 300032b8ab6SVijay Mahadevan * Creates a unique tag name that will be shared across processes. If 301032b8ab6SVijay Mahadevan * pcomm is NULL, then this is a serial vector. A unique tag name 302032b8ab6SVijay Mahadevan * will be returned in tag_name in either case. 303032b8ab6SVijay Mahadevan * 304032b8ab6SVijay Mahadevan * The tag names have the format _PETSC_VEC_N where N is some integer. 305032b8ab6SVijay Mahadevan * 306032b8ab6SVijay Mahadevan * NOTE: The tag_name is allocated in this routine; The user needs to free 307032b8ab6SVijay Mahadevan * the character array. 308032b8ab6SVijay Mahadevan */ 309032b8ab6SVijay Mahadevan PetscErrorCode DMMoab_VecCreateTagName_Private(moab::ParallelComm *pcomm,char** tag_name) 310032b8ab6SVijay Mahadevan { 311032b8ab6SVijay Mahadevan moab::ErrorCode mberr; 312032b8ab6SVijay Mahadevan PetscErrorCode ierr; 313032b8ab6SVijay Mahadevan PetscInt n,global_n; 314032b8ab6SVijay Mahadevan moab::Tag indexTag; 315032b8ab6SVijay Mahadevan 316032b8ab6SVijay Mahadevan PetscFunctionBegin; 317032b8ab6SVijay Mahadevan const char* PVEC_PREFIX = "__PETSC_VEC_"; 318032b8ab6SVijay Mahadevan ierr = PetscMalloc(PETSC_MAX_PATH_LEN, tag_name);CHKERRQ(ierr); 319032b8ab6SVijay Mahadevan 320efd17f3eSVijay Mahadevan /* Check to see if there are any PETSc vectors defined */ 321032b8ab6SVijay Mahadevan moab::Interface *mbiface = pcomm->get_moab(); 322032b8ab6SVijay Mahadevan moab::EntityHandle rootset = mbiface->get_root_set(); 323032b8ab6SVijay Mahadevan 324efd17f3eSVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 325032b8ab6SVijay Mahadevan mberr = mbiface->tag_get_handle("__PETSC_VECS__",1,moab::MB_TYPE_INTEGER,indexTag, 326032b8ab6SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT,0);MBERRNM(mberr); 327032b8ab6SVijay Mahadevan mberr = mbiface->tag_get_data(indexTag, &rootset, 1, &n); 328032b8ab6SVijay Mahadevan if (mberr == moab::MB_TAG_NOT_FOUND) n=0; /* this is the first temporary vector */ 329032b8ab6SVijay Mahadevan else MBERRNM(mberr); 330032b8ab6SVijay Mahadevan 331032b8ab6SVijay Mahadevan /* increment the new value of n */ 332032b8ab6SVijay Mahadevan ++n; 333032b8ab6SVijay Mahadevan 334efd17f3eSVijay Mahadevan /* Make sure that n is consistent across all processes */ 335032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&n,&global_n,1,MPI_INT,MPI_MAX,pcomm->comm());CHKERRQ(ierr); 336032b8ab6SVijay Mahadevan 337efd17f3eSVijay Mahadevan /* Set the new name accordingly and return */ 338032b8ab6SVijay Mahadevan ierr = PetscSNPrintf(*tag_name, PETSC_MAX_PATH_LEN-1, "%s_%D", PVEC_PREFIX, global_n);CHKERRQ(ierr); 339032b8ab6SVijay Mahadevan mberr = mbiface->tag_set_data(indexTag, &rootset, 1, (const void*)&global_n);MBERRNM(mberr); 340032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 341032b8ab6SVijay Mahadevan } 342032b8ab6SVijay Mahadevan 343032b8ab6SVijay Mahadevan 344032b8ab6SVijay Mahadevan #undef __FUNCT__ 345032b8ab6SVijay Mahadevan #define __FUNCT__ "DMMoab_VecUserDestroy" 346032b8ab6SVijay Mahadevan PetscErrorCode DMMoab_VecUserDestroy(void *user) 347032b8ab6SVijay Mahadevan { 348efd17f3eSVijay Mahadevan Vec_MOAB *vmoab=(Vec_MOAB*)user; 349032b8ab6SVijay Mahadevan PetscErrorCode ierr; 350032b8ab6SVijay Mahadevan moab::ErrorCode merr; 351032b8ab6SVijay Mahadevan 352032b8ab6SVijay Mahadevan PetscFunctionBegin; 353032b8ab6SVijay Mahadevan if(vmoab->new_tag && vmoab->tag) { 354efd17f3eSVijay Mahadevan /* Tag was created via a call to VecDuplicate, delete the underlying tag in MOAB */ 355032b8ab6SVijay Mahadevan merr = vmoab->mbiface->tag_delete(vmoab->tag);MBERRNM(merr); 356032b8ab6SVijay Mahadevan } 357032b8ab6SVijay Mahadevan delete vmoab->tag_range; 358032b8ab6SVijay Mahadevan vmoab->tag = PETSC_NULL; 359032b8ab6SVijay Mahadevan vmoab->mbiface = PETSC_NULL; 360032b8ab6SVijay Mahadevan vmoab->pcomm = PETSC_NULL; 361032b8ab6SVijay Mahadevan ierr = PetscFree(vmoab);CHKERRQ(ierr); 362032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 363032b8ab6SVijay Mahadevan } 364032b8ab6SVijay Mahadevan 365db66d124SVijay Mahadevan #undef __FUNCT__ 366efd17f3eSVijay Mahadevan #define __FUNCT__ "DMMoabVecGetArray" 367efd17f3eSVijay Mahadevan /*@ 368efd17f3eSVijay Mahadevan DMMoabVecGetArray - Returns the writable direct access array to the local representation of MOAB tag data for the underlying vector using locally owned+ghosted range of entities 369efd17f3eSVijay Mahadevan 370efd17f3eSVijay Mahadevan Collective on MPI_Comm 371efd17f3eSVijay Mahadevan 372efd17f3eSVijay Mahadevan Input Parameter: 373efd17f3eSVijay Mahadevan . dm - The DMMoab object being set 374efd17f3eSVijay Mahadevan . vec - The Vector whose underlying data is requested 375efd17f3eSVijay Mahadevan 376efd17f3eSVijay Mahadevan Output Parameter: 377efd17f3eSVijay Mahadevan . array - The local data array 378efd17f3eSVijay Mahadevan 379efd17f3eSVijay Mahadevan Level: intermediate 380efd17f3eSVijay Mahadevan 381efd17f3eSVijay Mahadevan .keywords: MOAB, distributed array 382efd17f3eSVijay Mahadevan 383efd17f3eSVijay Mahadevan .seealso: DMMoabVecRestoreArray(), DMMoabVecGetArrayRead(), DMMoabVecRestoreArrayRead() 384efd17f3eSVijay Mahadevan @*/ 385efd17f3eSVijay Mahadevan PetscErrorCode DMMoabVecGetArray(DM dm,Vec vec,void* array) 386efd17f3eSVijay Mahadevan { 387a2eadca2SVijay Mahadevan DM_Moab *dmmoab; 388efd17f3eSVijay Mahadevan moab::ErrorCode merr; 389efd17f3eSVijay Mahadevan PetscErrorCode ierr; 390efd17f3eSVijay Mahadevan PetscInt count; 391efd17f3eSVijay Mahadevan moab::Tag vtag; 392efd17f3eSVijay Mahadevan PetscScalar **varray; 393*6d9eb265SVijay Mahadevan PetscContainer moabdata; 394*6d9eb265SVijay Mahadevan Vec_MOAB *vmoab,*xmoab; 395efd17f3eSVijay Mahadevan 396efd17f3eSVijay Mahadevan PetscFunctionBegin; 397efd17f3eSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 398efd17f3eSVijay Mahadevan PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 399a2eadca2SVijay Mahadevan PetscValidPointer(array,3); 400a2eadca2SVijay Mahadevan dmmoab=(DM_Moab*)dm->data; 401efd17f3eSVijay Mahadevan 402*6d9eb265SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */ 403*6d9eb265SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 404*6d9eb265SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**)&vmoab);CHKERRQ(ierr); 405efd17f3eSVijay Mahadevan 406efd17f3eSVijay Mahadevan /* Get the real scalar array handle */ 407efd17f3eSVijay Mahadevan varray = reinterpret_cast<PetscScalar**>(array); 408efd17f3eSVijay Mahadevan 409*6d9eb265SVijay Mahadevan /* get the local representation of the arrays from Vectors */ 410*6d9eb265SVijay Mahadevan ierr = DMGetLocalVector(dm,&vmoab->local);CHKERRQ(ierr); 411*6d9eb265SVijay Mahadevan ierr = DMGlobalToLocalBegin(dm,vec,INSERT_VALUES,vmoab->local);CHKERRQ(ierr); 412*6d9eb265SVijay Mahadevan ierr = DMGlobalToLocalEnd(dm,vec,INSERT_VALUES,vmoab->local);CHKERRQ(ierr); 413*6d9eb265SVijay Mahadevan 414*6d9eb265SVijay Mahadevan if (vmoab->is_native_vec) { 415*6d9eb265SVijay Mahadevan 416*6d9eb265SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */ 417*6d9eb265SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)vmoab->local,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 418*6d9eb265SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**)&xmoab);CHKERRQ(ierr); 419*6d9eb265SVijay Mahadevan 420*6d9eb265SVijay Mahadevan /* get the local representation of the arrays from Vectors */ 421*6d9eb265SVijay Mahadevan ierr = VecGhostGetLocalForm(vmoab->local,&xmoab->local);CHKERRQ(ierr); 422*6d9eb265SVijay Mahadevan ierr = VecGhostUpdateBegin(vmoab->local,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 423*6d9eb265SVijay Mahadevan ierr = VecGhostUpdateEnd(vmoab->local,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 424*6d9eb265SVijay Mahadevan 425*6d9eb265SVijay Mahadevan ierr = VecGetArray(xmoab->local, varray);CHKERRQ(ierr); 426*6d9eb265SVijay Mahadevan 427*6d9eb265SVijay Mahadevan } 428*6d9eb265SVijay Mahadevan else { 429*6d9eb265SVijay Mahadevan /* Get the MOAB private data */ 430*6d9eb265SVijay Mahadevan ierr = DMMoabGetVecTag(vec,&vtag);CHKERRQ(ierr); 431*6d9eb265SVijay Mahadevan 432a2eadca2SVijay Mahadevan /* exchange the data into ghost cells first */ 433a2eadca2SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(vtag,*dmmoab->vlocal);MBERRNM(merr); 434efd17f3eSVijay Mahadevan 435*6d9eb265SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*(dmmoab->nloc+dmmoab->nghost),varray);CHKERRQ(ierr); 436a2eadca2SVijay Mahadevan 437*6d9eb265SVijay Mahadevan /* Get the array data for local entities */ 438*6d9eb265SVijay Mahadevan merr = dmmoab->mbiface->tag_iterate(vtag,dmmoab->vlocal->begin(),dmmoab->vlocal->end(),count,reinterpret_cast<void*&>(*varray),false);MBERRNM(merr); 439*6d9eb265SVijay Mahadevan if (count!=(PetscInt)dmmoab->vlocal->size()) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between local vertices and tag partition for Vec. %D != %D.",count,dmmoab->vlocal->size()); 440*6d9eb265SVijay Mahadevan } 441efd17f3eSVijay Mahadevan PetscFunctionReturn(0); 442efd17f3eSVijay Mahadevan } 443efd17f3eSVijay Mahadevan 444efd17f3eSVijay Mahadevan 445efd17f3eSVijay Mahadevan #undef __FUNCT__ 446efd17f3eSVijay Mahadevan #define __FUNCT__ "DMMoabVecRestoreArray" 447efd17f3eSVijay Mahadevan /*@ 448efd17f3eSVijay Mahadevan DMMoabVecRestoreArray - Restores the writable direct access array obtained via DMMoabVecGetArray 449efd17f3eSVijay Mahadevan 450efd17f3eSVijay Mahadevan Collective on MPI_Comm 451efd17f3eSVijay Mahadevan 452efd17f3eSVijay Mahadevan Input Parameter: 453efd17f3eSVijay Mahadevan + dm - The DMMoab object being set 454efd17f3eSVijay Mahadevan . vec - The Vector whose underlying data is requested 455efd17f3eSVijay Mahadevan - array - The local data array 456efd17f3eSVijay Mahadevan 457efd17f3eSVijay Mahadevan Level: intermediate 458efd17f3eSVijay Mahadevan 459efd17f3eSVijay Mahadevan .keywords: MOAB, distributed array 460efd17f3eSVijay Mahadevan 461efd17f3eSVijay Mahadevan .seealso: DMMoabVecGetArray(), DMMoabVecGetArrayRead(), DMMoabVecRestoreArrayRead() 462efd17f3eSVijay Mahadevan @*/ 463*6d9eb265SVijay Mahadevan PetscErrorCode DMMoabVecRestoreArray(DM dm,Vec vec,void* array) 464efd17f3eSVijay Mahadevan { 465*6d9eb265SVijay Mahadevan DM_Moab *dmmoab; 466efd17f3eSVijay Mahadevan moab::ErrorCode merr; 467efd17f3eSVijay Mahadevan PetscErrorCode ierr; 468efd17f3eSVijay Mahadevan moab::Tag vtag; 469a2eadca2SVijay Mahadevan PetscScalar **varray; 470*6d9eb265SVijay Mahadevan PetscContainer moabdata; 471*6d9eb265SVijay Mahadevan Vec_MOAB *vmoab,*xmoab; 472efd17f3eSVijay Mahadevan 473efd17f3eSVijay Mahadevan PetscFunctionBegin; 474efd17f3eSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 475*6d9eb265SVijay Mahadevan PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 476a2eadca2SVijay Mahadevan PetscValidPointer(array,3); 477*6d9eb265SVijay Mahadevan dmmoab=(DM_Moab*)dm->data; 478efd17f3eSVijay Mahadevan 479*6d9eb265SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */ 480*6d9eb265SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 481*6d9eb265SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**)&vmoab);CHKERRQ(ierr); 482efd17f3eSVijay Mahadevan 483a2eadca2SVijay Mahadevan /* Get the real scalar array handle */ 484a2eadca2SVijay Mahadevan varray = reinterpret_cast<PetscScalar**>(array); 485*6d9eb265SVijay Mahadevan 486*6d9eb265SVijay Mahadevan if (vmoab->is_native_vec) { 487*6d9eb265SVijay Mahadevan 488*6d9eb265SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */ 489*6d9eb265SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)vmoab->local,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 490*6d9eb265SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**)&xmoab);CHKERRQ(ierr); 491*6d9eb265SVijay Mahadevan 492*6d9eb265SVijay Mahadevan /* get the local representation of the arrays from Vectors */ 493*6d9eb265SVijay Mahadevan ierr = VecRestoreArray(xmoab->local, varray);CHKERRQ(ierr); 494*6d9eb265SVijay Mahadevan ierr = VecGhostUpdateBegin(vmoab->local,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 495*6d9eb265SVijay Mahadevan ierr = VecGhostUpdateEnd(vmoab->local,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 496*6d9eb265SVijay Mahadevan ierr = VecGhostRestoreLocalForm(vmoab->local,&xmoab->local);CHKERRQ(ierr); 497*6d9eb265SVijay Mahadevan 498*6d9eb265SVijay Mahadevan } 499*6d9eb265SVijay Mahadevan else { 500*6d9eb265SVijay Mahadevan /* Get the MOAB private data */ 501*6d9eb265SVijay Mahadevan ierr = DMMoabGetVecTag(vec,&vtag);CHKERRQ(ierr); 502*6d9eb265SVijay Mahadevan 503*6d9eb265SVijay Mahadevan /* Get the real scalar array handle */ 504*6d9eb265SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(vtag,*dmmoab->vlocal,reinterpret_cast<void*&>(*varray));MBERRNM(merr); 505a2eadca2SVijay Mahadevan 506efd17f3eSVijay Mahadevan /* reduce the tags correctly -> should probably let the user choose how to reduce in the future 507a2eadca2SVijay Mahadevan For all FEM residual based assembly calculations, MPI_SUM should serve well */ 508*6d9eb265SVijay Mahadevan merr = dmmoab->pcomm->reduce_tags(vtag,MPI_SUM,*dmmoab->vlocal);MBERRV(dmmoab->mbiface,merr); 509*6d9eb265SVijay Mahadevan } 510*6d9eb265SVijay Mahadevan 511*6d9eb265SVijay Mahadevan /* restore local pieces */ 512*6d9eb265SVijay Mahadevan ierr = DMLocalToGlobalBegin(dm,vmoab->local,INSERT_VALUES,vec);CHKERRQ(ierr); 513*6d9eb265SVijay Mahadevan ierr = DMLocalToGlobalEnd(dm,vmoab->local,INSERT_VALUES,vec);CHKERRQ(ierr); 514*6d9eb265SVijay Mahadevan ierr = DMRestoreLocalVector(dm, &vmoab->local);CHKERRQ(ierr); 515efd17f3eSVijay Mahadevan PetscFunctionReturn(0); 516efd17f3eSVijay Mahadevan } 517efd17f3eSVijay Mahadevan 518efd17f3eSVijay Mahadevan #undef __FUNCT__ 519efd17f3eSVijay Mahadevan #define __FUNCT__ "DMMoabVecGetArrayRead" 520efd17f3eSVijay Mahadevan /*@ 521efd17f3eSVijay Mahadevan DMMoabVecGetArrayRead - Returns the read-only direct access array to the local representation of MOAB tag data for the underlying vector using locally owned+ghosted range of entities 522efd17f3eSVijay Mahadevan 523efd17f3eSVijay Mahadevan Collective on MPI_Comm 524efd17f3eSVijay Mahadevan 525efd17f3eSVijay Mahadevan Input Parameter: 526efd17f3eSVijay Mahadevan + dm - The DMMoab object being set 527efd17f3eSVijay Mahadevan . vec - The Vector whose underlying data is requested 528efd17f3eSVijay Mahadevan 529efd17f3eSVijay Mahadevan Output Parameter: 530efd17f3eSVijay Mahadevan . array - The local data array 531efd17f3eSVijay Mahadevan 532efd17f3eSVijay Mahadevan Level: intermediate 533efd17f3eSVijay Mahadevan 534efd17f3eSVijay Mahadevan .keywords: MOAB, distributed array 535efd17f3eSVijay Mahadevan 536efd17f3eSVijay Mahadevan .seealso: DMMoabVecRestoreArrayRead(), DMMoabVecGetArray(), DMMoabVecRestoreArray() 537efd17f3eSVijay Mahadevan @*/ 538efd17f3eSVijay Mahadevan PetscErrorCode DMMoabVecGetArrayRead(DM dm,Vec vec,void* array) 539efd17f3eSVijay Mahadevan { 540*6d9eb265SVijay Mahadevan DM_Moab *dmmoab; 541efd17f3eSVijay Mahadevan moab::ErrorCode merr; 542efd17f3eSVijay Mahadevan PetscErrorCode ierr; 543efd17f3eSVijay Mahadevan PetscInt count; 544efd17f3eSVijay Mahadevan moab::Tag vtag; 545efd17f3eSVijay Mahadevan PetscScalar **varray; 546*6d9eb265SVijay Mahadevan PetscScalar **marray; 547*6d9eb265SVijay Mahadevan PetscContainer moabdata; 548*6d9eb265SVijay Mahadevan Vec_MOAB *vmoab,*xmoab; 549efd17f3eSVijay Mahadevan 550efd17f3eSVijay Mahadevan PetscFunctionBegin; 551efd17f3eSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 552efd17f3eSVijay Mahadevan PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 553*6d9eb265SVijay Mahadevan PetscValidPointer(array,3); 554*6d9eb265SVijay Mahadevan dmmoab=(DM_Moab*)dm->data; 555efd17f3eSVijay Mahadevan 556*6d9eb265SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */ 557*6d9eb265SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 558*6d9eb265SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**)&vmoab);CHKERRQ(ierr); 559*6d9eb265SVijay Mahadevan 560*6d9eb265SVijay Mahadevan /* get the local representation of the arrays from Vectors */ 561*6d9eb265SVijay Mahadevan ierr = DMGetLocalVector(dm,&vmoab->local);CHKERRQ(ierr); 562*6d9eb265SVijay Mahadevan ierr = DMGlobalToLocalBegin(dm,vec,INSERT_VALUES,vmoab->local);CHKERRQ(ierr); 563*6d9eb265SVijay Mahadevan ierr = DMGlobalToLocalEnd(dm,vec,INSERT_VALUES,vmoab->local);CHKERRQ(ierr); 564*6d9eb265SVijay Mahadevan 565*6d9eb265SVijay Mahadevan if (vmoab->is_native_vec) { 566efd17f3eSVijay Mahadevan 567efd17f3eSVijay Mahadevan /* Get the real scalar array handle */ 568efd17f3eSVijay Mahadevan varray = reinterpret_cast<PetscScalar**>(array); 569efd17f3eSVijay Mahadevan 570*6d9eb265SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */ 571*6d9eb265SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)vmoab->local,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 572*6d9eb265SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**)&xmoab);CHKERRQ(ierr); 573*6d9eb265SVijay Mahadevan 574*6d9eb265SVijay Mahadevan /* get the local representation of the arrays from Vectors */ 575*6d9eb265SVijay Mahadevan ierr = VecGhostGetLocalForm(vmoab->local,&xmoab->local);CHKERRQ(ierr); 576*6d9eb265SVijay Mahadevan ierr = VecGhostUpdateBegin(vmoab->local,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 577*6d9eb265SVijay Mahadevan ierr = VecGhostUpdateEnd(vmoab->local,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 578*6d9eb265SVijay Mahadevan ierr = VecGetArray(xmoab->local, varray);CHKERRQ(ierr); 579*6d9eb265SVijay Mahadevan 580*6d9eb265SVijay Mahadevan } 581*6d9eb265SVijay Mahadevan else { 582*6d9eb265SVijay Mahadevan /* Get the MOAB private data */ 583*6d9eb265SVijay Mahadevan ierr = DMMoabGetVecTag(vec,&vtag);CHKERRQ(ierr); 584*6d9eb265SVijay Mahadevan 585*6d9eb265SVijay Mahadevan /* Get the real scalar array handle */ 586*6d9eb265SVijay Mahadevan marray = reinterpret_cast<PetscScalar**>(array); 587*6d9eb265SVijay Mahadevan 588a2eadca2SVijay Mahadevan /* exchange the data into ghost cells first */ 589*6d9eb265SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(vtag,*dmmoab->vlocal);MBERRNM(merr); 590a2eadca2SVijay Mahadevan 591efd17f3eSVijay Mahadevan /* Get the array data for local entities */ 592*6d9eb265SVijay Mahadevan merr = dmmoab->mbiface->tag_iterate(vtag,dmmoab->vlocal->begin(),dmmoab->vlocal->end(),count,reinterpret_cast<void*&>(*marray),true);MBERRNM(merr); 593*6d9eb265SVijay Mahadevan if (count!=(PetscInt)dmmoab->vlocal->size()) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between local vertices and tag partition for Vec. %D != %D.",count,dmmoab->vlocal->size()); 594*6d9eb265SVijay Mahadevan } 595efd17f3eSVijay Mahadevan PetscFunctionReturn(0); 596*6d9eb265SVijay Mahadevan 597efd17f3eSVijay Mahadevan } 598efd17f3eSVijay Mahadevan 599efd17f3eSVijay Mahadevan 600efd17f3eSVijay Mahadevan #undef __FUNCT__ 601efd17f3eSVijay Mahadevan #define __FUNCT__ "DMMoabVecRestoreArrayRead" 602efd17f3eSVijay Mahadevan /*@ 603efd17f3eSVijay Mahadevan DMMoabVecRestoreArray - Restores the read-only direct access array obtained via DMMoabVecGetArray 604efd17f3eSVijay Mahadevan 605efd17f3eSVijay Mahadevan Collective on MPI_Comm 606efd17f3eSVijay Mahadevan 607efd17f3eSVijay Mahadevan Input Parameter: 608efd17f3eSVijay Mahadevan + dm - The DMMoab object being set 609efd17f3eSVijay Mahadevan . vec - The Vector whose underlying data is requested 610efd17f3eSVijay Mahadevan - array - The local data array 611efd17f3eSVijay Mahadevan 612efd17f3eSVijay Mahadevan Level: intermediate 613efd17f3eSVijay Mahadevan 614efd17f3eSVijay Mahadevan .keywords: MOAB, distributed array 615efd17f3eSVijay Mahadevan 616efd17f3eSVijay Mahadevan .seealso: DMMoabVecGetArrayRead(), DMMoabVecGetArray(), DMMoabVecRestoreArray() 617efd17f3eSVijay Mahadevan @*/ 618*6d9eb265SVijay Mahadevan PetscErrorCode DMMoabVecRestoreArrayRead(DM dm,Vec vec,void* array) 619efd17f3eSVijay Mahadevan { 620*6d9eb265SVijay Mahadevan PetscErrorCode ierr; 621*6d9eb265SVijay Mahadevan PetscScalar **varray; 622*6d9eb265SVijay Mahadevan PetscContainer moabdata; 623*6d9eb265SVijay Mahadevan Vec_MOAB *vmoab,*xmoab; 624*6d9eb265SVijay Mahadevan 625efd17f3eSVijay Mahadevan PetscFunctionBegin; 626*6d9eb265SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 627*6d9eb265SVijay Mahadevan PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 628*6d9eb265SVijay Mahadevan PetscValidPointer(array,3); 629*6d9eb265SVijay Mahadevan 630*6d9eb265SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */ 631*6d9eb265SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)vec,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 632*6d9eb265SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**)&vmoab);CHKERRQ(ierr); 633*6d9eb265SVijay Mahadevan 634*6d9eb265SVijay Mahadevan if (vmoab->is_native_vec) { 635*6d9eb265SVijay Mahadevan 636*6d9eb265SVijay Mahadevan /* Get the real scalar array handle */ 637*6d9eb265SVijay Mahadevan varray = reinterpret_cast<PetscScalar**>(array); 638*6d9eb265SVijay Mahadevan 639*6d9eb265SVijay Mahadevan /* Get the Vec_MOAB struct for the original vector */ 640*6d9eb265SVijay Mahadevan ierr = PetscObjectQuery((PetscObject)vmoab->local,"MOABData", (PetscObject*) &moabdata);CHKERRQ(ierr); 641*6d9eb265SVijay Mahadevan ierr = PetscContainerGetPointer(moabdata, (void**)&xmoab);CHKERRQ(ierr); 642*6d9eb265SVijay Mahadevan 643*6d9eb265SVijay Mahadevan /* restore the local representation of the arrays from Vectors */ 644*6d9eb265SVijay Mahadevan ierr = VecRestoreArray(xmoab->local, varray);CHKERRQ(ierr); 645*6d9eb265SVijay Mahadevan ierr = VecGhostRestoreLocalForm(vmoab->local,&xmoab->local);CHKERRQ(ierr); 646*6d9eb265SVijay Mahadevan 647*6d9eb265SVijay Mahadevan } 648*6d9eb265SVijay Mahadevan else { 649efd17f3eSVijay Mahadevan /* Nothing to do -> do not free the array memory obtained from tag_iterate */ 650*6d9eb265SVijay Mahadevan } 651*6d9eb265SVijay Mahadevan /* restore local pieces */ 652*6d9eb265SVijay Mahadevan ierr = DMRestoreLocalVector(dm, &vmoab->local);CHKERRQ(ierr); 653efd17f3eSVijay Mahadevan PetscFunctionReturn(0); 654*6d9eb265SVijay Mahadevan 655efd17f3eSVijay Mahadevan } 656efd17f3eSVijay Mahadevan 657efd17f3eSVijay Mahadevan 658efd17f3eSVijay Mahadevan #undef __FUNCT__ 659db66d124SVijay Mahadevan #define __FUNCT__ "DMGlobalToLocalBegin_Moab" 660db66d124SVijay Mahadevan PetscErrorCode DMGlobalToLocalBegin_Moab(DM dm,Vec g,InsertMode mode,Vec l) 661db66d124SVijay Mahadevan { 662db66d124SVijay Mahadevan PetscErrorCode ierr; 663db66d124SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 664db66d124SVijay Mahadevan 665db66d124SVijay Mahadevan PetscFunctionBegin; 666*6d9eb265SVijay Mahadevan ierr = VecScatterBegin(dmmoab->ltog_sendrecv,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr); 667db66d124SVijay Mahadevan PetscFunctionReturn(0); 668db66d124SVijay Mahadevan } 669db66d124SVijay Mahadevan 670db66d124SVijay Mahadevan 671db66d124SVijay Mahadevan #undef __FUNCT__ 672db66d124SVijay Mahadevan #define __FUNCT__ "DMGlobalToLocalEnd_Moab" 673db66d124SVijay Mahadevan PetscErrorCode DMGlobalToLocalEnd_Moab(DM dm,Vec g,InsertMode mode,Vec l) 674db66d124SVijay Mahadevan { 675db66d124SVijay Mahadevan PetscErrorCode ierr; 676db66d124SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 677db66d124SVijay Mahadevan 678db66d124SVijay Mahadevan PetscFunctionBegin; 679*6d9eb265SVijay Mahadevan ierr = VecScatterEnd(dmmoab->ltog_sendrecv,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr); 680db66d124SVijay Mahadevan PetscFunctionReturn(0); 681db66d124SVijay Mahadevan } 682db66d124SVijay Mahadevan 683db66d124SVijay Mahadevan 684db66d124SVijay Mahadevan #undef __FUNCT__ 685db66d124SVijay Mahadevan #define __FUNCT__ "DMLocalToGlobalBegin_Moab" 686db66d124SVijay Mahadevan PetscErrorCode DMLocalToGlobalBegin_Moab(DM dm,Vec l,InsertMode mode,Vec g) 687db66d124SVijay Mahadevan { 688db66d124SVijay Mahadevan PetscErrorCode ierr; 689db66d124SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 690db66d124SVijay Mahadevan 691db66d124SVijay Mahadevan PetscFunctionBegin; 692*6d9eb265SVijay Mahadevan ierr = VecScatterBegin(dmmoab->ltog_sendrecv,l,g,mode,SCATTER_FORWARD);CHKERRQ(ierr); 693db66d124SVijay Mahadevan PetscFunctionReturn(0); 694db66d124SVijay Mahadevan } 695db66d124SVijay Mahadevan 696db66d124SVijay Mahadevan 697db66d124SVijay Mahadevan #undef __FUNCT__ 698db66d124SVijay Mahadevan #define __FUNCT__ "DMLocalToGlobalEnd_Moab" 699db66d124SVijay Mahadevan PetscErrorCode DMLocalToGlobalEnd_Moab(DM dm,Vec l,InsertMode mode,Vec g) 700db66d124SVijay Mahadevan { 701db66d124SVijay Mahadevan PetscErrorCode ierr; 702db66d124SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 703db66d124SVijay Mahadevan 704db66d124SVijay Mahadevan PetscFunctionBegin; 705*6d9eb265SVijay Mahadevan ierr = VecScatterEnd(dmmoab->ltog_sendrecv,l,g,mode,SCATTER_FORWARD);CHKERRQ(ierr); 706db66d124SVijay Mahadevan PetscFunctionReturn(0); 707db66d124SVijay Mahadevan } 708db66d124SVijay Mahadevan 709db66d124SVijay Mahadevan 710