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__ "DMSetFromOptions_Patch" 63a19ef87SMatthew G Knepley PetscErrorCode DMSetFromOptions_Patch(DM dm) 73a19ef87SMatthew G Knepley { 83a19ef87SMatthew G Knepley DM_Patch *mesh = (DM_Patch *) dm->data; 93a19ef87SMatthew G Knepley PetscInt p; 103a19ef87SMatthew G Knepley PetscErrorCode ierr; 113a19ef87SMatthew G Knepley 123a19ef87SMatthew G Knepley PetscFunctionBegin; 133a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 143a19ef87SMatthew G Knepley ierr = PetscOptionsHead("DMPatch Options");CHKERRQ(ierr); 153a19ef87SMatthew G Knepley /* Handle associated vectors */ 163a19ef87SMatthew G Knepley /* Handle viewing */ 173a19ef87SMatthew G Knepley ierr = PetscOptionsTail();CHKERRQ(ierr); 183a19ef87SMatthew G Knepley for (p = 0; p < mesh->numPatches; ++p) { 193a19ef87SMatthew G Knepley ierr = DMSetFromOptions(mesh->patches[p]);CHKERRQ(ierr); 203a19ef87SMatthew G Knepley } 213a19ef87SMatthew G Knepley PetscFunctionReturn(0); 223a19ef87SMatthew G Knepley } 233a19ef87SMatthew G Knepley 243a19ef87SMatthew G Knepley /* External function declarations here */ 253a19ef87SMatthew G Knepley extern PetscErrorCode DMSetUp_Patch(DM dm); 263a19ef87SMatthew G Knepley extern PetscErrorCode DMView_Patch(DM dm, PetscViewer viewer); 273a19ef87SMatthew G Knepley extern PetscErrorCode DMCreateGlobalVector_Patch(DM dm, Vec *g); 283a19ef87SMatthew G Knepley extern PetscErrorCode DMCreateLocalVector_Patch(DM dm, Vec *l); 293a19ef87SMatthew G Knepley extern PetscErrorCode DMDestroy_Patch(DM dm); 303a19ef87SMatthew G Knepley extern PetscErrorCode DMCreateSubDM_Patch(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm); 313a19ef87SMatthew G Knepley 323a19ef87SMatthew G Knepley #undef __FUNCT__ 333a19ef87SMatthew G Knepley #define __FUNCT__ "DMInitialize_Patch" 343a19ef87SMatthew G Knepley PetscErrorCode DMInitialize_Patch(DM dm) 353a19ef87SMatthew G Knepley { 363a19ef87SMatthew G Knepley PetscErrorCode ierr; 373a19ef87SMatthew G Knepley 383a19ef87SMatthew G Knepley PetscFunctionBegin; 39*19fd82e9SBarry Smith ierr = PetscStrallocpy(VECSTANDARD,(char**) &dm->vectype);CHKERRQ(ierr); 403a19ef87SMatthew G Knepley dm->ops->view = DMView_Patch; 413a19ef87SMatthew G Knepley dm->ops->setfromoptions = DMSetFromOptions_Patch; 423a19ef87SMatthew G Knepley dm->ops->setup = DMSetUp_Patch; 433a19ef87SMatthew G Knepley dm->ops->createglobalvector = DMCreateGlobalVector_Patch; 443a19ef87SMatthew G Knepley dm->ops->createlocalvector = DMCreateLocalVector_Patch; 453a19ef87SMatthew G Knepley dm->ops->createlocaltoglobalmapping = PETSC_NULL; 463a19ef87SMatthew G Knepley dm->ops->createlocaltoglobalmappingblock = PETSC_NULL; 473a19ef87SMatthew G Knepley dm->ops->createfieldis = PETSC_NULL; 483a19ef87SMatthew G Knepley dm->ops->getcoloring = 0; 493a19ef87SMatthew G Knepley dm->ops->creatematrix = 0; 503a19ef87SMatthew G Knepley dm->ops->createinterpolation= 0; 513a19ef87SMatthew G Knepley dm->ops->getaggregates = 0; 523a19ef87SMatthew G Knepley dm->ops->getinjection = 0; 533a19ef87SMatthew G Knepley dm->ops->refine = 0; 543a19ef87SMatthew G Knepley dm->ops->coarsen = 0; 553a19ef87SMatthew G Knepley dm->ops->refinehierarchy = 0; 563a19ef87SMatthew G Knepley dm->ops->coarsenhierarchy = 0; 573a19ef87SMatthew G Knepley dm->ops->globaltolocalbegin = PETSC_NULL; 583a19ef87SMatthew G Knepley dm->ops->globaltolocalend = PETSC_NULL; 593a19ef87SMatthew G Knepley dm->ops->localtoglobalbegin = PETSC_NULL; 603a19ef87SMatthew G Knepley dm->ops->localtoglobalend = PETSC_NULL; 613a19ef87SMatthew G Knepley dm->ops->destroy = DMDestroy_Patch; 623a19ef87SMatthew G Knepley dm->ops->createsubdm = DMCreateSubDM_Patch; 633a19ef87SMatthew G Knepley PetscFunctionReturn(0); 643a19ef87SMatthew G Knepley } 653a19ef87SMatthew G Knepley 663a19ef87SMatthew G Knepley EXTERN_C_BEGIN 673a19ef87SMatthew G Knepley #undef __FUNCT__ 683a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreate_Patch" 693a19ef87SMatthew G Knepley PetscErrorCode DMCreate_Patch(DM dm) 703a19ef87SMatthew G Knepley { 713a19ef87SMatthew G Knepley DM_Patch *mesh; 723a19ef87SMatthew G Knepley PetscErrorCode ierr; 733a19ef87SMatthew G Knepley 743a19ef87SMatthew G Knepley PetscFunctionBegin; 753a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 763a19ef87SMatthew G Knepley ierr = PetscNewLog(dm, DM_Patch, &mesh);CHKERRQ(ierr); 773a19ef87SMatthew G Knepley dm->data = mesh; 783a19ef87SMatthew G Knepley 793a19ef87SMatthew G Knepley mesh->refct = 1; 803a19ef87SMatthew G Knepley mesh->numPatches = 0; 813a19ef87SMatthew G Knepley mesh->patches = PETSC_NULL; 823a19ef87SMatthew G Knepley mesh->dmCoarse = PETSC_NULL; 833a19ef87SMatthew G Knepley mesh->activePatch = -1; 843a19ef87SMatthew G Knepley 853a19ef87SMatthew G Knepley ierr = DMInitialize_Patch(dm);CHKERRQ(ierr); 863a19ef87SMatthew G Knepley PetscFunctionReturn(0); 873a19ef87SMatthew G Knepley } 883a19ef87SMatthew G Knepley EXTERN_C_END 893a19ef87SMatthew G Knepley 903a19ef87SMatthew G Knepley #undef __FUNCT__ 913a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchCreate" 923a19ef87SMatthew G Knepley /*@ 933a19ef87SMatthew G Knepley DMPatchCreate - Creates a DMPatch object, which is a collections of DMs called patches. 943a19ef87SMatthew G Knepley 953a19ef87SMatthew G Knepley Collective on MPI_Comm 963a19ef87SMatthew G Knepley 973a19ef87SMatthew G Knepley Input Parameter: 983a19ef87SMatthew G Knepley . comm - The communicator for the DMPatch object 993a19ef87SMatthew G Knepley 1003a19ef87SMatthew G Knepley Output Parameter: 1013a19ef87SMatthew G Knepley . mesh - The DMPatch object 1023a19ef87SMatthew G Knepley 1033a19ef87SMatthew G Knepley Level: beginner 1043a19ef87SMatthew G Knepley 1053a19ef87SMatthew G Knepley .keywords: DMPatch, create 1063a19ef87SMatthew G Knepley @*/ 1073a19ef87SMatthew G Knepley PetscErrorCode DMPatchCreate(MPI_Comm comm, DM *mesh) 1083a19ef87SMatthew G Knepley { 1093a19ef87SMatthew G Knepley PetscErrorCode ierr; 1103a19ef87SMatthew G Knepley 1113a19ef87SMatthew G Knepley PetscFunctionBegin; 1123a19ef87SMatthew G Knepley PetscValidPointer(mesh,2); 1133a19ef87SMatthew G Knepley ierr = DMCreate(comm, mesh);CHKERRQ(ierr); 1143a19ef87SMatthew G Knepley ierr = DMSetType(*mesh, DMPATCH);CHKERRQ(ierr); 1153a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1163a19ef87SMatthew G Knepley } 1173a19ef87SMatthew G Knepley 1183a19ef87SMatthew G Knepley #undef __FUNCT__ 1193a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchCreateGrid" 1203a19ef87SMatthew G Knepley PetscErrorCode DMPatchCreateGrid(MPI_Comm comm, PetscInt dim, MatStencil patchSize, MatStencil gridSize, DM *dm) 1213a19ef87SMatthew G Knepley { 1223a19ef87SMatthew G Knepley DM_Patch *mesh; 1233a19ef87SMatthew G Knepley PetscInt p; 1243a19ef87SMatthew G Knepley PetscErrorCode ierr; 1253a19ef87SMatthew G Knepley 1263a19ef87SMatthew G Knepley PetscFunctionBegin; 1273a19ef87SMatthew G Knepley ierr = DMPatchCreate(comm, dm);CHKERRQ(ierr); 1283a19ef87SMatthew G Knepley mesh = (DM_Patch *) (*dm)->data; 1293a19ef87SMatthew G Knepley mesh->dim = dim; 1303a19ef87SMatthew G Knepley if (dim < 2) { 1313a19ef87SMatthew G Knepley gridSize.j = 1; 1323a19ef87SMatthew G Knepley patchSize.j = 1; 1333a19ef87SMatthew G Knepley } 1343a19ef87SMatthew G Knepley if (dim < 3) { 1353a19ef87SMatthew G Knepley gridSize.k = 1; 1363a19ef87SMatthew G Knepley patchSize.k = 1; 1373a19ef87SMatthew G Knepley } 1383a19ef87SMatthew G Knepley mesh->numPatches = gridSize.i*gridSize.j*gridSize.k; 1393a19ef87SMatthew G Knepley ierr = PetscMalloc(mesh->numPatches * sizeof(DM), &mesh->patches);CHKERRQ(ierr); 1403a19ef87SMatthew G Knepley for (p = 0; p < mesh->numPatches; ++p) { 1413a19ef87SMatthew G Knepley /* Patches are overlapping: Right now we do not account for boundaries */ 1423a19ef87SMatthew G Knepley DM da; 1433a19ef87SMatthew G Knepley PetscInt dof = 1, width = 1; 1443a19ef87SMatthew G Knepley 1453a19ef87SMatthew G Knepley ierr = DMCreate(comm, &da); 1463a19ef87SMatthew G Knepley ierr = DMSetType(da, DMDA); 1473a19ef87SMatthew G Knepley ierr = DMDASetDim(da, dim);CHKERRQ(ierr); 1483a19ef87SMatthew G Knepley ierr = DMDASetSizes(da, patchSize.i+width*2, patchSize.j+width*2, patchSize.k+width*2);CHKERRQ(ierr); 1493a19ef87SMatthew G Knepley ierr = DMDASetBoundaryType(da, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE);CHKERRQ(ierr); 1503a19ef87SMatthew G Knepley ierr = DMDASetDof(da, dof);CHKERRQ(ierr); 1513a19ef87SMatthew G Knepley ierr = DMDASetStencilType(da, DMDA_STENCIL_BOX);CHKERRQ(ierr); 1523a19ef87SMatthew G Knepley ierr = DMDASetStencilWidth(da, width);CHKERRQ(ierr); 1533a19ef87SMatthew G Knepley mesh->patches[p] = da; 1543a19ef87SMatthew G Knepley } 1553a19ef87SMatthew G Knepley { 1563a19ef87SMatthew G Knepley DM da; 1573a19ef87SMatthew G Knepley PetscInt dof = 1, width = 1; 1583a19ef87SMatthew G Knepley 1593a19ef87SMatthew G Knepley ierr = DMCreate(comm, &da); 1603a19ef87SMatthew G Knepley ierr = DMSetType(da, DMDA); 1613a19ef87SMatthew G Knepley ierr = DMDASetDim(da, dim);CHKERRQ(ierr); 1623a19ef87SMatthew G Knepley ierr = DMDASetSizes(da, gridSize.i, gridSize.j, gridSize.k);CHKERRQ(ierr); 1633a19ef87SMatthew G Knepley ierr = DMDASetBoundaryType(da, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE);CHKERRQ(ierr); 1643a19ef87SMatthew G Knepley ierr = DMDASetDof(da, dof);CHKERRQ(ierr); 1653a19ef87SMatthew G Knepley ierr = DMDASetStencilType(da, DMDA_STENCIL_BOX);CHKERRQ(ierr); 1663a19ef87SMatthew G Knepley ierr = DMDASetStencilWidth(da, width);CHKERRQ(ierr); 1673a19ef87SMatthew G Knepley mesh->dmCoarse = da; 1683a19ef87SMatthew G Knepley } 1693a19ef87SMatthew G Knepley PetscFunctionReturn(0); 1703a19ef87SMatthew G Knepley } 171