- Fix the calculation of relative humidity (#435; @dschlaep). Previously, relative humidity was incorrectly calculated if based on vapor pressure or specific humidity.
- Fix the count of days on which a missing weather value was replaced by a
non-missing value from the preceding day for the method
"LOCF"
(last observation carried forward; #437; @dschlaep). Previously, any day with a missing weather value was counted.
-
Simulation output remains the same as the previous version. However, output of establishment/recruitment for two species is now generated by default by the example simulation run.
-
SOILWAT2 can now be compiled in one of two modes:
"nc"
and"text"
(#361, #362, #363; @N1ckP3rsl3y, @dschlaep):"nc"
-based SOILWAT2: output files are produced in"netCDF"
format; input files in"netCDF"
format are currently limited to the"domain"
. This mode is compiled if the new preprocessor definition"SWNETCDF"
and the"netCDF-c"
library are available, e.g.,make CPPFLAGS=-DSWNETCDF all
"text"
-based SOILWAT2 (as previously): output files are plain text that are formatted as comma-separated values"csv"
; input files are plain text.
-
SOILWAT2 now represents a simulation
"domain"
, i.e., a set of (independent) simulation units/runs (#360; @N1ckP3rsl3y, @dschlaep). A"domain"
is defined by either a set of"sites"
or by a"xy"
-grid. The current simulation set consists of simulation units within a"domain"
that have not yet been simulated. Simulation units are identified via"suid"
(simulation unit identifier).- Input text files are read once and now populate a
"template"
that is used for each simulation unit. - New
SW_CTL_RunSimSet()
loops over the simulation set or runs one user specified simulation unit. It writes warning and error messages from all simulation units to thelogfile
but does not exit if a simulation unit fails (main()
will exit with an error if it fails or if every simulation unit produced an error). - New
SW_CTL_run_sw()
takes a deep copy of the"template"
as basis for each simulation unit. - For
"netCDF"
-based SOILWAT2, information about the"domain"
(i.e., simulation units and their geographic locations) is obtained from"domain.nc"
(#361; @N1ckP3rsl3y, @dschlaep). - For
"nc"
-based SOILWAT2, simulation progress (success/failure) is tracked by"progress.nc"
(#387; @N1ckP3rsl3y, @dschlaep); progress tracking makes re-starts after partial completion of the simulation set by an earlier execution possible.
- Input text files are read once and now populate a
-
SOILWAT2 can now be compiled with
"udunits2"
to convert output to user requested units (#392; @dschlaep, @N1ckP3rsl3y).- Unit conversion is available only in
"nc"
-mode and if compiled with the new preprocessor definition"SWUDUNITS"
and if the"udunits2"
library is available, e.g.,make CPPFLAGS='-DSWNETCDF -DSWUDUNITS' all
. - Users request output units via field
"netCDF units"
of the input file"SW2_netCDF_output_variables.tsv"
.
- Unit conversion is available only in
-
Tests now utilize the same template/deep-copy approach (@dschlaep), i.e., input files from
test/example/
populate a"template"
and test fixture deep copy the"template"
(avoiding repeated reading from disk). -
SOILWAT2 gained basic time tracking and reporting (#380; @dschlaep). Temporal resolution may only be full seconds (for C99) but could be sub-seconds (for C11 or later). The runs over the simulation set end gracefully if a user specified wall time limit is (nearly) reached (nearly is defined by
SW_WRAPUPTIME
). A report is written tostdout
or (silently) to thelogfile
if user requested quiet mode; the report includes- Overall wall time and proportion of wall time for the simulation set
- Time of simulation units and reports average, standard deviation minimum and maximum time.
-
SOILWAT2 gained spin-up functionality (#379; @niteflyunicorns, @dschlaep). A user-requested sequence of (random) years is simulated (without output) before the actual simulation run to provide better starting values (e.g., soil moisture, soil temperature). User inputs are obtained from
"domain.in"
. -
The random number generator
"pcg"
is now a submodule of a forked copy of the previous repositoryimneme/pcg-c-basic
(#353; @dschlaep). This allowed us to fix a function declaration without a prototype. -
Specified a consistent code style and formatted code, header include directives, doxygen documentation, and updated code contribution guidelines (#316; @dschlaep).
- New input file
"domain.in"
with input variables that specify type and spatial dimensions of the simulation"domain"
(with a backwards compatible default of one site), start and end year (the latter previously in"years.in"
), and spin-up information (mode, duration, scope). This input file uses a key-value pair approach, i.e., inputs must use the correct key while they don't have to be on a specific line (as they have to be in other input files). - Input file
"years.in"
was removed (content moved to"domain.in"
). - New input file
"modelrun.in"
with inputs for geographic coordinates and topography (previously in"siteparam.in"
). - Input file
"siteparam.in"
lost inputs for geographic coordinates and topography (content moved to"modelrun.in"
). - Input file
"files.in"
gained two entries for"nc"
-based SOILWAT2. - New command line option
"-s X"
whereX
is a simulation unit identifier; if the option"-s X"
is absent orX
is0
, then all simulation units in the simulation"domain"
are run; otherwise, only the simulation unitX
is run. - New command line option
"-t X"
whereX
is the wall time limit in seconds. The code gracefully ends early if the wall time reaches a limit ofX - SW_WRAPUPTIME
seconds; if the option"-t X"
is absent, then there is (practically) no wall time limit. - New command line option
"-r"
to rename netCDF domain template file to domain file name provided in"Input_nc/files_nc.in"
.
- Output of establishment/recruitment for two species is now generated by default by the example simulation run (#411; @dschlaep).
"nc"
-based SOILWAT2 is compiled if the new preprocessor definition"SWNETCDF"
is available, e.g.,make CPPFLAGS=-DSWNETCDF all
; the capability to convert units is compiled with the new preprocessor definition"SWUDUNITS"
, e.g.,make CPPFLAGS='-DSWNETCDF -DSWUDUNITS' all
- User-specified paths to external headers and libraries can be provided
"netCDF-c"
headers:NC_CFLAGS="-I/path/to/include"
"netCDF-c"
library:NC_LIBS="-I/path/to/lib"
"udunits2"
headers:UD_CFLAGS="-I/path/to/include"
"udunits2"
library:UD_LIBS="-I/path/to/lib"
"expat"
headers:EX_CFLAGS="-I/path/to/include"
"expat"
library:EX_LIBS="-I/path/to/lib"
- New input directory
"Input_nc/"
that describes"nc"
-based inputs (paths provided by new entries in"files.in"
). - New text input file
"files_nc.in"
that lists for each input purpose (currently,"domain"
and"progress"
are implemented) the path to the"netCDF"
input file and associated variable name. - New text input file
"attribues_nc.in"
to provide global attributes and a geographic (and optionally a projected)"CRS"
(coordinate reference system) that describe the"domain.nc"
. - A user provided
"domain.nc"
that describes the simulation"domain"
. Specifications must be consistent with"domain.in"
. If absent, a template is automatically generated based on"domain.in"
. - A user provided
"progress.nc"
that describes the simulation"progress"
. Specifications must be consistent with"domain.nc"
. The"progress"
variable can optionally be contained in"domain.nc"
instead of a separate file. If absent, it is automatically generated based on"domain.nc"
. - New tab-separated value
"tsv"
input file"SW2_netCDF_output_variables.tsv"
that lists, activates, and describes each output variable in"netCDF"
mode. - All outputs are written to
"netCDF"
files based on user requests from"SW2_netCDF_output_variables.tsv"
. Each"netCDF"
output file contains the output variables from one output group"outkey"
and one output period (daily, weekly, monthly, yearly).
-
Simulation output remains the same as the previous version.
-
SOILWAT2 now handles errors more gracefully (#346; @N1ckP3rsl3y, @dschlaep).
- Code no longer crashes on error immediately (except for STEPWAT2).
- Code stores messages of warnings and error status.
- All functions now check for errors and return early (after cleaning up memory).
-
SOILWAT2 now defines its own structure for random numbers (#373; @dschlaep). This allows to hide implementation details, i.e., STEPWAT2 will no longer need to interact directly with
pcg
and rSOILWAT2 will no longer depend onpcg
which it never has used. -
New
sw_strtok()
is thread-safe and replaces not thread-safestrtok()
(#376; @N1ckP3rsl3y). -
Obsolete code in DEBUG_MEM* sections is removed (#369; @dschlaep).
-
Simulation output remains the same as the previous version.
-
Prepare for SOILWAT2 to become thread-safe and reentrant (#346; @N1ckP3rsl3y, @dschlaep)
- Definition clarifications
- Thread-safe - Multiple threads (a future SOILWAT2 development) will not influence each other unintentionally. Here, we implemented structures to enable thread-local storage, i.e., each thread operates on local data structures or with static data.
- Reentrant - The ability to correctly execute any part of the program by multiple threads simultaneously but independently from others.
- All non-static variables are replaced by local variables; functions gained arguments to pass local variables by reference (replacing global variables).
- New main abstract types
- SW_ALL - Contains the existing structures that are relevant for the simulation itself, e.g., SW_MODEL, SW_SOILWAT, SW_WEATHER.
- PATH_INFO - Holds information about location of input and output data, e.g., directories, file paths to input data.
- SW_OUTPUT_POINTERS - Points to requested output subroutines.
- LOG_INFO - Manages information for logging warnings and errors.
- Definition clarifications
-
Tests now require
c++14
and utilizegoogletest
v1.14.0
(issue #339). -
Bugfixes
- Fix an error where a pointer was freed even though it was not allocated (issue #356; @dschlaep).
- Fix memory leak in test of
SW_VPD_construct()
(issue #205; @dschlaep).
- The output separator
OUTSEP
has been unused since the switch (v4.0.0
) from writing free-form text files to"csv"
spreadsheets (where the separator is fixed to a comma); the occurrence ofOUTSEP
in"outsetup.in"
is now deprecated and triggers a warning.
-
This version produces nearly identical simulation output as the previous release under default values for the new inputs. Small deviations arise due to a fix in the handling of soil moisture values when between field capacity and saturation.
-
Multiple soil water release curves (
SWRC
) are now implemented and can be selected with new inputswrc_name
. ImplementedSWRCs
currently include"Campbell1974"
,"vanGenuchten1980"
, and"FXW"
. New inputhas_swrcp
determines if parameters for aSWRC
are estimated at run-time via an implemented pedotransfer function (PTF
) based on new inputptf_name
or if they are provided as inputs via new input file"swrc_params.in"
.rSOILWAT2
implements additional pedotransfer functions. See documentation entry of"swrc_ptf"
for additional details and for guidance on how to implement additionalSWRCs
andPTFs
(issue #315; @dschlaep). -
Soil density inputs can now represent either matric or bulk density (issue #280; @dschlaep).
- Automatic conversion between matric and bulk density as needed
using the new input
type_soilDensityInput
.
- Automatic conversion between matric and bulk density as needed
using the new input
-
Daily weather inputs that force a simulation are now processed all at once; previously, values were processed for one year at a time during the main simulation loop (issue #311; @dschlaep, @N1ckP3rsl3y).
- Daily weather inputs are now obtained by
readAllWeather()
viaSW_WTH_read()
duringSW_CTL_read_inputs_from_disk()
, i.e., the same time as other inputs are read from files. - Then, weather values are "finalized", i.e., missing values are imputed
(e.g., by the weather generator) and scaled with monthly parameters,
by
finalizeAllWeather()
viaSW_WTH_finalize_all_weather()
; this must occur before the simulation is "initialized" bySW_CTL_init_run()
. - Imputation of missing daily weather values by
generateMissingWeather()
can be done either by last-observation-carried-forward"LOCF"
(which handles all daily weather variables) or by the Markov weather generator (which handles only temperature and precipitation).
- Daily weather inputs are now obtained by
-
Daily weather inputs, in addition to the previous variables maximum air temperature, minimum air temperature, and precipitation amount, can now process the following variables (issue #341; @dschlaep, @N1ckP3rsl3y):
- Cloud cover (can be replaced by shortwave radiation)
- Wind speed (can be replaced by wind components)
- Wind speed eastward component (optional)
- Wind speed northward component (optional)
- Relative humidity (can be replaced by max/min humidity, specific humidity, dew point temperature, or vapor pressure)
- Maximum relative humidity (optional)
- Minimum relative humidity (optional)
- Specific humidity (optional)
- Dew point temperature (optional)
- Actual vapor pressure (optional)
- Downward surface shortwave radiation (optional)
-
SOILWAT2 gains the ability to calculate long-term climate summaries (issue #317; @N1ckP3rsl3y, @dschlaep).
- New
calcSiteClimate()
calculates monthly and annual time series of climate variables from daily weather. - New
averageClimateAcrossYears()
calculates long-term climate summaries. - Both functions are based on
rSOILWAT2::calc_SiteClimate()
which was previously coded in R. - This version fixes issues from the previous R version:
- Mean annual temperature is now the mean across years of means across days within year of mean daily temperature.
- Years at locations in the southern hemisphere are now adjusted to start on July 1 of the previous calendar year.
- The cheatgrass-related variables, i.e.,
Month7th_PPT_mm
,MeanTemp_ofDriestQuarter_C
, andMinTemp_of2ndMonth_C
, are now adjusted for location by hemisphere.
- New
-
SOILWAT2 gains the ability to estimate fractional land cover representing a potential natural vegetation based on climate relationships (using new input
veg_method
) instead of reading land cover values from input files (issue #318; @N1ckP3rsl3y, @dschlaep).- New
estimatePotNatVegComposition()
estimates fractional land cover representing a potential natural vegetation based on climate relationships. This function is based onrSOILWAT2::estimate_PotNatVeg_composition()
which was previously coded in R. - New
estimateVegetationFromClimate()
(which is called bySW_VPD_init_run()
) usesveg_method
to determine at run time if a simulation utilizesaverageClimateAcrossYears()
andestimatePotNatVegComposition()
to set land cover values instead of using the cover values provided in the input file. - This version fixes issues from the previous R version:
- The
C4
grass correction based on Teeri & Stowe 1976 is now applied as documented (rSOILWAT2
issue #218). - The sum of all grass components, if fixed, is now incorporated into
the total sum of all fixed components (
rSOILWAT2
issue #219).
- The
- New
- New inputs via
"weathsetup.in"
determine whether monthly or daily inputs for cloud cover, relative humidity, and wind speed are utilized; describe which daily weather variables are contained in the weather input filesweath.YYYY
; and describe units of (optional) input shortwave radiation. - New (optional) variables (columns) in weather input files
weath.YYYY
that are described via"weathsetup.in"
. - New inputs via
"siteparam.in"
select a soil water release curveswrc_name
and determine parameter sourcehas_swrcp
, i.e., either estimated via selected pedotransfer functionptf_name
or values obtained from new input file"swrc_params.in"
. Default values"Campbell1974"
,"Cosby1984AndOthers"
, and 0 (i.e., usePTF
to estimate paramaters) reproduce previous behavior. - New input file
"swrc_params.in"
to provide parameters of the selected soil water release curve (if not estimated via a pedotransfer function) for each soil layer. - SOILWAT2 gains
type_soilDensityInput
as new user input (siteparam.in
) with default value 0 (i.e., matric soil density) that reproduces previous behavior. - SOILWAT2 gains
veg_method
as new user input ("veg.in"
) with default value 0 (i.e., land cover are obtained from input files) that reproduces previous behavior.
-
This version produces exactly the same simulation output as the previous release under default values (i.e., vegetation establishment is turned off).
-
Functionality to calculate and output establishment/recruitment of species now works again and is now covered by tests (issue #336, @dschlaep). Note that this functionality assesses yearly the chances of species to recruit/establish based on simulated daily conditions; however, establishment/recruitment outcomes are not utilized to inform the simulation.
- New input via
"<species>.estab"
sets the vegetation type of a species establishment parameters'.
- Random number generators now produce sequences that can be exactly reproduced
(@dschlaep).
RandSeed()
gains arguments "initstate" and "initseq" (and lost "seed") to fully seed apcg32
random number generator.RandNorm()
is now re-entrant and discards one of the two generated values. Compilation with"RANDNORMSTATIC"
re-produces the old, not re-entrant implementation.SW_MKV_construct()
now only seedsmarkov_rng
(the random number generator of the weather generator) if run asSOILWAT2
using the new inputrng_seed
;SW_MKV_construct()
does not seedmarkov_rng
when run as part ofSTEPWAT2
orrSOILWAT2
(both of which use their ownRNG
initialization procedures).
SW_WTH_init_run()
now also initializes yesterday's weather values (@dschlaep).
- SOILWAT2 gains
rng_seed
as new user input ("weathsetup.in"
).