xref: /petsc/src/dm/impls/moab/dmmbmg.cxx (revision 64e1c140f280b9f14e7e1bfe948bce0ef936fcec)
1b117cd09SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
2b117cd09SVijay Mahadevan 
3b117cd09SVijay Mahadevan #include <petscdmmoab.h>
4b117cd09SVijay Mahadevan #include <MBTagConventions.hpp>
5b117cd09SVijay Mahadevan #include <moab/NestedRefine.hpp>
6b117cd09SVijay Mahadevan 
7b117cd09SVijay Mahadevan #undef __FUNCT__
8b117cd09SVijay Mahadevan #define __FUNCT__ "DMMoabGenerateHierarchy"
9b117cd09SVijay Mahadevan /*@
10b117cd09SVijay Mahadevan   DMMoabGenerateHierarchy - Generate a multi-level uniform refinement hierarchy
11b117cd09SVijay Mahadevan   by succesively refining a coarse mesh, already defined in the DM object
12b117cd09SVijay Mahadevan   provided by the user.
13b117cd09SVijay Mahadevan 
14b117cd09SVijay Mahadevan   Collective on MPI_Comm
15b117cd09SVijay Mahadevan 
16b117cd09SVijay Mahadevan   Input Parameter:
17b117cd09SVijay Mahadevan + dmb  - The DMMoab object
18b117cd09SVijay Mahadevan 
19b117cd09SVijay Mahadevan   Output Parameter:
20b117cd09SVijay Mahadevan + nlevels   - The number of levels of refinement needed to generate the hierarchy
21b117cd09SVijay Mahadevan . ldegrees  - The degree of refinement at each level in the hierarchy
22b117cd09SVijay Mahadevan 
23b117cd09SVijay Mahadevan   Level: beginner
24b117cd09SVijay Mahadevan 
25b117cd09SVijay Mahadevan .keywords: DMMoab, create, refinement
26b117cd09SVijay Mahadevan @*/
27b117cd09SVijay Mahadevan PetscErrorCode DMMoabGenerateHierarchy(DM dm,PetscInt nlevels,PetscInt *ldegrees)
28b117cd09SVijay Mahadevan {
29b117cd09SVijay Mahadevan   DM_Moab        *dmmoab;
30b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
31b117cd09SVijay Mahadevan   moab::ErrorCode merr;
32b117cd09SVijay Mahadevan   PetscInt *pdegrees,i;
33e882eb38SVijay Mahadevan   std::vector<moab::EntityHandle> hsets;
34b117cd09SVijay Mahadevan 
35b117cd09SVijay Mahadevan   PetscFunctionBegin;
36b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
37b117cd09SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
38b117cd09SVijay Mahadevan 
39b117cd09SVijay Mahadevan   if (!ldegrees) {
40b117cd09SVijay Mahadevan     ierr = PetscMalloc1(nlevels,&pdegrees);CHKERRQ(ierr);
41b117cd09SVijay Mahadevan     for (i=0; i<nlevels; i++) pdegrees[i]=2; /* default = Degree 2 refinement */
42b117cd09SVijay Mahadevan   }
43b117cd09SVijay Mahadevan   else pdegrees=ldegrees;
44b117cd09SVijay Mahadevan 
45b117cd09SVijay Mahadevan   /* initialize set level refinement data for hierarchy */
46b117cd09SVijay Mahadevan   dmmoab->nhlevels=nlevels;
47b117cd09SVijay Mahadevan 
48b117cd09SVijay Mahadevan   /* Instantiate the nested refinement class */
493f1c6e43SVijay Mahadevan   dmmoab->hierarchy = new moab::NestedRefine(dynamic_cast<moab::Core*>(dmmoab->mbiface), dmmoab->pcomm, dmmoab->fileset);
50b117cd09SVijay Mahadevan 
51e882eb38SVijay Mahadevan   ierr = PetscMalloc1(nlevels+1,&dmmoab->hsets);CHKERRQ(ierr);
52*64e1c140SVijay Mahadevan   hsets.resize(nlevels+1);
53e882eb38SVijay Mahadevan 
54b117cd09SVijay Mahadevan   /* generate the mesh hierarchy */
55*64e1c140SVijay Mahadevan   merr = dmmoab->hierarchy->generate_mesh_hierarchy(nlevels, pdegrees, hsets);MBERRNM(merr);
56e882eb38SVijay Mahadevan 
57*64e1c140SVijay Mahadevan   merr = dmmoab->hierarchy->exchange_ghosts(hsets, dmmoab->nghostrings);MBERRNM(merr);
5849d66b22SVijay Mahadevan 
59*64e1c140SVijay Mahadevan   /* copy the mesh sets for nested refinement hierarchy */
60*64e1c140SVijay Mahadevan   for (i=0; i<=nlevels; i++)
6149d66b22SVijay Mahadevan       dmmoab->hsets[i]=hsets[i];
62*64e1c140SVijay Mahadevan 
63*64e1c140SVijay Mahadevan   if (dmmoab->nghostrings && false) {
64*64e1c140SVijay Mahadevan     PetscInfo2(NULL, "Exchanging ghost cells (dim %d) with %d rings\n",dmmoab->dim,dmmoab->nghostrings);
65*64e1c140SVijay Mahadevan     // for (i=1; i<=nlevels; i++) {
66*64e1c140SVijay Mahadevan     //   /* resolve the shared entities by exchanging information to adjacent processors */
67*64e1c140SVijay Mahadevan     //   merr = dmmoab->pcomm->exchange_ghost_cells(dmmoab->dim,0,dmmoab->nghostrings,dmmoab->dim,true,false,&hsets[i]);MBERRV(dmmoab->mbiface,merr);
68*64e1c140SVijay Mahadevan     // }
69*64e1c140SVijay Mahadevan     merr = dmmoab->pcomm->exchange_ghost_cells(dmmoab->dim,0,dmmoab->nghostrings,dmmoab->dim,true,false);MBERRV(dmmoab->mbiface,merr);
70*64e1c140SVijay Mahadevan 
71*64e1c140SVijay Mahadevan     // moab::Range vtxall, elmsall;
72*64e1c140SVijay Mahadevan     // merr = dmmoab->mbiface->get_entities_by_dimension(0, 0, vtxall, true);MBERRNM(merr);
73*64e1c140SVijay Mahadevan     // merr = dmmoab->mbiface->get_entities_by_dimension(0, dmmoab->dim, elmsall, true);MBERRNM(merr);
74*64e1c140SVijay Mahadevan 
7549d66b22SVijay Mahadevan   }
76b117cd09SVijay Mahadevan 
77*64e1c140SVijay Mahadevan   hsets.clear();
78b117cd09SVijay Mahadevan   if (!ldegrees) {
79b117cd09SVijay Mahadevan     ierr = PetscFree(pdegrees);CHKERRQ(ierr);
80b117cd09SVijay Mahadevan   }
81b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
82b117cd09SVijay Mahadevan }
83b117cd09SVijay Mahadevan 
84b117cd09SVijay Mahadevan #undef __FUNCT__
85b117cd09SVijay Mahadevan #define __FUNCT__ "DMRefineHierarchy_Moab"
86b117cd09SVijay Mahadevan /*@
87e882eb38SVijay Mahadevan   DMRefineHierarchy_Moab - Generate a multi-level DM hierarchy
88e882eb38SVijay Mahadevan   by succesively refining a coarse mesh.
89b117cd09SVijay Mahadevan 
90b117cd09SVijay Mahadevan   Collective on MPI_Comm
91b117cd09SVijay Mahadevan 
92b117cd09SVijay Mahadevan   Input Parameter:
93e882eb38SVijay Mahadevan + dm  - The DMMoab object
94b117cd09SVijay Mahadevan 
95b117cd09SVijay Mahadevan   Output Parameter:
96e882eb38SVijay Mahadevan + nlevels   - The number of levels of refinement needed to generate the hierarchy
97e882eb38SVijay Mahadevan . dmf  - The DM objects after successive refinement of the hierarchy
98b117cd09SVijay Mahadevan 
99b117cd09SVijay Mahadevan   Level: beginner
100b117cd09SVijay Mahadevan 
101e882eb38SVijay Mahadevan .keywords: DMMoab, generate, refinement
102b117cd09SVijay Mahadevan @*/
103b117cd09SVijay Mahadevan PetscErrorCode  DMRefineHierarchy_Moab(DM dm,PetscInt nlevels,DM dmf[])
104b117cd09SVijay Mahadevan {
105b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
106b117cd09SVijay Mahadevan   PetscInt        i;
107b117cd09SVijay Mahadevan 
108b117cd09SVijay Mahadevan   PetscFunctionBegin;
109b117cd09SVijay Mahadevan 
110e882eb38SVijay Mahadevan   ierr = DMRefine(dm,PetscObjectComm((PetscObject)dm),&dmf[0]);CHKERRQ(ierr);
111e882eb38SVijay Mahadevan   for (i=1; i<nlevels; i++) {
112e882eb38SVijay Mahadevan     ierr = DMRefine(dmf[i-1],PetscObjectComm((PetscObject)dm),&dmf[i]);CHKERRQ(ierr);
113b117cd09SVijay Mahadevan   }
114b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
115b117cd09SVijay Mahadevan }
116b117cd09SVijay Mahadevan 
117b117cd09SVijay Mahadevan #undef __FUNCT__
118b117cd09SVijay Mahadevan #define __FUNCT__ "DMCoarsenHierarchy_Moab"
119b117cd09SVijay Mahadevan /*@
120e882eb38SVijay Mahadevan   DMCoarsenHierarchy_Moab - Generate a multi-level DM hierarchy
121e882eb38SVijay Mahadevan   by succesively coarsening a refined mesh.
122b117cd09SVijay Mahadevan 
123b117cd09SVijay Mahadevan   Collective on MPI_Comm
124b117cd09SVijay Mahadevan 
125b117cd09SVijay Mahadevan   Input Parameter:
126e882eb38SVijay Mahadevan + dm  - The DMMoab object
127b117cd09SVijay Mahadevan 
128b117cd09SVijay Mahadevan   Output Parameter:
129e882eb38SVijay Mahadevan + nlevels   - The number of levels of refinement needed to generate the hierarchy
130e882eb38SVijay Mahadevan . dmc  - The DM objects after successive coarsening of the hierarchy
131b117cd09SVijay Mahadevan 
132b117cd09SVijay Mahadevan   Level: beginner
133b117cd09SVijay Mahadevan 
134e882eb38SVijay Mahadevan .keywords: DMMoab, generate, coarsening
135b117cd09SVijay Mahadevan @*/
136b117cd09SVijay Mahadevan PetscErrorCode DMCoarsenHierarchy_Moab(DM dm,PetscInt nlevels,DM dmc[])
137b117cd09SVijay Mahadevan {
138b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
139b117cd09SVijay Mahadevan   PetscInt        i;
140b117cd09SVijay Mahadevan 
141b117cd09SVijay Mahadevan   PetscFunctionBegin;
142b117cd09SVijay Mahadevan 
143e882eb38SVijay Mahadevan   ierr = DMCoarsen(dm,PetscObjectComm((PetscObject)dm),&dmc[0]);CHKERRQ(ierr);
144e882eb38SVijay Mahadevan   for (i=1; i<nlevels; i++) {
145e882eb38SVijay Mahadevan     ierr = DMCoarsen(dmc[i-1],PetscObjectComm((PetscObject)dm),&dmc[i]);CHKERRQ(ierr);
146b117cd09SVijay Mahadevan   }
147b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
148b117cd09SVijay Mahadevan }
149b117cd09SVijay Mahadevan 
150b117cd09SVijay Mahadevan 
151b117cd09SVijay Mahadevan #undef __FUNCT__
152b117cd09SVijay Mahadevan #define __FUNCT__ "DMCreateInterpolation_Moab"
153b117cd09SVijay Mahadevan /*@
154e882eb38SVijay Mahadevan   DMCreateInterpolation_Moab - Generate the interpolation operators to transform
155e882eb38SVijay Mahadevan   operators (matrices, vectors) from parent level to child level as defined by
156e882eb38SVijay Mahadevan   the DM inputs provided by the user.
157b117cd09SVijay Mahadevan 
158b117cd09SVijay Mahadevan   Collective on MPI_Comm
159b117cd09SVijay Mahadevan 
160b117cd09SVijay Mahadevan   Input Parameter:
161e882eb38SVijay Mahadevan + dm1  - The DMMoab object
162e882eb38SVijay Mahadevan - dm2  - the second, finer DMMoab object
163b117cd09SVijay Mahadevan 
164b117cd09SVijay Mahadevan   Output Parameter:
165e882eb38SVijay Mahadevan + interpl  - The interpolation operator for transferring data between the levels
166e882eb38SVijay Mahadevan - vec      - The scaling vector (optional)
167b117cd09SVijay Mahadevan 
168e882eb38SVijay Mahadevan   Level: developer
169b117cd09SVijay Mahadevan 
170b117cd09SVijay Mahadevan .keywords: DMMoab, create, refinement
171b117cd09SVijay Mahadevan @*/
172b117cd09SVijay Mahadevan PetscErrorCode DMCreateInterpolation_Moab(DM dm1,DM dm2,Mat* interpl,Vec* vec)
173b117cd09SVijay Mahadevan {
174b117cd09SVijay Mahadevan   DM_Moab         *dmb1, *dmb2;
175b117cd09SVijay Mahadevan   PetscErrorCode   ierr;
176b117cd09SVijay Mahadevan   moab::ErrorCode  merr;
177e882eb38SVijay Mahadevan   PetscInt         dim;
1783f1c6e43SVijay Mahadevan   PetscReal        factor;
1793f1c6e43SVijay Mahadevan   PetscBool        eonbnd;
180ce27a4eeSVijay Mahadevan   PetscInt         innz, *nnz, ionz, *onz;
18149d66b22SVijay Mahadevan   PetscInt         nlsiz1, nlsiz2, nlghsiz1, nlghsiz2, ngsiz1, ngsiz2;
182b117cd09SVijay Mahadevan   std::vector<int> bndrows;
1833f1c6e43SVijay Mahadevan   std::vector<PetscBool> dbdry;
184b117cd09SVijay Mahadevan 
185b117cd09SVijay Mahadevan   PetscFunctionBegin;
186b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm1,DM_CLASSID,1);
187b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm2,DM_CLASSID,2);
188b117cd09SVijay Mahadevan   dmb1 = (DM_Moab*)(dm1)->data;
189b117cd09SVijay Mahadevan   dmb2 = (DM_Moab*)(dm2)->data;
19049d66b22SVijay Mahadevan   nlsiz1 = dmb1->nloc*dmb1->numFields;
191941e0cffSVijay Mahadevan   nlsiz2 = dmb2->nloc*dmb2->numFields;
19249d66b22SVijay Mahadevan   ngsiz1 = dmb1->n*dmb1->numFields;
193941e0cffSVijay Mahadevan   ngsiz2 = dmb2->n*dmb2->numFields;
19449d66b22SVijay Mahadevan   nlghsiz1 = (dmb1->nloc+dmb1->nghost)*dmb1->numFields;
19549d66b22SVijay Mahadevan   nlghsiz2 = (dmb2->nloc+dmb2->nghost)*dmb2->numFields;
196b117cd09SVijay Mahadevan 
197*64e1c140SVijay Mahadevan   int rank = dmb1->pcomm->rank();
1983f1c6e43SVijay Mahadevan 
199*64e1c140SVijay Mahadevan   PetscInfo4(dm1,"Creating interpolation matrix %D X %D to apply transformation between levels %D -> %D.\n",ngsiz2,ngsiz1,dmb1->hlevel,dmb2->hlevel);
200b117cd09SVijay Mahadevan 
201*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%d] Local matrix: %D X %D\n", rank, nlsiz2, nlsiz1);
202b117cd09SVijay Mahadevan 
203941e0cffSVijay Mahadevan   /* allocate the nnz, onz arrays based on block size and local nodes */
20449d66b22SVijay Mahadevan   ierr = PetscCalloc2(nlghsiz2,&nnz,nlghsiz2,&onz);CHKERRQ(ierr);
205941e0cffSVijay Mahadevan 
206*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%d] Coarse Local elements: %D, vertices: %D\n", rank, dmb1->elocal->size(), dmb1->vlocal->size());
207*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%d] Fine   Local elements: %D, vertices: %D\n", rank, dmb2->elocal->size(), dmb2->vlocal->size());
208*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%d] Sequence Start: %D, End: %D\n", rank, dmb2->seqstart, dmb2->seqend);
209*64e1c140SVijay Mahadevan 
210941e0cffSVijay Mahadevan   /* Loop through the local elements and compute the relation between the current parent and the refined_level. */
211941e0cffSVijay Mahadevan   for(moab::Range::iterator iter = dmb1->elocal->begin(); iter!= dmb1->elocal->end(); iter++) {
212941e0cffSVijay Mahadevan 
213941e0cffSVijay Mahadevan     const moab::EntityHandle ehandle = *iter;
214941e0cffSVijay Mahadevan     std::vector<moab::EntityHandle> children;
215941e0cffSVijay Mahadevan     std::vector<moab::EntityHandle> connp, connc;
216941e0cffSVijay Mahadevan 
217941e0cffSVijay Mahadevan     /* Get the relation between the current (coarse) parent and its corresponding (finer) children elements */
218941e0cffSVijay Mahadevan     merr = dmb1->hierarchy->parent_to_child(ehandle, dmb1->hlevel, dmb2->hlevel, children);MBERRNM(merr);
219941e0cffSVijay Mahadevan 
220941e0cffSVijay Mahadevan     /* Get connectivity and coordinates of the parent vertices */
221941e0cffSVijay Mahadevan     merr = dmb1->hierarchy->get_connectivity(ehandle, dmb1->hlevel, connp);MBERRNM(merr);
222941e0cffSVijay Mahadevan     for (unsigned ic=0; ic < children.size(); ic++) {
223941e0cffSVijay Mahadevan       std::vector<moab::EntityHandle> tconnc;
224*64e1c140SVijay Mahadevan       /* Get handles of the parent vertices in canonical order and intersect */
225941e0cffSVijay Mahadevan       merr = dmb2->hierarchy->get_connectivity(children[ic], dmb2->hlevel, tconnc);MBERRNM(merr);
226941e0cffSVijay Mahadevan       for (unsigned tc=0; tc<tconnc.size(); tc++) {
227941e0cffSVijay Mahadevan         if (std::find(connc.begin(), connc.end(), tconnc[tc]) == connc.end())
228941e0cffSVijay Mahadevan           connc.push_back(tconnc[tc]);
229941e0cffSVijay Mahadevan       }
230941e0cffSVijay Mahadevan     }
231*64e1c140SVijay Mahadevan     //PetscPrintf(PETSC_COMM_SELF, "[%d] EntityHandle %d, children = %d, total intersection = %d\n", rank, ehandle, children.size(), connc.size());
232941e0cffSVijay Mahadevan 
233941e0cffSVijay Mahadevan     std::vector<int> dofsp(connp.size()), dofsc(connc.size());
234941e0cffSVijay Mahadevan     /* TODO: specific to scalar system - use GetDofs */
235941e0cffSVijay Mahadevan     //ierr = DMMoabGetFieldDofs(dm1, connp.size(), &connp[0], 0, &dofsp[0]);CHKERRQ(ierr);
23649d66b22SVijay Mahadevan     ierr = DMMoabGetFieldDofsLocal(dm2, connc.size(), &connc[0], 0, &dofsc[0]);CHKERRQ(ierr);
237941e0cffSVijay Mahadevan 
238*64e1c140SVijay Mahadevan     //PetscPrintf(PETSC_COMM_SELF, "[%d] EntityHandle %d, dofs [4] = %d, %d, %d, %d\n", rank, ehandle, dofsc[0], dofsc[1], dofsc[2], dofsc[3]);
239*64e1c140SVijay Mahadevan     // if (rank == 1) {
240*64e1c140SVijay Mahadevan     //   for (unsigned tp=0;tp<connc.size(); tp++)
241*64e1c140SVijay Mahadevan     //     PetscPrintf(PETSC_COMM_SELF, "[%d] EntityHandle %d \t %d  -- dofs [%d] = %d, %d\n", rank, ehandle, connc[tp]-dmb2->seqstart, tp, dmb2->gidmap[(PetscInt)connc[tp]-dmb2->seqstart], dofsc[tp]);
242*64e1c140SVijay Mahadevan     // }
243941e0cffSVijay Mahadevan     for (unsigned tp=0;tp<connp.size(); tp++) {
244941e0cffSVijay Mahadevan       // ierr = MatSetValues(*interpl, connc.size(), &dofsc[0], 1, &dofsp[i], &values_phi[0], ADD_VALUES);CHKERRQ(ierr);
245941e0cffSVijay Mahadevan       if (dmb1->vowned->find(connp[tp]) != dmb1->vowned->end()) {
246*64e1c140SVijay Mahadevan         for (unsigned tc=0;tc<connc.size(); tc++) {
247*64e1c140SVijay Mahadevan           nnz[dofsc[tc]]++;
248*64e1c140SVijay Mahadevan           //PetscPrintf(PETSC_COMM_SELF, "[%d] Found nnz coupling for %D = %d\n", rank, connp[tp], dofsc[tc]);
249*64e1c140SVijay Mahadevan         }
250941e0cffSVijay Mahadevan       }
251941e0cffSVijay Mahadevan       else if (dmb1->vghost->find(connp[tp]) != dmb1->vghost->end()) {
252*64e1c140SVijay Mahadevan         for (unsigned tc=0;tc<connc.size(); tc++) {
253*64e1c140SVijay Mahadevan           onz[dofsc[tc]]++;
254*64e1c140SVijay Mahadevan           //PetscPrintf(PETSC_COMM_SELF, "[%d] Found onz coupling for %D = %d\n", rank, connp[tp], dofsc[tc]);
255941e0cffSVijay Mahadevan         }
256941e0cffSVijay Mahadevan       }
257*64e1c140SVijay Mahadevan       else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Invalid entity in parent level %D\n", connc[tp]);
258*64e1c140SVijay Mahadevan     }
259*64e1c140SVijay Mahadevan     for(unsigned tc = 0; tc < connc.size(); tc++) {
260941e0cffSVijay Mahadevan       if (dmb2->vowned->find(connc[tc]) != dmb2->vowned->end()) nnz[dofsc[tc]]++;
261941e0cffSVijay Mahadevan       else if (dmb2->vghost->find(connc[tc]) != dmb2->vghost->end()) onz[dofsc[tc]]++;
262941e0cffSVijay Mahadevan       else SETERRQ1(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Invalid entity in child level %D\n", connc[tc]);
26349d66b22SVijay Mahadevan     }
264941e0cffSVijay Mahadevan   }
265941e0cffSVijay Mahadevan 
26649d66b22SVijay Mahadevan /*
267941e0cffSVijay Mahadevan   int i=0;
268941e0cffSVijay Mahadevan   std::vector<moab::EntityHandle> adjs;
269941e0cffSVijay Mahadevan   for(moab::Range::iterator iter = dmb1->vowned->begin(); iter!= dmb1->vowned->end(); iter++, i++) {
270941e0cffSVijay Mahadevan     merr = dmb1->hierarchy->get_adjacencies(*iter, 0, adjs);MBERRNM(merr);
271941e0cffSVijay Mahadevan     nnz[i] -= adjs.size();
272941e0cffSVijay Mahadevan     adjs.clear();
273941e0cffSVijay Mahadevan   }
274*64e1c140SVijay Mahadevan   i=0;
27549d66b22SVijay Mahadevan   for(moab::Range::iterator iter = dmb1->vghost->begin(); iter!= dmb1->vghost->end(); iter++, i++) {
276941e0cffSVijay Mahadevan     //merr = dmb1->hierarchy->get_adjacencies(&(*iter), 1, 0, false, adjs, moab::Interface::UNION);MBERRNM(merr);
277941e0cffSVijay Mahadevan     merr = dmb1->hierarchy->get_adjacencies(*iter, 0, adjs);MBERRNM(merr);
278941e0cffSVijay Mahadevan     onz[i] -= adjs.size();
279941e0cffSVijay Mahadevan     adjs.clear();
280941e0cffSVijay Mahadevan   }
28149d66b22SVijay Mahadevan */
282941e0cffSVijay Mahadevan 
283*64e1c140SVijay Mahadevan   PetscInt* ldofs = dmb2->lidmap;
284*64e1c140SVijay Mahadevan   PetscInt* gdofs = dmb2->gidmap;
285941e0cffSVijay Mahadevan   ionz=onz[0];
286941e0cffSVijay Mahadevan   innz=nnz[0];
287941e0cffSVijay Mahadevan   for (int tc=0; tc < nlsiz2; tc++) {
288941e0cffSVijay Mahadevan     // check for maximum allowed sparsity = fully dense
289941e0cffSVijay Mahadevan     nnz[tc] = std::min(nlsiz1,nnz[tc]);
290941e0cffSVijay Mahadevan     onz[tc] = std::min(nlsiz1,onz[tc]);
291941e0cffSVijay Mahadevan 
292941e0cffSVijay Mahadevan     innz = (innz < nnz[tc] ? nnz[tc] : innz);
293941e0cffSVijay Mahadevan     ionz = (ionz < onz[tc] ? onz[tc] : ionz);
294*64e1c140SVijay Mahadevan     PetscPrintf(PETSC_COMM_SELF, "[%D]: %D NNZ = %D, ONZ = %D\n", rank, gdofs[ldofs[tc]], nnz[tc], onz[tc]);
295941e0cffSVijay Mahadevan   }
296*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%D]: Final: INNZ = %D, IONZ = %D\n", rank, innz, ionz);
297941e0cffSVijay Mahadevan 
298*64e1c140SVijay Mahadevan   MPI_Barrier(PETSC_COMM_WORLD);
299*64e1c140SVijay Mahadevan 
300*64e1c140SVijay Mahadevan   /* create interpolation matrix */
301*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%D]: Creating matrix\n", rank);
302*64e1c140SVijay Mahadevan   ierr = MatCreate(PetscObjectComm((PetscObject)dm2), interpl);CHKERRQ(ierr);
303*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%D]: set sizes\n", rank);
304*64e1c140SVijay Mahadevan   ierr = MatSetSizes(*interpl, nlsiz2, ngsiz1, ngsiz2, ngsiz1);CHKERRQ(ierr);
305*64e1c140SVijay Mahadevan   //ierr = MatSetType(*interpl, dm1->mattype);CHKERRQ(ierr);
306*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%D]: set type\n", rank);
307*64e1c140SVijay Mahadevan   ierr = MatSetType(*interpl,MATAIJ);CHKERRQ(ierr);
308*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%D]: set from opts\n", rank);
309*64e1c140SVijay Mahadevan   ierr = MatSetFromOptions(*interpl);CHKERRQ(ierr);
310*64e1c140SVijay Mahadevan 
311*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%D]: Setting prealloc\n", rank);
312941e0cffSVijay Mahadevan   ierr = MatSeqAIJSetPreallocation(*interpl,innz,nnz);CHKERRQ(ierr);
313941e0cffSVijay Mahadevan   ierr = MatMPIAIJSetPreallocation(*interpl,innz,nnz,ionz,onz);CHKERRQ(ierr);
314*64e1c140SVijay Mahadevan   //ierr = MatMPIAIJSetPreallocation(*interpl,innz,0,ionz,0);CHKERRQ(ierr);
315941e0cffSVijay Mahadevan 
316*64e1c140SVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%D]: Cleaning arrays\n", rank);
317941e0cffSVijay Mahadevan   /* clean up temporary memory */
318941e0cffSVijay Mahadevan   ierr = PetscFree2(nnz,onz);CHKERRQ(ierr);
319b117cd09SVijay Mahadevan 
320b117cd09SVijay Mahadevan   /* set up internal matrix data-structures */
321b117cd09SVijay Mahadevan   ierr = MatSetUp(*interpl);CHKERRQ(ierr);
322*64e1c140SVijay Mahadevan   //ierr = MatZeroEntries(*interpl);CHKERRQ(ierr);
323b117cd09SVijay Mahadevan 
324b117cd09SVijay Mahadevan   ierr = DMGetDimension(dm1, &dim);CHKERRQ(ierr);
325b117cd09SVijay Mahadevan 
3263f1c6e43SVijay Mahadevan   factor = std::pow(2.0 /*degree_P_for_refinement*/,(dmb2->hlevel-dmb1->hlevel)*dmb1->dim*1.0);
327b117cd09SVijay Mahadevan 
32849d66b22SVijay Mahadevan   ierr = MatSetOption(*interpl, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);CHKERRQ(ierr);
32949d66b22SVijay Mahadevan 
330e882eb38SVijay Mahadevan   /* Loop through the remaining vertices. These vertices appear only on the current refined_level. */
331b117cd09SVijay Mahadevan   for(moab::Range::iterator iter = dmb1->elocal->begin(); iter!= dmb1->elocal->end(); iter++) {
332b117cd09SVijay Mahadevan 
333b117cd09SVijay Mahadevan     const moab::EntityHandle ehandle = *iter;
334b117cd09SVijay Mahadevan     std::vector<moab::EntityHandle> children;
335b117cd09SVijay Mahadevan     std::vector<moab::EntityHandle> connp, connc;
336b117cd09SVijay Mahadevan 
337b117cd09SVijay Mahadevan     /* Get the relation between the current (coarse) parent and its corresponding (finer) children elements */
338b117cd09SVijay Mahadevan     merr = dmb1->hierarchy->parent_to_child(ehandle, dmb1->hlevel, dmb2->hlevel, children);MBERRNM(merr);
339b117cd09SVijay Mahadevan 
340b117cd09SVijay Mahadevan     /* Get connectivity and coordinates of the parent vertices */
341b117cd09SVijay Mahadevan     merr = dmb1->hierarchy->get_connectivity(ehandle, dmb1->hlevel, connp);MBERRNM(merr);
342e882eb38SVijay Mahadevan     for (unsigned ic=0; ic < children.size(); ic++) {
343b117cd09SVijay Mahadevan       std::vector<moab::EntityHandle> tconnc;
344b117cd09SVijay Mahadevan       /* Get coordinates of the parent vertices in canonical order */
345b117cd09SVijay Mahadevan       merr = dmb1->hierarchy->get_connectivity(children[ic], dmb2->hlevel, tconnc);MBERRNM(merr);
346e882eb38SVijay Mahadevan       for (unsigned tc=0; tc<tconnc.size(); tc++) {
347b117cd09SVijay Mahadevan         connc.push_back(tconnc[tc]);
348b117cd09SVijay Mahadevan       }
349b117cd09SVijay Mahadevan     }
350b117cd09SVijay Mahadevan 
351b117cd09SVijay Mahadevan     std::vector<double> pcoords(connp.size()*3), ccoords(connc.size()*3), values_phi(connc.size());
352b117cd09SVijay Mahadevan     /* Get coordinates for connectivity entities in canonical order for both coarse and finer levels */
353b117cd09SVijay Mahadevan     merr = dmb1->hierarchy->get_coordinates(&connp[0], connp.size(), dmb1->hlevel, &pcoords[0]);MBERRNM(merr);
354b117cd09SVijay Mahadevan     merr = dmb2->hierarchy->get_coordinates(&connc[0], connc.size(), dmb2->hlevel, &ccoords[0]);MBERRNM(merr);
355b117cd09SVijay Mahadevan 
356b117cd09SVijay Mahadevan     std::vector<int> dofsp(connp.size()), dofsc(connc.size());
357b117cd09SVijay Mahadevan     /* TODO: specific to scalar system - use GetDofs */
35849d66b22SVijay Mahadevan     ierr = DMMoabGetFieldDofsLocal(dm1, connp.size(), &connp[0], 0, &dofsp[0]);CHKERRQ(ierr);
35949d66b22SVijay Mahadevan     ierr = DMMoabGetFieldDofsLocal(dm2, connc.size(), &connc[0], 0, &dofsc[0]);CHKERRQ(ierr);
360b117cd09SVijay Mahadevan 
361e882eb38SVijay Mahadevan     /* Compute the interpolation weights by determining distance of 1-ring
362e882eb38SVijay Mahadevan        neighbor vertices from current vertex */
363e882eb38SVijay Mahadevan     for (unsigned i=0;i<connp.size(); i++) {
364b117cd09SVijay Mahadevan       double normsum=0.0;
365e882eb38SVijay Mahadevan       for (unsigned j=0;j<connc.size(); j++) {
3663f1c6e43SVijay Mahadevan         values_phi[j] = 0.0;
367e882eb38SVijay Mahadevan         for (unsigned k=0;k<3; k++)
368941e0cffSVijay Mahadevan           values_phi[j] += std::pow(pcoords[i*3+k]-ccoords[k+j*3], dim);
3693f1c6e43SVijay Mahadevan         if (values_phi[j] < 1e-12) {
3703f1c6e43SVijay Mahadevan           values_phi[j] = 1e12;
371b117cd09SVijay Mahadevan         }
372b117cd09SVijay Mahadevan         else {
373941e0cffSVijay Mahadevan           //values_phi[j] = std::pow(values_phi[j], -1.0/dim);
374941e0cffSVijay Mahadevan           values_phi[j] = std::pow(values_phi[j], -1.0);
3753f1c6e43SVijay Mahadevan           normsum += values_phi[j];
376b117cd09SVijay Mahadevan         }
377b117cd09SVijay Mahadevan       }
378e882eb38SVijay Mahadevan       for (unsigned j=0;j<connc.size(); j++) {
3793f1c6e43SVijay Mahadevan         if (values_phi[j] > 1e11)
3803f1c6e43SVijay Mahadevan           values_phi[j] = factor*0.5/connc.size();
381b117cd09SVijay Mahadevan         else
3823f1c6e43SVijay Mahadevan           values_phi[j] = factor*values_phi[j]*0.5/(connc.size()*normsum);
383b117cd09SVijay Mahadevan       }
384b117cd09SVijay Mahadevan       ierr = MatSetValues(*interpl, connc.size(), &dofsc[0], 1, &dofsp[i], &values_phi[0], ADD_VALUES);CHKERRQ(ierr);
385b117cd09SVijay Mahadevan     }
386b117cd09SVijay Mahadevan 
387b117cd09SVijay Mahadevan     /* check if element is on the boundary */
388b117cd09SVijay Mahadevan     //ierr = DMMoabIsEntityOnBoundary(dm1,ehandle,&eonbnd);CHKERRQ(ierr);
3893f1c6e43SVijay Mahadevan     dbdry.resize(connc.size());
3903f1c6e43SVijay Mahadevan     ierr = DMMoabCheckBoundaryVertices(dm2,connc.size(),&connc[0],dbdry.data());CHKERRQ(ierr);
391b117cd09SVijay Mahadevan     eonbnd=PETSC_FALSE;
392e882eb38SVijay Mahadevan     for (unsigned i=0; i< connc.size(); ++i)
393b117cd09SVijay Mahadevan       if (dbdry[i]) eonbnd=PETSC_TRUE;
394b117cd09SVijay Mahadevan 
395b117cd09SVijay Mahadevan     values_phi.clear();
396b117cd09SVijay Mahadevan     values_phi.resize(connp.size());
397b117cd09SVijay Mahadevan     /* apply dirichlet boundary conditions */
398b117cd09SVijay Mahadevan     if (eonbnd) {
399b117cd09SVijay Mahadevan 
400b117cd09SVijay Mahadevan       ierr = MatAssemblyBegin(*interpl,MAT_FLUSH_ASSEMBLY);CHKERRQ(ierr);
401b117cd09SVijay Mahadevan       ierr = MatAssemblyEnd(*interpl,MAT_FLUSH_ASSEMBLY);CHKERRQ(ierr);
402b117cd09SVijay Mahadevan       /* get the list of nodes on boundary so that we can enforce dirichlet conditions strongly */
403b117cd09SVijay Mahadevan       //ierr = DMMoabCheckBoundaryVertices(dm2,connc.size(),&connc[0],dbdry);CHKERRQ(ierr);
404e882eb38SVijay Mahadevan       for (unsigned i=0; i < connc.size(); i++) {
4053f1c6e43SVijay Mahadevan         if (dbdry[i]) {  /* dirichlet node */
406b117cd09SVijay Mahadevan           /* think about strongly imposing dirichlet */
407b117cd09SVijay Mahadevan           //bndrows.push_back(dofsc[i]);
408b117cd09SVijay Mahadevan 
409b117cd09SVijay Mahadevan           ierr = MatSetValues(*interpl, 1, &dofsc[i], connp.size(), &dofsp[0], &values_phi[0], INSERT_VALUES);CHKERRQ(ierr);
410b117cd09SVijay Mahadevan           //values_phi[0]=1.0;
411b117cd09SVijay Mahadevan           //ierr = MatSetValues(*interpl, 1, &dofsc[i], 1, &dofsc[i], &values_phi[0], INSERT_VALUES);CHKERRQ(ierr);
412b117cd09SVijay Mahadevan         }
413b117cd09SVijay Mahadevan       }
414b117cd09SVijay Mahadevan 
415b117cd09SVijay Mahadevan       ierr = MatAssemblyBegin(*interpl,MAT_FLUSH_ASSEMBLY);CHKERRQ(ierr);
416b117cd09SVijay Mahadevan       ierr = MatAssemblyEnd(*interpl,MAT_FLUSH_ASSEMBLY);CHKERRQ(ierr);
417b117cd09SVijay Mahadevan     }
418b117cd09SVijay Mahadevan 
419b117cd09SVijay Mahadevan     //get interpolation weights
420b117cd09SVijay Mahadevan     //ierr = Compute_Quad4_Basis(pcoords, 1, coord, values_phi);CHKERRQ(ierr);
421e882eb38SVijay Mahadevan     // for (int j=0;j<dofs_per_element; j++)
422e882eb38SVijay Mahadevan     //  std::cout<<"values "<<values_phi[j]<<std::endl;
423b117cd09SVijay Mahadevan 
424b117cd09SVijay Mahadevan     //get row and column indices, zero weights are ignored
425b117cd09SVijay Mahadevan     /*
426b117cd09SVijay Mahadevan     int nz_ind = 0;
427b117cd09SVijay Mahadevan     idx = dmb2->vowned->index(vhandle);
428b117cd09SVijay Mahadevan     for (int j=0;j<dofs_per_element; j++){
429b117cd09SVijay Mahadevan       idy[nz_ind] = dmb1->vowned->index(connectivity[j]);
430b117cd09SVijay Mahadevan       PetscPrintf(PETSC_COMM_WORLD, "Finding coarse connectivity vertex %D associated with [%D, %D] - set to %D\n", connectivity[j], parent.size(), vhandle, idy[nz_ind]);
431b117cd09SVijay Mahadevan       //values_phi[nz_ind] = values_phi[j];
432b117cd09SVijay Mahadevan       nz_ind = nz_ind+1;
433b117cd09SVijay Mahadevan     }
434b117cd09SVijay Mahadevan     */
435b117cd09SVijay Mahadevan 
436b117cd09SVijay Mahadevan     //ierr = MatSetValues(*interpl, nz_ind, idy, 1, &idx, values_phi, INSERT_VALUES);CHKERRQ(ierr);
437b117cd09SVijay Mahadevan     //ierr = MatSetValues(*interpl, connp.size(), dofsp, connc.size(), dofsc, &values_phi[0], INSERT_VALUES);CHKERRQ(ierr);
438b117cd09SVijay Mahadevan   }
439b117cd09SVijay Mahadevan 
440b117cd09SVijay Mahadevan   //PetscPrintf(PETSC_COMM_WORLD, "[Boundary vertices = %D] :: A few: %D %D %D %D \n", bndrows.size(), bndrows[0], bndrows[1], bndrows[2], bndrows[3]);
441b117cd09SVijay Mahadevan   //ierr = MatZeroRows(*interpl, bndrows.size(), &bndrows[0], 1.0, 0, 0);CHKERRQ(ierr);
442b117cd09SVijay Mahadevan 
443b117cd09SVijay Mahadevan   ierr = MatAssemblyBegin(*interpl,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
444b117cd09SVijay Mahadevan   ierr = MatAssemblyEnd(*interpl,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
445b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
446b117cd09SVijay Mahadevan }
447b117cd09SVijay Mahadevan 
448b117cd09SVijay Mahadevan #undef __FUNCT__
449b117cd09SVijay Mahadevan #define __FUNCT__ "DMCreateInjection_Moab"
450b117cd09SVijay Mahadevan /*@
451b117cd09SVijay Mahadevan   DMCreateInjection_Moab - Generate a multi-level uniform refinement hierarchy
452b117cd09SVijay Mahadevan   by succesively refining a coarse mesh, already defined in the DM object
453b117cd09SVijay Mahadevan   provided by the user.
454b117cd09SVijay Mahadevan 
455b117cd09SVijay Mahadevan   Collective on MPI_Comm
456b117cd09SVijay Mahadevan 
457b117cd09SVijay Mahadevan   Input Parameter:
458b117cd09SVijay Mahadevan . dmb  - The DMMoab object
459b117cd09SVijay Mahadevan 
460b117cd09SVijay Mahadevan   Output Parameter:
461b117cd09SVijay Mahadevan . nlevels   - The number of levels of refinement needed to generate the hierarchy
462b117cd09SVijay Mahadevan + ldegrees  - The degree of refinement at each level in the hierarchy
463b117cd09SVijay Mahadevan 
464b117cd09SVijay Mahadevan   Level: beginner
465b117cd09SVijay Mahadevan 
466b117cd09SVijay Mahadevan .keywords: DMMoab, create, refinement
467b117cd09SVijay Mahadevan @*/
468b117cd09SVijay Mahadevan PetscErrorCode DMCreateInjection_Moab(DM dm1,DM dm2,VecScatter* ctx)
469b117cd09SVijay Mahadevan {
470e882eb38SVijay Mahadevan   //DM_Moab        *dmmoab;
471b117cd09SVijay Mahadevan 
472b117cd09SVijay Mahadevan   PetscFunctionBegin;
473b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm1,DM_CLASSID,1);
474b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm2,DM_CLASSID,2);
475e882eb38SVijay Mahadevan   //dmmoab = (DM_Moab*)(dm1)->data;
476b117cd09SVijay Mahadevan 
477b117cd09SVijay Mahadevan   PetscPrintf(PETSC_COMM_WORLD, "[DMCreateInjection_Moab] :: Placeholder\n");
478b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
479b117cd09SVijay Mahadevan }
480b117cd09SVijay Mahadevan 
481b117cd09SVijay Mahadevan 
482b117cd09SVijay Mahadevan #undef __FUNCT__
483b117cd09SVijay Mahadevan #define __FUNCT__ "DM_UMR_Moab_Private"
484b117cd09SVijay Mahadevan PetscErrorCode  DM_UMR_Moab_Private(DM dm,MPI_Comm comm,PetscBool refine,DM *dmref)
485b117cd09SVijay Mahadevan {
486b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
487e882eb38SVijay Mahadevan   PetscInt        i,dim;
488b117cd09SVijay Mahadevan   DM              dm2;
489b117cd09SVijay Mahadevan   moab::ErrorCode merr;
490b117cd09SVijay Mahadevan   DM_Moab        *dmb = (DM_Moab*)dm->data,*dd2;
491b117cd09SVijay Mahadevan 
492b117cd09SVijay Mahadevan   PetscFunctionBegin;
493b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
494b117cd09SVijay Mahadevan   PetscValidPointer(dmref,4);
495b117cd09SVijay Mahadevan 
496b117cd09SVijay Mahadevan   if ( (dmb->hlevel == dmb->nhlevels && refine) || (dmb->hlevel == 0 && !refine) ) {
497e882eb38SVijay Mahadevan     if (dmb->hlevel+1 > dmb->nhlevels && refine) PetscInfo2(NULL,"Invalid multigrid refinement hierarchy level specified (%D). MOAB UMR max levels = %D. Creating a NULL object.\n",dmb->hlevel+1,dmb->nhlevels);
498e882eb38SVijay Mahadevan     if (dmb->hlevel-1 < 0 && !refine) PetscInfo1(NULL,"Invalid multigrid coarsen hierarchy level specified (%D). Creating a NULL object.\n",dmb->hlevel-1);
499e882eb38SVijay Mahadevan     *dmref = PETSC_NULL;
500b117cd09SVijay Mahadevan     PetscFunctionReturn(0);
501b117cd09SVijay Mahadevan   }
502b117cd09SVijay Mahadevan 
503b117cd09SVijay Mahadevan   ierr = DMMoabCreate(PetscObjectComm((PetscObject)dm), &dm2);CHKERRQ(ierr);
504b117cd09SVijay Mahadevan   dd2 = (DM_Moab*)dm2->data;
505b117cd09SVijay Mahadevan 
506b117cd09SVijay Mahadevan   dd2->mbiface = dmb->mbiface;
507b117cd09SVijay Mahadevan   dd2->pcomm = dmb->pcomm;
508b117cd09SVijay Mahadevan   dd2->icreatedinstance = PETSC_FALSE;
509*64e1c140SVijay Mahadevan   dd2->nghostrings=dmb->nghostrings;
510b117cd09SVijay Mahadevan 
511b117cd09SVijay Mahadevan   /* set the new level based on refinement/coarsening */
512b117cd09SVijay Mahadevan   if (refine) {
513b117cd09SVijay Mahadevan     dd2->hlevel=dmb->hlevel+1;
514b117cd09SVijay Mahadevan   }
515b117cd09SVijay Mahadevan   else {
516b117cd09SVijay Mahadevan     dd2->hlevel=dmb->hlevel-1;
517b117cd09SVijay Mahadevan   }
518b117cd09SVijay Mahadevan 
519b117cd09SVijay Mahadevan   /* Copy the multilevel hierarchy pointers in MOAB */
520b117cd09SVijay Mahadevan   dd2->hierarchy = dmb->hierarchy;
521b117cd09SVijay Mahadevan   dd2->nhlevels = dmb->nhlevels;
522b117cd09SVijay Mahadevan   ierr = PetscMalloc1(dd2->nhlevels+1,&dd2->hsets);CHKERRQ(ierr);
523b117cd09SVijay Mahadevan   for (i=0; i<=dd2->nhlevels; i++) {
524b117cd09SVijay Mahadevan     dd2->hsets[i]=dmb->hsets[i];
525b117cd09SVijay Mahadevan   }
526b117cd09SVijay Mahadevan   dd2->fileset = dd2->hsets[dd2->hlevel];
527b117cd09SVijay Mahadevan 
528b117cd09SVijay Mahadevan   /* do the remaining initializations for DMMoab */
529b117cd09SVijay Mahadevan   dd2->bs = dmb->bs;
530b117cd09SVijay Mahadevan   dd2->numFields = dmb->numFields;
531b117cd09SVijay Mahadevan   dd2->rw_dbglevel = dmb->rw_dbglevel;
532b117cd09SVijay Mahadevan   dd2->partition_by_rank = dmb->partition_by_rank;
533b117cd09SVijay Mahadevan   ierr = PetscStrcpy(dd2->extra_read_options, dmb->extra_read_options);CHKERRQ(ierr);
534b117cd09SVijay Mahadevan   ierr = PetscStrcpy(dd2->extra_write_options, dmb->extra_write_options);CHKERRQ(ierr);
535b117cd09SVijay Mahadevan   dd2->read_mode = dmb->read_mode;
536b117cd09SVijay Mahadevan   dd2->write_mode = dmb->write_mode;
537b117cd09SVijay Mahadevan 
538b117cd09SVijay Mahadevan   /* set global ID tag handle */
539b117cd09SVijay Mahadevan   ierr = DMMoabSetLocalToGlobalTag(dm2, dmb->ltog_tag);CHKERRQ(ierr);
540b117cd09SVijay Mahadevan 
541b117cd09SVijay Mahadevan   merr = dd2->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dd2->material_tag);MBERRNM(merr);
542b117cd09SVijay Mahadevan 
543b117cd09SVijay Mahadevan   ierr = DMSetOptionsPrefix(dm2,((PetscObject)dm)->prefix);CHKERRQ(ierr);
544b117cd09SVijay Mahadevan   ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr);
545b117cd09SVijay Mahadevan   ierr = DMSetDimension(dm2,dim);CHKERRQ(ierr);
546b117cd09SVijay Mahadevan 
547b117cd09SVijay Mahadevan   /* allow overloaded (user replaced) operations to be inherited by refinement clones */
548b117cd09SVijay Mahadevan   dm2->ops->creatematrix = dm->ops->creatematrix;
549b117cd09SVijay Mahadevan 
550b117cd09SVijay Mahadevan   /* copy fill information if given */
551b117cd09SVijay Mahadevan   ierr = DMMoabSetBlockFills(dm2, dmb->dfill, dmb->ofill);CHKERRQ(ierr);
552b117cd09SVijay Mahadevan 
553b117cd09SVijay Mahadevan   /* copy vector type information */
554b117cd09SVijay Mahadevan   ierr = DMSetMatType(dm2,dm->mattype);CHKERRQ(ierr);
555b117cd09SVijay Mahadevan   ierr = DMSetVecType(dm2,dm->vectype);CHKERRQ(ierr);
5563f1c6e43SVijay Mahadevan   dd2->numFields = dmb->numFields;
5573f1c6e43SVijay Mahadevan   if (dmb->numFields) {
558b117cd09SVijay Mahadevan     ierr = DMMoabSetFieldNames(dm2,dmb->numFields,dmb->fieldNames);CHKERRQ(ierr);
5593f1c6e43SVijay Mahadevan   }
560b117cd09SVijay Mahadevan 
561b117cd09SVijay Mahadevan   ierr = DMSetFromOptions(dm2);CHKERRQ(ierr);
562b117cd09SVijay Mahadevan 
563b117cd09SVijay Mahadevan   /* recreate Dof numbering for the refined DM and make sure the distribution is correctly populated */
564b117cd09SVijay Mahadevan   ierr = DMSetUp(dm2);CHKERRQ(ierr);
565b117cd09SVijay Mahadevan 
566b117cd09SVijay Mahadevan   *dmref = dm2;
567b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
568b117cd09SVijay Mahadevan }
569b117cd09SVijay Mahadevan 
570b117cd09SVijay Mahadevan 
571b117cd09SVijay Mahadevan #undef __FUNCT__
572b117cd09SVijay Mahadevan #define __FUNCT__ "DMRefine_Moab"
573b117cd09SVijay Mahadevan /*@
574b117cd09SVijay Mahadevan   DMRefine_Moab - Generate a multi-level uniform refinement hierarchy
575b117cd09SVijay Mahadevan   by succesively refining a coarse mesh, already defined in the DM object
576b117cd09SVijay Mahadevan   provided by the user.
577b117cd09SVijay Mahadevan 
578e882eb38SVijay Mahadevan   Collective on DM
579b117cd09SVijay Mahadevan 
580b117cd09SVijay Mahadevan   Input Parameter:
581e882eb38SVijay Mahadevan + dm  - The DMMoab object
582e882eb38SVijay Mahadevan - comm - the communicator to contain the new DM object (or MPI_COMM_NULL)
583b117cd09SVijay Mahadevan 
584b117cd09SVijay Mahadevan   Output Parameter:
585e882eb38SVijay Mahadevan . dmf - the refined DM, or NULL
586b117cd09SVijay Mahadevan 
587e882eb38SVijay Mahadevan   Note: If no refinement was done, the return value is NULL
588e882eb38SVijay Mahadevan 
589e882eb38SVijay Mahadevan   Level: developer
590b117cd09SVijay Mahadevan 
591b117cd09SVijay Mahadevan .keywords: DMMoab, create, refinement
592b117cd09SVijay Mahadevan @*/
593b117cd09SVijay Mahadevan PetscErrorCode DMRefine_Moab(DM dm,MPI_Comm comm,DM* dmf)
594b117cd09SVijay Mahadevan {
595b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
596b117cd09SVijay Mahadevan 
597b117cd09SVijay Mahadevan   PetscFunctionBegin;
598b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
599b117cd09SVijay Mahadevan 
600b117cd09SVijay Mahadevan   ierr = DM_UMR_Moab_Private(dm,comm,PETSC_TRUE,dmf);CHKERRQ(ierr);
601b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
602b117cd09SVijay Mahadevan }
603b117cd09SVijay Mahadevan 
604b117cd09SVijay Mahadevan #undef __FUNCT__
605b117cd09SVijay Mahadevan #define __FUNCT__ "DMCoarsen_Moab"
606b117cd09SVijay Mahadevan /*@
607b117cd09SVijay Mahadevan   DMCoarsen_Moab - Generate a multi-level uniform refinement hierarchy
608b117cd09SVijay Mahadevan   by succesively refining a coarse mesh, already defined in the DM object
609b117cd09SVijay Mahadevan   provided by the user.
610b117cd09SVijay Mahadevan 
611e882eb38SVijay Mahadevan   Collective on DM
612b117cd09SVijay Mahadevan 
613b117cd09SVijay Mahadevan   Input Parameter:
614e882eb38SVijay Mahadevan . dm  - The DMMoab object
615e882eb38SVijay Mahadevan - comm - the communicator to contain the new DM object (or MPI_COMM_NULL)
616b117cd09SVijay Mahadevan 
617b117cd09SVijay Mahadevan   Output Parameter:
618e882eb38SVijay Mahadevan . dmf - the coarsened DM, or NULL
619b117cd09SVijay Mahadevan 
620e882eb38SVijay Mahadevan   Note: If no coarsening was done, the return value is NULL
621b117cd09SVijay Mahadevan 
622e882eb38SVijay Mahadevan   Level: developer
623e882eb38SVijay Mahadevan 
624e882eb38SVijay Mahadevan .keywords: DMMoab, create, coarsening
625b117cd09SVijay Mahadevan @*/
626b117cd09SVijay Mahadevan PetscErrorCode DMCoarsen_Moab(DM dm,MPI_Comm comm,DM* dmc)
627b117cd09SVijay Mahadevan {
628b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
629b117cd09SVijay Mahadevan 
630b117cd09SVijay Mahadevan   PetscFunctionBegin;
631b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
632b117cd09SVijay Mahadevan 
633b117cd09SVijay Mahadevan   ierr = DM_UMR_Moab_Private(dm,comm,PETSC_FALSE,dmc);CHKERRQ(ierr);
634b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
635b117cd09SVijay Mahadevan }
636