Classes and functions¶
Mesh_cuda.h¶
-
class
Sea¶ - #include <Mesh_cuda.h>
A class that manages the simulation.
Implements Sea class.
Public Functions
-
Sea(int _nx, int _ny, int _nt, int _ng, int _r, float _df, float xmin, float xmax, float ymin, float ymax, float zmin, float zmax, float *_rho, float _Q, float _gamma, float _E_He, float _Cv, float _alpha, float *_beta, float *_gamma_down, bool _periodic, bool _burning, int _dprint, int _print_level)¶ Constructor from list of parameters.
-
Sea(stringstream &inputFile, char *filename)¶ Constructor for Sea class using inputs from file.
Data is validated: an error will be thrown and the program terminated if any of the inputs are found to be invalid.
- Parameters
filename: name of input file
-
Sea(char *filename)¶
-
void
initial_swe_data(float *D0, float *Sx0, float *Sy0)¶ Initialise D, Sx, Sy.
- Parameters
D0: conserved densitySx0: conserved x-velocitySy0: conserved y-velocity
-
void
initial_compressible_data(float *D0, float *Sx0, float *Sy0, float *Sz0, float *tau0)¶ Initialise D, Sx, Sy, Sz, tau.
- Parameters
D0: conserved densitySx0: conserved x-velocitySy0: conserved y-velocitySz0: conserved z-velocitytau: conserved energy
-
void
bcs(float *grid, int n_x, int n_y, int n_z, int vec_dim)¶ Enforce boundary conditions on grid of quantities with dimension vec_dim.
- Parameters
grid: grid on which boundary conditions are to be enforcedn_xn_yn_z: grid dimensionsvec_dim: dimension of state vector
-
void
print_inputs()¶ Print some input and runtime parameters to screen.
-
void
run(MPI_Comm comm, MPI_Status *status, int rank, int size, int tstart)¶ Run simulation.
- Parameters
comm: MPI communicatorstatus: MPI status flagrank: MPI process rank numbersize: Total number of MPI processeststart: Start time
-
~Sea()¶ Deconstructor. Clean up member arrays.
Public Members
-
int
nx¶ number of gridpoints in x-direction of coarsest grid
-
int
ny¶ number of gridpoints in y-direction of coarsest grid
-
int *
nxs¶ number of gridpoints in x-direction of grids
-
int *
nys¶ number of gridpoints in y-direction of grids
-
int *
nzs¶ Number of layers to have in each grid
-
int
ng¶ Number of ghost cells
-
int
nlevels¶ Number of levels of mesh refinement
-
char *
models¶ Array describing the physical model to use on each level. S = single layer SWE, M = multilayer SWE, C = compressible, L = Low Mach
-
int *
vec_dims¶ Dimensions of state vectors on each grid
-
float
gamma¶ Adiabatic index
-
float
alpha0¶ Lapse function
-
float
R¶ Radius of star
-
float
dz¶ Gridpoint separation in the z-direction of fine (compressible grid)
-
float
zmin¶ Height of sea floor
-
float
zmax¶ Maximum height of sea surface
-
float *
xs¶ Vector of x-coordinates of coarsest gridpoints
-
float *
ys¶ Vector of y-coordinates of coarsest gridpoints
-
float **
Us¶ Array of pointers to grids.
-
float *
p_const¶ Array of constant pressures on shallow water grids.
Public Static Functions
-
static void
invert_mat(float *A, int m, int n)¶ Invert the m x n matrix M in place using Gaussian elimination.
- Parameters
A: Matrix to be invertedmn: Dimensions of matrix
Private Functions
-
void
init_sea(stringstream &inputFile, char *filename)¶
Private Members
-
int
nt¶ Total number of timesteps to run simulation for
-
int
r¶ refinement ratio
-
int *
matching_indices¶ Location of fine grids wrt coarser grid coordinates
-
float
dx¶ Gridpoint separation in x-direction on coarsest grid
-
float
dy¶ Gridpoint separation in y-direction on coarsest grid
-
float
dt¶ Timestep
-
float
df¶ Fraction of coarse grid covered by fine grid
-
float *
rho¶ Vector of density in each of the shallow water layers
-
float
Q¶ Mass transfer rate
-
float
E_He¶ Energy release per unit mass of helium burning
-
float
Cv¶ Specific heat at constant volume
-
float
beta[3]¶ Shift vector
-
float
gamma_down[3 *3]¶ Covariant spatial metric
-
float
gamma_up[3 *3]¶ Contravariant spatial metric
-
bool
periodic¶ Are the boundaries periodic (true) or outflow (false)
-
bool
burning¶ Do we include burning? (True)
-
int
dprint¶ number of timesteps between printouts
-
int
n_print_levels¶ number of the level to be output to file
-
int *
print_levels¶ number of the level to be output to file
-
char
outfile[200]¶ Name of (hdf5) file to print output data to
-
char
paramfile[200]¶ Name of parameter file
-
mesh_cuda_kernel.h¶
Typedefs
-
typedef void (*
flux_func_ptr)(float *q, float *f, int dir, float alpha0, float gamma, float zmin, float dz, int nz, int layer, float R)¶
-
typedef float (*
fptr)(float p, float D, float Sx, float Sy, float Sz, float tau, float gamma, float *gamma_up)¶
Functions
-
unsigned int
nextPow2(unsigned int x)¶
-
__host__ __device__ bool nan_check(float a) check to see whether float a is a nan
-
__host__ __device__ float zbrent(fptr func, const float x1, const float x2, const float tol, float D, float Sx, float Sy, float Sz, float tau, float gamma, float * gamma_up) Using Brent’s method, return the root of a function or functor func known to lie between x1 and x2. The root will be regined until its accuracy is tol.
- Parameters
func: function pointer to shallow water or compressible flux function.x1x2: limits of roottol: tolerance to which root shall be calculated toDSxSySztau: conserved variablesgamma: adiabatic index
-
void
check_mpi_error(int mpi_err)¶ Checks to see if the integer returned by an mpi function, mpi_err, is an MPI error. If so, it prints out some useful stuff to screen.
-
void
getNumKernels(int nx, int ny, int nz, int ng, int n_processes, int *maxBlocks, int *maxThreads, dim3 *kernels, int *cumulative_kernels)¶ Return the number of kernels needed to run the problem given its size and the constraints of the GPU.
- Parameters
nxnynz: dimensions of problemng: number of ghost cellsmaxBlocksmaxThreads: maximum number of blocks and threads possible for device(s)n_processes: number of MPI processeskernels: number of kernels per processcumulative_kernels: cumulative total of kernels per process
-
void
getNumBlocksAndThreads(int nx, int ny, int nz, int ng, int maxBlocks, int maxThreads, int n_processes, dim3 *kernels, dim3 *blocks, dim3 *threads)¶ Returns the number of blocks and threads required for each kernel given the size of the problem and the constraints of the device.
- Parameters
nxnynz: dimensions of problemng: number of ghost cellsmaxBlocksmaxThreads: maximum number of blocks and threads possible for device(s)n_processes: number of MPI processeskernelsblocksthreads: number of kernels, blocks and threads per process / kernel
-
void
bcs_fv(float *grid, int nx, int ny, int nz, int ng, int vec_dim, bool periodic)¶ Enforce boundary conditions on section of grid.
- Parameters
grid: grid of datanxnynz: dimensions of gridng: number of ghost cellsvec_dim: dimension of state vectorperiodic: do we use periodic or outflow boudary conditions?
-
void
bcs_mpi(float *grid, int nx, int ny, int nz, int vec_dim, int ng, MPI_Comm comm, MPI_Status status, int rank, int n_processes, int y_size, bool do_z, bool periodic)¶ Enforce boundary conditions across processes / at edges of grid.
Loops have been ordered in a way so as to try and keep memory accesses as contiguous as possible.
Need to do non-blocking send, blocking receive then wait.
- Parameters
grid: grid of datanxnynz: dimensions of gridvec_dim: dimension of state vectorng: number of ghost cellscomm: MPI communicatorstatus: status of MPI processesrankn_processes: rank of MPI process and total number of MPI processesy_size: size of grid in y direction running on each process (except the last one)do_z: true if need to implement bcs in vertical direction as wellperiodic: do we use periodic or outflow boudary conditions?
-
__host__ __device__ float W_swe(float * q, float * gamma_up) calculate Lorentz factor for conserved swe state vector
-
__host__ __device__ float phi(float r) calculate superbee slope limiter Phi(r)
-
__host__ __device__ float find_height(float ph, float R) Finds r given Phi.
-
__device__ float find_pot(float r, float R) Finds Phi given r.
-
__device__ float rhoh_from_p(float p, float rho, float gamma) calculate rhoh using p for gamma law equation of state
-
__device__ float p_from_rhoh(float rhoh, float rho, float gamma) calculate p using rhoh for gamma law equation of state
-
__device__ __host__ float p_from_rho_eps(float rho, float eps, float gamma) calculate p using rho and epsilon for gamma law equation of state
-
__device__ __host__ float phi_from_p(float p, float rho, float gamma, float A) Calculate the metric potential Phi given p for gamma law equation of state
- Parameters
prho: pressure and densitygamma: adiabatic indexA: constant used in Phi to p conversion
-
__host__ __device__ float f_of_p(float p, float D, float Sx, float Sy, float Sz, float tau, float gamma, float * gamma_up) Function of p whose root is to be found when doing conserved to primitive variable conversion
- Parameters
p: pressureDSxSySztau: components of conserved state vectorgamma: adiabatic index
-
__device__ float h_dot(float phi, float old_phi, float dt, float R) Calculates the time derivative of the height given the shallow water variable phi at current time and previous timestep NOTE: this is an upwinded approximation of hdot - there may be a better way to do this which will more accurately give hdot at current time.
- Parameters
phi: Phi at current timestepold_phi: Phi at previous timestepdt: timestep
-
__device__ float calc_Q_swe(float rho, float p, float gamma, float Y, float Cv) Calculate the heating rate per unit mass from the shallow water variables
- Parameters
rho: densities of layersp: pressuregamma: adiabatic indexY: species fractionCv: specific heat in constant volume
-
void
calc_Q(float *rho, float *q_cons, int nx, int ny, int nz, float gamma, float *Q, float Cv, float *gamma_up)¶ Calculate the heating rate per unit mass.
- Parameters
rho: densities of layersq_cons: conservative state vectornxnynz: dimensions of gridgamma: adiabatic indexQ: array that shall contain heating rate per unit massCv: specific heat in constant volumegamma_up: spatial metric
-
__device__ void calc_As(float * rhos, float * phis, float * A, int nlayers, float gamma, float surface_phi, float surface_rho) Calculates the As used to calculate the pressure given Phi, given the pressure at the sea floor
- Parameters
rhos: densities of layersphis: Vector of Phi for different layersA: vector of As for layersnlayers: number of layersgamma: adiabatic indexsurface_phi: Phi at surfacesurface_rho: density at surface
-
__device__ void find_constant_p_surfaces(float * p_const, float gamma, float * q_comp, float * q_swe, float zmin, float dz, int * nxs, int * nys, int * nzs, int clevel, int kx_offset, int ky_offset, int * matching_indices)
-
__device__ void enforce_hse_d(float * q_comp, float * q_swe, int kx_offset, int ky_offset, int * nxs, int * nys, int * nzs, int ng, int level, int clevel, float zmin, float dz, int * matching_indices_d, float gamma, float R, float alpha0)
-
void
enforce_hse(float *q_comp, float *q_swe, int *nxs, int *nys, int *nzs, int ng, int level, int clevel, float zmin, float dz, int *matching_indices, float gamma)¶
-
__device__ void cons_to_prim_comp_d(float * q_cons, float * q_prim, float gamma, float * gamma_up) Convert compressible conserved variables to primitive variables
- Parameters
q_cons: state vector of conserved variablesq_prim: state vector of primitive variablesgamma: adiabatic index
-
void
cons_to_prim_comp(float *q_cons, float *q_prim, int nxf, int nyf, int nz, float gamma, float *gamma_up)¶ Convert compressible conserved variables to primitive variables
- Parameters
q_cons: grid of conserved variablesq_prim: grid where shall put the primitive variablesnxfnyfnz: grid dimensionsgamma: adiabatic indexgamma_up: spatial metric
-
__device__ void shallow_water_fluxes(float * q, float * f, int dir, float alpha0, float gamma, float zmin, float dz, float nz, float layer, float R) Calculate the flux vector of the shallow water equations
- Parameters
q: state vectorf: grid where fluxes shall be storeddir: 0 if calculating flux in x-direction, 1 if in y-directionalpha: lapse functiongamma: adiabatic index
-
__device__ void compressible_fluxes(float * q, float * f, int dir, float alpha0, float gamma, float zmin, float dz, float nz, float layer, float R) Calculate the flux vector of the compressible GR hydrodynamics equations
- Parameters
q: state vectorf: grid where fluxes shall be storeddir: 0 if calculating flux in x-direction, 1 if in y-direction, 2 if in z-directionalpha: lapse functiongamma: adiabatic index
-
void
p_from_swe(float *q, float *p, int nx, int ny, int nz, float rho, float gamma, float A, float *gamma_up)¶ Calculate p using SWE conserved variables
- Parameters
q: state vectorp: grid where pressure shall be storednxnynz: grid dimensionsrho: densitygamma: adiabatic indexA: variable required in p(Phi) calculationgamma_up: spatial metric
-
__device__ float p_from_swe(float * q, float rho, float gamma, float W, float A) Calculates p and returns using SWE conserved variables
- Parameters
q: state vectorrho: densitygamma: adiabatic indexW: Lorentz factorA: variable required in p(Phi) calculation
-
__global__ void compressible_from_swe(float * q, float * q_comp, int * nxs, int * nys, int * nzs, float * rho, float gamma, int kx_offset, int ky_offset, float dt, float * old_phi, int level, float R) Calculates the compressible state vector from the SWE variables.
- Parameters
q: grid of SWE state vectorq_comp: grid where compressible state vector to be storednxsnysnzs: grid dimensionsrhogamma: density and adiabatic indexkx_offsetky_offset: kernel offsets in the x and y directionsdt: timestepold_phi: Phi at previous timesteplevel: index of level
-
__device__ float slope_limit(float layer_frac, float left, float middle, float right, float aleft, float amiddle, float aright) Calculates slope limited verticle gradient at layer_frac between middle and amiddle. Left, middle and right are from row n, aleft, amiddle and aright are from row above it (n-1)
-
__global__ void prolong_reconstruct_comp_from_swe(float * q_comp, float * q_f, float * q_c, int * nxs, int * nys, int * nzs, int ng, float dz, float zmin, int * matching_indices_d, int kx_offset, int ky_offset, int coarse_level, bool boundaries, float R) Reconstruct fine grid variables from compressible variables on coarse grid
- Parameters
q_comp: compressible variables on coarse gridq_f: fine grid state vectorq_c: coarse grid swe state vectornxsnysnzs: grid dimensionsng: number of ghost cellsdz: coarse grid vertical spacingmatching_indices_d: position of fine grid wrt coarse gridkx_offsetky_offset: kernel offsets in the x and y directionscoarse_level: index of coarser level
-
void
prolong_swe_to_comp(dim3 *kernels, dim3 *threads, dim3 *blocks, int *cumulative_kernels, float *q_cd, float *q_fd, int *nxs, int *nys, int *nzs, float dz, float dt, float zmin, float *rho, float gamma, int *matching_indices_d, int ng, int rank, float *qc_comp, float *old_phi_d, int coarse_level, float R)¶ Prolong coarse grid data to fine grid
- Parameters
kernelsthreadsblocks: number of kernels, threads and blocks for each process/kernelcumulative_kernels: cumulative number of kernels in mpi processes of r < rankq_cdq_fd: coarse and fine grids of state vectorsnxsnysnzs: dimensions of gridsng: number of ghost cellsdz: coarse grid cell vertical spacingdt: timestepzmin: height of sea floorrhogamma: density and adiabatic indexmatching_indices_d: position of fine grid wrt coarse gridng: number of ghost cellsrank: rank of MPI processqc_comp: grid of compressible variables on coarse gridold_phi_d: Phi at previous timstepcoarse_level: index of coarser level
-
__global__ void prolong_reconstruct_comp(float * q_f, float * q_c, int * nxs, int * nys, int * nzs, int ng, int * matching_indices_d, int kx_offset, int ky_offset, int clevel) Reconstruct fine grid variables from compressible variables on coarse grid
- Parameters
q_comp: compressible variables on coarse gridq_f: fine grid state vectorq_c: coarse grid swe state vectornxsnysnzs: grid dimensionsng: number of ghost cellsmatching_indices_d: position of fine grid wrt coarse gridkx_offsetky_offset: kernel offsets in the x and y directionsclevel: index of coarser level
-
void
prolong_comp_to_comp(dim3 *kernels, dim3 *threads, dim3 *blocks, int *cumulative_kernels, float *q_cd, float *q_fd, int *nxs, int *nys, int *nzs, int *matching_indices_d, int ng, int rank, int coarse_level)¶ Prolong coarse grid data to fine grid
- Parameters
kernelsthreadsblocks: number of kernels, threads and blocks for each process/kernelcumulative_kernels: cumulative number of kernels in mpi processes of r < rankq_cdq_fd: coarse and fine grids of state vectorsnxsnysnzs: dimensions of gridsmatching_indices_d: position of fine grid wrt coarse gridng: number of ghost cellsrank: rank of MPI processcoarse_level: index of coarser level
-
__global__ void prolong_reconstruct_swe_from_swe(float * qf, float * qc, int * nxs, int * nys, int * nzs, int ng, int * matching_indices_d, int kx_offset, int ky_offset, int clevel) Reconstruct multilayer swe fine grid variables from single layer swe variables on coarse grid
- Parameters
q_f: fine grid state vectorq_c: coarse grid swe state vectornxsnysnzs: grid dimensionsng: number of ghost cellsmatching_indices_d: position of fine grid wrt coarse gridkx_offsetky_offset: kernel offsets in the x and y directionsclevel: index of coarser level
-
void
prolong_swe_to_swe(dim3 *kernels, dim3 *threads, dim3 *blocks, int *cumulative_kernels, float *q_cd, float *q_fd, int *nxs, int *nys, int *nzs, int *matching_indices_d, int ng, int rank, int coarse_level)¶ Prolong coarse grid single layer swe data to fine multilayer swe grid.
- Parameters
kernelsthreadsblocks: number of kernels, threads and blocks for each process/kernelcumulative_kernels: cumulative number of kernels in mpi processes of r < rankq_cdq_fd: coarse and fine grids of state vectorsnxsnysnzs: dimensions of gridsmatching_indices_d: position of fine grid wrt coarse gridng: number of ghost cellsrank: rank of MPI processcoarse_level: index of coarser level
-
__global__ void prolong_reconstruct_multiswe_from_multiswe(float * qf, float * qc, int * nxs, int * nys, int * nzs, int ng, int * matching_indices_d, int kx_offset, int ky_offset, int clevel) Reconstruct multilayer swe fine grid variables from multilayer swe variables on coarse grid
- Parameters
q_f: fine grid state vectorq_c: coarse grid swe state vectornxsnysnzs: grid dimensionsng: number of ghost cellsmatching_indices_d: position of fine grid wrt coarse gridkx_offsetky_offset: kernel offsets in the x and y directionsclevel: index of coarser level
-
void
prolong_multiswe_to_multiswe(dim3 *kernels, dim3 *threads, dim3 *blocks, int *cumulative_kernels, float *q_cd, float *q_fd, int *nxs, int *nys, int *nzs, int *matching_indices_d, int ng, int rank, int coarse_level)¶ Prolong coarse grid multilayer swe data to fine multilayer swe grid.
- Parameters
kernelsthreadsblocks: number of kernels, threads and blocks for each process/kernelcumulative_kernels: cumulative number of kernels in mpi processes of r < rankq_cdq_fd: coarse and fine grids of state vectorsnxsnysnzs: dimensions of gridsmatching_indices_d: position of fine grid wrt coarse gridng: number of ghost cellsrank: rank of MPI processcoarse_level: index of coarser level
-
__global__ void calc_comp_prim(float * q, int * nxs, int * nys, int * nzs, float gamma, int kx_offset, int ky_offset, int coarse_level, float zmin, float dz, float R, float alpha0) Calculates the SWE state vector from the compressible variables.
- Parameters
q: grid of compressible state vectorq_swe: grid where SWE state vector to be storednxsnysnzs: grid dimensionsrhogamma: density and adiabatic indexkx_offsetky_offset: kernel offsets in the x and y directionsqc: coarse gridmatching_indices: indices of fine grid wrt coarse gridcoarse_level: index of coarser grid
-
__global__ void swe_from_compressible(float * q_prim, float * q_swe, int * nxs, int * nys, int * nzs, float * rho, float gamma, int kx_offset, int ky_offset, float * qc, int * matching_indices, int coarse_level, float zmin, float dz, float alpha0, float R)
-
__global__ void restrict_interpolate_swe(float * p_const, float gamma, float * q_comp, float * q_swe, float zmin, float dz, int * nxs, int * nys, int * nzs, int clevel, int kx_offset, int ky_offset, int * matching_indices, float R, float alpha0) Interpolate SWE variables on fine grid to get them on coarse grid.
- Parameters
p_const: pressure on SWE surfacesadiabatic: indexq_comp: primitive compressible state vector on gridq_swe: conserved SWE state vector on gridzmin: height of bottom layerdz: compressible grid separationnxsnysnzs: grid dimensionsmatching_indices: position of fine grid wrt coarse gridkx_offsetky_offset: kernel offsets in the x and y directionscoarse_level: index of coarser level
-
void
restrict_comp_to_swe(dim3 *kernels, dim3 *threads, dim3 *blocks, int *cumulative_kernels, float *q_cd, float *q_fd, int *nxs, int *nys, int *nzs, float dz, float zmin, int *matching_indices, float *rho, float gamma, int ng, int rank, float *qf_swe, int coarse_level, float *p_const, float R, float alpha0)¶ Restrict fine grid data to coarse grid
- Parameters
kernelsthreadsblocks: number of kernels, threads and blocks for each process/kernelcumulative_kernels: cumulative number of kernels in mpi processes of r < rankq_cdq_fd: coarse and fine grids of state vectorsnxsnysnzs: dimensions of gridsmatching_indices: position of fine grid wrt coarse gridrhogamma: density and adiabatic indexng: number of ghost cellsrank: rank of MPI processqf_swe: grid of SWE variables on fine gridcoarse_level: index of coarser level
-
__global__ void restrict_interpolate_comp(float * qf, float * qc, int * nxs, int * nys, int * nzs, int ng, int * matching_indices, int kx_offset, int ky_offset, int clevel) Interpolate fine grid compressible variables to get them on coarser compressible grid.
- Parameters
qf: variables on fine gridqc: coarse grid state vectornxsnysnzs: grid dimensionsng: number of ghost cellsmatching_indices: position of fine grid wrt coarse gridkx_offsetky_offset: kernel offsets in the x and y directionsclevel: index of coarser level
-
void
restrict_comp_to_comp(dim3 *kernels, dim3 *threads, dim3 *blocks, int *cumulative_kernels, float *q_cd, float *q_fd, int *nxs, int *nys, int *nzs, int *matching_indices, int ng, int rank, int coarse_level)¶ Restrict fine compressible grid data to coarse compressible grid.
- Parameters
kernelsthreadsblocks: number of kernels, threads and blocks for each process/kernelcumulative_kernels: cumulative number of kernels in mpi processes of r < rankq_cdq_fd: coarse and fine grids of state vectorsnxsnysnzs: dimensions of gridsmatching_indices: position of fine grid wrt coarse gridng: number of ghost cellsrank: rank of MPI processcoarse_level: index of coarser level
-
__global__ void restrict_interpolate_swe_to_swe(float * qf, float * qc, int * nxs, int * nys, int * nzs, int ng, int * matching_indices, int kx_offset, int ky_offset, int clevel) Interpolate multilayer SWE variables on fine grid to get them on single layer SWE coarse grid.
- Parameters
qf: variables on fine gridqc: coarse grid state vectornxsnysnzs: grid dimensionsng: number of ghost cellsmatching_indices: position of fine grid wrt coarse gridkx_offsetky_offset: kernel offsets in the x and y directionsclevel: index of coarser level
-
void
restrict_swe_to_swe(dim3 *kernels, dim3 *threads, dim3 *blocks, int *cumulative_kernels, float *q_cd, float *q_fd, int *nxs, int *nys, int *nzs, int *matching_indices, int ng, int rank, int coarse_level)¶ Restrict fine multilayer swe grid data to coarse single layer swe grid.
- Parameters
kernelsthreadsblocks: number of kernels, threads and blocks for each process/kernelcumulative_kernels: cumulative number of kernels in mpi processes of r < rankq_cdq_fd: coarse and fine grids of state vectorsnxsnysnzs: dimensions of gridsmatching_indices: position of fine grid wrt coarse gridng: number of ghost cellsrank: rank of MPI processcoarse_level: index of coarser level
-
__global__ void restrict_interpolate_multiswe_to_multiswe(float * qf, float * qc, int * nxs, int * nys, int * nzs, int ng, int * matching_indices, int kx_offset, int ky_offset, int clevel) Interpolate multilayer SWE variables on fine grid to get them on multilayer SWE coarse grid.
- Parameters
qf: variables on fine gridqc: coarse grid state vectornxsnysnzs: grid dimensionsng: number of ghost cellsmatching_indices: position of fine grid wrt coarse gridkx_offsetky_offset: kernel offsets in the x and y directionsclevel: index of coarser level
-
void
restrict_multiswe_to_multiswe(dim3 *kernels, dim3 *threads, dim3 *blocks, int *cumulative_kernels, float *q_cd, float *q_fd, int *nxs, int *nys, int *nzs, int *matching_indices, int ng, int rank, int coarse_level)¶ Restrict fine multilayer swe grid data to coarse multilayer swe grid.
- Parameters
kernelsthreadsblocks: number of kernels, threads and blocks for each process/kernelcumulative_kernels: cumulative number of kernels in mpi processes of r < rankq_cdq_fd: coarse and fine grids of state vectorsnxsnysnzs: dimensions of gridsmatching_indices: position of fine grid wrt coarse gridng: number of ghost cellsrank: rank of MPI processcoarse_level: index of coarser level
-
void
interpolate_rhos(float *rho_column, float *rho_grid, float zmin, float zmax, float dz, float *phs, int nx, int ny, int nz)¶
-
__global__ void evolve_fv(float * Un_d, flux_func_ptr flux_func, float * qx_plus_half, float * qx_minus_half, float * qy_plus_half, float * qy_minus_half, float * fx_plus_half, float * fx_minus_half, float * fy_plus_half, float * fy_minus_half, int nx, int ny, int nz, int vec_dim, float alpha0, float gamma, float zmin, float dz, float R, int kx_offset, int ky_offset) First part of evolution through one timestep using finite volume methods. Reconstructs state vector to cell boundaries using slope limiter and calculates fluxes there.
NOTE: we assume that beta is smooth so can get value at cell boundaries with simple averaging
- Parameters
Un_d: state vector at each grid point in each layerflux_func: pointer to function to be used to calulate fluxesqx_plus_halfqx_minus_half: state vector reconstructed at right and left boundariesqy_plus_halfqy_minus_half: state vector reconstructed at top and bottom boundariesfx_plus_halffx_minus_half: flux vector at right and left boundariesfy_plus_halffy_minus_half: flux vector at top and bottom boundariesnxnynz: dimensions of gridalphagamma: lapse function and adiabatic indexkx_offsetky_offset: x, y offset for current kernel
-
__global__ void evolve_z(float * Un_d, flux_func_ptr flux_func, float * qz_plus_half, float * qz_minus_half, float * fz_plus_half, float * fz_minus_half, int nx, int ny, int nz, int vec_dim, float alpha0, float gamma, float zmin, float dz, float R, int kx_offset, int ky_offset) First part of evolution through one timestep using finite volume methods. Reconstructs state vector to cell boundaries using slope limiter and calculates fluxes there.
NOTE: we assume that beta is smooth so can get value at cell boundaries with simple averaging
- Parameters
Un_d: state vector at each grid point in each layerflux_func: pointer to function to be used to calculate fluxesqz_plus_halfqz_minus_half: state vector reconstructed at top and bottom boundariesfz_plus_halffz_minus_half: flux vector at top and bottom boundariesnxnynz: dimensions of gridvec_dim: dimension of state vectoralphagamma: lapse function and adiabatic indexkx_offsetky_offset: x, y offset for current kernel
-
__global__ void evolve_fv_fluxes(float * F, float * qx_plus_half, float * qx_minus_half, float * qy_plus_half, float * qy_minus_half, float * fx_plus_half, float * fx_minus_half, float * fy_plus_half, float * fy_minus_half, int nx, int ny, int nz, int vec_dim, float alpha0, float dx, float dy, float dz, float dt, float zmin, float R, int kx_offset, int ky_offset) Calculates fluxes in finite volume evolution by solving the Riemann problem at the cell boundaries.
- Parameters
F: flux vector at each point in grid and each layerqx_plus_halfqx_minus_half: state vector reconstructed at right and left boundariesqy_plus_halfqy_minus_half: state vector reconstructed at top and bottom boundariesfx_plus_halffx_minus_half: flux vector at right and left boundariesfy_plus_halffy_minus_half: flux vector at top and bottom boundariesnxnynz: dimensions of gridvec_dim: dimension of state vectoralpha: lapse functiondxdydt: gridpoint spacing and timestep spacingkx_offsetky_offset: x, y offset for current kernel
-
__global__ void evolve_z_fluxes(float * F, float * qz_plus_half, float * qz_minus_half, float * fz_plus_half, float * fz_minus_half, int nx, int ny, int nz, int vec_dim, float alpha0, float dz, float dt, float zmin, float R, int kx_offset, int ky_offset) Calculates fluxes in finite volume evolution by solving the Riemann problem at the cell boundaries in z direction.
- Parameters
F: flux vector at each point in grid and each layerqz_plus_halfqz_minus_half: state vector reconstructed at right and left boundariesfz_plus_halffz_minus_half: flux vector at top and bottom boundariesnxnynz: dimensions of gridvec_dim: dimension of state vectoralpha: lapse functiondzdt: gridpoint spacing and timestep spacingkx_offsetky_offset: x, y offset for current kernel
-
__global__ void grav_sources(float * q, float gamma, int nx, int ny, int nz, int vec_dim, float zmin, float R, float alpha0, float dz, float dt, int kx_offset, int ky_offset) Calculate gravitational source terms
-
__global__ void evolve_fv_heating(float * Up, float * U_half, float * qx_plus_half, float * qx_minus_half, float * qy_plus_half, float * qy_minus_half, float * fx_plus_half, float * fx_minus_half, float * fy_plus_half, float * fy_minus_half, float * sum_phs, float * rho_d, float * Q_d, int nx, int ny, int nlayers, float alpha, float gamma, float dx, float dy, float dt, bool burning, float Cv, float E_He, int kx_offset, int ky_offset) Does the heating part of the evolution.
- Parameters
Up: state vector at next timestepU_half: state vector at half timestepqx_plus_halfqx_minus_half: state vector reconstructed at right and left boundariesqy_plus_halfqy_minus_half: state vector reconstructed at top and bottom boundariesfx_plus_halffx_minus_half: flux vector at right and left boundariesfy_plus_halffy_minus_half: flux vector at top and bottom boundariessum_phs: sum of Phi in different layersrho_d: list of densities in different layersQ_d: heating rate in each layernxnynlayers: dimensions of gridalphagamma: lapse function and adibatic indexdxdydt: gridpoint spacing and timestep spacingburning: is burning present in this system?Cv: specific heat in constant volumeE_He: energy release per unit mass of heliumkx_offsetky_offset: x, y offset for current kernel
-
__global__ void evolve2(float * Un_d, float * Up, float * U_half, float * sum_phs, int nx, int ny, int nlayers, int ng, float alpha, float dx, float dy, float dt, int kx_offset, int ky_offset) Adds buoyancy terms.
- Parameters
Un_d: state vector at each grid point in each layer at current timestepUp: state vector at next timestepU_half: state vector at half timestepsum_phs: sum of Phi in different layersnxnynlayers: dimensions of gridng: number of ghost cellsalpha: lapse functiondxdydt: gridpoint spacing and timestep spacingkx_offsetky_offset: x, y offset for current kernel
-
void
homogeneuous_fv(dim3 *kernels, dim3 *threads, dim3 *blocks, int *cumulative_kernels, float *Un_d, float *F_d, float *qx_p_d, float *qx_m_d, float *qy_p_d, float *qy_m_d, float *qz_p_d, float *qz_m_d, float *fx_p_d, float *fx_m_d, float *fy_p_d, float *fy_m_d, float *fz_p_d, float *fz_m_d, int nx, int ny, int nz, int vec_dim, int ng, float alpha0, float gamma, float dx, float dy, float dz, float dt, int rank, float zmin, float R, flux_func_ptr h_flux_func, bool do_z)¶ Solves the homogeneous part of the equation (ie the bit without source terms).
- Parameters
kernelsthreadsblocks: number of kernels, threads and blocks for each process/kernelcumulative_kernels: Cumulative total of kernels in ranks < rank of current MPI processUn_d: state vector at each grid point in each layer at current timestepF_d: flux vectorqx_p_dqx_m_d: state vector reconstructed at right and left boundariesqy_p_dqy_m_d: state vector reconstructed at top and bottom boundariesfx_p_dfx_m_d: flux vector at right and left boundariesfy_p_dfy_m_d: flux vector at top and bottom boundariesnxnynz: dimensions of gridalphagamma: lapse function and adiabatic indexdxdydzdt: gridpoint spacing and timestep spacingrank: rank of MPI processflux_func: pointer to function to be used to calculate fluxesdo_z: should we evolve in the z direction?
-
void
rk3(dim3 *kernels, dim3 *threads, dim3 *blocks, int *cumulative_kernels, float *Un_d, float *F_d, float *Up_d, float *qx_p_d, float *qx_m_d, float *qy_p_d, float *qy_m_d, float *qz_p_d, float *qz_m_d, float *fx_p_d, float *fx_m_d, float *fy_p_d, float *fy_m_d, float *fz_p_d, float *fz_m_d, int level, int *nxs, int *nys, int *nzs, int *vec_dims, int ng, float alpha0, float R, float gamma, float dx, float dy, float dz, float dt, float *Up_h, float *F_h, float *Un_h, MPI_Comm comm, MPI_Status status, int rank, int n_processes, flux_func_ptr flux_func, bool do_z, bool periodic, int m_in, float *U_swe, int *matching_indices, float zmin)¶ Integrates the homogeneous part of the ODE in time using RK3.
- Parameters
kernelsthreadsblocks: number of kernels, threads and blocks for each process/kernelcumulative_kernels: Cumulative total of kernels in ranks < rank of current MPI processUn_d: state vector at each grid point in each layer at current timestep on deviceF_d: flux vector on deviceUp_d: state vector at next timestep on deviceqx_p_dqx_m_d: state vector reconstructed at right and left boundariesqy_p_dqy_m_d: state vector reconstructed at top and bottom boundariesfx_p_dfx_m_d: flux vector at right and left boundariesfy_p_dfy_m_d: flux vector at top and bottom boundariesnxnynz: dimensions of gridvec_dim: dimension of state vectorng: number of ghost cellsalphagamma: lapse function and adiabatic indexdxdydzdt: gridpoint spacing and timestep spacingUp_hF_hUn_h: state vector at next timestep, flux vector and state vector at current timestep on hostcomm: MPI communicatorstatus: status of MPI processesrankn_processes: rank of current MPI process and total number of MPI processesflux_func: pointer to function to be used to calculate fluxesdo_z: should we evolve in the z direction?periodic: do we use periodic or outflow boundary conditions?
-
void
cuda_run(float *beta, float **Us_h, float *rho, float *Q, int *nxs, int *nys, int *nzs, int nlevels, char *models, int *vec_dims, int ng, int nt, float alpha0, float R, float gamma, float E_He, float Cv, float zmin, float dx, float dy, float dz, float dt, bool burning, bool periodic, int dprint, char *filename, char *param_filename, MPI_Comm comm, MPI_Status status, int rank, int n_processes, int *matching_indices, int r, int n_print_levels, int *print_levels, int tstart, float *p_const)¶ Evolve system through nt timesteps, saving data to filename every dprint timesteps.
- Parameters
beta: shift vector at each grid pointgamma_up: gamma matrix at each grid pointrho: densities in each layerQ: heating rate at each point and in each layernxsnysnzs: dimensions of gridsnlevels: number of levels of mesh refinementmodels: Array describing the physical model to use on each level. S = single layer SWE, M = multilayer SWE, C = compressible, L = Low Machvec_dims: Dimensions of state vectors on each grid Us_h Array of pointers to grids.ng: number of ghost cellsnt: total number of timestepsalpha0: lapse function at sea floorR: radius of stargamma: adiabatic indexE_He: energy release per unit mass of helium burningCv: specific heat per unit volumezmin: height of sea floordxdydzdt: gridpoint spacing and timestep spacingperiodic: do we use periodic or outflow boudary conditions?burning: is burning included in this system?dprint: number of timesteps between each printoutfilename: name of file to which output is printedparam_filename: name of parameter filecomm: MPI communicatorstatus: status of MPI processesrankn_processes: rank of current MPI process and total number of MPI processesmatching_indices: position of fine grid wrt coarse gridr: ratio of grid resolutionsn_print_levels: number of levels to be output to fileprint_levels: numbers of the levels to be output to filetstart: start timestepp_const: pressures on multilayer SWE grids
-
__global__ void test_find_height(bool * passed)
-
__global__ void test_find_pot(bool * passed)
-
__global__ void test_rhoh_from_p(bool * passed)
-
__global__ void test_p_from_rhoh(bool * passed)
-
__global__ void test_p_from_rho_eps(bool * passed)
-
__global__ void test_hdot(bool * passed)
-
__global__ void test_calc_As(bool * passed)
-
__global__ void test_cons_to_prim_comp_d(bool * passed, float * q_prims)
-
__global__ void test_shallow_water_fluxes(bool * passed)
-
__global__ void test_compressible_fluxes(bool * passed)
-
__global__ void test_p_from_swe(bool * passed)
Variables
-
__constant__ float beta_d[3]
run_mesh_cuda.cpp¶
mesh_output.h¶
Warning
doxygenfile: Cannot find file “mesh_output.h