Skip to content
Back to skills

Docs

ASecurity

> **Stage ID**: s4_parameter_config > **Pipeline order**: 4 of 6 > **Depends on**: s1_basin_setup, s3_module_selection

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

Security analysis

A100/100

Pro scans all 12 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: A — Skills Directory](https://www.skillsdirectory.com/api/skills/lzwei196-docs-27effeab/badge)](https://www.skillsdirectory.com/skills/lzwei196-docs-27effeab)

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
# Parameter Configuration -- Skill Document

> **Stage ID**: s4_parameter_config
> **Pipeline order**: 4 of 6
> **Depends on**: s1_basin_setup, s3_module_selection

## Purpose

Set module parameters in the .prj project file for each HRU. CRHM parameters control the physics of every module: blowing snow fetch distances, soil hydraulic conductivity, vegetation height, infiltration state, and routing coefficients. Each parameter has a declared valid range (e.g., `<0.001 to 100.0>`). Parameters outside this range are silently clamped to the boundary value -- CRHM does NOT warn you. This is a dangerous silent error: you think you set fetch=50000m but CRHM uses max=10000m.

## Prerequisites

- [ ] HRU configuration complete (hru_config.json from s1)
- [ ] Module chain selected (modules.json from s3)
- [ ] Observation file created (basin.obs from s2)
- [ ] Python environment activated

## Inputs

| Input | Type | Source | Description |
|-------|------|--------|-------------|
| hru_config | file | s1_basin_setup | HRU definitions |
| module_chain | file | s3_module_selection | Module chain JSON |
| obs_path | file | s2_observation_data | Observation file |
| start_date | string | User configuration | Start date "YYYY M D" |
| end_date | string | User configuration | End date "YYYY M D" |

## Procedure

### Step 1: Generate initial .prj file

```bash
python tools/s4_parameter_config/create_prj_file.py \
  --hru_config outputs/<run>/crhm/hru/hru_config.json \
  --module_chain outputs/<run>/crhm/modules.json \
  --obs_path outputs/<run>/crhm/obs/basin.obs \
  --start_date "<YYYY> <M> <D>" \
  --end_date "<YYYY> <M> <D>" \
  --output_path outputs/<run>/crhm/basin.prj
```

**Expected result**: .prj file with all sections populated.

**If this fails**: See dt_005 (parameter format error) or dt_013 (section delimiter error).

### Step 2: Review critical parameters

These parameters have the highest impact on cold regions simulation quality:

**PBSM (Blowing Snow)**:
| Parameter | Description | Typical Range | Critical Because |
|-----------|-------------|---------------|------------------|
| fetch | Fetch distance (m) | 300-3000 | Controls snow transport rate. Too high = too much drift |
| Ht | Vegetation height (m) | 0.01-20 | Traps blowing snow. Stubble vs forest |
| distrib | Distribution factor | 0-5 | Controls drift pattern |

**SnobalCRHM (Energy Balance Melt)**:
| Parameter | Description | Typical Range | Critical Because |
|-----------|-------------|---------------|------------------|
| T_g | Ground temperature (C) | -4 to 0 | Bottom boundary of snowpack energy balance |
| z_u | Wind measurement height (m) | 2-10 | Turbulent exchange coefficient |
| max_z_s_0 | Max active layer depth (m) | 0.05-0.5 | Snowpack thermal layering |

**PrairieInfil (Frozen Soil)**:
| Parameter | Description | Values | Critical Because |
|-----------|-------------|--------|------------------|
| fallstat | Fall moisture condition | 0-3 (dry to saturated) | Determines how much water can infiltrate frozen soil |
| major | Major melt event index | 0-5 | Controls infiltration during peak melt |

**Soil**:
| Parameter | Description | Typical Range | Critical Because |
|-----------|-------------|---------------|------------------|
| soil_Depth | Total soil depth (m) | 0.5-5 | Total water storage capacity |
| soil_rechr_max | Recharge zone max (mm) | 20-200 | Shallow soil responsiveness |
| soil_moist_max | Total moisture max (mm) | 50-1000 | Overall storage |

### Step 3: Adjust HRU-specific parameters

For parameters marked `per_hru: true`, provide one value per HRU. The order MUST match the HRU order in hru_config.json. Values are space-separated, with line breaks every 16 values for readability.

Example for nhru=5:
```
PBSM fetch <10 to 10000>
1500.0 1500.0 200.0 50.0 30.0
```
Here: HRU 1-2 are open prairie (1500m fetch), HRU 3 is shrub (200m), HRU 4-5 are forest (50-30m).

### Step 4: Validate the .prj file

```bash
python tools/s4_parameter_config/validate_prj.py \
  --prj_path outputs/<run>/crhm/basin.prj
```

**Expected result**: Status "PASS", no errors.

**If this fails**: See dt_005 (range violation), dt_013 (format error).

### Step 5: Set output variables (Display_Variable section)

Choose which variables to output. Critical cold regions diagnostics:
- **SWE**: Snow water equivalent (mm) -- the primary state variable
- **snowmelt**: Daily snowmelt depth (mm)
- **Subl**: Sublimation (mm) -- canopy + surface
- **drift_in, drift_out**: Blowing snow transport between HRUs (mm)
- **infil**: Infiltration into soil (mm)
- **runoff**: Surface runoff (mm)
- **soil_moist**: Soil moisture storage (mm)
- **WS_outflow**: Watershed outlet discharge (m3/s)

## Expected Outputs

| Output | Path | Verification |
|--------|------|--------------|
| .prj file | `outputs/{run}/crhm/basin.prj` | validate_prj passes, all sections present |

## Validation Checks

1. **All required sections present**: Dimensions, Observations, Dates, Modules, Parameters
   - Command: `validate_prj.py --prj_path basin.prj`
   - Expected: PASS
   - If missing sections: See dt_013.

2. **Parameter values within ranges**: No value outside declared <min to max>
   - Command: validate_prj reports n_param_range_errors
   - Expected: 0
   - If violations: Fix values. CRHM silently clamps. See dt_006.

3. **Parameter count matches nhru**: Per-HRU params must have exactly nhru values
   - If mismatch: CRHM reads wrong values for HRUs. See dt_005.

4. **Observation file accessible**: Path in Observations section resolves
   - If not found: Use absolute path or --obs_file_directory. See dt_007.

5. **Date range within observation period**: Start/end must be covered by .obs file
   - If outside: CRHM may crash or read garbage data.

## Common Pitfalls

> **PITFALL**: Parameter values silently clamped to range boundaries
> CRHM clamps parameter values to the declared <min to max> range WITHOUT warning. If you set fetch=50000 but the max is 10000, CRHM uses 10000. Your parameter file looks correct but the model runs with different values than you intended.
> **Do this instead**: Always run validate_prj.py which checks all values against declared ranges. Treat any range violation as an error.
> See diagnostic triplet dt_006.

> **PITFALL**: Wrong number of parameter values for nhru
> If nhru=10 but you provide only 5 values for a per-HRU parameter, CRHM may read into the next parameter's values or crash with a cryptic error.
> **Do this instead**: Always provide exactly nhru values for per-HRU parameters. Use create_prj_file.py which auto-generates the correct count from hru_config.json.
> See diagnostic triplet dt_005.

> **PITFALL**: Section delimiter "######" must be exact
> The .prj format uses exactly 6 hash characters "######" as section delimiters. Using "#####" (5) or "#######" (7) causes CRHM to misparse the file. Section names must be on the line AFTER the delimiter, not the same line.
> **Do this instead**: Use create_prj_file.py which generates correct delimiters. If editing manually, count the hashes.
> See diagnostic triplet dt_013.

> **PITFALL**: Fetch distance wrong for landscape type
> Prairie fetch should be 300-3000m (wind travels far). Forest fetch should be 10-100m (trees block wind). Using prairie fetch values in forest HRUs produces massive unrealistic blowing snow transport.
> **Do this instead**: Set fetch based on land cover class. create_prj_file.py uses hru_config.json land cover to set appropriate defaults.

---

*This skill document is part of the hydrocraft-crhm knowledge infrastructure.*
*Stage 4 of 6 | Tools used: create_prj_file, validate_prj | Related triplets: dt_005, dt_006, dt_007, dt_013*

Files in this skill

  • REFERENCES.md1.4 KB
  • format_spec.yaml43.2 KB
  • papers.json5.4 KB
  • phase2_knowledge_classification.md4.4 KB
  • s1_basin_setup_skill.md5.2 KB
  • s2_observation_data_skill.md6.8 KB
  • s3_module_selection_skill.md7 KB
  • s4_parameter_config_skill.md7.5 KB
  • s5_execution_skill.md6.4 KB
  • s6_vic_coupling_skill.md8 KB
  • validation_convention.yaml21.6 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…