Skip to content
Back to skills

Docs

BSecurity

Compile the DSSAT-CSM model from Fortran source code, create a batch file specifying which experiments and treatments to run, execute the model, and diagnose any runtime errors that occur. - [ ] A Fortran compiler is installed (gfortran recommended, version >= 7.0). - [ ] CMake is installed (version >= 3.10.0, as required by `CMakeLists.txt` line 7). - [ ] S3-S7 completed: a valid FileX experiment file exists with all required sections. - [ ] All referenced data files exist: `.SOL` soi

  • 200 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 11, 2026
documentationbashdebuggingdocumentation

Security analysis

B85/100
  • highPerforms destructive filesystem operations

Pro scans all 15 files and shows the line behind each finding

Scanned September 11, 2026

npx -y skills add lzwei196/KISS---Knowledge-Infrastructure-for-Scientific-Simulation --skill docs --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Docs?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Docs
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/lzwei196-docs-d6ab41a9/badge)](https://www.skillsdirectory.com/skills/lzwei196-docs-d6ab41a9)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
# S8: Batch Execution

## Purpose

Compile the DSSAT-CSM model from Fortran source code, create a batch file specifying which experiments and treatments to run, execute the model, and diagnose any runtime errors that occur.

## Prerequisites

- [ ] A Fortran compiler is installed (gfortran recommended, version >= 7.0).
- [ ] CMake is installed (version >= 3.10.0, as required by `CMakeLists.txt` line 7).
- [ ] S3-S7 completed: a valid FileX experiment file exists with all required sections.
- [ ] All referenced data files exist: `.SOL` soil profile, `.WTH` or `.WTX` weather files, cultivar files (`.CUL`, `.ECO`, `.SPE`).
- [ ] The `dssat-csm-data` repository or equivalent data directory is available at the expected path.
- [ ] You know which treatments to run and in what mode (batch, seasonal, sequence, etc.).

## Inputs

| Parameter       | Type      | Source              | Description                                           |
|-----------------|-----------|---------------------|-------------------------------------------------------|
| Source code     | Directory | Repository          | DSSAT-CSM Fortran source tree (this repository)       |
| FileX           | File      | S3-S7 outputs       | Experiment file(s) to simulate                        |
| Treatment IDs   | Integer   | User / protocol     | Which treatments from FileX to run                    |
| Run mode        | CHAR*1    | User decision       | How the model processes treatments (see mode table)   |
| Data directory  | Path      | Installation        | Location of supporting data files (.SOL, .WTH, etc.)  |

## Procedure

### Step 1: Compile DSSAT-CSM from Source

#### Step 1.1: Verify Prerequisites

Run the following commands and confirm successful output:

```bash
gfortran --version    # Must show gfortran version >= 7.0
cmake --version       # Must show CMake version >= 3.10.0
```

If gfortran is not installed:
- macOS: `brew install gcc`
- Ubuntu/Debian: `sudo apt install gfortran`
- CentOS/RHEL: `sudo yum install gcc-gfortran`

If CMake is not installed:
- macOS: `brew install cmake`
- Ubuntu/Debian: `sudo apt install cmake`

#### Step 1.2: Create Build Directory

DSSAT enforces out-of-source builds. In-source builds produce a fatal CMake error (see `CMakeLists.txt` lines 9-14).

```bash
cd /path/to/DSSAT
mkdir -p build
cd build
```

**CRITICAL**: Do NOT run `cmake` from the source directory root. The CMakeLists.txt will reject this with:
```
FATAL_ERROR: DSSAT in-source builds are not permitted.
```

#### Step 1.3: Configure with CMake

```bash
cmake ..
```

Expected output includes:
```
-- MAJOR: 4 MINOR: 8 MODEL: 5 BUILD: 41 COMMIT: <hash>
-- BRANCH: develop
```

This confirms CMake found the Fortran compiler and parsed the project definition. The version numbers come from `CMakeLists.txt` lines 22-25:
```
SET(MAJOR 4)
SET(MINOR 8)
SET(MODEL 5)
SET(BUILD 41)
```

**If CMake fails**: Check that the Fortran compiler is in your PATH. On macOS, ensure you are using Homebrew's gcc/gfortran, not Apple's clang (which lacks Fortran support).

#### Step 1.4: Compile

```bash
make -j$(nproc 2>/dev/null || sysctl -n hw.ncpu)
```

This compiles all Fortran source files and links them into the executable. The `-j` flag parallelizes compilation using all available CPU cores.

Expected result: An executable file is produced. The name follows the pattern `dscsm0XX` where XX matches the version. For v4.8.5, the executable is typically named `dscsm048`.

**Common compilation errors**:

| Error                                    | Cause                                           | Resolution                                         |
|------------------------------------------|------------------------------------------------|----------------------------------------------------|
| `gfortran: command not found`            | Compiler not installed or not in PATH          | Install gfortran; check PATH                       |
| `Error: Unresolvable reference to...`    | Missing source file or module dependency       | Ensure all source directories are present          |
| `Error: Type mismatch in argument`       | Fortran interface mismatch (compiler strictness)| Try `-fallow-argument-mismatch` flag in CMake      |
| `undefined reference to 'main'`          | Linking error                                  | Check that CSM_Main/CSM.for is included in build   |
| Multiple definition errors               | Duplicate compilation of same file             | Clean build: `rm -rf build && mkdir build`         |

#### Step 1.5: Verify the Executable

```bash
ls -la dscsm048    # or whatever the executable name is
./dscsm048         # Should print usage or wait for input
```

If the executable runs and prints model header information or waits for input, compilation succeeded.

**IMPORTANT**: After any source code changes, you must re-run `make` from the build directory. Forgetting to recompile after code changes is the most common cause of "my changes had no effect."

### Step 2: Create the Batch File

#### Step 2.1: Understand Batch File Format

The batch file is a fixed-format text file that tells the CSM which experiment files and treatments to run. The file is named `DSSBatch.v48` (or any name -- the name is passed as a command-line argument).

Source reference: The CSM reads the batch file looking for the `$BATCH` header (`CSM.for` line 238), then reads experiment paths and treatment numbers from subsequent lines (`CSM.for` lines 266-277).

#### Step 2.2: Write the Batch File Header

The first line must be `$BATCH(CROP)` where CROP is the crop name (for documentation only; the model only looks for `$BATCH`).

```
$BATCH(MAIZE)
```

Comment lines start with `!` and are ignored:
```
! Directory    : /path/to/experiments
! Command Line : ./dscsm048 B DSSBatch.v48
! Crop         : Maize
```

#### Step 2.3: Write the Column Header

```
@FILEX                                                                                        TRTNO     RP     SQ     OP     CO
```

The `@FILEX` header line is required. The model reads it to locate column positions.

Column layout (from `CSM.for` lines 268-272):
- Columns 1-92: Full path to the FileX experiment file (fixed-width, padded with spaces).
- Columns 93-98: TRTNO (treatment number, I6 format).
- Columns 99-104: RP (replication number, I6 format).
- Columns 105-110: SQ (sequence number, I6 format; 0 for non-sequence runs).
- Columns 111-116: OP (option number, I6 format; 0 for default).
- Columns 117-122: CO (control option, I6 format; 0 for default).

**CRITICAL**: The FileX path occupies columns 1 through 92. The model reads the path by finding the last non-blank character position in columns 1-92, then extracts the 12-character filename from the end of that string (`CSM.for` lines 268-270). If the path is too long and exceeds 92 characters, it will be truncated, and the model will fail with a "File not found" error. This is a Fortran fixed-format string limitation.

#### Step 2.4: Write Treatment Lines

One line per treatment to simulate:

```
/full/path/to/Maize/UFGA8201.MZX                                                                    1      1      0      0      0
```

The path must be left-justified and the filename must end at or before column 92. Pad with spaces between the path and column 93.

To run multiple treatments from the same experiment:
```
/full/path/to/Maize/UFGA8201.MZX                                                                    1      1      0      0      0
/full/path/to/Maize/UFGA8201.MZX                                                                    2      1      0      0      0
/full/path/to/Maize/UFGA8201.MZX                                                                    3      1      0      0      0
```

To run treatments from different experiments:
```
/full/path/to/Maize/UFGA8201.MZX                                                                    1      1      0      0      0
/full/path/to/Maize/BRPI0202.MZX                                                                    1      1      0      0      0
```

#### Step 2.5: Batch File Validation

1. Verify every FileX path exists: `ls /full/path/to/Maize/UFGA8201.MZX`
2. Verify every treatment number exists within its FileX.
3. Verify no path exceeds 92 characters (count characters including the filename).
4. Verify the `$BATCH` header is present on the first non-comment line.

Tool reference: `create_batch_file` can automate batch file generation from a list of experiments and treatments.

### Step 3: Run the Model

#### Step 3.1: Run Modes

The model is invoked with:
```bash
./dscsm048 <RUNMODE> <BATCHFILE> [SIMCONTROL]
```

Or with explicit model specification:
```bash
./dscsm048 <MODEL> <RUNMODE> <BATCHFILE> [SIMCONTROL]
```

Source reference: `CSM.for` lines 140-199 define all run modes.

| Mode | Name            | Description                                                    | Batch File Required |
|------|-----------------|----------------------------------------------------------------|---------------------|
| A    | All treatments  | Runs all treatments in a single FileX                          | No (FileX on cmdline)|
| B    | Batch           | Runs treatments listed in batch file                           | Yes                 |
| N    | Seasonal        | Seasonal analysis (multi-year same treatment)                  | Yes                 |
| Q    | Sequence        | Rotation/sequence analysis (cycles through treatments)          | Yes                 |
| S    | Spatial         | Spatial analysis mode                                          | Yes                 |
| E    | Sensitivity     | Sensitivity analysis mode                                      | Yes                 |
| F    | Farm            | Farm model simulation                                          | Yes                 |
| C    | Command line    | Single treatment from command line                             | No                  |
| G    | Gencalc         | Genetic coefficient calculator (command line)                  | No                  |
| T    | Gencalc batch   | Genetic coefficient calculator (batch)                         | Yes                 |
| Y    | Yield forecast  | Yield forecasting mode                                         | Yes                 |
| I    | Interactive     | Interactive mode (GUI-driven)                                  | No                  |
| D    | Debug           | Debug mode (reads temp file directly)                          | No                  |
| L    | Locus           | Gene-based model                                               | Yes                 |

**Most common usage**: Mode `B` with a batch file:
```bash
./dscsm048 B DSSBatch.v48
```

**Run all treatments in one experiment**:
```bash
./dscsm048 A UFGA8201.MZX
```

**Run a specific treatment from command line**:
```bash
./dscsm048 C UFGA8201.MZX 1
```

#### Step 3.2: Execute the Model

1. Change to the working directory where data files are located (or where you want output):
```bash
cd /path/to/working/directory
```

2. Run the model:
```bash
/path/to/build/dscsm048 B DSSBatch.v48
```

3. The model will produce output to the current working directory (not the directory where the executable or FileX is located).

4. Expected behavior: The model prints progress to stdout (treatment names, dates). Each treatment runs through the DYNAMIC state machine (see Step 4). The model exits when all treatments are complete.

#### Step 3.3: Verify Successful Execution

After the model finishes:

1. Check that `Summary.OUT` exists and has data lines:
```bash
wc -l Summary.OUT     # Should have header + one line per treatment
```

2. Check for errors:
```bash
cat MODEL.ERR 2>/dev/null   # Should not exist or be empty for clean run
cat ERROR.OUT 2>/dev/null   # Runtime errors
cat WARNING.OUT 2>/dev/null # Non-fatal warnings
```

3. Check that output files were created:
```bash
ls -la Summary.OUT Overview.OUT PlantGro.OUT SoilWat.OUT
```

### Step 4: Understand the DYNAMIC State Machine

The model processes each treatment through a sequence of phases defined as integer constants in `ModuleDefs.for` lines 67-77:

```fortran
INTEGER, PARAMETER ::
    RUNINIT  = 1,    ! One-time initialization for entire run
    INIT     = 2,    ! (Will replace RUNINIT & SEASINIT; not fully implemented)
    SEASINIT = 2,    ! Seasonal initialization
    RATE     = 3,    ! Daily rate calculations
    EMERG    = 3,    ! Used for some plant processes (same value as RATE)
    INTEGR   = 4,    ! Daily integration
    OUTPUT   = 5,    ! Write daily outputs
    SEASEND  = 6,    ! End-of-season summary
    ENDRUN   = 7     ! Close all files, final cleanup
```

#### Phase Execution Order

For a single treatment:
```
RUNINIT (1)  -->  Called once at start of run
  |
  v
SEASINIT (2) -->  Called once per season (initializes weather, soil, plant)
  |
  v
[Daily loop begins]
  |
  RATE (3)   -->  Calculate daily rates: weather -> soil -> SPAM -> plant
  |
  INTEGR (4) -->  Integrate state variables forward one day
  |
  OUTPUT (5) -->  Write daily output to PlantGro.OUT, SoilWat.OUT, etc.
  |
  [If harvest/end condition met] --> SEASEND (6) --> [exit daily loop]
  [Otherwise] --> [next day] --> RATE (3)
  |
  v
SEASEND (6)  -->  Write seasonal summary to Summary.OUT
  |
  v
[If more seasons/treatments] --> SEASINIT (2)
[If done] --> ENDRUN (7)
  |
  v
ENDRUN (7)   -->  Close all files, deallocate memory
```

#### Why This Matters

- If the model crashes during RATE (3), you may have partial PlantGro.OUT output but no Summary.OUT entry for that treatment.
- If the model crashes during SEASINIT (2), no daily output files will be created for that treatment.
- If the model finishes SEASEND (6) but crashes during ENDRUN (7), Summary.OUT will have data but output files may not be properly closed.

### Step 5: Monitor Execution and Diagnose Errors

#### Step 5.1: Check MODEL.ERR

The MODEL.ERR file contains detailed error descriptions for DSSAT error codes. The model looks for this file in the executable directory first, then in the standard DSSAT path (`ERROR.for` lines 62-72).

Error format in ERROR.OUT (the runtime error log):
```
*RUN-TIME ERRORS OUTPUT FILE
<experiment info>
ERRKEY  ERRNUM  FILE  LNUM
```

Common error codes:
- Error 42: Section not found in input file (e.g., `*INITI` section missing from FileX).
- Error 28: Batch file not found or cannot be opened.
- Error 26: `$BATCH` header not found in batch file or malformed treatment line.

#### Step 5.2: Check WARNING.OUT

WARNING.OUT contains non-fatal warnings (`Warning.for`). These do not stop the simulation but indicate potential issues.

Common warnings:
- Weather data missing for specific dates.
- Soil water content adjusted (clamped).
- Planting conditions not met on specified date.
- Nutrient balance warnings.

#### Step 5.3: Common Runtime Errors

| Error                                          | Cause                                                   | Diagnosis and Resolution                                       |
|------------------------------------------------|---------------------------------------------------------|----------------------------------------------------------------|
| `SIGFPE: Floating-point exception`             | Division by zero in a calculation                       | Check soil layers: zero thickness or zero BD causes this.      |
| `File not found` / `IOSTAT error`              | FileX, .SOL, .WTH, or cultivar file path is wrong      | Verify all paths; check for Fortran string truncation.         |
| Simulation stops with no output                | Fatal error during SEASINIT; check MODEL.ERR            | Open ERROR.OUT; look for the ERRKEY and ERRNUM.                |
| Simulation hangs indefinitely                  | Auto-planting cannot find suitable date                 | Widen planting window; check IPLTI switch; verify weather data covers the planting period. |
| `Summary.OUT` exists but has -99 for all values| Simulation ran but crop never emerged or matured        | Check PlantGro.OUT for stress factors; verify planting depth and cultivar. |
| `Section *XXXXX not found`                     | Required section missing from FileX                     | Add the missing section; see S3 for FileX structure.           |
| `Error in FILEIO`                              | Temporary IO file is corrupted or locked                | Delete DSSAT48.INP and re-run.                                 |
| Model runs but yield is 0                      | Crop failed; stress too high or wrong cultivar          | See S9 for output diagnosis procedures.                        |

#### Step 5.4: Debugging Strategies

1. **Run a single treatment first**: Before running a full batch, test with one treatment using mode `C`:
   ```bash
   ./dscsm048 C UFGA8201.MZX 1
   ```

2. **Enable verbose output**: Set IDETL='D' (detail) in the simulation controls section of FileX to get maximum output detail.

3. **Check intermediate file**: The model writes a temporary file `DSSAT48.INP` during execution. If the run fails, this file contains the parsed input data that can be inspected to see what the model actually read.

4. **Binary search for errors**: If a batch with many treatments fails, bisect the batch file to identify which treatment causes the error.

### Step 6: Post-Execution Cleanup

6.1. Output files are written to the current working directory. Move or rename them before running a new simulation, as DSSAT overwrites existing output files.

6.2. The temporary file `DSSAT48.INP` can be deleted after a successful run.

6.3. If running multiple experiments in sequence (not sequence mode), save output files between runs:
```bash
./dscsm048 B DSSBatch_exp1.v48
mkdir -p results/exp1 && mv *.OUT results/exp1/

./dscsm048 B DSSBatch_exp2.v48
mkdir -p results/exp2 && mv *.OUT results/exp2/
```

## Expected Outputs

| Output                  | Location                | Verification                                         |
|-------------------------|-------------------------|------------------------------------------------------|
| dscsm048 executable     | build/ directory        | File exists and is executable                        |
| DSSBatch.v48            | Working directory       | $BATCH header present; paths valid; treatments exist |
| Summary.OUT             | Working directory       | One data line per treatment; HWAH values present     |
| PlantGro.OUT            | Working directory       | Daily growth data for each treatment                 |
| SoilWat.OUT             | Working directory       | Daily soil water data                                |
| No MODEL.ERR/ERROR.OUT  | Working directory       | Absence indicates clean run                          |

## Validation Checks

1. **Compilation**: `dscsm048` executable exists and is newer than any source file modification time.
2. **Batch file format**: `$BATCH` header exists. All FileX paths resolve to existing files. Treatment numbers exist in their FileX. Path lengths <= 92 characters.
3. **Runtime**: `Summary.OUT` has the expected number of data lines (one per treatment). No `ERROR.OUT` file created. `WARNING.OUT` contains only benign warnings.
4. **Output completeness**: For each treatment in the batch, there is a corresponding entry in `Summary.OUT` with non-(-99) values for HWAH, ADAT, and MDAT (for crops that reach maturity).

Tool reference: `check_model_errors` can automate parsing of ERROR.OUT and WARNING.OUT.

## Common Pitfalls

| Pitfall                                        | Symptom                                                 | Resolution                                                   |
|------------------------------------------------|---------------------------------------------------------|--------------------------------------------------------------|
| Forgetting to recompile after code changes     | Source changes have no effect on simulation              | Run `make` in build directory before every run after edits   |
| Batch file path > 92 characters                | `File not found` error; Fortran string truncation        | Shorten directory path; move files closer to root            |
| Wrong run mode                                 | Unexpected behavior; model reads wrong input             | Verify mode letter matches intent (B for batch, N for seasonal)|
| Running cmake in source directory              | CMake fatal error about in-source builds                 | Always create and use a separate `build/` directory          |
| Missing DSSAT data files                       | Model cannot find .SOL, .WTH, or cultivar files          | Verify DSSATPRO.v48 paths; check file existence              |
| Output files from previous run overwritten     | Lost results from earlier simulation                     | Save/rename output files before each new run                 |
| Compilation with wrong gfortran version        | Mysterious compilation errors; type mismatch warnings    | Use gfortran >= 7.0; check with `gfortran --version`        |
| Running model from wrong working directory     | Files not found; output written to unexpected location   | cd to the data directory before running the executable       |
| DSSAT48.INP locked from previous crashed run   | Model cannot write temporary file                        | Delete DSSAT48.INP manually and re-run                       |
| Batch file missing blank line at end           | Last treatment may not be read                           | Add a blank line after the last treatment entry              |

Files in this skill

  • REFERENCES.md1.3 KB
  • format_spec.yaml81.4 KB
  • papers.json7.9 KB
  • phase2_knowledge_classification.md14 KB
  • s1_experiment_design_skill.md21.1 KB
  • s2_weather_prep_skill.md16.6 KB
  • s3_soil_setup_skill.md19.5 KB
  • s4_genotype_config_skill.md23.7 KB
  • s5_simulation_controls_skill.md28.4 KB
  • s6_initial_conditions_skill.md16 KB
  • s7_management_spec_skill.md30.2 KB
  • s8_batch_execution_skill.md21.6 KB
  • s9_output_parsing_skill.md26.9 KB
  • validation_convention.yaml32.2 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…