xref: /petsc/src/dm/impls/moab/dmmbvec.cxx (revision 6d9eb265be6640e8ae26236498f33716bac3fa23)
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,&ltogb);
131bb8f3634SVijay Mahadevan     ierr = VecSetLocalToGlobalMappingBlock(*vec,ltogb);CHKERRQ(ierr);
132bb8f3634SVijay Mahadevan     ierr = ISLocalToGlobalMappingDestroy(&ltogb);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