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