<aside> 📘
Tutorial 2 of the Kalix tutorial series. You'll take the model from Tutorial 1 and rewrite its rainfall input as a weighted combination of three gauge stations, then compare runs side-by-side in the Run Manager. Expected time: about 15 minutes.
</aside>
The same Stringybark Creek catchment from Tutorial 1, but with the rainfall input rebuilt from three rain gauge stations instead of a single areal-rainfall series. The new rain is constructed inside the model file using a Kalix expression — a piece of arithmetic that combines data references and literal numbers.

002/ folder from the KalixTutorials repository. You'll need:
rain_north.csv, rain_central.csv, rain_south.csv — daily rainfall at three stations around the catchment (mm/day)climate_data.csv — same file as Tutorial 1; we'll only use the pet_mm column this timeobserved.csv — same as Tutorial 1Put all five CSVs in the same folder. We'll build the new model file (stringybark_expressions.ini) alongside them.
In Tutorial 1 you wrote rain = data.climate_data_csv.by_name.rain_mm — a direct reference to a single column. But that = is more powerful than it looks. Most node properties that accept data actually accept a mathematical expression rather than just a simple data reference.
The expression language is rich. It includes:
data.<file>_csv.by_name.<column>, exactly as in Tutorial 10.5, 1.1, 3.14+, -, *, /, ^ (power), with parentheses for groupingif(condition, true_value, false_value) with comparison operators (<, >, ==, …)max, min, abs, sqrt, pow, log, sin, floor, and many moresim.* namespace exposes the current simulation date (sim.year, sim.month, sim.day, …), useful for time-of-year switchingA few quick examples to make this concrete:
rain = 1.1 * data.climate_data_csv.by_name.rain_mm — scale rainfall up by 10% to simulate a wetter climate scenario.