Decision Tables
Decision tables are a precise yet compact way to model complex rule sets and their corresponding actions. Decision tables, like flowcharts and if-then-else and switch-case statements, associate conditions with actions to perform, but in many cases do so in a more elegant way (see Wikipedia article on decision tables).
Structure of decision tables:
Conditions
Condition alternatives
Actions
Action entries
Each decision corresponds to a variable, relation or predicate whose possible values are listed among the condition alternatives. Each action is a procedure or operation to perform, and the entries specify whether (or in what order) the action is to be performed for the set of condition alternatives the entry corresponds to. Many decision tables include in their condition alternatives the "don’t care" symbol, a hyphen. Using "don’t cares" can simplify decision tables, especially when a given condition has little influence on the actions to be performed. In some cases, entire conditions thought to be important initially are found to be irrelevant when none of the conditions influence which actions are performed.
Usage in SWAT+
There are four decision table sections in SWAT+: land use management, reservoir release, scenario land use, and flow conditions.
See the land use management documentation, under management schedules for how to choose a decision table for your HRUs.
Land Use ManagementReservoir release decision tables are assigned from the reservoir properties section under connections in SWAT+ Editor.
Modifying Decision Tables in SWAT+ Editor
In the current version of SWAT+ editor, we do not have a GUI available for editing decision tables, however we have provided the ability to export the decision table file. You may then make changes to it in a text editor, and upload back into SWAT+ Editor.
Table Definitions
SWAT+ Input File
Database Table
lum.dtl, res_rel.dtl, scen_lu.dtl, flo_con.dtl
d_table_dtl
d_table_dtl_cond
d_table_dtl_cond_alt
d_table_dtl_act
d_table_dtl_act_out
d_table_dtl
Field
Type
Description
id
int
Auto-assigned identifier
name
text
Name of the decision table
file_name
text
File name denoting type of decision table: lum.dtl, res_rel.dtl, scen_lu.dtl, flo_con.dtl
d_table_dtl_cond
Field
Type
Description
Related Table
id
int
Auto-assigned identifier
d_table_id
int
ID of decision table
d_table_dtl
var
text
Condition variable
obj
text
Object variable (res, hru, etc)
obj_num
int
Object number
lim_var
text
Limit variable (evol, pvol, fc, etc)
lim_op
text
Limit operator (*, +, -)
lim_const
real
Limit constant
d_table_dtl_cond_alt
Field
Type
Description
Related Table
id
int
Auto-assigned identifier
cond_id
int
ID of condition
d_table_dtl_cond
alt
text
Condition alternatives (>, <, =)
d_table_dtl_act
Field
Type
Description
Related Table
id
int
Auto-assigned identifier
d_table_id
int
ID of decision table
d_table_dtl
act_typ
text
Type of action (reservoir, irrigate, etc)
obj
text
Object variable (res, hru, etc)
obj_num
int
Object number
name
text
Name of action
option
text
Action option-specific to type of action (e.g., for reservoir, option to input rate, days of draw-down, weir equation pointer, etc)
const
real
Constant used for rate, days, etc
const2
real
fp
text
Pointer for option (e.g., weir equation pointer)
d_table_dtl_act_out
Field
Type
Description
Related Table
id
int
Auto-assigned identifier
act_id
int
ID of action
d_table_dtl_act
outcome
bool
Perform action (1 or true), or don't perform action (0 or false)
Text File Example and Explanation
The following is an example of a decision table in the lum.dtl input file. It is a table for warm season annual crops, using continuous corn.
In the above table, there are 6 conditions, 4 alternatives and 3 actions.
Description of the conditions
soil_water – if soil water is too high (> 1.50*field capacity), it will be too wet to operate machinery
plant_gro – (“n”) Planting allowed if plant is not growing.
phu_base0 – (0.15) when the sum base zero heat units for the year (starting Jan 1) exceeds 0.15, indicating it’s warm enough to plant
phu_plant – (1.15) harvest is scheduled when the sum of the heat units for the crop exceed 1.15 (if the heat units to maturity for the crop = 1500, then harvest would be scheduled at 1.15 * 1500 = 1725).
year_rot – needed to identify the current year of rotation. In this example, corn is grown in year 1.
days_plant – days since last plant (200) to ensure harvest occurs before next crop is planted.
Description of the alternatives
If all of the conditions for each alternative are met, outcomes are checked for ‘y’ to take action. Alternatives with dash (‘-‘) are not checked.
plant corn based on heat units: if soil water < 1.50*fc and if phubase0 > 0.15*phu_mat and if year_rot = 1 then check outcomes for ‘y’ and if ‘y’, take that action (plant)
Harvest corn based on crop accumulated heat units: if soil_water < 1.50*fc and if phu_plant > 1.15*phu_mat and if year_rot = 1 and then check outcomes for ‘y’ and if ‘y’, take that action (plant)
Harvest corn based on days since planting: if year_rot = 1 and if days_plant =200 then check outcomes for ‘y’ and if ‘y’, take that action (harvest)
Reset rotation year: if year_rot > 1 then check outcomes for ‘y’ and if ‘y’, take that action (rot_reset)
Description of the actions
plant: corn – cross walked to plant name in plants.plt file
harvest_kill: corn – cross walked to plant name in plants.plt file grain – relates to harvest type in harv.ops file
rot_reset: rotation reset – for continuous corn (1 year rotation). The rotation year is reset to 1 at the end of every year.