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 19a587d139SMark 20e0eea495SMark #if !defined(LANDAU_MAX_SPECIES) 2152cdd6eaSMark #if LANDAU_DIM==2 22e0eea495SMark #define LANDAU_MAX_SPECIES 10 2352cdd6eaSMark #else 2452cdd6eaSMark #define LANDAU_MAX_SPECIES 3 2552cdd6eaSMark #endif 26e0eea495SMark #endif 27a587d139SMark 28a587d139SMark #if !defined(LANDAU_MAX_Q) 29a587d139SMark #if defined(LANDAU_MAX_NQ) 30a587d139SMark #error"LANDAU_MAX_NQ but not LANDAU_MAX_Q. Use -DLANDAU_MAX_Q=4 for Q3 elements" 31a587d139SMark #endif 3252cdd6eaSMark #if LANDAU_DIM==2 33a587d139SMark #define LANDAU_MAX_Q 5 34e0eea495SMark #else 35a587d139SMark #define LANDAU_MAX_Q 3 36a587d139SMark #endif 37a587d139SMark #else 38a587d139SMark #undef LANDAU_MAX_NQ 39e0eea495SMark #endif 40a587d139SMark 41a587d139SMark #if LANDAU_DIM==2 42*930e68a5SMark Adams #define LANDAU_MAX_Q_FACE LANDAU_MAX_Q 43a587d139SMark #define LANDAU_MAX_NQ (LANDAU_MAX_Q*LANDAU_MAX_Q) 44a587d139SMark #else 45*930e68a5SMark Adams #define LANDAU_MAX_Q_FACE (LANDAU_MAX_Q*LANDAU_MAX_Q) 46a587d139SMark #define LANDAU_MAX_NQ (LANDAU_MAX_Q*LANDAU_MAX_Q*LANDAU_MAX_Q) 47a587d139SMark #endif 48a587d139SMark 49e0eea495SMark typedef enum {LANDAU_CUDA, LANDAU_KOKKOS, LANDAU_CPU} LandauDeviceType; 50e0eea495SMark typedef struct { 51e0eea495SMark PetscBool interpolate; /* Generate intermediate mesh elements */ 52a587d139SMark PetscBool gpu_assembly; 53e0eea495SMark PetscFE fe[LANDAU_MAX_SPECIES]; 54e0eea495SMark /* geometry */ 55e0eea495SMark PetscReal i_radius; 56e0eea495SMark PetscReal e_radius; 57e0eea495SMark PetscInt num_sections; 58e0eea495SMark PetscReal radius; 59e0eea495SMark PetscReal re_radius; /* radius of refinement along v_perp=0, z>0 */ 60e0eea495SMark PetscReal vperp0_radius1; /* radius of refinement along v_perp=0 */ 61e0eea495SMark PetscReal vperp0_radius2; /* radius of refinement along v_perp=0 after origin AMR refinement */ 62e0eea495SMark PetscBool sphere; 63e0eea495SMark PetscBool inflate; 64e0eea495SMark PetscInt numRERefine; /* refinement along v_perp=0, z > 0 */ 65e0eea495SMark PetscInt nZRefine1; /* origin refinement after v_perp=0 refinement */ 66e0eea495SMark PetscInt nZRefine2; /* origin refinement after origin AMR refinement */ 67e0eea495SMark PetscInt maxRefIts; /* normal AMR - refine from origin */ 68e0eea495SMark PetscInt postAMRRefine; /* uniform refinement of AMR */ 69e0eea495SMark /* discretization - AMR */ 70e0eea495SMark PetscErrorCode (*errorIndicator)(PetscInt, PetscReal, PetscReal [], PetscInt, const PetscInt[], const PetscScalar[], const PetscScalar[], PetscReal *, void *); 71e0eea495SMark PetscReal refineTol[LANDAU_MAX_SPECIES]; 72e0eea495SMark PetscReal coarsenTol[LANDAU_MAX_SPECIES]; 73e0eea495SMark /* physics */ 74e0eea495SMark PetscReal thermal_temps[LANDAU_MAX_SPECIES]; 75e0eea495SMark PetscReal masses[LANDAU_MAX_SPECIES]; /* mass of each species */ 76e0eea495SMark PetscReal charges[LANDAU_MAX_SPECIES]; /* charge of each species */ 77e0eea495SMark PetscReal n[LANDAU_MAX_SPECIES]; /* number density of each species */ 78e0eea495SMark PetscReal m_0; /* reference mass */ 79e0eea495SMark PetscReal v_0; /* reference velocity */ 80e0eea495SMark PetscReal n_0; /* reference number density */ 81e0eea495SMark PetscReal t_0; /* reference time */ 82e0eea495SMark PetscReal Ez; 83e0eea495SMark PetscReal epsilon0; 84e0eea495SMark PetscReal k; 85e0eea495SMark PetscReal lnLam; 86e0eea495SMark PetscReal electronShift; /* for tests */ 87e0eea495SMark PetscInt num_species; 88e0eea495SMark /* diagnostics */ 89e0eea495SMark PetscInt verbose; 90e0eea495SMark PetscLogEvent events[20]; 91e0eea495SMark DM dmv; 92e0eea495SMark /* cache */ 93e0eea495SMark Mat J; 94e0eea495SMark Mat M; 95e0eea495SMark Vec X; 96e0eea495SMark PetscReal normJ; /* used to see if function changed */ 97e0eea495SMark /* derived type */ 98e0eea495SMark void *data; 99e0eea495SMark PetscBool aux_bool; /* helper */ 100e0eea495SMark /* computing */ 101e0eea495SMark LandauDeviceType deviceType; 102*930e68a5SMark Adams PetscInt subThreadBlockSize; /* just used for Kokkos, could hardwire like Cuda, but Kokkos is portable */ 103*930e68a5SMark Adams MPI_Comm comm; /* global communicator to use for errors and diagnostics */ 104e0eea495SMark } LandauCtx; 105e0eea495SMark 106a587d139SMark typedef int LandauIdx; 107a587d139SMark typedef struct { 108a587d139SMark PetscReal scale; 109a587d139SMark LandauIdx gid; // Lanadu matrix index (<10,000) 110a587d139SMark } pointInterpolationP4est; 111a587d139SMark typedef struct _lP4estVertexMaps { 112a587d139SMark LandauIdx (*gIdx)[LANDAU_MAX_SPECIES][LANDAU_MAX_NQ]; // #elems * LANDAU_MAX_NQ (spoof for max , Nb) on device, 113a587d139SMark LandauIdx num_elements; 114a587d139SMark LandauIdx num_reduced; 115a587d139SMark LandauIdx num_face; // (Q or Q^2 for 3D) 116a587d139SMark LandauDeviceType deviceType; 117a587d139SMark PetscInt Nf; 118a587d139SMark PetscInt Nq; 119a587d139SMark pointInterpolationP4est (*c_maps)[LANDAU_MAX_Q_FACE]; 120a587d139SMark struct _lP4estVertexMaps*data; 121a587d139SMark void *vp1,*vp2,*vp3; 122a587d139SMark } P4estVertexMaps; 123a587d139SMark 12452cdd6eaSMark typedef PetscReal LandauIPReal; 125e0eea495SMark typedef struct { 126a587d139SMark LandauIPReal *w; 12752cdd6eaSMark LandauIPReal *x; 12852cdd6eaSMark LandauIPReal *y; 12952cdd6eaSMark LandauIPReal *z; 130a587d139SMark LandauIPReal *coefs; 13152cdd6eaSMark int dim_,ns_,nip_; 13252cdd6eaSMark } LandauIPData; 133e0eea495SMark 134e0eea495SMark PETSC_EXTERN PetscErrorCode LandauCreateColoring(Mat, DM, PetscContainer *); 13552cdd6eaSMark PETSC_EXTERN int LandauGetIPDataSize(const LandauIPData *const); 136e0eea495SMark #if defined(PETSC_HAVE_CUDA) 137e0eea495SMark PETSC_EXTERN PetscErrorCode LandauCUDAJacobian(DM, const PetscInt, const PetscReal [], const PetscReal [], const PetscReal[], const PetscReal[], 138*930e68a5SMark Adams const LandauIPData *const, const PetscReal [], PetscReal *, PetscReal, const PetscLogEvent[], Mat); 139a587d139SMark PETSC_EXTERN PetscErrorCode LandauCUDACreateMatMaps(P4estVertexMaps *, pointInterpolationP4est (*)[LANDAU_MAX_Q_FACE], PetscInt, PetscInt); 140a587d139SMark PETSC_EXTERN PetscErrorCode LandauCUDADestroyMatMaps(P4estVertexMaps *); 141a587d139SMark 142e0eea495SMark #endif 143e0eea495SMark #if defined(PETSC_HAVE_KOKKOS) 144e0eea495SMark /* TODO: this won't work if PETSc is built with C++ */ 145e0eea495SMark #if !defined(__cplusplus) 146e0eea495SMark PETSC_EXTERN PetscErrorCode LandauKokkosJacobian(DM, const PetscInt, const PetscReal [], const PetscReal [], const PetscReal[], const PetscReal[], 147*930e68a5SMark Adams const LandauIPData *const, const PetscReal [],const PetscInt, PetscReal *, PetscReal, const PetscLogEvent[], Mat); 148a587d139SMark PETSC_EXTERN PetscErrorCode LandauKokkosCreateMatMaps(P4estVertexMaps *, pointInterpolationP4est (*)[LANDAU_MAX_Q_FACE], PetscInt, PetscInt); 149a587d139SMark PETSC_EXTERN PetscErrorCode LandauKokkosDestroyMatMaps(P4estVertexMaps *); 150e0eea495SMark #endif 151e0eea495SMark #endif 152e0eea495SMark 153e0eea495SMark #endif /* PETSCLANDAU_H */ 154