1e0eea495SMark #if !defined(PETSCLANDAU_H) 2e0eea495SMark #define PETSCLANDAU_H 3e0eea495SMark 4e0eea495SMark #include <petscdmplex.h> /*I "petscdmplex.h" I*/ 5e0eea495SMark #include <petscts.h> 6e0eea495SMark 7e0eea495SMark PETSC_EXTERN PetscErrorCode LandauPrintNorms(Vec, PetscInt); 8e0eea495SMark PETSC_EXTERN PetscErrorCode LandauCreateVelocitySpace(MPI_Comm,PetscInt,const char[],Vec*,Mat*,DM*); 9e0eea495SMark PETSC_EXTERN PetscErrorCode LandauDestroyVelocitySpace(DM*); 10e0eea495SMark PETSC_EXTERN PetscErrorCode LandauAddMaxwellians(DM, Vec, PetscReal, PetscReal[], PetscReal[], void *); 11e0eea495SMark PETSC_EXTERN PetscErrorCode LandauCreateMassMatrix(DM dm, Mat *Amat); 12e0eea495SMark PETSC_EXTERN PetscErrorCode LandauIFunction(TS, PetscReal,Vec,Vec,Vec,void *); 13e0eea495SMark PETSC_EXTERN PetscErrorCode LandauIJacobian(TS, PetscReal,Vec,Vec,PetscReal,Mat,Mat,void *); 14e0eea495SMark 15e0eea495SMark /* the Fokker-Planck-Landau context */ 16e0eea495SMark #if !defined(LANDAU_DIM) 17e0eea495SMark #define LANDAU_DIM 2 18e0eea495SMark #endif 19e0eea495SMark #if !defined(LANDAU_MAX_SPECIES) 20*52cdd6eaSMark #if LANDAU_DIM==2 21e0eea495SMark #define LANDAU_MAX_SPECIES 10 22*52cdd6eaSMark #else 23*52cdd6eaSMark #define LANDAU_MAX_SPECIES 3 24*52cdd6eaSMark #endif 25e0eea495SMark #endif 26e0eea495SMark #if !defined(LANDAU_MAX_NQ) 27*52cdd6eaSMark #if LANDAU_DIM==2 28e0eea495SMark #define LANDAU_MAX_NQ 25 29e0eea495SMark #else 30*52cdd6eaSMark #define LANDAU_MAX_NQ 27 31e0eea495SMark #endif 32e0eea495SMark #endif 33e0eea495SMark typedef enum {LANDAU_CUDA, LANDAU_KOKKOS, LANDAU_CPU} LandauDeviceType; 34e0eea495SMark typedef struct { 35e0eea495SMark PetscBool interpolate; /* Generate intermediate mesh elements */ 36e0eea495SMark PetscBool simplex; 37e0eea495SMark PetscFE fe[LANDAU_MAX_SPECIES]; 38e0eea495SMark /* geometry */ 39e0eea495SMark PetscReal i_radius; 40e0eea495SMark PetscReal e_radius; 41e0eea495SMark PetscInt num_sections; 42e0eea495SMark PetscReal radius; 43e0eea495SMark PetscReal re_radius; /* radius of refinement along v_perp=0, z>0 */ 44e0eea495SMark PetscReal vperp0_radius1; /* radius of refinement along v_perp=0 */ 45e0eea495SMark PetscReal vperp0_radius2; /* radius of refinement along v_perp=0 after origin AMR refinement */ 46e0eea495SMark PetscBool sphere; 47e0eea495SMark PetscBool inflate; 48e0eea495SMark PetscInt numRERefine; /* refinement along v_perp=0, z > 0 */ 49e0eea495SMark PetscInt nZRefine1; /* origin refinement after v_perp=0 refinement */ 50e0eea495SMark PetscInt nZRefine2; /* origin refinement after origin AMR refinement */ 51e0eea495SMark PetscInt maxRefIts; /* normal AMR - refine from origin */ 52e0eea495SMark PetscInt postAMRRefine; /* uniform refinement of AMR */ 53e0eea495SMark /* discretization - AMR */ 54e0eea495SMark PetscErrorCode (*errorIndicator)(PetscInt, PetscReal, PetscReal [], PetscInt, const PetscInt[], const PetscScalar[], const PetscScalar[], PetscReal *, void *); 55e0eea495SMark PetscReal refineTol[LANDAU_MAX_SPECIES]; 56e0eea495SMark PetscReal coarsenTol[LANDAU_MAX_SPECIES]; 57e0eea495SMark /* physics */ 58e0eea495SMark PetscReal thermal_temps[LANDAU_MAX_SPECIES]; 59e0eea495SMark PetscReal masses[LANDAU_MAX_SPECIES]; /* mass of each species */ 60e0eea495SMark PetscReal charges[LANDAU_MAX_SPECIES]; /* charge of each species */ 61e0eea495SMark PetscReal n[LANDAU_MAX_SPECIES]; /* number density of each species */ 62e0eea495SMark PetscReal m_0; /* reference mass */ 63e0eea495SMark PetscReal v_0; /* reference velocity */ 64e0eea495SMark PetscReal n_0; /* reference number density */ 65e0eea495SMark PetscReal t_0; /* reference time */ 66e0eea495SMark PetscReal Ez; 67e0eea495SMark PetscReal epsilon0; 68e0eea495SMark PetscReal k; 69e0eea495SMark PetscReal lnLam; 70e0eea495SMark PetscReal electronShift; /* for tests */ 71e0eea495SMark PetscInt num_species; 72e0eea495SMark /* diagnostics */ 73e0eea495SMark PetscInt verbose; 74e0eea495SMark PetscLogEvent events[20]; 75e0eea495SMark DM dmv; 76e0eea495SMark /* cache */ 77e0eea495SMark Mat J; 78e0eea495SMark Mat M; 79e0eea495SMark Vec X; 80e0eea495SMark PetscReal normJ; /* used to see if function changed */ 81e0eea495SMark /* derived type */ 82e0eea495SMark void *data; 83e0eea495SMark PetscBool aux_bool; /* helper */ 84e0eea495SMark /* computing */ 85e0eea495SMark LandauDeviceType deviceType; 86e0eea495SMark PetscInt subThreadBlockSize; 87e0eea495SMark } LandauCtx; 88e0eea495SMark 89*52cdd6eaSMark typedef PetscReal LandauIPReal; 90e0eea495SMark typedef struct { 91*52cdd6eaSMark LandauIPReal *w_data; 92*52cdd6eaSMark LandauIPReal *x; 93*52cdd6eaSMark LandauIPReal *y; 94*52cdd6eaSMark LandauIPReal *z; 95*52cdd6eaSMark LandauIPReal *f; 96*52cdd6eaSMark LandauIPReal *dfx; 97*52cdd6eaSMark LandauIPReal *dfy; 98*52cdd6eaSMark LandauIPReal *dfz; 99*52cdd6eaSMark int dim_,ns_,nip_; 100*52cdd6eaSMark } LandauIPData; 101e0eea495SMark 102e0eea495SMark PETSC_EXTERN PetscErrorCode LandauAssembleOpenMP(PetscInt cStart, PetscInt cEnd, PetscInt totDim, DM plex, PetscSection section, PetscSection globalSection, Mat JacP, PetscScalar elemMats[], PetscContainer container); 103e0eea495SMark PETSC_EXTERN PetscErrorCode LandauCreateColoring(Mat, DM, PetscContainer *); 104e0eea495SMark PETSC_EXTERN PetscErrorCode LandauFormJacobian_Internal(Vec, Mat, const PetscInt, void *); 105*52cdd6eaSMark PETSC_EXTERN int LandauGetIPDataSize(const LandauIPData *const); 106e0eea495SMark #if defined(PETSC_HAVE_CUDA) 107e0eea495SMark PETSC_EXTERN PetscErrorCode LandauCUDAJacobian(DM, const PetscInt, const PetscReal [], const PetscReal [], const PetscReal[], const PetscReal[], 108*52cdd6eaSMark const LandauIPData *const, const PetscReal [],const PetscInt, const PetscLogEvent[], Mat); 109e0eea495SMark #endif 110e0eea495SMark #if defined(PETSC_HAVE_KOKKOS) 111e0eea495SMark /* TODO: this won't work if PETSc is built with C++ */ 112e0eea495SMark #if !defined(__cplusplus) 113e0eea495SMark PETSC_EXTERN PetscErrorCode LandauKokkosJacobian(DM, const PetscInt, const PetscReal [], const PetscReal [], const PetscReal[], const PetscReal[], 114*52cdd6eaSMark const LandauIPData *const, const PetscReal [],const PetscInt, const PetscLogEvent[], Mat); 115e0eea495SMark #endif 116e0eea495SMark #endif 117e0eea495SMark 118e0eea495SMark #endif /* PETSCLANDAU_H */ 119