WTR-CONS
Water Consumption Calculator
1. Identity
Depends on module:
Purpose
Computes water consumption (water that is withdrawn and not returned to the same source in the same quality and timeframe) in canonical units, aligned with ESRS-style water accounting.
This engine is intentionally separate from:
MEID_CALC_WATER_AGGR(withdrawal)MEID_CALC_WATER_DISC(discharge)
because “consumption” is frequently derived and method-dependent.
Typical usage
- Water consumption absolute (m³)
- Consumption by source (where traceable)
- Input to intensity, stress-area allocation, and risk scoring
2. Contract References (ZAR)
2.1 Input Schema
ZAR Address: schema.compute.water.consumption.inputs.v1_0_0
Required conceptual fields (v1 supports two calculation modes):
mode:DIRECT|DERIVED(defaultDERIVED)alignment:BY_YEAR|BY_INDEX(defaultBY_YEAR)
Mode A — DIRECT
consumption_items: list of consumption records (already measured/estimated)
Each consumption item includes:
periodvalueunit- optional:
source,site_id,basin_id,quality
Mode B — DERIVED
withdrawal: scalar or time-series (or by-source map)discharge: scalar or time-series (or by-source map)- optional:
other_losses: scalar or time-series (evaporation, product-embedded water, etc.)
In DERIVED mode, consumption is computed from a mass-balance relationship.
2.2 Options Schema
ZAR Address: schema.compute.water.consumption.options.v1_0_0
Common options:
unit_output: defaultm3negative_consumption_policy:ERROR|FLOOR_AT_ZERO|ALLOW_WITH_FLAG(defaultFLOOR_AT_ZERO)missing_policy:ERROR|SKIPsource_normalization:STRICT|LENIENT(defaultSTRICT)rounding: optional digits
2.3 Output Schema
ZAR Address: schema.compute.water.consumption.output.v1_0_0
Outputs include:
- optional (if inputs allow by-source derivation)
metadata(mode used, floors/flags, unit conversions, coverage)
3. Accepted Input Shapes
A. DIRECT mode (measured / estimated consumption)
{
"mode": "DIRECT",
"consumption_items": [
{ "period": 2025, "value": 15000, "unit": "m3", "source": "surface_water" },
{ "period": 2025, "value": 2000, "unit": "m3", "source": "groundwater" }
],
"alignment": "BY_YEAR"
}
B. DERIVED mode (withdrawal - discharge + losses) — preferred for most orgs
{
"mode": "DERIVED",
"withdrawal": [[2025, 125000], [2026, 120000]],
"discharge": [[2025, 108000], [2026, 105000]],
"other_losses": [[2025, 2000], [2026, 1500]],
"alignment": "BY_YEAR"
}
C. DERIVED by source (when source tagging exists)
{
"mode": "DERIVED",
"withdrawal_by_source": {
"surface_water": [[2025, 100000]],
"groundwater": [[2025, 25000]]
},
"discharge_by_source": {
"surface_water": [[2025, 90000]],
"groundwater": [[2025, 18000]]
},
"alignment": "BY_YEAR"
}
All supported shapes MUST be normalized internally to:
- Total series:
Map<period, withdrawal_m3>, Map<period, discharge_m3>, Map<period, losses_m3>
- Optional by-source maps where provided
4. Compute Semantics (Normative)
Let:
- be withdrawal volume in period
- be discharge volume in period
- be other losses in period (default 0 if not provided)
4.1. DIRECT mode
If mode = DIRECT, total consumption is:
Where is the set of consumption items in period .
If source breakdown is present:
4.2. DERIVED mode (mass-balance)
If mode = DERIVED, consumption is computed as:
If by-source inputs exist (and are aligned):
If is not available, it defaults to 0 for that source.
4.3. Negative consumption handling
If computed consumption is negative:
ERROR: failFLOOR_AT_ZERO(default):
- ALLOW_WITH_FLAG: allow negatives but flag in metadata
All negative events MUST be recorded in metadata:
negative_periodsfloored_periods_count(if floored)
5. Alignment Rules
BY_YEAR
- Withdrawal, discharge, and losses must share period keys unless
missing_policy = SKIP.
BY_INDEX
- Ordered alignment; length mismatch handled per
missing_policy.
Metadata MUST include:
aligned_periodsmissing_in_withdrawalmissing_in_dischargemissing_in_losses
6. Validation & Error Model
Invariants
- Values must be finite
- Units must be convertible to
unit_output - mode must be declared or defaulted
- DERIVED mode requires withdrawal and discharge
Error codes (suggested)
WATER_CONS_MISSING_INPUTWATER_CONS_INVALID_MODEWATER_CONS_UNIT_CONVERSION_FAILEDWATER_CONS_ALIGNMENT_MISMATCHWATER_CONS_NEGATIVE_CONSUMPTION_ERRORWATER_CONS_NON_FINITE_VALUE
Errors MUST include:
- engine
cmi_short_code - period context and (if applicable) source key
7. Dependencies
MEID_CALC_WATER_CONS depends on:
- schema resolver (ZAR)
- unit conversion capability (delegated)
- upstream availability of withdrawal/discharge (often from
MEID_CALC_WATER_AGGRandMEID_CALC_WATER_DISC)
Declared via ZAR dependencies.
8. Federation & Audit Requirements
To reproduce water consumption externally, the export MUST include:
- engine identity (
cmiorzar_code) - engine build proof (
execution_ref+ buil`d_hash) - input/options/output schemas used
- whether DIRECT or DERIVED mode was used
- all input series (withdrawal, discharge, losses) or consumption items
- negative handling policy applied and evidence of floors/flags
Provenance chain MUST show:
… → MEID_CALC_WATER_CONS → …
with cmi_short_code recorded in USO tail arrays.
9. Performance Notes
- Complexity: over periods (or in DIRECT mode)
- Memory:
- Suitable for batch reporting and KPI analytics
10. Methods Served (v1)
Water.consumption.absWater.consumption.by_source.abs(if inputs permit)Water.consumption.total.abs