Guide to Running TRANSP/T3D/GX Coupled Simulations

Guide to Running TRANSP/T3D/GX Coupled Simulations

Guide to Running TRANSP/T3D/GX Coupled Simulations

TRANSP now includes a predictive capability to evolve T3D with GX for comprehensive plasma simulations. The documentation of the T3D code can be found here and the documentation of the GX code can be found here. This feature is available on Traverse (at PPPL) and Perlmutter (at NERSC) clusters. Note that Traverse will be retired soon, so Perlmutter is recommended.

Requirements

TRANSP Configuration

To enable predictive simulations in TRANSP, follow these steps:

  1. Set Predictive Mode: In the TRANSP namelist, add the following setting:
    LPREDICTIVE_MODE=5
  2. Enable Plasma Parameter Predictions: Set the following flags to 1 based on the plasma parameters you want to predict:
    • Predict electron density (NE):
      LPREDICT_NE=1
    • Predict electron temperature (TE):
      LPREDICT_TE=1
    • Predict ion temperature (TI):
      LPREDICT_TI=1
    • To predict all three parameters, include all three flags as shown above.
  3. Consistency Check: Ensure that the settings in T3D_template.in and GX_template.in match the TRANSP namelist configurations.

Running the Simulation

  1. Prepare Namelists: Place T3D_template.in and GX_template.in in the same directory as the TRANSP namelist file.
  2. Submit Job: Use the appropriate job submission script or command for the cluster you're using. For Perlmutter, this might look like:
    sbatch run_transp_job.sh
  3. Monitor Progress: Check the job status and output files to ensure the simulation runs as expected.

Important Notes

By following these steps, you should be able to run coupled simulations using TRANSP, T3D, and GX successfully. For additional help, refer to the cluster documentation or contact support.

Example of T3D_template.in

	  
[grid] N_radial = 9 flux_label = 'torflux' [time] newton_threshold = 0.01 max_newton_iter = 4 alpha = 1.0 use_SI = true [[model]] model = "GX" gx_template = "GX_template.in" gx_outputs = "T3D-flux-tubes/" adiabatic_species = "electron" overwrite = true check_stalls = false gpus_per_gx = 1 zeta_center = [0.0] [[model]] model = "ReLU" D_neo = 5.0 [[species]] type = "electron" Xadiabatic = true density = {import = true, evolve = true} temperature = {import = true, evolve = true} aux_particle_source = { import = true } aux_power_source = { import = true } density_relu_flux = {critical_gradient = 0.0, slope = 0.0} pressure_relu_flux = {critical_gradient = 0.0, slope = 0.0} [[species]] type = "deuterium" density = {import = true, evolve = false} temperature = {import = true, evolve = true} aux_particle_source = { import = true } aux_power_source = { import = true } density_relu_flux = {critical_gradient = 0.0, slope = 0.0} pressure_relu_flux = {critical_gradient = 0.0, slope = 0.0} [[species]] impurity = true type = "carbon" density = {import = true, evolve = false} temperature = {import = true, evolve = false} aux_particle_source = { import = true } aux_power_source = { import = true } density_relu_flux = {critical_gradient = 0.0, slope = 0.0} pressure_relu_flux = {critical_gradient = 0.0, slope = 0.0} [[species]] impurity = true type = "beryllium" density = {import = true, evolve = false} temperature = {import = true, evolve = false} aux_particle_source = { import = true } aux_power_source = { import = true } density_relu_flux = {critical_gradient = 0.0, slope = 0.0} pressure_relu_flux = {critical_gradient = 0.0, slope = 0.0} [import] type = "transp_realtime" ufiles_dir = "T3D_ufiles" [geometry] geo_option = 'geqdsk' [physics] collisions = true alpha_heating = false bremsstrahlung = false update_equilibrium = false turbulent_exchange = false Zeff = {import = true}

Example of GX_template.in

	  
# This is a template gx input file for use with T3D. # It is missing a variety of parameters required for standalone GX calculations. # T3D will automatically fill in missing parameters to generate full gx input files. # The most critical tunable parameters are in [Dimensions], [Domain], and [Time]. debug = true [Dimensions] ntheta = 24 # number of points along field line (theta) per 2pi segment nperiod = 1 # number of 2pi segments along field line is 2*nperiod-1 ny = 61 # number of real-space grid-points in y 64 nx = 111 # number of real-space grid-points in x 192 nhermite = 12 # number of hermite moments (v_parallel resolution) nlaguerre = 4 # number of laguerre moments (mu B resolution) [Domain] y0 = 10.0 # controls box length in y (in units of rho_ref) and minimum ky, so that ky_min*rho_ref = 1/y0 boundary = "linked" # use generalized twist-shift boundary conditions along field line, and cut the field line to enforce x0 ~ y0 [Physics] nonlinear_mode = true # this is a nonlinear calculation [Time] t_max = 150.0 # run to t=500 (in units of L_ref/vt_ref) t_add = 50.0 # on restart, run an additional 300 time units cfl = 0.8 # safety multiplier on computed timestep scheme = "rk4" # use RK3 timestepping scheme [Initialization] ikpar_init = 0 # parallel wavenumber of initial perturbation init_field = "density" # initial condition set in density init_amp = 1.0e-2 # amplitude of initial condition [Dissipation] closure_model = "none" # no closure assumptions (just truncation) hypercollisions = true # use hypercollision model hyper = true # use hyperdiffusion [Diagnostics] nwrite = 1000 # write diagnostics every 100 timesteps fluxes = true # compute and write heat and particle fluxes [Wspectra] # spectra of W = |G_lm|**2 species = false hermite = false laguerre = false hermite_laguerre = true # W(l,m) (summed over kx, ky, z) kx = false ky = true # W(ky) (summed over kx, z, l, m) kxky = false z = false [Pspectra] # spectra of P = ( 1 - Gamma_0(b_s) ) |Phi|**2 species = false kx = false ky = true # P(ky) (summed over kx, z) kxky = false z = true # P(z) (summed over kx, ky) [Qspectra] # spectra of Q (heat flux) kx = false ky = true # Q(ky) (summed over kx, z) kxky = false z = true # Q(z) (summed over kx, ky) [Gamspectra] # spectra of Q (heat flux) kx = false ky = true # Q(ky) (summed over kx, z) kxky = false z = true # Q(z) (summed over kx, ky)