Salts and constituents
Overview¶
SWAT+ tracks two optional families of conservative-but-reactive constituents:
- Salt ions (
rtb salt): SO4, Ca, Mg, Na, K, Cl, CO3, HCO3 (eight ions) - Trace constituents (
rtb cs): SeO4, SeO3, boron
Both families share the same flow paths as nitrate: surface runoff, lateral flow, tile drainage, percolation, plant uptake, rainfall and dry deposition, irrigation, and fertiliser/amendment inputs. Salt ions are subject to equilibrium chemistry (precipitation-dissolution of CaCO3, MgCO3, CaSO4, MgSO4, NaCl and cation exchange between Na, Ca, Mg, K). Selenium and boron use simple linear sorption and a first-order reaction term. Salinity stress can reduce crop water uptake.
These modules are active only when their respective databases are present, controlled by cs_db%num_salts and cs_db%num_cs (set during cs_read_* setup).
Process equations¶
Soil-water transport¶
For both salts and trace constituents the layer-level transport routine mirrors nut_nlch.f90. For each salt ion (or cs species) m:
vv = perc + flat + (surfq if layer 1) + (qtile if tile layer)
co = mass * (1 - exp(-vv / ul)) / vv
surq_mass = co * surfq # layer 1 only
latq_mass = co * flat
tile_mass = co * qtile # at tile layer
perc_mass = co * prk # next layer or out of profile
Lateral, tile, and percolation are first-order in mobile water with porosity ul. No partition coefficient is applied to salt ions; sorbed selenium and boron use cs_sorb_hru.f90. Source: salt_lch.f90, cs_lch.f90.
Salt chemistry in soil¶
salt_chem_hru.f90 and salt_chem_soil_single.f90 solve equilibrium speciation per layer using:
- Activity coefficients via ionic strength (Davies / extended Debye-Huckel form)
- Precipitation-dissolution of five minerals: CaCO3 (Ksp = 3.07e-9), MgCO3 (4.79e-6), CaSO4 (7.89e-5), MgSO4 (7.24e-3), NaCl (37.3)
- Complexation reactions (CaCO3, MgCO3, CaSO4, MgSO4, NaCl)
- Cation exchange between Na, Ca, Mg, K through
cationexchange
These run iteratively until ion concentrations converge. The same scheme is applied to the aquifer in salt_chem_aqu.f90 using a separate set of Ksp values (currently the same defaults).
Salinity stress on plants¶
When salt_tol_sim = 1 and at least one salt ion is simulated, pl_waterup.f90 computes a salinity reduction factor per layer using the FAO yield-vs-ECe relationship:
soil_TDS_sat = sum(soil_salt_conc) at saturation
soil_ECe = soil_TDS_sat / salt_tds_ec
if (soil_ECe > a):
reduc_salt = (100 - b * (soil_ECe - a)) / 100
a is the salt tolerance threshold (dS/m), b is the slope (yield loss per dS/m above the threshold). Both are per-plant parameters read from salt_plants.slt. If salt_soil_type = 1 (CaSO4 / gypsiferous), the threshold is increased by 2 dS/m. The minimum reduc_salt across rooted layers becomes the plant salt stress factor strss.
salt_effect = 1 applies salinity stress after the other stresses are minimised; salt_effect = 2 (default) includes it in the joint minimum.
Salt uptake by plants¶
When salt_uptake_on = 1, daily salt removal by plants is read from a user file (salt_uptake.slt) and applied through salt_uptake.f90. Otherwise no plant uptake of salt occurs.
Trace constituent reactions and sorption¶
cs_rctn_hru.f90 applies first-order reactions to SeO4, SeO3, and boron. Coefficients come from cs_reactions.cs. cs_sorb_hru.f90 runs an equilibrium linear sorption between dissolved and solid-phase pools per layer, parameterised by partition coefficients in cs_data_module.f90. Constituent uptake follows the nitrate-style uptake routine cs_uptake.f90.
Salt and constituent inputs¶
- Atmospheric: wet deposition (
salt_rain.f90,cs_rain.f90) and dry deposition (read fromatmodep_salt,atmodep_cs), monthly or annual - Fertiliser: salt-bearing fertilisers from
salt_fert.f90,cs_fert.f90(read intofert_salt,fert_cs) - Road salt:
salt_roadsalt.f90, applied seasonally per HRU - Irrigation: salt and cs concentrations in irrigation water (
salt_irrig.f90,cs_irrig.f90) - Initial soil conditions:
salt_hru_init.f90,cs_hru_init.f90
In-channel and aquifer¶
Channels route salt ions through ch_salt_module.f90 and ch_salt_output.f90; constituents through ch_cs_module.f90 and ch_cs_output.f90. Aquifer fluxes are handled in salt_aquifer.f90, salt_chem_aqu.f90, cs_aquifer.f90, cs_rctn_aqu.f90, cs_sorb_aqu.f90. Reservoirs and wetlands have parallel implementations (res_salt.f90, wet_salt.f90).
Switches and parameters¶
Salts¶
| File | Field | Default | Effect |
|---|---|---|---|
salt_module.f90 |
salt_uptake_on |
0 | 1 = enable user-defined daily salt uptake |
salt_data_module.f90 |
salt_tol_sim |
0 | 1 = salinity stress on plant water uptake |
salt_data_module.f90 |
salt_soil_type |
0 | 1 = CaSO4 (gypsiferous), 2 = NaCl |
salt_data_module.f90 |
salt_effect |
0 | 1 = applied after other stresses, 2 = joint minimum |
salt_data_module.f90 |
salt_tds_ec |
input | TDS-to-EC conversion factor |
salt_data_module.f90 |
Ksp11..Ksp51 |
see source | Soil mineral solubility products |
salt_data_module.f90 |
Ksp12..Ksp52 |
same defaults | Aquifer mineral solubility products |
salt_plants.slt |
a, b per plant |
input | Salt tolerance threshold and slope |
salt_recall.slt and other recall files |
input | Constituent loads on point sources |
Constituents (cs)¶
| File | Field | Effect |
|---|---|---|
cs_data_module.f90 |
partition coefficients | Linear sorption per constituent |
cs_reactions.cs |
first-order rate coefficients | Constituent reaction rates |
cs_uptake.cs |
uptake fractions per plant | Plant uptake of cs |
cs_fert.cs |
constituent loads in fertiliser | Inputs from fertiliser |
cs_irrig.cs |
constituent concentration in irrigation | Inputs from irrigation |
Implementation¶
Salts¶
Soil and HRU: salt_balance.f90, salt_lch.f90, salt_chem_hru.f90, salt_chem_soil_single.f90, salt_uptake.f90, salt_rain.f90, salt_fert.f90, salt_fert_wet.f90, salt_irrig.f90, salt_roadsalt.f90, salt_hru_init.f90.
Inputs: salt_aqu_read.f90, salt_cha_read.f90, salt_fert_read.f90, salt_hru_read.f90, salt_irr_read.f90, salt_plant_read.f90, salt_roadsalt_read.f90, salt_uptake_read.f90, salt_urban_read.f90.
Modules: salt_module.f90, salt_data_module.f90.
Channel and water bodies: ch_salt_module.f90, ch_salt_output.f90, res_salt.f90, res_salt_module.f90, res_salt_output.f90, res_read_salt_cs.f90, res_read_saltdb.f90, wet_salt.f90, wet_salt_output.f90, wet_read_salt_cs.f90.
Aquifer: salt_aquifer.f90, salt_chem_aqu.f90, aqu_salt_output.f90.
Climate, recall, export coefficients, delivery ratios: cli_read_atmodep_salt.f90, recall_read_salt.f90, recall_salt.f90, dr_read_salt.f90, exco_read_salt.f90, header_salt.f90.
Output: hru_salt_output.f90, ru_salt_output.f90, output_ls_salt_module.f90.
Trace constituents (cs)¶
Soil and HRU: cs_balance.f90, cs_lch.f90, cs_rctn_hru.f90, cs_sorb_hru.f90, cs_uptake.f90, cs_rain.f90, cs_fert.f90, cs_fert_wet.f90, cs_irrig.f90, cs_hru_init.f90.
Inputs: cs_aqu_read.f90, cs_cha_read.f90, cs_fert_read.f90, cs_hru_read.f90, cs_irr_read.f90, cs_plant_read.f90, cs_reactions_read.f90, cs_uptake_read.f90, cs_urban_read.f90.
Modules: cs_module.f90, cs_data_module.f90.
Channel: ch_cs_module.f90, ch_cs_output.f90, cs_str_output.f90.
Aquifer: cs_aquifer.f90, cs_rctn_aqu.f90, cs_sorb_aqu.f90, aqu_cs_output.f90.
Reservoirs and wetlands: res_cs_module.f90, res_cs_output.f90, wet_cs_output.f90.
HRU and RU output: hru_cs_output.f90, ru_cs_output.f90.