Skip to main content

Module 2: growth processes, weather data, the DSSAT file system and cultivar coefficients

This notebook follows the second day of a DSSAT training course. It runs a soybean experiment with the CROPGRO model and looks inside the daily carbon balance, then works with weather files (quality checks, unit conversion, what happens when the weather changes), the files a DSSAT run needs, and the three levels of crop coefficients (species, ecotype, cultivar).

Data. Soybean experiment UFGA7901 (Gainesville, Florida, 1979; cultivar Bragg; irrigated and rainfed) with its weather and soil, from DSSAT/dssat-csm-data (BSD-3), pinned to one commit. The training’s own weather spreadsheet is not used; the unit-conversion exercise starts from the published weather file instead.

Needs. As in module 1: the DSSAT engine, a short work folder outside OneDrive, dssat-csm-data next to this repository. Results go to the work folder and to small CSV files in docs/learn/data/module2/.

engine   : C:\TEMP\dsn\dssat\dscsm048.exe
csm-data : C:\Users\benny\OneDrive\Documents\Github\dssat-csm-data @ 99c95b34
FileX    : https://github.com/DSSAT/dssat-csm-data/blob/99c95b340acb9515c2d0a8ab582f5fbbf076f345/Soybean/UFGA7901.SBX

1. Growth processes

Run the experiment

UFGA7901 has two treatments: irrigated and rainfed Bragg soybean, planted on 19 June 1979.

2 treatments in 0.8 s, model CRGRO048
TRNO TNAM PDAT ADAT MDAT HWAM CWAM LAIX PRCM IRCM ETCM NFXM
0 1 79 IRRIG. BRAGG 1979170 1979213 1979285 3114 6314 5.537128 695 113 461 302
1 2 79 RAINFED BRAGG 1979170 1979213 1979285 3061 5994 5.282708 695 0 442 294
TRNO treatment variable simulated observed sim/obs
0 1 irrigated Seed yield, kg/ha 3114.00 2891.00 1.08
1 1 irrigated Tops weight, kg/ha 6314.00 5781.00 1.09
2 1 irrigated Pod weight, kg/ha 3987.00 3734.00 1.07
3 1 irrigated LAI, maximum 5.54 4.71 1.18
4 1 irrigated Seed size, g 152.17 163.80 0.93
5 1 irrigated First flower (R1), DAP 43.00 43.00 1.00
6 1 irrigated Maturity, DAP 115.00 119.00 0.97
7 2 rainfed Seed yield, kg/ha 3061.00 2883.00 1.06
8 2 rainfed Tops weight, kg/ha 5994.00 5534.00 1.08
9 2 rainfed Pod weight, kg/ha 3920.00 3755.00 1.04
10 2 rainfed LAI, maximum 5.28 4.36 1.21
11 2 rainfed Seed size, g 152.70 157.80 0.97
12 2 rainfed First flower (R1), DAP 43.00 45.00 0.96
13 2 rainfed Maturity, DAP 115.00 119.00 0.97

The daily carbon balance

CROPGRO computes gross photosynthesis every day, takes off maintenance respiration (a part proportional to the plant’s mass and a part proportional to the day’s photosynthesis, RESPIR.for:54), and turns what is left into new tissue, losing growth respiration in the conversion. With the PHOTO method L of this experiment the gross photosynthesis comes from an hourly leaf-level calculation in the soil-plant-atmosphere module (CROPGRO.for:748-758); with C it is the daily canopy equation of PHOTO.for:225, which multiplies a light-limited rate by 0-1 factors for soil fertility (SLPF), temperature, leaf N, water and CO2.

The daily output file PlantC reports these terms in g CH2O per m2 per day.

PHAD MRAD GRAD CGRD respired share
TRNO
1 2445.16 541.0 457.58 1258.55 0.41
2 2379.05 524.5 447.97 1225.09 0.41

Where the new mass goes: partitioning

Each day the new dry matter is shared between leaves, stems, roots and (after flowering) pods and seeds, in proportions that change with the growth stage. The FileT holds field samples of the same organs.

rmse d
TRNO 1 2 1 2
variable
CWAD 567.31 874.36 0.99 0.97
GWAD 196.34 367.94 0.99 0.97
LAID 0.57 0.69 0.97 0.96
LWAD 199.86 266.20 0.98 0.95
PWAD 284.00 487.53 0.99 0.97
SWAD 381.54 472.34 0.97 0.95

Light interception

Gross photosynthesis depends first on how much light the canopy intercepts. The engine reports the intercepted share of PAR (LI%D) and the leaf area index; Beer’s law, LI = 1 - exp(-k LAI), gives an extinction coefficient k that summarises the canopy.

fitted extinction coefficient k = 0.720 from 238 days

Water stress

The rainfed treatment had the same weather but no irrigation. Two 0-1 factors in PlantGro show when water was short: WSPD (photosynthesis) and WSGD (expansion, partitioning and development). In CROPGRO’s PlantGro these are written as 1 - factor (Opgrow.for:277-278): 0 means no stress, 1 means growth stopped.

WSPD WSGD
mean max mean max
TRNO
1 0.00 0.00 0.00 0.17
2 0.01 0.38 0.03 0.58

Two ways to compute photosynthesis

The same experiment with the daily canopy method (PHOTO = C) instead of the hourly leaf method:

treatment HWAM_L HWAM_C CWAM_L CWAM_C obs_HWAM
0 irrigated 3114.0 2899.0 6314.0 6264.0 2891.0
1 rainfed 3061.0 2854.0 5994.0 5965.0 2883.0
WindowsPath('C:/Users/benny/OneDrive/Documents/Github/xdssat/docs/learn/data/module2/photo_method.csv')

The effect of CO2 on growth

Photosynthesis responds to the CO2 concentration of the air, and differently in C3 crops (soybean) and C4 crops (maize). The environmental modification column ECO2 of an experiment file can replace the CO2 of every day with a fixed value (R and the value, in ppm). The irrigated soybean of UFGA7901 and the irrigated, high-N maize of UFGA8201 are run at six concentrations, one treatment per concentration.

crop maize (C4) soybean (C3)
CO2
280 0.897 0.820
330 0.987 0.921
380 1.000 1.000
450 1.016 1.074
550 1.031 1.157
700 1.039 1.238

2. Weather data

A DSSAT weather file holds one station header (code, latitude, longitude, elevation, TAV the mean annual temperature and AMP the amplitude of monthly mean temperatures) and one row per day with at least solar radiation (MJ/m2/day), maximum and minimum temperature (°C) and rain (mm). The shell’s WeatherMan tool imports, checks and converts such data; here pandas and src/wth.py do the same.

Quality checks

{'INSI': 'UFGA', 'LAT': 29.63, 'LONG': -82.37, 'ELEV': 10.0, 'TAV': 20.9, 'AMP': 13.0, 'REFHT': 2.0, 'WNDHT': 3.0}
check count
0 days in file 365
1 missing values (any of SRAD, TMAX, TMIN, RAIN) 0
2 TMAX below TMIN 0
3 negative rain 0
4 SRAD below 0 or above 35 MJ/m2/day 0
5 TMAX above 45 or TMIN below -20 °C 0
6 day-to-day TMAX change above 15 °C 1
7 gaps in the dates 0
what header recomputed
0 TAV, °C 20.9 20.99
1 AMP, °C 13.0 16.09
month TMAX TMIN SRAD RAIN raindays
0 1 18.9 5.5 10.2 220.6 9
1 2 20.3 5.6 11.9 84.9 6
2 3 25.1 9.2 18.2 29.7 4
3 4 28.2 15.1 19.1 207.8 7
4 5 30.0 17.0 21.3 85.4 10
5 6 32.6 20.1 20.4 115.7 10
6 7 34.0 22.6 21.1 111.2 18
7 8 33.0 21.8 19.3 187.7 14
8 9 31.1 22.2 14.2 310.8 18
9 10 29.3 14.9 16.7 2.8 3
10 11 25.1 11.9 12.5 33.6 6
11 12 20.9 8.3 9.8 154.9 9

The WeatherMan exercise: weather from Griffin, Georgia

The course hands out daily weather of an experiment station at Griffin, Georgia, as a spreadsheet (course-data/GRGR-Raw.xls): the date as YYDDD, rain in inches, maximum and minimum temperature in °F and solar radiation in cal/cm² (langleys). The exercise gives the station as latitude 33°16’ N, longitude 84°17’ W, elevation 299 m. WeatherMan converts the units, checks the data and writes one DSSAT weather file per year, GRGR9201.WTH to GRGR9901.WTH; here pandas and wth.write_wth do the same.

2696 days, 01 Jan 1992 to 19 May 1999
 YYDDD  rain_in  tmax_F  tmin_F  srad_ly       date
 92001     0.00    50.5    35.1   138.62 1992-01-01
 92002     1.37    49.3    40.6    59.75 1992-01-02
 92003     0.35    53.8    42.1   126.67 1992-01-03
 92004     0.00    61.9    42.6   255.74 1992-01-04
 92005     0.00    53.4    42.1   162.52 1992-01-05
check count
0 days in the spreadsheet 2696
1 duplicate dates 0
2 days missing between first and last date 0
3 missing values 0
4 TMAX below TMIN 0
5 negative rain 0
6 SRAD below 0 or above 35 MJ/m2/day 0
days filled by interpolation (temperature, radiation) or as no rain: 0; TAV 16.2, AMP 19.3
*WEATHER : Experiment, Georgia, USA (course data, converted)

@ INSI      LAT     LONG  ELEV   TAV   AMP REFHT WNDHT
  GRGR   33.267  -84.283   299  16.2  19.3   -99   -99
@DATE  SRAD  TMAX  TMIN  RAIN
92001   5.8  10.3   1.7   0.0
92002   2.5   9.6   4.8  34.8
file days first last
0 GRGR9201.WTH 366 1992-01-01 1992-12-31
1 GRGR9301.WTH 365 1993-01-01 1993-12-31
2 GRGR9401.WTH 365 1994-01-01 1994-12-31
3 GRGR9501.WTH 365 1995-01-01 1995-12-31
4 GRGR9601.WTH 366 1996-01-01 1996-12-31
5 GRGR9701.WTH 365 1997-01-01 1997-12-31
6 GRGR9801.WTH 365 1998-01-01 1998-12-31
7 GRGR9901.WTH 139 1999-01-01 1999-05-19

Self test 1 of the exercise: run the first treatment of the maize experiment UFGA8201 with the new weather. The Griffin record covers 1992-1999, not 1982, so the experiment is planted on 26 February of each year from 1992 to 1998 (all its dates move with planting), next to Gainesville 1982.

cell PDAT ADAT MDAT HWAM CWAM PRCM ETCM TMAXA TMINA SRADA season_days
0 UFGA 1982 1982057 1982133 1982185 2293 6556 661 290 29.332031 16.024216 18.540625 128
1 GRGR 1992 1992057 1992167 1992222 6924 11795 471 346 25.061211 13.146670 19.460003 165
2 GRGR 1993 1993057 1993167 1993218 1464 4183 426 239 25.719259 13.336024 20.972052 161
3 GRGR 1994 1994057 1994159 1994216 6703 12884 1069 422 25.617609 13.870437 19.800003 159
4 GRGR 1995 1995057 1995155 1995211 4218 9585 289 265 26.640911 13.874025 20.588306 154
5 GRGR 1996 1996057 1996167 1996220 3687 9596 497 291 25.870558 12.854602 20.098162 163
6 GRGR 1997 1997057 1997162 1997218 6446 13021 632 382 25.588198 12.955901 19.718630 161
7 GRGR 1998 1998057 1998158 1998209 3418 6425 562 267 26.531584 13.650656 20.226971 152
WindowsPath('C:/Users/benny/OneDrive/Documents/Github/xdssat/docs/learn/data/module2/grgr_maize.csv')

Converting back and forth: an optional column matters

Station data often come in other units: °F, inches of rain, radiation in langleys (cal/cm2/day). To show the conversion WeatherMan does on import, the published file is turned into such a table, converted back with the standard factors (1 inch = 25.4 mm, 1 langley = 0.04184 MJ/m2) and written as a new DSSAT file with wth.write_wth, which also recomputes TAV and AMP. This file also has a PAR column (photosynthetically active radiation, mol/m2/day); the conversion is done twice, once keeping it and once without it, and the soybean experiment is run on each new file.

C:\TEMP\ipykernel_46484\1818243184.py:2: UserWarning: obj.round has no effect with datetime, timedelta, or period dtypes. Use obj.dt.round(...) instead.
  "rain_in": w.RAIN / 25.4, "srad_ly": w.SRAD / 0.04184}).round(2)
                 date  tmax_F  tmin_F  rain_in  srad_ly
date                                                   
1979-01-01 1979-01-01   80.96   57.92     0.00   239.01
1979-01-02 1979-01-02   78.98   46.04     1.35    62.14
1979-01-03 1979-01-03   46.04   23.00     0.00   296.37
1979-01-04 1979-01-04   50.00   26.96     0.00   246.18
1979-01-05 1979-01-05   69.98   39.02     0.00   270.08
TAV/AMP of the new file: 21.0 16.1
variable value
0 SRAD, largest change 0.0
1 TMAX, largest change 0.0
2 TMIN, largest change 0.0
3 RAIN, largest change 0.1
4 seed yield irrigated, original file 3114.0
5 seed yield rainfed, original file 3061.0
6 seed yield irrigated, converted, PAR kept 3114.0
7 seed yield rainfed, converted, PAR kept 3063.0
8 seed yield irrigated, converted, no PAR 3187.0
9 seed yield rainfed, converted, no PAR 3135.0

What if the weather were different?

Each scenario changes the weather file and reruns both treatments: radiation (SRAD and PAR) scaled by 0.8 to 1.2, all temperatures raised by 2 or 4 °C, and rain halved or raised by half. This is what the environmental modification section of a FileX does inside the engine; editing the file keeps the change visible.

treatment irrigated rainfed
scenario
SRAD x 0.8 2627.0 2628.0
SRAD x 0.9 2898.0 2874.0
SRAD x 1.1 3274.0 3173.0
SRAD x 1.2 3421.0 3254.0
baseline 3114.0 3063.0
rain x 0.5 2912.0 2203.0
rain x 1.5 3105.0 3098.0
temperature +2 °C 2848.0 2781.0
temperature +4 °C 2589.0 2431.0
WindowsPath('C:/Users/benny/OneDrive/Documents/Github/xdssat/docs/learn/data/module2/weather_sens.csv')

3. The minimum data set and the DSSAT file system

A run needs a minimum data set: site and soil, daily weather, management, and the crop’s coefficients. Each lives in its own text file. These are the files the base run above used, and what each holds:

file role lines source
0 SOIL.SOL soil profiles (many per file) 1981 dssat-csm-data
1 UFGA7901.SBA FileA: observed end-of-season data 12 dssat-csm-data
2 UFGA7901.SBT FileT: observed data during the season 60 dssat-csm-data
3 UFGA7901.SBX FileX: experiment (treatments, management, sim... 134 dssat-csm-data
4 UFGA7901.WTH daily weather of one station and year(s) 370 dssat-csm-data
5 SBGRO048.CUL cultivar coefficients 129 engine Genotype folder
6 SBGRO048.ECO ecotype coefficients 82 engine Genotype folder
7 SBGRO048.SPE species coefficients 174 engine Genotype folder

Experiment files are named IIssYYnn.ccX: institute (UF), site (GA), two-digit year (79), experiment number (01), and a crop code (SB soybean) plus X, A or T. The same name with .WTH is the weather. Counting the experiment files shipped with DSSAT, per crop folder:

300 experiment files in 53 folders
part value
0 institute UF
1 site GA
2 year 79
3 experiment 01
4 crop SB
folder experiments
39 Soybean 36
27 Peanut 21
26 Maize 12
37 Sequence 11
25 Lentil 10
49 Tomato 10
31 Potato 10
44 Sunflower 9
2 Bahia 9
7 Brachiaria 9
42 Sugarbeet 8
43 Sugarcane 8
36 Seasonal 8
48 Teff 7
33 Rice 7
WindowsPath('C:/Users/benny/OneDrive/Documents/Github/xdssat/docs/learn/data/module2/naming.csv')

4. Species, ecotype and cultivar coefficients

CROPGRO reads its crop parameters at three levels:

  • species (SBGRO048.SPE): what all soybeans share, such as cardinal temperatures and photosynthesis and respiration parameters;
  • ecotype (SBGRO048.ECO): groups of cultivars, here by maturity group;
  • cultivar (SBGRO048.CUL): the coefficients users estimate for each variety.

Soybean is a short-day plant. Its development toward flowering slows when days are longer than a critical day length CSDL; PPSEN is the slope of that slowing per hour. The engine computes the relative rate with an “inverse linear” curve (UTILS.for:378-383), called in PHENOL.for:243 with the day length at which the rate reaches its minimum THVAR set to CSDL + (1 - THVAR) / PPSEN (Ipphenol.for:239-240).

var name ECO# CSDL PPSEN THVAR EM-FL FL-SD SD-PM WTPSD SFDUR
0 990011 M GROUP 000 SB0001 14.60 0.129 0.0 15.5 12.0 29.5 0.19 23.0
1 990012 M GROUP  00 SB0001 14.35 0.148 0.0 16.0 12.0 30.0 0.19 23.0
2 990013 M GROUP   0 SB0001 14.10 0.171 0.0 16.8 13.0 30.8 0.19 23.0
3 990001 M GROUP   1 SB0101 13.84 0.203 0.0 17.0 13.0 31.6 0.19 23.0
4 990002 M GROUP   2 SB0201 13.59 0.249 0.0 17.4 13.5 32.4 0.19 23.0
5 990003 M GROUP   3 SB0301 13.40 0.285 0.0 19.0 14.0 33.2 0.19 23.0
6 990004 M GROUP   4 SB0401 13.09 0.294 0.0 19.4 15.0 34.0 0.19 23.0
7 990005 M GROUP   5 SB0501 12.83 0.303 0.0 19.8 15.5 34.8 0.18 23.0
8 990006 M GROUP   6 SB0601 12.58 0.311 0.0 20.2 16.0 35.6 0.18 23.0
9 990007 M GROUP   7 SB0701 12.33 0.320 0.0 20.8 16.0 36.4 0.18 23.0
10 990008 M GROUP   8 SB0801 12.07 0.330 0.0 21.5 16.0 37.2 0.18 23.0
11 990009 M GROUP   9 SB0901 11.88 0.340 0.0 23.0 16.0 37.4 0.18 23.0
12 990010 M GROUP  10 SB1001 11.78 0.349 0.0 23.5 16.0 37.4 0.18 23.0
13 IB0001 BRAGG SB0701 12.33 0.320 0.0 19.5 15.2 37.6 0.17 24.0
model_name
CERES-Maize                                     P1 P2 P5 G2 G3 PHINT
CERES-Millet                         P1 P2O P2R P5 G1 G4 PHINT GT G5
CERES-Rice         P1 P2R P5 P2O G1 G2 G3 PHINT THOT TCLDP TCLDF ...
CERES-Sorghum      P1 P2 P2O P2R PANTH P3 P4 P5 PHINT G1 G2 PBASE...
CERES-Wheat                                P1V P1D P5 G1 G2 G3 PHINT
CROPGRO-Peanut     CSDL PPSEN EM-FL FL-SH FL-SD SD-PM FL-LF LFMAX...
CROPGRO-Soybean    CSDL PPSEN EM-FL FL-SH FL-SD SD-PM FL-LF LFMAX...
Name: coefficient, dtype: str

The course exercise: maturity groups 3, 5 and 7

The irrigated treatment of UFGA7901 with the generic maturity group 3, 5 and 7 cultivars of the cultivar file, water and nitrogen simulated as in the experiment. The self test asks for the days to flowering and to physiological maturity, the time between them, and the seed yield.

var maturity_group R1_dap maturity_dap HWAM seed_number seed_mg R1_to_maturity
0 990003 3 28 81 2392.0 1739.0 137.548104 53
1 990005 5 35 97 2912.0 2132.0 136.585623 62
2 990007 7 45 116 3114.0 1891.0 164.668918 71

Maturity group and planting date

Four cultivars (generic maturity groups 3, 5 and 7, and Bragg) planted every three weeks from April to August at Gainesville, all under potential production (water and N switched off), in one FileX:

name BRAGG M GROUP   3 M GROUP   5 M GROUP   7
pdate
1979-04-10 43 30 35 47
1979-05-01 50 32 40 53
1979-05-22 50 31 40 53
1979-06-12 46 30 37 48
1979-07-03 39 26 32 41
1979-07-24 33 25 29 35
1979-08-14 28 25 26 29

One coefficient at a time: the course’s values

Exercise 3 of the course: start from the generic maturity group 7 cultivar (990007) and change one coefficient at a time, to the values the course gives, in the irrigated treatment. Every value is a separate cultivar in a copy of the cultivar file (learnlib.write_cultivar_variants), so the sweep is one FileX and one engine call. The last entry is exercise 4, a new cultivar: maturity group 7 with PODUR = 7.

['990007 M GROUP   7          . SB0701 12.33 0.320  20.8  10.0  16.0 36.40 18.00 1.030  375. 180.0  1.00  0.18  23.0  2.05  10.0  78.0  .400  .200', 'DS0001 DSSAT Workshop c     . SB0701 12.33 0.320  20.8  10.0  16.0 36.40 18.00 1.030  375. 180.0  1.00  0.18  23.0  2.05   7.0  78.0  .400  .200']
19 runs in one engine call, 4.7 s
coefficient value label R1_dap maturity_dap HWAM seed_number seed_mg HIAM LAIX
0 standard MG 7 NaN standard MG 7 45 116 3114.0 1891.0 164.668918 0.476596 6.074248
1 EM-FL 16.00 EM-FL = 16 37 111 3269.0 1914.0 170.817792 0.528958 5.193697
2 EM-FL 20.00 EM-FL = 20 44 115 3144.0 1900.0 165.480658 0.484492 5.946327
3 EM-FL 24.00 EM-FL = 24 51 119 3038.0 1791.0 169.581532 0.452891 6.415170
4 SFDUR 13.00 SFDUR = 13 45 116 2140.0 1247.0 171.565890 0.320216 6.078144
5 SFDUR 18.00 SFDUR = 18 45 116 2695.0 1586.0 169.945255 0.415954 6.076196
6 SFDUR 23.00 SFDUR = 23 45 116 3114.0 1891.0 164.668918 0.476596 6.074248
7 SFDUR 28.00 SFDUR = 28 45 116 3334.0 2213.0 150.641099 0.513142 6.072300
8 PODUR 7.00 PODUR = 7 45 116 3117.0 1935.0 161.053136 0.483288 6.070409
9 PODUR 10.00 PODUR = 10 45 116 3114.0 1891.0 164.668918 0.476596 6.074248
10 PODUR 13.00 PODUR = 13 45 116 3173.0 1805.0 175.823689 0.478480 6.076315
11 PODUR 16.00 PODUR = 16 45 116 3102.0 1887.0 164.450496 0.464380 6.077608
12 WTPSD 0.14 WTPSD = 0.14 45 116 3111.0 2421.0 128.515810 0.479143 6.039122
13 WTPSD 0.18 WTPSD = 0.18 45 116 3114.0 1891.0 164.668918 0.476596 6.074248
14 WTPSD 0.22 WTPSD = 0.22 45 116 3119.0 1552.0 200.969517 0.478784 6.098143
15 WTPSD 0.26 WTPSD = 0.26 45 116 3122.0 1315.0 237.379938 0.477504 6.123646
16 CSDL 12.07 CSDL = 12.07 51 124 3011.0 1849.0 162.882507 0.436804 6.603124
17 PPSEN 0.33 PPSEN = 0.33 46 117 3115.0 1860.0 167.460799 0.471649 6.168492
18 new cultivar 7.00 DS0001: MG 7 with PODUR 7 45 116 3117.0 1935.0 161.053136 0.483288 6.070409
WindowsPath('C:/Users/benny/OneDrive/Documents/Github/xdssat/docs/learn/data/module2/mg7_base.csv')

5. Things to try

  • Run the rainfed treatment with PHOTO = C: does the difference between the two photosynthesis methods grow or shrink under water stress?
  • Add a scenario with radiation x 1.2 and temperature +2 °C. Is the combined change the sum of the two?
  • Plant maturity group 7 in late July. Why does it flower so much sooner after planting than in April?
  • Which of the six coefficients change seed yield without changing the date of first flower?
  • Exercise 3g asks for CSDL and PPSEN together, as a full move from maturity group 7 to 8. Add that variant.
0
engine C:\TEMP\dsn\dssat\dscsm048.exe
model CRGRO048
csm_data_commit 99c95b340acb9515c2d0a8ab582f5fbbf076f345
csm_os_commit 25c93b9a2f73f8ec45bf441b198dac5fb7b22849
run_on 2026-11-07 07:42
Back to top