Newer
Older
MAIN_DIR = "";
# sometimes you have to set main directory, e.g. on Lengau working in Lustre:
# MAIN_DIR = "/mnt/lustre/users/my_account/build/";
domain
{
#
# domain setup in [meters]
# x - streamwise, y - spanwise, z - wall-normal directions
#
x = 0.0; y = 0.0; z = 0.0; # point of origin
length = 400.0; width = 200.0; height = 80.0; # domain length(x), width(y) and height(z)
}
# -----------------------------------------------------------------------------
time
{
begin = 0.0;
end = 50.0 * 3600.0; # start and end time of integration [s]
# use_calendar = false; # optional, default = false
calendar
{
mode = "local";
# mode = "local" - local time
# mode = "local-UTC" - local UTC time
# mode = "set" - prescribed time & date as
# [year, month, day, hour, min, sec, UTC_offset] values
year = 2020;
month = 9;
day = 1;
hour = 12;
min = 0;
sec = 0.0;
UTC_offset = 3;
}
}
# -----------------------------------------------------------------------------
grid
{
type = "uniform"; # type = "uniform" || "stretched" || "stretched-up" || "z-coord-ascii"
adaptive {
# mode = false; # enable adaptive grid [optional, default = false]
dz_min = 0.25 * (domain.height / grid.cz); # min grid step
dz_max = 4.0 * (domain.height / grid.cz); # max grid step
# --- adaptation parameters
TKE_threshold_coeff = 0.1; # threshold coeff. to define hbl
hbl_max_coeff = 1.1; # boundary layer height multiplier
C_smooth_coeff = 5.0; # number of cells in smoothing region
# --- begin & end time of adaptation [optional, default: all integration period]
# begin = time.begin; end = time.end;
}
# -----------------------------------------------------------------------------
mpi_setup
{
#
# MPI-process distribution
# in 'mpirun -np [N]' [N] overrides config specs if differs
#
}
# -----------------------------------------------------------------------------
phys
nu = 1.25 * 0.00001; # kinematic viscosity [m^2/s]
xi = (1.0 / 0.7) * nu; # thermal diffusivity [m^2/s]
rho_ref = 1.25; # reference density of air [kg/m^3]
g = 9.81; # gravitational acceleration [m/s^2]
Theta_ref = 288.15; # reference temperature [K]
# --- no buoyancy
beta = 0.0; # = g * thermal expansion coefficient = g / Theta_ref [m/(K*s^2)]
}
# -----------------------------------------------------------------------------
# optinally define state variables
# default defs. depend on model configuration
state_def
{
# Qvs_water = false; Pvs_water = false;
# Qvs_ice = false; Pvs_ice = false;
}
# -----------------------------------------------------------------------------
topography
{
mode = "hand"; # topography def. mode
# mode = "hand" -- define only 'patches' in configuration file
# mode = "ascii-mask" -- read height map from file
# --- using file height map parameters
# mode = "ascii-mask";
# filename = "map-ex.txt"; # filename path
# xmin = domain.x; # map -x coordinates in computation domain
# xmax = domain.x + domain.length;
# ymin = domain.y; # map -y coordinates in computation domain
# ymax = domain.y + domain.width;
# height_scale = 1.0; # scale height factor
npatch = 1; # number of patches
patch_1 {
type = "box"; # patch type: "box" || "hill"
xmin = 15.0; xmax = 35.0; # patch dimensions
ymin = 10.0; ymax = 90.0;
height = 20.0;
xperiod = 50.0; # optional periodicity in -x
yperiod = 100.0; # optional periodicity in -y
}
}
# -----------------------------------------------------------------------------
geo_wind
{
# NOTE: skipped if mode not set
}
# -----------------------------------------------------------------------------
external_pressure_grad
{
# NOTE: skipped if mode not set
# --- pressure gradient components [optional]
dPdx = -0.0004; # [Pa/m]
# dPdy = 0.0; # [Pa/m]
}
# -----------------------------------------------------------------------------
subsidence
{
}
# -----------------------------------------------------------------------------
external_tendency
{
}
# -----------------------------------------------------------------------------
nudging
{
}
# -----------------------------------------------------------------------------
rayleigh_friction
{
}
# -----------------------------------------------------------------------------
surface
{
# --- fixed surface temperature
value = 288.15; # initial surface temperature [K]
}
Qhum {
# --- predefined mode [land surface model]
mode = "lsm";
}
z0_m = 0.1; # aerodynamic roughness [m]
z0_h = 0.1; # heat roughness [m]
kappa = 0.4; # von Karman constant
Pr_t_0 = 1.0; # turbulent Prandt number (neutral)
# --- latent heat flux alpha/beta model
lhflux_alpha = 1.0;
lhflux_beta = 0.025;
}
# -----------------------------------------------------------------------------
initial_conditions
{
# optional [U], [V]
# if not set initial profiles are set to match geostrophic wind
surface_value = 288.15; # initial boundary layer temperature [K]
height = 0.0; # boundary layer height [m]
grad_z = 0.0; # humidity gradient above boundary layer [kg/(kg*m)]
}
surface_value = 0.0025; # initial boundary layer humidity [kg/kg]
height = 0.0; # boundary layer height [m]
grad_z = 0.0; # humidity gradient above boundary layer [kg/(kg*m)]
}
}
# -----------------------------------------------------------------------------
damping
{
# --- damping layer [z1, z2]
z1 = domain.z + 0.75 * domain.height; # [m]
z2 = domain.z + domain.height; # [m]
}
# -----------------------------------------------------------------------------
les
{
is_amd_model = false; # use AMD subgrid model
# dynamic, ssm keys not supported, have to be := false
# --- static LES model params
C_smag = 0.08; # GABLS-1 fit = 0.08
# Lilly = 0.17
Prandtl_sgs = 0.7; # subgrid scale Prandtl [0.4, 1.0]
# --- dynamic LES model params
dynamic {
# --- dynamic coefficient = (C_{s} * delta_{g})^2 clipping
C_smag_max = 0.25;
Prandtl_sgs_min = 0.4;
base_filter_reset = false;
test_filter_reset = false;
clip_filter_reset = false;
}
# -----------------------------------------------------------------------------
passive_tracers
{
# --- each tracer field defines diffusivity & surface values
tracer_1 {
diffusivity = phys.xi;
# --- setting localized source, all surface if not defined
xmin = 180.0; xmax = 220.0;
ymin = 180.0; ymax = 220.0;
# --- active in [begin, end], [time.begin, time.end] if not defined
begin = 7.0 * 3600.0;
# end = time.end;
}
}
# --- setting 'life-time' using decay frequency [1/s] [optional]
# f_decay = 1.0 / 600.0;
# --- active in [begin, end], [time.begin, time.end] if not defined
begin = 7.0 * 3600.0;
# end = time.end;
}
}
}
# -----------------------------------------------------------------------------
# particle simulation setup
# used only if INCLUDE_PARTICLES is defined, see [model-defines.h]
ptcl
{
is_passive_transport = false; # passive particles flag
# --- particle parameters for all sources
density = 1000.0; # particle density [kg/m^3]
diameter = 0.000001; # particle diameter [m]
# f_decay = 1.0 / 100.0; # optional decay constant [1/s]
# half-life = ln(2) / f
source_1 {
n = 524288 * 8; # number of particles to release
begin = 5.0 * 3600.0; # release time
end = time.end; # instant release if not defined
# --- setting flux [lower priority than 'n' -- number of particles]
# both begin & end must be specified -- not instant source
# flux = 10.0;
# flux_direction = "X";
# --- source volume
xmin = domain.x + 50.0 - 10.0; xmax = domain.x + 50.0 + 10.0;
ymin = domain.y; ymax = domain.y + domain.width;
zmin = domain.z; zmax = domain.z + 5.0;
}
sink_1 {
# --- optional, default mode = "inside"
mode = "outside"; # "inside" || "outside"
# --- define volume
xmin = domain.x; xmax = domain.x + domain.length;
ymin = domain.y - 0.5 * domain.width; ymax = domain.y + 1.5 * domain.width;
zmin = domain.z + 0.01; zmax = domain.z + domain.height;
}
}
# -----------------------------------------------------------------------------
# particle tracking setup
# used only if INCLUDE_PARTICLES_TRACKING is defined, see [model-defines.h]
ptcl_track
{
is_passive_transport = ptcl.is_passive_transport;
# --- particle parameters for all sources
density = ptcl.density; # particle density [kg/m^3]
diameter = ptcl.diameter; # particle diameter [m]
# f_decay = ptcl.f_decay; # optional decay constant [1/s]
# half-life = ln(2) / f
group_max_size = 256; # max number of particles per group
max_memory = 10 * 1024 * 1024; # max memory in bytes for keeping trajectories in memory
source_1
{
n = 128; # number of particles to release
begin = 8.0 * 3600.0; # release time
# --- setting flux [lower priority than 'n' -- number of particles]
# both begin & end must be specified -- not instant source
# flux = 100.0;
# flux_direction = "Z";
# --- source volume
xmin = domain.x + 0.4 * domain.length; xmax = domain.x + 0.6 * domain.length;
ymin = domain.y + 0.4 * domain.width; ymax = domain.y + 0.6 * domain.width;
zmin = domain.z; zmax = domain.z + 0.1 * domain.height;
}
}
# -----------------------------------------------------------------------------
# canopy setup
# used only if INCLUDE_CANOPY_DRAG is defined, see [model-defines.h]
canopy
{
# --- patch volume
xmin = domain.x; xmax = domain.x + domain.length;
ymin = domain.y; ymax = domain.y + domain.width;
zmin = domain.z; zmax = domain.z + 50.0;
# --- make patch 'periodic' in -x and/or -y directions
# single patch if not defined
# xperiod = 1.0;
# yperiod = 1.0;
LAI = 1.0;
# --- set zm - height of max(LAD) for type = "obs":
# zm = zmin + 0.8 * (zmax - zmin);
# --- OR: set a file
# type = "sharp-map";
# filename = "map-ex.txt";
# switch_ij_order = false; # [optional, default = false]
# normalize_height = 1.0; # [optional, default = 1.0]
}
}
# -----------------------------------------------------------------------------
poisson
{
#
# Poisson equation solver setup
#
# use_cg_solver = false; # use CG as base solver [optional, default = BiCGstab]
retol = 0.0001; abstol = 0.00001; # relative and absolute tolerance
miniters = 1; maxiters = 100; # minimum and maximum number of iterations
multigrid
{
ngrid = 5; # number of grids in multigrid sequence (= [0] - auto definition)
down_iters = 2; # number of smoother iterations on fine->coarse traverse
up_iters = 3; # number of smoother iterations on coarse->fine traverse
direct_iters = 5; # number of smoother iterations on coarsest grid
smooth_up_omega = 1.84; # relaxation value on coarse->fine traverse
smooth_up_omega_fine = 1.64; # relaxation value on reaching finest grid
}
}
# -----------------------------------------------------------------------------
output
{
# NOTE: netcdf output is enabled only if INCLUDE_NETCDF is defined in [nse-sys.h]
DIR = MAIN_DIR + "output/"; # output directory
make_unique_DIR = true; # make output directory unique for each run
convert_dsq_to_tecplot = true; # convert series .dsq output to .plt [tecplot] format
# *: on model completion only
# convert_dsq_to_netcdf = false; # convert series .dsq output to .nc [netcdf] format
# *: on model completion only
num = 1; # number of output units
unit_1
{
SUBDIR = ""; # unit sub-directory
begin = 1.0 * 3600.0; # start time [s] for writing output
dt = 1.0 * 3600.0; # time step [s] for writing output
# --- output subdomain [optional, applicable in 3D output only]
xmin = domain.x; xmax = domain.x + domain.length; # -x output domain setup
ymin = domain.y; ymax = domain.y + domain.width; # -y output domain setup
zmin = domain.z; zmax = domain.z + domain.height; # -z output domain setup
# --- output controls [default, if not defined, value is 'false']
cntrl_avgxy_plt = true; # 1D -xy averaged .plt fields
cntrl_avgxy_netcdf = false; # 1D -xy averaged netcdf fields
cntrl_3d_plt = true; # 3D .plt fields
cntrl_3d_bin = false; # 3D .nsx fields
cntrl_3d_netcdf = false; # 3D netcdf fields
cntrl_geometry_3d_plt = false; # geometry 3D .plt fields
cntrl_geometry_3d_netcdf = false; # geometry 3D netcdf fields
cntrl_topography_plt = true; # topography .plt fields
cntrl_topography_netcdf = false; # topography netcdf fields
cntrl_2d_plt = false; # 2D .plt fields
cntrl_2d_netcdf = false; # 2D netcdf fields
cntrl_surface_plt = true; # surface .plt fields
cntrl_surface_netcdf = false; # surface netcdf fields
cntrl_grid_plt = false; # grid .plt data
cntrl_grid_netcdf = false; # grid netcdf data
cntrl_meteo_avgxy_plt = false; # 1D -xy averaged meteo forcing .plt fields
cntrl_meteo_all_plt = false; # all meteo forcing .plt fields
# --- output keys for filtered fields
cntrl_filtered_3d_plt = false;
# filter { kxmin = 0; kxmax = 0; kymin = 0; kymax = 5; is_remove_mean = true; }
# --- spectrum output
spectrum
{
# --- controls
x_cntrl = true;
y_cntrl = true;
xy_cntrl = true;
# np = 2; # number of z planes, skipped if not defined
z_1 = 50.0;
z_2 = 100.0;
# --- additional options for 1d & 2d spectrum, default all = true if not defined
# is_remove_mean_1d = true;
# is_centered_fft_1d = true;
# is_remove_mean_2d = true;
# is_centered_fft_2d = true;
# is_log10_2d = true;
}
# --- particles & trajectories output
# used only if INCLUDE_PARTICLES is defined
cntrl_ptcl_bin = false; # particles binary output
cntrl_ptcl_plt = true; # particles .plt output
cntrl_ptcl_coords_plt = false; # particles coordinates .plt output
# used only if INCLUDE_PARTICLES_TRACKING is defined
cntrl_ptcl_traj_bin = false; # particles trajectories binary output
cntrl_ptcl_traj_plt = false; # particles trajectories .plt output
# --- profiles [= 0 if not defined]
x_profile_num = 0;
y_profile_num = 0;
z_profile_num = 0;
# --- e.g.:
x_profile_1 { y = domain.y + 0.5 * domain.width; z = domain.z + 0.5 * domain.height; }
# --- slices [ = 0 if not defined]
xy_slice_num = 0;
xz_slice_num = 0;
yz_slice_num = 0;
# --- e.g.:
xy_slice_1 { z = domain.z + 0.5 * domain.height; }
}
# nskip = 360; # output once in nskip iterations, each iteration := 1
dt = 0.05 * 3600.0; # output time step [s], --higher-- priority than 'nskip'
# --- screen controls [optional, default = true]
# cntrl_status = true;
# cntrl_progress_bar = true;
# --- screen controls [optional, default = false]
# cntrl_terminal_mode = false;
}
}
# -----------------------------------------------------------------------------
checkup
{
# --- additional checkups [InF, NaN values etc.]
begin = 0.0; # start time of checks
nskip = 3600; # check once in nskip iterations, each iteration := 1
# dt = 1.0 * 3600.0; # check time step, --higher-- priority than 'nskip'
}
# -----------------------------------------------------------------------------
dump
{
begin = 10.0 * 3600.0; # start time [s] for writing model dump
dt = 10.0 * 3600.0; # time step [s] for writing model dump
}
# -----------------------------------------------------------------------------
startup
{
}
# -----------------------------------------------------------------------------
series
{
# nskip = 2; # calculate once in nskip iterations, each iteration := 1
dt = 1.0; # time step [s], --higher-- priority than 'nskip'
# --- point flow measurements
point_set
{
# mode = "define"; # optional point set mode
# = "define" [default] || "grid-xy"
# np = 3; # number of points, skipped if not defined
point_1 { x = domain.x + 0.5 * domain.length; y = domain.y + 0.5 * domain.width; z = 25.0; }
point_2 { x = domain.x + 0.5 * domain.length; y = domain.y + 0.5 * domain.width; z = 50.0; }
point_3 { x = domain.x + 0.5 * domain.length; y = domain.y + 0.5 * domain.width; z = 100.0; }
# --- domain
# x = domain.x; y = domain.y;
# length = domain.length; width = domain.width;
# --- grid dimensions, number of edges
# nx = 7; ny = 5;
# --- number of z=const planes
# nz = 3;
# z_1 = 25.0;
# z_2 = 50.0;
# z_3 = 100.0;
}
# --- [xy] averaged energy at fixed 'z'
energy_avgxy_set
{
# np = 2; # number of z planes, skipped if not defined
z_1 = 50.0;
z_2 = 100.0;
}
# --- [xy] averaged fluxes at fixed 'z'
flux_avgxy_set
{
# np = 2; # number of z planes, skipped if not defined
z_1 = 50.0;
z_2 = 100.0;
}
# --- additional parameters
# --- TKE hbl def. [optional]
# TKE_hbl_threshold_stable = 0.3;
# TKE_hbl_threshold_unstable = 0.1;
# --- max length to hold data in memory [optional]
# max_mem_length = 100 * 1024;
}
# -----------------------------------------------------------------------------
spectrum_series
{
begin = time.begin; # start time
nskip = 1; # calculate once in nskip iterations, each iteration := 1
# dt = 1.0; # time step, --higher-- priority than 'nskip'
# --- wavevenumbers in: - kxmax <= kx <= kmax, 0 <= ky <= kymax
unit_1 { zp = domain.z + 0.3 * domain.height; kxmax = 3; kymax = 3; }
unit_2 { zp = domain.z + 0.2 * domain.height; kxmax = 3; kymax = 3; }
unit_3 { zp = domain.z + 0.1 * domain.height; kxmax = 3; kymax = 3; }
# --- max length to hold data in memory [optional]
# max_mem_length = 100 * 1024;
}
# -----------------------------------------------------------------------------
time_scan
{
# NOTE: dump is not supported for time scans
# nskip = 1000; # calculate once in nksip iterations, each iteration := 1
dt = 60.0; # scan time step [s], --higher-- priority than 'nskip'
cntrl_grid = false; # all keys, optional, default = all 'false'
cntrl_grid {
# dz = true;
cntrl_avgxy = true; # all keys, optional, default = all 'false'
cntrl_avgxy {
# U = true;
# V = true;
# W = true;
# UW_flux = true;
# VW_flux = true;
# TW_flux = true;
# QW_flux = true;
# U_variance = true;
# V_variance = true;
# W_variance = true;
# Theta_variance = true;
# Q_variance = true;
}
cntrl_z_profile = false; # all keys, optional, default = all 'false'
cntrl_z_profile {
# U = true;
# V = true;
# W = true;
# Q = true;
# Qvapor = true;
}
z_profile_num = 0;
z_profile_1 { x = domain.x + 0.5 * domain.length; y = domain.y + 0.5 * domain.width; }
}
# -----------------------------------------------------------------------------
stats
{
unit_1 {
begin = time.end - 4.0 * 3600.0; # start time for averaging
end = time.end; # end time for averaging, to \infty if not defined
# --- regular mode [optional] -- shifts accumulation window
# is_regular = false;
# --- ensemble mode [optional] -- ensemble averaging
# is_ensemble = false;
}
unit_2 {
begin = time.end - 8.0 * 3600.0; # start time for averaging
end = time.end - 4.0 * 3600.0; # end time for averaging, to \infty if not defined
# --- regular mode [optional] -- shifts accumulation window
# is_regular = false;
# --- ensemble mode [optional] -- ensemble averaging
# is_ensemble = false;
}
}
# -----------------------------------------------------------------------------
pdf
{
# --- reset options: [begin, reset_time] -- find histogram parameters
# if not defined set min-max range for each variable in controls
reset_time = 8.0 * 3600.0;
reset_safety = 0.25; # relative to min-max found
# e.g.: min' = min - reset_safety * (max - min)
# --- regular mode [optional] -- shifts accumulation window
# is_regular = false;
# --- change default control using keys
# cntrl {
# U = true; V = true; W = true; Pressure = true;
# U_grad_x = true; U_grad_y = true; U_grad_z = true;
# V_grad_x = true; V_grad_y = true; V_grad_z = true;
# W_grad_x = true; W_grad_y = true; W_grad_z = true;
# Suv = true; Suw = true; Svw = true; # strain-tensor
# Omega_uv = true; Omega_uw = true; Omega_vw = true; # vorticity-tensor
# Theta = true;
# Theta_grad_x = true; Theta_grad_y = true; Theta_grad_z = true;
# Q = true;
# Q_grad_x = true; Q_grad_y = true; Q_grad_z = true;
# --- tracers 'C' correspond to passive_tracers {} def. [use index in: 1...passive_tracers.num]
# C1 = true;
# C1_grad_x = true; C1_grad_y = true; C1_grad_z = true;
# C2 = true;
#
# }
# --- setting min-max for any variable
# this has to be defined if 'reset_time' is skipped, e.g.:
# U { min = -1.0; max = 1.0; }
# --- setting number of bins for any variable, e.g.:
# U { nbins = 512; }
}
}
# -----------------------------------------------------------------------------
joint_pdf
{
# --- reset options: [begin, reset_time] -- find histogram parameters
# if not defined set min-max range for each variable in controls
reset_time = 8.0 * 3600.0;
reset_safety = 0.25; # relative to min-max found
# e.g.: min' = min - reset_safety * (max - min)
# --- regular mode [optional] -- shifts accumulation window
# is_regular = false;
# --- change default control using keys
# cntrl {
# UV = true; UW = true; VW = true;
# PSuu = true; PSvv = true; PSww = true;
# PSuv = true; PSuw = true; PSvw = true;
# TU = true; TV = true; TW = true;
# QU = true; QV = true; QW = true;
# QT = true;
# --- tracers 'C' correspond to passive_tracers {} def. [use index in: 1...passive_tracers.num]
# C1U = true; C1V = true; C1W = true;
# C1T = true; C1Q = true;
# --- tracer/tracer joint pdf, using strict upper diagonal notation, e.g.:
# C1C2 = true; C1C3 = true; C2C3 = true;
#
# }
# --- setting min-max for any variable
# this has to be defined if 'reset_time' is skipped, e.g.:
# UV { xmin = -1.0; xmax = 1.0; ymin = - 1.0; ymax = 1.0; }
# --- setting number of bins for any variable, e.g.:
# UV { nxbins = 512; nybins = 512; }
}
}
# -----------------------------------------------------------------------------
runtime_filter
{
mark = 600.0; # OR: apply filter at time = mark only
# mark has --higher-- priority than regular mode
# num = 0; # number of filters applied, output = sum of all units
# u = u_f[1] + u_f[2] + ...
# --- skipped if not defined
unit_1 {
# --- keep some rolls
mode = "include";
is_remove_mean = false;
unit_2 {
# --- add small scale disturbances
mode = "exclude"; # adding (u - u_f)
is_remove_mean = false;