Source code for roger.variables

from roger import runtime_settings


[docs] class Variable: def __init__( self, name, dims, units="", long_description="", dtype=None, time_dependent=True, scale=1.0, write_to_restart=False, extra_attributes=None, mask=None, active=True, initial=None, ): self.name = name self.dims = dims self.units = units self.long_description = long_description self.dtype = dtype self.time_dependent = time_dependent self.scale = scale self.write_to_restart = write_to_restart self.active = active self.initial = initial self.get_mask = lambda settings, vs: None if mask is not None: if not callable(mask): raise TypeError("mask argument has to be callable") self.get_mask = mask elif dims is not None: if dims[:3] in DEFAULT_MASKS: self.get_mask = DEFAULT_MASKS[dims[:3]] elif dims[:2] in DEFAULT_MASKS: self.get_mask = DEFAULT_MASKS[dims[:2]] #: Additional attributes to be written in netCDF output self.extra_attributes = extra_attributes or {} def __repr__(self): attr_str = [] for v in vars(self): attr_str.append(f"{v}={getattr(self, v)}") attr_str = ", ".join(attr_str) return f"{self.__class__.__qualname__}({attr_str})"
# fill value for netCDF output (invalid floating data is replaced by this value) FLOAT_FILL_VALUE = -9999 # X = ("x",) Y = ("y",) Z = ("z",) CATCH_GRID = ("x", "y") RIVER_GRID = ("x", "y") LAKE_GRID = ("x", "y") URBAN_GRID = ("x", "y") BOUNDGW_GRID = ("x", "y") LUT_ILU_GRID = ("n_lu", "n_params13") LUT_GC_GRID = ("n_lu", "n_params13") LUT_IS_GRID = ("n_sealing", "n_params2") LUT_MLMS_GRID = ("n_slope", "n_params9") LUT_RDLU_GRID = ("n_lu", "n_params7") LUT_CROPS_GRID = ("n_crop_types", "n_crop_params") LUT_FERT_GRID = ("n_crop_types", "n_params13") LUT_NUP_GRID = ("n_crop_types", "n_params3") LUT_GCM_GRID = ("n_lu", "n_params2") TIMESTEPS = ("timesteps",) TIMESTEPS_DAY = ("timesteps_day",) TIMESTEPS_EVENT_FF = ("timesteps_event_ff",) TIMESTEPS_EVENT_FF_P1 = ("timesteps_event_ff_p1",) TIME = ("t",) TIME_FORCING = ("t_forc",) AGES = ("ages",) NAGES = ("nages",) NEVENTS_FF = ("events_ff",) CROPS = ("crops",) CR = ("cr",) N_SAS_PARAMS = ("n_sas_params",) N_CROP_TYPES = ("n_crop_types",) FLOWDIRS = ("n_flowdir",) # those are written to netCDF output by default BASE_DIMENSIONS = X + Y GHOST_DIMENSIONS = ("x", "y") # these are the settings that are getting used to determine shapes DIM_TO_SHAPE_VAR = { "x": "nx", "y": "ny", "z": "nz", "t": "nitt", "t_forc": "nitt_forc", "timesteps": 2, "timesteps_day": 6 * 24, "timesteps_event_ff": "nittevent_ff", "timesteps_event_ff_p1": "nittevent_ff_p1", "ages": "ages", "nages": "nages", "crops": "ncrops", "cr": "ncr", "events_ff": "nevent_ff", "n_sas_params": "nsas", "n_crop_types": 92, "n_crop_params": 24, "n_lu": 25, "n_sealing": 101, "n_slope": 10000, "n_params2": 2, "n_params3": 3, "n_params7": 7, "n_params9": 9, "n_params13": 13, "n_flowdir": "nflowdirs", } DEFAULT_MASKS = { CATCH_GRID: lambda settings, vs: vs.maskCatch, } # custom mask for routing def _get_z0_mask(vs): return vs.maskCatch[:, :, -1] def get_fill_value(dtype): import numpy as onp if onp.issubdtype(dtype, onp.floating): return FLOAT_FILL_VALUE return onp.iinfo(dtype).max def get_shape(dimensions, grid, include_ghosts=True, local=True): from roger.routines import CURRENT_CONTEXT from roger.distributed import SCATTERED_DIMENSIONS if grid is None: return () px, py = runtime_settings.num_proc grid_shapes = dict(dimensions) if local and CURRENT_CONTEXT.is_dist_safe: for pxi, dims in zip((px, py), SCATTERED_DIMENSIONS): for dim in dims: if dim not in grid_shapes: continue grid_shapes[dim] = grid_shapes[dim] // pxi if include_ghosts: for d in GHOST_DIMENSIONS: if d in grid_shapes: grid_shapes[d] += 4 shape = [] for grid_dim in grid: if isinstance(grid_dim, int): shape.append(grid_dim) continue if grid_dim not in grid_shapes: raise ValueError(f"unrecognized dimension {grid_dim}") shape.append(grid_shapes[grid_dim]) return tuple(shape) def remove_ghosts(array, dims): if dims is None: # scalar return array ghost_mask = tuple(slice(2, -2) if dim in GHOST_DIMENSIONS else slice(None) for dim in dims) return array[ghost_mask] VARIABLES = { # scalars "tau": Variable( "Index of current time step", None, "", "Index of current time step", dtype="int32", initial=1, write_to_restart=True, ), "taup1": Variable( "Index of next time step", None, "", "Index of next time step", dtype="int32", initial=2, write_to_restart=True ), "taum1": Variable( "Index of last time step", None, "", "Index of last time step", dtype="int32", initial=0, write_to_restart=True ), "tau_event": Variable( "Index of current time step within event", None, "", "Index of current time step within event", dtype="int32", initial=0, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "time": Variable( "Current time", None, "seconds", "Current time", dtype="int32", write_to_restart=True, ), "time_event0": Variable( "time since last rainfall/snow melt", None, "seconds", "time since last rainfall/snow melt", dtype="int32", initial=0, write_to_restart=True, ), "ages": Variable( "water ages", AGES, "days", "water ages", time_dependent=False, active=lambda settings: settings.enable_offline_transport, ), "nages": Variable( "water ages", NAGES, "days", "water ages", time_dependent=False, active=lambda settings: settings.enable_offline_transport, ), "itt": Variable( "Current iteration", None, "", "Current iteration", dtype="int32", initial=0, write_to_restart=True ), "itt_substep": Variable( "Current iteration", None, "", "Current iteration of substep", dtype="int32", initial=0, write_to_restart=True ), "itt_day": Variable( "Current iteration wthin day", None, "", "Current iteration within day", dtype="int32", initial=0, write_to_restart=True, ), "itt_event": Variable( "Current iteration wthin event", None, "", "Current iteration within event", dtype="int32", initial=0, write_to_restart=True, active=lambda settings: settings.enable_film_flow, ), "itt_forc": Variable( "Current iteration of forcing", None, "", "Current iteration of forcing", dtype="int32", initial=0, write_to_restart=True, ), "itt_cr": Variable( "Current iteration of crop rotation", None, "", "Current iteration of crop rotation", dtype="int32", initial=2, write_to_restart=True, ), "year": Variable( "Year at current iteration", TIMESTEPS, "", "Year at Current iteration", dtype="int32", initial=1900, write_to_restart=True, ), "YEAR": Variable( "Year", TIME_FORCING, "", "Year", dtype="int32", write_to_restart=True, ), "month": Variable( "Month at current iteration", TIMESTEPS, "", "Month at Current iteration", dtype="int32", initial=1, write_to_restart=True, ), "MONTH": Variable( "Month", TIME_FORCING, "", "Month", dtype="int32", write_to_restart=True, ), "doy": Variable( "Day of year at current iteration", TIMESTEPS, "", "Day of year at Current iteration", dtype="int32", initial=1, write_to_restart=True, ), "doy_dist": Variable( "Day of year at current iteration", CATCH_GRID, "", "Day of year at Current iteration", dtype="int32", initial=1, active=lambda settings: settings.enable_nitrate, ), "doy_fert1": Variable( "Day of year of first mineral fertilizer application", CATCH_GRID, "", "Day of year of first mineral fertilizer application", dtype="int32", initial=0, active=lambda settings: settings.enable_nitrate, ), "doy_fert2": Variable( "Day of year of second mineral fertilizer application", CATCH_GRID, "", "Day of year of second mineral fertilizer application", dtype="int32", initial=0, active=lambda settings: settings.enable_nitrate, ), "doy_fert3": Variable( "Day of year of third mineral fertilizer application", CATCH_GRID, "", "Day of year of third mineral fertilizer application", dtype="int32", initial=0, active=lambda settings: settings.enable_nitrate, ), "doy_fert1_org": Variable( "Day of year of first organic fertilizer application", CATCH_GRID, "", "Day of year of first organic fertilizer application", dtype="int32", initial=0, active=lambda settings: settings.enable_nitrate, ), "doy_fert2_org": Variable( "Day of year of second organic fertilizer application", CATCH_GRID, "", "Day of year of second organic fertilizer application", dtype="int32", initial=0, active=lambda settings: settings.enable_nitrate, ), "doy_fert3_org": Variable( "Day of year of third organic fertilizer application", CATCH_GRID, "", "Day of year of third organic fertilizer application", dtype="int32", initial=0, active=lambda settings: settings.enable_nitrate, ), "DOY": Variable( "Day of year", TIME_FORCING, "", "Day of year", dtype="int32", write_to_restart=True, ), "dt": Variable( "time step", None, "hours", "time step", dtype="float32", initial=1, write_to_restart=True, ), "dt_secs": Variable( "time step", None, "seconds", "time step", dtype="int32", initial=3600, write_to_restart=True, ), "time_for_diag": Variable( "cumulated time step within diagnostic period", None, "seconds", "cumulated time step within diagnostic period", dtype="int32", initial=0, write_to_restart=True, ), "event_id": Variable( "Event number", TIMESTEPS, "", "Event number", dtype="int32", initial=0, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "event_id_counter": Variable( "Counter of event number", None, "", "Counter of event number", dtype="int32", initial=1, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), # base variables "maskCatch": Variable( "Mask for catchment", CATCH_GRID, "", "Mask in physical space for catchment", initial=True, write_to_restart=True, time_dependent=False, dtype="bool", ), "maskRiver": Variable( "Mask for river", RIVER_GRID, "", "Mask in physical space for river", write_to_restart=True, time_dependent=False, dtype="bool", ), "maskLake": Variable( "Mask for lake", LAKE_GRID, "", "Mask in physical space for lake", time_dependent=False, write_to_restart=True, dtype="bool", ), "maskUrban": Variable( "Mask for urban", URBAN_GRID, "", "Mask in physical space for urban", time_dependent=False, write_to_restart=True, dtype="bool", ), "maskBoundGw": Variable( "Mask for boundaries", BOUNDGW_GRID, "", "Mask in physical space for boundaries", time_dependent=False, write_to_restart=True, dtype="bool", active=lambda settings: settings.enable_groundwater, ), "x": Variable( "Zonal coordinate", X, lambda settings: "degrees_east" if settings.coord_degree else "m", "Zonal (x) coordinate of grid center point", time_dependent=False, write_to_restart=True, ), "y": Variable( "Meridional coordinate", Y, lambda settings: "degrees_north" if settings.coord_degree else "m", "Meridional (y) coordinate of grid center point", time_dependent=False, write_to_restart=True, ), "z": Variable( "Vertical coordinate of grid center point", Z, "mm", "Vertical coordinate of grid center point", time_dependent=False, write_to_restart=True, ), # surface parameters "lu_id": Variable( "Land_use", CATCH_GRID, "m", "Land use", dtype="int32", time_dependent=False, write_to_restart=True, ), "LU_ID": Variable( "Land_use", CATCH_GRID + TIME, "m", "Land use", dtype="int32", time_dependent=False, write_to_restart=True, active=lambda settings: settings.enable_nitrate, ), "sealing": Variable( "degree of surface sealing", CATCH_GRID, "-", "degree of surface sealing", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "z0": Variable( "depth of the surface ponding", CATCH_GRID + TIMESTEPS, "mm", "depth of the surface ponding", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "inner_boundary": Variable( "catchment boundary", CATCH_GRID, "-", "catchment boundary", dtype="int32", active=lambda settings: settings.enable_routing_1D, write_to_restart=True, ), "outer_boundary": Variable( "catchment boundary", CATCH_GRID, "-", "catchment boundary", dtype="int32", active=lambda settings: settings.enable_routing_1D, write_to_restart=True, ), "elev": Variable( "surface elevation", CATCH_GRID, "m a.s.l.", "surface elevation", active=lambda settings: settings.enable_routing_1D, write_to_restart=True, ), "q0_out": Variable( "surface runoff", CATCH_GRID + FLOWDIRS, "mm/s", "surface runoff leaving a grid cell", active=lambda settings: settings.enable_routing_1D, write_to_restart=False, ), "dz0": Variable( "tendency of depth of the surface ponding", CATCH_GRID + FLOWDIRS, "m/m", "tendency of depth of the surface ponding", active=lambda settings: settings.enable_routing_1D, write_to_restart=False, ), "dz_sub": Variable( "tendency of depth of the saturation water table", CATCH_GRID + FLOWDIRS, "m/m", "tendency of depth of the saturation water table", active=lambda settings: settings.enable_routing_1D, write_to_restart=False, ), "v0": Variable( "flow velocity of surface runoff", CATCH_GRID + FLOWDIRS, "mm/s", "flow velocity of surface runoff", active=lambda settings: settings.enable_routing_1D, write_to_restart=False, ), "v_sub": Variable( "flow velocity of subsurface runoff", CATCH_GRID + FLOWDIRS, "mm/s", "flow velocity of subsurface runoff", active=lambda settings: settings.enable_routing_1D, write_to_restart=False, ), "q_mat_out": Variable( "matrix subsurface runoff", CATCH_GRID + FLOWDIRS, "mm/s", "matrix subsurface runoff leaving a grid cell", active=lambda settings: settings.enable_routing_1D, write_to_restart=False, ), "q_mp_out": Variable( "macropore subsurface runoff", CATCH_GRID + FLOWDIRS, "mm/s", "macropore subsurface runoff leaving a grid cell", active=lambda settings: settings.enable_routing_1D, write_to_restart=False, ), "slope": Variable( "surface slope", CATCH_GRID, "m/m", "surface slope", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "slope_per": Variable( "surface slope", CATCH_GRID, "%", "surface slope", dtype="int32", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_dep_tot": Variable( "total surface depression storage", CATCH_GRID, "mm", "total surface depression storage", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "ground_cover": Variable( "fraction of ground cover", CATCH_GRID + TIMESTEPS, "-", "fraction of ground cover", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "lai": Variable( "leaf area index", CATCH_GRID, "-", "leaf area index", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "throughfall_coeff_top": Variable( "throughfall coefficient of upper surface layer", CATCH_GRID, "-", "throughfall coefficient of upper surface layer", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "throughfall_coeff_ground": Variable( "throughfall coefficient of lower surface layer", CATCH_GRID, "-", "throughfall coefficient of lower surface layer", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "basal_evap_coeff": Variable( "basal soil evaporation coefficient", CATCH_GRID, "-", "basal soil evaporation coefficient", write_to_restart=True, ), "k_stress_evap": Variable( "water stress coefficient of soil evaporation", CATCH_GRID, "-", "water stress coefficient of soil evaporation", write_to_restart=True, ), "evap_coeff": Variable( "soil evaporation coefficient", CATCH_GRID, "-", "soil evaporation coefficient", write_to_restart=True, ), "basal_transp_coeff": Variable( "basal transpiration coefficient", CATCH_GRID, "-", "basal transpiration coefficient", write_to_restart=True, ), "k_stress_transp": Variable( "water stress coefficient of transpiration", CATCH_GRID, "-", "water stress coefficient of transpiration", write_to_restart=True, ), "transp_coeff": Variable( "transpiration coefficient", CATCH_GRID, "-", "transpiration coefficient", write_to_restart=True, ), "S_int_top_tot": Variable( "total interception storage of upper surface layer", CATCH_GRID, "-", "total interception storage of upper surface layer", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_int_ground_tot": Variable( "total interception storage of lower surface layer", CATCH_GRID, "-", "total interception storage of lower surface layer", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S": Variable( "storage", CATCH_GRID + TIMESTEPS, "mm", "storage", write_to_restart=True, ), "dS": Variable( "storage change", CATCH_GRID, "mm", "storage change", ), # surface variables "S_SNOW": Variable( "snow storage", CATCH_GRID + TIME, "mm", "snow storage", active=lambda settings: settings.enable_offline_transport, ), "S_snow": Variable( "snow storage", CATCH_GRID + TIMESTEPS, "mm", "snow storage", write_to_restart=True, ), "dS_snow": Variable( "change in snow storage", CATCH_GRID, "mm/dt", "change in snow storage", ), "swe": Variable( "snow water equivalent", CATCH_GRID + TIMESTEPS, "mm", "snow water equivalent", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "swe_top": Variable( "snow water equivalent", CATCH_GRID + TIMESTEPS, "mm", "snow water equivalent stored in snow cover of upper surface layer", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "swe_top_tot": Variable( "total snow water equivalent", CATCH_GRID, "mm", "total snow water equivalent stored in snow cover of upper surface layer", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "swe_ground": Variable( "snow water equivalent", CATCH_GRID + TIMESTEPS, "mm", "snow water equivalent stored in snow cover of lower surface layer", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_dep": Variable( "surface depression storage", CATCH_GRID + TIMESTEPS, "mm", "surface depression storage", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_sur": Variable( "surface storage", CATCH_GRID + TIMESTEPS, "mm", "surface storage", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "dS_sur": Variable( "change in surface storage", CATCH_GRID, "-", "change in surface storage", ), "S_int_top": Variable( "interception storage of upper surface layer", CATCH_GRID + TIMESTEPS, "mm", "interception storage of upper surface layer", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_int_ground": Variable( "interception storage of lower surface layer", CATCH_GRID + TIMESTEPS, "mm", "interception storage of lower surface layer", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "TA": Variable( "air temperature", TIME_FORCING, "degC", "air temperature", ), "TA_MIN": Variable( "daily minimum air temperature", TIME_FORCING, "degC", "daily minimum air temperature", active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "TA_MAX": Variable( "daily maximum air temperature", TIME_FORCING, "degC", "daily maximum air temperature", active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "ta": Variable( "air temperature", CATCH_GRID + TIMESTEPS, "degC", "air temperature", time_dependent=True, ), "ta_year": Variable( "average annual air temperature", CATCH_GRID, "degC", "average annual air temperature", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "ta_offset": Variable( "offset of air temperature", CATCH_GRID, "degC", "offset of air temperature", initial=0, active=lambda settings: not settings.enable_offline_transport, ), "ta_day": Variable( "air temperature", CATCH_GRID + TIMESTEPS_DAY, "degC", "air temperature", time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), # soil temperature "temp_soil": Variable( "soil temperature", CATCH_GRID + TIMESTEPS, "degC", "soil temperature", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "damp_soil_temp": Variable( "dampening depth of soil temperature", CATCH_GRID, "m", "diurnal dampening depth of soil temperature", time_dependent=True, initial=2290, active=lambda settings: settings.enable_nitrate, ), "phi_soil_temp": Variable( "phase constant of soil temperature", CATCH_GRID, "days", "phase constant of soil temperature", time_dependent=True, initial=-60, active=lambda settings: settings.enable_nitrate, ), # soil parameters and variables "z_soil": Variable( "Soil depth", CATCH_GRID, "mm", "Soil depth", time_dependent=False, write_to_restart=True, ), "c_root": Variable( "scale parameter of root depth", CATCH_GRID, "-", "scale parameter of root depth", time_dependent=False, write_to_restart=True, initial=1.0, active=lambda settings: not settings.enable_offline_transport, ), "clay": Variable( "fraction of clay content in soil", CATCH_GRID, "-", "fraction of clay content in soil", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "sand": Variable( "fraction of sand content in soil", CATCH_GRID, "-", "fraction of sand content in soil", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "lmpv": Variable( "length of vertical macropores", CATCH_GRID, "mm", "length of vertical macropores", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "lmpv_non_sat": Variable( "non-saturated length of vertical macropores", CATCH_GRID, "mm", "non-saturated length of vertical macropores", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "z_sc": Variable( "depth of shrinkage cracks", CATCH_GRID, "mm", "depth of shrinkage cracks", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "z_sc_non_sat": Variable( "non-saturated depth of shrinkage cracks", CATCH_GRID, "mm", "non-saturated depth of shrinkage cracks", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "dmpv": Variable( "density of vertical macropores", CATCH_GRID, "1/m^2", "density of vertical macropores", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "mp_drain_area": Variable( "drainage area of vertical macropores", CATCH_GRID, "%", "drainage area of vertical macropore", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "dmph": Variable( "density of horizontal macropores", CATCH_GRID, "1/m^2", "density of horizontal macropores", time_dependent=False, write_to_restart=True, active=lambda settings: settings.enable_lateral_flow, ), "frac_lp": Variable( "fraction of large pores", CATCH_GRID, "-", "fraction of large pores", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "frac_fp": Variable( "fraction of fine pores", CATCH_GRID, "-", "fraction of fine pores", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_eff": Variable( "effective porosity", CATCH_GRID, "-", "effective porosity", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_ufc": Variable( "usable field capacity of soil", CATCH_GRID, "-", "usable field capacity of soil", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_ac": Variable( "air capacity of soil", CATCH_GRID, "-", "air capacity of soil", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_pwp": Variable( "permanent wilting point of soil", CATCH_GRID, "-", "permanent wilting point of soil", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_sat": Variable( "soil water content at saturation", CATCH_GRID, "-", "soil water content at saturation", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_fc": Variable( "soil water content at field capacity", CATCH_GRID, "-", "soil water content at field capacity", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_27": Variable( "soil water content at 2700 hPa potential", CATCH_GRID, "-", "soil water content at 2700 hPa potential", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_4": Variable( "soil water content at 4000 hPa potential", CATCH_GRID, "-", "soil water content at 4000 hPa potential", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_6": Variable( "soil water content at 6000 hPa potential", CATCH_GRID, "-", "soil water content at 6000 hPa potential", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_pc": Variable( "soil water content threshold for deep percolation and capillary rise", CATCH_GRID, "-", "soil water content threshold for deep percolation and capillary rise", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_ufc_s": Variable( "usable field capacity of soil", CATCH_GRID, "mm", "usable field capacity of soil", time_dependent=False, write_to_restart=True, ), "S_ac_s": Variable( "air capacity of soil", CATCH_GRID, "mm", "air capacity of soil", time_dependent=False, write_to_restart=True, ), "S_pwp_s": Variable( "permanent wilting point of soil", CATCH_GRID, "mm", "permanent wilting point of soil", time_dependent=False, write_to_restart=True, ), "S_sat_s": Variable( "soil water content at saturation", CATCH_GRID, "mm", "soil water content at saturation", time_dependent=False, write_to_restart=True, ), "S_fc_s": Variable( "soil water content at field capacity", CATCH_GRID, "mm", "soil water content at field capacity", time_dependent=False, write_to_restart=True, ), "wfs": Variable( "water front suction", CATCH_GRID, "mm", "water front suction", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "ks": Variable( "Saturated hydraulic conductivity", CATCH_GRID, "mm/h", "Saturated hydraulic conductivity", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "ha": Variable( "air entry value", CATCH_GRID, "hpa", "air entry value", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "lambda_bc": Variable( "pore-size distribution index", CATCH_GRID, "-", "pore-size distribution index", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "m_bc": Variable( "pore-connectivity parameter", CATCH_GRID, "-", "pore-connectivity parameter", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "n_salv": Variable( "salvucci exponent", CATCH_GRID, "-", "salvucci exponent", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "z_sc_max": Variable( "maximum depth of shrinkage cracks", CATCH_GRID, "mm", "maximum depth of shrinkage cracks", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "v_mp_layer_1": Variable( "macropore flow velocity in the first layer", CATCH_GRID, "mm/h", "macropore flow velocity in the first layer", time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "v_mp_layer_2": Variable( "macropore flow velocity in the second layer", CATCH_GRID, "mm/h", "macropore flow velocity in the second layer", time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "v_mp_layer_3": Variable( "macropore flow velocity in the third layer", CATCH_GRID, "mm/h", "macropore flow velocity in the third layer", time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "v_mp_layer_4": Variable( "macropore flow velocity in the fourth layer", CATCH_GRID, "mm/h", "macropore flow velocity in the fourth layer", time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "v_mp_layer_5": Variable( "macropore flow velocity in the fifth layer", CATCH_GRID, "mm/h", "macropore flow velocity in the fifth layer", time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "v_mp_layer_6": Variable( "macropore flow velocity in the sixth layer", CATCH_GRID, "mm/h", "macropore flow velocity in the sixth layer", time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "v_mp_layer_7": Variable( "macropore flow velocity in the seventh layer", CATCH_GRID, "mm/h", "macropore flow velocity in the seventh layer", time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "v_mp_layer_8": Variable( "macropore flow velocity in the eighth layer", CATCH_GRID, "mm/h", "macropore flow velocity in the eighth layer", time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "event_no_ff": Variable( "Film flow event number", None, "", "Film flow event number", dtype="int32", initial=0, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "event_id_ff": Variable( "Film flow event number", None, "", "Film flow event number", dtype="int32", initial=0, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "event_id_ff_counter": Variable( "counter of film flow event number", None, "", "counter of film flow event number", dtype="int32", initial=0, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "event_start_ff": Variable( "iteration when new film flow event starts", NEVENTS_FF, "", "iteration when new film flow event starts", dtype="int32", initial=0, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "event_end_ff": Variable( "iteration when film flow event stops", NEVENTS_FF, "", "iteration when film flow event stops", dtype="int32", initial=0, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "rain_int_ff": Variable( "rainfall intensity of film flow input pulse", CATCH_GRID + NEVENTS_FF, "mm/10min", "rainfall intensity of film flow input pulse", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "rain_event": Variable( "rainfall of a film flow event", CATCH_GRID + TIMESTEPS_EVENT_FF, "mm/dt", "rainfall of a film flow event", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "rain_event_ff": Variable( "rectangular rainfall pulse of a film flow event", CATCH_GRID + TIMESTEPS_EVENT_FF, "mm/dt", "rectangular rainfall pulse of a film flow event", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "rain_event_sum": Variable( "rainfall sum of a film flow event", CATCH_GRID, "mm", "rainfall sum of a film flow event", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "rain_event_csum": Variable( "cumulated rainfall sum of a film flow event", CATCH_GRID + TIMESTEPS_EVENT_FF, "mm", "cumulated rainfall sum of a film flow event", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "t_end_ff": Variable( "time of film flow event", CATCH_GRID + NEVENTS_FF, "10min", "time of film flow event", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "ti_ff": Variable( "time of intersection between wetting front and drainage front", CATCH_GRID + NEVENTS_FF, "10min", "time of intersection between wetting front and drainage front", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "tb_ff": Variable( "time at beginning of rainfall input pulse", CATCH_GRID + NEVENTS_FF, "10min", "time at beginning of rainfall input pulse", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "ts_ff": Variable( "time at end of rainfall input pulse", CATCH_GRID + NEVENTS_FF, "10min", "time at end of rainfall input pulse", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "tw_ff": Variable( "time at arrival of wetting front at soil depth", CATCH_GRID + NEVENTS_FF, "10min", "time at arrival of wetting front at soil depth", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "tp_ff": Variable( "time at arrival of percolation front at soil depth", CATCH_GRID + NEVENTS_FF, "10min", "time at arrival of percolation front at soil depth", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "qs_ff": Variable( "volume flux density of film flow", CATCH_GRID + NEVENTS_FF, "m/s", "volume flux density of film flow", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "zi_ff": Variable( "depth of intersection between wetting front and drainage front", CATCH_GRID + NEVENTS_FF, "mm", "depth of intersection between wetting front and drainage front", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "rain_ff": Variable( "rainfall pulse of film flow", CATCH_GRID, "mm/10min", "rainfall pulse of film flow", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "v_wf": Variable( "velocity of film flow wetting front", CATCH_GRID + NEVENTS_FF, "mm/dt", "velocity of film flow wetting front", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "v_perc": Variable( "velocity of film flow percolation front", CATCH_GRID + NEVENTS_FF, "mm/dt", "velocity of film flow percolation front", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "ff_abs_rz": Variable( "film flow abstraction into root zone", CATCH_GRID + NEVENTS_FF, "mm/dt", "film flow abstraction into root zone", time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "ff_abs_ss": Variable( "film flow abstraction into subsoil", CATCH_GRID + NEVENTS_FF, "mm/dt", "film flow abstraction into subsoil", time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "ff_abs": Variable( "film flow abstraction into soil", CATCH_GRID + NEVENTS_FF, "mm/dt", "film flow abstraction into soil", time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "theta_d_rel_rz_ff": Variable( "relative saturation deficit of root zone", CATCH_GRID + NEVENTS_FF, "-", "relative saturation deficit of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "theta_d_rel_ss_ff": Variable( "relative saturation deficit of subsoil", CATCH_GRID + NEVENTS_FF, "-", "relative saturation deficit of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "S_f_rz": Variable( "film volume of root zone", CATCH_GRID + NEVENTS_FF, "mm", "film volume of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_film_flow, ), "S_f_ss": Variable( "film volume of subsoil", CATCH_GRID + NEVENTS_FF, "mm", "film volume of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_film_flow, ), "S_f": Variable( "film volume", CATCH_GRID + NEVENTS_FF, "mm", "film volume", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_film_flow, ), "ff_drain": Variable( "film flow drainage", CATCH_GRID, "mm/dt", "film flow drainage", time_dependent=True, active=lambda settings: settings.enable_film_flow, ), "theta_rz_ff": Variable( "soil water content including film flow of root zone", CATCH_GRID + TIMESTEPS, "-", "soil water content including film flow of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "theta_ss_ff": Variable( "soil water content including film flow of subsoil", CATCH_GRID + TIMESTEPS, "-", "soil water content including film flow of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "theta_ff": Variable( "soil water content including film flow", CATCH_GRID + TIMESTEPS, "-", "soil water content including film flow", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "S_rz_ff": Variable( "storage of root zone including film flow", CATCH_GRID + TIMESTEPS, "-", "storage of root zone including film flow", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_film_flow, ), "S_ss_ff": Variable( "storage of subsoil including film flow", CATCH_GRID + TIMESTEPS, "-", "storage of subsoil including film flow", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_film_flow, ), "S_ff": Variable( "storage including film flow", CATCH_GRID + TIMESTEPS, "-", "storage including film flow", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_film_flow, ), "itt_event_ff": Variable( "iteration within film flow event", NEVENTS_FF, "", "iteration within film flow event", dtype="int32", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "z_wf_ff": Variable( "depth of water content wave", CATCH_GRID + NEVENTS_FF + TIMESTEPS, "mm", "depth of water content wave", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "z_pf_ff": Variable( "depth of percolation front", CATCH_GRID + NEVENTS_FF + TIMESTEPS, "mm", "depth of percolation front", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "z_pf": Variable( "depth of percolation front", CATCH_GRID + TIMESTEPS, "mm", "depth of percolation front", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "a_ff": Variable( "film flow parameter", CATCH_GRID, "-", "film flow parameter", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "c_ff": Variable( "fudge parameter of film flow abstraction", CATCH_GRID, "-", "fudge parameter of film flow abstraction", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_film_flow, ), "kf": Variable( "vertical hydraulic conductivity of bedrock", CATCH_GRID, "mm/h", "vertical hydraulic conductivity of bedrock", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta": Variable( "Soil water content", CATCH_GRID + TIMESTEPS, "-", "Soil water content", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_fp": Variable( "Soil water content in fine pores", CATCH_GRID, "-", "Soil water content in fine pores", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_lp": Variable( "Soil water content in large pores", CATCH_GRID, "-", "Soil water content in large pores", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_d": Variable( "soil moisture deficit", CATCH_GRID, "-", "soil moisture deficit", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_d_fp": Variable( "soil moisture deficit in fine pores", CATCH_GRID, "-", "soil moisture deficit in fine pores", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_d_rel": Variable( "relative soil moisture deficit", CATCH_GRID, "-", "relative soil moisture deficit", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_d_rel_t0": Variable( "relative soil moisture deficit at beginning of event", CATCH_GRID, "-", "relative soil moisture deficit at beginning of event", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_d_rel_t1": Variable( "relative soil moisture deficit after rainfall pause", CATCH_GRID, "-", "relative soil moisture deficit after rainfall pause", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_d_t0": Variable( "soil moisture deficit at beginning of event", CATCH_GRID, "-", "soil moisture deficit at beginning of event", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_d_t1": Variable( "soil moisture deficit after rainfall pause", CATCH_GRID, "-", "soil moisture deficit after rainfall pause", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_S": Variable( "soil water content", CATCH_GRID + TIME, "mm", "soil water content", active=lambda settings: settings.enable_offline_transport, ), "S_s": Variable( "soil water content", CATCH_GRID + TIMESTEPS, "mm", "soil water content", write_to_restart=True, time_dependent=True, ), "dS_s": Variable( "change in soil water content", CATCH_GRID, "mm/dt", "change in soil water content", time_dependent=True, ), "S_fp_s": Variable( "soil water content in fine pores", CATCH_GRID, "mm", "soil water content in fine pores", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_lp_s": Variable( "soil water content in large pores", CATCH_GRID, "mm", "soil water content in large pores", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_zsat": Variable( "soil water content in large pores below saturation water level", CATCH_GRID, "mm", "soil water content in large pores below saturation water level", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "k": Variable( "hydraulic conductivity of soil", CATCH_GRID + TIMESTEPS, "mm/h", "hydraulic conductivity of soil", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "h": Variable( "soil water potential", CATCH_GRID + TIMESTEPS, "hPa", "soil water potential", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "y_mp": Variable( "radial length of macropore wetting front", CATCH_GRID + TIMESTEPS, "mm", "radial length of macropore wetting front", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "y_sc": Variable( "horizontal length of shrinkage crack wetting front", CATCH_GRID + TIMESTEPS, "mm", "horizontal length of shrinkage crack wetting front", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "z_wf": Variable( "depth of wetting front", CATCH_GRID + TIMESTEPS, "mm", "depth of wetting front", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "z_wf_t0": Variable( "depth of wetting front", CATCH_GRID + TIMESTEPS, "mm", "depth of wetting front", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "z_wf_t1": Variable( "depth of wetting front", CATCH_GRID + TIMESTEPS, "mm", "depth of wetting front", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "z_wf_fc": Variable( "depth of wetting front to fill storage until field capacity", CATCH_GRID, "mm", "depth of wetting front to fill storage until field capacity", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "z_sat_layer_1": Variable( "saturation depth of the first layer", CATCH_GRID + TIMESTEPS, "mm", "saturation depth of the first layer", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "z_sat_layer_2": Variable( "saturation depth of the second layer", CATCH_GRID + TIMESTEPS, "mm", "saturation depth of the second layer", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "z_sat_layer_3": Variable( "saturation depth of the third layer", CATCH_GRID + TIMESTEPS, "mm", "saturation depth of the third layer", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "z_sat_layer_4": Variable( "saturation depth of the fourth layer", CATCH_GRID + TIMESTEPS, "mm", "saturation depth of the fourth layer", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "z_sat_layer_5": Variable( "saturation depth of the fifth layer", CATCH_GRID + TIMESTEPS, "mm", "saturation depth of the fifth layer", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "z_sat_layer_6": Variable( "saturation depth of the sixth layer", CATCH_GRID + TIMESTEPS, "mm", "saturation depth of the sixth layer", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "z_sat_layer_7": Variable( "saturation depth of the seventh layer", CATCH_GRID + TIMESTEPS, "mm", "saturation depth of the seventh layer", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "z_sat_layer_8": Variable( "saturation depth of the eighth layer", CATCH_GRID + TIMESTEPS, "mm/h", "saturation depth of the eighth layer", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_lateral_flow, ), "z_sat": Variable( "depth of saturation water level", CATCH_GRID + TIMESTEPS, "mm/", "depth of saturation water level", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "dz_sat": Variable( "change in saturation water level", CATCH_GRID, "mm/dt", "change in saturation water level", time_dependent=True, ), "sa_s": Variable( "water StorAge of soil", CATCH_GRID + TIMESTEPS + AGES, "mm", "water StorAge of soil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "SA_s": Variable( "cumulative water StorAge of soil", CATCH_GRID + TIMESTEPS + NAGES, "mm", "cumulative water StorAge of soil", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "msa_s": Variable( "solute mass StorAge of soil", CATCH_GRID + TIMESTEPS + AGES, "mg", "solute mass StorAge of soil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "csa_s": Variable( "isotope StorAge of soil", CATCH_GRID + TIMESTEPS + AGES, "per mil", "isotope StorAge of soil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "M_s": Variable( "solute mass of soil", CATCH_GRID + TIMESTEPS, "mg", "solute mass of soil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "C_s": Variable( "solute concentration of soil", CATCH_GRID + TIMESTEPS, "mg/l", "solute concentration of soil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_s": Variable( "isotope ratio of soil", CATCH_GRID + TIMESTEPS, "per mil", "isotope ratio of soil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "mr_s": Variable( "mass removal from solute mass StorAge of soil", CATCH_GRID + AGES, "mg", "mass removal from solute mass StorAge of soil", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "denit_s": Variable( "denitrification of soil nitrate", CATCH_GRID, "mg/dt", "denitrification of soil nitrate", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "ngas_s": Variable( "gaseous loss of ammonium", CATCH_GRID, "mg/dt", "gaseous loss of ammonium", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "ma_s": Variable( "mass input to solute mass StorAge of soil", CATCH_GRID + AGES, "mg", "mass input to solute mass StorAge of soil", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "nit_s": Variable( "nitrification of mineral soil nitrogen", CATCH_GRID, "mg/dt", "nitrification of mineral soil nitrogen", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "min_s": Variable( "mineralization of soil nitrogen", CATCH_GRID, "mg/dt", "mineralization of soil nitrogen", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "ndep_s": Variable( "nitrogen deposition", CATCH_GRID, "mg/dt", "nitrogen deposition", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "nfix_s": Variable( "nitrogen fixation", CATCH_GRID, "mg/dt", "nitrogen fixation", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "rt10_s": Variable( "10th percentile of soil residence time", CATCH_GRID, "days", "10th percentile of soil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt25_s": Variable( "25th percentile of soil residence time", CATCH_GRID, "days", "25th percentile of soil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt50_s": Variable( "50th percentile of soil residence time", CATCH_GRID, "days", "50th percentile of soil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt75_s": Variable( "75th percentile of soil residence time", CATCH_GRID, "days", "75th percentile of soil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt90_s": Variable( "90th percentile of soil residence time", CATCH_GRID, "days", "90th percentile of soil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rtavg_s": Variable( "average of soil residence time", CATCH_GRID, "days", "average of soil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "Nmin_s": Variable( "inorganic nitrogen in soil", CATCH_GRID + TIMESTEPS, "mg", "inorganic nitrogen in soil", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_nitrate, ), # root zone parameters and variables "z_root": Variable( "Root depth", CATCH_GRID + TIMESTEPS, "mm", "Root depth", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport or settings.enable_nitrate, ), "zroot_to_zsoil_max": Variable( "maximum ratio of root zone depth to soil depth", CATCH_GRID, "-", "maximum ratio of root zone depth to soil depth", initial=0.75, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "Z_ROOT": Variable( "Root depth", CATCH_GRID + TIME, "mm", "Root depth", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "z_evap": Variable( "evaporation depth", CATCH_GRID, "m", "evaporation depth", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "tew": Variable( "total evaporable water", CATCH_GRID, "mm", "total evaporable water", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "rew": Variable( "readily evaporable water", CATCH_GRID, "mm", "readily evaporable water", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "de": Variable( "accumulated soil evaporation deficit", CATCH_GRID, "mm", "accumulated soil evaporation deficit", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_water_stress": Variable( "soil water content below water stress of plants starts", CATCH_GRID, "-", "soil water content below water stress of plants starts", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "water_stress_fp": Variable( "fraction of extractable fine pore storage for plant", CATCH_GRID, "-", "fraction of extractable fine pore storage for plant", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "k_rz": Variable( "hydraulic conductivity of root zone", CATCH_GRID + TIMESTEPS, "mm/h", "hydraulic conductivity of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "h_rz": Variable( "soil water potential of root zone", CATCH_GRID + TIMESTEPS, "hPa", "soil water potential of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_rz": Variable( "Soil moisture in root zone", CATCH_GRID + TIMESTEPS, "-", "Soil moisture in root zone", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_fp_rz": Variable( "Soil water content in fine pores", CATCH_GRID, "-", "Soil water content in fine pores", time_dependent=True, write_to_restart=True, ), "theta_lp_rz": Variable( "Soil water content in large pores", CATCH_GRID, "-", "Soil water content in large pores", time_dependent=True, write_to_restart=True, ), "S_RZ": Variable( "soil water content in root zone", CATCH_GRID + TIME, "mm", "soil water content in root zone", active=lambda settings: settings.enable_offline_transport, ), "S_rz": Variable( "soil water content in root zone", CATCH_GRID + TIMESTEPS, "mm", "soil water content in root zone", write_to_restart=True, time_dependent=True, ), "S_rz_init": Variable( "initial soil water content in root zone", CATCH_GRID, "mm", "initial soil water content in root zone", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_offline_transport, ), "dS_rz": Variable( "change of soil water content in root zone", CATCH_GRID, "mm/dt", "change of soil water content in root zone", time_dependent=True, ), "S_fp_rz": Variable( "soil water content of fine pores in root zone", CATCH_GRID, "mm", "soil water content of fine pores in root zone", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_lp_rz": Variable( "soil water content of large pores in root zone", CATCH_GRID, "mm", "soil water content of large pores in root zone", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_zsat_rz": Variable( "soil water content in large pores below saturation water level", CATCH_GRID, "mm", "soil water content in large pores below saturation water level", time_dependent=False, ), "S_PWP_RZ": Variable( "soil water content at permanent wilting point in root zone", CATCH_GRID + TIME, "mm", "soil water content at permanent wilting point in root zone", active=lambda settings: settings.enable_offline_transport & settings.enable_crop_phenology, ), "S_pwp_rz": Variable( "soil water content at permanent wilting point in root zone", CATCH_GRID, "mm", "soil water content at permanent wilting point in root zone", time_dependent=False, write_to_restart=True, ), "S_fc_rz": Variable( "soil water content at field capacity in root zone", CATCH_GRID, "mm", "soil water content at field capacity in root zone", time_dependent=False, write_to_restart=True, ), "S_SAT_RZ": Variable( "soil water content at saturation in root zone", CATCH_GRID + TIME, "mm", "soil water content at saturation in root zone", active=lambda settings: settings.enable_offline_transport & settings.enable_crop_phenology, ), "S_sat_rz": Variable( "soil water content at saturation in root zone", CATCH_GRID, "mm", "soil water content at saturation in root zone", time_dependent=False, write_to_restart=True, ), "S_ufc_rz": Variable( "usable field capacity of root zone", CATCH_GRID, "mm", "usable field capacity of root zone", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_ac_rz": Variable( "air capacity of root zone", CATCH_GRID, "mm", "air capacity of root zone", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "sa_rz": Variable( "water StorAge of root zone", CATCH_GRID + TIMESTEPS + AGES, "mm", "water StorAge of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "SA_rz": Variable( "cumulative water StorAge of root zone", CATCH_GRID + TIMESTEPS + NAGES, "mm", "cumulative water StorAge of root zone", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "msa_rz": Variable( "solute mass StorAge of root zone", CATCH_GRID + TIMESTEPS + AGES, "mg", "solute mass StorAge of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "csa_rz": Variable( "isotope StorAge of root zone", CATCH_GRID + TIMESTEPS + AGES, "per mil", "isotope StorAge of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "M_rz": Variable( "solute mass of root zone", CATCH_GRID + TIMESTEPS, "mg", "solute mass of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "C_rz": Variable( "solute concentration of root zone", CATCH_GRID + TIMESTEPS, "mg/l", "solute concentration of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_rz": Variable( "isotope ratio of root zone", CATCH_GRID + TIMESTEPS, "per mil", "isotope ratio of root zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "rt10_rz": Variable( "10th percentile of root zone residence time", CATCH_GRID, "days", "10th percentile of root zone residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt25_rz": Variable( "25th percentile of root zone residence time", CATCH_GRID, "days", "25th percentile of root zone residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt50_rz": Variable( "50th percentile of root zone residence time", CATCH_GRID, "days", "50th percentile of root zone residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt75_rz": Variable( "75th percentile of root zone residence time", CATCH_GRID, "days", "75th percentile of root zone residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt90_rz": Variable( "90th percentile of root zone residence time", CATCH_GRID, "days", "90th percentile of root zone residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rtavg_rz": Variable( "average of root zone residence time", CATCH_GRID, "days", "average of root zone residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "km_denit_rz": Variable( "Michaelis constant for denitrification", CATCH_GRID, "kg N ha-1 year-1", "Michaelis constant for denitrification", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "dmax_denit_rz": Variable( "maximum denitrification rate", CATCH_GRID, "kg N ha-1 year-1", "maximum denitrification rate", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "km_nit_rz": Variable( "Michaelis constant for nitrification", CATCH_GRID, "kg N ha-1 year-1", "Michaelis constant for nitrification", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "dmax_nit_rz": Variable( "maximum nitrification rate", CATCH_GRID, "kg N ha-1 year-1", "maximum nitrification rate", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "kmin_rz": Variable( "constant soil nitrogen mineralization rate", CATCH_GRID, "kg N ha-1 year-1", "constant soil nitrogen mineralization rate", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "kngl_rz": Variable( "constant gaseous loss rate of ammonium", CATCH_GRID, "kg N ha-1 year-1", "constant gaseous loss rate of ammonium", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "kfix_rz": Variable( "constant nitrogen fixation rate", CATCH_GRID, "kg N ha-1 year-1", "constant nitrogen fixation rate", write_to_restart=True, time_dependent=False, initial=0, active=lambda settings: settings.enable_nitrate, ), "kdep": Variable( "constant nitrogen deposition rate", CATCH_GRID, "kg N ha-1 year-1", "constant nitrogen deposition rate", write_to_restart=True, time_dependent=False, initial=0, active=lambda settings: settings.enable_nitrate, ), "nup": Variable( "potential nitrogen uptake rate by plants", CATCH_GRID, "kg N ha-1 day-1", "potential nitrogen uptake rate by plants", write_to_restart=True, time_dependent=False, initial=0, active=lambda settings: settings.enable_nitrate, ), "nh4_up": Variable( "nitrogen uptake rate by plants", CATCH_GRID, "mg N day-1", "nitrogen uptake rate by plants", write_to_restart=True, time_dependent=False, initial=0, active=lambda settings: settings.enable_nitrate, ), "c_fert": Variable( "ratio to dissolve mineral nitrogen fertilizer", CATCH_GRID, "-", "ratio to dissolve mineral nitrogen fertilizer", write_to_restart=True, time_dependent=False, initial=0.3, active=lambda settings: settings.enable_nitrate, ), "mr_rz": Variable( "mass removal from solute mass StorAge of root zone", CATCH_GRID + AGES, "mg", "mass removal from solute mass StorAge of root zone", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "ma_rz": Variable( "mass input to solute mass StorAge of root zone", CATCH_GRID + AGES, "mg", "mass input to solute mass StorAge of root zone", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "Nmin_rz": Variable( "inorganic nitrogen in root zone", CATCH_GRID + TIMESTEPS + AGES, "mg", "inorganic nitrogen in root zone", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_nitrate, ), # subsoil parameters and variables "k_ss": Variable( "hydraulic conductivity of subsoil", CATCH_GRID + TIMESTEPS, "mm/h", "hydraulic conductivity of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "h_ss": Variable( "soil water potential of subsoil", CATCH_GRID + TIMESTEPS, "hPa", "soil water potential of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_ss": Variable( "Soil moisture in subsoil", CATCH_GRID + TIMESTEPS, "-", "Soil moisture in subsoil", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "theta_fp_ss": Variable( "Soil water content in fine pores", CATCH_GRID, "-", "Soil water content in fine pores", time_dependent=True, write_to_restart=True, ), "theta_lp_ss": Variable( "Soil water content in large pores", CATCH_GRID, "-", "Soil water content in large pores", time_dependent=True, write_to_restart=True, ), "S_SS": Variable( "soil water content in subsoil", CATCH_GRID + TIME, "mm", "soil water content in subsoil", active=lambda settings: settings.enable_offline_transport, ), "S_ss": Variable( "soil water content in subsoil", CATCH_GRID + TIMESTEPS, "mm", "soil water content in subsoil", write_to_restart=True, time_dependent=True, ), "S_ss_init": Variable( "initial soil water content in subsoil", CATCH_GRID, "mm", "initial soil water content in subsoil", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_offline_transport, ), "dS_ss": Variable( "change of soil water content in subsoil", CATCH_GRID, "mm/dt", "change of soil water content in subsoil", time_dependent=True, ), "S_fp_ss": Variable( "soil water content of fine pores in subsoil", CATCH_GRID, "mm", "soil water content of fine pores in subsoil", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_lp_ss": Variable( "soil water content of large pores in subsoil", CATCH_GRID, "mm", "soil water content of large pores in subsoil", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_zsat_ss": Variable( "soil water content in large pores below saturation water level", CATCH_GRID, "mm", "soil water content in large pores below saturation water level", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_PWP_SS": Variable( "soil water content at permanent wilting point in subsoil", CATCH_GRID + TIME, "mm", "soil water content at permanent wilting point in subsoil", active=lambda settings: settings.enable_offline_transport & settings.enable_crop_phenology, ), "S_pwp_ss": Variable( "soil water content at permanent wilting point in subsoil", CATCH_GRID, "mm", "soil water content at permanent wilting point in subsoil", time_dependent=False, write_to_restart=True, ), "S_fc_ss": Variable( "soil water content at field capacity in subsoil", CATCH_GRID, "mm", "soil water content at field capacity in subsoil", time_dependent=False, write_to_restart=True, ), "S_SAT_SS": Variable( "soil water content at saturation in subsoil", CATCH_GRID + TIME, "mm", "soil water content at saturation in subsoil", active=lambda settings: settings.enable_offline_transport & settings.enable_crop_phenology, ), "S_sat_ss": Variable( "soil water content at saturation in subsoil", CATCH_GRID, "mm", "soil water content at saturation in subsoil", time_dependent=False, write_to_restart=True, ), "S_ufc_ss": Variable( "usable field capacity of subsoil", CATCH_GRID, "mm", "usable field capacity of subsoil", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "S_ac_ss": Variable( "air capacity of subsoil", CATCH_GRID, "mm", "air capacity of subsoil", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "sa_ss": Variable( "water StorAge of subsoil", CATCH_GRID + TIMESTEPS + AGES, "mm", "water StorAge of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "SA_ss": Variable( "cumulative water StorAge of subsoil", CATCH_GRID + TIMESTEPS + NAGES, "mm", "cumulative water StorAge of subsoil", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "msa_ss": Variable( "solute mass StorAge of subsoil", CATCH_GRID + TIMESTEPS + AGES, "mg", "solute mass StorAge of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "csa_ss": Variable( "isotope StorAge of subsoil", CATCH_GRID + TIMESTEPS + AGES, "per mil", "isotope StorAge of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "M_ss": Variable( "solute mass of subsoil", CATCH_GRID + TIMESTEPS, "mg", "solute mass of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "C_ss": Variable( "solute concentration of subsoil", CATCH_GRID + TIMESTEPS, "mg/l", "solute concentration of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_ss": Variable( "isotope ratio of subsoil", CATCH_GRID + TIMESTEPS, "per mil", "isotope ratio of subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "rt10_ss": Variable( "10th percentile of subsoil residence time", CATCH_GRID, "days", "10th percentile of subsoil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt25_ss": Variable( "25th percentile of subsoil residence time", CATCH_GRID, "days", "25th percentile of subsoil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt50_ss": Variable( "50th percentile of subsoil residence time", CATCH_GRID, "days", "50th percentile of subsoil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt75_ss": Variable( "75th percentile of subsoil residence time", CATCH_GRID, "days", "75th percentile of subsoil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rt90_ss": Variable( "90th percentile of subsoil residence time", CATCH_GRID, "days", "90th percentile of subsoil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "rtavg_ss": Variable( "average of subsoil residence time", CATCH_GRID, "days", "average of subsoil residence time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "km_denit_ss": Variable( "Michaelis constant for denitrification", CATCH_GRID, "kg N ha-1 year-1", "Michaelis constant for denitrification", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "dmax_denit_ss": Variable( "maximum denitrification rate", CATCH_GRID, "kg N ha-1 year-1", "maximum denitrification rate", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "km_nit_ss": Variable( "Michaelis constant for nitrification", CATCH_GRID, "kg N ha-1 year-1", "Michaelis constant for nitrification", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "dmax_nit_ss": Variable( "maximum nitrification rate", CATCH_GRID, "kg N ha-1 year-1", "maximum nitrification rate", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "kmin_ss": Variable( "constant mineralization rate", CATCH_GRID, "kg N ha-1 year-1", "constant mineralization rate", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate, ), "mr_ss": Variable( "mass removal from solute mass StorAge of subsoil", CATCH_GRID + AGES, "mg", "mass removal from solute mass StorAge of subsoil", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "ma_ss": Variable( "mass input to solute mass StorAge of subsoil", CATCH_GRID + AGES, "mg", "mass input to solute mass StorAge of subsoil", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "Nmin_ss": Variable( "inorganic nitrogen in subsoil", CATCH_GRID + TIMESTEPS + AGES, "mg", "inorganic nitrogen in subsoil", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "N_fert1": Variable( "Nitrogen of first mineral fertilizer application", CATCH_GRID, "kg N ha-1", "Nitrogen of first mineral fertilizer application", initial=0, active=lambda settings: settings.enable_nitrate, ), "N_fert2": Variable( "Nitrogen of second mineral fertilizer application", CATCH_GRID, "kg N ha-1", "Nitrogen of second mineral fertilizer application", initial=0, active=lambda settings: settings.enable_nitrate, ), "N_fert3": Variable( "Nitrogen of third mineral fertilizer application", CATCH_GRID, "kg N ha-1", "Nitrogen of third mineral fertilizer application", initial=0, active=lambda settings: settings.enable_nitrate, ), "N_fert1_org": Variable( "Nitrogen of first organic fertilizer application", CATCH_GRID, "kg N ha-1", "Nitrogen of first organic fertilizer application", initial=0, active=lambda settings: settings.enable_nitrate, ), "N_fert2_org": Variable( "Nitrogen of second organic fertilizer application", CATCH_GRID, "kg N ha-1", "Nitrogen of second organic fertilizer application", initial=0, active=lambda settings: settings.enable_nitrate, ), "N_fert3_org": Variable( "Nitrogen of third organic fertilizer application", CATCH_GRID, "kg N ha-1", "Nitrogen of third organic fertilizer application", initial=0, active=lambda settings: settings.enable_nitrate, ), # groundwater parameters "S_gw_tot": Variable( "total groundwater storage", CATCH_GRID, "mm", "total groundwater storage", time_dependent=False, write_to_restart=True, active=lambda settings: settings.enable_groundwater, ), "z_gw_tot": Variable( "total thickness of aquifer layer", CATCH_GRID, "m", "total thickness of aquifer layer", time_dependent=False, write_to_restart=True, active=lambda settings: settings.enable_groundwater, ), "npor": Variable( "porosity of aquifer layer", CATCH_GRID, "-", "porosity of aquifer layer", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_groundwater, ), "nuy": Variable( "unspecific yield of aquifer layer", CATCH_GRID, "-", "unspecific yield of aquifer layer", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_groundwater, ), "n0": Variable( "specific yield at the soil/bedrock interface", CATCH_GRID, "-", "specific yield at the soil/bedrock interface", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and (settings.enable_groundwater or settings.enable_groundwater_boundary), ), "k_gw": Variable( "hydraulic conductivity of aquifer layer", CATCH_GRID, "mm/h", "hydraulic conductivity of aquifer layer", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_groundwater, ), "k_leak": Variable( "hydraulic conductivity of aquitard", CATCH_GRID, "mm/h", "hydraulic conductivity of aquitard", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_groundwater, ), "bdec": Variable( "decay coeffcient", CATCH_GRID, "-", "decay coeffcient", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_groundwater, ), "tt": Variable( "transmissivity of aquifer", CATCH_GRID, "m^2/h", "transmissivity of aquifer", time_dependent=False, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_groundwater, ), # groundwater variables "z_gw": Variable( "Groundwater table depth", CATCH_GRID + TIMESTEPS, "m", "Groundwater table depth", write_to_restart=True, time_dependent=True, initial=1000, ), "Z_GW": Variable( "Groundwater table depth", TIME_FORCING, "m", "Groundwater table depth", active=lambda settings: not settings.enable_offline_transport and settings.enable_groundwater_boundary, ), "dz_gw": Variable( "gradient of groundwater table depth", CATCH_GRID + FLOWDIRS, "m/m", "gradient of groundwater table depth", time_dependent=True, active=lambda settings: settings.enable_groundwater & settings.enable_routing_1D, ), "S_gw": Variable( "Groundwater storage", CATCH_GRID + TIMESTEPS, "mm", "Groundwater storage", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_groundwater, ), "S_gw_res": Variable( "Residual groundwater storage", CATCH_GRID + TIMESTEPS, "mm", "Residual groundwater storage", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_groundwater, ), "dS_gw": Variable( "change of groundwater storage", CATCH_GRID, "mm/dt", "change of groundwater storag", time_dependent=True, active=lambda settings: settings.enable_groundwater, ), "S_vad_tot": Variable( "Total vadose zone storage", CATCH_GRID + TIMESTEPS, "mm", "Total vadose zone storage", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_groundwater or settings.enable_groundwater_boundary, ), "S_vad": Variable( "Vadose zone storage", CATCH_GRID + TIMESTEPS, "mm", "Vadose zone storage", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_groundwater or settings.enable_groundwater_boundary, ), "S_vad_res": Variable( "Residual vadose zone storage", CATCH_GRID + TIMESTEPS, "mm", "Residual vadose zone storage", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_groundwater, ), "dS_vad": Variable( "change of vadose zone storage", CATCH_GRID, "mm/dt", "change of vadose zone storage", time_dependent=True, active=lambda settings: settings.enable_groundwater & settings.enable_groundwater, ), "sa_vad": Variable( "water StorAge of vadose zone", CATCH_GRID + TIMESTEPS + AGES, "mm", "water StorAge of vadose zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "SA_vad": Variable( "cumulative water StorAge of vadose zone", CATCH_GRID + TIMESTEPS + NAGES, "mm", "cumulative water StorAge of vadose zone", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "msa_vad": Variable( "solute mass StorAge of vadose zone", CATCH_GRID + TIMESTEPS + AGES, "mg", "solute mass StorAge of vadose zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "M_vad": Variable( "solute mass of vadose zone", CATCH_GRID + TIMESTEPS, "mg", "solute mass of vadose zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "C_vad": Variable( "solute concentration of vadose zone", CATCH_GRID + TIMESTEPS, "mg/l", "solute concentration of vadose zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "sa_gw": Variable( "water StorAge of groundwater", CATCH_GRID + TIMESTEPS + AGES, "mm", "water StorAge of groundwater", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "SA_gw": Variable( "cumulative water StorAge of groundwater", CATCH_GRID + TIMESTEPS + NAGES, "mm", "cumulative water StorAge of groundwater", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "msa_gw": Variable( "solute mass StorAge of groundwater", CATCH_GRID + TIMESTEPS + AGES, "mg", "solute mass StorAge of groundwater", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "M_gw": Variable( "solute mass of groundwater", CATCH_GRID + TIMESTEPS, "mg", "solute mass of groundwater", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "C_gw": Variable( "solute concentration of groundwater", CATCH_GRID + TIMESTEPS, "mg/l", "solute concentration of groundwater", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "k_denit_gw": Variable( "decay rate for denitrification in groundwater", CATCH_GRID, "kg N ha-1 year-1", "decay rate for denitrification in groundwater", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_nitrate & settings.enable_groundwater, ), "q_re": Variable( "groundwater recharge", CATCH_GRID, "mm/dt", "groundwater recharge", time_dependent=True, active=lambda settings: settings.enable_groundwater or settings.enable_groundwater_boundary, ), "q_gw": Variable( "lateral groundwater flow", CATCH_GRID, "mm/dt", "lateral groundwater flow", time_dependent=True, active=lambda settings: settings.enable_groundwater, ), "sas_params_q_gw": Variable( "SAS parameters of lateral groundwater runoff", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of lateral groundwater runoff", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "TT_q_gw": Variable( "cumulative travel time distribution", CATCH_GRID + NAGES, "-", "cumulative travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "tt_q_gw": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "MTT_q_gw": Variable( "cumulative solute travel time distribution", CATCH_GRID + NAGES, "-", "cumulative solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "mtt_q_gw": Variable( "solute travel time distribution", CATCH_GRID + AGES, "-", "solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "M_q_gw": Variable( "solute mass of lateral groundwater flow", CATCH_GRID, "-", "solute mass of lateral groundwater flow", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "C_q_qw": Variable( "solute concentration of lateral groundwater flow", CATCH_GRID, "mg/l", "solute concentration of lateral groundwater flow", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_groundwater, ), "q_leak": Variable( "groundwater leakage", CATCH_GRID, "mm/dt", "groundwater leakage", time_dependent=True, active=lambda settings: settings.enable_groundwater, ), # precipitation variables "PREC": Variable( "precipitation", TIME_FORCING, "mm/10 minutes", "precipitation (uniform)", active=lambda settings: not settings.enable_offline_transport, ), "PREC_DIST_DAILY": Variable( "precipitation", CATCH_GRID + TIME, "mm/10 minutes", "precipitation (distributed)", active=lambda settings: settings.enable_offline_transport, ), "prec": Variable( "precipitation", CATCH_GRID + TIMESTEPS, "mm/dt", "precipitation", ), "prec_weight": Variable( "weight factor of precipitation", CATCH_GRID, "-", "weight factor of precipitation", initial=1.0, active=lambda settings: not settings.enable_offline_transport, ), "EVENTS": Variable( "event number", TIME_FORCING, "", "event number", active=lambda settings: not settings.enable_offline_transport & settings.enable_film_flow, ), "soil_fertility": Variable( "soil fertility class", CATCH_GRID, "", "soil fertility class", initial=1.0, active=lambda settings: settings.enable_nitrate, ), "fert_weight": Variable( "weight factor of fertilization", CATCH_GRID, "-", "weight factor of fertilization", initial=1.0, active=lambda settings: settings.enable_nitrate, ), "prec_day": Variable( "precipitation", CATCH_GRID + TIMESTEPS_DAY, "mm/dt", "precipitation", active=lambda settings: not settings.enable_offline_transport, ), "rain": Variable( "rainfall", CATCH_GRID, "mm/dt", "rainfall", ), "rain_top": Variable( "rainfall", CATCH_GRID, "mm/dt", "rainfall at upper surface layer", ), "rain_ground": Variable( "rainfall", CATCH_GRID, "mm/dt", "rainfall at lower surface layer", ), "rain_on_snow": Variable( "rain-on-snow", CATCH_GRID, "mm/dt", "rain on snow cover", ), "snow": Variable( "snowfall", CATCH_GRID, "mm/dt", "snowfall", ), "snow_melt_drip": Variable( "snow melt drip from canopy", CATCH_GRID, "mm/dt", "snow melt drip from canopy", ), "snow_top": Variable( "snowfall", CATCH_GRID, "mm/dt", "snowfall at upper surface layer", ), "snow_ground": Variable( "snowfall", CATCH_GRID, "mm/dt", "snowfall at lower surface layer", ), # interception variables "int_top": Variable( "precipitation interception", CATCH_GRID, "mm/dt", "rainfall interception", time_dependent=True, ), "int_ground": Variable( "precipitation interception", CATCH_GRID, "mm/dt", "rainfall interception", time_dependent=True, ), "int_prec": Variable( "precipitation interception", CATCH_GRID, "mm/dt", "precipitation interception", time_dependent=True, ), "int_rain_top": Variable( "rainfall interception at upper surface layer", CATCH_GRID, "mm/dt", "rainfall interception at upper surface layer", time_dependent=True, ), "int_rain_ground": Variable( "rainfall interception at lower surface layer", CATCH_GRID, "mm/dt", "rainfall interception at lower surface layer", time_dependent=True, ), "int_snow_top": Variable( "snowfall interception at upper surface layer", CATCH_GRID, "mm/dt", "snowfall interception at upper surface layer", time_dependent=True, ), "int_snow_ground": Variable( "snowfall interception at lower surface layer", CATCH_GRID, "mm/dt", "snowfall interception at lower surface layer", time_dependent=True, ), # snow variables "snow_melt_top": Variable( "snow melt in upper surface layer", CATCH_GRID, "mm/dt", "snow melt in upper surface layer", time_dependent=True, ), "snow_melt_ground": Variable( "snow melt in lower surface layer", CATCH_GRID, "mm/dt", "snow melt", time_dependent=True, ), "snow_melt": Variable( "snow melt in lower surface layer", CATCH_GRID, "mm/dt", "snow melt", time_dependent=True, ), "q_rain_on_snow": Variable( "rain-on-snow runoff", CATCH_GRID, "mm/dt", "rain-on-snow runoff", time_dependent=True, ), "q_snow": Variable( "snow runoff", CATCH_GRID, "mm/dt", "snow runoff", time_dependent=True, ), # infiltration variables "inf_mat": Variable( "matrix infiltration", CATCH_GRID, "mm/dt", "matrix infiltration", time_dependent=True, ), "INF_MAT_RZ": Variable( "matrix infiltration into root zone", CATCH_GRID + TIME, "mm/dt", "matrix infiltration into root zone", active=lambda settings: settings.enable_offline_transport, ), "inf_mat_rz": Variable( "matrix infiltration into root zone", CATCH_GRID, "mm/dt", "matrix infiltration into root zone", time_dependent=True, ), "inf_mat_ss": Variable( "matrix infiltration into subsoil", CATCH_GRID, "mm/dt", "matrix infiltration into subsoil", time_dependent=True, ), "inf_mat_pot": Variable( "potential matrix infiltration", CATCH_GRID, "mm/dt", "potential matrix infiltration", time_dependent=True, ), "inf_sc": Variable( "shrinkage crack infiltration", CATCH_GRID, "mm/dt", "shrinkage crack infiltration", time_dependent=True, ), "inf_sc_rz": Variable( "shrinkage crack infiltration", CATCH_GRID, "mm/dt", "shrinkage crack infiltration", time_dependent=True, ), "inf_mp": Variable( "macropore infiltration", CATCH_GRID, "mm/dt", "macropore infiltration", time_dependent=True, ), "inf_mp_rz": Variable( "macropore infiltration into root zone", CATCH_GRID, "mm/dt", "macropore infiltration into root zone", time_dependent=True, ), "inf_mp_ss": Variable( "macropore infiltration into subsoil", CATCH_GRID, "mm/dt", "macropore infiltration into subsoil", time_dependent=True, ), "INF_PF_SS": Variable( "preferential infiltration into subsoil", CATCH_GRID + TIME, "mm/dt", "preferential infiltration into subsoil", active=lambda settings: settings.enable_offline_transport, ), "inf_pf_ss": Variable( "preferential infiltration into subsoil", CATCH_GRID, "mm/dt", "preferential infiltration into subsoil", time_dependent=True, ), "INF_PF_RZ": Variable( "preferential infiltration into root zone", CATCH_GRID + TIME, "mm/dt", "preferential infiltration into root zone", active=lambda settings: settings.enable_offline_transport, ), "inf_pf_rz": Variable( "preferential infiltration into root zone", CATCH_GRID, "mm/dt", "preferential infiltration into root zone", time_dependent=True, ), "inf": Variable( "total infiltration", CATCH_GRID, "mm/dt", "total infiltration", time_dependent=True, ), "inf_rz": Variable( "total infiltration into root zone", CATCH_GRID, "mm/dt", "total infiltration into root zone", time_dependent=True, ), "inf_ss": Variable( "total infiltration into subsoil", CATCH_GRID, "mm/dt", "total infiltration into subsoil", time_dependent=True, ), "inf_in_tracer": Variable( "cumulated infiltration for tracer input", CATCH_GRID, "mm", "cumulated infiltration for tracer input", time_dependent=True, active=lambda settings: settings.enable_nitrate, ), "no_wf": Variable( "number of wetting fronts", CATCH_GRID, "", "number of wetting fronts", dtype="int32", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "pi_gr": Variable( "threshold rainfall intensity", CATCH_GRID, "mm/dt", "threshold rainfall intensity", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "pi_m": Variable( "rainfall sum at matrix saturation", CATCH_GRID, "mm", "rainfall sum at matrix saturation", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "t_sat": Variable( "time to reach matrix saturation", CATCH_GRID, "hours", "time to reach matrix saturation", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "t_sat_t0": Variable( "time to reach matrix saturation of first wetting front", CATCH_GRID, "hours", "time to reach matrix saturation of first wetting front", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "t_sat_t1": Variable( "time to reach matrix saturation of second wetting front", CATCH_GRID, "hours", "time to reach matrix saturation of second wetting front", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "Fs": Variable( "Infiltration sum to reach saturation", CATCH_GRID, "mm", "Infiltration sum to reach saturation", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "Fs_t0": Variable( "Infiltration sum to reach saturation of first wetting front", CATCH_GRID, "mm", "Infiltration sum to reach saturation of first wetting front", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "Fs_t1": Variable( "Infiltration sum to reach saturation of second wetting front", CATCH_GRID, "mm", "Infiltration sum to reach saturation of second wetting front", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "inf_mat_pot_event_csum": Variable( "cumulated potential matrix infiltration while event", CATCH_GRID, "mm", "cumulated potential matrix infiltration while event", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "inf_mat_event_csum": Variable( "cumulated matrix infiltration while event", CATCH_GRID, "mm", "cumulated matrix infiltration while event", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "inf_mp_event_csum": Variable( "cumulated macropore infiltration while event", CATCH_GRID, "mm", "cumulated macropore infiltration while event", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "inf_sc_event_csum": Variable( "cumulated shrinkage crack infiltration while event", CATCH_GRID, "mm", "cumulated shrinkage crack infiltration while event", write_to_restart=True, active=lambda settings: not settings.enable_offline_transport, ), "tt_inf_mat_rz": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_inf_mat_rz": Variable( "solute travel time distribution", CATCH_GRID + AGES, "-", "solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_inf_mat_rz": Variable( "solute concentration of matrix infiltration into root zone", CATCH_GRID, "mg/l", "solute concentration of matrix infiltration into root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_inf_mat_rz": Variable( "isotope ratio of matrix infiltration into root zone", CATCH_GRID, "per mil", "isotope ratio of matrix infiltration into root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "M_inf_mat_rz": Variable( "solute mass of matrix infiltration into root zone", CATCH_GRID, "mg", "solute mass of matrix infiltration into root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "tt_inf_pf_rz": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_inf_pf_rz": Variable( "solute travel time distribution", CATCH_GRID + AGES, "-", "solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_inf_pf_rz": Variable( "solute concentration of preferential infiltration into root zone", CATCH_GRID, "mg/l", "solute concentration of preferential infiltration into root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_inf_pf_rz": Variable( "isotope ratio of preferential infiltration into root zone", CATCH_GRID, "per mil", "isotope ratio of preferential infiltration into root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "M_inf_pf_rz": Variable( "solute mass of preferential infiltration into root zone", CATCH_GRID, "mg", "solute mass of preferential infiltration into root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "tt_inf_pf_ss": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_inf_pf_ss": Variable( "solute travel time distribution", CATCH_GRID + AGES, "-", "solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_inf_pf_ss": Variable( "solute concentration of preferential infiltration into subsoil", CATCH_GRID, "mg/l or per mil", "solute concentration of preferential infiltration into subsoil", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_inf_pf_ss": Variable( "isotope ratio of preferential infiltration into subsoil", CATCH_GRID, "per mil", "isotope ratio of preferential infiltration into subsoil", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "M_inf_pf_ss": Variable( "solute mass of preferential infiltration into subsoil", CATCH_GRID, "mg", "solute mass of preferential infiltration into subsoil", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), # evapotranspiration variables "aet": Variable( "actual evapotranspiration", CATCH_GRID, "mm/dt", "actual evapotranspiration", time_dependent=True, ), "aet_soil": Variable( "actual evapotranspiration from soil water storage", CATCH_GRID, "mm/dt", "actual evapotranspiration from soil water storage", time_dependent=True, ), "RS": Variable( "solar radiation", TIME_FORCING, "MJ/m2", "solar radiation", ), "rs": Variable( "solar radiation", CATCH_GRID, "MJ/m2", "solar radiation", time_dependent=True, ), "rs_day": Variable( "solar radiation", CATCH_GRID + TIMESTEPS_DAY, "MJ/m2", "solar radiation", time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "c1_mak": Variable( "Makkink coeffcient", CATCH_GRID, "-", "Makkink coeffcient", write_to_restart=True, ), "c2_mak": Variable( "Makkink coeffcient", CATCH_GRID, "-", "Makkink coeffcient", write_to_restart=True, ), "PET": Variable( "potential evapotranspiration", TIME_FORCING, "mm/dt", "potential evapotranspiration", ), "pet": Variable( "potential evapotranspiration", CATCH_GRID, "mm/dt", "potential evapotranspiration", time_dependent=True, ), "pet_weight": Variable( "weight factor of potential evapotranspiration", CATCH_GRID, "-", "weight factor of potential evapotranspiration", initial=1.0, active=lambda settings: not settings.enable_offline_transport, ), "pet_day": Variable( "potential evapotranspiration", CATCH_GRID + TIMESTEPS_DAY, "mm/dt", "potential evapotranspiration", time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "pet_res": Variable( "Residual potential evapotranspiration", CATCH_GRID, "mm/dt", "Residual potential evapotranspiration", time_dependent=True, ), "ptransp": Variable( "potential transpiration", CATCH_GRID, "mm", "potential transpiration", time_dependent=True, ), "ptransp_res": Variable( "Residual potential transpiration", CATCH_GRID, "mm/dt", "Residual potential transpiration", time_dependent=True, ), "TRANSP": Variable( "actual transpiration", CATCH_GRID + TIME, "mm/dt", "actual transpiration", active=lambda settings: settings.enable_offline_transport, ), "transp": Variable( "actual transpiration", CATCH_GRID, "mm/dt", "actual transpiration", time_dependent=True, ), "evap": Variable( "actual evaporation", CATCH_GRID, "mm/dt", "actual evaporation", time_dependent=True, ), "EVAP_SOIL": Variable( "actual soil evaporation", CATCH_GRID + TIME, "mm/dt", "actual soil evaporation", active=lambda settings: settings.enable_offline_transport, ), "evap_soil": Variable( "actual soil evaporation", CATCH_GRID, "mm/dt", "actual soil evaporation", time_dependent=True, ), "evap_int": Variable( "actual evaporation of intercepted water", CATCH_GRID, "mm/dt", "actual evaporation of intercepted water", time_dependent=True, write_to_restart=True, ), "evap_int_top": Variable( "actual evaporation of intercepted water from upper surface layer", CATCH_GRID, "mm/dt", "actual evaporation of intercepted water from upper surface layer", time_dependent=True, ), "evap_int_ground": Variable( "actual evaporation of intercepted water from lower surface layer", CATCH_GRID, "mm/dt", "actual evaporation of intercepted water from lower surface layer", time_dependent=True, ), "evap_sur": Variable( "actual evaporation from surface layer", CATCH_GRID, "mm/dt", "actual evaporation from surface layer", time_dependent=True, ), "evap_dep": Variable( "actual evaporation from surface depression storage", CATCH_GRID, "mm/dt", "actual evaporation from surface depression storage", time_dependent=True, ), "sas_params_transp": Variable( "SAS parameters of transpiration", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of transpiration", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "TT_transp": Variable( "cumulative travel time distribution", CATCH_GRID + NAGES, "-", "cumulative travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "tt_transp": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "MTT_transp": Variable( "cumulative solute travel time distribution", CATCH_GRID + NAGES, "-", "cumulative solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_transp": Variable( "solute mass travel time distribution", CATCH_GRID + AGES, "-", "solute mass travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "ctt_transp": Variable( "solute concentration concentration travel time distribution", CATCH_GRID + AGES, "-", "solute concentration travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "M_transp": Variable( "solute mass of transpiration", CATCH_GRID, "mg", "solute mass of transpiration", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_transp": Variable( "solute concentration of transpiration", CATCH_GRID, "mg/l", "solute concentration of transpiration", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_transp": Variable( "isotope ratio of transpiration", CATCH_GRID, "per mil", "isotope ratio of transpiration", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "tt10_transp": Variable( "10th percentile of transpiration travel time ", CATCH_GRID, "days", "10th percentile of transpiration travel time ", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "tt25_transp": Variable( "25th percentile of transpiration travel time ", CATCH_GRID, "days", "25th percentile of transpiration travel time ", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "tt50_transp": Variable( "50th percentile of transpiration travel time ", CATCH_GRID, "days", "50th percentile of transpiration travel time ", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "tt75_transp": Variable( "75th percentile of transpiration travel time ", CATCH_GRID, "days", "75th percentile of transpiration travel time ", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "tt90_transp": Variable( "90th percentile of transpiration travel time ", CATCH_GRID, "days", "90th percentile of transpiration travel time ", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "ttavg_transp": Variable( "average of transpiration travel time", CATCH_GRID, "days", "average of transpiration travel time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "sas_params_evap_soil": Variable( "SAS parameters of soil evaporation", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of soil evaporation", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "TT_evap_soil": Variable( "cumulative travel time distribution", CATCH_GRID + NAGES, "-", "cumulative travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "tt_evap_soil": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "MTT_evap_soil": Variable( "cumulative solute travel time distribution", CATCH_GRID + NAGES, "-", "cumulative solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_evap_soil": Variable( "solute mass travel time distribution", CATCH_GRID + AGES, "-", "solute mass travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "ctt_evap_soil": Variable( "solute concentration travel time distribution", CATCH_GRID + AGES, "-", "solute concentration travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "M_evap_soil": Variable( "solute mass of soil evaporation", CATCH_GRID, "mg", "solute mass of soil evaporation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_evap_soil": Variable( "solute concentration of soil evaporation", CATCH_GRID, "mg/l", "solute concentration of soil evaporation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_evap_soil": Variable( "isotope ratio of soil evaporation", CATCH_GRID, "per mil", "isotope ratio of soil evaporation", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), # percolation variables "q_fp_rz": Variable( "vertical root zone drainage of fine pores", CATCH_GRID, "mm/dt", "vertical root zone drainage of fine pores", time_dependent=True, ), "q_lp_rz": Variable( "vertical root zone drainage of large pores", CATCH_GRID, "mm/dt", "vertical root zone drainage of large pores", time_dependent=True, ), "Q_RZ": Variable( "vertical root zone drainage", CATCH_GRID + TIME, "mm/dt", "vertical root zone drainage", active=lambda settings: settings.enable_offline_transport, ), "q_rz": Variable( "vertical root zone drainage", CATCH_GRID, "mm/dt", "vertical root zone drainage", time_dependent=True, ), "q_fp_ss": Variable( "vertical subsoil drainage of fine pores", CATCH_GRID, "mm/dt", "vertical subsoil drainage of fine pores", time_dependent=True, ), "q_lp_ss": Variable( "vertical subsoil drainage of large pores", CATCH_GRID, "mm/dt", "vertical subsoil drainage of large pores", time_dependent=True, ), "Q_SS": Variable( "vertical subsoil drainage", CATCH_GRID + TIME, "mm/dt", "vertical subsoil drainage", active=lambda settings: settings.enable_offline_transport, ), "q_ss": Variable( "vertical subsoil drainage", CATCH_GRID, "mm/dt", "vertical subsoil drainage", time_dependent=True, ), "RE_RL": Variable( "redistribution after root loss", CATCH_GRID + TIME, "mm/dt", "redistribution after root loss", active=lambda settings: settings.enable_offline_transport & settings.enable_crop_phenology, ), "re_rl": Variable( "redistribution after root loss", CATCH_GRID, "mm/dt", "redistribution after root loss", time_dependent=True, active=lambda settings: settings.enable_crop_phenology, ), "re_rl_pwp": Variable( "redistribution of immobile soil water after root loss", CATCH_GRID, "mm/dt", "redistribution of immobile soil water after root loss", time_dependent=True, active=lambda settings: settings.enable_crop_phenology, ), "sas_params_re_rl": Variable( "SAS parameters of redistribution after root loss", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of redistribution after root loss", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_crop_phenology, ), "TT_re_rl": Variable( "cumulative travel time distribution", CATCH_GRID + NAGES, "-", "cumulative travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "tt_re_rl": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "MTT_re_rl": Variable( "cumulative solute travel time distribution", CATCH_GRID + NAGES, "-", "cumulative solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_re_rl": Variable( "solute mass travel time distribution", CATCH_GRID + AGES, "-", "solute mass travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "ctt_re_rl": Variable( "solute concentration travel time distribution", CATCH_GRID + AGES, "-", "solute concentration travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "M_re_rl": Variable( "solute mass of redistribution after root loss", CATCH_GRID, "mg", "solute mass of redistribution after root loss", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_re_rl": Variable( "solute concentration of redistribution after root loss", CATCH_GRID, "mg/l", "solute concentration of redistribution after root loss", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_re_rl": Variable( "isotope ratio of redistribution after root loss", CATCH_GRID, "per mil", "isotope ratio of redistribution after root loss", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "sas_params_q_rz": Variable( "SAS parameters of percolation from root zone", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of percolation from root zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "TT_q_rz": Variable( "cumulative travel time distribution of root zone peroclation", CATCH_GRID + NAGES, "-", "cumulative travel time distribution of root zone peroclation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "tt_q_rz": Variable( "travel time distribution of root zone peroclation", CATCH_GRID + AGES, "-", "travel time distribution of root zone peroclation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_q_rz": Variable( "solute mass travel time distribution of root zone percolation", CATCH_GRID + AGES, "-", "solute mass travel time distribution of root zone percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "ctt_q_rz": Variable( "solute concentration travel time distribution of root zone percolation", CATCH_GRID + AGES, "-", "solute concentration travel time distribution of root zone percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "M_q_rz": Variable( "solute mass of root zone percolation", CATCH_GRID, "mg", "solute mass of root zone percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_q_rz": Variable( "solute concentration of root zone percolation", CATCH_GRID, "mg/l", "solute concentration of root zone percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_q_rz": Variable( "isotope ratio of root zone percolation", CATCH_GRID, "per mil", "isotope ratio of root zone percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "sas_params_q_ss": Variable( "SAS parameters of percolation from subsoil", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of percolation from subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "TT_q_ss": Variable( "cumulative travel time distribution of subsoil percolation", CATCH_GRID + NAGES, "-", "cumulative travel time distribution of subsoil percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "tt_q_ss": Variable( "travel time distribution of subsoil percolation", CATCH_GRID + AGES, "-", "travel time distribution of subsoil percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "MTT_q_ss": Variable( "cumulative solute travel time distribution of subsoil percolation", CATCH_GRID + NAGES, "-", "cumulative solute travel time distribution of subsoil percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_q_ss": Variable( "solute mass travel time distribution of subsoil percolation", CATCH_GRID + AGES, "-", "solute mass travel time distribution of subsoil percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "ctt_q_ss": Variable( "solute concentration travel time distribution of subsoil percolation", CATCH_GRID + AGES, "-", "solute concentration travel time distribution of subsoil percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "M_q_ss": Variable( "solute mass of subsoil percolation", CATCH_GRID, "mg", "solute mass of subsoil percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_q_ss": Variable( "solute concentration of subsoil percolation", CATCH_GRID, "mg/l", "solute concentration of subsoil percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_q_ss": Variable( "isotope ratio of subsoil percolation", CATCH_GRID, "per mil", "isotope ratio of subsoil percolation", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "tt10_q_ss": Variable( "10th percentile of subsoil percolation travel time", CATCH_GRID, "days", "10th percentile of subsoil percolation travel time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "tt25_q_ss": Variable( "25th percentile of subsoil percolation travel time", CATCH_GRID, "days", "25th percentile of subsoil percolation travel time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "tt50_q_ss": Variable( "50th percentile of subsoil percolation travel time", CATCH_GRID, "days", "50th percentile of subsoil percolation travel time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "tt75_q_ss": Variable( "75th percentile of subsoil percolation travel time", CATCH_GRID, "days", "75th percentile of subsoil percolation travel time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "tt90_q_ss": Variable( "90th percentile of subsoil percolation travel time", CATCH_GRID, "days", "90th percentile of subsoil percolation travel time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), "ttavg_q_ss": Variable( "average of subsoil percolation travel time", CATCH_GRID, "days", "average of subsoil percolation travel time", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_age_statistics, ), # capillary rise variables "CPR_RZ": Variable( "capillary rise from subsoil into root zone", CATCH_GRID + TIME, "mm/dt", "capillary rise from subsoil into root zone", active=lambda settings: settings.enable_offline_transport, ), "cpr_rz": Variable( "capillary rise from subsoil into root zone", CATCH_GRID, "mm/dt", "capillary rise from subsoil into root zone", time_dependent=True, ), "cpr_ss": Variable( "capillary rise from groundwater", CATCH_GRID, "mm/dt", "capillary rise from groundwater", time_dependent=True, ), "RE_RG": Variable( "redistribution after root growth", CATCH_GRID + TIME, "mm/dt", "redistribution after root growth", active=lambda settings: settings.enable_offline_transport & settings.enable_crop_phenology, ), "re_rg": Variable( "redistribution after root growth", CATCH_GRID, "mm/dt", "redistribution after root growth", time_dependent=True, active=lambda settings: settings.enable_crop_phenology, ), "re_rg_pwp": Variable( "redistribution of immobile soil water after root growth", CATCH_GRID, "mm/dt", "redistribution of immobile soil water after root growth", time_dependent=True, active=lambda settings: settings.enable_crop_phenology, ), "sas_params_re_rg": Variable( "SAS parameters of redistribution after root growth", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of redistribution after root growth", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_crop_phenology, ), "TT_re_rg": Variable( "cumulative travel time distribution", CATCH_GRID + NAGES, "-", "cumulative travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "tt_re_rg": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "MTT_re_rg": Variable( "cumulative solute travel time distribution", CATCH_GRID + NAGES, "-", "cumulative solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_re_rg": Variable( "solute mass travel time distribution", CATCH_GRID + AGES, "-", "solute mass travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "ctt_re_rg": Variable( "solute concentration travel time distribution", CATCH_GRID + AGES, "-", "solute concentration travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "M_re_rg": Variable( "solute mass of redistribution after root growth", CATCH_GRID, "mg", "solute mass of redistribution after root growth", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_re_rg": Variable( "solute concentration of redistribution after root growth", CATCH_GRID, "mg/l", "solute concentration of redistribution after root growth", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_re_rg": Variable( "isotope ratio of redistribution after root growth", CATCH_GRID, "per mil", "isotope ratio of redistribution after root growth", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "sas_params_cpr_rz": Variable( "SAS parameters of capillary rise into root zone", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of capillary rise into root zone", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "TT_cpr_rz": Variable( "cumulative travel time distribution", CATCH_GRID + NAGES, "-", "cumulative travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "tt_cpr_rz": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "MTT_cpr_rz": Variable( "cumulative solute travel time distribution", CATCH_GRID + NAGES, "-", "cumulative solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_cpr_rz": Variable( "solute mass travel time distribution", CATCH_GRID + AGES, "-", "solute mass travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "ctt_cpr_rz": Variable( "solute concentration travel time distribution", CATCH_GRID + AGES, "-", "solute concentration travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "M_cpr_rz": Variable( "solute mass of capillary rise from subsoil into root zone", CATCH_GRID, "mg", "solute mass of capillary rise from subsoil into root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_cpr_rz": Variable( "solute concentration of capillary rise from subsoil into root zone", CATCH_GRID, "mg/l", "solute concentration of capillary rise from subsoil into root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_cpr_rz": Variable( "isotope ratio of capillary rise from subsoil into root zone", CATCH_GRID, "per mil", "isotope ratio of capillary rise from subsoil into root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "sas_params_cpr_ss": Variable( "SAS parameters of capillary rise into subsoil", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of capillary rise into subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport, ), "TT_cpr_ss": Variable( "cumulative travel time distribution", CATCH_GRID + NAGES, "-", "cumulative travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "tt_cpr_ss": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "MTT_cpr_ss": Variable( "cumulative solute travel time distribution", CATCH_GRID + NAGES, "-", "cumulative solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "mtt_cpr_ss": Variable( "solute mass travel time distribution", CATCH_GRID + AGES, "-", "solute mass travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "ctt_cpr_ss": Variable( "solute concentration travel time distribution", CATCH_GRID + AGES, "-", "solute concentration travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "M_cpr_ss": Variable( "solute mass of capillary rise from groundwater into subsoil", CATCH_GRID, "mg", "solute mass of capillary rise from groundwater into subsoil", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_cpr_ss": Variable( "solute concentration of capillary rise from groundwater into subsoil", CATCH_GRID, "mg/l", "solute concentration of capillary rise from groundwater into subsoil", time_dependent=True, active=lambda settings: settings.enable_offline_transport, ), "C_iso_cpr_ss": Variable( "isotope ratio of capillary rise from groundwater into subsoil", CATCH_GRID, "per mil", "isotope ratio of capillary rise from groundwater into subsoil", time_dependent=True, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), # surface runoff variables "q_sur": Variable( "surface runoff", CATCH_GRID, "mm/dt", "surface runoff", time_dependent=True, ), "q_hof": Variable( "hortonian overland flow", CATCH_GRID, "mm/dt", "hortonian overland flow", time_dependent=True, ), "q_sof": Variable( "saturation overland flow", CATCH_GRID, "mm/dt", "saturation overland flow", time_dependent=True, ), # subsurface runoff variables "q_sub": Variable( "lateral subsurface runoff", CATCH_GRID, "mm/dt", "lateral subsurface runoff", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_pot": Variable( "lateral potential subsurface runoff", CATCH_GRID, "mm/dt", "lateral potential subsurface runoff", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_rz": Variable( "lateral subsurface runoff in root zone", CATCH_GRID, "mm/dt", "lateral subsurface runoff in root zone", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_ss": Variable( "lateral subsurface runoff in subsoil", CATCH_GRID, "mm/dt", "lateral subsurface runoff in subsoil", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_pot_ss": Variable( "lateral potential subsurface runoff in subsoil", CATCH_GRID, "mm/dt", "lateral potential subsurface runoff in subsoil", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mat": Variable( "lateral matrix subsurface runoff", CATCH_GRID, "mm/dt", "lateral matrix subsurface runoff", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mat_pot": Variable( "lateral potential matrix subsurface runoff", CATCH_GRID, "mm/dt", "lateral potential matrix subsurface runoff", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mat_rz": Variable( "lateral matrix subsurface runoff in root zone", CATCH_GRID, "mm/dt", "lateral matrix subsurface runoff in root zone", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mat_ss": Variable( "lateral matrix subsurface runoff in subsoil", CATCH_GRID, "mm/dt", "matrix subsurface runoff in subsoil", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mat_pot_ss": Variable( "lateral potential matrix subsurface runoff in subsoil", CATCH_GRID, "mm/dt", "lateral potential matrix subsurface runoff in subsoil", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mp": Variable( "lateral macropore subsurface runoff", CATCH_GRID, "mm/dt", "lateral macropore subsurface runoff", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mp_pot": Variable( "lateral potential macropore subsurface runoff", CATCH_GRID, "mm/dt", "lateral potential macropore subsurface runoff", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mp_rz": Variable( "lateral macropore subsurface runoff in root zone", CATCH_GRID, "mm/dt", "lateral macropore subsurface runoff in root zone", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mp_pot_rz": Variable( "lateral potential macropore subsurface runoff in root zone", CATCH_GRID, "mm/dt", "lateral potential macropore subsurface runoff in root zone", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mp_ss": Variable( "lateral macropore subsurface runoff in subsoil", CATCH_GRID, "mm/dt", "lateral macropore subsurface runoff in subsoil", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mp_pot_ss": Variable( "lateral potential macropore subsurface runoff in subsoil", CATCH_GRID, "mm/dt", "lateral potential macropore subsurface runoff in subsoil", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_pot_rz": Variable( "potential precolation in root zone", CATCH_GRID, "mm/dt", "potential precolation in root zone", time_dependent=True, ), "q_pot_ss": Variable( "potential precolation in subsoil", CATCH_GRID, "mm/dt", "potential precolation in subsoil", time_dependent=True, ), "q_sub_mp_share": Variable( "share of lateral macropore subsurface runoff", CATCH_GRID, "mm/dt", "share of lateral macropore subsurface runoff", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "q_sub_mat_share": Variable( "share of lateral matrix subsurface runoff", CATCH_GRID, "mm/dt", "share of lateral matrix subsurface runoff", time_dependent=True, active=lambda settings: settings.enable_lateral_flow, ), "sas_params_q_sub_rz": Variable( "SAS parameters of lateral subsurface runoff in root zone", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of lateral subsurface runoff in root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "TT_q_sub_rz": Variable( "cumulative travel time distribution", CATCH_GRID + NAGES, "-", "cumulative travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "tt_q_sub_rz": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "MTT_q_sub_rz": Variable( "cumulative solute travel time distribution", CATCH_GRID + NAGES, "-", "cumulative solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "mtt_q_sub_rz": Variable( "solute travel time distribution", CATCH_GRID + AGES, "-", "solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "M_q_sub_rz": Variable( "solute mass of lateral subsurface runoff in root zone", CATCH_GRID, "mg", "solute mass of lateral subsurface runoff in root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "C_q_sub_rz": Variable( "solute concentration of lateral subsurface runoff in root zone", CATCH_GRID, "mg/l", "solute concentration of lateral subsurface runoff in root zone", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "sas_params_q_sub_ss": Variable( "SAS parameters of lateral subsurface runoff in subsoil", CATCH_GRID + N_SAS_PARAMS, "-", "SAS parameters of lateral subsurface runoff in subsoil", time_dependent=True, write_to_restart=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "TT_q_sub_ss": Variable( "cumulative travel time distribution", CATCH_GRID + NAGES, "-", "cumulative travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "tt_q_sub_ss": Variable( "travel time distribution", CATCH_GRID + AGES, "-", "travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "MTT_q_sub_ss": Variable( "cumulative solute travel time distribution", CATCH_GRID + NAGES, "-", "cumulative solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "mtt_q_sub_ss": Variable( "solute travel time distribution", CATCH_GRID + AGES, "-", "solute travel time distribution", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "M_q_sub_ss": Variable( "solute mass of lateral subsurface runoff in subsoil", CATCH_GRID, "mg", "solute mass of lateral subsurface runoff in subsoil", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), "C_q_sub_ss": Variable( "solute concentration of lateral subsurface runoff in subsoil", CATCH_GRID, "mg/l", "solute concentration of lateral subsurface runoff in subsoil", time_dependent=True, active=lambda settings: settings.enable_offline_transport & settings.enable_lateral_flow, ), # crop parameters # crop variables # transport parameters "alpha_transp": Variable( "partition coefficient of transpiration", CATCH_GRID, "-", "partition coefficient of transpiration", time_dependent=False, write_to_restart=True, initial=1, active=lambda settings: settings.enable_offline_transport, ), "alpha_q": Variable( "partition coefficient of drainage", CATCH_GRID, "-", "partition coefficient of drainage", time_dependent=False, write_to_restart=True, initial=1, active=lambda settings: settings.enable_offline_transport, ), # event variables "prec_event_csum": Variable( "cumulated rainfall/snow melt while event", CATCH_GRID, "mm", "cumulated rainfall/snow melt while event", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), "t_event_csum": Variable( "cumulated time while event", CATCH_GRID, "hours", "cumulated time while event", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport, ), # forcing "C_IN": Variable( "solute concentration of input", CATCH_GRID + TIME, "mg/l or per mil", "solute concentration of input", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_offline_transport & ( settings.enable_chloride | settings.enable_bromide | settings.enable_oxygen18 | settings.enable_deuterium | settings.enable_nitrate ), ), "C_ISO_IN": Variable( "isotope ratio of input", CATCH_GRID + TIME, "per mil", "isotope ratio of input", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "C_in": Variable( "solute concentration of input", CATCH_GRID, "mg/l or per mil", "solute concentration of input", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & ( settings.enable_chloride | settings.enable_bromide | settings.enable_oxygen18 | settings.enable_deuterium | settings.enable_nitrate | settings.enable_virtualtracer ), ), "C_iso_in": Variable( "isotope ratio of input", CATCH_GRID, "per mil", "isotope ratio of input", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "C_snow": Variable( "isotope concentration of snow cover", CATCH_GRID + TIMESTEPS, "mg/l", "isotope concentration of snow cover", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "C_iso_snow": Variable( "isotope ratio of snow cover", CATCH_GRID + TIMESTEPS, "per mil", "isotope ratio of snow cover", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & (settings.enable_oxygen18 | settings.enable_deuterium), ), "M_snow": Variable( "solute mass of snow cover", CATCH_GRID + TIMESTEPS, "mg", "solute mass of snow cover", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & ( settings.enable_chloride | settings.enable_bromide | settings.enable_oxygen18 | settings.enable_deuterium | settings.enable_nitrate ), ), "M_IN": Variable( "solute mass of input", CATCH_GRID + TIME, "mg", "solute mass of input", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_offline_transport & ( settings.enable_chloride | settings.enable_bromide | settings.enable_oxygen18 | settings.enable_deuterium | settings.enable_nitrate ), ), "M_in": Variable( "solute mass of input", CATCH_GRID, "mg", "solute mass of input", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & ( settings.enable_chloride | settings.enable_bromide | settings.enable_oxygen18 | settings.enable_deuterium | settings.enable_nitrate | settings.enable_virtualtracer ), ), "NMIN_IN": Variable( "mineral nitrogen fertilizer", CATCH_GRID + TIME, "mg", "mineral nitrogen fertilizer", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_offline_transport & settings.enable_nitrate, ), "Nmin_in": Variable( "undissolved mineral nitrogen fertilizer", CATCH_GRID, "mg", "undissolved mineral nitrogen fertilizer", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & settings.enable_nitrate, ), "Nfert_min": Variable( "mineral nitrogen fertilizer", CATCH_GRID, "mg", "mineral nitrogen fertilizer", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & settings.enable_nitrate, ), "NORG_IN": Variable( "organic nitrogen fertilizer", CATCH_GRID + TIME, "mg", "organic nitrogen fertilizer", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_offline_transport & settings.enable_nitrate, ), "Norg_in": Variable( "organic nitrogen fertilizer", CATCH_GRID, "mg", "organic nitrogen fertilizer", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & settings.enable_nitrate, ), "Nfert_org": Variable( "organic nitrogen fertilizer", CATCH_GRID, "mg", "organic nitrogen fertilizer", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & settings.enable_nitrate, ), "Nfert": Variable( "nitrogen fertilizer", CATCH_GRID, "mg", "nitrogen fertilizer", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport & settings.enable_nitrate, ), # transport variables # film flow parameters # film flow variables # routing parameters "z_stream_tot": Variable( "total depth of river", RIVER_GRID, "m", "total depth of river", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "flow_dir_topo": Variable( "topographic flow direction", CATCH_GRID, "-", "topographic flow direction", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "k_st": Variable( "Strickler coefficient", CATCH_GRID, "m^1/3 s^-1", "Strickler coefficient", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "q_sur_in": Variable( "lateral surface inflow", CATCH_GRID, "-", "lateral surface inflow", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "q_sur_out": Variable( "lateral surface outflow", CATCH_GRID, "-", "lateral surface outflow", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "q_sur_in_d8": Variable( "lateral surface inflow", CATCH_GRID + FLOWDIRS, "-", "lateral surface inflow", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "q_sur_out_d8": Variable( "lateral surface outflow", CATCH_GRID + FLOWDIRS, "-", "lateral surface outflow", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "q_sub_in": Variable( "lateral subsurface inflow", CATCH_GRID, "-", "lateral subsurface inflow", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "q_sub_in_rz": Variable( "lateral subsurface inflow", CATCH_GRID, "-", "lateral subsurface inflow", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "q_sub_in_ss": Variable( "lateral subsurface inflow", CATCH_GRID, "-", "lateral subsurface inflow", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "q_sub_in_d8": Variable( "lateral subsurface inflow", CATCH_GRID + FLOWDIRS, "-", "lateral subsurface inflow", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "q_sub_out": Variable( "lateral subsurface outflow", CATCH_GRID, "-", "lateral subsurface outflow", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), "q_sub_out_d8": Variable( "lateral subsurface outflow", CATCH_GRID + FLOWDIRS, "-", "lateral subsurface outflow", write_to_restart=True, time_dependent=False, active=lambda settings: settings.enable_routing_1D, ), # routing variables "z_stream": Variable( "depth of river", RIVER_GRID + TIMESTEPS, "m", "depth of riverr", write_to_restart=True, time_dependent=True, active=lambda settings: settings.enable_routing_1D, ), # run-on infiltration parameters # run-on infiltration variables # urban parameters # urban variables # crop variables "ta_min": Variable( "minimum air temperature", CATCH_GRID + TIMESTEPS, "degC", "minimum air temperature", time_dependent=True, active=lambda settings: settings.enable_crop_phenology, ), "ta_max": Variable( "maximum air temperature", CATCH_GRID + TIMESTEPS, "degC", "maximum air temperature", time_dependent=True, active=lambda settings: settings.enable_crop_phenology, ), "crop_type": Variable( "crop type", CATCH_GRID + CROPS, "", "crop type", write_to_restart=True, time_dependent=True, dtype="int32", active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "crop_height": Variable( "height of crops", CATCH_GRID + CROPS, "mm", "height of crops", time_dependent=True, active=lambda settings: settings.enable_crop_phenology, ), "crop_height_max": Variable( "maximum height of crops", CATCH_GRID + CROPS, "mm", "maximum height of crops", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "lai_crop": Variable( "leaf area index of crops", CATCH_GRID + CROPS, "-", "leaf area index of crops", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "c_int": Variable( "scale parameter of interception storage", CATCH_GRID, "-", "scale parameter of interception storage", time_dependent=False, write_to_restart=True, initial=1.0, active=lambda settings: not settings.enable_offline_transport, ), "S_int_tot_crop": Variable( "total interception storage of crop canopy", CATCH_GRID + CROPS, "mm", "total interception storage of crop canopy", time_dependent=True, write_to_restart=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "doy_start": Variable( "day of year of sowing", CATCH_GRID + CROPS, "", "day of year of sowing", write_to_restart=True, dtype="int32", active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "doy_mid": Variable( "day of year of full canopy", CATCH_GRID + CROPS, "", "day of year of full canopy", write_to_restart=True, dtype="int32", active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "doy_dec": Variable( "day of year of crop canopy decay", CATCH_GRID + CROPS, "", "day of year of crop canopy decay", write_to_restart=True, dtype="int32", active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "doy_end": Variable( "day of year of harvesting", CATCH_GRID + CROPS, "", "day of year of harvesting", write_to_restart=True, dtype="int32", active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "ta_base": Variable( "lower threshold of crop growth", CATCH_GRID + CROPS, "degC", "lower threshold of crop growth", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "ta_ceil": Variable( "upper threshold of crop growth", CATCH_GRID + CROPS, "degC", "upper threshold of crop growth", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "gdd": Variable( "cumulated growing degree days", CATCH_GRID + CROPS, "GDD", "growing degree days", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "gdd_sum": Variable( "cumulated growing degree days", CATCH_GRID + TIMESTEPS + CROPS, "GDD", "cumulated growing degree days", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "t_grow_cc": Variable( "time since crop canopy growth", CATCH_GRID + TIMESTEPS + CROPS, "GDD", "time since crop canopy growth", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "t_grow_root": Variable( "time since crop root growth", CATCH_GRID + TIMESTEPS + CROPS, "GDD", "time since crop root growth", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "t_half_mid": Variable( "time since half full canopy", CATCH_GRID + CROPS, "GDD", "time since half full canopy", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "t_decay": Variable( "time since crop canopy decay", CATCH_GRID + CROPS, "GDD", "time since crop canopy decay", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "ccc_growth_rate": Variable( "growth rate of crop canopy cover", CATCH_GRID + CROPS, "-", "growth rate of crop canopy cover", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "ccc": Variable( "crop canopy cover", CATCH_GRID + TIMESTEPS + CROPS, "-", "crop canopy cover", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "ccc_min": Variable( "minimum crop canopy cover", CATCH_GRID + CROPS, "-", "minimum crop canopy cover", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "ccc_mid": Variable( "crop canopy cover at maturity", CATCH_GRID + CROPS, "-", "crop canopy cover at maturity", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "ccc_max": Variable( "maximum crop canopy cover", CATCH_GRID + CROPS, "-", "maximum crop canopy cover", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "crop_dev_coeff": Variable( "crop development coefficient", CATCH_GRID + CROPS, "-", "crop development coefficient", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "basal_evap_coeff_crop": Variable( "basal crop evaporation coefficient", CATCH_GRID + CROPS, "-", "basal crop evaporation coefficient", write_to_restart=True, time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "k_stress_transp_crop": Variable( "water stress coefficient of crop transpiration", CATCH_GRID + CROPS, "-", "water stress coefficient of crop transpiration", write_to_restart=True, initial=1, time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "basal_crop_coeff": Variable( "basal crop coefficient", CATCH_GRID + CROPS, "-", "basal crop coefficient", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "crop_scale": Variable( "scaling factor of crop parameters", CATCH_GRID, "-", "scaling factor of crop parameters", write_to_restart=True, initial=1, time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "root_growth_scale": Variable( "scaling factor of crop root growth parameters", CATCH_GRID, "-", "scaling factor of crop root growth parameters", write_to_restart=True, initial=1, time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "canopy_growth_scale": Variable( "scaling factor of crop canopy growth parameters", CATCH_GRID, "-", "scaling factor of crop canopy growth parameters", write_to_restart=True, initial=1, time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "basal_crop_coeff_scale": Variable( "scaling factor of basal crop coefficient", CATCH_GRID, "-", "scaling factor of basal crop coefficient", write_to_restart=True, initial=1, time_dependent=False, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "lut_crop_scale": Variable( "scaling factor of crop parameters", CATCH_GRID + N_CROP_TYPES, "-", "scaling factor of crop parameters", write_to_restart=True, initial=1, time_dependent=False, active=lambda settings: settings.enable_crop_phenology, ), "basal_crop_coeff_mid": Variable( "basal crop coefficient of mature crop", CATCH_GRID + CROPS, "-", "basal crop coefficient of mature crop", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "theta_water_stress_crop": Variable( "soil water content of crop water stress", CATCH_GRID + CROPS, "-", "soil water content of crop water stress", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "water_stress_coeff_crop": Variable( "coeffcient of crop water stress", CATCH_GRID + CROPS, "-", "coeffcient of crop water stress", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "root_growth_rate": Variable( "growth rate of crop roots", CATCH_GRID + CROPS, "-", "growth rate of crop roots", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "z_root_crop": Variable( "root depth of crop", CATCH_GRID + TIMESTEPS + CROPS, "mm", "root depth of crop", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "z_root_crop_max": Variable( "maximum root depth of crop", CATCH_GRID + CROPS, "mm", "maximum root depth of crop", write_to_restart=True, time_dependent=True, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), "k_stress_root_growth": Variable( "water stress coeffcient of root growth", CATCH_GRID + CROPS, "-", "water stress coeffcient of root growth", write_to_restart=True, time_dependent=True, initial=1, active=lambda settings: not settings.enable_offline_transport and settings.enable_crop_phenology, ), # look-up-tables "lut_ilu": Variable( "Look-up-table of land use dependent interception storage", LUT_ILU_GRID, "mm", "Look-up-table of land use dependent interception storage", write_to_restart=False, time_dependent=False, ), "lut_gc": Variable( "Look-up-table of land use dependent ground cover", LUT_ILU_GRID, "-", "Look-up-table of land use dependent ground cover", write_to_restart=False, time_dependent=False, ), "lut_gcm": Variable( "Look-up-table of land use dependent maximal ground cover", LUT_GCM_GRID, "-", "Look-up-table of land use dependent maximalground cover", write_to_restart=False, time_dependent=False, ), "lut_is": Variable( "Look-up-table of sealing dependent interception storage", LUT_IS_GRID, "mm", "Look-up-table of sealing dependent interception storage", write_to_restart=False, time_dependent=False, ), "lut_mlms": Variable( "Look-up-table of lateral macropore flow velocity", LUT_MLMS_GRID, "mm/h", "Look-up-table of lateral macropore flow velocity", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_lateral_flow, ), "lut_rdlu": Variable( "Look-up-table of land use dependent root depth", LUT_RDLU_GRID, "mm", "Look-up-table of land use dependent root depth", write_to_restart=False, time_dependent=False, ), "lut_crops": Variable( "Look-up-table of crop specific parameters", LUT_CROPS_GRID, "", "Look-up-table of crop specific parameters", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_crop_phenology, ), "lut_fert1": Variable( "Look-up-table of nitrogen fertilization", LUT_FERT_GRID, "", "Look-up-table of nitrogen fertilization", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_crop_phenology & settings.enable_nitrate, ), "lut_fert2": Variable( "Look-up-table of nitrogen fertilization", LUT_FERT_GRID, "", "Look-up-table of nitrogen fertilization", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_crop_phenology & settings.enable_nitrate, ), "lut_fert3": Variable( "Look-up-table of nitrogen fertilization", LUT_FERT_GRID, "", "Look-up-table of nitrogen fertilization", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_crop_phenology & settings.enable_nitrate, ), "lut_nup": Variable( "Look-up-table of nitrogen uptake by crops", LUT_NUP_GRID, "", "Look-up-table of nitrogen uptake by crops", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_crop_phenology & settings.enable_nitrate, ), "dS_num_error": Variable( "numerical error of water balance", CATCH_GRID, "mm", "numerical error of water balance", write_to_restart=False, time_dependent=False, ), "dS_rz_num_error": Variable( "numerical error of root zone water balance", CATCH_GRID, "mm", "numerical error of root zone water balance", write_to_restart=False, time_dependent=False, ), "dS_ss_num_error": Variable( "numerical error of subsoil water balance", CATCH_GRID, "mm", "numerical error of subsoil water balance", write_to_restart=False, time_dependent=False, ), "dC_num_error": Variable( "numerical error of solute balance", CATCH_GRID, "M", "numerical error of solute balance", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport, ), "dC_rz_num_error": Variable( "numerical error of solute balance", CATCH_GRID, "M", "numerical error of solute balance", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport, ), "dC_ss_num_error": Variable( "numerical error of solute balance", CATCH_GRID, "M", "numerical error of solute balance", write_to_restart=False, time_dependent=False, active=lambda settings: settings.enable_offline_transport, ), } def manifest_metadata(var_meta, settings): """Evaluate callable metadata fields given the current settings.""" from copy import copy out = {} for var_name, var_val in var_meta.items(): var_val = copy(var_val) for attr, attr_val in vars(var_val).items(): if callable(attr_val) and attr != "get_mask": setattr(var_val, attr, attr_val(settings)) out[var_name] = var_val return out def allocate(dimensions, grid, dtype=None, include_ghosts=True, local=True, fill=0): from roger.core.operators import numpy as npx if dtype is None: dtype = runtime_settings.float_type shape = get_shape(dimensions, grid, include_ghosts=include_ghosts, local=local) out = npx.full(shape, fill, dtype=dtype) if runtime_settings.backend == "numpy": out.flags.writeable = False return out