xref: /petsc/src/dm/impls/moab/dmmbmg.cxx (revision e882eb38466228dc46cfd515783348bd1ccf5a7f)
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;
33*e882eb38SVijay 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 */
49b117cd09SVijay Mahadevan   dmmoab->hierarchy = new moab::NestedRefine(dynamic_cast<moab::Core*>(dmmoab->mbiface), dmmoab->fileset);
50b117cd09SVijay Mahadevan 
51*e882eb38SVijay Mahadevan   ierr = PetscMalloc1(nlevels+1,&dmmoab->hsets);CHKERRQ(ierr);
52*e882eb38SVijay Mahadevan 
53b117cd09SVijay Mahadevan   /* generate the mesh hierarchy */
54*e882eb38SVijay Mahadevan   merr = dmmoab->hierarchy->generate_mesh_hierarchy(pdegrees, nlevels, hsets);MBERRNM(merr);
55*e882eb38SVijay Mahadevan 
56*e882eb38SVijay Mahadevan   for (i=0; i<=nlevels; i++) dmmoab->hsets[i]=hsets[i];
57b117cd09SVijay Mahadevan 
58b117cd09SVijay Mahadevan   if (!ldegrees) {
59b117cd09SVijay Mahadevan     ierr = PetscFree(pdegrees);CHKERRQ(ierr);
60b117cd09SVijay Mahadevan   }
61b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
62b117cd09SVijay Mahadevan }
63b117cd09SVijay Mahadevan 
64b117cd09SVijay Mahadevan #undef __FUNCT__
65b117cd09SVijay Mahadevan #define __FUNCT__ "DMRefineHierarchy_Moab"
66b117cd09SVijay Mahadevan /*@
67*e882eb38SVijay Mahadevan   DMRefineHierarchy_Moab - Generate a multi-level DM hierarchy
68*e882eb38SVijay Mahadevan   by succesively refining a coarse mesh.
69b117cd09SVijay Mahadevan 
70b117cd09SVijay Mahadevan   Collective on MPI_Comm
71b117cd09SVijay Mahadevan 
72b117cd09SVijay Mahadevan   Input Parameter:
73*e882eb38SVijay Mahadevan + dm  - The DMMoab object
74b117cd09SVijay Mahadevan 
75b117cd09SVijay Mahadevan   Output Parameter:
76*e882eb38SVijay Mahadevan + nlevels   - The number of levels of refinement needed to generate the hierarchy
77*e882eb38SVijay Mahadevan . dmf  - The DM objects after successive refinement of the hierarchy
78b117cd09SVijay Mahadevan 
79b117cd09SVijay Mahadevan   Level: beginner
80b117cd09SVijay Mahadevan 
81*e882eb38SVijay Mahadevan .keywords: DMMoab, generate, refinement
82b117cd09SVijay Mahadevan @*/
83b117cd09SVijay Mahadevan PetscErrorCode  DMRefineHierarchy_Moab(DM dm,PetscInt nlevels,DM dmf[])
84b117cd09SVijay Mahadevan {
85b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
86b117cd09SVijay Mahadevan   PetscInt        i;
87b117cd09SVijay Mahadevan 
88b117cd09SVijay Mahadevan   PetscFunctionBegin;
89b117cd09SVijay Mahadevan 
90*e882eb38SVijay Mahadevan   ierr = DMRefine(dm,PetscObjectComm((PetscObject)dm),&dmf[0]);CHKERRQ(ierr);
91*e882eb38SVijay Mahadevan   for (i=1; i<nlevels; i++) {
92*e882eb38SVijay Mahadevan     ierr = DMRefine(dmf[i-1],PetscObjectComm((PetscObject)dm),&dmf[i]);CHKERRQ(ierr);
93b117cd09SVijay Mahadevan   }
94b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
95b117cd09SVijay Mahadevan }
96b117cd09SVijay Mahadevan 
97b117cd09SVijay Mahadevan #undef __FUNCT__
98b117cd09SVijay Mahadevan #define __FUNCT__ "DMCoarsenHierarchy_Moab"
99b117cd09SVijay Mahadevan /*@
100*e882eb38SVijay Mahadevan   DMCoarsenHierarchy_Moab - Generate a multi-level DM hierarchy
101*e882eb38SVijay Mahadevan   by succesively coarsening a refined mesh.
102b117cd09SVijay Mahadevan 
103b117cd09SVijay Mahadevan   Collective on MPI_Comm
104b117cd09SVijay Mahadevan 
105b117cd09SVijay Mahadevan   Input Parameter:
106*e882eb38SVijay Mahadevan + dm  - The DMMoab object
107b117cd09SVijay Mahadevan 
108b117cd09SVijay Mahadevan   Output Parameter:
109*e882eb38SVijay Mahadevan + nlevels   - The number of levels of refinement needed to generate the hierarchy
110*e882eb38SVijay Mahadevan . dmc  - The DM objects after successive coarsening of the hierarchy
111b117cd09SVijay Mahadevan 
112b117cd09SVijay Mahadevan   Level: beginner
113b117cd09SVijay Mahadevan 
114*e882eb38SVijay Mahadevan .keywords: DMMoab, generate, coarsening
115b117cd09SVijay Mahadevan @*/
116b117cd09SVijay Mahadevan PetscErrorCode DMCoarsenHierarchy_Moab(DM dm,PetscInt nlevels,DM dmc[])
117b117cd09SVijay Mahadevan {
118b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
119b117cd09SVijay Mahadevan   PetscInt        i;
120b117cd09SVijay Mahadevan 
121b117cd09SVijay Mahadevan   PetscFunctionBegin;
122b117cd09SVijay Mahadevan 
123*e882eb38SVijay Mahadevan   ierr = DMCoarsen(dm,PetscObjectComm((PetscObject)dm),&dmc[0]);CHKERRQ(ierr);
124*e882eb38SVijay Mahadevan   for (i=1; i<nlevels; i++) {
125*e882eb38SVijay Mahadevan     ierr = DMCoarsen(dmc[i-1],PetscObjectComm((PetscObject)dm),&dmc[i]);CHKERRQ(ierr);
126b117cd09SVijay Mahadevan   }
127b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
128b117cd09SVijay Mahadevan }
129b117cd09SVijay Mahadevan 
130b117cd09SVijay Mahadevan 
131b117cd09SVijay Mahadevan #undef __FUNCT__
132b117cd09SVijay Mahadevan #define __FUNCT__ "DMCreateInterpolation_Moab"
133b117cd09SVijay Mahadevan /*@
134*e882eb38SVijay Mahadevan   DMCreateInterpolation_Moab - Generate the interpolation operators to transform
135*e882eb38SVijay Mahadevan   operators (matrices, vectors) from parent level to child level as defined by
136*e882eb38SVijay Mahadevan   the DM inputs provided by the user.
137b117cd09SVijay Mahadevan 
138b117cd09SVijay Mahadevan   Collective on MPI_Comm
139b117cd09SVijay Mahadevan 
140b117cd09SVijay Mahadevan   Input Parameter:
141*e882eb38SVijay Mahadevan + dm1  - The DMMoab object
142*e882eb38SVijay Mahadevan - dm2  - the second, finer DMMoab object
143b117cd09SVijay Mahadevan 
144b117cd09SVijay Mahadevan   Output Parameter:
145*e882eb38SVijay Mahadevan + interpl  - The interpolation operator for transferring data between the levels
146*e882eb38SVijay Mahadevan - vec      - The scaling vector (optional)
147b117cd09SVijay Mahadevan 
148*e882eb38SVijay Mahadevan   Level: developer
149b117cd09SVijay Mahadevan 
150b117cd09SVijay Mahadevan .keywords: DMMoab, create, refinement
151b117cd09SVijay Mahadevan @*/
152b117cd09SVijay Mahadevan PetscErrorCode DMCreateInterpolation_Moab(DM dm1,DM dm2,Mat* interpl,Vec* vec)
153b117cd09SVijay Mahadevan {
154b117cd09SVijay Mahadevan   DM_Moab        *dmb1, *dmb2;
155b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
156b117cd09SVijay Mahadevan   moab::ErrorCode merr;
157*e882eb38SVijay Mahadevan   PetscInt        dim;
158b117cd09SVijay Mahadevan   PetscBool       eonbnd,dbdry[27];
159b117cd09SVijay Mahadevan   std::vector<int> bndrows;
160b117cd09SVijay Mahadevan 
161b117cd09SVijay Mahadevan   PetscFunctionBegin;
162b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm1,DM_CLASSID,1);
163b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm2,DM_CLASSID,2);
164b117cd09SVijay Mahadevan   dmb1 = (DM_Moab*)(dm1)->data;
165b117cd09SVijay Mahadevan   dmb2 = (DM_Moab*)(dm2)->data;
166b117cd09SVijay Mahadevan 
167b117cd09SVijay Mahadevan   ierr = MatCreate(PetscObjectComm((PetscObject)dm1), interpl);CHKERRQ(ierr);
168*e882eb38SVijay Mahadevan   ierr = MatSetType(*interpl, dm1->mattype);CHKERRQ(ierr);
169b117cd09SVijay Mahadevan   ierr = MatSetSizes(*interpl, dmb2->nloc, dmb1->nloc, dmb2->n, dmb1->n);CHKERRQ(ierr);
170b117cd09SVijay Mahadevan 
171b117cd09SVijay Mahadevan   /* TODO: This is a hack for the rectangular system - decipher NNZ pattern better */
172b117cd09SVijay Mahadevan   ierr = MatSetFromOptions(*interpl);CHKERRQ(ierr);
173b117cd09SVijay Mahadevan 
174b117cd09SVijay Mahadevan   ierr = MatSeqAIJSetPreallocation(*interpl,dmb2->nloc,0);CHKERRQ(ierr);
175b117cd09SVijay Mahadevan   ierr = MatMPIAIJSetPreallocation(*interpl,dmb2->nloc,0,dmb2->nghost,0);CHKERRQ(ierr);
176b117cd09SVijay Mahadevan 
177b117cd09SVijay Mahadevan   /* set up internal matrix data-structures */
178b117cd09SVijay Mahadevan   ierr = MatSetUp(*interpl);CHKERRQ(ierr);
179b117cd09SVijay Mahadevan 
180b117cd09SVijay Mahadevan   ierr = MatZeroEntries(*interpl);CHKERRQ(ierr);
181b117cd09SVijay Mahadevan 
182b117cd09SVijay Mahadevan   ierr = DMGetDimension(dm1, &dim);CHKERRQ(ierr);
183b117cd09SVijay Mahadevan 
184*e882eb38SVijay Mahadevan   PetscPrintf(PETSC_COMM_WORLD, "Creating a %D DIM matrix that is %D X %D and setting diagonal to 1.0\n", dim, dmb1->nloc, dmb2->nloc);
185b117cd09SVijay Mahadevan 
186b117cd09SVijay Mahadevan   double factor = std::pow(2.0,(dmb2->hlevel-dmb1->hlevel)*dmb1->dim*1.0);
187b117cd09SVijay Mahadevan 
188*e882eb38SVijay Mahadevan   /* Loop through the remaining vertices. These vertices appear only on the current refined_level. */
189b117cd09SVijay Mahadevan   for(moab::Range::iterator iter = dmb1->elocal->begin(); iter!= dmb1->elocal->end(); iter++) {
190b117cd09SVijay Mahadevan 
191b117cd09SVijay Mahadevan     const moab::EntityHandle ehandle = *iter;
192b117cd09SVijay Mahadevan     std::vector<moab::EntityHandle> children;
193b117cd09SVijay Mahadevan     std::vector<moab::EntityHandle> connp, connc;
194b117cd09SVijay Mahadevan 
195b117cd09SVijay Mahadevan     /* Get the relation between the current (coarse) parent and its corresponding (finer) children elements */
196b117cd09SVijay Mahadevan     merr = dmb1->hierarchy->parent_to_child(ehandle, dmb1->hlevel, dmb2->hlevel, children);MBERRNM(merr);
197b117cd09SVijay Mahadevan 
198b117cd09SVijay Mahadevan     /* Get connectivity and coordinates of the parent vertices */
199b117cd09SVijay Mahadevan     merr = dmb1->hierarchy->get_connectivity(ehandle, dmb1->hlevel, connp);MBERRNM(merr);
200*e882eb38SVijay Mahadevan     for (unsigned ic=0; ic < children.size(); ic++) {
201b117cd09SVijay Mahadevan       std::vector<moab::EntityHandle> tconnc;
202b117cd09SVijay Mahadevan       /* Get coordinates of the parent vertices in canonical order */
203b117cd09SVijay Mahadevan       merr = dmb1->hierarchy->get_connectivity(children[ic], dmb2->hlevel, tconnc);MBERRNM(merr);
204*e882eb38SVijay Mahadevan       for (unsigned tc=0; tc<tconnc.size(); tc++) {
205b117cd09SVijay Mahadevan         connc.push_back(tconnc[tc]);
206b117cd09SVijay Mahadevan       }
207b117cd09SVijay Mahadevan     }
208b117cd09SVijay Mahadevan 
209b117cd09SVijay Mahadevan     std::vector<double> pcoords(connp.size()*3), ccoords(connc.size()*3), values_phi(connc.size());
210b117cd09SVijay Mahadevan     /* Get coordinates for connectivity entities in canonical order for both coarse and finer levels */
211b117cd09SVijay Mahadevan     merr = dmb1->hierarchy->get_coordinates(&connp[0], connp.size(), dmb1->hlevel, &pcoords[0]);MBERRNM(merr);
212b117cd09SVijay Mahadevan     merr = dmb2->hierarchy->get_coordinates(&connc[0], connc.size(), dmb2->hlevel, &ccoords[0]);MBERRNM(merr);
213b117cd09SVijay Mahadevan 
214b117cd09SVijay Mahadevan     std::vector<int> dofsp(connp.size()), dofsc(connc.size());
215b117cd09SVijay Mahadevan     /* TODO: specific to scalar system - use GetDofs */
216b117cd09SVijay Mahadevan     ierr = DMMoabGetFieldDofs(dm1, connp.size(), &connp[0], 0, &dofsp[0]);CHKERRQ(ierr);
217b117cd09SVijay Mahadevan     ierr = DMMoabGetFieldDofs(dm2, connc.size(), &connc[0], 0, &dofsc[0]);CHKERRQ(ierr);
218b117cd09SVijay Mahadevan 
219*e882eb38SVijay Mahadevan     /* Compute the interpolation weights by determining distance of 1-ring
220*e882eb38SVijay Mahadevan        neighbor vertices from current vertex */
221*e882eb38SVijay Mahadevan     for (unsigned i=0;i<connp.size(); i++) {
222b117cd09SVijay Mahadevan       double normsum=0.0;
223*e882eb38SVijay Mahadevan       for (unsigned j=0;j<connc.size(); j++) {
224*e882eb38SVijay Mahadevan         unsigned offset=j;
225b117cd09SVijay Mahadevan         values_phi[offset] = 0.0;
226*e882eb38SVijay Mahadevan         for (unsigned k=0;k<3; k++)
227b117cd09SVijay Mahadevan           values_phi[offset] += (pcoords[i*3+k]-ccoords[k+j*3])*(pcoords[i*3+k]-ccoords[k+j*3]);
228b117cd09SVijay Mahadevan         if (values_phi[offset] < 1e-12) {
229b117cd09SVijay Mahadevan           values_phi[offset] = 1e12;
230b117cd09SVijay Mahadevan         }
231b117cd09SVijay Mahadevan         else {
232b117cd09SVijay Mahadevan           values_phi[offset] = 1.0/(values_phi[offset]);
233b117cd09SVijay Mahadevan           normsum += values_phi[offset];
234b117cd09SVijay Mahadevan         }
235b117cd09SVijay Mahadevan       }
236*e882eb38SVijay Mahadevan       for (unsigned j=0;j<connc.size(); j++) {
237*e882eb38SVijay Mahadevan         unsigned offset=j;
238b117cd09SVijay Mahadevan         if (values_phi[offset] > 1e11)
239b117cd09SVijay Mahadevan           values_phi[offset] = factor*0.5/connc.size();
240b117cd09SVijay Mahadevan         else
241b117cd09SVijay Mahadevan           values_phi[offset] = factor*values_phi[offset]*0.5/(connc.size()*normsum);
242b117cd09SVijay Mahadevan       }
243b117cd09SVijay Mahadevan       ierr = MatSetValues(*interpl, connc.size(), &dofsc[0], 1, &dofsp[i], &values_phi[0], ADD_VALUES);CHKERRQ(ierr);
244b117cd09SVijay Mahadevan     }
245b117cd09SVijay Mahadevan 
246b117cd09SVijay Mahadevan     /* check if element is on the boundary */
247b117cd09SVijay Mahadevan     //ierr = DMMoabIsEntityOnBoundary(dm1,ehandle,&eonbnd);CHKERRQ(ierr);
248b117cd09SVijay Mahadevan     ierr = DMMoabCheckBoundaryVertices(dm2,connc.size(),&connc[0],dbdry);CHKERRQ(ierr);
249b117cd09SVijay Mahadevan     eonbnd=PETSC_FALSE;
250*e882eb38SVijay Mahadevan     for (unsigned i=0; i< connc.size(); ++i)
251b117cd09SVijay Mahadevan       if (dbdry[i]) eonbnd=PETSC_TRUE;
252b117cd09SVijay Mahadevan 
253b117cd09SVijay Mahadevan     values_phi.clear();
254b117cd09SVijay Mahadevan     values_phi.resize(connp.size());
255b117cd09SVijay Mahadevan     /* apply dirichlet boundary conditions */
256b117cd09SVijay Mahadevan     if (eonbnd) {
257b117cd09SVijay Mahadevan 
258b117cd09SVijay Mahadevan       ierr = MatAssemblyBegin(*interpl,MAT_FLUSH_ASSEMBLY);CHKERRQ(ierr);
259b117cd09SVijay Mahadevan       ierr = MatAssemblyEnd(*interpl,MAT_FLUSH_ASSEMBLY);CHKERRQ(ierr);
260b117cd09SVijay Mahadevan       /* get the list of nodes on boundary so that we can enforce dirichlet conditions strongly */
261b117cd09SVijay Mahadevan       //ierr = DMMoabCheckBoundaryVertices(dm2,connc.size(),&connc[0],dbdry);CHKERRQ(ierr);
262*e882eb38SVijay Mahadevan       for (unsigned i=0; i < connc.size(); i++) {
263b117cd09SVijay Mahadevan         if (dmb2->hierarchy->is_boundary_vertex(connc[i])) {  /* dirichlet node */
264b117cd09SVijay Mahadevan           /* think about strongly imposing dirichlet */
265b117cd09SVijay Mahadevan           //bndrows.push_back(dofsc[i]);
266b117cd09SVijay Mahadevan 
267b117cd09SVijay Mahadevan           ierr = MatSetValues(*interpl, 1, &dofsc[i], connp.size(), &dofsp[0], &values_phi[0], INSERT_VALUES);CHKERRQ(ierr);
268b117cd09SVijay Mahadevan           //values_phi[0]=1.0;
269b117cd09SVijay Mahadevan           //ierr = MatSetValues(*interpl, 1, &dofsc[i], 1, &dofsc[i], &values_phi[0], INSERT_VALUES);CHKERRQ(ierr);
270b117cd09SVijay Mahadevan         }
271b117cd09SVijay Mahadevan       }
272b117cd09SVijay Mahadevan 
273b117cd09SVijay Mahadevan       ierr = MatAssemblyBegin(*interpl,MAT_FLUSH_ASSEMBLY);CHKERRQ(ierr);
274b117cd09SVijay Mahadevan       ierr = MatAssemblyEnd(*interpl,MAT_FLUSH_ASSEMBLY);CHKERRQ(ierr);
275b117cd09SVijay Mahadevan     }
276b117cd09SVijay Mahadevan 
277b117cd09SVijay Mahadevan     //get interpolation weights
278b117cd09SVijay Mahadevan     //ierr = Compute_Quad4_Basis(pcoords, 1, coord, values_phi);CHKERRQ(ierr);
279*e882eb38SVijay Mahadevan     // for (int j=0;j<dofs_per_element; j++)
280*e882eb38SVijay Mahadevan     //  std::cout<<"values "<<values_phi[j]<<std::endl;
281b117cd09SVijay Mahadevan 
282b117cd09SVijay Mahadevan     //get row and column indices, zero weights are ignored
283b117cd09SVijay Mahadevan     /*
284b117cd09SVijay Mahadevan     int nz_ind = 0;
285b117cd09SVijay Mahadevan     idx = dmb2->vowned->index(vhandle);
286b117cd09SVijay Mahadevan     for (int j=0;j<dofs_per_element; j++){
287b117cd09SVijay Mahadevan       idy[nz_ind] = dmb1->vowned->index(connectivity[j]);
288b117cd09SVijay 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]);
289b117cd09SVijay Mahadevan       //values_phi[nz_ind] = values_phi[j];
290b117cd09SVijay Mahadevan       nz_ind = nz_ind+1;
291b117cd09SVijay Mahadevan     }
292b117cd09SVijay Mahadevan     */
293b117cd09SVijay Mahadevan 
294b117cd09SVijay Mahadevan     //ierr = MatSetValues(*interpl, nz_ind, idy, 1, &idx, values_phi, INSERT_VALUES);CHKERRQ(ierr);
295b117cd09SVijay Mahadevan     //ierr = MatSetValues(*interpl, connp.size(), dofsp, connc.size(), dofsc, &values_phi[0], INSERT_VALUES);CHKERRQ(ierr);
296b117cd09SVijay Mahadevan   }
297b117cd09SVijay Mahadevan 
298b117cd09SVijay 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]);
299b117cd09SVijay Mahadevan   //ierr = MatZeroRows(*interpl, bndrows.size(), &bndrows[0], 1.0, 0, 0);CHKERRQ(ierr);
300b117cd09SVijay Mahadevan 
301b117cd09SVijay Mahadevan   ierr = MatAssemblyBegin(*interpl,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
302b117cd09SVijay Mahadevan   ierr = MatAssemblyEnd(*interpl,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
303b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
304b117cd09SVijay Mahadevan }
305b117cd09SVijay Mahadevan 
306b117cd09SVijay Mahadevan #undef __FUNCT__
307b117cd09SVijay Mahadevan #define __FUNCT__ "DMCreateInjection_Moab"
308b117cd09SVijay Mahadevan /*@
309b117cd09SVijay Mahadevan   DMCreateInjection_Moab - Generate a multi-level uniform refinement hierarchy
310b117cd09SVijay Mahadevan   by succesively refining a coarse mesh, already defined in the DM object
311b117cd09SVijay Mahadevan   provided by the user.
312b117cd09SVijay Mahadevan 
313b117cd09SVijay Mahadevan   Collective on MPI_Comm
314b117cd09SVijay Mahadevan 
315b117cd09SVijay Mahadevan   Input Parameter:
316b117cd09SVijay Mahadevan . dmb  - The DMMoab object
317b117cd09SVijay Mahadevan 
318b117cd09SVijay Mahadevan   Output Parameter:
319b117cd09SVijay Mahadevan . nlevels   - The number of levels of refinement needed to generate the hierarchy
320b117cd09SVijay Mahadevan + ldegrees  - The degree of refinement at each level in the hierarchy
321b117cd09SVijay Mahadevan 
322b117cd09SVijay Mahadevan   Level: beginner
323b117cd09SVijay Mahadevan 
324b117cd09SVijay Mahadevan .keywords: DMMoab, create, refinement
325b117cd09SVijay Mahadevan @*/
326b117cd09SVijay Mahadevan PetscErrorCode DMCreateInjection_Moab(DM dm1,DM dm2,VecScatter* ctx)
327b117cd09SVijay Mahadevan {
328*e882eb38SVijay Mahadevan   //DM_Moab        *dmmoab;
329b117cd09SVijay Mahadevan 
330b117cd09SVijay Mahadevan   PetscFunctionBegin;
331b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm1,DM_CLASSID,1);
332b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm2,DM_CLASSID,2);
333*e882eb38SVijay Mahadevan   //dmmoab = (DM_Moab*)(dm1)->data;
334b117cd09SVijay Mahadevan 
335b117cd09SVijay Mahadevan   PetscPrintf(PETSC_COMM_WORLD, "[DMCreateInjection_Moab] :: Placeholder\n");
336b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
337b117cd09SVijay Mahadevan }
338b117cd09SVijay Mahadevan 
339b117cd09SVijay Mahadevan 
340b117cd09SVijay Mahadevan #undef __FUNCT__
341b117cd09SVijay Mahadevan #define __FUNCT__ "DM_UMR_Moab_Private"
342b117cd09SVijay Mahadevan PetscErrorCode  DM_UMR_Moab_Private(DM dm,MPI_Comm comm,PetscBool refine,DM *dmref)
343b117cd09SVijay Mahadevan {
344b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
345*e882eb38SVijay Mahadevan   PetscInt        i,dim;
346b117cd09SVijay Mahadevan   DM              dm2;
347b117cd09SVijay Mahadevan   moab::ErrorCode merr;
348b117cd09SVijay Mahadevan   DM_Moab        *dmb = (DM_Moab*)dm->data,*dd2;
349b117cd09SVijay Mahadevan 
350b117cd09SVijay Mahadevan   PetscFunctionBegin;
351b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
352b117cd09SVijay Mahadevan   PetscValidPointer(dmref,4);
353b117cd09SVijay Mahadevan 
354b117cd09SVijay Mahadevan   if ( (dmb->hlevel == dmb->nhlevels && refine) || (dmb->hlevel == 0 && !refine) ) {
355*e882eb38SVijay 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);
356*e882eb38SVijay Mahadevan     if (dmb->hlevel-1 < 0 && !refine) PetscInfo1(NULL,"Invalid multigrid coarsen hierarchy level specified (%D). Creating a NULL object.\n",dmb->hlevel-1);
357*e882eb38SVijay Mahadevan     *dmref = PETSC_NULL;
358b117cd09SVijay Mahadevan     PetscFunctionReturn(0);
359b117cd09SVijay Mahadevan   }
360b117cd09SVijay Mahadevan 
361b117cd09SVijay Mahadevan   ierr = DMMoabCreate(PetscObjectComm((PetscObject)dm), &dm2);CHKERRQ(ierr);
362b117cd09SVijay Mahadevan   dd2 = (DM_Moab*)dm2->data;
363b117cd09SVijay Mahadevan 
364b117cd09SVijay Mahadevan   dd2->mbiface = dmb->mbiface;
365b117cd09SVijay Mahadevan   dd2->pcomm = dmb->pcomm;
366b117cd09SVijay Mahadevan   dd2->icreatedinstance = PETSC_FALSE;
367b117cd09SVijay Mahadevan 
368b117cd09SVijay Mahadevan   /* set the new level based on refinement/coarsening */
369b117cd09SVijay Mahadevan   if (refine) {
370b117cd09SVijay Mahadevan     dd2->hlevel=dmb->hlevel+1;
371b117cd09SVijay Mahadevan   }
372b117cd09SVijay Mahadevan   else {
373b117cd09SVijay Mahadevan     dd2->hlevel=dmb->hlevel-1;
374b117cd09SVijay Mahadevan   }
375b117cd09SVijay Mahadevan 
376b117cd09SVijay Mahadevan   /* Copy the multilevel hierarchy pointers in MOAB */
377b117cd09SVijay Mahadevan   dd2->hierarchy = dmb->hierarchy;
378b117cd09SVijay Mahadevan   dd2->nhlevels = dmb->nhlevels;
379b117cd09SVijay Mahadevan   ierr = PetscMalloc1(dd2->nhlevels+1,&dd2->hsets);CHKERRQ(ierr);
380b117cd09SVijay Mahadevan   for (i=0; i<=dd2->nhlevels; i++) {
381b117cd09SVijay Mahadevan     dd2->hsets[i]=dmb->hsets[i];
382b117cd09SVijay Mahadevan   }
383b117cd09SVijay Mahadevan   dd2->fileset = dd2->hsets[dd2->hlevel];
384b117cd09SVijay Mahadevan 
385b117cd09SVijay Mahadevan   /* do the remaining initializations for DMMoab */
386b117cd09SVijay Mahadevan   dd2->bs = dmb->bs;
387b117cd09SVijay Mahadevan   dd2->numFields = dmb->numFields;
388b117cd09SVijay Mahadevan   dd2->rw_dbglevel = dmb->rw_dbglevel;
389b117cd09SVijay Mahadevan   dd2->partition_by_rank = dmb->partition_by_rank;
390b117cd09SVijay Mahadevan   ierr = PetscStrcpy(dd2->extra_read_options, dmb->extra_read_options);CHKERRQ(ierr);
391b117cd09SVijay Mahadevan   ierr = PetscStrcpy(dd2->extra_write_options, dmb->extra_write_options);CHKERRQ(ierr);
392b117cd09SVijay Mahadevan   dd2->read_mode = dmb->read_mode;
393b117cd09SVijay Mahadevan   dd2->write_mode = dmb->write_mode;
394b117cd09SVijay Mahadevan 
395b117cd09SVijay Mahadevan   /* set global ID tag handle */
396b117cd09SVijay Mahadevan   ierr = DMMoabSetLocalToGlobalTag(dm2, dmb->ltog_tag);CHKERRQ(ierr);
397b117cd09SVijay Mahadevan 
398b117cd09SVijay Mahadevan   merr = dd2->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dd2->material_tag);MBERRNM(merr);
399b117cd09SVijay Mahadevan 
400b117cd09SVijay Mahadevan   ierr = DMSetOptionsPrefix(dm2,((PetscObject)dm)->prefix);CHKERRQ(ierr);
401b117cd09SVijay Mahadevan   ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr);
402b117cd09SVijay Mahadevan   ierr = DMSetDimension(dm2,dim);CHKERRQ(ierr);
403b117cd09SVijay Mahadevan 
404b117cd09SVijay Mahadevan   /* allow overloaded (user replaced) operations to be inherited by refinement clones */
405b117cd09SVijay Mahadevan   dm2->ops->creatematrix = dm->ops->creatematrix;
406b117cd09SVijay Mahadevan 
407b117cd09SVijay Mahadevan   /* copy fill information if given */
408b117cd09SVijay Mahadevan   ierr = DMMoabSetBlockFills(dm2, dmb->dfill, dmb->ofill);CHKERRQ(ierr);
409b117cd09SVijay Mahadevan 
410b117cd09SVijay Mahadevan   /* copy vector type information */
411b117cd09SVijay Mahadevan   ierr = DMSetMatType(dm2,dm->mattype);CHKERRQ(ierr);
412b117cd09SVijay Mahadevan   ierr = DMSetVecType(dm2,dm->vectype);CHKERRQ(ierr);
413b117cd09SVijay Mahadevan   ierr = DMMoabSetFieldNames(dm2,dmb->numFields,dmb->fieldNames);CHKERRQ(ierr);
414b117cd09SVijay Mahadevan 
415b117cd09SVijay Mahadevan   ierr = DMSetFromOptions(dm2);CHKERRQ(ierr);
416b117cd09SVijay Mahadevan 
417b117cd09SVijay Mahadevan   /* recreate Dof numbering for the refined DM and make sure the distribution is correctly populated */
418b117cd09SVijay Mahadevan   ierr = DMSetUp(dm2);CHKERRQ(ierr);
419b117cd09SVijay Mahadevan 
420b117cd09SVijay Mahadevan   *dmref = dm2;
421b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
422b117cd09SVijay Mahadevan }
423b117cd09SVijay Mahadevan 
424b117cd09SVijay Mahadevan 
425b117cd09SVijay Mahadevan #undef __FUNCT__
426b117cd09SVijay Mahadevan #define __FUNCT__ "DMRefine_Moab"
427b117cd09SVijay Mahadevan /*@
428b117cd09SVijay Mahadevan   DMRefine_Moab - Generate a multi-level uniform refinement hierarchy
429b117cd09SVijay Mahadevan   by succesively refining a coarse mesh, already defined in the DM object
430b117cd09SVijay Mahadevan   provided by the user.
431b117cd09SVijay Mahadevan 
432*e882eb38SVijay Mahadevan   Collective on DM
433b117cd09SVijay Mahadevan 
434b117cd09SVijay Mahadevan   Input Parameter:
435*e882eb38SVijay Mahadevan + dm  - The DMMoab object
436*e882eb38SVijay Mahadevan - comm - the communicator to contain the new DM object (or MPI_COMM_NULL)
437b117cd09SVijay Mahadevan 
438b117cd09SVijay Mahadevan   Output Parameter:
439*e882eb38SVijay Mahadevan . dmf - the refined DM, or NULL
440b117cd09SVijay Mahadevan 
441*e882eb38SVijay Mahadevan   Note: If no refinement was done, the return value is NULL
442*e882eb38SVijay Mahadevan 
443*e882eb38SVijay Mahadevan   Level: developer
444b117cd09SVijay Mahadevan 
445b117cd09SVijay Mahadevan .keywords: DMMoab, create, refinement
446b117cd09SVijay Mahadevan @*/
447b117cd09SVijay Mahadevan PetscErrorCode DMRefine_Moab(DM dm,MPI_Comm comm,DM* dmf)
448b117cd09SVijay Mahadevan {
449b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
450b117cd09SVijay Mahadevan 
451b117cd09SVijay Mahadevan   PetscFunctionBegin;
452b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
453b117cd09SVijay Mahadevan 
454b117cd09SVijay Mahadevan   ierr = DM_UMR_Moab_Private(dm,comm,PETSC_TRUE,dmf);CHKERRQ(ierr);
455b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
456b117cd09SVijay Mahadevan }
457b117cd09SVijay Mahadevan 
458b117cd09SVijay Mahadevan #undef __FUNCT__
459b117cd09SVijay Mahadevan #define __FUNCT__ "DMCoarsen_Moab"
460b117cd09SVijay Mahadevan /*@
461b117cd09SVijay Mahadevan   DMCoarsen_Moab - Generate a multi-level uniform refinement hierarchy
462b117cd09SVijay Mahadevan   by succesively refining a coarse mesh, already defined in the DM object
463b117cd09SVijay Mahadevan   provided by the user.
464b117cd09SVijay Mahadevan 
465*e882eb38SVijay Mahadevan   Collective on DM
466b117cd09SVijay Mahadevan 
467b117cd09SVijay Mahadevan   Input Parameter:
468*e882eb38SVijay Mahadevan . dm  - The DMMoab object
469*e882eb38SVijay Mahadevan - comm - the communicator to contain the new DM object (or MPI_COMM_NULL)
470b117cd09SVijay Mahadevan 
471b117cd09SVijay Mahadevan   Output Parameter:
472*e882eb38SVijay Mahadevan . dmf - the coarsened DM, or NULL
473b117cd09SVijay Mahadevan 
474*e882eb38SVijay Mahadevan   Note: If no coarsening was done, the return value is NULL
475b117cd09SVijay Mahadevan 
476*e882eb38SVijay Mahadevan   Level: developer
477*e882eb38SVijay Mahadevan 
478*e882eb38SVijay Mahadevan .keywords: DMMoab, create, coarsening
479b117cd09SVijay Mahadevan @*/
480b117cd09SVijay Mahadevan PetscErrorCode DMCoarsen_Moab(DM dm,MPI_Comm comm,DM* dmc)
481b117cd09SVijay Mahadevan {
482b117cd09SVijay Mahadevan   PetscErrorCode  ierr;
483b117cd09SVijay Mahadevan 
484b117cd09SVijay Mahadevan   PetscFunctionBegin;
485b117cd09SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
486b117cd09SVijay Mahadevan 
487b117cd09SVijay Mahadevan   ierr = DM_UMR_Moab_Private(dm,comm,PETSC_FALSE,dmc);CHKERRQ(ierr);
488b117cd09SVijay Mahadevan   PetscFunctionReturn(0);
489b117cd09SVijay Mahadevan }
490