/* Objects to manage the interactions between the mesh data structures and the algebraic objects */ #if !defined(__PETSCDA_H) #define __PETSCDA_H #include "petscvec.h" #include "petscao.h" PETSC_EXTERN_CXX_BEGIN EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMInitializePackage(const char[]); /*S DM - Abstract PETSc object that manages an abstract grid object Level: intermediate Concepts: grids, grid refinement Notes: The DMDACreate() based object and the DMCompositeCreate() based object are examples of DMs Though the DM objects require the petscsnes.h include files the DM library is NOT dependent on the SNES or KSP library. In fact, the KSP and SNES libraries depend on DM. (This is not great design, but not trivial to fix). .seealso: DMCompositeCreate(), DMDACreate() S*/ typedef struct _p_DM* DM; /*E DMDAStencilType - Determines if the stencil extends only along the coordinate directions, or also to the northeast, northwest etc Level: beginner .seealso: DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMDACreate() E*/ typedef enum { DMDA_STENCIL_STAR,DMDA_STENCIL_BOX } DMDAStencilType; /*MC DMDA_STENCIL_STAR - "Star"-type stencil. In logical grid coordinates, only (i,j,k), (i+s,j,k), (i,j+s,k), (i,j,k+s) are in the stencil NOT, for example, (i+s,j+s,k) Level: beginner .seealso: DMDA_STENCIL_BOX, DMDAStencilType M*/ /*MC DMDA_STENCIL_BOX - "Box"-type stencil. In logical grid coordinates, any of (i,j,k), (i+s,j+r,k+t) may be in the stencil. Level: beginner .seealso: DMDA_STENCIL_STAR, DMDAStencilType M*/ /*E DMDAPeriodicType - Is the domain periodic in one or more directions Level: beginner DMDA_XYZGHOSTED means that ghost points are put around all the physical boundaries in the local representation of the Vec (i.e. DMDACreate/GetLocalVector(). .seealso: DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMDACreate() E*/ typedef enum { DMDA_NONPERIODIC,DMDA_XPERIODIC,DMDA_YPERIODIC,DMDA_XYPERIODIC, DMDA_XYZPERIODIC,DMDA_XZPERIODIC,DMDA_YZPERIODIC,DMDA_ZPERIODIC,DMDA_XYZGHOSTED} DMDAPeriodicType; extern const char *DMDAPeriodicTypes[]; /*E DMDAInterpolationType - Defines the type of interpolation that will be returned by DMGetInterpolation. Level: beginner .seealso: DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGetInterpolation(), DMDASetInterpolationType(), DMDACreate() E*/ typedef enum { DMDA_Q0, DMDA_Q1 } DMDAInterpolationType; EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetInterpolationType(DM,DMDAInterpolationType); /*E DMDAElementType - Defines the type of elements that will be returned by DMGetElements() Level: beginner .seealso: DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGetInterpolation(), DMDASetInterpolationType(), DMDASetElementType(), DMGetElements(), DMRestoreElements(), DMDACreate() E*/ typedef enum { DMDA_ELEMENT_P1, DMDA_ELEMENT_Q1 } DMDAElementType; EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetElementType(DM,DMDAElementType); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetElementType(DM,DMDAElementType*); #define DMDAXPeriodic(pt) ((pt)==DMDA_XPERIODIC||(pt)==DMDA_XYPERIODIC||(pt)==DMDA_XZPERIODIC||(pt)==DMDA_XYZPERIODIC) #define DMDAYPeriodic(pt) ((pt)==DMDA_YPERIODIC||(pt)==DMDA_XYPERIODIC||(pt)==DMDA_YZPERIODIC||(pt)==DMDA_XYZPERIODIC) #define DMDAZPeriodic(pt) ((pt)==DMDA_ZPERIODIC||(pt)==DMDA_XZPERIODIC||(pt)==DMDA_YZPERIODIC||(pt)==DMDA_XYZPERIODIC) typedef enum { DMDA_X,DMDA_Y,DMDA_Z } DMDADirection; extern PetscClassId PETSCDM_DLLEXPORT DM_CLASSID; #define MATSEQUSFFT "sequsfft" EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDACreate(MPI_Comm,DM*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetDim(DM,PetscInt); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetSizes(DM,PetscInt,PetscInt,PetscInt); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDACreate1d(MPI_Comm,DMDAPeriodicType,PetscInt,PetscInt,PetscInt,const PetscInt[],DM *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDACreate2d(MPI_Comm,DMDAPeriodicType,DMDAStencilType,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],DM*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDACreate3d(MPI_Comm,DMDAPeriodicType,DMDAStencilType,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscInt[],DM*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMSetOptionsPrefix(DM,const char []); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMSetVecType(DM,const VecType); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGlobalToNaturalBegin(DM,Vec,InsertMode,Vec); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGlobalToNaturalEnd(DM,Vec,InsertMode,Vec); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDANaturalToGlobalBegin(DM,Vec,InsertMode,Vec); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDANaturalToGlobalEnd(DM,Vec,InsertMode,Vec); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDALocalToLocalBegin(DM,Vec,InsertMode,Vec); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDALocalToLocalEnd(DM,Vec,InsertMode,Vec); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDACreateNaturalVector(DM,Vec *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDALoad(PetscViewer,PetscInt,PetscInt,PetscInt,DM *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetCorners(DM,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetGhostCorners(DM,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetInfo(DM,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,DMDAPeriodicType*,DMDAStencilType*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetProcessorSubset(DM,DMDADirection,PetscInt,MPI_Comm*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetProcessorSubsets(DM,DMDADirection,MPI_Comm*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGlobalToNaturalAllCreate(DM,VecScatter*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDANaturalAllToGlobalCreate(DM,VecScatter*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetGlobalIndices(DM,PetscInt*,PetscInt**); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetISLocalToGlobalMapping(DM,ISLocalToGlobalMapping*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetISLocalToGlobalMappingBlck(DM,ISLocalToGlobalMapping*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetScatter(DM,VecScatter*,VecScatter*,VecScatter*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetNeighbors(DM,const PetscMPIInt**); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetAO(DM,AO*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetCoordinates(DM,Vec); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetCoordinates(DM,Vec *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetGhostedCoordinates(DM,Vec *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetCoordinateDA(DM,DM *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetUniformCoordinates(DM,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetBoundingBox(DM,PetscReal[],PetscReal[]); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetLocalBoundingBox(DM,PetscReal[],PetscReal[]); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetFieldName(DM,PetscInt,const char[]); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetFieldName(DM,PetscInt,const char**); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetPeriodicity(DM, DMDAPeriodicType); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetDof(DM, int); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetStencilWidth(DM, PetscInt); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetOwnershipRanges(DM,const PetscInt[],const PetscInt[],const PetscInt[]); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAGetOwnershipRanges(DM,const PetscInt**,const PetscInt**,const PetscInt**); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetNumProcs(DM, PetscInt, PetscInt, PetscInt); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASetStencilType(DM, DMDAStencilType); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAVecGetArray(DM,Vec,void *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAVecRestoreArray(DM,Vec,void *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAVecGetArrayDOF(DM,Vec,void *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDAVecRestoreArrayDOF(DM,Vec,void *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMDASplitComm2d(MPI_Comm,PetscInt,PetscInt,PetscInt,MPI_Comm*); /*E DMType - String with the name of a PETSc DM or the creation function with an optional dynamic library name, for example http://www.mcs.anl.gov/petsc/lib.a:myveccreate() Level: beginner .seealso: DMSetType(), DM E*/ #define DMType char* #define DMDA "da" #define DMADDA "adda" #define DMCOMPOSITE "composite" #define DMSLICED "sliced" extern PetscFList DMList; extern PetscBool DMRegisterAllCalled; EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMCreate(MPI_Comm,DM*); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMSetType(DM, const DMType); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMGetType(DM, const DMType *); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMRegister(const char[],const char[],const char[],PetscErrorCode (*)(DM)); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMRegisterAll(const char []); EXTERN PetscErrorCode PETSCDM_DLLEXPORT DMRegisterDestroy(void); /*MC DMRegisterDynamic - Adds a new DM component implementation Synopsis: PetscErrorCode DMRegisterDynamic(const char *name,const char *path,const char *func_name, PetscErrorCode (*create_func)(DM)) Not Collective Input Parameters: + name - The name of a new user-defined creation routine . path - The path (either absolute or relative) of the library containing this routine . func_name - The name of routine to create method context - create_func - The creation routine itself Notes: DMRegisterDynamic() may be called multiple times to add several user-defined DMs If dynamic libraries are used, then the fourth input argument (routine_create) is ignored. Sample usage: .vb DMRegisterDynamic("my_da","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyDMCreate", MyDMCreate); .ve Then, your DM type can be chosen with the procedural interface via .vb DMCreate(MPI_Comm, DM *); DMSetType(DM,"my_da_name"); .ve or at runtime via the option .vb -da_type my_da_name .ve Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values. If your function is not being put into a shared library then use DMRegister() instead Level: advanced .keywords: DM, register .seealso: DMRegisterAll(), DMRegisterDestroy(), DMRegister() M*/ #if defined(PETSC_USE_DYNAMIC_LIBRARIES) #define DMRegisterDynamic(a,b,c,d) DMRegister(a,b,c,0) #else #define DMRegisterDynamic(a,b,c,d) DMRegister(a,b,c,d) #endif EXTERN PetscErrorCode PETSCDM_DLLEXPORT MatRegisterDAAD(void); EXTERN PetscErrorCode PETSCDM_DLLEXPORT MatCreateDAAD(DM,Mat*); EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqUSFFT(Vec, DM,Mat*); /*S DMDALocalInfo - C struct that contains information about a structured grid and a processors logical location in it. Level: beginner Concepts: distributed array Developer note: Then entries in this struct are int instead of PetscInt so that the elements may be extracted in Fortran as if from an integer array .seealso: DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMDestroy(), DM, DMDAGetLocalInfo(), DMDAGetInfo() S*/ typedef struct { PetscInt dim,dof,sw; PetscInt mx,my,mz; /* global number of grid points in each direction */ PetscInt xs,ys,zs; /* starting pointd of this processor, excluding ghosts */ PetscInt xm,ym,zm; /* number of grid points on this processor, excluding ghosts */ PetscInt gxs,gys,gzs; /* starting point of this processor including ghosts */ PetscInt gxm,gym,gzm; /* number of grid points on this processor including ghosts */ DMDAPeriodicType pt; DMDAStencilType st; DM da; } DMDALocalInfo; /*MC DMDAForEachPointBegin2d - Starts a loop over the local part of a two dimensional DMDA Synopsis: void DMDAForEachPointBegin2d(DALocalInfo *info,PetscInt i,PetscInt j); Not Collective Level: intermediate .seealso: DMDAForEachPointEnd2d(), DMDAVecGetArray() M*/ #define DMDAForEachPointBegin2d(info,i,j) {\ PetscInt _xints = info->xs,_xinte = info->xs+info->xm,_yints = info->ys,_yinte = info->ys+info->ym;\ for (j=_yints; j<_yinte; j++) {\ for (i=_xints; i<_xinte; i++) {\ /*MC DMDAForEachPointEnd2d - Ends a loop over the local part of a two dimensional DMDA Synopsis: void DMDAForEachPointEnd2d; Not Collective Level: intermediate .seealso: DMDAForEachPointBegin2d(), DMDAVecGetArray() M*/ #define DMDAForEachPointEnd2d }}} /*MC DMDACoor2d - Structure for holding 2d (x and y) coordinates. Level: intermediate Sample Usage: DMDACoor2d **coors; Vec vcoors; DM cda; DMDAGetCoordinates(da,&vcoors); DMDAGetCoordinateDA(da,&cda); DMDAVecGetArray(cda,vcoors,&coors); DMDAGetCorners(cda,&mstart,&nstart,0,&m,&n,0) for (i=mstart; i EXTERN PetscErrorCode PETSCSYS_DLLEXPORT PetscViewerBinaryMatlabOpen(MPI_Comm, const char [], PetscViewer*); EXTERN PetscErrorCode PETSCSYS_DLLEXPORT PetscViewerBinaryMatlabDestroy(PetscViewer); EXTERN PetscErrorCode PETSCSYS_DLLEXPORT PetscViewerBinaryMatlabOutputBag(PetscViewer, const char [], PetscBag); EXTERN PetscErrorCode PETSCSYS_DLLEXPORT PetscViewerBinaryMatlabOutputVec(PetscViewer, const char [], Vec); EXTERN PetscErrorCode PETSCSYS_DLLEXPORT PetscViewerBinaryMatlabOutputVecDA(PetscViewer, const char [], Vec, DM); PetscErrorCode PETSCDM_DLLEXPORT DMADDACreate(MPI_Comm,PetscInt,PetscInt*,PetscInt*,PetscInt,PetscBool *,DM*); PetscErrorCode PETSCDM_DLLEXPORT DMADDASetParameters(DM,PetscInt,PetscInt*,PetscInt*,PetscInt,PetscBool*); PetscErrorCode PETSCDM_DLLEXPORT DMADDASetRefinement(DM, PetscInt *,PetscInt); PetscErrorCode PETSCDM_DLLEXPORT DMADDAGetCorners(DM, PetscInt **, PetscInt **); PetscErrorCode PETSCDM_DLLEXPORT DMADDAGetGhostCorners(DM, PetscInt **, PetscInt **); PetscErrorCode PETSCDM_DLLEXPORT DMADDAGetMatrixNS(DM, DM, const MatType , Mat *); /* functions to set values in vectors and matrices */ struct _ADDAIdx_s { PetscInt *x; /* the coordinates, user has to make sure it is the correct size! */ PetscInt d; /* indexes the dof */ }; typedef struct _ADDAIdx_s ADDAIdx; PetscErrorCode PETSCDM_DLLEXPORT DMADDAMatSetValues(Mat, DM, PetscInt, const ADDAIdx[], DM, PetscInt, const ADDAIdx[], const PetscScalar[], InsertMode); PetscBool ADDAHCiterStartup(const PetscInt, const PetscInt *const, const PetscInt *const, PetscInt *const); PetscBool ADDAHCiter(const PetscInt, const PetscInt *const, const PetscInt *const, PetscInt *const); PETSC_EXTERN_CXX_END #endif