1*3a19ef87SMatthew G Knepley #include <petsc-private/patchimpl.h> /*I "petscdmpatch.h" I*/ 2*3a19ef87SMatthew G Knepley #include <petscdmda.h> 3*3a19ef87SMatthew G Knepley 4*3a19ef87SMatthew G Knepley #undef __FUNCT__ 5*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchView_Ascii" 6*3a19ef87SMatthew G Knepley PetscErrorCode DMPatchView_Ascii(DM dm, PetscViewer viewer) 7*3a19ef87SMatthew G Knepley { 8*3a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 9*3a19ef87SMatthew G Knepley PetscViewerFormat format; 10*3a19ef87SMatthew G Knepley PetscInt p; 11*3a19ef87SMatthew G Knepley PetscErrorCode ierr; 12*3a19ef87SMatthew G Knepley 13*3a19ef87SMatthew G Knepley PetscFunctionBegin; 14*3a19ef87SMatthew G Knepley ierr = PetscViewerGetFormat(viewer, &format);CHKERRQ(ierr); 15*3a19ef87SMatthew G Knepley /* if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) */ 16*3a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "%D patches\n", mesh->numPatches);CHKERRQ(ierr); 17*3a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 18*3a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 19*3a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "Patch %D\n", p);CHKERRQ(ierr); 20*3a19ef87SMatthew G Knepley ierr = DMView(mesh->patches[p], viewer);CHKERRQ(ierr); 21*3a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 22*3a19ef87SMatthew G Knepley } 23*3a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 24*3a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "Coarse DM\n");CHKERRQ(ierr); 25*3a19ef87SMatthew G Knepley ierr = DMView(mesh->dmCoarse, viewer);CHKERRQ(ierr); 26*3a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 27*3a19ef87SMatthew G Knepley PetscFunctionReturn(0); 28*3a19ef87SMatthew G Knepley } 29*3a19ef87SMatthew G Knepley 30*3a19ef87SMatthew G Knepley #undef __FUNCT__ 31*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMView_Patch" 32*3a19ef87SMatthew G Knepley PetscErrorCode DMView_Patch(DM dm, PetscViewer viewer) 33*3a19ef87SMatthew G Knepley { 34*3a19ef87SMatthew G Knepley PetscBool iascii, isbinary; 35*3a19ef87SMatthew G Knepley PetscErrorCode ierr; 36*3a19ef87SMatthew G Knepley 37*3a19ef87SMatthew G Knepley PetscFunctionBegin; 38*3a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 39*3a19ef87SMatthew G Knepley PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 40*3a19ef87SMatthew G Knepley ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 41*3a19ef87SMatthew G Knepley ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERBINARY, &isbinary);CHKERRQ(ierr); 42*3a19ef87SMatthew G Knepley if (iascii) { 43*3a19ef87SMatthew G Knepley ierr = DMPatchView_Ascii(dm, viewer);CHKERRQ(ierr); 44*3a19ef87SMatthew G Knepley #if 0 45*3a19ef87SMatthew G Knepley } else if (isbinary) { 46*3a19ef87SMatthew G Knepley ierr = DMPatchView_Binary(dm, viewer);CHKERRQ(ierr); 47*3a19ef87SMatthew G Knepley #endif 48*3a19ef87SMatthew G Knepley } else SETERRQ1(((PetscObject)viewer)->comm,PETSC_ERR_SUP,"Viewer type %s not supported by this mesh object", ((PetscObject)viewer)->type_name); 49*3a19ef87SMatthew G Knepley PetscFunctionReturn(0); 50*3a19ef87SMatthew G Knepley } 51*3a19ef87SMatthew G Knepley 52*3a19ef87SMatthew G Knepley #undef __FUNCT__ 53*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMDestroy_Patch" 54*3a19ef87SMatthew G Knepley PetscErrorCode DMDestroy_Patch(DM dm) 55*3a19ef87SMatthew G Knepley { 56*3a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 57*3a19ef87SMatthew G Knepley PetscInt p; 58*3a19ef87SMatthew G Knepley PetscErrorCode ierr; 59*3a19ef87SMatthew G Knepley 60*3a19ef87SMatthew G Knepley PetscFunctionBegin; 61*3a19ef87SMatthew G Knepley if (--mesh->refct > 0) {PetscFunctionReturn(0);} 62*3a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 63*3a19ef87SMatthew G Knepley ierr = DMDestroy(&mesh->patches[p]);CHKERRQ(ierr); 64*3a19ef87SMatthew G Knepley } 65*3a19ef87SMatthew G Knepley ierr = PetscFree(mesh->patches);CHKERRQ(ierr); 66*3a19ef87SMatthew G Knepley ierr = DMDestroy(&mesh->dmCoarse);CHKERRQ(ierr); 67*3a19ef87SMatthew G Knepley /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */ 68*3a19ef87SMatthew G Knepley ierr = PetscFree(mesh);CHKERRQ(ierr); 69*3a19ef87SMatthew G Knepley PetscFunctionReturn(0); 70*3a19ef87SMatthew G Knepley } 71*3a19ef87SMatthew G Knepley 72*3a19ef87SMatthew G Knepley #undef __FUNCT__ 73*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMSetUp_Patch" 74*3a19ef87SMatthew G Knepley PetscErrorCode DMSetUp_Patch(DM dm) 75*3a19ef87SMatthew G Knepley { 76*3a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 77*3a19ef87SMatthew G Knepley PetscInt p; 78*3a19ef87SMatthew G Knepley PetscErrorCode ierr; 79*3a19ef87SMatthew G Knepley 80*3a19ef87SMatthew G Knepley PetscFunctionBegin; 81*3a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 82*3a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 83*3a19ef87SMatthew G Knepley ierr = DMSetUp(mesh->patches[p]);CHKERRQ(ierr); 84*3a19ef87SMatthew G Knepley } 85*3a19ef87SMatthew G Knepley PetscFunctionReturn(0); 86*3a19ef87SMatthew G Knepley } 87*3a19ef87SMatthew G Knepley 88*3a19ef87SMatthew G Knepley #undef __FUNCT__ 89*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateGlobalVector_Patch" 90*3a19ef87SMatthew G Knepley PetscErrorCode DMCreateGlobalVector_Patch(DM dm, Vec *g) 91*3a19ef87SMatthew G Knepley { 92*3a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 93*3a19ef87SMatthew G Knepley PetscInt p; 94*3a19ef87SMatthew G Knepley PetscErrorCode ierr; 95*3a19ef87SMatthew G Knepley 96*3a19ef87SMatthew G Knepley PetscFunctionBegin; 97*3a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 98*3a19ef87SMatthew G Knepley ierr = DMCreateGlobalVector(mesh->activePatch, g);CHKERRQ(ierr); 99*3a19ef87SMatthew G Knepley PetscFunctionReturn(0); 100*3a19ef87SMatthew G Knepley } 101*3a19ef87SMatthew G Knepley 102*3a19ef87SMatthew G Knepley #undef __FUNCT__ 103*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateLocalVector_Patch" 104*3a19ef87SMatthew G Knepley PetscErrorCode DMCreateLocalVector_Patch(DM dm, Vec *l) 105*3a19ef87SMatthew G Knepley { 106*3a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 107*3a19ef87SMatthew G Knepley PetscInt p; 108*3a19ef87SMatthew G Knepley PetscErrorCode ierr; 109*3a19ef87SMatthew G Knepley 110*3a19ef87SMatthew G Knepley PetscFunctionBegin; 111*3a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 112*3a19ef87SMatthew G Knepley ierr = DMCreateLocalVector(mesh->activePatch, l);CHKERRQ(ierr); 113*3a19ef87SMatthew G Knepley PetscFunctionReturn(0); 114*3a19ef87SMatthew G Knepley } 115*3a19ef87SMatthew G Knepley 116*3a19ef87SMatthew G Knepley #undef __FUNCT__ 117*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchGetActivePatch" 118*3a19ef87SMatthew G Knepley PetscErrorCode DMPatchGetActivePatch(DM dm, PetscInt *patch) 119*3a19ef87SMatthew G Knepley { 120*3a19ef87SMatthew G Knepley DM_Patch *mesh; 121*3a19ef87SMatthew G Knepley 122*3a19ef87SMatthew G Knepley PetscFunctionBegin; 123*3a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 124*3a19ef87SMatthew G Knepley PetscValidPointer(patch, 2); 125*3a19ef87SMatthew G Knepley mesh = (DM_Patch *) dm->data; 126*3a19ef87SMatthew G Knepley *patch = mesh->activePatch; 127*3a19ef87SMatthew G Knepley PetscFunctionReturn(0); 128*3a19ef87SMatthew G Knepley } 129*3a19ef87SMatthew G Knepley 130*3a19ef87SMatthew G Knepley #undef __FUNCT__ 131*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchSetActivePatch" 132*3a19ef87SMatthew G Knepley PetscErrorCode DMPatchSetActivePatch(DM dm, PetscInt patch) 133*3a19ef87SMatthew G Knepley { 134*3a19ef87SMatthew G Knepley DM_Patch *mesh; 135*3a19ef87SMatthew G Knepley 136*3a19ef87SMatthew G Knepley PetscFunctionBegin; 137*3a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 138*3a19ef87SMatthew G Knepley mesh = (DM_Patch *) dm->data; 139*3a19ef87SMatthew G Knepley mesh->activePatch = patch; 140*3a19ef87SMatthew G Knepley PetscFunctionReturn(0); 141*3a19ef87SMatthew G Knepley } 142*3a19ef87SMatthew G Knepley 143*3a19ef87SMatthew G Knepley #undef __FUNCT__ 144*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateSubDM_Patch" 145*3a19ef87SMatthew G Knepley PetscErrorCode DMCreateSubDM_Patch(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm) 146*3a19ef87SMatthew G Knepley { 147*3a19ef87SMatthew G Knepley PetscFunctionBegin; 148*3a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 149*3a19ef87SMatthew G Knepley SETERRQ(((PetscObject) dm)->comm, PETSC_ERR_SUP, "Tell me to code this"); 150*3a19ef87SMatthew G Knepley PetscFunctionReturn(0); 151*3a19ef87SMatthew G Knepley } 152