13a19ef87SMatthew G Knepley #include <petsc-private/patchimpl.h> /*I "petscdmpatch.h" I*/ 23a19ef87SMatthew G Knepley #include <petscdmda.h> 33a19ef87SMatthew G Knepley 45ee0e871SMatthew G Knepley /* 55ee0e871SMatthew G Knepley Solver loop to update \tau: 65ee0e871SMatthew G Knepley 75ee0e871SMatthew G Knepley DMZoom(dmc, &dmz) 85ee0e871SMatthew G Knepley DMRefine(dmz, &dmf), 95ee0e871SMatthew G Knepley Scatter Xcoarse -> Xzoom, 105ee0e871SMatthew G Knepley Interpolate Xzoom -> Xfine (note that this may be on subcomms), 115ee0e871SMatthew G Knepley Smooth Xfine using two-step smoother 125ee0e871SMatthew G Knepley normal smoother plus Kaczmarz---moves back and forth from dmzoom to dmfine 135ee0e871SMatthew G Knepley Compute residual Rfine 145ee0e871SMatthew G Knepley Restrict Rfine to Rzoom_restricted 155ee0e871SMatthew G Knepley Scatter Rzoom_restricted -> Rcoarse_restricted 165ee0e871SMatthew G Knepley Compute global residual Rcoarse 175ee0e871SMatthew G Knepley TauCoarse = Rcoarse - Rcoarse_restricted 185ee0e871SMatthew G Knepley */ 195ee0e871SMatthew G Knepley 203a19ef87SMatthew G Knepley #undef __FUNCT__ 2159583ba0SMatthew G Knepley #define __FUNCT__ "DMPatchZoom" 2259583ba0SMatthew G Knepley /* 2359583ba0SMatthew G Knepley DMPatchZoom - Create a version of the coarse patch (identified by rank) with halo on communicator commz 2459583ba0SMatthew G Knepley 25*a487c981SJed Brown Collective on DM 26*a487c981SJed Brown 2759583ba0SMatthew G Knepley Input Parameters: 2859583ba0SMatthew G Knepley + dm - the DM 2959583ba0SMatthew G Knepley . rank - the rank which holds the given patch 3059583ba0SMatthew G Knepley - commz - the new communicator for the patch 3159583ba0SMatthew G Knepley 3259583ba0SMatthew G Knepley Output Parameters: 3359583ba0SMatthew G Knepley + dmz - the patch DM 3459583ba0SMatthew G Knepley . sfz - the PetscSF mapping the patch+halo to the zoomed version 3559583ba0SMatthew G Knepley . sfzr - the PetscSF mapping the patch to the restricted zoomed version 3659583ba0SMatthew G Knepley 3759583ba0SMatthew G Knepley Level: intermediate 3859583ba0SMatthew G Knepley 3959583ba0SMatthew G Knepley Note: All processes in commz should have the same rank (could autosplit comm) 4059583ba0SMatthew G Knepley 4159583ba0SMatthew G Knepley .seealso: DMPatchSolve() 4259583ba0SMatthew G Knepley */ 4359583ba0SMatthew G Knepley PetscErrorCode DMPatchZoom(DM dm, PetscInt rank, MPI_Comm commz, DM *dmz, PetscSF *sfz, PetscSF *sfzr) 4459583ba0SMatthew G Knepley { 45155e3834SMatthew G Knepley #if 0 4659583ba0SMatthew G Knepley PetscInt dim, dof, sw; 4759583ba0SMatthew G Knepley DMDAStencilType st; 4859583ba0SMatthew G Knepley PetscErrorCode ierr; 49155e3834SMatthew G Knepley #endif 5059583ba0SMatthew G Knepley 5159583ba0SMatthew G Knepley PetscFunctionBegin; 5245a1265cSMatthew G Knepley #if 0 5359583ba0SMatthew G Knepley if (commz == MPI_COMM_NULL) { 5459583ba0SMatthew G Knepley /* Split communicator */ 5559583ba0SMatthew G Knepley SETERRQ(((PetscObject) dm)->comm, PETSC_ERR_SUP, "Not implemented"); 5659583ba0SMatthew G Knepley } 5759583ba0SMatthew G Knepley /* Create patch DM */ 5859583ba0SMatthew G Knepley ierr = DMDAGetDim(dm, &dim);CHKERRQ(ierr); 5959583ba0SMatthew G Knepley ierr = DMDAGetDof(dm, &dof);CHKERRQ(ierr); 6059583ba0SMatthew G Knepley ierr = DMDAGetStencilType(dm, &st);CHKERRQ(ierr); 6159583ba0SMatthew G Knepley ierr = DMDAGetStencilWidth(dm, &sw);CHKERRQ(ierr); 6259583ba0SMatthew G Knepley 6359583ba0SMatthew G Knepley ierr = DMDACreate(commz, dmz);CHKERRQ(ierr); 6459583ba0SMatthew G Knepley ierr = DMDASetDim(*dmz, dim);CHKERRQ(ierr); 6559583ba0SMatthew G Knepley ierr = DMDASetSizes(*da, M, N, 1);CHKERRQ(ierr); 6659583ba0SMatthew G Knepley ierr = DMDASetNumProcs(*dmz, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE);CHKERRQ(ierr); 6759583ba0SMatthew G Knepley ierr = DMDASetBoundaryType(*dmz, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE);CHKERRQ(ierr); 6859583ba0SMatthew G Knepley ierr = DMDASetDof(*dmz, dof);CHKERRQ(ierr); 6959583ba0SMatthew G Knepley ierr = DMDASetStencilType(*dmz, st);CHKERRQ(ierr); 7059583ba0SMatthew G Knepley ierr = DMDASetStencilWidth(*dmz, sw);CHKERRQ(ierr); 7159583ba0SMatthew G Knepley ierr = DMDASetOwnershipRanges(*dmz, PETSC_NULL, PETSC_NULL, PETSC_NULL);CHKERRQ(ierr); 7259583ba0SMatthew G Knepley ierr = DMSetFromOptions(*dmz);CHKERRQ(ierr); 7359583ba0SMatthew G Knepley ierr = DMSetUp(*dmz);CHKERRQ(ierr); 7459583ba0SMatthew G Knepley /* Create SF for ghosted map */ 7559583ba0SMatthew G Knepley /* Create SF for restricted map */ 7645a1265cSMatthew G Knepley #endif 7759583ba0SMatthew G Knepley PetscFunctionReturn(0); 7859583ba0SMatthew G Knepley } 7959583ba0SMatthew G Knepley 8059583ba0SMatthew G Knepley #undef __FUNCT__ 8159583ba0SMatthew G Knepley #define __FUNCT__ "DMPatchSolve" 8259583ba0SMatthew G Knepley PetscErrorCode DMPatchSolve(DM dm) 8359583ba0SMatthew G Knepley { 84155e3834SMatthew G Knepley #if 0 8559583ba0SMatthew G Knepley MPI_Comm comm = ((PetscObject) dm)->comm; 8659583ba0SMatthew G Knepley PetscMPIInt size; 8759583ba0SMatthew G Knepley PetscErrorCode ierr; 88155e3834SMatthew G Knepley #endif 8959583ba0SMatthew G Knepley 9059583ba0SMatthew G Knepley PetscFunctionBegin; 9145a1265cSMatthew G Knepley #if 0 9259583ba0SMatthew G Knepley ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 9359583ba0SMatthew G Knepley for(r = 0; r < size; ++r) { 9459583ba0SMatthew G Knepley DM dmz, dmf; 9559583ba0SMatthew G Knepley Mat interpz; 9659583ba0SMatthew G Knepley 9759583ba0SMatthew G Knepley ierr = DMPatchZoom(dm, r, comm, &dmz);CHKERRQ(ierr); 9859583ba0SMatthew G Knepley /* Scatter Xcoarse -> Xzoom */ 9959583ba0SMatthew G Knepley ierr = PetscSFBcastBegin(sfz, MPIU_SCALAR, xcarray, xzarray);CHKERRQ(ierr); 10059583ba0SMatthew G Knepley ierr = PetscSFBcastEnd(sfz, MPIU_SCALAR, xcarray, xzarray);CHKERRQ(ierr); 10159583ba0SMatthew G Knepley /* Interpolate Xzoom -> Xfine, note that this may be on subcomms */ 10259583ba0SMatthew G Knepley ierr = DMRefine(dmz, MPI_COMM_NULL, &dmf);CHKERRQ(ierr); 10359583ba0SMatthew G Knepley ierr = DMCreateInterpolation(dmz, dmf, &interpz, PETSC_NULL);CHKERRQ(ierr); 10459583ba0SMatthew G Knepley ierr = DMInterpolate(dmz, interpz, dmf);CHKERRQ(ierr); 10559583ba0SMatthew G Knepley /* Smooth Xfine using two-step smoother, normal smoother plus Kaczmarz---moves back and forth from dmzoom to dmfine */ 10659583ba0SMatthew G Knepley /* Compute residual Rfine */ 10759583ba0SMatthew G Knepley /* Restrict Rfine to Rzoom_restricted */ 10859583ba0SMatthew G Knepley /* Scatter Rzoom_restricted -> Rcoarse_restricted */ 10959583ba0SMatthew G Knepley ierr = PetscSFBcastBegin(sfzr, MPIU_SCALAR, xzarray, xcarray, MPI_SUM);CHKERRQ(ierr); 11059583ba0SMatthew G Knepley ierr = PetscSFBcastEnd(sfzr, MPIU_SCALAR, xzarray, xcarray, MPI_SUM);CHKERRQ(ierr); 11159583ba0SMatthew G Knepley /* Compute global residual Rcoarse */ 11259583ba0SMatthew G Knepley /* TauCoarse = Rcoarse - Rcoarse_restricted */ 11359583ba0SMatthew G Knepley } 11445a1265cSMatthew G Knepley #endif 11559583ba0SMatthew G Knepley PetscFunctionReturn(0); 11659583ba0SMatthew G Knepley } 11759583ba0SMatthew G Knepley 11859583ba0SMatthew G Knepley #undef __FUNCT__ 1193a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchView_Ascii" 1203a19ef87SMatthew G Knepley PetscErrorCode DMPatchView_Ascii(DM dm, PetscViewer viewer) 1213a19ef87SMatthew G Knepley { 1223a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 1233a19ef87SMatthew G Knepley PetscViewerFormat format; 1243a19ef87SMatthew G Knepley PetscInt p; 1253a19ef87SMatthew G Knepley PetscErrorCode ierr; 1263a19ef87SMatthew G Knepley 1273a19ef87SMatthew G Knepley PetscFunctionBegin; 1283a19ef87SMatthew G Knepley ierr = PetscViewerGetFormat(viewer, &format);CHKERRQ(ierr); 1293a19ef87SMatthew G Knepley /* if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) */ 1303a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "%D patches\n", mesh->numPatches);CHKERRQ(ierr); 1313a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 1323a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1333a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "Patch %D\n", p);CHKERRQ(ierr); 1343a19ef87SMatthew G Knepley ierr = DMView(mesh->patches[p], viewer);CHKERRQ(ierr); 1353a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1363a19ef87SMatthew G Knepley } 1373a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1383a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "Coarse DM\n");CHKERRQ(ierr); 1393a19ef87SMatthew G Knepley ierr = DMView(mesh->dmCoarse, viewer);CHKERRQ(ierr); 1403a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1413a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1423a19ef87SMatthew G Knepley } 1433a19ef87SMatthew G Knepley 1443a19ef87SMatthew G Knepley #undef __FUNCT__ 1453a19ef87SMatthew G Knepley #define __FUNCT__ "DMView_Patch" 1463a19ef87SMatthew G Knepley PetscErrorCode DMView_Patch(DM dm, PetscViewer viewer) 1473a19ef87SMatthew G Knepley { 1483a19ef87SMatthew G Knepley PetscBool iascii, isbinary; 1493a19ef87SMatthew G Knepley PetscErrorCode ierr; 1503a19ef87SMatthew G Knepley 1513a19ef87SMatthew G Knepley PetscFunctionBegin; 1523a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1533a19ef87SMatthew G Knepley PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 1543a19ef87SMatthew G Knepley ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 1553a19ef87SMatthew G Knepley ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERBINARY, &isbinary);CHKERRQ(ierr); 1563a19ef87SMatthew G Knepley if (iascii) { 1573a19ef87SMatthew G Knepley ierr = DMPatchView_Ascii(dm, viewer);CHKERRQ(ierr); 1583a19ef87SMatthew G Knepley #if 0 1593a19ef87SMatthew G Knepley } else if (isbinary) { 1603a19ef87SMatthew G Knepley ierr = DMPatchView_Binary(dm, viewer);CHKERRQ(ierr); 1613a19ef87SMatthew G Knepley #endif 1623a19ef87SMatthew G Knepley } else SETERRQ1(((PetscObject)viewer)->comm,PETSC_ERR_SUP,"Viewer type %s not supported by this mesh object", ((PetscObject)viewer)->type_name); 1633a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1643a19ef87SMatthew G Knepley } 1653a19ef87SMatthew G Knepley 1663a19ef87SMatthew G Knepley #undef __FUNCT__ 1673a19ef87SMatthew G Knepley #define __FUNCT__ "DMDestroy_Patch" 1683a19ef87SMatthew G Knepley PetscErrorCode DMDestroy_Patch(DM dm) 1693a19ef87SMatthew G Knepley { 1703a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 1713a19ef87SMatthew G Knepley PetscInt p; 1723a19ef87SMatthew G Knepley PetscErrorCode ierr; 1733a19ef87SMatthew G Knepley 1743a19ef87SMatthew G Knepley PetscFunctionBegin; 1753a19ef87SMatthew G Knepley if (--mesh->refct > 0) {PetscFunctionReturn(0);} 1763a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 1773a19ef87SMatthew G Knepley ierr = DMDestroy(&mesh->patches[p]);CHKERRQ(ierr); 1783a19ef87SMatthew G Knepley } 1793a19ef87SMatthew G Knepley ierr = PetscFree(mesh->patches);CHKERRQ(ierr); 1803a19ef87SMatthew G Knepley ierr = DMDestroy(&mesh->dmCoarse);CHKERRQ(ierr); 1813a19ef87SMatthew G Knepley /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */ 1823a19ef87SMatthew G Knepley ierr = PetscFree(mesh);CHKERRQ(ierr); 1833a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1843a19ef87SMatthew G Knepley } 1853a19ef87SMatthew G Knepley 1863a19ef87SMatthew G Knepley #undef __FUNCT__ 1873a19ef87SMatthew G Knepley #define __FUNCT__ "DMSetUp_Patch" 1883a19ef87SMatthew G Knepley PetscErrorCode DMSetUp_Patch(DM dm) 1893a19ef87SMatthew G Knepley { 1903a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 1913a19ef87SMatthew G Knepley PetscInt p; 1923a19ef87SMatthew G Knepley PetscErrorCode ierr; 1933a19ef87SMatthew G Knepley 1943a19ef87SMatthew G Knepley PetscFunctionBegin; 1953a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1963a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 1973a19ef87SMatthew G Knepley ierr = DMSetUp(mesh->patches[p]);CHKERRQ(ierr); 1983a19ef87SMatthew G Knepley } 1993a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2003a19ef87SMatthew G Knepley } 2013a19ef87SMatthew G Knepley 2023a19ef87SMatthew G Knepley #undef __FUNCT__ 2033a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateGlobalVector_Patch" 2043a19ef87SMatthew G Knepley PetscErrorCode DMCreateGlobalVector_Patch(DM dm, Vec *g) 2053a19ef87SMatthew G Knepley { 2063a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 2073a19ef87SMatthew G Knepley PetscErrorCode ierr; 2083a19ef87SMatthew G Knepley 2093a19ef87SMatthew G Knepley PetscFunctionBegin; 2103a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2116d1defb0SMatthew G Knepley ierr = DMCreateGlobalVector(mesh->patches[mesh->activePatch], g);CHKERRQ(ierr); 2123a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2133a19ef87SMatthew G Knepley } 2143a19ef87SMatthew G Knepley 2153a19ef87SMatthew G Knepley #undef __FUNCT__ 2163a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateLocalVector_Patch" 2173a19ef87SMatthew G Knepley PetscErrorCode DMCreateLocalVector_Patch(DM dm, Vec *l) 2183a19ef87SMatthew G Knepley { 2193a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 2203a19ef87SMatthew G Knepley PetscErrorCode ierr; 2213a19ef87SMatthew G Knepley 2223a19ef87SMatthew G Knepley PetscFunctionBegin; 2233a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2246d1defb0SMatthew G Knepley ierr = DMCreateLocalVector(mesh->patches[mesh->activePatch], l);CHKERRQ(ierr); 2253a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2263a19ef87SMatthew G Knepley } 2273a19ef87SMatthew G Knepley 2283a19ef87SMatthew G Knepley #undef __FUNCT__ 2293a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchGetActivePatch" 2303a19ef87SMatthew G Knepley PetscErrorCode DMPatchGetActivePatch(DM dm, PetscInt *patch) 2313a19ef87SMatthew G Knepley { 2323a19ef87SMatthew G Knepley DM_Patch *mesh; 2333a19ef87SMatthew G Knepley 2343a19ef87SMatthew G Knepley PetscFunctionBegin; 2353a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2363a19ef87SMatthew G Knepley PetscValidPointer(patch, 2); 2373a19ef87SMatthew G Knepley mesh = (DM_Patch *) dm->data; 2383a19ef87SMatthew G Knepley *patch = mesh->activePatch; 2393a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2403a19ef87SMatthew G Knepley } 2413a19ef87SMatthew G Knepley 2423a19ef87SMatthew G Knepley #undef __FUNCT__ 2433a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchSetActivePatch" 2443a19ef87SMatthew G Knepley PetscErrorCode DMPatchSetActivePatch(DM dm, PetscInt patch) 2453a19ef87SMatthew G Knepley { 2463a19ef87SMatthew G Knepley DM_Patch *mesh; 2473a19ef87SMatthew G Knepley 2483a19ef87SMatthew G Knepley PetscFunctionBegin; 2493a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2503a19ef87SMatthew G Knepley mesh = (DM_Patch *) dm->data; 2513a19ef87SMatthew G Knepley mesh->activePatch = patch; 2523a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2533a19ef87SMatthew G Knepley } 2543a19ef87SMatthew G Knepley 2553a19ef87SMatthew G Knepley #undef __FUNCT__ 2563a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateSubDM_Patch" 2573a19ef87SMatthew G Knepley PetscErrorCode DMCreateSubDM_Patch(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm) 2583a19ef87SMatthew G Knepley { 2593a19ef87SMatthew G Knepley PetscFunctionBegin; 2603a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2613a19ef87SMatthew G Knepley SETERRQ(((PetscObject) dm)->comm, PETSC_ERR_SUP, "Tell me to code this"); 2623a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2633a19ef87SMatthew G Knepley } 264