xref: /petsc/src/dm/impls/patch/patchcreate.c (revision 19fd82e9cecaa743f7d770680f25ee0b5a8ad815)
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