1 #pragma once 2 3 #include <petscdmstag.h> /*I "petscdmstag.h" I*/ 4 #include <petsc/private/dmimpl.h> 5 6 #define DMSTAG_MAX_DIM 3 7 #define DMSTAG_MAX_STRATA DMSTAG_MAX_DIM + 1 8 9 /* This value is 1 + 3^DMSTAG_MAX_DIM */ 10 #define DMSTAG_NUMBER_LOCATIONS 28 11 12 typedef struct { 13 /* Fields which may require being set before DMSetUp() is called, set by DMStagInitialize(). 14 Some may be adjusted by DMSetUp() */ 15 PetscInt N[DMSTAG_MAX_DIM]; /* Global dimensions (elements) */ 16 PetscInt n[DMSTAG_MAX_DIM]; /* Local dimensions (elements) */ 17 PetscInt *l[DMSTAG_MAX_DIM]; /* Elements/rank in each direction */ 18 PetscInt dof[DMSTAG_MAX_STRATA]; /* Dof per point for each stratum */ 19 DMStagStencilType stencilType; /* Elementwise stencil type */ 20 PetscInt stencilWidth; /* Elementwise ghost width */ 21 DMBoundaryType boundaryType[DMSTAG_MAX_DIM]; /* Physical domain ghosting type */ 22 PetscMPIInt nRanks[DMSTAG_MAX_DIM]; /* Ranks in each direction */ 23 24 /* Fields unrelated to setup */ 25 DMType coordinateDMType; /* DM type to create for coordinates */ 26 PetscInt refineFactor[DMSTAG_MAX_DIM]; /* Ratio used in refining and coarsening */ 27 28 /* Data above is copied by DMStagDuplicateWithoutSetup(), while data below is not */ 29 30 /* Fields populated by DMSetUp() */ 31 PetscInt nGhost[DMSTAG_MAX_DIM]; /* Local dimensions (w/ ghosts) */ 32 PetscInt start[DMSTAG_MAX_DIM]; /* First element number */ 33 PetscInt startGhost[DMSTAG_MAX_DIM]; /* First element number (w/ ghosts) */ 34 PetscMPIInt rank[DMSTAG_MAX_DIM]; /* Location in grid of ranks */ 35 PetscMPIInt *neighbors; /* dim^3 local ranks */ 36 VecScatter gtol; /* Global --> Local */ 37 VecScatter ltog_injective; /* Local --> Global, injective */ 38 VecScatter ltol; /* Local --> Local */ 39 PetscInt *locationOffsets; /* Offsets for points in loc. rep. */ 40 41 /* Additional convenience fields populated by DMSetUp() (easily computed from the above) */ 42 PetscInt entriesPerElement; /* Entries stored with each element */ 43 PetscInt entries; /* Local number of entries */ 44 PetscInt entriesGhost; /* Local numbers of entries w/ ghosts */ 45 PetscBool firstRank[DMSTAG_MAX_DIM]; /* First rank in this dim? */ 46 PetscBool lastRank[DMSTAG_MAX_DIM]; /* Last rank in this dim? */ 47 } DM_Stag; 48 49 PETSC_INTERN PetscErrorCode DMCreateMatrix_Stag_1D_AIJ_Assemble(DM, Mat); 50 PETSC_INTERN PetscErrorCode DMCreateMatrix_Stag_2D_AIJ_Assemble(DM, Mat); 51 PETSC_INTERN PetscErrorCode DMCreateMatrix_Stag_3D_AIJ_Assemble(DM, Mat); 52 PETSC_INTERN PetscErrorCode DMStagDuplicateWithoutSetup(DM, MPI_Comm, DM *); 53 PETSC_INTERN PetscErrorCode DMStagInitialize(DMBoundaryType, DMBoundaryType, DMBoundaryType, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, DMStagStencilType, PetscInt, const PetscInt[], const PetscInt[], const PetscInt[], DM); 54 PETSC_INTERN PetscErrorCode DMSetUp_Stag_1d(DM); 55 PETSC_INTERN PetscErrorCode DMSetUp_Stag_2d(DM); 56 PETSC_INTERN PetscErrorCode DMSetUp_Stag_3d(DM); 57 PETSC_INTERN PetscErrorCode DMStagRestrictSimple_1d(DM, Vec, DM, Vec); 58 PETSC_INTERN PetscErrorCode DMStagRestrictSimple_2d(DM, Vec, DM, Vec); 59 PETSC_INTERN PetscErrorCode DMStagRestrictSimple_3d(DM, Vec, DM, Vec); 60 PETSC_INTERN PetscErrorCode DMStagPopulateInterpolation1d_Internal(DM, DM, Mat); 61 PETSC_INTERN PetscErrorCode DMStagPopulateInterpolation2d_Internal(DM, DM, Mat); 62 PETSC_INTERN PetscErrorCode DMStagPopulateInterpolation3d_Internal(DM, DM, Mat); 63 PETSC_INTERN PetscErrorCode DMStagPopulateLocalToGlobalInjective_1d(DM); 64 PETSC_INTERN PetscErrorCode DMStagPopulateLocalToGlobalInjective_2d(DM); 65 PETSC_INTERN PetscErrorCode DMStagPopulateLocalToGlobalInjective_3d(DM); 66 PETSC_INTERN PetscErrorCode DMStagPopulateLocalToLocal1d_Internal(DM); 67 PETSC_INTERN PetscErrorCode DMStagPopulateLocalToLocal2d_Internal(DM); 68 PETSC_INTERN PetscErrorCode DMStagPopulateLocalToLocal3d_Internal(DM); 69 PETSC_INTERN PetscErrorCode DMStagPopulateRestriction1d_Internal(DM, DM, Mat); 70 PETSC_INTERN PetscErrorCode DMStagPopulateRestriction2d_Internal(DM, DM, Mat); 71 PETSC_INTERN PetscErrorCode DMStagPopulateRestriction3d_Internal(DM, DM, Mat); 72 PETSC_INTERN PetscErrorCode DMStagSetUniformCoordinatesExplicit_1d(DM, PetscReal, PetscReal); 73 PETSC_INTERN PetscErrorCode DMStagSetUniformCoordinatesExplicit_2d(DM, PetscReal, PetscReal, PetscReal, PetscReal); 74 PETSC_INTERN PetscErrorCode DMStagSetUniformCoordinatesExplicit_3d(DM, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal); 75 PETSC_INTERN PetscErrorCode DMStagStencilLocationCanonicalize(DMStagStencilLocation, DMStagStencilLocation *); 76