13a19ef87SMatthew G Knepley #include <petsc-private/patchimpl.h> /*I "petscdmpatch.h" I*/ 23a19ef87SMatthew G Knepley #include <petscdmda.h> 33a19ef87SMatthew G Knepley 4*5ee0e871SMatthew G Knepley /* 5*5ee0e871SMatthew G Knepley Solver loop to update \tau: 6*5ee0e871SMatthew G Knepley 7*5ee0e871SMatthew G Knepley DMZoom(dmc, &dmz) 8*5ee0e871SMatthew G Knepley DMRefine(dmz, &dmf), 9*5ee0e871SMatthew G Knepley Scatter Xcoarse -> Xzoom, 10*5ee0e871SMatthew G Knepley Interpolate Xzoom -> Xfine (note that this may be on subcomms), 11*5ee0e871SMatthew G Knepley Smooth Xfine using two-step smoother 12*5ee0e871SMatthew G Knepley normal smoother plus Kaczmarz---moves back and forth from dmzoom to dmfine 13*5ee0e871SMatthew G Knepley Compute residual Rfine 14*5ee0e871SMatthew G Knepley Restrict Rfine to Rzoom_restricted 15*5ee0e871SMatthew G Knepley Scatter Rzoom_restricted -> Rcoarse_restricted 16*5ee0e871SMatthew G Knepley Compute global residual Rcoarse 17*5ee0e871SMatthew G Knepley TauCoarse = Rcoarse - Rcoarse_restricted 18*5ee0e871SMatthew G Knepley */ 19*5ee0e871SMatthew G Knepley 203a19ef87SMatthew G Knepley #undef __FUNCT__ 213a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchView_Ascii" 223a19ef87SMatthew G Knepley PetscErrorCode DMPatchView_Ascii(DM dm, PetscViewer viewer) 233a19ef87SMatthew G Knepley { 243a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 253a19ef87SMatthew G Knepley PetscViewerFormat format; 263a19ef87SMatthew G Knepley PetscInt p; 273a19ef87SMatthew G Knepley PetscErrorCode ierr; 283a19ef87SMatthew G Knepley 293a19ef87SMatthew G Knepley PetscFunctionBegin; 303a19ef87SMatthew G Knepley ierr = PetscViewerGetFormat(viewer, &format);CHKERRQ(ierr); 313a19ef87SMatthew G Knepley /* if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) */ 323a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "%D patches\n", mesh->numPatches);CHKERRQ(ierr); 333a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 343a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 353a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "Patch %D\n", p);CHKERRQ(ierr); 363a19ef87SMatthew G Knepley ierr = DMView(mesh->patches[p], viewer);CHKERRQ(ierr); 373a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 383a19ef87SMatthew G Knepley } 393a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 403a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "Coarse DM\n");CHKERRQ(ierr); 413a19ef87SMatthew G Knepley ierr = DMView(mesh->dmCoarse, viewer);CHKERRQ(ierr); 423a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 433a19ef87SMatthew G Knepley PetscFunctionReturn(0); 443a19ef87SMatthew G Knepley } 453a19ef87SMatthew G Knepley 463a19ef87SMatthew G Knepley #undef __FUNCT__ 473a19ef87SMatthew G Knepley #define __FUNCT__ "DMView_Patch" 483a19ef87SMatthew G Knepley PetscErrorCode DMView_Patch(DM dm, PetscViewer viewer) 493a19ef87SMatthew G Knepley { 503a19ef87SMatthew G Knepley PetscBool iascii, isbinary; 513a19ef87SMatthew G Knepley PetscErrorCode ierr; 523a19ef87SMatthew G Knepley 533a19ef87SMatthew G Knepley PetscFunctionBegin; 543a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 553a19ef87SMatthew G Knepley PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 563a19ef87SMatthew G Knepley ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 573a19ef87SMatthew G Knepley ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERBINARY, &isbinary);CHKERRQ(ierr); 583a19ef87SMatthew G Knepley if (iascii) { 593a19ef87SMatthew G Knepley ierr = DMPatchView_Ascii(dm, viewer);CHKERRQ(ierr); 603a19ef87SMatthew G Knepley #if 0 613a19ef87SMatthew G Knepley } else if (isbinary) { 623a19ef87SMatthew G Knepley ierr = DMPatchView_Binary(dm, viewer);CHKERRQ(ierr); 633a19ef87SMatthew G Knepley #endif 643a19ef87SMatthew G Knepley } else SETERRQ1(((PetscObject)viewer)->comm,PETSC_ERR_SUP,"Viewer type %s not supported by this mesh object", ((PetscObject)viewer)->type_name); 653a19ef87SMatthew G Knepley PetscFunctionReturn(0); 663a19ef87SMatthew G Knepley } 673a19ef87SMatthew G Knepley 683a19ef87SMatthew G Knepley #undef __FUNCT__ 693a19ef87SMatthew G Knepley #define __FUNCT__ "DMDestroy_Patch" 703a19ef87SMatthew G Knepley PetscErrorCode DMDestroy_Patch(DM dm) 713a19ef87SMatthew G Knepley { 723a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 733a19ef87SMatthew G Knepley PetscInt p; 743a19ef87SMatthew G Knepley PetscErrorCode ierr; 753a19ef87SMatthew G Knepley 763a19ef87SMatthew G Knepley PetscFunctionBegin; 773a19ef87SMatthew G Knepley if (--mesh->refct > 0) {PetscFunctionReturn(0);} 783a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 793a19ef87SMatthew G Knepley ierr = DMDestroy(&mesh->patches[p]);CHKERRQ(ierr); 803a19ef87SMatthew G Knepley } 813a19ef87SMatthew G Knepley ierr = PetscFree(mesh->patches);CHKERRQ(ierr); 823a19ef87SMatthew G Knepley ierr = DMDestroy(&mesh->dmCoarse);CHKERRQ(ierr); 833a19ef87SMatthew G Knepley /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */ 843a19ef87SMatthew G Knepley ierr = PetscFree(mesh);CHKERRQ(ierr); 853a19ef87SMatthew G Knepley PetscFunctionReturn(0); 863a19ef87SMatthew G Knepley } 873a19ef87SMatthew G Knepley 883a19ef87SMatthew G Knepley #undef __FUNCT__ 893a19ef87SMatthew G Knepley #define __FUNCT__ "DMSetUp_Patch" 903a19ef87SMatthew G Knepley PetscErrorCode DMSetUp_Patch(DM dm) 913a19ef87SMatthew G Knepley { 923a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 933a19ef87SMatthew G Knepley PetscInt p; 943a19ef87SMatthew G Knepley PetscErrorCode ierr; 953a19ef87SMatthew G Knepley 963a19ef87SMatthew G Knepley PetscFunctionBegin; 973a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 983a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 993a19ef87SMatthew G Knepley ierr = DMSetUp(mesh->patches[p]);CHKERRQ(ierr); 1003a19ef87SMatthew G Knepley } 1013a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1023a19ef87SMatthew G Knepley } 1033a19ef87SMatthew G Knepley 1043a19ef87SMatthew G Knepley #undef __FUNCT__ 1053a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateGlobalVector_Patch" 1063a19ef87SMatthew G Knepley PetscErrorCode DMCreateGlobalVector_Patch(DM dm, Vec *g) 1073a19ef87SMatthew G Knepley { 1083a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 1093a19ef87SMatthew G Knepley PetscErrorCode ierr; 1103a19ef87SMatthew G Knepley 1113a19ef87SMatthew G Knepley PetscFunctionBegin; 1123a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1136d1defb0SMatthew G Knepley ierr = DMCreateGlobalVector(mesh->patches[mesh->activePatch], g);CHKERRQ(ierr); 1143a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1153a19ef87SMatthew G Knepley } 1163a19ef87SMatthew G Knepley 1173a19ef87SMatthew G Knepley #undef __FUNCT__ 1183a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateLocalVector_Patch" 1193a19ef87SMatthew G Knepley PetscErrorCode DMCreateLocalVector_Patch(DM dm, Vec *l) 1203a19ef87SMatthew G Knepley { 1213a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 1223a19ef87SMatthew G Knepley PetscErrorCode ierr; 1233a19ef87SMatthew G Knepley 1243a19ef87SMatthew G Knepley PetscFunctionBegin; 1253a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1266d1defb0SMatthew G Knepley ierr = DMCreateLocalVector(mesh->patches[mesh->activePatch], l);CHKERRQ(ierr); 1273a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1283a19ef87SMatthew G Knepley } 1293a19ef87SMatthew G Knepley 1303a19ef87SMatthew G Knepley #undef __FUNCT__ 1313a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchGetActivePatch" 1323a19ef87SMatthew G Knepley PetscErrorCode DMPatchGetActivePatch(DM dm, PetscInt *patch) 1333a19ef87SMatthew G Knepley { 1343a19ef87SMatthew G Knepley DM_Patch *mesh; 1353a19ef87SMatthew G Knepley 1363a19ef87SMatthew G Knepley PetscFunctionBegin; 1373a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1383a19ef87SMatthew G Knepley PetscValidPointer(patch, 2); 1393a19ef87SMatthew G Knepley mesh = (DM_Patch *) dm->data; 1403a19ef87SMatthew G Knepley *patch = mesh->activePatch; 1413a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1423a19ef87SMatthew G Knepley } 1433a19ef87SMatthew G Knepley 1443a19ef87SMatthew G Knepley #undef __FUNCT__ 1453a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchSetActivePatch" 1463a19ef87SMatthew G Knepley PetscErrorCode DMPatchSetActivePatch(DM dm, PetscInt patch) 1473a19ef87SMatthew G Knepley { 1483a19ef87SMatthew G Knepley DM_Patch *mesh; 1493a19ef87SMatthew G Knepley 1503a19ef87SMatthew G Knepley PetscFunctionBegin; 1513a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1523a19ef87SMatthew G Knepley mesh = (DM_Patch *) dm->data; 1533a19ef87SMatthew G Knepley mesh->activePatch = patch; 1543a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1553a19ef87SMatthew G Knepley } 1563a19ef87SMatthew G Knepley 1573a19ef87SMatthew G Knepley #undef __FUNCT__ 1583a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateSubDM_Patch" 1593a19ef87SMatthew G Knepley PetscErrorCode DMCreateSubDM_Patch(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm) 1603a19ef87SMatthew G Knepley { 1613a19ef87SMatthew G Knepley PetscFunctionBegin; 1623a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1633a19ef87SMatthew G Knepley SETERRQ(((PetscObject) dm)->comm, PETSC_ERR_SUP, "Tell me to code this"); 1643a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1653a19ef87SMatthew G Knepley } 166