Skip to content
Back to skills

Docs

ASecurity

> **Stage ID**: s10_water_productivity > **Pipeline order**: 10 of 10 > **Depends on**: s9_output_analysis

  • 231 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 11, 2026
toolspythongo

Works with

  • cli

Security analysis

A100/100

Pro scans all 16 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/badge)](https://www.skillsdirectory.com/skills/lzwei196-docs)

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
# Water Productivity Analysis -- Skill Document

> **Stage ID**: s10_water_productivity
> **Pipeline order**: 10 of 10
> **Depends on**: s9_output_analysis

## Purpose

Compute crop water productivity (CWP), irrigation water use efficiency (IWUE), and water footprint metrics. Perform deficit irrigation optimization by comparing multiple irrigation scenarios. This is AquaCrop's **unique analytical capability** -- the reason to choose AquaCrop over DSSAT or WOFOST when the research question is about water management.

AquaCrop uses normalized water productivity (WP*) to convert transpiration into biomass, making it the most theoretically rigorous crop model for water productivity analysis. The WP* parameter is nearly constant across environments for a given crop, which enables meaningful cross-site comparison of water use efficiency.

## Prerequisites

- [ ] Model executed and outputs extracted (S8-S9 complete)
- [ ] For optimization: ability to run multiple scenarios (~30 seconds per scenario)

## Inputs

| Input | Type | Source | Description |
|-------|------|--------|-------------|
| final_stats | DataFrame | S9 | Seasonal yield summary |
| water_flux | DataFrame | S9 | Daily water balance components |
| crop_growth | DataFrame | S9 | Daily biomass and yield |
| weather_df | DataFrame | S3 | For re-running scenarios |
| soil | Soil | S2 | For re-running scenarios |
| crop | Crop | S1 | For re-running scenarios |

## Procedure

### Step 1: Compute seasonal water balance components

```python
# Group daily fluxes by season
seasonal = water_flux.groupby('season_counter').agg({
    'Es': 'sum',           # Total soil evaporation (mm)
    'Tr': 'sum',           # Total crop transpiration (mm)
    'IrrDay': 'sum',       # Total irrigation (mm)
    'Runoff': 'sum',       # Total runoff (mm)
    'DeepPerc': 'sum',     # Total deep percolation (mm)
}).reset_index()

seasonal['ET'] = seasonal['Es'] + seasonal['Tr']        # Total ET
seasonal['Precip'] = water_flux.groupby('season_counter')['Infl'].sum() + \
                     water_flux.groupby('season_counter')['Runoff'].sum()  # Approx
```

### Step 2: Compute Crop Water Productivity (CWP)

```python
# CWP = Yield / ET (kg/m3)
# Note: 1 mm water over 1 m2 = 1 liter = 0.001 m3
# So: 1 mm = 1 L/m2, and yield in kg/ha = yield * 10000 m2/ha
# CWP (kg/m3) = (yield_kg_ha / 10000) / (ET_mm / 1000) = yield_kg / (ET_mm * 10)
# Simplified: CWP = yield_tonne_ha * 1000 / ET_mm

yield_kg = final_stats['Dry yield (tonne/ha)'].values * 1000  # kg/ha
et_mm = seasonal['ET'].values

cwp = yield_kg / (et_mm * 10)  # kg/m3
# Or equivalently:
cwp = final_stats['Dry yield (tonne/ha)'].values / (et_mm / 1000)  # tonne/1000m3 = kg/m3
```

### Step 3: Compute Irrigation Water Use Efficiency (IWUE)

```python
# IWUE = (Yield_irrigated - Yield_rainfed) / Irrigation
# Requires running both rainfed and irrigated scenarios

# Or simpler: IWUE = Yield / Irrigation
irr_mm = seasonal['IrrDay'].values
iwue = yield_kg / (irr_mm * 10)  # kg/m3 (only when irrigation > 0)
```

### Step 4: Compute Water Footprint

```python
# WF = ET / Yield (m3/tonne)
wf_green = seasonal['Tr'].values * 10 / (yield_kg / 1000)   # m3/tonne (from transpiration)
wf_blue = seasonal['IrrDay'].values * 10 / (yield_kg / 1000)  # m3/tonne (from irrigation)
wf_total = (seasonal['ET'].values * 10) / (yield_kg / 1000)  # m3/tonne total
```

### Step 5: Deficit irrigation optimization

```python
# Sweep SMT thresholds from 0 (rainfed) to 100 (full irrigation)
import pandas as pd
from aquacrop import AquaCropModel, IrrigationManagement

results = []
for smt in range(0, 101, 5):  # 21 scenarios
    irr = IrrigationManagement(irrigation_method=1, SMT=[smt]*4)
    model = AquaCropModel(
        sim_start_time, sim_end_time, weather_df,
        soil, crop, iwc, irrigation_management=irr
    )
    model.run_model(till_termination=True)
    stats = model.get_simulation_results()
    flux = model.get_water_flux()

    et = flux['Es'].sum() + flux['Tr'].sum()
    irr_total = flux['IrrDay'].sum()
    yld = stats['Dry yield (tonne/ha)'].iloc[0]

    results.append({
        'SMT': smt,
        'Yield_tha': yld,
        'ET_mm': et,
        'Irrigation_mm': irr_total,
        'CWP_kg_m3': yld * 1000 / (et * 10) if et > 0 else 0,
        'IWUE_kg_m3': (yld * 1000) / (irr_total * 10) if irr_total > 0 else float('inf'),
    })

df_opt = pd.DataFrame(results)
```

### Step 6: Identify optimal strategy

The optimal deficit irrigation strategy maximizes CWP or IWUE while meeting a minimum yield target:

```python
# Find SMT that maximizes CWP:
optimal_cwp = df_opt.loc[df_opt['CWP_kg_m3'].idxmax()]

# Find SMT that achieves 90% of full-irrigation yield with minimum water:
full_yield = df_opt.loc[df_opt['SMT'] == 100, 'Yield_tha'].values[0]
target = 0.90 * full_yield
viable = df_opt[df_opt['Yield_tha'] >= target]
optimal_deficit = viable.loc[viable['Irrigation_mm'].idxmin()]
```

### Step 7: Generate comparison report

Run tool `compare_irrigation_scenarios` which produces:
- Table of scenarios (yield, ET, irrigation, CWP, IWUE)
- Yield vs irrigation curve
- Water productivity frontier plot

## Expected Outputs

| Output | Path | Verification |
|--------|------|--------------|
| WP metrics | stdout JSON / CSV | CWP > 0 for all seasons with yield > 0 |
| Optimization results | outputs/{run}/aquacrop/deficit_optimization.csv | Contains all tested SMT scenarios |
| Scenario comparison | outputs/{run}/aquacrop/scenario_comparison.csv | Rainfed + full + deficit scenarios |

## Validation Checks

1. **CWP range**: Typical values 0.5-3.0 kg/m3 for grain crops
   - Maize: 1.5-2.5, Wheat: 0.8-1.5, Rice: 0.6-1.1, Soybean: 0.5-0.8
   - If outside range: check yield and ET computations

2. **Diminishing returns**: Yield should increase with SMT but with diminishing marginal return
   - If yield decreases with more irrigation: possible waterlogging. See dt_008.

3. **Water footprint**: Typical 500-2000 m3/tonne for grain crops
   - If very high: low yield or high evaporation environment

## Common Pitfalls

> **PITFALL**: Wrong unit conversion for CWP
> CWP = kg yield per m3 water. Common error: forgetting to convert mm to m3/m2 (1 mm = 0.001 m3/m2 = 1 L/m2) and tonne/ha to kg/m2 (1 tonne/ha = 0.1 kg/m2).
> **Do this instead**: CWP (kg/m3) = yield(tonne/ha) * 1000 / (ET(mm) * 10)

> **PITFALL**: Comparing CWP across sites without normalization
> Raw CWP varies with climate (higher ET0 = lower CWP even for same crop). AquaCrop's WP* is already normalized for ET0 and CO2, making cross-site comparison valid at the model level. But computed CWP from outputs is NOT normalized.
> **Do this instead**: Report both raw CWP and the model's internal WP* parameter.

> **PITFALL**: Ignoring evaporation in water productivity
> Es (soil evaporation) is a loss that does not contribute to yield. True crop water productivity should use only Tr (transpiration), not total ET.
> **Do this instead**: Report both ET-based CWP and Tr-based CWP separately.

---

*This skill document is part of the aquacrop-ospy-knowledge infrastructure.*
*Stage 10 of 10 | Tools used: compute_water_productivity, optimize_deficit_irrigation, compare_irrigation_scenarios | Related triplets: dt_008*

Files in this skill

  • REFERENCES.md1.6 KB
  • format_spec.yaml35.8 KB
  • model_couplings.yaml13.5 KB
  • papers.json4.9 KB
  • s10_water_productivity_skill.md7.1 KB
  • s1_crop_selection_skill.md4.5 KB
  • s2_soil_profile_skill.md4 KB
  • s3_weather_prep_skill.md5.7 KB
  • s4_initial_conditions_skill.md3.4 KB
  • s5_irrigation_skill.md5.7 KB
  • s6_field_management_skill.md2.9 KB
  • s7_model_assembly_skill.md4 KB
  • s8_execution_skill.md3.3 KB
  • s9_output_analysis_skill.md5.3 KB
  • validation_convention.yaml23 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.

View all in tools →

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.