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 25a487c981SJed Brown Collective on DM 26a487c981SJed 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 { 45*a07761baSMatthew G Knepley const PetscInt *lx, *ly, *lz; 4659583ba0SMatthew G Knepley PetscInt dim, dof, sw; 47*a07761baSMatthew G Knepley PetscInt M, N, P, rM, rN, rP, halo; 4859583ba0SMatthew G Knepley DMDAStencilType st; 4959583ba0SMatthew G Knepley PetscErrorCode ierr; 5059583ba0SMatthew G Knepley 5159583ba0SMatthew G Knepley PetscFunctionBegin; 5259583ba0SMatthew G Knepley if (commz == MPI_COMM_NULL) { 5359583ba0SMatthew G Knepley /* Split communicator */ 5459583ba0SMatthew G Knepley SETERRQ(((PetscObject) dm)->comm, PETSC_ERR_SUP, "Not implemented"); 5559583ba0SMatthew G Knepley } 5659583ba0SMatthew G Knepley /* Create patch DM */ 57*a07761baSMatthew G Knepley ierr = DMDAGetInfo(dm, &dim, &M, &N, &P, 0,0,0, &dof, &sw,0,0,0, &st);CHKERRQ(ierr); 58*a07761baSMatthew G Knepley halo = sw; 59*a07761baSMatthew G Knepley 60*a07761baSMatthew G Knepley /* Get piece for rank r, expanded by halo */ 61*a07761baSMatthew G Knepley ierr = DMDAGetOwnershipRanges(dm, &lx, &ly, &lz);CHKERRQ(ierr); 62*a07761baSMatthew G Knepley rM = PetscMin(M, lx[rank+1] - halo) - PetscMax(lx[rank] - halo, 0); 63*a07761baSMatthew G Knepley rN = PetscMin(N, ly[rank+1] - halo) - PetscMax(ly[rank] - halo, 0); 64*a07761baSMatthew G Knepley rP = PetscMin(P, lz[rank+1] - halo) - PetscMax(lz[rank] - halo, 0); 6559583ba0SMatthew G Knepley 6659583ba0SMatthew G Knepley ierr = DMDACreate(commz, dmz);CHKERRQ(ierr); 6759583ba0SMatthew G Knepley ierr = DMDASetDim(*dmz, dim);CHKERRQ(ierr); 68*a07761baSMatthew G Knepley ierr = DMDASetSizes(*dmz, rM, rN, rP);CHKERRQ(ierr); 6959583ba0SMatthew G Knepley ierr = DMDASetNumProcs(*dmz, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE);CHKERRQ(ierr); 7059583ba0SMatthew G Knepley ierr = DMDASetBoundaryType(*dmz, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE);CHKERRQ(ierr); 7159583ba0SMatthew G Knepley ierr = DMDASetDof(*dmz, dof);CHKERRQ(ierr); 7259583ba0SMatthew G Knepley ierr = DMDASetStencilType(*dmz, st);CHKERRQ(ierr); 7359583ba0SMatthew G Knepley ierr = DMDASetStencilWidth(*dmz, sw);CHKERRQ(ierr); 7459583ba0SMatthew G Knepley ierr = DMDASetOwnershipRanges(*dmz, PETSC_NULL, PETSC_NULL, PETSC_NULL);CHKERRQ(ierr); 7559583ba0SMatthew G Knepley ierr = DMSetFromOptions(*dmz);CHKERRQ(ierr); 7659583ba0SMatthew G Knepley ierr = DMSetUp(*dmz);CHKERRQ(ierr); 7759583ba0SMatthew G Knepley /* Create SF for ghosted map */ 7859583ba0SMatthew G Knepley /* Create SF for restricted map */ 7959583ba0SMatthew G Knepley PetscFunctionReturn(0); 8059583ba0SMatthew G Knepley } 8159583ba0SMatthew G Knepley 8259583ba0SMatthew G Knepley #undef __FUNCT__ 8359583ba0SMatthew G Knepley #define __FUNCT__ "DMPatchSolve" 8459583ba0SMatthew G Knepley PetscErrorCode DMPatchSolve(DM dm) 8559583ba0SMatthew G Knepley { 8659583ba0SMatthew G Knepley MPI_Comm comm = ((PetscObject) dm)->comm; 87*a07761baSMatthew G Knepley PetscSF sfz, sfr; 88*a07761baSMatthew G Knepley PetscInt r; 8959583ba0SMatthew G Knepley PetscMPIInt size; 9059583ba0SMatthew G Knepley PetscErrorCode ierr; 9159583ba0SMatthew G Knepley 9259583ba0SMatthew G Knepley PetscFunctionBegin; 9359583ba0SMatthew G Knepley ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 9459583ba0SMatthew G Knepley for(r = 0; r < size; ++r) { 95*a07761baSMatthew G Knepley DM dmz; 9659583ba0SMatthew G Knepley 97*a07761baSMatthew G Knepley ierr = DMPatchZoom(dm, r, comm, &dmz, &sfz, &sfr);CHKERRQ(ierr); 98*a07761baSMatthew G Knepley #if 0 99*a07761baSMatthew G Knepley DM dmf; 100*a07761baSMatthew G Knepley Mat interpz; 10159583ba0SMatthew G Knepley /* Scatter Xcoarse -> Xzoom */ 10259583ba0SMatthew G Knepley ierr = PetscSFBcastBegin(sfz, MPIU_SCALAR, xcarray, xzarray);CHKERRQ(ierr); 10359583ba0SMatthew G Knepley ierr = PetscSFBcastEnd(sfz, MPIU_SCALAR, xcarray, xzarray);CHKERRQ(ierr); 10459583ba0SMatthew G Knepley /* Interpolate Xzoom -> Xfine, note that this may be on subcomms */ 10559583ba0SMatthew G Knepley ierr = DMRefine(dmz, MPI_COMM_NULL, &dmf);CHKERRQ(ierr); 10659583ba0SMatthew G Knepley ierr = DMCreateInterpolation(dmz, dmf, &interpz, PETSC_NULL);CHKERRQ(ierr); 10759583ba0SMatthew G Knepley ierr = DMInterpolate(dmz, interpz, dmf);CHKERRQ(ierr); 10859583ba0SMatthew G Knepley /* Smooth Xfine using two-step smoother, normal smoother plus Kaczmarz---moves back and forth from dmzoom to dmfine */ 10959583ba0SMatthew G Knepley /* Compute residual Rfine */ 11059583ba0SMatthew G Knepley /* Restrict Rfine to Rzoom_restricted */ 11159583ba0SMatthew G Knepley /* Scatter Rzoom_restricted -> Rcoarse_restricted */ 11259583ba0SMatthew G Knepley ierr = PetscSFBcastBegin(sfzr, MPIU_SCALAR, xzarray, xcarray, MPI_SUM);CHKERRQ(ierr); 11359583ba0SMatthew G Knepley ierr = PetscSFBcastEnd(sfzr, MPIU_SCALAR, xzarray, xcarray, MPI_SUM);CHKERRQ(ierr); 11459583ba0SMatthew G Knepley /* Compute global residual Rcoarse */ 11559583ba0SMatthew G Knepley /* TauCoarse = Rcoarse - Rcoarse_restricted */ 11645a1265cSMatthew G Knepley #endif 117*a07761baSMatthew G Knepley } 11859583ba0SMatthew G Knepley PetscFunctionReturn(0); 11959583ba0SMatthew G Knepley } 12059583ba0SMatthew G Knepley 12159583ba0SMatthew G Knepley #undef __FUNCT__ 1223a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchView_Ascii" 1233a19ef87SMatthew G Knepley PetscErrorCode DMPatchView_Ascii(DM dm, PetscViewer viewer) 1243a19ef87SMatthew G Knepley { 1253a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 1263a19ef87SMatthew G Knepley PetscViewerFormat format; 1273a19ef87SMatthew G Knepley PetscInt p; 1283a19ef87SMatthew G Knepley PetscErrorCode ierr; 1293a19ef87SMatthew G Knepley 1303a19ef87SMatthew G Knepley PetscFunctionBegin; 1313a19ef87SMatthew G Knepley ierr = PetscViewerGetFormat(viewer, &format);CHKERRQ(ierr); 1323a19ef87SMatthew G Knepley /* if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) */ 1333a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "%D patches\n", mesh->numPatches);CHKERRQ(ierr); 1343a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 1353a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1363a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "Patch %D\n", p);CHKERRQ(ierr); 1373a19ef87SMatthew G Knepley ierr = DMView(mesh->patches[p], viewer);CHKERRQ(ierr); 1383a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1393a19ef87SMatthew G Knepley } 1403a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1413a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "Coarse DM\n");CHKERRQ(ierr); 1423a19ef87SMatthew G Knepley ierr = DMView(mesh->dmCoarse, viewer);CHKERRQ(ierr); 1433a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1443a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1453a19ef87SMatthew G Knepley } 1463a19ef87SMatthew G Knepley 1473a19ef87SMatthew G Knepley #undef __FUNCT__ 1483a19ef87SMatthew G Knepley #define __FUNCT__ "DMView_Patch" 1493a19ef87SMatthew G Knepley PetscErrorCode DMView_Patch(DM dm, PetscViewer viewer) 1503a19ef87SMatthew G Knepley { 1513a19ef87SMatthew G Knepley PetscBool iascii, isbinary; 1523a19ef87SMatthew G Knepley PetscErrorCode ierr; 1533a19ef87SMatthew G Knepley 1543a19ef87SMatthew G Knepley PetscFunctionBegin; 1553a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1563a19ef87SMatthew G Knepley PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 1573a19ef87SMatthew G Knepley ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 1583a19ef87SMatthew G Knepley ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERBINARY, &isbinary);CHKERRQ(ierr); 1593a19ef87SMatthew G Knepley if (iascii) { 1603a19ef87SMatthew G Knepley ierr = DMPatchView_Ascii(dm, viewer);CHKERRQ(ierr); 1613a19ef87SMatthew G Knepley #if 0 1623a19ef87SMatthew G Knepley } else if (isbinary) { 1633a19ef87SMatthew G Knepley ierr = DMPatchView_Binary(dm, viewer);CHKERRQ(ierr); 1643a19ef87SMatthew G Knepley #endif 1653a19ef87SMatthew G Knepley } else SETERRQ1(((PetscObject)viewer)->comm,PETSC_ERR_SUP,"Viewer type %s not supported by this mesh object", ((PetscObject)viewer)->type_name); 1663a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1673a19ef87SMatthew G Knepley } 1683a19ef87SMatthew G Knepley 1693a19ef87SMatthew G Knepley #undef __FUNCT__ 1703a19ef87SMatthew G Knepley #define __FUNCT__ "DMDestroy_Patch" 1713a19ef87SMatthew G Knepley PetscErrorCode DMDestroy_Patch(DM dm) 1723a19ef87SMatthew G Knepley { 1733a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 1743a19ef87SMatthew G Knepley PetscInt p; 1753a19ef87SMatthew G Knepley PetscErrorCode ierr; 1763a19ef87SMatthew G Knepley 1773a19ef87SMatthew G Knepley PetscFunctionBegin; 1783a19ef87SMatthew G Knepley if (--mesh->refct > 0) {PetscFunctionReturn(0);} 1793a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 1803a19ef87SMatthew G Knepley ierr = DMDestroy(&mesh->patches[p]);CHKERRQ(ierr); 1813a19ef87SMatthew G Knepley } 1823a19ef87SMatthew G Knepley ierr = PetscFree(mesh->patches);CHKERRQ(ierr); 1833a19ef87SMatthew G Knepley ierr = DMDestroy(&mesh->dmCoarse);CHKERRQ(ierr); 1843a19ef87SMatthew G Knepley /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */ 1853a19ef87SMatthew G Knepley ierr = PetscFree(mesh);CHKERRQ(ierr); 1863a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1873a19ef87SMatthew G Knepley } 1883a19ef87SMatthew G Knepley 1893a19ef87SMatthew G Knepley #undef __FUNCT__ 1903a19ef87SMatthew G Knepley #define __FUNCT__ "DMSetUp_Patch" 1913a19ef87SMatthew G Knepley PetscErrorCode DMSetUp_Patch(DM dm) 1923a19ef87SMatthew G Knepley { 1933a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 1943a19ef87SMatthew G Knepley PetscInt p; 1953a19ef87SMatthew G Knepley PetscErrorCode ierr; 1963a19ef87SMatthew G Knepley 1973a19ef87SMatthew G Knepley PetscFunctionBegin; 1983a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1993a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 2003a19ef87SMatthew G Knepley ierr = DMSetUp(mesh->patches[p]);CHKERRQ(ierr); 2013a19ef87SMatthew G Knepley } 2023a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2033a19ef87SMatthew G Knepley } 2043a19ef87SMatthew G Knepley 2053a19ef87SMatthew G Knepley #undef __FUNCT__ 2063a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateGlobalVector_Patch" 2073a19ef87SMatthew G Knepley PetscErrorCode DMCreateGlobalVector_Patch(DM dm, Vec *g) 2083a19ef87SMatthew G Knepley { 2093a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 2103a19ef87SMatthew G Knepley PetscErrorCode ierr; 2113a19ef87SMatthew G Knepley 2123a19ef87SMatthew G Knepley PetscFunctionBegin; 2133a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2146d1defb0SMatthew G Knepley ierr = DMCreateGlobalVector(mesh->patches[mesh->activePatch], g);CHKERRQ(ierr); 2153a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2163a19ef87SMatthew G Knepley } 2173a19ef87SMatthew G Knepley 2183a19ef87SMatthew G Knepley #undef __FUNCT__ 2193a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateLocalVector_Patch" 2203a19ef87SMatthew G Knepley PetscErrorCode DMCreateLocalVector_Patch(DM dm, Vec *l) 2213a19ef87SMatthew G Knepley { 2223a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 2233a19ef87SMatthew G Knepley PetscErrorCode ierr; 2243a19ef87SMatthew G Knepley 2253a19ef87SMatthew G Knepley PetscFunctionBegin; 2263a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2276d1defb0SMatthew G Knepley ierr = DMCreateLocalVector(mesh->patches[mesh->activePatch], l);CHKERRQ(ierr); 2283a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2293a19ef87SMatthew G Knepley } 2303a19ef87SMatthew G Knepley 2313a19ef87SMatthew G Knepley #undef __FUNCT__ 2323a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchGetActivePatch" 2333a19ef87SMatthew G Knepley PetscErrorCode DMPatchGetActivePatch(DM dm, PetscInt *patch) 2343a19ef87SMatthew G Knepley { 2353a19ef87SMatthew G Knepley DM_Patch *mesh; 2363a19ef87SMatthew G Knepley 2373a19ef87SMatthew G Knepley PetscFunctionBegin; 2383a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2393a19ef87SMatthew G Knepley PetscValidPointer(patch, 2); 2403a19ef87SMatthew G Knepley mesh = (DM_Patch *) dm->data; 2413a19ef87SMatthew G Knepley *patch = mesh->activePatch; 2423a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2433a19ef87SMatthew G Knepley } 2443a19ef87SMatthew G Knepley 2453a19ef87SMatthew G Knepley #undef __FUNCT__ 2463a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchSetActivePatch" 2473a19ef87SMatthew G Knepley PetscErrorCode DMPatchSetActivePatch(DM dm, PetscInt patch) 2483a19ef87SMatthew G Knepley { 2493a19ef87SMatthew G Knepley DM_Patch *mesh; 2503a19ef87SMatthew G Knepley 2513a19ef87SMatthew G Knepley PetscFunctionBegin; 2523a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2533a19ef87SMatthew G Knepley mesh = (DM_Patch *) dm->data; 2543a19ef87SMatthew G Knepley mesh->activePatch = patch; 2553a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2563a19ef87SMatthew G Knepley } 2573a19ef87SMatthew G Knepley 2583a19ef87SMatthew G Knepley #undef __FUNCT__ 2593a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateSubDM_Patch" 2603a19ef87SMatthew G Knepley PetscErrorCode DMCreateSubDM_Patch(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm) 2613a19ef87SMatthew G Knepley { 2623a19ef87SMatthew G Knepley PetscFunctionBegin; 2633a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2643a19ef87SMatthew G Knepley SETERRQ(((PetscObject) dm)->comm, PETSC_ERR_SUP, "Tell me to code this"); 2653a19ef87SMatthew G Knepley PetscFunctionReturn(0); 2663a19ef87SMatthew G Knepley } 267