13a19ef87SMatthew G Knepley #include <petsc-private/patchimpl.h> /*I "petscdmpatch.h" I*/ 23a19ef87SMatthew G Knepley #include <petscdmda.h> 33a19ef87SMatthew G Knepley 43a19ef87SMatthew G Knepley #undef __FUNCT__ 53a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchView_Ascii" 63a19ef87SMatthew G Knepley PetscErrorCode DMPatchView_Ascii(DM dm, PetscViewer viewer) 73a19ef87SMatthew G Knepley { 83a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 93a19ef87SMatthew G Knepley PetscViewerFormat format; 103a19ef87SMatthew G Knepley PetscInt p; 113a19ef87SMatthew G Knepley PetscErrorCode ierr; 123a19ef87SMatthew G Knepley 133a19ef87SMatthew G Knepley PetscFunctionBegin; 143a19ef87SMatthew G Knepley ierr = PetscViewerGetFormat(viewer, &format);CHKERRQ(ierr); 153a19ef87SMatthew G Knepley /* if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) */ 163a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "%D patches\n", mesh->numPatches);CHKERRQ(ierr); 173a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 183a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 193a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "Patch %D\n", p);CHKERRQ(ierr); 203a19ef87SMatthew G Knepley ierr = DMView(mesh->patches[p], viewer);CHKERRQ(ierr); 213a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 223a19ef87SMatthew G Knepley } 233a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 243a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPrintf(viewer, "Coarse DM\n");CHKERRQ(ierr); 253a19ef87SMatthew G Knepley ierr = DMView(mesh->dmCoarse, viewer);CHKERRQ(ierr); 263a19ef87SMatthew G Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 273a19ef87SMatthew G Knepley PetscFunctionReturn(0); 283a19ef87SMatthew G Knepley } 293a19ef87SMatthew G Knepley 303a19ef87SMatthew G Knepley #undef __FUNCT__ 313a19ef87SMatthew G Knepley #define __FUNCT__ "DMView_Patch" 323a19ef87SMatthew G Knepley PetscErrorCode DMView_Patch(DM dm, PetscViewer viewer) 333a19ef87SMatthew G Knepley { 343a19ef87SMatthew G Knepley PetscBool iascii, isbinary; 353a19ef87SMatthew G Knepley PetscErrorCode ierr; 363a19ef87SMatthew G Knepley 373a19ef87SMatthew G Knepley PetscFunctionBegin; 383a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 393a19ef87SMatthew G Knepley PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 403a19ef87SMatthew G Knepley ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 413a19ef87SMatthew G Knepley ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERBINARY, &isbinary);CHKERRQ(ierr); 423a19ef87SMatthew G Knepley if (iascii) { 433a19ef87SMatthew G Knepley ierr = DMPatchView_Ascii(dm, viewer);CHKERRQ(ierr); 443a19ef87SMatthew G Knepley #if 0 453a19ef87SMatthew G Knepley } else if (isbinary) { 463a19ef87SMatthew G Knepley ierr = DMPatchView_Binary(dm, viewer);CHKERRQ(ierr); 473a19ef87SMatthew G Knepley #endif 483a19ef87SMatthew G Knepley } else SETERRQ1(((PetscObject)viewer)->comm,PETSC_ERR_SUP,"Viewer type %s not supported by this mesh object", ((PetscObject)viewer)->type_name); 493a19ef87SMatthew G Knepley PetscFunctionReturn(0); 503a19ef87SMatthew G Knepley } 513a19ef87SMatthew G Knepley 523a19ef87SMatthew G Knepley #undef __FUNCT__ 533a19ef87SMatthew G Knepley #define __FUNCT__ "DMDestroy_Patch" 543a19ef87SMatthew G Knepley PetscErrorCode DMDestroy_Patch(DM dm) 553a19ef87SMatthew G Knepley { 563a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 573a19ef87SMatthew G Knepley PetscInt p; 583a19ef87SMatthew G Knepley PetscErrorCode ierr; 593a19ef87SMatthew G Knepley 603a19ef87SMatthew G Knepley PetscFunctionBegin; 613a19ef87SMatthew G Knepley if (--mesh->refct > 0) {PetscFunctionReturn(0);} 623a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 633a19ef87SMatthew G Knepley ierr = DMDestroy(&mesh->patches[p]);CHKERRQ(ierr); 643a19ef87SMatthew G Knepley } 653a19ef87SMatthew G Knepley ierr = PetscFree(mesh->patches);CHKERRQ(ierr); 663a19ef87SMatthew G Knepley ierr = DMDestroy(&mesh->dmCoarse);CHKERRQ(ierr); 673a19ef87SMatthew G Knepley /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */ 683a19ef87SMatthew G Knepley ierr = PetscFree(mesh);CHKERRQ(ierr); 693a19ef87SMatthew G Knepley PetscFunctionReturn(0); 703a19ef87SMatthew G Knepley } 713a19ef87SMatthew G Knepley 723a19ef87SMatthew G Knepley #undef __FUNCT__ 733a19ef87SMatthew G Knepley #define __FUNCT__ "DMSetUp_Patch" 743a19ef87SMatthew G Knepley PetscErrorCode DMSetUp_Patch(DM dm) 753a19ef87SMatthew G Knepley { 763a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 773a19ef87SMatthew G Knepley PetscInt p; 783a19ef87SMatthew G Knepley PetscErrorCode ierr; 793a19ef87SMatthew G Knepley 803a19ef87SMatthew G Knepley PetscFunctionBegin; 813a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 823a19ef87SMatthew G Knepley for(p = 0; p < mesh->numPatches; ++p) { 833a19ef87SMatthew G Knepley ierr = DMSetUp(mesh->patches[p]);CHKERRQ(ierr); 843a19ef87SMatthew G Knepley } 853a19ef87SMatthew G Knepley PetscFunctionReturn(0); 863a19ef87SMatthew G Knepley } 873a19ef87SMatthew G Knepley 883a19ef87SMatthew G Knepley #undef __FUNCT__ 893a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateGlobalVector_Patch" 903a19ef87SMatthew G Knepley PetscErrorCode DMCreateGlobalVector_Patch(DM dm, Vec *g) 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); 98*6d1defb0SMatthew G Knepley ierr = DMCreateGlobalVector(mesh->patches[mesh->activePatch], g);CHKERRQ(ierr); 993a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1003a19ef87SMatthew G Knepley } 1013a19ef87SMatthew G Knepley 1023a19ef87SMatthew G Knepley #undef __FUNCT__ 1033a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateLocalVector_Patch" 1043a19ef87SMatthew G Knepley PetscErrorCode DMCreateLocalVector_Patch(DM dm, Vec *l) 1053a19ef87SMatthew G Knepley { 1063a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 1073a19ef87SMatthew G Knepley PetscInt p; 1083a19ef87SMatthew G Knepley PetscErrorCode ierr; 1093a19ef87SMatthew G Knepley 1103a19ef87SMatthew G Knepley PetscFunctionBegin; 1113a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 112*6d1defb0SMatthew G Knepley ierr = DMCreateLocalVector(mesh->patches[mesh->activePatch], l);CHKERRQ(ierr); 1133a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1143a19ef87SMatthew G Knepley } 1153a19ef87SMatthew G Knepley 1163a19ef87SMatthew G Knepley #undef __FUNCT__ 1173a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchGetActivePatch" 1183a19ef87SMatthew G Knepley PetscErrorCode DMPatchGetActivePatch(DM dm, PetscInt *patch) 1193a19ef87SMatthew G Knepley { 1203a19ef87SMatthew G Knepley DM_Patch *mesh; 1213a19ef87SMatthew G Knepley 1223a19ef87SMatthew G Knepley PetscFunctionBegin; 1233a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1243a19ef87SMatthew G Knepley PetscValidPointer(patch, 2); 1253a19ef87SMatthew G Knepley mesh = (DM_Patch *) dm->data; 1263a19ef87SMatthew G Knepley *patch = mesh->activePatch; 1273a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1283a19ef87SMatthew G Knepley } 1293a19ef87SMatthew G Knepley 1303a19ef87SMatthew G Knepley #undef __FUNCT__ 1313a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchSetActivePatch" 1323a19ef87SMatthew G Knepley PetscErrorCode DMPatchSetActivePatch(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 mesh = (DM_Patch *) dm->data; 1393a19ef87SMatthew G Knepley mesh->activePatch = patch; 1403a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1413a19ef87SMatthew G Knepley } 1423a19ef87SMatthew G Knepley 1433a19ef87SMatthew G Knepley #undef __FUNCT__ 1443a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateSubDM_Patch" 1453a19ef87SMatthew G Knepley PetscErrorCode DMCreateSubDM_Patch(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm) 1463a19ef87SMatthew G Knepley { 1473a19ef87SMatthew G Knepley PetscFunctionBegin; 1483a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1493a19ef87SMatthew G Knepley SETERRQ(((PetscObject) dm)->comm, PETSC_ERR_SUP, "Tell me to code this"); 1503a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1513a19ef87SMatthew G Knepley } 152