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