From 80e6d5e7ae0b784825056155db48d05c10e663f4 Mon Sep 17 00:00:00 2001 From: Christiaan Meijer Date: Mon, 15 Sep 2025 11:19:38 +0200 Subject: [PATCH 01/14] add root_dynamics test files and test stubs --- .../physical_models/crop/root_dynamics.py | 313 ++++ .../crop/test_root_dynamics.py | 333 ++++ .../test_data/WOFOST_Root_Dynamics.conf | 32 + .../test_rootdynamics_wofost72_01.yaml | 1333 +++++++++++++++++ 4 files changed, 2011 insertions(+) create mode 100644 src/diffwofost/physical_models/crop/root_dynamics.py create mode 100644 tests/physical_models/crop/test_root_dynamics.py create mode 100644 tests/physical_models/test_data/WOFOST_Root_Dynamics.conf create mode 100644 tests/physical_models/test_data/test_rootdynamics_wofost72_01.yaml diff --git a/src/diffwofost/physical_models/crop/root_dynamics.py b/src/diffwofost/physical_models/crop/root_dynamics.py new file mode 100644 index 0000000..35a5402 --- /dev/null +++ b/src/diffwofost/physical_models/crop/root_dynamics.py @@ -0,0 +1,313 @@ +# -*- coding: utf-8 -*- +# Code adapted from PCSE (Python Crop Simulation Environment) +# Copyright (c) 2004-2024 Wageningen Environmental Research, Wageningen-UR +# Allard de Wit (allard.dewit@wur.nl), March 2024 + +from pcse.traitlets import Float, Int, Instance +from pcse.decorators import prepare_rates, prepare_states +from pcse.util import limit, merge_dict, AfgenTrait +from pcse.base import ParamTemplate, StatesTemplate, RatesTemplate, \ + SimulationObject, VariableKiosk + + + +class WOFOST_Root_Dynamics(SimulationObject): + """Root biomass dynamics and rooting depth. + + Root growth and root biomass dynamics in WOFOST are separate processes, + with the only exception that root growth stops when no more biomass is sent + to the root system. + + Root biomass increase results from the assimilates partitioned to + the root system. Root death is defined as the current root biomass + multiplied by a relative death rate (`RDRRTB`). The latter as a function + of the development stage (`DVS`). + + Increase in root depth is a simple linear expansion over time until the + maximum rooting depth (`RDM`) is reached. + + **Simulation parameters** + + ======= ============================================= ======= ============ + Name Description Type Unit + ======= ============================================= ======= ============ + RDI Initial rooting depth SCr cm + RRI Daily increase in rooting depth SCr |cm day-1| + RDMCR Maximum rooting depth of the crop SCR cm + RDMSOL Maximum rooting depth of the soil SSo cm + TDWI Initial total crop dry weight SCr |kg ha-1| + IAIRDU Presence of air ducts in the root (1) or SCr - + not (0) + RDRRTB Relative death rate of roots as a function TCr - + of development stage + ======= ============================================= ======= ============ + + + **State variables** + + ======= ================================================= ==== ============ + Name Description Pbl Unit + ======= ================================================= ==== ============ + RD Current rooting depth Y cm + RDM Maximum attainable rooting depth at the minimum N cm + of the soil and crop maximum rooting depth + WRT Weight of living roots Y |kg ha-1| + DWRT Weight of dead roots N |kg ha-1| + TWRT Total weight of roots Y |kg ha-1| + ======= ================================================= ==== ============ + + **Rate variables** + + ======= ================================================= ==== ============ + Name Description Pbl Unit + ======= ================================================= ==== ============ + RR Growth rate root depth N cm + GRRT Growth rate root biomass N |kg ha-1 d-1| + DRRT Death rate root biomass N |kg ha-1 d-1| + GWRT Net change in root biomass N |kg ha-1 d-1| + ======= ================================================= ==== ============ + + **Signals send or handled** + + None + + **External dependencies:** + + ======= =================================== ================= ============ + Name Description Provided by Unit + ======= =================================== ================= ============ + DVS Crop development stage DVS_Phenology - + DMI Total dry matter CropSimulation |kg ha-1 d-1| + increase + FR Fraction biomass to roots DVS_Partitioning - + ======= =================================== ================= ============ + """ + """ + IMPORTANT NOTICE + Currently root development is linear and depends only on the fraction of assimilates + send to the roots (FR) and not on the amount of assimilates itself. This means that + roots also grow through the winter when there is no assimilation due to low + temperatures. There has been a discussion to change this behaviour and make root growth + dependent on the assimilates send to the roots: so root growth stops when there are + no assimilates available for growth. + + Finally, we decided not to change the root model and keep the original WOFOST approach + because of the following reasons: + - A dry top layer in the soil could create a large drought stress that reduces the + assimilates to zero. In this situation the roots would not grow if dependent on the + assimilates, while water is available in the zone just below the root zone. Therefore + a dependency on the amount of assimilates could create model instability in dry + conditions (e.g. Southern-Mediterranean, etc.). + - Other solutions to alleviate the problem above were explored: only put this limitation + after a certain development stage, putting a dependency on soil moisture levels in the + unrooted soil compartment. All these solutions were found to introduce arbitrary + parameters that have no clear explanation. Therefore all proposed solutions were discarded. + + We conclude that our current knowledge on root development is insufficient to propose a + better and more biophysical approach to root development in WOFOST. + """ + + class Parameters(ParamTemplate): + RDI = Float(-99.) + RRI = Float(-99.) + RDMCR = Float(-99.) + RDMSOL = Float(-99.) + TDWI = Float(-99.) + IAIRDU = Float(-99) + RDRRTB = AfgenTrait() + + class RateVariables(RatesTemplate): + RR = Float(-99.) + GRRT = Float(-99.) + DRRT = Float(-99.) + GWRT = Float(-99.) + + class StateVariables(StatesTemplate): + RD = Float(-99.) + RDM = Float(-99.) + WRT = Float(-99.) + DWRT = Float(-99.) + TWRT = Float(-99.) + + def initialize(self, day, kiosk, parvalues): + """ + :param day: start date of the simulation + :param kiosk: variable kiosk of this PCSE instance + :param parvalues: `ParameterProvider` object providing parameters as + key/value pairs + """ + + self.params = self.Parameters(parvalues) + self.rates = self.RateVariables(kiosk, publish=["DRRT", "GRRT"]) + self.kiosk = kiosk + + # INITIAL STATES + params = self.params + # Initial root depth states + rdmax = max(params.RDI, min(params.RDMCR, params.RDMSOL)) + RDM = rdmax + RD = params.RDI + # initial root biomass states + WRT = params.TDWI * self.kiosk.FR + DWRT = 0. + TWRT = WRT + DWRT + + self.states = self.StateVariables(kiosk, publish=["RD","WRT", "TWRT"], + RD=RD, RDM=RDM, WRT=WRT, DWRT=DWRT, + TWRT=TWRT) + + @prepare_rates + def calc_rates(self, day, drv): + p = self.params + r = self.rates + s = self.states + k = self.kiosk + + # Increase in root biomass + r.GRRT = k.FR * k.DMI + r.DRRT = s.WRT * p.RDRRTB(k.DVS) + r.GWRT = r.GRRT - r.DRRT + + # Increase in root depth + r.RR = min((s.RDM - s.RD), p.RRI) + # Do not let the roots growth if partioning to the roots + # (variable FR) is zero. + if k.FR == 0.: + r.RR = 0. + + @prepare_states + def integrate(self, day, delt=1.0): + rates = self.rates + states = self.states + + # Dry weight of living roots + states.WRT += rates.GWRT + # Dry weight of dead roots + states.DWRT += rates.DRRT + # Total weight dry + living roots + states.TWRT = states.WRT + states.DWRT + + # New root depth + states.RD += rates.RR + + + @prepare_states + def _set_variable_WRT(self, nWRT): + """Updates the value of WRT to to the new value provided as input. + + Related state variables will be updated as well and the increments + to all adjusted state variables will be returned as a dict. + """ + states = self.states + + # Store old values of states + oWRT = states.WRT + oTWRT = states.TWRT + + # Apply new root weight and adjust total (dead + live) root weight + states.WRT = nWRT + states.TWRT = states.WRT + states.DWRT + + increments = {"WRT": states.WRT - oWRT, + "TWLRT": states.TWRT - oTWRT} + return increments + + + +class Simple_Root_Dynamics(SimulationObject): + """Simple class for linear root growth. + + Increase in root depth is a simple linear expansion over time until the + maximum rooting depth (`RDM`) is reached. + + **Simulation parameters** + + ======= ============================================= ======= ============ + Name Description Type Unit + ======= ============================================= ======= ============ + RDI Initial rooting depth SCr cm + RRI Daily increase in rooting depth SCr |cm day-1| + RDMCR Maximum rooting depth of the crop SCR cm + RDMSOL Maximum rooting depth of the soil SSo cm + ======= ============================================= ======= ============ + + + **State variables** + + ======= ================================================= ==== ============ + Name Description Pbl Unit + ======= ================================================= ==== ============ + RD Current rooting depth Y cm + RDM Maximum attainable rooting depth at the minimum N cm + of the soil and crop maximum rooting depth + ======= ================================================= ==== ============ + + **Rate variables** + + ======= ================================================= ==== ============ + Name Description Pbl Unit + ======= ================================================= ==== ============ + RR Growth rate root depth N cm + ======= ================================================= ==== ============ + + **Signals send or handled** + + None + + **External dependencies:** + + None + """ + + class Parameters(ParamTemplate): + """Traits-based class for storing rooting depth parameters + """ + RDI = Float(-99.) + RRI = Float(-99.) + RDMCR = Float(-99.) + RDMSOL = Float(-99.) + + class RateVariables(RatesTemplate): + RR = Float(-99.) + + class StateVariables(StatesTemplate): + RD = Float(-99.) + RDM = Float(-99.) + + def initialize(self, day, kiosk, parameters): + """ + :param day: start date of the simulation + :param kiosk: variable kiosk of this PCSE instance + :param parameters: ParameterProvider object with key/value pairs + """ + + self.params = self.Parameters(parameters) + self.rates = self.RateVariables(kiosk) + self.kiosk = kiosk + + # INITIAL STATES + params = self.params + + # Initial root depth states + rdmax = max(params.RDI, min(params.RDMCR, params.RDMSOL)) + RDM = rdmax + RD = params.RDI + + self.states = self.StateVariables(kiosk, publish=["RD"], + RD=RD, RDM=RDM) + @prepare_rates + def calc_rates(self, day, drv): + params = self.params + rates = self.rates + states = self.states + + # Increase in root depth + rates.RR = min((states.RDM - states.RD), params.RRI) + + @prepare_states + def integrate(self, day, delt=1.0): + rates = self.rates + states = self.states + + # New root depth + states.RD += rates.RR diff --git a/tests/physical_models/crop/test_root_dynamics.py b/tests/physical_models/crop/test_root_dynamics.py new file mode 100644 index 0000000..3754b9a --- /dev/null +++ b/tests/physical_models/crop/test_root_dynamics.py @@ -0,0 +1,333 @@ +import copy +from unittest.mock import patch +import pytest +import torch +import torch.testing +import yaml +from numpy.testing import assert_almost_equal +from pcse.base.parameter_providers import ParameterProvider +from pcse.engine import Engine +from pcse.models import Wofost72_PP +from diffwofost.physical_models.crop.root_dynamics import WOFOST_Root_Dynamics +from tests.physical_models.pcse_test_code import EngineTestHelper +from tests.physical_models.pcse_test_code import WeatherDataProviderTestHelper +from .. import phy_data_folder + + +def prepare_engine_input(file_path): + inputs = yaml.safe_load(open(file_path)) + agro_management_inputs = inputs["AgroManagement"] + cropd = inputs["ModelParameters"] + + weather_data_provider = WeatherDataProviderTestHelper(inputs["WeatherVariables"]) + crop_model_params_provider = ParameterProvider(cropdata=cropd) + external_states = inputs["ExternalStates"] + + # convert parameters to tensors + crop_model_params_provider.clear_override() + # The following line raises an error: + # parameter_names = [n for n in crop_model_params_provider.keys()] + # E TypeError: iter() returned non-iterator of type 'ParameterProvider' + # We therefore use the protected member instead + parameter_names = crop_model_params_provider._unique_parameters + for name in parameter_names: + value = torch.tensor(crop_model_params_provider[name], dtype=torch.float32) + crop_model_params_provider.set_override(name, value, check=False) + + # convert external states to tensors + tensor_external_states = [ + {k: v if k == "DAY" else torch.tensor(v, dtype=torch.float32) for k, v in item.items()} + for item in external_states + ] + return ( + crop_model_params_provider, + weather_data_provider, + agro_management_inputs, + tensor_external_states, + ) + + +def get_test_data(file_path): + inputs = yaml.safe_load(open(file_path)) + return inputs["ModelResults"], inputs["Precision"] + + +def get_test_diff_root_model(): + test_data_path = phy_data_folder / "test_rootdynamics_wofost72_01.yaml" + (crop_model_params_provider, weather_data_provider, agro_management_inputs, external_states) = ( + prepare_engine_input(test_data_path) + ) + config_path = str(phy_data_folder / "WOFOST_Root_Dynamics.conf") + return DiffRootDynamics( + copy.deepcopy(crop_model_params_provider), + weather_data_provider, + agro_management_inputs, + config_path, + copy.deepcopy(external_states), + ) + + +class DiffRootDynamics(torch.nn.Module): + def __init__( + self, + crop_model_params_provider, + weather_data_provider, + agro_management_inputs, + config_path, + external_states, + ): + super().__init__() + self.crop_model_params_provider = crop_model_params_provider + self.weather_data_provider = weather_data_provider + self.agro_management_inputs = agro_management_inputs + self.config_path = config_path + self.external_states = external_states + + def forward(self, params_dict): + # pass new value of parameters to the model + for name, value in params_dict.items(): + self.crop_model_params_provider.set_override(name, value, check=False) + + engine = EngineTestHelper( + self.crop_model_params_provider, + self.weather_data_provider, + self.agro_management_inputs, + self.config_path, + self.external_states, + ) + engine.run_till_terminate() + results = engine.get_output() + + return torch.stack( + [torch.stack([item["LAI"], item["TWLV"]]) for item in results] + ).unsqueeze(0) # shape: [1, time_steps, 2] + + +class TestRootDynamics: + def test_root_dynamics_with_testengine(self): + """EngineTestHelper and not Engine because it allows to specify `external_states`.""" + + # prepare model input + test_data_path = phy_data_folder / "test_rootdynamics_wofost72_01.yaml" + ( + crop_model_params_provider, + weather_data_provider, + agro_management_inputs, + external_states, + ) = prepare_engine_input(test_data_path) + config_path = str(phy_data_folder / "WOFOST_Root_Dynamics.conf") + + engine = EngineTestHelper( + crop_model_params_provider, + weather_data_provider, + agro_management_inputs, + config_path, + external_states, + ) + engine.run_till_terminate() + actual_results = engine.get_output() + + # get expected results from YAML test data + expected_results, expected_precision = get_test_data(test_data_path) + + assert len(actual_results) == len(expected_results) + + for reference, model in zip(expected_results, actual_results, strict=False): + assert reference["DAY"] == model["day"] + assert all( + abs(reference[var] - model[var]) < precision + for var, precision in expected_precision.items() + ) + + def test_root_dynamics_with_engine(self): + # prepare model input + test_data_path = phy_data_folder / "test_rootdynamics_wofost72_01.yaml" + (crop_model_params_provider, weather_data_provider, agro_management_inputs, _) = ( + prepare_engine_input(test_data_path) + ) + + config_path = str(phy_data_folder / "WOFOST_Root_Dynamics.conf") + + # Engine does not allows to specify `external_states` + with pytest.raises(ValueError): + Engine( + crop_model_params_provider, + weather_data_provider, + agro_management_inputs, + config_path, + ) + + def test_wofost_pp_with_root_dynamics(self): + # prepare model input + test_data_path = phy_data_folder / "test_potentialproduction_wofost72_01.yaml" + (crop_model_params_provider, weather_data_provider, agro_management_inputs, _) = ( + prepare_engine_input(test_data_path) + ) + + with patch("pcse.crop.root_dynamics.WOFOST_Root_Dynamics", WOFOST_Root_Dynamics): + model = Wofost72_PP( + crop_model_params_provider, weather_data_provider, agro_management_inputs + ) + model.run_till_terminate() + actual_results = model.get_output() + + # get expected results from YAML test data + expected_results, expected_precision = get_test_data(test_data_path) + + assert len(actual_results) == len(expected_results) + + for reference, model in zip(expected_results, actual_results, strict=False): + assert reference["DAY"] == model["day"] + assert all( + abs(reference[var] - model[var]) < precision + for var, precision in expected_precision.items() + ) + + +class TestDiffRootDynamicsTDWI: + def test_gradients_tdwi_lai_root_dynamics(self): + model = get_test_diff_root_model() + tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float32)) + output = model({"TDWI": tdwi}) + lai = output[0, :, 0] + loss = lai.sum() + + # this is ∂loss/∂tdwi without calling loss.backward(). + # this is called forward gradient here because it is calculated without backpropagation. + grads = torch.autograd.grad(loss, tdwi, retain_graph=True)[0] + + assert grads is not None, "Gradients for TDWI should not be None" + torch.testing.assert_close( + grads, torch.tensor(0.0013, dtype=torch.float32), rtol=1e-4, atol=1e-4 + ) + + tdwi.grad = None # clear any existing gradient + loss.backward() + + # this is ∂loss/∂tdwi calculated using backpropagation + grad_backward = tdwi.grad + + assert grad_backward is not None, "Backward gradients for TDWI should not be None" + assert grad_backward == grads, "Forward and backward gradients for TDWI should match" + + def test_gradients_tdwi_lai_root_dynamics_numerical(self): + model = get_test_diff_root_model() + tdwi1 = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float64)) + output = model({"TDWI": tdwi1}) + lai = output[0, :, 0] + loss1 = lai.sum() + + # this is ∂loss/∂tdwi, for comparison with numerical gradient + # in this test, ∂loss/∂tdwi is very small + grads = torch.autograd.grad(loss1, tdwi1, retain_graph=True)[0] + + model = get_test_diff_root_model() + # tdwi range is (0.1, 0.6) + tdwi2 = tdwi1 + torch.tensor(1e-10, dtype=torch.float64) + output = model({"TDWI": tdwi2}) + lai = output[0, :, 0] + loss2 = lai.sum() + numerical_grad = (loss2 - loss1) / (tdwi2 - tdwi1) + + # in this test, grads is very small + assert_almost_equal(numerical_grad.item(), grads.item(), decimal=1) + + def test_gradients_tdwi_twlv_root_dynamics(self): + # prepare model input + model = get_test_diff_root_model() + tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float32)) + output = model({"TDWI": tdwi}) + twlv = output[0, :, 1] + loss = twlv.sum() + + # this is ∂loss/∂tdwi + # this is called forward gradient here because it is calculated without backpropagation. + grads = torch.autograd.grad(loss, tdwi, retain_graph=True)[0] + + assert grads is not None, "Gradients for TDWI should not be None" + torch.testing.assert_close( + grads, torch.tensor(5.7904, dtype=torch.float32), rtol=1e-4, atol=1e-4 + ) + + tdwi.grad = None # clear any existing gradient + loss.backward() + + # this is ∂loss/∂tdwi calculated using backpropagation + grad_backward = tdwi.grad + + assert grad_backward is not None, "Backward gradients for TDWI should not be None" + assert grad_backward == grads, "Forward and backward gradients for TDWI should match" + + +class TestDiffRootDynamicsSPAN: + def test_gradients_span_lai_root_dynamics(self): + # prepare model input + model = get_test_diff_root_model() + span = torch.nn.Parameter(torch.tensor(30, dtype=torch.float32)) + output = model({"SPAN": span}) + lai = output[0, :, 0] + loss = lai.sum() + + # this is ∂loss/∂span + # this is called forward gradient here because it is calculated without backpropagation. + grads = torch.autograd.grad(loss, span, retain_graph=True)[0] + + assert grads is not None, "Gradients for SPAN should not be None" + torch.testing.assert_close( + grads, torch.tensor(2.5138, dtype=torch.float32), rtol=1e-4, atol=1e-4 + ) + + span.grad = None # clear any existing gradient + loss.backward() + + # this is ∂loss/∂span calculated using backpropagation + grad_backward = span.grad + + assert grad_backward is not None, "Backward gradients for TDWI should not be None" + assert grad_backward == grads, "Forward and backward gradients for TDWI should match" + + def test_gradients_span_lai_root_dynamics_numerical(self): + model = get_test_diff_root_model() + span1 = torch.nn.Parameter(torch.tensor(30, dtype=torch.float32)) + output = model({"SPAN": span1}) + lai = output[0, :, 0] + loss1 = lai.sum() + + # this is ∂loss/∂span, for comparison with numerical gradient + grads = torch.autograd.grad(loss1, span1, retain_graph=True)[0] + + model = get_test_diff_root_model() + # span range is (30, 40) + span2 = span1 + torch.tensor(1e-10, dtype=torch.float64) + output = model({"SPAN": span2}) + lai = output[0, :, 0] + loss2 = lai.sum() + numerical_grad = (loss2 - loss1) / (span2 - span1) + + assert_almost_equal(numerical_grad.item(), grads.item(), decimal=3) + + def test_gradients_span_twlv_root_dynamics(self): + # prepare model input + model = get_test_diff_root_model() + span = torch.nn.Parameter(torch.tensor(30, dtype=torch.float32)) + output = model({"SPAN": span}) + twlv = output[0, :, 1] + loss = twlv.sum() + + # this is ∂loss/∂span + # this is called forward gradient here because it is calculated without backpropagation. + grads = torch.autograd.grad(loss, span, retain_graph=True)[0] + + assert grads is not None, "Gradients for SPAN should not be None" + torch.testing.assert_close( + grads, torch.tensor(-0.2393, dtype=torch.float32), rtol=1e-4, atol=1e-4 + ) + + span.grad = None # clear any existing gradient + loss.backward() + + # this is ∂loss/∂span calculated using backpropagation + grad_backward = span.grad + + assert grad_backward is not None, "Backward gradients for TDWI should not be None" + assert grad_backward == grads, "Forward and backward gradients for TDWI should match" diff --git a/tests/physical_models/test_data/WOFOST_Root_Dynamics.conf b/tests/physical_models/test_data/WOFOST_Root_Dynamics.conf new file mode 100644 index 0000000..3b7224f --- /dev/null +++ b/tests/physical_models/test_data/WOFOST_Root_Dynamics.conf @@ -0,0 +1,32 @@ + +from diffwofost.physical_models.crop.root_dynamics import WOFOST_Root_Dynamics +from pcse.agromanager import AgroManager + +# Module to be used for water balance +SOIL = None + +# Module to be used for the crop simulation itself +CROP = WOFOST_Root_Dynamics + +# Module to use for AgroManagement actions +AGROMANAGEMENT = AgroManager + +# variables to save at OUTPUT signals +# Set to an empty list if you do not want any OUTPUT +OUTPUT_VARS = ["LAI", "TWLV"] +# interval for OUTPUT signals, either "daily"|"dekadal"|"monthly"|"weekly" +# For daily output you change the number of days between successive +# outputs using OUTPUT_INTERVAL_DAYS. For dekadal and monthly +# output this is ignored. +OUTPUT_INTERVAL = "daily" +OUTPUT_INTERVAL_DAYS = 1 +# Weekday: Monday is 0 and Sunday is 6 +OUTPUT_WEEKDAY = 0 + +# Summary variables to save at CROP_FINISH signals +# Set to an empty list if you do not want any SUMMARY_OUTPUT +SUMMARY_OUTPUT_VARS = [] + +# Summary variables to save at TERMINATE signals +# Set to an empty list if you do not want any TERMINAL_OUTPUT +TERMINAL_OUTPUT_VARS = [] diff --git a/tests/physical_models/test_data/test_rootdynamics_wofost72_01.yaml b/tests/physical_models/test_data/test_rootdynamics_wofost72_01.yaml new file mode 100644 index 0000000..b0fc306 --- /dev/null +++ b/tests/physical_models/test_data/test_rootdynamics_wofost72_01.yaml @@ -0,0 +1,1333 @@ +# Test file for testing the simulation of root dynamics in WOFOST 7.1 +# encoding: UTF-8 +# +# All parameter and variable names and their respective units refer to the +# WOFOST manual available from http://wageningenur.nl/wofost +# +# Test file generated with PCSE 5.3.3: https://doi.org/10.5281/zenodo.1252479 +# +# crop: Sugar beets +# latitude: 49.43613 +# longitude: 12.98528 +# +# Wageningen-UR 2018, allard.dewit@wur.nl +AgroManagement: +- 2010-04-16: + CropCalendar: {crop_end_date: 2010-12-31, crop_end_type: harvest, crop_name: Sugar + beets, crop_start_date: 2010-04-16, crop_start_type: sowing, max_duration: 260, + variety_name: Sugar beets_95118_2010} + StateEvents: null + TimedEvents: null +ExternalStates: +- {DAY: 2010-04-16, DMI: 0.0, DVS: -0.1, FR: 0.2} +- {DAY: 2010-04-17, DMI: 0.0, DVS: -0.09294444444444445, FR: 0.2} +- {DAY: 2010-04-18, DMI: 0.0, DVS: -0.08805555555555557, FR: 0.2} +- {DAY: 2010-04-19, DMI: 0.0, DVS: -0.08200000000000002, FR: 0.2} +- {DAY: 2010-04-20, DMI: 0.0, DVS: -0.07333333333333335, FR: 0.2} +- {DAY: 2010-04-21, DMI: 0.0, DVS: -0.06500000000000002, FR: 0.2} +- {DAY: 2010-04-22, DMI: 0.0, DVS: -0.05994444444444446, FR: 0.2} +- {DAY: 2010-04-23, DMI: 0.0, DVS: -0.057777777777777796, FR: 0.2} +- {DAY: 2010-04-24, DMI: 0.0, DVS: -0.05333333333333335, FR: 0.2} +- {DAY: 2010-04-25, DMI: 0.0, DVS: -0.04600000000000001, FR: 0.2} +- {DAY: 2010-04-26, DMI: 0.0, DVS: -0.03472222222222224, FR: 0.2} +- {DAY: 2010-04-27, DMI: 0.0, DVS: -0.025000000000000015, FR: 0.2} +- {DAY: 2010-04-28, DMI: 0.0, DVS: -0.016722222222222236, FR: 0.2} +- {DAY: 2010-04-29, DMI: 0.0, DVS: -0.007555555555555569, FR: 0.2} +- {DAY: 2010-04-30, DMI: 0.07918267520466496, DVS: 0.0, FR: 0.2} +- {DAY: 2010-05-01, DMI: 0.08726971722826227, DVS: 0.030023923444976078, FR: 0.20296939902203062} +- {DAY: 2010-05-02, DMI: 0.07599939501067457, DVS: 0.05741626794258373, FR: 0.20567853199432148} +- {DAY: 2010-05-03, DMI: 0.08716102723451649, DVS: 0.07882775119617225, FR: 0.20779615121720385} +- {DAY: 2010-05-04, DMI: 0.07451170148310429, DVS: 0.09868421052631579, FR: 0.20975997686524003} +- {DAY: 2010-05-05, DMI: 0.08042887914367952, DVS: 0.11220095693779905, FR: 0.2110967979389032} +- {DAY: 2010-05-06, DMI: 0.10002439907374032, DVS: 0.12212918660287082, FR: 0.21207871076292129} +- {DAY: 2010-05-07, DMI: 0.1252828824678163, DVS: 0.13732057416267943, FR: 0.21358115568641886} +- {DAY: 2010-05-08, DMI: 0.19668384398863892, DVS: 0.14760765550239235, FR: 0.21459855933540145} +- {DAY: 2010-05-09, DMI: 0.23515372471768342, DVS: 0.16363636363636364, FR: 0.21618381618381619} +- {DAY: 2010-05-10, DMI: 0.17903474589877846, DVS: 0.1812200956937799, FR: 0.21792286660707713} +- {DAY: 2010-05-11, DMI: 0.32368494050076585, DVS: 0.20107655502392344, FR: 0.21988669225511331} +- {DAY: 2010-05-12, DMI: 0.3354280756055375, DVS: 0.22799043062200958, FR: 0.2225485041274515} +- {DAY: 2010-05-13, DMI: 0.27157061517848186, DVS: 0.2508373205741627, FR: 0.22480808665019192} +- {DAY: 2010-05-14, DMI: 0.23376654027781746, DVS: 0.2674641148325359, FR: 0.22645249487354752} +- {DAY: 2010-05-15, DMI: 0.2746279226299125, DVS: 0.27763157894736845, FR: 0.22745806824754194} +- {DAY: 2010-05-16, DMI: 0.41812346760179614, DVS: 0.28791866028708135, FR: 0.22847547189652453} +- {DAY: 2010-05-17, DMI: 0.6246506480705561, DVS: 0.3013157894736842, FR: 0.22980046269519955} +- {DAY: 2010-05-18, DMI: 0.48201989533687994, DVS: 0.31830143540669853, FR: 0.23148036174351963} +- {DAY: 2010-05-19, DMI: 0.27499431137388586, DVS: 0.33337320574162677, FR: 0.23297097639202902} +- {DAY: 2010-05-20, DMI: 0.4038593993767407, DVS: 0.3407894736842105, FR: 0.23370445344129553} +- {DAY: 2010-05-21, DMI: 0.7291386908288087, DVS: 0.35633971291866023, FR: 0.2352423891897576} +- {DAY: 2010-05-22, DMI: 1.1192858105557582, DVS: 0.3809808612440191, FR: 0.23767942583732057} +- {DAY: 2010-05-23, DMI: 1.458157879673842, DVS: 0.40765550239234444, FR: 0.2403175771596824} +- {DAY: 2010-05-24, DMI: 1.7769681489209164, DVS: 0.43540669856459324, FR: 0.24306220095693779} +- {DAY: 2010-05-25, DMI: 2.0428275401894824, DVS: 0.46662679425837317, FR: 0.2461499027288501} +- {DAY: 2010-05-26, DMI: 1.5085366378707437, DVS: 0.49928229665071766, FR: 0.24937956780062043} +- {DAY: 2010-05-27, DMI: 2.0863507300881627, DVS: 0.5257177033492823, FR: 0.25199405857300594} +- {DAY: 2010-05-28, DMI: 2.7793970930557403, DVS: 0.5544258373205742, FR: 0.25483332457016666} +- {DAY: 2010-05-29, DMI: 3.7458730467863006, DVS: 0.5836124401913876, FR: 0.2577199116672801} +- {DAY: 2010-05-30, DMI: 3.030275972615202, DVS: 0.6105263157894737, FR: 0.26038172353961825} +- {DAY: 2010-05-31, DMI: 3.6134582999974127, DVS: 0.6368421052631579, FR: 0.26298438403701563} +- {DAY: 2010-06-01, DMI: 2.0663367568789845, DVS: 0.6534688995215311, FR: 0.26462879226037117} +- {DAY: 2010-06-02, DMI: 2.269307313847779, DVS: 0.6690191387559808, FR: 0.26616672800883323} +- {DAY: 2010-06-03, DMI: 2.7165093907987297, DVS: 0.6867224880382775, FR: 0.26791760870708237} +- {DAY: 2010-06-04, DMI: 8.058855574556208, DVS: 0.7076555023923445, FR: 0.26998790683001206} +- {DAY: 2010-06-05, DMI: 9.88030385538193, DVS: 0.7355263157894737, FR: 0.2727443609022556} +- {DAY: 2010-06-06, DMI: 11.598154134649121, DVS: 0.766866028708134, FR: 0.2758438929491561} +- {DAY: 2010-06-07, DMI: 11.742525745623032, DVS: 0.8037081339712919, FR: 0.2794876176455124} +- {DAY: 2010-06-08, DMI: 15.325027972719834, DVS: 0.8422248803827752, FR: 0.283296966191703} +- {DAY: 2010-06-09, DMI: 17.883301041598045, DVS: 0.8801435406698566, FR: 0.28704716336295283} +- {DAY: 2010-06-10, DMI: 20.50716723911232, DVS: 0.9232057416267944, FR: 0.2914673046251994} +- {DAY: 2010-06-11, DMI: 25.832378327177924, DVS: 0.9662679425837322, FR: 0.29625199362041466} +- {DAY: 2010-06-12, DMI: 25.5702871132837, DVS: 1.0, FR: 0.3} +- {DAY: 2010-06-13, DMI: 23.80657585627682, DVS: 1.0110266159695818, FR: 0.2889733840304182} +- {DAY: 2010-06-14, DMI: 24.605472224831853, DVS: 1.0191381495564005, FR: 0.2808618504435995} +- {DAY: 2010-06-15, DMI: 27.934618397714924, DVS: 1.0269645120405577, FR: 0.27303548795944227} +- {DAY: 2010-06-16, DMI: 33.697833224949775, DVS: 1.0346958174904943, FR: 0.26530418250950566} +- {DAY: 2010-06-17, DMI: 44.23348494354046, DVS: 1.0418567807351078, FR: 0.25814321926489214} +- {DAY: 2010-06-18, DMI: 33.22286750613776, DVS: 1.049809885931559, FR: 0.25019011406844094} +- {DAY: 2010-06-19, DMI: 46.196262672520916, DVS: 1.0582699619771865, FR: 0.24173003802281345} +- {DAY: 2010-06-20, DMI: 35.52556761812795, DVS: 1.0640367553865655, FR: 0.23596324461343443} +- {DAY: 2010-06-21, DMI: 50.385393097138405, DVS: 1.0691064638783272, FR: 0.23089353612167274} +- {DAY: 2010-06-22, DMI: 63.617447285028796, DVS: 1.0750000000000002, FR: 0.22499999999999976} +- {DAY: 2010-06-23, DMI: 74.9942295727493, DVS: 1.0811153358681878, FR: 0.21888466413181218} +- {DAY: 2010-06-24, DMI: 81.1132270602226, DVS: 1.0874841571609635, FR: 0.21251584283903646} +- {DAY: 2010-06-25, DMI: 88.63206637198206, DVS: 1.0964195183776935, FR: 0.20358048162230646} +- {DAY: 2010-06-26, DMI: 101.33906393505809, DVS: 1.10532319391635, FR: 0.19467680608365} +- {DAY: 2010-06-27, DMI: 121.41671095960774, DVS: 1.1146704689480356, FR: 0.18532953105196434} +- {DAY: 2010-06-28, DMI: 134.2416633087712, DVS: 1.124746514575412, FR: 0.17525348542458782} +- {DAY: 2010-06-29, DMI: 139.8490589466692, DVS: 1.1349493029150826, FR: 0.16505069708491735} +- {DAY: 2010-06-30, DMI: 138.51257837352458, DVS: 1.1457224334600762, FR: 0.15427756653992372} +- {DAY: 2010-07-01, DMI: 159.93087664465835, DVS: 1.15712927756654, FR: 0.14694459532862567} +- {DAY: 2010-07-02, DMI: 171.40951546159334, DVS: 1.1683460076045629, FR: 0.14213742531233017} +- {DAY: 2010-07-03, DMI: 178.07616834641388, DVS: 1.1797528517110267, FR: 0.13724877783813136} +- {DAY: 2010-07-04, DMI: 171.18873906194537, DVS: 1.1911596958174906, FR: 0.13236013036393257} +- {DAY: 2010-07-05, DMI: 169.43676898916004, DVS: 1.2025665399239545, FR: 0.12747148288973378} +- {DAY: 2010-07-06, DMI: 180.85738714403087, DVS: 1.2139733840304183, FR: 0.12258283541553498} +- {DAY: 2010-07-07, DMI: 207.11844290032522, DVS: 1.223510773130545, FR: 0.11849538294405212} +- {DAY: 2010-07-08, DMI: 228.542985066502, DVS: 1.2311787072243345, FR: 0.1152091254752852} +- {DAY: 2010-07-09, DMI: 228.45888314777966, DVS: 1.2406844106463877, FR: 0.11113525258011955} +- {DAY: 2010-07-10, DMI: 228.04238262765804, DVS: 1.2520912547528515, FR: 0.10624660510592077} +- {DAY: 2010-07-11, DMI: 230.65877733062854, DVS: 1.2634980988593154, FR: 0.10135795763172198} +- {DAY: 2010-07-12, DMI: 232.7053329053697, DVS: 1.2749049429657793, FR: 0.09646931015752318} +- {DAY: 2010-07-13, DMI: 224.31429979939352, DVS: 1.2863117870722431, FR: 0.09158066268332438} +- {DAY: 2010-07-14, DMI: 239.8000654326714, DVS: 1.297718631178707, FR: 0.09} +- {DAY: 2010-07-15, DMI: 189.31571530459587, DVS: 1.3091254752851709, FR: 0.08966201943388256} +- {DAY: 2010-07-16, DMI: 238.6802102614641, DVS: 1.3205323193916347, FR: 0.08923954372623574} +- {DAY: 2010-07-17, DMI: 186.92251304665294, DVS: 1.3319391634980986, FR: 0.08881706801858893} +- {DAY: 2010-07-18, DMI: 205.73008518017616, DVS: 1.3433460076045625, FR: 0.08839459231094213} +- {DAY: 2010-07-19, DMI: 245.791431319311, DVS: 1.3523447401774396, FR: 0.08806130591935409} +- {DAY: 2010-07-20, DMI: 255.72671543444338, DVS: 1.3613434727503166, FR: 0.08772801952776604} +- {DAY: 2010-07-21, DMI: 243.6616681427436, DVS: 1.37148288973384, FR: 0.08735248556541333} +- {DAY: 2010-07-22, DMI: 233.24798413686509, DVS: 1.382889733840304, FR: 0.08693000985776653} +- {DAY: 2010-07-23, DMI: 116.52049309055121, DVS: 1.3942965779467678, FR: 0.08650753415011972} +- {DAY: 2010-07-24, DMI: 111.80944836940988, DVS: 1.4050697084917614, FR: 0.08610852931511995} +- {DAY: 2010-07-25, DMI: 240.9295512949976, DVS: 1.4132129277566536, FR: 0.08580692860160542} +- {DAY: 2010-07-26, DMI: 217.0262717612417, DVS: 1.4202154626108996, FR: 0.08554757545885557} +- {DAY: 2010-07-27, DMI: 219.24483972040034, DVS: 1.4277566539923952, FR: 0.08526827207435574} +- {DAY: 2010-07-28, DMI: 153.03427676802764, DVS: 1.4362167300380226, FR: 0.08495493592451768} +- {DAY: 2010-07-29, DMI: 160.97274508361494, DVS: 1.4450253485424587, FR: 0.08462869079472375} +- {DAY: 2010-07-30, DMI: 187.95565260808146, DVS: 1.4536121673003801, FR: 0.08431066047035629} +- {DAY: 2010-07-31, DMI: 260.9249312233565, DVS: 1.4618821292775663, FR: 0.08400436558231236} +- {DAY: 2010-08-01, DMI: 252.56287387216008, DVS: 1.4703422053231938, FR: 0.0836910294324743} +- {DAY: 2010-08-02, DMI: 170.13680006718482, DVS: 1.4803231939163497, FR: 0.08332136318828334} +- {DAY: 2010-08-03, DMI: 173.37109486776916, DVS: 1.4905576679340937, FR: 0.08294230859503357} +- {DAY: 2010-08-04, DMI: 246.21340535433285, DVS: 1.5001584283903675, FR: 0.08258672487443083} +- {DAY: 2010-08-05, DMI: 164.69684023252935, DVS: 1.508016476552598, FR: 0.08229568605360749} +- {DAY: 2010-08-06, DMI: 70.70451455460315, DVS: 1.5157477820025347, FR: 0.08200934140731353} +- {DAY: 2010-08-07, DMI: 97.16967218324102, DVS: 1.5236692015209123, FR: 0.08171595549922547} +- {DAY: 2010-08-08, DMI: 226.65481269751402, DVS: 1.531780735107731, FR: 0.0814155283293433} +- {DAY: 2010-08-09, DMI: 220.2851914363175, DVS: 1.5401774397972114, FR: 0.08110453926676994} +- {DAY: 2010-08-10, DMI: 223.66321432701545, DVS: 1.54946134347275, FR: 0.08076069098249075} +- {DAY: 2010-08-11, DMI: 210.38965026974282, DVS: 1.558333333333333, FR: 0.08043209876543211} +- {DAY: 2010-08-12, DMI: 183.90829667731444, DVS: 1.5679340937896067, FR: 0.08007651504482939} +- {DAY: 2010-08-13, DMI: 101.01347523047299, DVS: 1.5777883396704686, FR: 0.0784423320659063} +- {DAY: 2010-08-14, DMI: 174.27848018697188, DVS: 1.5872623574144484, FR: 0.07654752851711033} +- {DAY: 2010-08-15, DMI: 201.837839458963, DVS: 1.596546261089987, FR: 0.07469074778200262} +- {DAY: 2010-08-16, DMI: 187.87631636108574, DVS: 1.6078580481622304, FR: 0.07242839036755393} +- {DAY: 2010-08-17, DMI: 57.144229648358795, DVS: 1.6159695817490491, FR: 0.07080608365019019} +- {DAY: 2010-08-18, DMI: 75.47449630745594, DVS: 1.622782002534854, FR: 0.0694435994930292} +- {DAY: 2010-08-19, DMI: 214.49599357376033, DVS: 1.6301964512040557, FR: 0.06796070975918887} +- {DAY: 2010-08-20, DMI: 239.61664250168837, DVS: 1.6388466413181242, FR: 0.06623067173637517} +- {DAY: 2010-08-21, DMI: 228.45784127914993, DVS: 1.647401774397972, FR: 0.06451964512040559} +- {DAY: 2010-08-22, DMI: 218.57444943895214, DVS: 1.6576996197718632, FR: 0.062460076045627366} +- {DAY: 2010-08-23, DMI: 157.56717502455717, DVS: 1.669106463878327, FR: 0.06017870722433459} +- {DAY: 2010-08-24, DMI: 139.67843001806267, DVS: 1.6796261089987325, FR: 0.058074778200253495} +- {DAY: 2010-08-25, DMI: 220.47707536720424, DVS: 1.6903992395437262, FR: 0.05592015209125477} +- {DAY: 2010-08-26, DMI: 184.47875988999735, DVS: 1.697845373891001, FR: 0.05443092522179978} +- {DAY: 2010-08-27, DMI: 145.77119865554025, DVS: 1.707636248415716, FR: 0.05247275031685682} +- {DAY: 2010-08-28, DMI: 162.00116056864348, DVS: 1.717141951837769, FR: 0.05057160963244618} +- {DAY: 2010-08-29, DMI: 174.97256591239946, DVS: 1.7241128010139415, FR: 0.0491774397972117} +- {DAY: 2010-08-30, DMI: 135.50979523831683, DVS: 1.7297845373890999, FR: 0.048043092522180024} +- {DAY: 2010-08-31, DMI: 155.32482020154353, DVS: 1.7338403041825092, FR: 0.04723193916349815} +- {DAY: 2010-09-01, DMI: 137.8830163241428, DVS: 1.738973384030418, FR: 0.046205323193916396} +- {DAY: 2010-09-02, DMI: 139.85908377176526, DVS: 1.7434093789607095, FR: 0.04531812420785811} +- {DAY: 2010-09-03, DMI: 200.2216828327037, DVS: 1.7488910012674268, FR: 0.044221799746514634} +- {DAY: 2010-09-04, DMI: 148.50441233891394, DVS: 1.7548162230671733, FR: 0.04303675538656533} +- {DAY: 2010-09-05, DMI: 211.73127018106075, DVS: 1.761248415716096, FR: 0.041750316856780816} +- {DAY: 2010-09-06, DMI: 208.10113243944386, DVS: 1.7663814955640047, FR: 0.04072370088719906} +- {DAY: 2010-09-07, DMI: 181.86887104172663, DVS: 1.7712927756653989, FR: 0.03974144486692022} +- {DAY: 2010-09-08, DMI: 144.71197597830826, DVS: 1.7755703422053228, FR: 0.038885931558935424} +- {DAY: 2010-09-09, DMI: 85.9103819334138, DVS: 1.781780735107731, FR: 0.03764385297845378} +- {DAY: 2010-09-10, DMI: 157.75894080629766, DVS: 1.7885297845373889, FR: 0.03629404309252222} +- {DAY: 2010-09-11, DMI: 195.35359993246007, DVS: 1.7956273764258552, FR: 0.03487452471482894} +- {DAY: 2010-09-12, DMI: 190.42469287847678, DVS: 1.8026299112801012, FR: 0.033474017743979755} +- {DAY: 2010-09-13, DMI: 83.2452597111574, DVS: 1.8095690747782, FR: 0.03208618504435998} +- {DAY: 2010-09-14, DMI: 87.51683471638283, DVS: 1.8155259822560201, FR: 0.030894803548795965} +- {DAY: 2010-09-15, DMI: 50.891756433182515, DVS: 1.820722433460076, FR: 0.02985551330798479} +- {DAY: 2010-09-16, DMI: 145.53202601713195, DVS: 1.8274081115335867, FR: 0.028518377693282644} +- {DAY: 2010-09-17, DMI: 152.00689205078376, DVS: 1.8338403041825093, FR: 0.02723193916349813} +- {DAY: 2010-09-18, DMI: 165.95901622008535, DVS: 1.838593155893536, FR: 0.02628136882129279} +- {DAY: 2010-09-19, DMI: 164.93687349861023, DVS: 1.8419201520912547, FR: 0.025615969581749047} +- {DAY: 2010-09-20, DMI: 171.33432675770277, DVS: 1.8455640050697084, FR: 0.024887198986058304} +- {DAY: 2010-09-21, DMI: 171.56439186872714, DVS: 1.849873257287706, FR: 0.02402534854245881} +- {DAY: 2010-09-22, DMI: 165.44052536645825, DVS: 1.855830164765526, FR: 0.02283396704689479} +- {DAY: 2010-09-23, DMI: 162.36996607999322, DVS: 1.8624524714828898, FR: 0.02150950570342202} +- {DAY: 2010-09-24, DMI: 148.92828831269958, DVS: 1.869169835234474, FR: 0.020166032953105165} +- {DAY: 2010-09-25, DMI: 37.562186909332446, DVS: 1.8765209125475286, FR: 0.01869581749049426} +- {DAY: 2010-09-26, DMI: 71.76070344456296, DVS: 1.8823193916349812, FR: 0.017536121673003745} +- {DAY: 2010-09-27, DMI: 119.83066354950572, DVS: 1.886089987325729, FR: 0.016782002534854165} +- {DAY: 2010-09-28, DMI: 45.38394085732656, DVS: 1.889860583016477, FR: 0.016027883396704593} +- {DAY: 2010-09-29, DMI: 111.24582066792776, DVS: 1.8931875792141957, FR: 0.01536248415716085} +- {DAY: 2010-09-30, DMI: 102.57360858647225, DVS: 1.8975602027883403, FR: 0.01448795944233193} +- {DAY: 2010-10-01, DMI: 41.372646898356045, DVS: 1.9008555133079854, FR: 0.013828897338402896} +- {DAY: 2010-10-02, DMI: 80.91736117849351, DVS: 1.903738910012675, FR: 0.013252217997464996} +- {DAY: 2010-10-03, DMI: 120.10552952390906, DVS: 1.9084283903675545, FR: 0.012314321926489083} +- {DAY: 2010-10-04, DMI: 119.58127886909577, DVS: 1.9136565272496837, FR: 0.01126869455006324} +- {DAY: 2010-10-05, DMI: 83.29021681249708, DVS: 1.9184093789607104, FR: 0.010318124207857896} +- {DAY: 2010-10-06, DMI: 46.99996747465517, DVS: 1.9236692015209131, FR: 0.010458650190114152} +- {DAY: 2010-10-07, DMI: 33.33794821238907, DVS: 1.9287389100126748, FR: 0.011092363751584362} +- {DAY: 2010-10-08, DMI: 123.22416585344278, DVS: 1.9339353612167307, FR: 0.011741920152091346} +- {DAY: 2010-10-09, DMI: 120.97251477717472, DVS: 1.9394486692015216, FR: 0.012431083650190206} +- {DAY: 2010-10-10, DMI: 114.12156421384698, DVS: 1.9442648922686951, FR: 0.0130331115335869} +- {DAY: 2010-10-11, DMI: 114.27101612821554, DVS: 1.947972116603296, FR: 0.013496514575411999} +- {DAY: 2010-10-12, DMI: 109.57321942208434, DVS: 1.9517110266159703, FR: 0.013963878326996292} +- {DAY: 2010-10-13, DMI: 101.68273575543198, DVS: 1.9545310519645127, FR: 0.014316381495564095} +- {DAY: 2010-10-14, DMI: 96.70490679279165, DVS: 1.956970849176173, FR: 0.014621356147021633} +- {DAY: 2010-10-15, DMI: 19.833516519695102, DVS: 1.9585551330798485, FR: 0.014819391634981069} +- {DAY: 2010-10-16, DMI: 14.818846461309908, DVS: 1.9593155893536127, FR: 0.014914448669201594} +- {DAY: 2010-10-17, DMI: 20.277267971517908, DVS: 1.9616603295310526, FR: 0.015207541191381582} +- {DAY: 2010-10-18, DMI: 25.774029148179505, DVS: 1.9637515842839044, FR: 0.015468948035488053} +- {DAY: 2010-10-19, DMI: 23.62884205666545, DVS: 1.9649556400506978, FR: 0.015619455006337227} +- {DAY: 2010-10-20, DMI: 22.42823986696576, DVS: 1.9661913814955647, FR: 0.015773922686945593} +- {DAY: 2010-10-21, DMI: 33.199168318700075, DVS: 1.9677439797211667, FR: 0.015967997465145836} +- {DAY: 2010-10-22, DMI: 25.831124631818263, DVS: 1.9682192648922694, FR: 0.016027408111533678} +- {DAY: 2010-10-23, DMI: 22.152311964952556, DVS: 1.9682192648922694, FR: 0.016027408111533678} +- {DAY: 2010-10-24, DMI: 6.263521247460609, DVS: 1.9686628643852986, FR: 0.016082858048162327} +- {DAY: 2010-10-25, DMI: 3.6792725931398476, DVS: 1.970785804816224, FR: 0.01634822560202799} +- {DAY: 2010-10-26, DMI: 0.0, DVS: 1.9712927756654002, FR: 0.016411596958175026} +- {DAY: 2010-10-27, DMI: 0.0, DVS: 1.9712927756654002, FR: 0.016411596958175026} +- {DAY: 2010-10-28, DMI: 0.0, DVS: 1.9712927756654002, FR: 0.016411596958175026} +- {DAY: 2010-10-29, DMI: 0.0, DVS: 1.9728136882129288, FR: 0.016601711026616103} +- {DAY: 2010-10-30, DMI: 0.0, DVS: 1.9751267427122952, FR: 0.0168908428390369} +- {DAY: 2010-10-31, DMI: 0.0, DVS: 1.9769328263624852, FR: 0.01711660329531066} +- {DAY: 2010-11-01, DMI: 0.0, DVS: 1.9792458808618516, FR: 0.017405735107731454} +- {DAY: 2010-11-02, DMI: 0.0, DVS: 1.983555133079849, FR: 0.01794439163498114} +- {DAY: 2010-11-03, DMI: 19.981638149523437, DVS: 1.985107731305451, FR: 0.018138466413181384} +- {DAY: 2010-11-04, DMI: 10.42239831190848, DVS: 1.9885297845373902, FR: 0.018566223067173773} +- {DAY: 2010-11-05, DMI: 46.401100234993315, DVS: 1.9948035487959452, FR: 0.019350443599493155} +- {DAY: 2010-11-06, DMI: 5.958636116129116, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-07, DMI: 15.565850759510647, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-08, DMI: 15.35644728183427, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-09, DMI: 44.141119653731295, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-10, DMI: 14.924786629292004, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-11, DMI: 24.2269545627343, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-12, DMI: 38.25329265996589, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-13, DMI: 42.91869133316397, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-14, DMI: 68.45886959252344, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-15, DMI: 46.2545138561688, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-16, DMI: 3.8934257353592074, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-17, DMI: 6.277629532229549, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-18, DMI: 4.541383789475789, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-19, DMI: 4.880876338731813, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-20, DMI: 3.2692377525679994, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-21, DMI: 0.8535068016025563, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-22, DMI: 13.004138914618522, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-23, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-24, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-25, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-26, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-27, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-28, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-29, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-11-30, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-01, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-02, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-03, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-04, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-05, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-06, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-07, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-08, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-09, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-10, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-11, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-12, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-13, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-14, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-15, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-16, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-17, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-18, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-19, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-20, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-21, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-22, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-23, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-24, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-25, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-26, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-27, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-28, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-29, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-30, DMI: 0.0, DVS: 2.0, FR: 0.02} +- {DAY: 2010-12-31, DMI: 0.0, DVS: 2.0, FR: 0.02} +ModelParameters: + IAIRDU: 0.0 + RDI: 10.0 + RDMCR: 120.0 + RDMSOL: 120 + RDRRTB: [0.0, 0.0, 1.5, 0.0, 1.5001, 0.02, 2.0, 0.02, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + RRI: 1.2 + TDWI: 0.51 +ModelResults: +- {DAY: 2010-04-16, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-17, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-18, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-19, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-20, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-21, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-22, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-23, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-24, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-25, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-26, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-27, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-28, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-29, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-04-30, RD: 10.0, TWRT: 0.10200000000000001} +- {DAY: 2010-05-01, RD: 11.2, TWRT: 0.117836535040933} +- {DAY: 2010-05-02, RD: 12.399999999999999, TWRT: 0.13554961709957594} +- {DAY: 2010-05-03, RD: 13.599999999999998, TWRT: 0.15118106109782806} +- {DAY: 2010-05-04, RD: 14.799999999999997, TWRT: 0.16929278709329848} +- {DAY: 2010-05-05, RD: 15.999999999999996, TWRT: 0.1849223598725841} +- {DAY: 2010-05-06, RD: 17.199999999999996, TWRT: 0.2019006387216299} +- {DAY: 2010-05-07, RD: 18.399999999999995, TWRT: 0.22311368432202466} +- {DAY: 2010-05-08, RD: 19.599999999999994, TWRT: 0.24987174714722665} +- {DAY: 2010-05-09, RD: 20.799999999999994, TWRT: 0.29207981671173744} +- {DAY: 2010-05-10, RD: 21.999999999999993, TWRT: 0.34291624631104484} +- {DAY: 2010-05-11, RD: 23.199999999999992, TWRT: 0.3819320113595763} +- {DAY: 2010-05-12, RD: 24.39999999999999, TWRT: 0.4531060222590828} +- {DAY: 2010-05-13, RD: 25.59999999999999, TWRT: 0.5277550387274449} +- {DAY: 2010-05-14, RD: 26.79999999999999, TWRT: 0.588806309116135} +- {DAY: 2010-05-15, RD: 27.99999999999999, TWRT: 0.6417433253800043} +- {DAY: 2010-05-16, RD: 29.19999999999999, TWRT: 0.7042096621482397} +- {DAY: 2010-05-17, RD: 30.399999999999988, TWRT: 0.7997406187195713} +- {DAY: 2010-05-18, RD: 31.599999999999987, TWRT: 0.9432856266690413} +- {DAY: 2010-05-19, RD: 32.79999999999999, TWRT: 1.0548637664091958} +- {DAY: 2010-05-20, RD: 33.99999999999999, TWRT: 1.1189294596322237} +- {DAY: 2010-05-21, RD: 35.199999999999996, TWRT: 1.2133131998306947} +- {DAY: 2010-05-22, RD: 36.4, TWRT: 1.3848375275119558} +- {DAY: 2010-05-23, RD: 37.6, TWRT: 1.6508687363127084} +- {DAY: 2010-05-24, RD: 38.800000000000004, TWRT: 2.001289705072226} +- {DAY: 2010-05-25, RD: 40.00000000000001, TWRT: 2.4332034943793195} +- {DAY: 2010-05-26, RD: 41.20000000000001, TWRT: 2.9360452946887765} +- {DAY: 2010-05-27, RD: 42.40000000000001, TWRT: 3.3122435094523834} +- {DAY: 2010-05-28, RD: 43.600000000000016, TWRT: 3.8379914975340537} +- {DAY: 2010-05-29, RD: 44.80000000000002, TWRT: 4.5462744990581045} +- {DAY: 2010-05-30, RD: 46.00000000000002, TWRT: 5.511660569792715} +- {DAY: 2010-05-31, RD: 47.200000000000024, TWRT: 6.300689050342955} +- {DAY: 2010-06-01, RD: 48.40000000000003, TWRT: 7.250972155611216} +- {DAY: 2010-06-02, RD: 49.60000000000003, TWRT: 7.797784355987314} +- {DAY: 2010-06-03, RD: 50.80000000000003, TWRT: 8.401798458560693} +- {DAY: 2010-06-04, RD: 52.000000000000036, TWRT: 9.129599158573821} +- {DAY: 2010-06-05, RD: 53.20000000000004, TWRT: 11.305392706593626} +- {DAY: 2010-06-06, RD: 54.40000000000004, TWRT: 14.000189867149862} +- {DAY: 2010-06-07, RD: 55.600000000000044, TWRT: 17.199469854675826} +- {DAY: 2010-06-08, RD: 56.80000000000005, TWRT: 20.4813604004611} +- {DAY: 2010-06-09, RD: 58.00000000000005, TWRT: 24.822894331935615} +- {DAY: 2010-06-10, RD: 59.20000000000005, TWRT: 29.956245167492074} +- {DAY: 2010-06-11, RD: 60.400000000000055, TWRT: 35.93341392817433} +- {DAY: 2010-06-12, RD: 61.60000000000006, TWRT: 43.586307507557585} +- {DAY: 2010-06-13, RD: 62.80000000000006, TWRT: 51.25739364154269} +- {DAY: 2010-06-14, RD: 64.00000000000006, TWRT: 58.13686042890785} +- {DAY: 2010-06-15, RD: 65.20000000000006, TWRT: 65.04759888901272} +- {DAY: 2010-06-16, RD: 66.40000000000006, TWRT: 72.67474105419363} +- {DAY: 2010-06-17, RD: 67.60000000000007, TWRT: 81.61491715028059} +- {DAY: 2010-06-18, RD: 68.80000000000007, TWRT: 93.03349135291126} +- {DAY: 2010-06-19, RD: 70.00000000000007, TWRT: 101.34552436395256} +- {DAY: 2010-06-20, RD: 71.20000000000007, TWRT: 112.51254869629292} +- {DAY: 2010-06-21, RD: 72.40000000000008, TWRT: 120.89527689820035} +- {DAY: 2010-06-22, RD: 73.60000000000008, TWRT: 132.52893847927916} +- {DAY: 2010-06-23, RD: 74.80000000000008, TWRT: 146.84286411841063} +- {DAY: 2010-06-24, RD: 76.00000000000009, TWRT: 163.2579508702659} +- {DAY: 2010-06-25, RD: 77.20000000000009, TWRT: 180.49579668436323} +- {DAY: 2010-06-26, RD: 78.40000000000009, TWRT: 198.53955544355156} +- {DAY: 2010-06-27, RD: 79.6000000000001, TWRT: 218.26792074193548} +- {DAY: 2010-06-28, RD: 80.8000000000001, TWRT: 240.77002284595147} +- {DAY: 2010-06-29, RD: 82.0000000000001, TWRT: 264.2963422300076} +- {DAY: 2010-06-30, RD: 83.2000000000001, TWRT: 287.3785268958251} +- {DAY: 2010-07-01, RD: 84.4000000000001, TWRT: 308.7479104224629} +- {DAY: 2010-07-02, RD: 85.60000000000011, TWRT: 332.2488883715646} +- {DAY: 2010-07-03, RD: 86.80000000000011, TWRT: 356.61259557330953} +- {DAY: 2010-07-04, RD: 88.00000000000011, TWRT: 381.05333204095217} +- {DAY: 2010-07-05, RD: 89.20000000000012, TWRT: 403.7118958600285} +- {DAY: 2010-07-06, RD: 90.40000000000012, TWRT: 425.310252059122} +- {DAY: 2010-07-07, RD: 91.60000000000012, TWRT: 447.4802633810824} +- {DAY: 2010-07-08, RD: 92.80000000000013, TWRT: 472.02284258733226} +- {DAY: 2010-07-09, RD: 94.00000000000013, TWRT: 498.3530800303551} +- {DAY: 2010-07-10, RD: 95.20000000000013, TWRT: 523.7429157131556} +- {DAY: 2010-07-11, RD: 96.40000000000013, TWRT: 547.9716446876097} +- {DAY: 2010-07-12, RD: 97.60000000000014, TWRT: 571.3507472676723} +- {DAY: 2010-07-13, RD: 98.80000000000014, TWRT: 593.7996702030301} +- {DAY: 2010-07-14, RD: 100.00000000000014, TWRT: 614.3425224280045} +- {DAY: 2010-07-15, RD: 101.20000000000014, TWRT: 635.9245283169449} +- {DAY: 2010-07-16, RD: 102.40000000000015, TWRT: 652.898957661725} +- {DAY: 2010-07-17, RD: 103.60000000000015, TWRT: 674.1986707219401} +- {DAY: 2010-07-18, RD: 104.80000000000015, TWRT: 690.8005802774102} +- {DAY: 2010-07-19, RD: 106.00000000000016, TWRT: 708.9860072830072} +- {DAY: 2010-07-20, RD: 107.20000000000016, TWRT: 730.630721708773} +- {DAY: 2010-07-21, RD: 108.40000000000016, TWRT: 753.0651199941773} +- {DAY: 2010-07-22, RD: 109.60000000000016, TWRT: 774.3495723434609} +- {DAY: 2010-07-23, RD: 110.80000000000017, TWRT: 794.6258219037827} +- {DAY: 2010-07-24, RD: 112.00000000000017, TWRT: 804.7057224390023} +- {DAY: 2010-07-25, RD: 113.20000000000017, TWRT: 814.333469601627} +- {DAY: 2010-07-26, RD: 114.40000000000018, TWRT: 835.0068944076137} +- {DAY: 2010-07-27, RD: 115.60000000000018, TWRT: 853.5729657676626} +- {DAY: 2010-07-28, RD: 116.80000000000018, TWRT: 872.2675944118403} +- {DAY: 2010-07-29, RD: 118.00000000000018, TWRT: 885.2686115889229} +- {DAY: 2010-07-30, RD: 119.20000000000019, TWRT: 898.891524258982} +- {DAY: 2010-07-31, RD: 120.0, TWRT: 914.7381894695062} +- {DAY: 2010-08-01, RD: 120.0, TWRT: 936.6570227815328} +- {DAY: 2010-08-02, RD: 120.0, TWRT: 957.794269692318} +- {DAY: 2010-08-03, RD: 120.0, TWRT: 971.9702998024082} +- {DAY: 2010-08-04, RD: 120.0, TWRT: 986.3500986543896} +- {DAY: 2010-08-05, RD: 120.0, TWRT: 1006.6840574227846} +- {DAY: 2010-08-06, RD: 120.0, TWRT: 1020.237896880582} +- {DAY: 2010-08-07, RD: 120.0, TWRT: 1026.0363275537288} +- {DAY: 2010-08-08, RD: 120.0, TWRT: 1033.9766401617287} +- {DAY: 2010-08-09, RD: 120.0, TWRT: 1052.4298614858853} +- {DAY: 2010-08-10, RD: 120.0, TWRT: 1070.29599044462} +- {DAY: 2010-08-11, RD: 120.0, TWRT: 1088.3591861810346} +- {DAY: 2010-08-12, RD: 120.0, TWRT: 1105.2812673107553} +- {DAY: 2010-08-13, RD: 120.0, TWRT: 1120.0080027965053} +- {DAY: 2010-08-14, RD: 120.0, TWRT: 1127.9317353636652} +- {DAY: 2010-08-15, RD: 120.0, TWRT: 1141.272322295696} +- {DAY: 2010-08-16, RD: 120.0, TWRT: 1156.3477414555898} +- {DAY: 2010-08-17, RD: 120.0, TWRT: 1169.9553206378087} +- {DAY: 2010-08-18, RD: 120.0, TWRT: 1174.001479742416} +- {DAY: 2010-08-19, RD: 120.0, TWRT: 1179.242700435929} +- {DAY: 2010-08-20, RD: 120.0, TWRT: 1193.8200003997042} +- {DAY: 2010-08-21, RD: 120.0, TWRT: 1209.689971591806} +- {DAY: 2010-08-22, RD: 120.0, TWRT: 1224.4299904361105} +- {DAY: 2010-08-23, RD: 120.0, TWRT: 1238.0821671696986} +- {DAY: 2010-08-24, RD: 120.0, TWRT: 1247.564356063667} +- {DAY: 2010-08-25, RD: 120.0, TWRT: 1255.6761499063255} +- {DAY: 2010-08-26, RD: 120.0, TWRT: 1268.0052614934948} +- {DAY: 2010-08-27, RD: 120.0, TWRT: 1278.0466110780776} +- {DAY: 2010-08-28, RD: 120.0, TWRT: 1285.6956267885184} +- {DAY: 2010-08-29, RD: 120.0, TWRT: 1293.888286240799} +- {DAY: 2010-08-30, RD: 120.0, TWRT: 1302.4929890671199} +- {DAY: 2010-08-31, RD: 120.0, TWRT: 1309.003298697416} +- {DAY: 2010-09-01, RD: 120.0, TWRT: 1316.3395911557566} +- {DAY: 2010-09-02, RD: 120.0, TWRT: 1322.7105204879656} +- {DAY: 2010-09-03, RD: 120.0, TWRT: 1329.0486718179318} +- {DAY: 2010-09-04, RD: 120.0, TWRT: 1337.9028349810696} +- {DAY: 2010-09-05, RD: 120.0, TWRT: 1344.2939830487253} +- {DAY: 2010-09-06, RD: 120.0, TWRT: 1353.133830667273} +- {DAY: 2010-09-07, RD: 120.0, TWRT: 1361.6084789390243} +- {DAY: 2010-09-08, RD: 120.0, TWRT: 1368.836210650538} +- {DAY: 2010-09-09, RD: 120.0, TWRT: 1374.4634706441889} +- {DAY: 2010-09-10, RD: 120.0, TWRT: 1377.697468431013} +- {DAY: 2010-09-11, RD: 120.0, TWRT: 1383.4231782268675} +- {DAY: 2010-09-12, RD: 120.0, TWRT: 1390.2360421758428} +- {DAY: 2010-09-13, RD: 120.0, TWRT: 1396.610321724149} +- {DAY: 2010-09-14, RD: 120.0, TWRT: 1399.2813445313068} +- {DAY: 2010-09-15, RD: 120.0, TWRT: 1401.9851599470821} +- {DAY: 2010-09-16, RD: 120.0, TWRT: 1403.5045594585395} +- {DAY: 2010-09-17, RD: 120.0, TWRT: 1407.6548967429649} +- {DAY: 2010-09-18, RD: 120.0, TWRT: 1411.7943391797241} +- {DAY: 2010-09-19, RD: 120.0, TWRT: 1416.1559692942233} +- {DAY: 2010-09-20, RD: 120.0, TWRT: 1420.3809872286724} +- {DAY: 2010-09-21, RD: 120.0, TWRT: 1424.6450187118337} +- {DAY: 2010-09-22, RD: 120.0, TWRT: 1428.7669130239549} +- {DAY: 2010-09-23, RD: 120.0, TWRT: 1432.5445765283935} +- {DAY: 2010-09-24, RD: 120.0, TWRT: 1436.0370742398557} +- {DAY: 2010-09-25, RD: 120.0, TWRT: 1439.040367009619} +- {DAY: 2010-09-26, RD: 120.0, TWRT: 1439.7426228006198} +- {DAY: 2010-09-27, RD: 120.0, TWRT: 1441.001027227564} +- {DAY: 2010-09-28, RD: 120.0, TWRT: 1443.012025727005} +- {DAY: 2010-09-29, RD: 120.0, TWRT: 1443.7394342391492} +- {DAY: 2010-09-30, RD: 120.0, TWRT: 1445.4484463967106} +- {DAY: 2010-10-01, RD: 120.0, TWRT: 1446.934528677765} +- {DAY: 2010-10-02, RD: 120.0, TWRT: 1447.5066667643405} +- {DAY: 2010-10-03, RD: 120.0, TWRT: 1448.5790012744574} +- {DAY: 2010-10-04, RD: 120.0, TWRT: 1450.0580194301663} +- {DAY: 2010-10-05, RD: 120.0, TWRT: 1451.405544335648} +- {DAY: 2010-10-06, RD: 120.0, TWRT: 1452.2649431380187} +- {DAY: 2010-10-07, RD: 120.0, TWRT: 1452.756499356783} +- {DAY: 2010-10-08, RD: 120.0, TWRT: 1453.1262960050863} +- {DAY: 2010-10-09, RD: 120.0, TWRT: 1454.5731843213453} +- {DAY: 2010-10-10, RD: 120.0, TWRT: 1456.0770037719144} +- {DAY: 2010-10-11, RD: 120.0, TWRT: 1457.5643628467008} +- {DAY: 2010-10-12, RD: 120.0, TWRT: 1459.1066232814223} +- {DAY: 2010-10-13, RD: 120.0, TWRT: 1460.6366903853298} +- {DAY: 2010-10-14, RD: 120.0, TWRT: 1462.0924192219172} +- {DAY: 2010-10-15, RD: 120.0, TWRT: 1463.506376105299} +- {DAY: 2010-10-16, RD: 120.0, TWRT: 1463.8002967541033} +- {DAY: 2010-10-17, RD: 120.0, TWRT: 1464.0213116789873} +- {DAY: 2010-10-18, RD: 120.0, TWRT: 1464.3296790669128} +- {DAY: 2010-10-19, RD: 120.0, TWRT: 1464.728376184471} +- {DAY: 2010-10-20, RD: 120.0, TWRT: 1465.097445819827} +- {DAY: 2010-10-21, RD: 120.0, TWRT: 1465.4512271414928} +- {DAY: 2010-10-22, RD: 120.0, TWRT: 1465.981351377051} +- {DAY: 2010-10-23, RD: 120.0, TWRT: 1466.395357353505} +- {DAY: 2010-10-24, RD: 120.0, TWRT: 1466.750401497981} +- {DAY: 2010-10-25, RD: 120.0, TWRT: 1466.8511368210857} +- {DAY: 2010-10-26, RD: 120.0, TWRT: 1466.9112863994897} +- {DAY: 2010-10-27, RD: 120.0, TWRT: 1466.9112863994897} +- {DAY: 2010-10-28, RD: 120.0, TWRT: 1466.9112863994897} +- {DAY: 2010-10-29, RD: 120.0, TWRT: 1466.9112863994897} +- {DAY: 2010-10-30, RD: 120.0, TWRT: 1466.9112863994897} +- {DAY: 2010-10-31, RD: 120.0, TWRT: 1466.9112863994897} +- {DAY: 2010-11-01, RD: 120.0, TWRT: 1466.9112863994897} +- {DAY: 2010-11-02, RD: 120.0, TWRT: 1466.9112863994897} +- {DAY: 2010-11-03, RD: 120.0, TWRT: 1466.9112863994897} +- {DAY: 2010-11-04, RD: 120.0, TWRT: 1467.273722671945} +- {DAY: 2010-11-05, RD: 120.0, TWRT: 1467.467227243899} +- {DAY: 2010-11-06, RD: 120.0, TWRT: 1468.3651091169509} +- {DAY: 2010-11-07, RD: 120.0, TWRT: 1468.4842818392733} +- {DAY: 2010-11-08, RD: 120.0, TWRT: 1468.7955988544636} +- {DAY: 2010-11-09, RD: 120.0, TWRT: 1469.1027278001002} +- {DAY: 2010-11-10, RD: 120.0, TWRT: 1469.9855501931747} +- {DAY: 2010-11-11, RD: 120.0, TWRT: 1470.2840459257604} +- {DAY: 2010-11-12, RD: 120.0, TWRT: 1470.7685850170153} +- {DAY: 2010-11-13, RD: 120.0, TWRT: 1471.5336508702146} +- {DAY: 2010-11-14, RD: 120.0, TWRT: 1472.392024696878} +- {DAY: 2010-11-15, RD: 120.0, TWRT: 1473.7612020887284} +- {DAY: 2010-11-16, RD: 120.0, TWRT: 1474.6862923658518} +- {DAY: 2010-11-17, RD: 120.0, TWRT: 1474.764160880559} +- {DAY: 2010-11-18, RD: 120.0, TWRT: 1474.8897134712035} +- {DAY: 2010-11-19, RD: 120.0, TWRT: 1474.9805411469931} +- {DAY: 2010-11-20, RD: 120.0, TWRT: 1475.0781586737678} +- {DAY: 2010-11-21, RD: 120.0, TWRT: 1475.1435434288192} +- {DAY: 2010-11-22, RD: 120.0, TWRT: 1475.160613564851} +- {DAY: 2010-11-23, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-11-24, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-11-25, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-11-26, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-11-27, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-11-28, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-11-29, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-11-30, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-01, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-02, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-03, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-04, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-05, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-06, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-07, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-12-08, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-12-09, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-10, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-12-11, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-12-12, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-12-13, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-14, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-15, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-12-16, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-12-17, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-12-18, RD: 120.0, TWRT: 1475.4206963431436} +- {DAY: 2010-12-19, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-20, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-21, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-22, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-23, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-24, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-25, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-26, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-27, RD: 120.0, TWRT: 1475.4206963431438} +- {DAY: 2010-12-28, RD: 120.0, TWRT: 1475.420696343144} +- {DAY: 2010-12-29, RD: 120.0, TWRT: 1475.420696343144} +- {DAY: 2010-12-30, RD: 120.0, TWRT: 1475.420696343144} +- {DAY: 2010-12-31, RD: 120.0, TWRT: 1475.420696343144} +Precision: {RD: 0.01, TWRT: 0.1} +WeatherVariables: +- {DAY: 2010-04-16, E0: 0.292, ELEV: 440.0, ES0: 0.259, ET0: 0.254, IRRAD: 15048000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 9.35, TMAX: 14.5, + TMIN: 4.2, VAP: 7.45, WIND: 2.298643329164947} +- {DAY: 2010-04-17, E0: 0.307, ELEV: 440.0, ES0: 0.259, ET0: 0.29100000000000004, + IRRAD: 22799000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 7.3999999999999995, + TMAX: 14.6, TMIN: 0.2, VAP: 6.04, WIND: 1.6521498928373055} +- {DAY: 2010-04-18, E0: 0.303, ELEV: 440.0, ES0: 0.263, ET0: 0.28300000000000003, + IRRAD: 18735000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 8.450000000000001, + TMAX: 15.8, TMIN: 1.1, VAP: 6.95, WIND: 2.2268107251285425} +- {DAY: 2010-04-19, E0: 0.34500000000000003, ELEV: 440.0, ES0: 0.29700000000000004, + ET0: 0.337, IRRAD: 21025000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, + TEMP: 10.8, TMAX: 18.6, TMIN: 3.0, VAP: 7.35, WIND: 1.939480308982924} +- {DAY: 2010-04-20, E0: 0.33199999999999996, ELEV: 440.0, ES0: 0.28900000000000003, + ET0: 0.319, IRRAD: 18687000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, + TEMP: 10.5, TMAX: 16.9, TMIN: 4.1, VAP: 7.42, WIND: 2.442308537237756} +- {DAY: 2010-04-21, E0: 0.29500000000000004, ELEV: 440.0, ES0: 0.266, ET0: 0.262, + IRRAD: 14308000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 7.550000000000001, + TMAX: 10.4, TMIN: 4.7, VAP: 5.87, WIND: 3.0888019735653973} +- {DAY: 2010-04-22, E0: 0.288, ELEV: 440.0, ES0: 0.244, ET0: 0.28500000000000003, + IRRAD: 22864000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 4.95, + TMAX: 12.4, TMIN: -2.5, VAP: 4.42, WIND: 1.72398249687371} +- {DAY: 2010-04-23, E0: 0.333, ELEV: 440.0, ES0: 0.286, ET0: 0.331, IRRAD: 23148000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 7.0, TMAX: 15.0, + TMIN: -1.0, VAP: 5.13, WIND: 2.2268107251285425} +- {DAY: 2010-04-24, E0: 0.369, ELEV: 440.0, ES0: 0.316, ET0: 0.36, IRRAD: 24044000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 9.6, TMAX: 18.0, + TMIN: 1.2, VAP: 6.37, WIND: 1.8676477049465194} +- {DAY: 2010-04-25, E0: 0.43899999999999995, ELEV: 440.0, ES0: 0.381, ET0: 0.425, + IRRAD: 24020000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 13.15, + TMAX: 20.6, TMIN: 5.7, VAP: 7.05, WIND: 2.154978121092138} +- {DAY: 2010-04-26, E0: 0.29700000000000004, ELEV: 440.0, ES0: 0.262, ET0: 0.286, + IRRAD: 15089000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.2, SNOWDEPTH: .nan, TEMP: 11.75, + TMAX: 17.6, TMIN: 5.9, VAP: 8.63, WIND: 2.083145517055733} +- {DAY: 2010-04-27, E0: 0.3, ELEV: 440.0, ES0: 0.26, ET0: 0.286, IRRAD: 17661000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 10.45, TMAX: 17.9, + TMIN: 3.0, VAP: 8.23, WIND: 1.6521498928373055} +- {DAY: 2010-04-28, E0: 0.373, ELEV: 440.0, ES0: 0.317, ET0: 0.352, IRRAD: 24464000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 11.25, TMAX: 19.8, + TMIN: 2.7, VAP: 7.52, WIND: 1.077489060546069} +- {DAY: 2010-04-29, E0: 0.41100000000000003, ELEV: 440.0, ES0: 0.352, ET0: 0.41600000000000004, + IRRAD: 23615000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 13.95, + TMAX: 23.8, TMIN: 4.1, VAP: 8.26, WIND: 1.5084846847644964} +- {DAY: 2010-04-30, E0: 0.348, ELEV: 440.0, ES0: 0.311, ET0: 0.333, IRRAD: 14717000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.27, SNOWDEPTH: .nan, TEMP: 15.55, TMAX: 22.6, + TMIN: 8.5, VAP: 11.53, WIND: 2.2268107251285425} +- {DAY: 2010-05-01, E0: 0.29300000000000004, ELEV: 440.0, ES0: 0.26, ET0: 0.24900000000000003, + IRRAD: 12969000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.58, SNOWDEPTH: .nan, TEMP: 14.45, + TMAX: 17.8, TMIN: 11.1, VAP: 12.04, WIND: 1.8676477049465194} +- {DAY: 2010-05-02, E0: 0.176, ELEV: 440.0, ES0: 0.158, ET0: 0.147, IRRAD: 7834000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 1.8, SNOWDEPTH: .nan, TEMP: 11.95, TMAX: 14.2, + TMIN: 9.7, VAP: 11.97, WIND: 1.4366520807280918} +- {DAY: 2010-05-03, E0: 0.189, ELEV: 440.0, ES0: 0.16899999999999998, ET0: 0.161, + IRRAD: 8347000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.05, SNOWDEPTH: .nan, TEMP: 11.3, + TMAX: 13.5, TMIN: 9.1, VAP: 10.82, WIND: 1.6521498928373055} +- {DAY: 2010-05-04, E0: 0.133, ELEV: 440.0, ES0: 0.121, ET0: 0.11699999999999999, + IRRAD: 5850000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.37, SNOWDEPTH: .nan, TEMP: 8.65, + TMAX: 10.6, TMIN: 6.7, VAP: 9.71, WIND: 2.9451367654925877} +- {DAY: 2010-05-05, E0: 0.176, ELEV: 440.0, ES0: 0.161, ET0: 0.125, IRRAD: 7550000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.04, SNOWDEPTH: .nan, TEMP: 7.15, TMAX: 8.9, + TMIN: 5.4, VAP: 8.77, WIND: 4.669119262366299} +- {DAY: 2010-05-06, E0: 0.159, ELEV: 440.0, ES0: 0.144, ET0: 0.145, IRRAD: 6844000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.6, SNOWDEPTH: .nan, TEMP: 9.350000000000001, + TMAX: 11.8, TMIN: 6.9, VAP: 9.74, WIND: 3.304299785674611} +- {DAY: 2010-05-07, E0: 0.213, ELEV: 440.0, ES0: 0.189, ET0: 0.175, IRRAD: 11585000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 7.300000000000001, + TMAX: 10.4, TMIN: 4.2, VAP: 8.06, WIND: 2.2268107251285425} +- {DAY: 2010-05-08, E0: 0.29500000000000004, ELEV: 440.0, ES0: 0.259, ET0: 0.246, + IRRAD: 16249000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 9.7, + TMAX: 15.5, TMIN: 3.9, VAP: 8.4, WIND: 1.077489060546069} +- {DAY: 2010-05-09, E0: 0.29, ELEV: 440.0, ES0: 0.252, ET0: 0.261, IRRAD: 16930000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.6, SNOWDEPTH: .nan, TEMP: 10.35, TMAX: 17.3, + TMIN: 3.4, VAP: 9.58, WIND: 1.5803172888009012} +- {DAY: 2010-05-10, E0: 0.182, ELEV: 440.0, ES0: 0.16299999999999998, ET0: 0.152, + IRRAD: 8387000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.02, SNOWDEPTH: .nan, TEMP: 11.3, + TMAX: 14.0, TMIN: 8.6, VAP: 11.36, WIND: 1.077489060546069} +- {DAY: 2010-05-11, E0: 0.39, ELEV: 440.0, ES0: 0.344, ET0: 0.317, IRRAD: 18611000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.6, SNOWDEPTH: .nan, TEMP: 14.25, TMAX: 19.3, + TMIN: 9.2, VAP: 12.27, WIND: 2.5859737453105653} +- {DAY: 2010-05-12, E0: 0.32599999999999996, ELEV: 440.0, ES0: 0.29100000000000004, + ET0: 0.269, IRRAD: 14823000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, + TEMP: 12.55, TMAX: 15.5, TMIN: 9.6, VAP: 10.25, WIND: 2.154978121092138} +- {DAY: 2010-05-13, E0: 0.197, ELEV: 440.0, ES0: 0.178, ET0: 0.16699999999999998, + IRRAD: 8293000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.44000000000000006, SNOWDEPTH: .nan, + TEMP: 9.95, TMAX: 12.7, TMIN: 7.2, VAP: 9.85, WIND: 2.7296389533833745} +- {DAY: 2010-05-14, E0: 0.149, ELEV: 440.0, ES0: 0.133, ET0: 0.12, IRRAD: 7517000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.71, SNOWDEPTH: .nan, TEMP: 7.25, TMAX: 8.6, + TMIN: 5.9, VAP: 8.94, WIND: 1.72398249687371} +- {DAY: 2010-05-15, E0: 0.177, ELEV: 440.0, ES0: 0.161, ET0: 0.148, IRRAD: 8182000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 7.300000000000001, + TMAX: 9.3, TMIN: 5.3, VAP: 8.06, WIND: 2.0113129130193284} +- {DAY: 2010-05-16, E0: 0.29300000000000004, ELEV: 440.0, ES0: 0.267, ET0: 0.23500000000000001, + IRRAD: 11902000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 8.600000000000001, + TMAX: 12.3, TMIN: 4.9, VAP: 7.59, WIND: 3.1606345776018023} +- {DAY: 2010-05-17, E0: 0.364, ELEV: 440.0, ES0: 0.323, ET0: 0.315, IRRAD: 18616000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.2, SNOWDEPTH: .nan, TEMP: 10.1, TMAX: 15.4, + TMIN: 4.8, VAP: 7.99, WIND: 2.801471557419779} +- {DAY: 2010-05-18, E0: 0.23900000000000002, ELEV: 440.0, ES0: 0.217, ET0: 0.20600000000000002, + IRRAD: 10082000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.06, SNOWDEPTH: .nan, TEMP: 9.3, + TMAX: 11.5, TMIN: 7.1, VAP: 8.29, WIND: 2.65780634934697} +- {DAY: 2010-05-19, E0: 0.10700000000000001, ELEV: 440.0, ES0: 0.096, ET0: 0.095, + IRRAD: 5446000.0, LAT: 49.43613, LON: 12.98528, RAIN: 1.2, SNOWDEPTH: .nan, TEMP: 6.1, + TMAX: 7.1, TMIN: 5.1, VAP: 8.46, WIND: 2.7296389533833745} +- {DAY: 2010-05-20, E0: 0.10700000000000001, ELEV: 440.0, ES0: 0.095, ET0: 0.10400000000000001, + IRRAD: 5694000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.4, SNOWDEPTH: .nan, TEMP: 9.5, + TMAX: 12.5, TMIN: 6.5, VAP: 11.3, WIND: 1.3648194766916872} +- {DAY: 2010-05-21, E0: 0.265, ELEV: 440.0, ES0: 0.23700000000000002, ET0: 0.21800000000000003, + IRRAD: 11531000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.71, SNOWDEPTH: .nan, TEMP: 13.3, + TMAX: 17.0, TMIN: 9.6, VAP: 12.21, WIND: 1.8676477049465194} +- {DAY: 2010-05-22, E0: 0.386, ELEV: 440.0, ES0: 0.339, ET0: 0.323, IRRAD: 19035000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 1.1, SNOWDEPTH: .nan, TEMP: 14.15, TMAX: 20.1, + TMIN: 8.2, VAP: 11.77, WIND: 1.5084846847644964} +- {DAY: 2010-05-23, E0: 0.45099999999999996, ELEV: 440.0, ES0: 0.395, ET0: 0.378, + IRRAD: 22815000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 14.6, + TMAX: 20.9, TMIN: 8.3, VAP: 11.7, WIND: 1.6521498928373055} +- {DAY: 2010-05-24, E0: 0.492, ELEV: 440.0, ES0: 0.433, ET0: 0.43600000000000005, + IRRAD: 23334000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.6, SNOWDEPTH: .nan, TEMP: 16.05, + TMAX: 23.5, TMIN: 8.6, VAP: 12.38, WIND: 2.5141411412741608} +- {DAY: 2010-05-25, E0: 0.458, ELEV: 440.0, ES0: 0.404, ET0: 0.39, IRRAD: 20822000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.42000000000000004, SNOWDEPTH: .nan, TEMP: 16.65, + TMAX: 22.0, TMIN: 11.3, VAP: 13.18, WIND: 2.370475933201351} +- {DAY: 2010-05-26, E0: 0.215, ELEV: 440.0, ES0: 0.193, ET0: 0.187, IRRAD: 9210000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.93, SNOWDEPTH: .nan, TEMP: 14.05, TMAX: 17.5, + TMIN: 10.6, VAP: 13.39, WIND: 1.5084846847644964} +- {DAY: 2010-05-27, E0: 0.303, ELEV: 440.0, ES0: 0.27, ET0: 0.257, IRRAD: 13115000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.03, SNOWDEPTH: .nan, TEMP: 15.0, TMAX: 18.8, + TMIN: 11.2, VAP: 13.15, WIND: 2.083145517055733} +- {DAY: 2010-05-28, E0: 0.362, ELEV: 440.0, ES0: 0.321, ET0: 0.305, IRRAD: 16517000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 15.2, TMAX: 20.4, + TMIN: 10.0, VAP: 12.78, WIND: 1.72398249687371} +- {DAY: 2010-05-29, E0: 0.413, ELEV: 440.0, ES0: 0.362, ET0: 0.346, IRRAD: 20796000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.03, SNOWDEPTH: .nan, TEMP: 14.25, TMAX: 19.9, + TMIN: 8.6, VAP: 11.43, WIND: 1.5084846847644964} +- {DAY: 2010-05-30, E0: 0.277, ELEV: 440.0, ES0: 0.25, ET0: 0.233, IRRAD: 11117000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 3.6, SNOWDEPTH: .nan, TEMP: 14.0, TMAX: 17.8, + TMIN: 10.2, VAP: 12.48, WIND: 2.370475933201351} +- {DAY: 2010-05-31, E0: 0.307, ELEV: 440.0, ES0: 0.277, ET0: 0.21800000000000003, + IRRAD: 13569000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.32, SNOWDEPTH: .nan, TEMP: 9.95, + TMAX: 13.1, TMIN: 6.8, VAP: 9.74, WIND: 3.663462805856634} +- {DAY: 2010-06-01, E0: 0.10900000000000001, ELEV: 440.0, ES0: 0.098, ET0: 0.10300000000000001, + IRRAD: 5021000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.1, SNOWDEPTH: .nan, TEMP: 9.5, + TMAX: 11.0, TMIN: 8.0, VAP: 10.76, WIND: 2.7296389533833745} +- {DAY: 2010-06-02, E0: 0.11499999999999999, ELEV: 440.0, ES0: 0.10300000000000001, + ET0: 0.10800000000000001, IRRAD: 5185000.0, LAT: 49.43613, LON: 12.98528, RAIN: 2.2, + SNOWDEPTH: .nan, TEMP: 10.4, TMAX: 11.5, TMIN: 9.3, VAP: 11.4, WIND: 2.65780634934697} +- {DAY: 2010-06-03, E0: 0.128, ELEV: 440.0, ES0: 0.11399999999999999, ET0: 0.118, + IRRAD: 5892000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.9, SNOWDEPTH: .nan, TEMP: 11.75, + TMAX: 13.2, TMIN: 10.3, VAP: 12.64, WIND: 1.7958151009101146} +- {DAY: 2010-06-04, E0: 0.528, ELEV: 440.0, ES0: 0.45899999999999996, ET0: 0.44000000000000006, + IRRAD: 27697000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 14.65, + TMAX: 21.1, TMIN: 8.2, VAP: 11.3, WIND: 1.5803172888009012} +- {DAY: 2010-06-05, E0: 0.564, ELEV: 440.0, ES0: 0.488, ET0: 0.497, IRRAD: 29724000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 16.1, TMAX: 24.8, + TMIN: 7.4, VAP: 11.5, WIND: 1.3648194766916872} +- {DAY: 2010-06-06, E0: 0.5900000000000001, ELEV: 440.0, ES0: 0.513, ET0: 0.525, IRRAD: 28294000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.4, SNOWDEPTH: .nan, TEMP: 18.4, TMAX: 27.0, + TMIN: 9.8, VAP: 13.35, WIND: 1.6521498928373055} +- {DAY: 2010-06-07, E0: 0.505, ELEV: 440.0, ES0: 0.45099999999999996, ET0: 0.42699999999999994, + IRRAD: 19774000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 19.1, + TMAX: 22.6, TMIN: 15.6, VAP: 14.43, WIND: 2.801471557419779} +- {DAY: 2010-06-08, E0: 0.538, ELEV: 440.0, ES0: 0.471, ET0: 0.465, IRRAD: 24452000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 18.85, TMAX: 26.9, + TMIN: 10.8, VAP: 14.7, WIND: 1.4366520807280918} +- {DAY: 2010-06-09, E0: 0.595, ELEV: 440.0, ES0: 0.525, ET0: 0.517, IRRAD: 24742000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 21.5, TMAX: 28.6, + TMIN: 14.4, VAP: 17.3, WIND: 2.083145517055733} +- {DAY: 2010-06-10, E0: 0.607, ELEV: 440.0, ES0: 0.536, ET0: 0.533, IRRAD: 24198000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 23.3, TMAX: 30.5, + TMIN: 16.1, VAP: 17.26, WIND: 1.5803172888009012} +- {DAY: 2010-06-11, E0: 0.653, ELEV: 440.0, ES0: 0.5740000000000001, ET0: 0.5650000000000001, + IRRAD: 27798000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 21.5, + TMAX: 27.1, TMIN: 15.9, VAP: 16.05, WIND: 2.298643329164947} +- {DAY: 2010-06-12, E0: 0.5, ELEV: 440.0, ES0: 0.44400000000000006, ET0: 0.437, IRRAD: 19853000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 20.4, TMAX: 26.5, + TMIN: 14.3, VAP: 15.11, WIND: 1.72398249687371} +- {DAY: 2010-06-13, E0: 0.371, ELEV: 440.0, ES0: 0.33399999999999996, ET0: 0.29900000000000004, + IRRAD: 14405000.0, LAT: 49.43613, LON: 12.98528, RAIN: 1.2, SNOWDEPTH: .nan, TEMP: 15.8, + TMAX: 19.3, TMIN: 12.3, VAP: 13.18, WIND: 2.442308537237756} +- {DAY: 2010-06-14, E0: 0.321, ELEV: 440.0, ES0: 0.288, ET0: 0.258, IRRAD: 12885000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 15.35, TMAX: 18.9, + TMIN: 11.8, VAP: 13.39, WIND: 2.0113129130193284} +- {DAY: 2010-06-15, E0: 0.369, ELEV: 440.0, ES0: 0.335, ET0: 0.288, IRRAD: 13535000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 15.200000000000001, + TMAX: 18.6, TMIN: 11.8, VAP: 12.91, WIND: 3.2324671816382065} +- {DAY: 2010-06-16, E0: 0.413, ELEV: 440.0, ES0: 0.374, ET0: 0.33999999999999997, + IRRAD: 15421000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 14.3, + TMAX: 17.3, TMIN: 11.3, VAP: 11.03, WIND: 4.309956242184276} +- {DAY: 2010-06-17, E0: 0.489, ELEV: 440.0, ES0: 0.438, ET0: 0.389, IRRAD: 20003000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 1.3, SNOWDEPTH: .nan, TEMP: 15.55, TMAX: 19.8, + TMIN: 11.3, VAP: 12.24, WIND: 3.735295409893039} +- {DAY: 2010-06-18, E0: 0.28700000000000003, ELEV: 440.0, ES0: 0.258, ET0: 0.242, + IRRAD: 11148000.0, LAT: 49.43613, LON: 12.98528, RAIN: 1.0, SNOWDEPTH: .nan, TEMP: 16.35, + TMAX: 18.7, TMIN: 14.0, VAP: 14.16, WIND: 1.5803172888009012} +- {DAY: 2010-06-19, E0: 0.346, ELEV: 440.0, ES0: 0.308, ET0: 0.275, IRRAD: 16133000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.02, SNOWDEPTH: .nan, TEMP: 12.1, TMAX: 15.6, + TMIN: 8.6, VAP: 10.12, WIND: 1.6521498928373055} +- {DAY: 2010-06-20, E0: 0.23199999999999998, ELEV: 440.0, ES0: 0.21000000000000002, + ET0: 0.19, IRRAD: 9754000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.02, SNOWDEPTH: .nan, + TEMP: 11.0, TMAX: 14.0, TMIN: 8.0, VAP: 10.05, WIND: 1.3648194766916872} +- {DAY: 2010-06-21, E0: 0.337, ELEV: 440.0, ES0: 0.303, ET0: 0.264, IRRAD: 14403000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 12.3, TMAX: 15.8, + TMIN: 8.8, VAP: 10.18, WIND: 1.72398249687371} +- {DAY: 2010-06-22, E0: 0.36, ELEV: 440.0, ES0: 0.318, ET0: 0.312, IRRAD: 17475000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 12.65, TMAX: 18.3, + TMIN: 7.0, VAP: 9.81, WIND: 1.5084846847644964} +- {DAY: 2010-06-23, E0: 0.383, ELEV: 440.0, ES0: 0.33599999999999997, ET0: 0.331, + IRRAD: 19579000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 13.05, + TMAX: 19.7, TMIN: 6.4, VAP: 10.42, WIND: 1.2929868726552827} +- {DAY: 2010-06-24, E0: 0.44800000000000006, ELEV: 440.0, ES0: 0.397, ET0: 0.383, + IRRAD: 19454000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 17.1, + TMAX: 22.5, TMIN: 11.7, VAP: 11.5, WIND: 1.2929868726552827} +- {DAY: 2010-06-25, E0: 0.418, ELEV: 440.0, ES0: 0.367, ET0: 0.378, IRRAD: 19342000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.3, SNOWDEPTH: .nan, TEMP: 17.05, TMAX: 24.0, + TMIN: 10.1, VAP: 13.52, WIND: 1.5803172888009012} +- {DAY: 2010-06-26, E0: 0.457, ELEV: 440.0, ES0: 0.4, ET0: 0.40499999999999997, IRRAD: 21119000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 17.75, TMAX: 24.3, + TMIN: 11.2, VAP: 13.96, WIND: 1.5084846847644964} +- {DAY: 2010-06-27, E0: 0.571, ELEV: 440.0, ES0: 0.49800000000000005, ET0: 0.506, + IRRAD: 26779000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 18.9, + TMAX: 24.8, TMIN: 13.0, VAP: 12.48, WIND: 1.6521498928373055} +- {DAY: 2010-06-28, E0: 0.585, ELEV: 440.0, ES0: 0.507, ET0: 0.519, IRRAD: 28562000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 19.1, TMAX: 26.6, + TMIN: 11.6, VAP: 12.38, WIND: 1.077489060546069} +- {DAY: 2010-06-29, E0: 0.538, ELEV: 440.0, ES0: 0.46799999999999997, ET0: 0.493, + IRRAD: 25202000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 20.0, + TMAX: 28.1, TMIN: 11.9, VAP: 13.52, WIND: 1.1493216645824735} +- {DAY: 2010-06-30, E0: 0.515, ELEV: 440.0, ES0: 0.45499999999999996, ET0: 0.45099999999999996, + IRRAD: 21164000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.6, SNOWDEPTH: .nan, TEMP: 21.35, + TMAX: 27.5, TMIN: 15.2, VAP: 15.65, WIND: 1.3648194766916872} +- {DAY: 2010-07-01, E0: 0.533, ELEV: 440.0, ES0: 0.462, ET0: 0.47800000000000004, + IRRAD: 25266000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 20.7, + TMAX: 28.2, TMIN: 13.2, VAP: 14.63, WIND: 0.861991248436855} +- {DAY: 2010-07-02, E0: 0.597, ELEV: 440.0, ES0: 0.518, ET0: 0.5349999999999999, IRRAD: 27426000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 22.2, TMAX: 30.2, + TMIN: 14.2, VAP: 14.87, WIND: 0.9338238524732597} +- {DAY: 2010-07-03, E0: 0.614, ELEV: 440.0, ES0: 0.537, ET0: 0.5519999999999999, IRRAD: 26263000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 23.1, TMAX: 30.8, + TMIN: 15.4, VAP: 15.51, WIND: 1.2929868726552827} +- {DAY: 2010-07-04, E0: 0.509, ELEV: 440.0, ES0: 0.449, ET0: 0.457, IRRAD: 20494000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 22.45, TMAX: 28.9, + TMIN: 16.0, VAP: 17.26, WIND: 1.5084846847644964} +- {DAY: 2010-07-05, E0: 0.489, ELEV: 440.0, ES0: 0.43600000000000005, ET0: 0.409, + IRRAD: 18435000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.1, SNOWDEPTH: .nan, TEMP: 22.0, + TMAX: 26.7, TMIN: 17.3, VAP: 17.84, WIND: 1.6521498928373055} +- {DAY: 2010-07-06, E0: 0.454, ELEV: 440.0, ES0: 0.40499999999999997, ET0: 0.381, + IRRAD: 18109000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.06, SNOWDEPTH: .nan, TEMP: 18.049999999999997, + TMAX: 20.4, TMIN: 15.7, VAP: 13.45, WIND: 2.2268107251285425} +- {DAY: 2010-07-07, E0: 0.40499999999999997, ELEV: 440.0, ES0: 0.352, ET0: 0.377, + IRRAD: 21158000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 15.1, + TMAX: 22.4, TMIN: 7.8, VAP: 10.22, WIND: 1.077489060546069} +- {DAY: 2010-07-08, E0: 0.5599999999999999, ELEV: 440.0, ES0: 0.484, ET0: 0.505, IRRAD: 28373000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 18.0, TMAX: 27.4, + TMIN: 8.6, VAP: 11.33, WIND: 1.0056564565096642} +- {DAY: 2010-07-09, E0: 0.609, ELEV: 440.0, ES0: 0.5269999999999999, ET0: 0.55, IRRAD: 28929000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 21.15, TMAX: 30.9, + TMIN: 11.4, VAP: 13.69, WIND: 0.9338238524732597} +- {DAY: 2010-07-10, E0: 0.619, ELEV: 440.0, ES0: 0.5389999999999999, ET0: 0.5780000000000001, + IRRAD: 27293000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 23.25, + TMAX: 32.1, TMIN: 14.4, VAP: 15.14, WIND: 1.2929868726552827} +- {DAY: 2010-07-11, E0: 0.671, ELEV: 440.0, ES0: 0.587, ET0: 0.628, IRRAD: 28557000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 24.1, TMAX: 33.7, + TMIN: 14.5, VAP: 13.93, WIND: 1.4366520807280918} +- {DAY: 2010-07-12, E0: 0.669, ELEV: 440.0, ES0: 0.589, ET0: 0.617, IRRAD: 27106000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.03, SNOWDEPTH: .nan, TEMP: 24.45, TMAX: 33.5, + TMIN: 15.4, VAP: 16.08, WIND: 1.5803172888009012} +- {DAY: 2010-07-13, E0: 0.5700000000000001, ELEV: 440.0, ES0: 0.506, ET0: 0.514, IRRAD: 21652000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 23.65, TMAX: 29.1, + TMIN: 18.2, VAP: 17.03, WIND: 1.939480308982924} +- {DAY: 2010-07-14, E0: 0.633, ELEV: 440.0, ES0: 0.5509999999999999, ET0: 0.579, IRRAD: 27607000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.1, SNOWDEPTH: .nan, TEMP: 24.0, TMAX: 32.9, + TMIN: 15.1, VAP: 16.42, WIND: 1.1493216645824735} +- {DAY: 2010-07-15, E0: 0.43499999999999994, ELEV: 440.0, ES0: 0.39, ET0: 0.376, IRRAD: 15587000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 22.75, TMAX: 26.0, + TMIN: 19.5, VAP: 17.94, WIND: 1.5803172888009012} +- {DAY: 2010-07-16, E0: 0.645, ELEV: 440.0, ES0: 0.5650000000000001, ET0: 0.585, IRRAD: 26895000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.9, SNOWDEPTH: .nan, TEMP: 24.25, TMAX: 33.4, + TMIN: 15.1, VAP: 18.14, WIND: 1.4366520807280918} +- {DAY: 2010-07-17, E0: 0.391, ELEV: 440.0, ES0: 0.35, ET0: 0.331, IRRAD: 14872000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 1.31, SNOWDEPTH: .nan, TEMP: 21.55, TMAX: 24.6, + TMIN: 18.5, VAP: 17.36, WIND: 1.8676477049465194} +- {DAY: 2010-07-18, E0: 0.371, ELEV: 440.0, ES0: 0.329, ET0: 0.316, IRRAD: 15735000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 17.200000000000003, + TMAX: 21.1, TMIN: 13.3, VAP: 14.0, WIND: 1.72398249687371} +- {DAY: 2010-07-19, E0: 0.45499999999999996, ELEV: 440.0, ES0: 0.399, ET0: 0.40099999999999997, + IRRAD: 21342000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 17.2, + TMAX: 23.4, TMIN: 11.0, VAP: 12.17, WIND: 1.939480308982924} +- {DAY: 2010-07-20, E0: 0.5469999999999999, ELEV: 440.0, ES0: 0.477, ET0: 0.485, IRRAD: 25767000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 19.0, TMAX: 25.9, + TMIN: 12.1, VAP: 14.23, WIND: 1.7958151009101146} +- {DAY: 2010-07-21, E0: 0.5860000000000001, ELEV: 440.0, ES0: 0.509, ET0: 0.517, IRRAD: 26623000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 22.85, TMAX: 31.2, + TMIN: 14.5, VAP: 16.25, WIND: 0.861991248436855} +- {DAY: 2010-07-22, E0: 0.5860000000000001, ELEV: 440.0, ES0: 0.516, ET0: 0.534, IRRAD: 23571000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.6, SNOWDEPTH: .nan, TEMP: 24.200000000000003, + TMAX: 31.8, TMIN: 16.6, VAP: 17.94, WIND: 1.5803172888009012} +- {DAY: 2010-07-23, E0: 0.266, ELEV: 440.0, ES0: 0.242, ET0: 0.23199999999999998, + IRRAD: 8448000.0, LAT: 49.43613, LON: 12.98528, RAIN: 2.6, SNOWDEPTH: .nan, TEMP: 20.0, + TMAX: 22.4, TMIN: 17.6, VAP: 18.07, WIND: 2.0113129130193284} +- {DAY: 2010-07-24, E0: 0.21800000000000003, ELEV: 440.0, ES0: 0.199, ET0: 0.197, + IRRAD: 7503000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.9, SNOWDEPTH: .nan, TEMP: 15.85, + TMAX: 18.0, TMIN: 13.7, VAP: 14.26, WIND: 2.442308537237756} +- {DAY: 2010-07-25, E0: 0.393, ELEV: 440.0, ES0: 0.346, ET0: 0.344, IRRAD: 18998000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 14.05, TMAX: 18.8, + TMIN: 9.3, VAP: 10.18, WIND: 1.939480308982924} +- {DAY: 2010-07-26, E0: 0.34700000000000003, ELEV: 440.0, ES0: 0.306, ET0: 0.301, + IRRAD: 16015000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 14.899999999999999, + TMAX: 20.7, TMIN: 9.1, VAP: 11.9, WIND: 1.3648194766916872} +- {DAY: 2010-07-27, E0: 0.367, ELEV: 440.0, ES0: 0.324, ET0: 0.305, IRRAD: 16530000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.3, SNOWDEPTH: .nan, TEMP: 16.35, TMAX: 21.3, + TMIN: 11.4, VAP: 13.79, WIND: 1.3648194766916872} +- {DAY: 2010-07-28, E0: 0.282, ELEV: 440.0, ES0: 0.254, ET0: 0.24300000000000002, + IRRAD: 10520000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.16999999999999998, SNOWDEPTH: .nan, + TEMP: 16.9, TMAX: 20.4, TMIN: 13.4, VAP: 15.27, WIND: 2.65780634934697} +- {DAY: 2010-07-29, E0: 0.273, ELEV: 440.0, ES0: 0.244, ET0: 0.22999999999999998, + IRRAD: 11067000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.5, SNOWDEPTH: .nan, TEMP: 16.549999999999997, + TMAX: 18.9, TMIN: 14.2, VAP: 14.84, WIND: 1.7958151009101146} +- {DAY: 2010-07-30, E0: 0.312, ELEV: 440.0, ES0: 0.27799999999999997, ET0: 0.258, + IRRAD: 13224000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 16.049999999999997, + TMAX: 19.4, TMIN: 12.7, VAP: 13.25, WIND: 1.221154268618878} +- {DAY: 2010-07-31, E0: 0.48200000000000004, ELEV: 440.0, ES0: 0.414, ET0: 0.42800000000000005, + IRRAD: 26033000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 16.35, + TMAX: 24.1, TMIN: 8.6, VAP: 12.21, WIND: 1.221154268618878} +- {DAY: 2010-08-01, E0: 0.511, ELEV: 440.0, ES0: 0.44000000000000006, ET0: 0.46699999999999997, + IRRAD: 25874000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.4, SNOWDEPTH: .nan, TEMP: 18.75, + TMAX: 27.3, TMIN: 10.2, VAP: 13.62, WIND: 1.221154268618878} +- {DAY: 2010-08-02, E0: 0.301, ELEV: 440.0, ES0: 0.268, ET0: 0.258, IRRAD: 12301000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.8699999999999999, SNOWDEPTH: .nan, TEMP: 19.15, + TMAX: 23.4, TMIN: 14.9, VAP: 17.5, WIND: 1.221154268618878} +- {DAY: 2010-08-03, E0: 0.315, ELEV: 440.0, ES0: 0.282, ET0: 0.263, IRRAD: 12311000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.06, SNOWDEPTH: .nan, TEMP: 18.15, TMAX: 20.0, + TMIN: 16.3, VAP: 15.81, WIND: 1.8676477049465194} +- {DAY: 2010-08-04, E0: 0.4, ELEV: 440.0, ES0: 0.34900000000000003, ET0: 0.333, IRRAD: 19963000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 15.4, TMAX: 21.6, + TMIN: 9.2, VAP: 12.34, WIND: 1.1493216645824735} +- {DAY: 2010-08-05, E0: 0.255, ELEV: 440.0, ES0: 0.227, ET0: 0.21800000000000003, + IRRAD: 10993000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.4, SNOWDEPTH: .nan, TEMP: 15.2, + TMAX: 20.4, TMIN: 10.0, VAP: 14.13, WIND: 1.5084846847644964} +- {DAY: 2010-08-06, E0: 0.121, ELEV: 440.0, ES0: 0.10800000000000001, ET0: 0.12, IRRAD: 4960000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 2.8, SNOWDEPTH: .nan, TEMP: 15.5, TMAX: 16.8, + TMIN: 14.2, VAP: 16.08, WIND: 1.7958151009101146} +- {DAY: 2010-08-07, E0: 0.17099999999999999, ELEV: 440.0, ES0: 0.154, ET0: 0.155, + IRRAD: 6510000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.4, SNOWDEPTH: .nan, TEMP: 15.8, + TMAX: 18.0, TMIN: 13.6, VAP: 15.27, WIND: 2.0113129130193284} +- {DAY: 2010-08-08, E0: 0.374, ELEV: 440.0, ES0: 0.32999999999999996, ET0: 0.314, + IRRAD: 17177000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.9, SNOWDEPTH: .nan, TEMP: 16.25, + TMAX: 22.0, TMIN: 10.5, VAP: 13.93, WIND: 1.72398249687371} +- {DAY: 2010-08-09, E0: 0.384, ELEV: 440.0, ES0: 0.339, ET0: 0.331, IRRAD: 16768000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 17.65, TMAX: 22.1, + TMIN: 13.2, VAP: 13.96, WIND: 1.7958151009101146} +- {DAY: 2010-08-10, E0: 0.34900000000000003, ELEV: 440.0, ES0: 0.304, ET0: 0.316, + IRRAD: 17022000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 17.0, + TMAX: 24.6, TMIN: 9.4, VAP: 13.59, WIND: 1.077489060546069} +- {DAY: 2010-08-11, E0: 0.35, ELEV: 440.0, ES0: 0.307, ET0: 0.3, IRRAD: 15774000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 18.15, TMAX: 25.0, + TMIN: 11.3, VAP: 15.41, WIND: 1.077489060546069} +- {DAY: 2010-08-12, E0: 0.311, ELEV: 440.0, ES0: 0.275, ET0: 0.262, IRRAD: 13152000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.1, SNOWDEPTH: .nan, TEMP: 18.55, TMAX: 22.8, + TMIN: 14.3, VAP: 17.13, WIND: 1.6521498928373055} +- {DAY: 2010-08-13, E0: 0.187, ELEV: 440.0, ES0: 0.16699999999999998, ET0: 0.16599999999999998, + IRRAD: 7020000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.8, SNOWDEPTH: .nan, TEMP: 17.95, + TMAX: 20.0, TMIN: 15.9, VAP: 17.3, WIND: 1.221154268618878} +- {DAY: 2010-08-14, E0: 0.29100000000000004, ELEV: 440.0, ES0: 0.259, ET0: 0.24500000000000002, + IRRAD: 12078000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 17.65, + TMAX: 20.7, TMIN: 14.6, VAP: 16.32, WIND: 2.298643329164947} +- {DAY: 2010-08-15, E0: 0.414, ELEV: 440.0, ES0: 0.369, ET0: 0.374, IRRAD: 15896000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.7, SNOWDEPTH: .nan, TEMP: 20.85, TMAX: 25.1, + TMIN: 16.6, VAP: 16.49, WIND: 2.442308537237756} +- {DAY: 2010-08-16, E0: 0.31, ELEV: 440.0, ES0: 0.277, ET0: 0.258, IRRAD: 12819000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.1, SNOWDEPTH: .nan, TEMP: 15.8, TMAX: 18.3, + TMIN: 13.3, VAP: 13.45, WIND: 2.5859737453105653} +- {DAY: 2010-08-17, E0: 0.127, ELEV: 440.0, ES0: 0.11699999999999999, ET0: 0.132, + IRRAD: 4005000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.76, SNOWDEPTH: .nan, TEMP: 13.75, + TMAX: 14.9, TMIN: 12.6, VAP: 13.49, WIND: 3.663462805856634} +- {DAY: 2010-08-18, E0: 0.154, ELEV: 440.0, ES0: 0.141, ET0: 0.155, IRRAD: 5067000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 14.700000000000001, + TMAX: 17.1, TMIN: 12.3, VAP: 13.89, WIND: 2.7296389533833745} +- {DAY: 2010-08-19, E0: 0.361, ELEV: 440.0, ES0: 0.319, ET0: 0.318, IRRAD: 15911000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 16.65, TMAX: 20.7, + TMIN: 12.6, VAP: 12.71, WIND: 2.154978121092138} +- {DAY: 2010-08-20, E0: 0.391, ELEV: 440.0, ES0: 0.33199999999999996, ET0: 0.361, + IRRAD: 22793000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 16.5, + TMAX: 25.3, TMIN: 7.7, VAP: 13.12, WIND: 0.861991248436855} +- {DAY: 2010-08-21, E0: 0.426, ELEV: 440.0, ES0: 0.364, ET0: 0.39, IRRAD: 22795000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 19.25, TMAX: 27.3, + TMIN: 11.2, VAP: 15.58, WIND: 1.0056564565096642} +- {DAY: 2010-08-22, E0: 0.437, ELEV: 440.0, ES0: 0.376, ET0: 0.39, IRRAD: 21331000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 2.1, SNOWDEPTH: .nan, TEMP: 21.15, TMAX: 29.1, + TMIN: 13.2, VAP: 17.94, WIND: 1.077489060546069} +- {DAY: 2010-08-23, E0: 0.262, ELEV: 440.0, ES0: 0.231, ET0: 0.24300000000000002, + IRRAD: 11294000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.11000000000000001, SNOWDEPTH: .nan, + TEMP: 19.6, TMAX: 24.1, TMIN: 15.1, VAP: 18.71, WIND: 1.939480308982924} +- {DAY: 2010-08-24, E0: 0.31, ELEV: 440.0, ES0: 0.282, ET0: 0.27799999999999997, IRRAD: 10039000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.5, SNOWDEPTH: .nan, TEMP: 20.0, TMAX: 22.2, + TMIN: 17.8, VAP: 16.79, WIND: 2.65780634934697} +- {DAY: 2010-08-25, E0: 0.33199999999999996, ELEV: 440.0, ES0: 0.29, ET0: 0.294, IRRAD: 16736000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 14.75, TMAX: 19.2, + TMIN: 10.3, VAP: 11.97, WIND: 2.298643329164947} +- {DAY: 2010-08-26, E0: 0.315, ELEV: 440.0, ES0: 0.27799999999999997, ET0: 0.29300000000000004, + IRRAD: 13589000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.7, SNOWDEPTH: .nan, TEMP: 18.45, + TMAX: 26.0, TMIN: 10.9, VAP: 16.35, WIND: 1.939480308982924} +- {DAY: 2010-08-27, E0: 0.256, ELEV: 440.0, ES0: 0.229, ET0: 0.22599999999999998, + IRRAD: 10050000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.36, SNOWDEPTH: .nan, TEMP: 18.0, + TMAX: 21.1, TMIN: 14.9, VAP: 17.53, WIND: 3.663462805856634} +- {DAY: 2010-08-28, E0: 0.24900000000000003, ELEV: 440.0, ES0: 0.223, ET0: 0.22000000000000003, + IRRAD: 10561000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 14.0, + TMAX: 15.6, TMIN: 12.4, VAP: 11.9, WIND: 2.65780634934697} +- {DAY: 2010-08-29, E0: 0.252, ELEV: 440.0, ES0: 0.225, ET0: 0.209, IRRAD: 11595000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.9, SNOWDEPTH: .nan, TEMP: 11.95, TMAX: 15.5, + TMIN: 8.4, VAP: 10.76, WIND: 2.7296389533833745} +- {DAY: 2010-08-30, E0: 0.176, ELEV: 440.0, ES0: 0.157, ET0: 0.141, IRRAD: 8652000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.47000000000000003, SNOWDEPTH: .nan, TEMP: 9.399999999999999, + TMAX: 11.2, TMIN: 7.6, VAP: 9.95, WIND: 2.9451367654925877} +- {DAY: 2010-08-31, E0: 0.196, ELEV: 440.0, ES0: 0.174, ET0: 0.178, IRRAD: 10017000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.02, SNOWDEPTH: .nan, TEMP: 11.1, TMAX: 14.6, + TMIN: 7.6, VAP: 10.35, WIND: 2.083145517055733} +- {DAY: 2010-09-01, E0: 0.16799999999999998, ELEV: 440.0, ES0: 0.149, ET0: 0.142, + IRRAD: 8681000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 10.0, + TMAX: 14.4, TMIN: 5.6, VAP: 10.66, WIND: 1.72398249687371} +- {DAY: 2010-09-02, E0: 0.175, ELEV: 440.0, ES0: 0.154, ET0: 0.147, IRRAD: 8821000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.03, SNOWDEPTH: .nan, TEMP: 11.65, TMAX: 15.8, + TMIN: 7.5, VAP: 11.7, WIND: 1.0056564565096642} +- {DAY: 2010-09-03, E0: 0.24900000000000003, ELEV: 440.0, ES0: 0.21400000000000002, + ET0: 0.211, IRRAD: 14382000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, + TEMP: 12.35, TMAX: 17.2, TMIN: 7.5, VAP: 11.33, WIND: 1.221154268618878} +- {DAY: 2010-09-04, E0: 0.225, ELEV: 440.0, ES0: 0.20099999999999998, ET0: 0.194, + IRRAD: 9609000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.02, SNOWDEPTH: .nan, TEMP: 13.15, + TMAX: 16.6, TMIN: 9.7, VAP: 10.66, WIND: 1.5084846847644964} +- {DAY: 2010-09-05, E0: 0.306, ELEV: 440.0, ES0: 0.262, ET0: 0.277, IRRAD: 19211000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 11.1, TMAX: 16.2, + TMIN: 6.0, VAP: 9.21, WIND: 2.65780634934697} +- {DAY: 2010-09-06, E0: 0.29100000000000004, ELEV: 440.0, ES0: 0.24900000000000003, + ET0: 0.272, IRRAD: 18341000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, + TEMP: 10.75, TMAX: 15.9, TMIN: 5.6, VAP: 8.77, WIND: 2.5859737453105653} +- {DAY: 2010-09-07, E0: 0.24, ELEV: 440.0, ES0: 0.21000000000000002, ET0: 0.193, IRRAD: 13266000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.03, SNOWDEPTH: .nan, TEMP: 9.75, TMAX: 14.3, + TMIN: 5.2, VAP: 9.88, WIND: 3.663462805856634} +- {DAY: 2010-09-08, E0: 0.22000000000000003, ELEV: 440.0, ES0: 0.196, ET0: 0.152, + IRRAD: 9667000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.6, SNOWDEPTH: .nan, TEMP: 12.8, + TMAX: 14.9, TMIN: 10.7, VAP: 12.91, WIND: 3.2324671816382065} +- {DAY: 2010-09-09, E0: 0.131, ELEV: 440.0, ES0: 0.11699999999999999, ET0: 0.131, + IRRAD: 5725000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 13.65, + TMAX: 15.8, TMIN: 11.5, VAP: 13.18, WIND: 1.7958151009101146} +- {DAY: 2010-09-10, E0: 0.211, ELEV: 440.0, ES0: 0.184, ET0: 0.185, IRRAD: 10961000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 14.200000000000001, + TMAX: 18.6, TMIN: 9.8, VAP: 12.95, WIND: 1.2929868726552827} +- {DAY: 2010-09-11, E0: 0.286, ELEV: 440.0, ES0: 0.242, ET0: 0.253, IRRAD: 17976000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 14.05, TMAX: 21.0, + TMIN: 7.1, VAP: 11.57, WIND: 1.0056564565096642} +- {DAY: 2010-09-12, E0: 0.246, ELEV: 440.0, ES0: 0.205, ET0: 0.238, IRRAD: 16699000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 13.95, TMAX: 21.7, + TMIN: 6.2, VAP: 11.67, WIND: 0.861991248436855} +- {DAY: 2010-09-13, E0: 0.101, ELEV: 440.0, ES0: 0.088, ET0: 0.11699999999999999, + IRRAD: 5574000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.02, SNOWDEPTH: .nan, TEMP: 12.4, + TMAX: 15.9, TMIN: 8.9, VAP: 12.58, WIND: 1.221154268618878} +- {DAY: 2010-09-14, E0: 0.12, ELEV: 440.0, ES0: 0.10600000000000001, ET0: 0.10300000000000001, + IRRAD: 5860000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 11.2, + TMAX: 13.8, TMIN: 8.6, VAP: 12.17, WIND: 2.370475933201351} +- {DAY: 2010-09-15, E0: 0.124, ELEV: 440.0, ES0: 0.11499999999999999, ET0: 0.132, + IRRAD: 3950000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.7, SNOWDEPTH: .nan, TEMP: 13.55, + TMAX: 15.2, TMIN: 11.9, VAP: 12.81, WIND: 2.801471557419779} +- {DAY: 2010-09-16, E0: 0.24100000000000002, ELEV: 440.0, ES0: 0.21600000000000003, + ET0: 0.22400000000000003, IRRAD: 10417000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, + SNOWDEPTH: .nan, TEMP: 13.149999999999999, TMAX: 16.4, TMIN: 9.9, VAP: 10.32, WIND: 2.5859737453105653} +- {DAY: 2010-09-17, E0: 0.195, ELEV: 440.0, ES0: 0.16899999999999998, ET0: 0.192, + IRRAD: 11312000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 10.5, + TMAX: 15.9, TMIN: 5.1, VAP: 9.17, WIND: 1.939480308982924} +- {DAY: 2010-09-18, E0: 0.182, ELEV: 440.0, ES0: 0.152, ET0: 0.176, IRRAD: 14229000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 8.25, TMAX: 14.7, + TMIN: 1.8, VAP: 8.29, WIND: 1.221154268618878} +- {DAY: 2010-09-19, E0: 0.20099999999999998, ELEV: 440.0, ES0: 0.16899999999999998, + ET0: 0.186, IRRAD: 14777000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, + TEMP: 8.75, TMAX: 15.2, TMIN: 2.3, VAP: 7.79, WIND: 1.077489060546069} +- {DAY: 2010-09-20, E0: 0.176, ELEV: 440.0, ES0: 0.143, ET0: 0.19, IRRAD: 14819000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 9.8, TMAX: 18.3, + TMIN: 1.3, VAP: 9.21, WIND: 1.0056564565096642} +- {DAY: 2010-09-21, E0: 0.21000000000000002, ELEV: 440.0, ES0: 0.16999999999999998, + ET0: 0.225, IRRAD: 17280000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, + TEMP: 12.399999999999999, TMAX: 20.9, TMIN: 3.9, VAP: 9.85, WIND: 0.9338238524732597} +- {DAY: 2010-09-22, E0: 0.215, ELEV: 440.0, ES0: 0.174, ET0: 0.23500000000000001, + IRRAD: 16698000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 13.45, + TMAX: 20.8, TMIN: 6.1, VAP: 10.93, WIND: 1.3648194766916872} +- {DAY: 2010-09-23, E0: 0.191, ELEV: 440.0, ES0: 0.155, ET0: 0.198, IRRAD: 14630000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 13.600000000000001, + TMAX: 20.6, TMIN: 6.6, VAP: 12.24, WIND: 1.077489060546069} +- {DAY: 2010-09-24, E0: 0.20299999999999999, ELEV: 440.0, ES0: 0.17099999999999999, + ET0: 0.207, IRRAD: 12696000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.2, SNOWDEPTH: .nan, + TEMP: 14.600000000000001, TMAX: 21.3, TMIN: 7.9, VAP: 12.91, WIND: 1.6521498928373055} +- {DAY: 2010-09-25, E0: 0.072, ELEV: 440.0, ES0: 0.064, ET0: 0.08299999999999999, + IRRAD: 3235000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.9, SNOWDEPTH: .nan, TEMP: 12.15, + TMAX: 13.3, TMIN: 11.0, VAP: 12.81, WIND: 1.8676477049465194} +- {DAY: 2010-09-26, E0: 0.118, ELEV: 440.0, ES0: 0.10700000000000001, ET0: 0.11100000000000002, + IRRAD: 5247000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 8.95, + TMAX: 10.9, TMIN: 7.0, VAP: 9.37, WIND: 2.5859737453105653} +- {DAY: 2010-09-27, E0: 0.181, ELEV: 440.0, ES0: 0.16, ET0: 0.153, IRRAD: 9271000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 1.0, SNOWDEPTH: .nan, TEMP: 8.95, TMAX: 12.4, + TMIN: 5.5, VAP: 9.07, WIND: 3.44796499374742} +- {DAY: 2010-09-28, E0: 0.063, ELEV: 440.0, ES0: 0.05600000000000001, ET0: 0.057999999999999996, + IRRAD: 3652000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.9, SNOWDEPTH: .nan, TEMP: 8.25, + TMAX: 9.1, TMIN: 7.4, VAP: 10.45, WIND: 3.0169693695289928} +- {DAY: 2010-09-29, E0: 0.153, ELEV: 440.0, ES0: 0.134, ET0: 0.127, IRRAD: 8714000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 9.9, TMAX: 12.1, + TMIN: 7.7, VAP: 9.61, WIND: 1.4366520807280918} +- {DAY: 2010-09-30, E0: 0.13999999999999999, ELEV: 440.0, ES0: 0.123, ET0: 0.11299999999999999, + IRRAD: 7718000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 8.2, + TMAX: 12.3, TMIN: 4.1, VAP: 8.46, WIND: 1.0056564565096642} +- {DAY: 2010-10-01, E0: 0.06, ELEV: 440.0, ES0: 0.053000000000000005, ET0: 0.071, + IRRAD: 3340000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.08, SNOWDEPTH: .nan, TEMP: 7.55, + TMAX: 10.2, TMIN: 4.9, VAP: 9.54, WIND: 1.221154268618878} +- {DAY: 2010-10-02, E0: 0.11499999999999999, ELEV: 440.0, ES0: 0.10200000000000001, + ET0: 0.099, IRRAD: 6112000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, + TEMP: 10.4, TMAX: 13.8, TMIN: 7.0, VAP: 11.16, WIND: 1.5803172888009012} +- {DAY: 2010-10-03, E0: 0.152, ELEV: 440.0, ES0: 0.128, ET0: 0.134, IRRAD: 10165000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 11.25, TMAX: 12.9, + TMIN: 9.6, VAP: 11.19, WIND: 3.304299785674611} +- {DAY: 2010-10-04, E0: 0.142, ELEV: 440.0, ES0: 0.118, ET0: 0.125, IRRAD: 10677000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 10.5, TMAX: 12.3, + TMIN: 8.7, VAP: 10.96, WIND: 3.735295409893039} +- {DAY: 2010-10-05, E0: 0.121, ELEV: 440.0, ES0: 0.10600000000000001, ET0: 0.092, + IRRAD: 6490000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 11.3, + TMAX: 13.2, TMIN: 9.4, VAP: 12.07, WIND: 2.154978121092138} +- {DAY: 2010-10-06, E0: 0.08299999999999999, ELEV: 440.0, ES0: 0.074, ET0: 0.077, + IRRAD: 3969000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 11.0, + TMAX: 12.2, TMIN: 9.8, VAP: 12.0, WIND: 2.0113129130193284} +- {DAY: 2010-10-07, E0: 0.072, ELEV: 440.0, ES0: 0.065, ET0: 0.079, IRRAD: 3115000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 11.2, TMAX: 11.9, + TMIN: 10.5, VAP: 11.94, WIND: 2.370475933201351} +- {DAY: 2010-10-08, E0: 0.178, ELEV: 440.0, ES0: 0.148, ET0: 0.21400000000000002, + IRRAD: 12854000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 11.700000000000001, + TMAX: 16.1, TMIN: 7.3, VAP: 9.58, WIND: 3.663462805856634} +- {DAY: 2010-10-09, E0: 0.20400000000000001, ELEV: 440.0, ES0: 0.175, ET0: 0.23700000000000002, + IRRAD: 12656000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 10.600000000000001, + TMAX: 15.3, TMIN: 5.9, VAP: 7.55, WIND: 3.44796499374742} +- {DAY: 2010-10-10, E0: 0.16399999999999998, ELEV: 440.0, ES0: 0.135, ET0: 0.213, + IRRAD: 13447000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 8.85, + TMAX: 14.0, TMIN: 3.7, VAP: 6.58, WIND: 2.8733041614561836} +- {DAY: 2010-10-11, E0: 0.16, ELEV: 440.0, ES0: 0.131, ET0: 0.21200000000000002, IRRAD: 13109000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 8.9, TMAX: 14.5, + TMIN: 3.3, VAP: 6.85, WIND: 3.0169693695289928} +- {DAY: 2010-10-12, E0: 0.123, ELEV: 440.0, ES0: 0.096, ET0: 0.16299999999999998, + IRRAD: 13005000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 7.449999999999999, + TMAX: 14.2, TMIN: 0.7, VAP: 7.32, WIND: 2.5141411412741608} +- {DAY: 2010-10-13, E0: 0.11499999999999999, ELEV: 440.0, ES0: 0.092, ET0: 0.134, + IRRAD: 11311000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 6.85, + TMAX: 12.1, TMIN: 1.6, VAP: 7.62, WIND: 2.8733041614561836} +- {DAY: 2010-10-14, E0: 0.073, ELEV: 440.0, ES0: 0.052000000000000005, ET0: 0.10700000000000001, + IRRAD: 10652000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 5.5, + TMAX: 12.4, TMIN: -1.4, VAP: 7.05, WIND: 1.2929868726552827} +- {DAY: 2010-10-15, E0: 0.052000000000000005, ELEV: 440.0, ES0: 0.045, ET0: 0.05, + IRRAD: 3788000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.43, SNOWDEPTH: .nan, TEMP: 4.2, + TMAX: 8.6, TMIN: -0.2, VAP: 8.19, WIND: 0.9338238524732597} +- {DAY: 2010-10-16, E0: 0.054000000000000006, ELEV: 440.0, ES0: 0.047, ET0: 0.057999999999999996, + IRRAD: 3202000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.31, SNOWDEPTH: .nan, TEMP: 6.7, + TMAX: 7.5, TMIN: 5.9, VAP: 8.94, WIND: 1.1493216645824735} +- {DAY: 2010-10-17, E0: 0.08299999999999999, ELEV: 440.0, ES0: 0.076, ET0: 0.08399999999999999, + IRRAD: 3537000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 6.3, + TMAX: 7.5, TMIN: 5.1, VAP: 7.72, WIND: 2.442308537237756} +- {DAY: 2010-10-18, E0: 0.08499999999999999, ELEV: 440.0, ES0: 0.075, ET0: 0.074, + IRRAD: 5197000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 4.9, + TMAX: 7.5, TMIN: 2.3, VAP: 7.05, WIND: 1.3648194766916872} +- {DAY: 2010-10-19, E0: 0.061, ELEV: 440.0, ES0: 0.053000000000000005, ET0: 0.06999999999999999, + IRRAD: 3878000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.4, SNOWDEPTH: .nan, TEMP: 4.95, + TMAX: 7.2, TMIN: 2.7, VAP: 7.55, WIND: 2.5859737453105653} +- {DAY: 2010-10-20, E0: 0.068, ELEV: 440.0, ES0: 0.062, ET0: 0.072, IRRAD: 3005000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.52, SNOWDEPTH: .nan, TEMP: 5.449999999999999, + TMAX: 6.6, TMIN: 4.3, VAP: 7.72, WIND: 3.0169693695289928} +- {DAY: 2010-10-21, E0: 0.099, ELEV: 440.0, ES0: 0.089, ET0: 0.10200000000000001, + IRRAD: 5320000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 3.75, + TMAX: 6.1, TMIN: 1.4, VAP: 5.87, WIND: 2.8733041614561836} +- {DAY: 2010-10-22, E0: 0.05500000000000001, ELEV: 440.0, ES0: 0.04, ET0: 0.073, IRRAD: 8983000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 2.1, TMAX: 6.9, + TMIN: -2.7, VAP: 5.7, WIND: 1.5084846847644964} +- {DAY: 2010-10-23, E0: 0.037, ELEV: 440.0, ES0: 0.025, ET0: 0.06, IRRAD: 6012000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.21000000000000002, SNOWDEPTH: .nan, TEMP: 3.6999999999999997, + TMAX: 9.6, TMIN: -2.2, VAP: 7.35, WIND: 1.6521498928373055} +- {DAY: 2010-10-24, E0: 0.05500000000000001, ELEV: 440.0, ES0: 0.049, ET0: 0.066, + IRRAD: 2853000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.2, SNOWDEPTH: .nan, TEMP: 6.35, + TMAX: 7.6, TMIN: 5.1, VAP: 8.36, WIND: 2.370475933201351} +- {DAY: 2010-10-25, E0: 0.05600000000000001, ELEV: 440.0, ES0: 0.05, ET0: 0.05600000000000001, + IRRAD: 3202000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 3.8, + TMAX: 5.6, TMIN: 2.0, VAP: 6.78, WIND: 1.1493216645824735} +- {DAY: 2010-10-26, E0: 0.051000000000000004, ELEV: 440.0, ES0: 0.040999999999999995, + ET0: 0.06, IRRAD: 5809000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, + TEMP: 2.4, TMAX: 6.8, TMIN: -2.0, VAP: 6.07, WIND: 1.1493216645824735} +- {DAY: 2010-10-27, E0: 0.047, ELEV: 440.0, ES0: 0.031, ET0: 0.061, IRRAD: 9014000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 2.5, TMAX: 8.1, + TMIN: -3.1, VAP: 5.87, WIND: 1.1493216645824735} +- {DAY: 2010-10-28, E0: 0.071, ELEV: 440.0, ES0: 0.05600000000000001, ET0: 0.08399999999999999, + IRRAD: 7497000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 5.3999999999999995, + TMAX: 10.6, TMIN: 0.2, VAP: 6.58, WIND: 1.4366520807280918} +- {DAY: 2010-10-29, E0: 0.032, ELEV: 440.0, ES0: 0.012, ET0: 0.087, IRRAD: 9759000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 6.65, TMAX: 14.4, + TMIN: -1.1, VAP: 6.78, WIND: 1.077489060546069} +- {DAY: 2010-10-30, E0: 0.034999999999999996, ELEV: 440.0, ES0: 0.018, ET0: 0.075, + IRRAD: 8668000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 5.8500000000000005, + TMAX: 11.9, TMIN: -0.2, VAP: 7.01, WIND: 1.3648194766916872} +- {DAY: 2010-10-31, E0: 0.046, ELEV: 440.0, ES0: 0.033, ET0: 0.06899999999999999, + IRRAD: 6399000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 6.6499999999999995, + TMAX: 11.6, TMIN: 1.7, VAP: 8.06, WIND: 1.72398249687371} +- {DAY: 2010-11-01, E0: 0.073, ELEV: 440.0, ES0: 0.061, ET0: 0.071, IRRAD: 5266000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 9.8, TMAX: 14.3, + TMIN: 5.3, VAP: 9.64, WIND: 1.077489060546069} +- {DAY: 2010-11-02, E0: 0.019, ELEV: 440.0, ES0: 0.012, ET0: 0.04, IRRAD: 3367000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 5.45, TMAX: 8.3, + TMIN: 2.6, VAP: 8.87, WIND: 1.8676477049465194} +- {DAY: 2010-11-03, E0: 0.062, ELEV: 440.0, ES0: 0.054000000000000006, ET0: 0.074, + IRRAD: 3638000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.06, SNOWDEPTH: .nan, TEMP: 8.4, + TMAX: 11.8, TMIN: 5.0, VAP: 9.74, WIND: 3.1606345776018023} +- {DAY: 2010-11-04, E0: 0.11499999999999999, ELEV: 440.0, ES0: 0.11000000000000001, + ET0: 0.141, IRRAD: 1972000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, + TEMP: 12.9, TMAX: 15.4, TMIN: 10.4, VAP: 11.9, WIND: 4.597286658329894} +- {DAY: 2010-11-05, E0: 0.154, ELEV: 440.0, ES0: 0.144, ET0: 0.177, IRRAD: 4424000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 13.5, TMAX: 14.7, + TMIN: 12.3, VAP: 10.86, WIND: 4.166291034111466} +- {DAY: 2010-11-06, E0: 0.10800000000000001, ELEV: 440.0, ES0: 0.10400000000000001, + ET0: 0.146, IRRAD: 1597000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.5, SNOWDEPTH: .nan, + TEMP: 11.5, TMAX: 12.3, TMIN: 10.7, VAP: 9.88, WIND: 3.519797597783825} +- {DAY: 2010-11-07, E0: 0.034999999999999996, ELEV: 440.0, ES0: 0.03, ET0: 0.056999999999999995, + IRRAD: 1958000.0, LAT: 49.43613, LON: 12.98528, RAIN: 1.2, SNOWDEPTH: .nan, TEMP: 8.149999999999999, + TMAX: 10.2, TMIN: 6.1, VAP: 9.68, WIND: 1.5803172888009012} +- {DAY: 2010-11-08, E0: 0.037, ELEV: 440.0, ES0: 0.033, ET0: 0.045, IRRAD: 2280000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: .nan, TEMP: 4.6, TMAX: 5.6, + TMIN: 3.6, VAP: 7.62, WIND: 1.5084846847644964} +- {DAY: 2010-11-09, E0: 0.032, ELEV: 440.0, ES0: 0.020999999999999998, ET0: 0.048, + IRRAD: 5597000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 5.0, + TMAX: 8.1, TMIN: 1.9, VAP: 7.28, WIND: 1.5084846847644964} +- {DAY: 2010-11-10, E0: 0.032, ELEV: 440.0, ES0: 0.026000000000000002, ET0: 0.03, + IRRAD: 3253000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.05, SNOWDEPTH: .nan, TEMP: 2.6999999999999997, + TMAX: 5.8, TMIN: -0.4, VAP: 7.18, WIND: 1.221154268618878} +- {DAY: 2010-11-11, E0: 0.046, ELEV: 440.0, ES0: 0.039, ET0: 0.05500000000000001, + IRRAD: 3562000.0, LAT: 49.43613, LON: 12.98528, RAIN: 1.01, SNOWDEPTH: .nan, TEMP: 4.0, + TMAX: 6.3, TMIN: 1.7, VAP: 7.11, WIND: 3.663462805856634} +- {DAY: 2010-11-12, E0: 0.027000000000000003, ELEV: 440.0, ES0: 0.02, ET0: 0.040999999999999995, + IRRAD: 3632000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.27, SNOWDEPTH: .nan, TEMP: 6.8, + TMAX: 10.0, TMIN: 3.6, VAP: 9.44, WIND: 4.956449678511917} +- {DAY: 2010-11-13, E0: 0.101, ELEV: 440.0, ES0: 0.092, ET0: 0.149, IRRAD: 4082000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 12.6, TMAX: 16.2, + TMIN: 9.0, VAP: 11.03, WIND: 4.094458430075062} +- {DAY: 2010-11-14, E0: 0.009, ELEV: 440.0, ES0: 0.004, ET0: 0.081, IRRAD: 7485000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 11.25, TMAX: 16.8, + TMIN: 5.7, VAP: 9.74, WIND: 1.6521498928373055} +- {DAY: 2010-11-15, E0: 0.040999999999999995, ELEV: 440.0, ES0: 0.032, ET0: 0.06, + IRRAD: 4089000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.09, SNOWDEPTH: .nan, TEMP: 8.45, + TMAX: 12.2, TMIN: 4.7, VAP: 9.71, WIND: 2.083145517055733} +- {DAY: 2010-11-16, E0: 0.02, ELEV: 440.0, ES0: 0.018, ET0: 0.047, IRRAD: 1177000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.13, SNOWDEPTH: .nan, TEMP: 5.9, TMAX: 6.0, + TMIN: 5.8, VAP: 8.53, WIND: 2.298643329164947} +- {DAY: 2010-11-17, E0: 0.013000000000000001, ELEV: 440.0, ES0: 0.011, ET0: 0.033, + IRRAD: 1433000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.2, SNOWDEPTH: .nan, TEMP: 4.4, + TMAX: 5.2, TMIN: 3.6, VAP: 8.03, WIND: 1.7958151009101146} +- {DAY: 2010-11-18, E0: 0.017, ELEV: 440.0, ES0: 0.014000000000000002, ET0: 0.040999999999999995, + IRRAD: 1288000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.3, SNOWDEPTH: .nan, TEMP: 4.800000000000001, + TMAX: 4.9, TMIN: 4.7, VAP: 7.89, WIND: 1.5803172888009012} +- {DAY: 2010-11-19, E0: 0.014000000000000002, ELEV: 440.0, ES0: 0.011, ET0: 0.03, + IRRAD: 1611000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.04, SNOWDEPTH: .nan, TEMP: 3.1500000000000004, + TMAX: 4.9, TMIN: 1.4, VAP: 7.42, WIND: 1.0056564565096642} +- {DAY: 2010-11-20, E0: 0.024, ELEV: 440.0, ES0: 0.019, ET0: 0.03, IRRAD: 2629000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: .nan, TEMP: 2.95, TMAX: 4.3, + TMIN: 1.6, VAP: 6.88, WIND: 1.5084846847644964} +- {DAY: 2010-11-21, E0: 0.025, ELEV: 440.0, ES0: 0.02, ET0: 0.022, IRRAD: 2790000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.3, SNOWDEPTH: .nan, TEMP: 2.75, TMAX: 4.2, + TMIN: 1.3, VAP: 7.18, WIND: 3.376132389711016} +- {DAY: 2010-11-22, E0: 0.05600000000000001, ELEV: 440.0, ES0: 0.052000000000000005, + ET0: 0.056999999999999995, IRRAD: 1810000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.16, + SNOWDEPTH: .nan, TEMP: 5.4, TMAX: 7.0, TMIN: 3.8, VAP: 7.79, WIND: 2.8733041614561836} +- {DAY: 2010-11-23, E0: 0.033, ELEV: 440.0, ES0: 0.031, ET0: 0.036, IRRAD: 1270000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.18, SNOWDEPTH: 0.5, TEMP: 0.8500000000000001, + TMAX: 1.3, TMIN: 0.4, VAP: 6.0, WIND: 3.735295409893039} +- {DAY: 2010-11-24, E0: 0.034999999999999996, ELEV: 440.0, ES0: 0.032, ET0: 0.034, + IRRAD: 1628000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.12, SNOWDEPTH: 4.0, TEMP: 1.2, + TMAX: 1.9, TMIN: 0.5, VAP: 6.14, WIND: 3.878960617965848} +- {DAY: 2010-11-25, E0: 0.022, ELEV: 440.0, ES0: 0.016, ET0: 0.03, IRRAD: 3374000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.06999999999999999, SNOWDEPTH: 1.0, TEMP: 0.7499999999999999, + TMAX: 2.3, TMIN: -0.8, VAP: 5.66, WIND: 1.8676477049465194} +- {DAY: 2010-11-26, E0: 0.014000000000000002, ELEV: 440.0, ES0: 0.012, ET0: 0.024, + IRRAD: 1677000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.16, SNOWDEPTH: 2.0, TEMP: -1.3, + TMAX: -0.2, TMIN: -2.4, VAP: 5.23, WIND: 1.221154268618878} +- {DAY: 2010-11-27, E0: 0.024, ELEV: 440.0, ES0: 0.018, ET0: 0.026000000000000002, + IRRAD: 3588000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: 2.0, TEMP: -2.0, + TMAX: -0.4, TMIN: -3.6, VAP: 4.28, WIND: 1.221154268618878} +- {DAY: 2010-11-28, E0: 0.024, ELEV: 440.0, ES0: 0.02, ET0: 0.013000000000000001, + IRRAD: 3194000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.5, SNOWDEPTH: 2.0, TEMP: -3.85, + TMAX: -1.5, TMIN: -6.2, VAP: 4.35, WIND: 2.370475933201351} +- {DAY: 2010-11-29, E0: 0.028000000000000004, ELEV: 440.0, ES0: 0.024, ET0: 0.019, + IRRAD: 2553000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.4, SNOWDEPTH: 16.0, TEMP: -1.95, + TMAX: -1.0, TMIN: -2.9, VAP: 4.96, WIND: 1.5803172888009012} +- {DAY: 2010-11-30, E0: 0.027000000000000003, ELEV: 440.0, ES0: 0.024, ET0: 0.03, + IRRAD: 2146000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: 19.0, TEMP: -3.8000000000000003, + TMAX: -3.2, TMIN: -4.4, VAP: 3.98, WIND: 2.370475933201351} +- {DAY: 2010-12-01, E0: 0.03, ELEV: 440.0, ES0: 0.028000000000000004, ET0: 0.036, + IRRAD: 1406000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.4, SNOWDEPTH: 20.0, TEMP: -6.0, + TMAX: -4.8, TMIN: -7.2, VAP: 3.37, WIND: 4.453621450257085} +- {DAY: 2010-12-02, E0: 0.023, ELEV: 440.0, ES0: 0.019, ET0: 0.020999999999999998, + IRRAD: 3010000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: 24.0, TEMP: -7.95, + TMAX: -5.5, TMIN: -10.4, VAP: 2.87, WIND: 1.939480308982924} +- {DAY: 2010-12-03, E0: 0.019, ELEV: 440.0, ES0: 0.015, ET0: 0.015, IRRAD: 2926000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: 20.0, TEMP: -8.100000000000001, + TMAX: -5.4, TMIN: -10.8, VAP: 2.83, WIND: 0.7901586444004506} +- {DAY: 2010-12-04, E0: 0.014000000000000002, ELEV: 440.0, ES0: 0.012, ET0: 0.015, + IRRAD: 1788000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: 20.0, TEMP: -8.6, + TMAX: -5.1, TMIN: -12.1, VAP: 3.14, WIND: 2.0113129130193284} +- {DAY: 2010-12-05, E0: 0.017, ELEV: 440.0, ES0: 0.014000000000000002, ET0: 0.01, + IRRAD: 2315000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.9, SNOWDEPTH: 18.0, TEMP: -7.35, + TMAX: -3.7, TMIN: -11.0, VAP: 3.61, WIND: 1.939480308982924} +- {DAY: 2010-12-06, E0: 0.008, ELEV: 440.0, ES0: 0.006, ET0: 0.017, IRRAD: 1609000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 2.0, SNOWDEPTH: 23.0, TEMP: -1.9999999999999998, + TMAX: 0.1, TMIN: -4.1, VAP: 5.26, WIND: 1.1493216645824735} +- {DAY: 2010-12-07, E0: 0.011, ELEV: 440.0, ES0: 0.009, ET0: 0.019, IRRAD: 1671000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.5, SNOWDEPTH: 25.0, TEMP: 0.0, TMAX: 1.5, + TMIN: -1.5, VAP: 5.93, WIND: 1.0056564565096642} +- {DAY: 2010-12-08, E0: 0.02, ELEV: 440.0, ES0: 0.016, ET0: 0.022, IRRAD: 1933000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.3, SNOWDEPTH: 21.0, TEMP: 2.6500000000000004, + TMAX: 4.9, TMIN: 0.4, VAP: 7.11, WIND: 1.5803172888009012} +- {DAY: 2010-12-09, E0: 0.020999999999999998, ELEV: 440.0, ES0: 0.018, ET0: 0.024, + IRRAD: 1529000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.09, SNOWDEPTH: 14.0, TEMP: -2.0, + TMAX: -1.2, TMIN: -2.8, VAP: 4.92, WIND: 4.597286658329894} +- {DAY: 2010-12-10, E0: 0.018, ELEV: 440.0, ES0: 0.013000000000000001, ET0: 0.028999999999999998, + IRRAD: 3723000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.42000000000000004, SNOWDEPTH: 14.0, + TEMP: -2.45, TMAX: -2.0, TMIN: -2.9, VAP: 4.28, WIND: 3.0888019735653973} +- {DAY: 2010-12-11, E0: 0.007000000000000001, ELEV: 440.0, ES0: 0.005, ET0: 0.01, + IRRAD: 1355000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.6, SNOWDEPTH: 16.0, TEMP: -0.30000000000000004, + TMAX: 2.3, TMIN: -2.9, VAP: 6.07, WIND: 4.453621450257085} +- {DAY: 2010-12-12, E0: 0.039, ELEV: 440.0, ES0: 0.036, ET0: 0.043, IRRAD: 1668000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.24, SNOWDEPTH: 9.0, TEMP: 1.0499999999999998, + TMAX: 1.4, TMIN: 0.7, VAP: 5.8, WIND: 3.807128013929443} +- {DAY: 2010-12-13, E0: 0.006, ELEV: 440.0, ES0: 0.003, ET0: 0.022, IRRAD: 4070000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.05, SNOWDEPTH: 9.0, TEMP: -5.9, TMAX: -5.6, + TMIN: -6.2, VAP: 3.17, WIND: 2.5141411412741608} +- {DAY: 2010-12-14, E0: 0.014000000000000002, ELEV: 440.0, ES0: 0.011, ET0: 0.008, + IRRAD: 2280000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.27, SNOWDEPTH: 9.0, TEMP: -8.25, + TMAX: -5.4, TMIN: -11.1, VAP: 3.27, WIND: 2.083145517055733} +- {DAY: 2010-12-15, E0: 0.022, ELEV: 440.0, ES0: 0.019, ET0: 0.020999999999999998, + IRRAD: 1877000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.16, SNOWDEPTH: 9.0, TEMP: -6.65, + TMAX: -6.3, TMIN: -7.0, VAP: 3.34, WIND: 2.801471557419779} +- {DAY: 2010-12-16, E0: 0.011, ELEV: 440.0, ES0: 0.009, ET0: 0.01, IRRAD: 3137000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.06999999999999999, SNOWDEPTH: 11.0, TEMP: -9.1, + TMAX: -6.2, TMIN: -12.0, VAP: 2.8, WIND: 2.154978121092138} +- {DAY: 2010-12-17, E0: 0.011, ELEV: 440.0, ES0: 0.009, ET0: 0.016, IRRAD: 1541000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.3, SNOWDEPTH: 13.0, TEMP: -7.25, TMAX: -4.9, + TMIN: -9.6, VAP: 3.41, WIND: 1.939480308982924} +- {DAY: 2010-12-18, E0: 0.007000000000000001, ELEV: 440.0, ES0: 0.005, ET0: 0.01, + IRRAD: 3633000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: 13.0, TEMP: -7.3, + TMAX: -4.1, TMIN: -10.5, VAP: 3.03, WIND: 1.5084846847644964} +- {DAY: 2010-12-19, E0: 0.006, ELEV: 440.0, ES0: 0.004, ET0: 0.009, IRRAD: 1737000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.29, SNOWDEPTH: 13.0, TEMP: -6.75, TMAX: -0.6, + TMIN: -12.9, VAP: 4.01, WIND: 2.154978121092138} +- {DAY: 2010-12-20, E0: 0.036, ELEV: 440.0, ES0: 0.033, ET0: 0.048, IRRAD: 1538000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.41, SNOWDEPTH: 13.0, TEMP: 0.7, TMAX: 2.9, + TMIN: -1.5, VAP: 5.4, WIND: 2.65780634934697} +- {DAY: 2010-12-21, E0: 0.014000000000000002, ELEV: 440.0, ES0: 0.011, ET0: 0.018, + IRRAD: 2103000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: 13.0, TEMP: -0.19999999999999996, + TMAX: 3.5, TMIN: -3.9, VAP: 5.8, WIND: 1.2929868726552827} +- {DAY: 2010-12-22, E0: 0.017, ELEV: 440.0, ES0: 0.014000000000000002, ET0: 0.014000000000000002, + IRRAD: 2105000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: 13.0, TEMP: -0.44999999999999996, + TMAX: 1.5, TMIN: -2.4, VAP: 5.66, WIND: 1.221154268618878} +- {DAY: 2010-12-23, E0: 0.019, ELEV: 440.0, ES0: 0.016, ET0: 0.014000000000000002, + IRRAD: 2239000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: 12.0, TEMP: -0.5, + TMAX: 2.1, TMIN: -3.1, VAP: 5.66, WIND: 1.2929868726552827} +- {DAY: 2010-12-24, E0: 0.012, ELEV: 440.0, ES0: 0.01, ET0: 0.028999999999999998, + IRRAD: 1140000.0, LAT: 49.43613, LON: 12.98528, RAIN: 1.0, SNOWDEPTH: 13.0, TEMP: 0.3, + TMAX: 1.5, TMIN: -0.9, VAP: 5.8, WIND: 2.442308537237756} +- {DAY: 2010-12-25, E0: 0.034, ELEV: 440.0, ES0: 0.032, ET0: 0.031, IRRAD: 2108000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.01, SNOWDEPTH: 16.0, TEMP: -4.65, TMAX: -4.5, + TMIN: -4.8, VAP: 3.57, WIND: 2.298643329164947} +- {DAY: 2010-12-26, E0: 0.012, ELEV: 440.0, ES0: 0.009, ET0: 0.012, IRRAD: 2899000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.08, SNOWDEPTH: 16.0, TEMP: -9.95, TMAX: -7.9, + TMIN: -12.0, VAP: 2.6, WIND: 1.6521498928373055} +- {DAY: 2010-12-27, E0: 0.012, ELEV: 440.0, ES0: 0.01, ET0: 0.017, IRRAD: 1694000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.1, SNOWDEPTH: 16.0, TEMP: -6.5, TMAX: -4.2, + TMIN: -8.8, VAP: 3.54, WIND: 1.72398249687371} +- {DAY: 2010-12-28, E0: 0.016, ELEV: 440.0, ES0: 0.013000000000000001, ET0: 0.023, + IRRAD: 3146000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: 16.0, TEMP: -4.65, + TMAX: -2.7, TMIN: -6.6, VAP: 3.41, WIND: 1.4366520807280918} +- {DAY: 2010-12-29, E0: 0.004, ELEV: 440.0, ES0: 0.004, ET0: 0.006, IRRAD: 3716000.0, + LAT: 49.43613, LON: 12.98528, RAIN: 0.0, SNOWDEPTH: 15.0, TEMP: -11.35, TMAX: -8.7, + TMIN: -14.0, VAP: 2.09, WIND: 0.6464934363276413} +- {DAY: 2010-12-30, E0: 0.0, ELEV: 440.0, ES0: 0.0, ET0: 0.0, IRRAD: 5266000.0, LAT: 49.43613, + LON: 12.98528, RAIN: 0.0, SNOWDEPTH: 24.0, TEMP: -13.5, TMAX: -8.4, TMIN: -18.6, + VAP: 1.89, WIND: 0.6464934363276413} +- {DAY: 2010-12-31, E0: 0.007000000000000001, ELEV: 440.0, ES0: 0.005, ET0: 0.002, + IRRAD: 1689000.0, LAT: 49.43613, LON: 12.98528, RAIN: 0.05, SNOWDEPTH: 22.0, TEMP: -9.15, + TMAX: -3.4, TMIN: -14.9, VAP: 3.91, WIND: 1.72398249687371} From d665d9c5c2fed11f97dcf2ae278f22f156e29df4 Mon Sep 17 00:00:00 2001 From: SarahAlidoost Date: Tue, 16 Sep 2025 11:37:14 +0200 Subject: [PATCH 02/14] fix output names in config file of root_dynamics --- tests/physical_models/test_data/WOFOST_Root_Dynamics.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/physical_models/test_data/WOFOST_Root_Dynamics.conf b/tests/physical_models/test_data/WOFOST_Root_Dynamics.conf index 3b7224f..fc19795 100644 --- a/tests/physical_models/test_data/WOFOST_Root_Dynamics.conf +++ b/tests/physical_models/test_data/WOFOST_Root_Dynamics.conf @@ -13,7 +13,7 @@ AGROMANAGEMENT = AgroManager # variables to save at OUTPUT signals # Set to an empty list if you do not want any OUTPUT -OUTPUT_VARS = ["LAI", "TWLV"] +OUTPUT_VARS = ["RD", "TWRT"] # interval for OUTPUT signals, either "daily"|"dekadal"|"monthly"|"weekly" # For daily output you change the number of days between successive # outputs using OUTPUT_INTERVAL_DAYS. For dekadal and monthly From c6bfc1ce93ade244144ecf452cc609fb1cfb2e37 Mon Sep 17 00:00:00 2001 From: SarahAlidoost Date: Tue, 16 Sep 2025 11:38:55 +0200 Subject: [PATCH 03/14] remove unused codes --- .../physical_models/crop/root_dynamics.py | 176 ++++-------------- 1 file changed, 40 insertions(+), 136 deletions(-) diff --git a/src/diffwofost/physical_models/crop/root_dynamics.py b/src/diffwofost/physical_models/crop/root_dynamics.py index 35a5402..ad1b08f 100644 --- a/src/diffwofost/physical_models/crop/root_dynamics.py +++ b/src/diffwofost/physical_models/crop/root_dynamics.py @@ -1,33 +1,33 @@ -# -*- coding: utf-8 -*- -# Code adapted from PCSE (Python Crop Simulation Environment) -# Copyright (c) 2004-2024 Wageningen Environmental Research, Wageningen-UR -# Allard de Wit (allard.dewit@wur.nl), March 2024 - -from pcse.traitlets import Float, Int, Instance -from pcse.decorators import prepare_rates, prepare_states -from pcse.util import limit, merge_dict, AfgenTrait -from pcse.base import ParamTemplate, StatesTemplate, RatesTemplate, \ - SimulationObject, VariableKiosk - - +import torch +from pcse.base import ParamTemplate +from pcse.base import RatesTemplate +from pcse.base import SimulationObject +from pcse.base import StatesTemplate +from pcse.decorators import prepare_rates +from pcse.decorators import prepare_states +from pcse.traitlets import Float +from pcse.traitlets import Any +from pcse.util import AfgenTrait + +DTYPE = torch.float64 # Default data type for tensors in this module class WOFOST_Root_Dynamics(SimulationObject): """Root biomass dynamics and rooting depth. - + Root growth and root biomass dynamics in WOFOST are separate processes, with the only exception that root growth stops when no more biomass is sent to the root system. - + Root biomass increase results from the assimilates partitioned to the root system. Root death is defined as the current root biomass multiplied by a relative death rate (`RDRRTB`). The latter as a function of the development stage (`DVS`). - + Increase in root depth is a simple linear expansion over time until the maximum rooting depth (`RDM`) is reached. - + **Simulation parameters** - + ======= ============================================= ======= ============ Name Description Type Unit ======= ============================================= ======= ============ @@ -41,7 +41,7 @@ class WOFOST_Root_Dynamics(SimulationObject): RDRRTB Relative death rate of roots as a function TCr - of development stage ======= ============================================= ======= ============ - + **State variables** @@ -66,34 +66,38 @@ class WOFOST_Root_Dynamics(SimulationObject): DRRT Death rate root biomass N |kg ha-1 d-1| GWRT Net change in root biomass N |kg ha-1 d-1| ======= ================================================= ==== ============ - + **Signals send or handled** - + None - + **External dependencies:** - + ======= =================================== ================= ============ Name Description Provided by Unit ======= =================================== ================= ============ DVS Crop development stage DVS_Phenology - DMI Total dry matter CropSimulation |kg ha-1 d-1| increase - FR Fraction biomass to roots DVS_Partitioning - + FR Fraction biomass to roots DVS_Partitioning - ======= =================================== ================= ============ + + **Outputs:** + - RD, TWRT + """ """ IMPORTANT NOTICE Currently root development is linear and depends only on the fraction of assimilates send to the roots (FR) and not on the amount of assimilates itself. This means that - roots also grow through the winter when there is no assimilation due to low - temperatures. There has been a discussion to change this behaviour and make root growth + roots also grow through the winter when there is no assimilation due to low + temperatures. There has been a discussion to change this behaviour and make root growth dependent on the assimilates send to the roots: so root growth stops when there are no assimilates available for growth. - - Finally, we decided not to change the root model and keep the original WOFOST approach + + Finally, we decided not to change the root model and keep the original WOFOST approach because of the following reasons: - - A dry top layer in the soil could create a large drought stress that reduces the + - A dry top layer in the soil could create a large drought stress that reduces the assimilates to zero. In this situation the roots would not grow if dependent on the assimilates, while water is available in the zone just below the root zone. Therefore a dependency on the amount of assimilates could create model instability in dry @@ -102,9 +106,9 @@ class WOFOST_Root_Dynamics(SimulationObject): after a certain development stage, putting a dependency on soil moisture levels in the unrooted soil compartment. All these solutions were found to introduce arbitrary parameters that have no clear explanation. Therefore all proposed solutions were discarded. - + We conclude that our current knowledge on root development is insufficient to propose a - better and more biophysical approach to root development in WOFOST. + better and more biophysical approach to root development in WOFOST. """ class Parameters(ParamTemplate): @@ -114,8 +118,8 @@ class Parameters(ParamTemplate): RDMSOL = Float(-99.) TDWI = Float(-99.) IAIRDU = Float(-99) - RDRRTB = AfgenTrait() - + RDRRTB = AfgenTrait() # FIXEME + class RateVariables(RatesTemplate): RR = Float(-99.) GRRT = Float(-99.) @@ -128,7 +132,7 @@ class StateVariables(StatesTemplate): WRT = Float(-99.) DWRT = Float(-99.) TWRT = Float(-99.) - + def initialize(self, day, kiosk, parvalues): """ :param day: start date of the simulation @@ -140,7 +144,7 @@ def initialize(self, day, kiosk, parvalues): self.params = self.Parameters(parvalues) self.rates = self.RateVariables(kiosk, publish=["DRRT", "GRRT"]) self.kiosk = kiosk - + # INITIAL STATES params = self.params # Initial root depth states @@ -167,14 +171,14 @@ def calc_rates(self, day, drv): r.GRRT = k.FR * k.DMI r.DRRT = s.WRT * p.RDRRTB(k.DVS) r.GWRT = r.GRRT - r.DRRT - + # Increase in root depth r.RR = min((s.RDM - s.RD), p.RRI) # Do not let the roots growth if partioning to the roots # (variable FR) is zero. if k.FR == 0.: r.RR = 0. - + @prepare_states def integrate(self, day, delt=1.0): rates = self.rates @@ -211,103 +215,3 @@ def _set_variable_WRT(self, nWRT): increments = {"WRT": states.WRT - oWRT, "TWLRT": states.TWRT - oTWRT} return increments - - - -class Simple_Root_Dynamics(SimulationObject): - """Simple class for linear root growth. - - Increase in root depth is a simple linear expansion over time until the - maximum rooting depth (`RDM`) is reached. - - **Simulation parameters** - - ======= ============================================= ======= ============ - Name Description Type Unit - ======= ============================================= ======= ============ - RDI Initial rooting depth SCr cm - RRI Daily increase in rooting depth SCr |cm day-1| - RDMCR Maximum rooting depth of the crop SCR cm - RDMSOL Maximum rooting depth of the soil SSo cm - ======= ============================================= ======= ============ - - - **State variables** - - ======= ================================================= ==== ============ - Name Description Pbl Unit - ======= ================================================= ==== ============ - RD Current rooting depth Y cm - RDM Maximum attainable rooting depth at the minimum N cm - of the soil and crop maximum rooting depth - ======= ================================================= ==== ============ - - **Rate variables** - - ======= ================================================= ==== ============ - Name Description Pbl Unit - ======= ================================================= ==== ============ - RR Growth rate root depth N cm - ======= ================================================= ==== ============ - - **Signals send or handled** - - None - - **External dependencies:** - - None - """ - - class Parameters(ParamTemplate): - """Traits-based class for storing rooting depth parameters - """ - RDI = Float(-99.) - RRI = Float(-99.) - RDMCR = Float(-99.) - RDMSOL = Float(-99.) - - class RateVariables(RatesTemplate): - RR = Float(-99.) - - class StateVariables(StatesTemplate): - RD = Float(-99.) - RDM = Float(-99.) - - def initialize(self, day, kiosk, parameters): - """ - :param day: start date of the simulation - :param kiosk: variable kiosk of this PCSE instance - :param parameters: ParameterProvider object with key/value pairs - """ - - self.params = self.Parameters(parameters) - self.rates = self.RateVariables(kiosk) - self.kiosk = kiosk - - # INITIAL STATES - params = self.params - - # Initial root depth states - rdmax = max(params.RDI, min(params.RDMCR, params.RDMSOL)) - RDM = rdmax - RD = params.RDI - - self.states = self.StateVariables(kiosk, publish=["RD"], - RD=RD, RDM=RDM) - @prepare_rates - def calc_rates(self, day, drv): - params = self.params - rates = self.rates - states = self.states - - # Increase in root depth - rates.RR = min((states.RDM - states.RD), params.RRI) - - @prepare_states - def integrate(self, day, delt=1.0): - rates = self.rates - states = self.states - - # New root depth - states.RD += rates.RR From e47ccec0c0c692828476bf7d3a4d3d32364c1874 Mon Sep 17 00:00:00 2001 From: SarahAlidoost Date: Tue, 16 Sep 2025 11:40:48 +0200 Subject: [PATCH 04/14] fix output names in tests --- tests/physical_models/crop/test_root_dynamics.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/physical_models/crop/test_root_dynamics.py b/tests/physical_models/crop/test_root_dynamics.py index 3754b9a..479d41d 100644 --- a/tests/physical_models/crop/test_root_dynamics.py +++ b/tests/physical_models/crop/test_root_dynamics.py @@ -25,12 +25,7 @@ def prepare_engine_input(file_path): # convert parameters to tensors crop_model_params_provider.clear_override() - # The following line raises an error: - # parameter_names = [n for n in crop_model_params_provider.keys()] - # E TypeError: iter() returned non-iterator of type 'ParameterProvider' - # We therefore use the protected member instead - parameter_names = crop_model_params_provider._unique_parameters - for name in parameter_names: + for name in ["RDI", "RRI", "RDMCR", "RDMSOL", "TDWI", "IAIRDU"]: value = torch.tensor(crop_model_params_provider[name], dtype=torch.float32) crop_model_params_provider.set_override(name, value, check=False) @@ -99,7 +94,7 @@ def forward(self, params_dict): results = engine.get_output() return torch.stack( - [torch.stack([item["LAI"], item["TWLV"]]) for item in results] + [torch.stack([item["RD"], item["TWRT"]]) for item in results] ).unsqueeze(0) # shape: [1, time_steps, 2] From 4b9b39edfee70bb6cdfdeb5c2acf0a38c4ee4511 Mon Sep 17 00:00:00 2001 From: SarahAlidoost Date: Tue, 16 Sep 2025 16:32:18 +0200 Subject: [PATCH 05/14] make root_dynamics differentiable --- .../physical_models/crop/root_dynamics.py | 86 ++++--- .../crop/test_root_dynamics.py | 218 ++++++++++-------- 2 files changed, 168 insertions(+), 136 deletions(-) diff --git a/src/diffwofost/physical_models/crop/root_dynamics.py b/src/diffwofost/physical_models/crop/root_dynamics.py index ad1b08f..81af040 100644 --- a/src/diffwofost/physical_models/crop/root_dynamics.py +++ b/src/diffwofost/physical_models/crop/root_dynamics.py @@ -5,12 +5,12 @@ from pcse.base import StatesTemplate from pcse.decorators import prepare_rates from pcse.decorators import prepare_states -from pcse.traitlets import Float from pcse.traitlets import Any from pcse.util import AfgenTrait DTYPE = torch.float64 # Default data type for tensors in this module + class WOFOST_Root_Dynamics(SimulationObject): """Root biomass dynamics and rooting depth. @@ -86,6 +86,7 @@ class WOFOST_Root_Dynamics(SimulationObject): - RD, TWRT """ + """ IMPORTANT NOTICE Currently root development is linear and depends only on the fraction of assimilates @@ -112,91 +113,103 @@ class WOFOST_Root_Dynamics(SimulationObject): """ class Parameters(ParamTemplate): - RDI = Float(-99.) - RRI = Float(-99.) - RDMCR = Float(-99.) - RDMSOL = Float(-99.) - TDWI = Float(-99.) - IAIRDU = Float(-99) - RDRRTB = AfgenTrait() # FIXEME + RDI = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) + RRI = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) + RDMCR = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) + RDMSOL = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) + TDWI = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) + IAIRDU = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) + RDRRTB = AfgenTrait() # FIXEME class RateVariables(RatesTemplate): - RR = Float(-99.) - GRRT = Float(-99.) - DRRT = Float(-99.) - GWRT = Float(-99.) + RR = Any(default_value=torch.tensor(0.0, dtype=DTYPE)) + GRRT = Any(default_value=torch.tensor(0.0, dtype=DTYPE)) + DRRT = Any(default_value=torch.tensor(0.0, dtype=DTYPE)) + GWRT = Any(default_value=torch.tensor(0.0, dtype=DTYPE)) class StateVariables(StatesTemplate): - RD = Float(-99.) - RDM = Float(-99.) - WRT = Float(-99.) - DWRT = Float(-99.) - TWRT = Float(-99.) + RD = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) + RDM = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) + WRT = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) + DWRT = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) + TWRT = Any(default_value=[torch.tensor(-99.0, dtype=DTYPE)]) def initialize(self, day, kiosk, parvalues): - """ + """Initialize the model. + :param day: start date of the simulation :param kiosk: variable kiosk of this PCSE instance :param parvalues: `ParameterProvider` object providing parameters as key/value pairs """ - self.params = self.Parameters(parvalues) self.rates = self.RateVariables(kiosk, publish=["DRRT", "GRRT"]) self.kiosk = kiosk # INITIAL STATES params = self.params + # Initial root depth states - rdmax = max(params.RDI, min(params.RDMCR, params.RDMSOL)) + rdmax = torch.max(params.RDI, torch.min(params.RDMCR, params.RDMSOL)) RDM = rdmax RD = params.RDI + # initial root biomass states - WRT = params.TDWI * self.kiosk.FR - DWRT = 0. + WRT = params.TDWI * self.kiosk.FR + DWRT = torch.tensor(0.0, dtype=DTYPE) TWRT = WRT + DWRT - self.states = self.StateVariables(kiosk, publish=["RD","WRT", "TWRT"], - RD=RD, RDM=RDM, WRT=WRT, DWRT=DWRT, - TWRT=TWRT) + self.states = self.StateVariables( + kiosk, publish=["RD", "WRT", "TWRT"], RD=RD, RDM=RDM, WRT=WRT, DWRT=DWRT, TWRT=TWRT + ) @prepare_rates def calc_rates(self, day, drv): + """Calculate the rates of change of the state variables.""" p = self.params r = self.rates s = self.states k = self.kiosk + # If DVS < 0, the crop has not yet emerged, so we zerofy the rates using mask + # Make a mask (0 if DVS < 0, 1 if DVS >= 0) + DVS = torch.as_tensor(k["DVS"], dtype=DTYPE) + mask = (DVS >= 0).to(dtype=DTYPE) + # Increase in root biomass - r.GRRT = k.FR * k.DMI - r.DRRT = s.WRT * p.RDRRTB(k.DVS) + r.GRRT = mask * k.FR * k.DMI + r.DRRT = mask * s.WRT * p.RDRRTB(k.DVS) r.GWRT = r.GRRT - r.DRRT # Increase in root depth - r.RR = min((s.RDM - s.RD), p.RRI) + r.RR = mask * torch.min((s.RDM - s.RD), p.RRI) + # Do not let the roots growth if partioning to the roots # (variable FR) is zero. - if k.FR == 0.: - r.RR = 0. + FR = torch.as_tensor(k["FR"], dtype=DTYPE) + mask = (FR > 0.0).to(dtype=DTYPE) + r.RR = r.RR * mask @prepare_states def integrate(self, day, delt=1.0): + """Integrate the state variables using the rates of change.""" rates = self.rates states = self.states # Dry weight of living roots - states.WRT += rates.GWRT + states.WRT = states.WRT + rates.GWRT + # Dry weight of dead roots - states.DWRT += rates.DRRT + states.DWRT = states.DWRT + rates.DRRT + # Total weight dry + living roots states.TWRT = states.WRT + states.DWRT # New root depth - states.RD += rates.RR - + states.RD = states.RD + rates.RR @prepare_states - def _set_variable_WRT(self, nWRT): + def _set_variable_WRT(self, nWRT): # FIXEME """Updates the value of WRT to to the new value provided as input. Related state variables will be updated as well and the increments @@ -212,6 +225,5 @@ def _set_variable_WRT(self, nWRT): states.WRT = nWRT states.TWRT = states.WRT + states.DWRT - increments = {"WRT": states.WRT - oWRT, - "TWLRT": states.TWRT - oTWRT} + increments = {"WRT": states.WRT - oWRT, "TWLRT": states.TWRT - oTWRT} return increments diff --git a/tests/physical_models/crop/test_root_dynamics.py b/tests/physical_models/crop/test_root_dynamics.py index 479d41d..99cf6b7 100644 --- a/tests/physical_models/crop/test_root_dynamics.py +++ b/tests/physical_models/crop/test_root_dynamics.py @@ -8,6 +8,7 @@ from pcse.base.parameter_providers import ParameterProvider from pcse.engine import Engine from pcse.models import Wofost72_PP +from diffwofost.physical_models.crop.leaf_dynamics import WOFOST_Leaf_Dynamics from diffwofost.physical_models.crop.root_dynamics import WOFOST_Root_Dynamics from tests.physical_models.pcse_test_code import EngineTestHelper from tests.physical_models.pcse_test_code import WeatherDataProviderTestHelper @@ -42,6 +43,46 @@ def prepare_engine_input(file_path): ) +def prepare_wofost_input(file_path): + inputs = yaml.safe_load(open(file_path)) + agro_management_inputs = inputs["AgroManagement"] + cropd = inputs["ModelParameters"] + + weather_data_provider = WeatherDataProviderTestHelper(inputs["WeatherVariables"]) + crop_model_params_provider = ParameterProvider(cropdata=cropd) + external_states = inputs["ExternalStates"] + + # convert parameters to tensors + crop_model_params_provider.clear_override() + for name in [ + "RDI", + "RRI", + "RDMCR", + "RDMSOL", + "TDWI", + "IAIRDU", # root dynamics + "SPAN", + "TDWI", + "TBASE", + "PERDL", + "RGRLAI", # leaf dynamics + ]: + value = torch.tensor(crop_model_params_provider[name], dtype=torch.float32) + crop_model_params_provider.set_override(name, value, check=False) + + # convert external states to tensors + tensor_external_states = [ + {k: v if k == "DAY" else torch.tensor(v, dtype=torch.float32) for k, v in item.items()} + for item in external_states + ] + return ( + crop_model_params_provider, + weather_data_provider, + agro_management_inputs, + tensor_external_states, + ) + + def get_test_data(file_path): inputs = yaml.safe_load(open(file_path)) return inputs["ModelResults"], inputs["Precision"] @@ -93,9 +134,31 @@ def forward(self, params_dict): engine.run_till_terminate() results = engine.get_output() - return torch.stack( - [torch.stack([item["RD"], item["TWRT"]]) for item in results] - ).unsqueeze(0) # shape: [1, time_steps, 2] + return torch.stack([torch.stack([item["RD"], item["TWRT"]]) for item in results]).unsqueeze( + 0 + ) # shape: [1, time_steps, 2] + + +def calculate_numerical_grad(param_name, param_value, output_name): + delta = 1e-6 + p_plus = param_value.item() + delta + p_minus = param_value.item() - delta + + model = get_test_diff_root_model() + output = model({param_name: torch.nn.Parameter(torch.tensor(p_plus, dtype=torch.float64))}) + if output_name == "RD": + loss_plus = output[0, :, 0].sum() + elif output_name == "TWRT": + loss_plus = output[0, :, 1].sum() + + model = get_test_diff_root_model() + output = model({param_name: torch.nn.Parameter(torch.tensor(p_minus, dtype=torch.float64))}) + if output_name == "RD": + loss_minus = output[0, :, 0].sum() + elif output_name == "TWRT": + loss_minus = output[0, :, 1].sum() + + return (loss_plus.item() - loss_minus.item()) / (2 * delta) class TestRootDynamics: @@ -144,7 +207,7 @@ def test_root_dynamics_with_engine(self): config_path = str(phy_data_folder / "WOFOST_Root_Dynamics.conf") # Engine does not allows to specify `external_states` - with pytest.raises(ValueError): + with pytest.raises(KeyError): Engine( crop_model_params_provider, weather_data_provider, @@ -178,23 +241,49 @@ def test_wofost_pp_with_root_dynamics(self): for var, precision in expected_precision.items() ) + def test_wofost_pp_with_root_dynamics_leaf_dynamics(self): + # prepare model input + test_data_path = phy_data_folder / "test_potentialproduction_wofost72_01.yaml" + (crop_model_params_provider, weather_data_provider, agro_management_inputs, _) = ( + prepare_wofost_input(test_data_path) + ) + + with ( + patch("pcse.crop.root_dynamics.WOFOST_Root_Dynamics", WOFOST_Root_Dynamics), + patch("pcse.crop.leaf_dynamics.WOFOST_Leaf_Dynamics", WOFOST_Leaf_Dynamics), + ): + model = Wofost72_PP( + crop_model_params_provider, weather_data_provider, agro_management_inputs + ) + model.run_till_terminate() + actual_results = model.get_output() + + # get expected results from YAML test data + expected_results, expected_precision = get_test_data(test_data_path) + + assert len(actual_results) == len(expected_results) + + for reference, model in zip(expected_results, actual_results, strict=False): + assert reference["DAY"] == model["day"] + assert all( + abs(reference[var] - model[var]) < precision + for var, precision in expected_precision.items() + ) + class TestDiffRootDynamicsTDWI: - def test_gradients_tdwi_lai_root_dynamics(self): + def test_gradients_tdwi_rd_root_dynamics(self): model = get_test_diff_root_model() tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float32)) output = model({"TDWI": tdwi}) - lai = output[0, :, 0] - loss = lai.sum() + rd = output[0, :, 0] + loss = rd.sum() # this is ∂loss/∂tdwi without calling loss.backward(). # this is called forward gradient here because it is calculated without backpropagation. grads = torch.autograd.grad(loss, tdwi, retain_graph=True)[0] assert grads is not None, "Gradients for TDWI should not be None" - torch.testing.assert_close( - grads, torch.tensor(0.0013, dtype=torch.float32), rtol=1e-4, atol=1e-4 - ) tdwi.grad = None # clear any existing gradient loss.backward() @@ -205,29 +294,22 @@ def test_gradients_tdwi_lai_root_dynamics(self): assert grad_backward is not None, "Backward gradients for TDWI should not be None" assert grad_backward == grads, "Forward and backward gradients for TDWI should match" - def test_gradients_tdwi_lai_root_dynamics_numerical(self): + def test_gradients_tdwi_rd_root_dynamics_numerical(self): + tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float64)) + numerical_grad = calculate_numerical_grad("TDWI", tdwi, "RD") + model = get_test_diff_root_model() - tdwi1 = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float64)) - output = model({"TDWI": tdwi1}) - lai = output[0, :, 0] - loss1 = lai.sum() + output = model({"TDWI": tdwi}) + rd = output[0, :, 0] + loss = rd.sum() # this is ∂loss/∂tdwi, for comparison with numerical gradient - # in this test, ∂loss/∂tdwi is very small - grads = torch.autograd.grad(loss1, tdwi1, retain_graph=True)[0] - - model = get_test_diff_root_model() - # tdwi range is (0.1, 0.6) - tdwi2 = tdwi1 + torch.tensor(1e-10, dtype=torch.float64) - output = model({"TDWI": tdwi2}) - lai = output[0, :, 0] - loss2 = lai.sum() - numerical_grad = (loss2 - loss1) / (tdwi2 - tdwi1) + grads = torch.autograd.grad(loss, tdwi, retain_graph=True)[0] # in this test, grads is very small - assert_almost_equal(numerical_grad.item(), grads.item(), decimal=1) + assert_almost_equal(numerical_grad, grads.item(), decimal=3) - def test_gradients_tdwi_twlv_root_dynamics(self): + def test_gradients_tdwi_twrt_root_dynamics(self): # prepare model input model = get_test_diff_root_model() tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float32)) @@ -240,9 +322,6 @@ def test_gradients_tdwi_twlv_root_dynamics(self): grads = torch.autograd.grad(loss, tdwi, retain_graph=True)[0] assert grads is not None, "Gradients for TDWI should not be None" - torch.testing.assert_close( - grads, torch.tensor(5.7904, dtype=torch.float32), rtol=1e-4, atol=1e-4 - ) tdwi.grad = None # clear any existing gradient loss.backward() @@ -253,76 +332,17 @@ def test_gradients_tdwi_twlv_root_dynamics(self): assert grad_backward is not None, "Backward gradients for TDWI should not be None" assert grad_backward == grads, "Forward and backward gradients for TDWI should match" + def test_gradients_tdwi_twrt_root_dynamics_numerical(self): + tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float64)) + numerical_grad = calculate_numerical_grad("TDWI", tdwi, "TWRT") -class TestDiffRootDynamicsSPAN: - def test_gradients_span_lai_root_dynamics(self): - # prepare model input model = get_test_diff_root_model() - span = torch.nn.Parameter(torch.tensor(30, dtype=torch.float32)) - output = model({"SPAN": span}) - lai = output[0, :, 0] - loss = lai.sum() - - # this is ∂loss/∂span - # this is called forward gradient here because it is calculated without backpropagation. - grads = torch.autograd.grad(loss, span, retain_graph=True)[0] - - assert grads is not None, "Gradients for SPAN should not be None" - torch.testing.assert_close( - grads, torch.tensor(2.5138, dtype=torch.float32), rtol=1e-4, atol=1e-4 - ) - - span.grad = None # clear any existing gradient - loss.backward() - - # this is ∂loss/∂span calculated using backpropagation - grad_backward = span.grad - - assert grad_backward is not None, "Backward gradients for TDWI should not be None" - assert grad_backward == grads, "Forward and backward gradients for TDWI should match" - - def test_gradients_span_lai_root_dynamics_numerical(self): - model = get_test_diff_root_model() - span1 = torch.nn.Parameter(torch.tensor(30, dtype=torch.float32)) - output = model({"SPAN": span1}) - lai = output[0, :, 0] - loss1 = lai.sum() - - # this is ∂loss/∂span, for comparison with numerical gradient - grads = torch.autograd.grad(loss1, span1, retain_graph=True)[0] - - model = get_test_diff_root_model() - # span range is (30, 40) - span2 = span1 + torch.tensor(1e-10, dtype=torch.float64) - output = model({"SPAN": span2}) - lai = output[0, :, 0] - loss2 = lai.sum() - numerical_grad = (loss2 - loss1) / (span2 - span1) - - assert_almost_equal(numerical_grad.item(), grads.item(), decimal=3) - - def test_gradients_span_twlv_root_dynamics(self): - # prepare model input - model = get_test_diff_root_model() - span = torch.nn.Parameter(torch.tensor(30, dtype=torch.float32)) - output = model({"SPAN": span}) - twlv = output[0, :, 1] - loss = twlv.sum() - - # this is ∂loss/∂span - # this is called forward gradient here because it is calculated without backpropagation. - grads = torch.autograd.grad(loss, span, retain_graph=True)[0] - - assert grads is not None, "Gradients for SPAN should not be None" - torch.testing.assert_close( - grads, torch.tensor(-0.2393, dtype=torch.float32), rtol=1e-4, atol=1e-4 - ) - - span.grad = None # clear any existing gradient - loss.backward() + output = model({"TDWI": tdwi}) + twrt = output[0, :, 1] + loss = twrt.sum() - # this is ∂loss/∂span calculated using backpropagation - grad_backward = span.grad + # this is ∂loss/∂tdwi, for comparison with numerical gradient + grads = torch.autograd.grad(loss, tdwi, retain_graph=True)[0] - assert grad_backward is not None, "Backward gradients for TDWI should not be None" - assert grad_backward == grads, "Forward and backward gradients for TDWI should match" + # in this test, grads is very small + assert_almost_equal(numerical_grad, grads.item(), decimal=3) From b9057f9affaeb24736c35c63292293453fb74de6 Mon Sep 17 00:00:00 2001 From: SarahAlidoost Date: Tue, 16 Sep 2025 16:46:18 +0200 Subject: [PATCH 06/14] remove a test --- .../crop/test_root_dynamics.py | 70 ------------------- 1 file changed, 70 deletions(-) diff --git a/tests/physical_models/crop/test_root_dynamics.py b/tests/physical_models/crop/test_root_dynamics.py index 99cf6b7..4d30489 100644 --- a/tests/physical_models/crop/test_root_dynamics.py +++ b/tests/physical_models/crop/test_root_dynamics.py @@ -8,7 +8,6 @@ from pcse.base.parameter_providers import ParameterProvider from pcse.engine import Engine from pcse.models import Wofost72_PP -from diffwofost.physical_models.crop.leaf_dynamics import WOFOST_Leaf_Dynamics from diffwofost.physical_models.crop.root_dynamics import WOFOST_Root_Dynamics from tests.physical_models.pcse_test_code import EngineTestHelper from tests.physical_models.pcse_test_code import WeatherDataProviderTestHelper @@ -43,46 +42,6 @@ def prepare_engine_input(file_path): ) -def prepare_wofost_input(file_path): - inputs = yaml.safe_load(open(file_path)) - agro_management_inputs = inputs["AgroManagement"] - cropd = inputs["ModelParameters"] - - weather_data_provider = WeatherDataProviderTestHelper(inputs["WeatherVariables"]) - crop_model_params_provider = ParameterProvider(cropdata=cropd) - external_states = inputs["ExternalStates"] - - # convert parameters to tensors - crop_model_params_provider.clear_override() - for name in [ - "RDI", - "RRI", - "RDMCR", - "RDMSOL", - "TDWI", - "IAIRDU", # root dynamics - "SPAN", - "TDWI", - "TBASE", - "PERDL", - "RGRLAI", # leaf dynamics - ]: - value = torch.tensor(crop_model_params_provider[name], dtype=torch.float32) - crop_model_params_provider.set_override(name, value, check=False) - - # convert external states to tensors - tensor_external_states = [ - {k: v if k == "DAY" else torch.tensor(v, dtype=torch.float32) for k, v in item.items()} - for item in external_states - ] - return ( - crop_model_params_provider, - weather_data_provider, - agro_management_inputs, - tensor_external_states, - ) - - def get_test_data(file_path): inputs = yaml.safe_load(open(file_path)) return inputs["ModelResults"], inputs["Precision"] @@ -241,35 +200,6 @@ def test_wofost_pp_with_root_dynamics(self): for var, precision in expected_precision.items() ) - def test_wofost_pp_with_root_dynamics_leaf_dynamics(self): - # prepare model input - test_data_path = phy_data_folder / "test_potentialproduction_wofost72_01.yaml" - (crop_model_params_provider, weather_data_provider, agro_management_inputs, _) = ( - prepare_wofost_input(test_data_path) - ) - - with ( - patch("pcse.crop.root_dynamics.WOFOST_Root_Dynamics", WOFOST_Root_Dynamics), - patch("pcse.crop.leaf_dynamics.WOFOST_Leaf_Dynamics", WOFOST_Leaf_Dynamics), - ): - model = Wofost72_PP( - crop_model_params_provider, weather_data_provider, agro_management_inputs - ) - model.run_till_terminate() - actual_results = model.get_output() - - # get expected results from YAML test data - expected_results, expected_precision = get_test_data(test_data_path) - - assert len(actual_results) == len(expected_results) - - for reference, model in zip(expected_results, actual_results, strict=False): - assert reference["DAY"] == model["day"] - assert all( - abs(reference[var] - model[var]) < precision - for var, precision in expected_precision.items() - ) - class TestDiffRootDynamicsTDWI: def test_gradients_tdwi_rd_root_dynamics(self): From d460484e1e17e0f2b7ea2731c7a63af97e0ca538 Mon Sep 17 00:00:00 2001 From: SarahAlidoost Date: Wed, 17 Sep 2025 11:10:21 +0200 Subject: [PATCH 07/14] refactor patch block --- .../crop/test_root_dynamics.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/physical_models/crop/test_root_dynamics.py b/tests/physical_models/crop/test_root_dynamics.py index 4d30489..a6b54de 100644 --- a/tests/physical_models/crop/test_root_dynamics.py +++ b/tests/physical_models/crop/test_root_dynamics.py @@ -181,6 +181,9 @@ def test_wofost_pp_with_root_dynamics(self): prepare_engine_input(test_data_path) ) + # get expected results from YAML test data + expected_results, expected_precision = get_test_data(test_data_path) + with patch("pcse.crop.root_dynamics.WOFOST_Root_Dynamics", WOFOST_Root_Dynamics): model = Wofost72_PP( crop_model_params_provider, weather_data_provider, agro_management_inputs @@ -188,17 +191,14 @@ def test_wofost_pp_with_root_dynamics(self): model.run_till_terminate() actual_results = model.get_output() - # get expected results from YAML test data - expected_results, expected_precision = get_test_data(test_data_path) - - assert len(actual_results) == len(expected_results) + assert len(actual_results) == len(expected_results) - for reference, model in zip(expected_results, actual_results, strict=False): - assert reference["DAY"] == model["day"] - assert all( - abs(reference[var] - model[var]) < precision - for var, precision in expected_precision.items() - ) + for reference, model in zip(expected_results, actual_results, strict=False): + assert reference["DAY"] == model["day"] + assert all( + abs(reference[var] - model[var]) < precision + for var, precision in expected_precision.items() + ) class TestDiffRootDynamicsTDWI: From cb8939a28d7319251cd9e93799ce161db22cf10f Mon Sep 17 00:00:00 2001 From: SarahAlidoost Date: Thu, 18 Sep 2025 15:17:28 +0200 Subject: [PATCH 08/14] fix patch in tests --- tests/physical_models/crop/test_root_dynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/physical_models/crop/test_root_dynamics.py b/tests/physical_models/crop/test_root_dynamics.py index a6b54de..c8c1196 100644 --- a/tests/physical_models/crop/test_root_dynamics.py +++ b/tests/physical_models/crop/test_root_dynamics.py @@ -184,7 +184,7 @@ def test_wofost_pp_with_root_dynamics(self): # get expected results from YAML test data expected_results, expected_precision = get_test_data(test_data_path) - with patch("pcse.crop.root_dynamics.WOFOST_Root_Dynamics", WOFOST_Root_Dynamics): + with patch("pcse.crop.wofost72.Root_Dynamics", WOFOST_Root_Dynamics): model = Wofost72_PP( crop_model_params_provider, weather_data_provider, agro_management_inputs ) From eb0327ba1e03da5c6eeb93f12044305be608e962 Mon Sep 17 00:00:00 2001 From: SarahAlidoost Date: Thu, 18 Sep 2025 15:19:57 +0200 Subject: [PATCH 09/14] fix patch in leaf_dynamics --- tests/physical_models/crop/test_leaf_dynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/physical_models/crop/test_leaf_dynamics.py b/tests/physical_models/crop/test_leaf_dynamics.py index 0b167bc..1ed555b 100644 --- a/tests/physical_models/crop/test_leaf_dynamics.py +++ b/tests/physical_models/crop/test_leaf_dynamics.py @@ -184,7 +184,7 @@ def test_wofost_pp_with_leaf_dynamics(self): # get expected results from YAML test data expected_results, expected_precision = get_test_data(test_data_path) - with patch("pcse.crop.leaf_dynamics.WOFOST_Leaf_Dynamics", WOFOST_Leaf_Dynamics): + with patch("pcse.crop.wofost72.Leaf_Dynamics", WOFOST_Leaf_Dynamics): model = Wofost72_PP( crop_model_params_provider, weather_data_provider, agro_management_inputs ) From 98d5294b285643e05e8131e4ede44c063cac2875 Mon Sep 17 00:00:00 2001 From: SarahAlidoost <55081872+SarahAlidoost@users.noreply.github.com> Date: Mon, 29 Sep 2025 09:46:33 +0200 Subject: [PATCH 10/14] remove unused import Co-authored-by: Francesco Nattino <49899980+fnattino@users.noreply.github.com> --- tests/physical_models/crop/test_root_dynamics.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/physical_models/crop/test_root_dynamics.py b/tests/physical_models/crop/test_root_dynamics.py index c8c1196..3082326 100644 --- a/tests/physical_models/crop/test_root_dynamics.py +++ b/tests/physical_models/crop/test_root_dynamics.py @@ -2,7 +2,6 @@ from unittest.mock import patch import pytest import torch -import torch.testing import yaml from numpy.testing import assert_almost_equal from pcse.base.parameter_providers import ParameterProvider From 3515053924b306602fb57ee302c181f6754d7314 Mon Sep 17 00:00:00 2001 From: SarahAlidoost <55081872+SarahAlidoost@users.noreply.github.com> Date: Mon, 29 Sep 2025 09:52:22 +0200 Subject: [PATCH 11/14] add comment Co-authored-by: Francesco Nattino <49899980+fnattino@users.noreply.github.com> --- tests/physical_models/crop/test_root_dynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/physical_models/crop/test_root_dynamics.py b/tests/physical_models/crop/test_root_dynamics.py index 3082326..860a3e6 100644 --- a/tests/physical_models/crop/test_root_dynamics.py +++ b/tests/physical_models/crop/test_root_dynamics.py @@ -229,7 +229,7 @@ def test_gradients_tdwi_rd_root_dynamics_numerical(self): model = get_test_diff_root_model() output = model({"TDWI": tdwi}) - rd = output[0, :, 0] + rd = output[0, :, 0] # Index 0 is "RD" loss = rd.sum() # this is ∂loss/∂tdwi, for comparison with numerical gradient From 7f4ced3d78c8fd464a45bfe980a00bf5934e8c7f Mon Sep 17 00:00:00 2001 From: SarahAlidoost <55081872+SarahAlidoost@users.noreply.github.com> Date: Mon, 29 Sep 2025 09:52:35 +0200 Subject: [PATCH 12/14] add a comment Co-authored-by: Francesco Nattino <49899980+fnattino@users.noreply.github.com> --- tests/physical_models/crop/test_root_dynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/physical_models/crop/test_root_dynamics.py b/tests/physical_models/crop/test_root_dynamics.py index 860a3e6..29d8069 100644 --- a/tests/physical_models/crop/test_root_dynamics.py +++ b/tests/physical_models/crop/test_root_dynamics.py @@ -243,7 +243,7 @@ def test_gradients_tdwi_twrt_root_dynamics(self): model = get_test_diff_root_model() tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float32)) output = model({"TDWI": tdwi}) - twlv = output[0, :, 1] + twlv = output[0, :, 1] # Index 1 is "TWRT" loss = twlv.sum() # this is ∂loss/∂tdwi From feb270e7fe65922ea50d652c04c79cebcdb6ee67 Mon Sep 17 00:00:00 2001 From: SarahAlidoost Date: Mon, 29 Sep 2025 10:17:22 +0200 Subject: [PATCH 13/14] rename script of tests helper functions --- tests/physical_models/{pcse_test_code.py => utils.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/physical_models/{pcse_test_code.py => utils.py} (100%) diff --git a/tests/physical_models/pcse_test_code.py b/tests/physical_models/utils.py similarity index 100% rename from tests/physical_models/pcse_test_code.py rename to tests/physical_models/utils.py From c8c3bfc2ca5dcb9007afc8077124aeef079c74be Mon Sep 17 00:00:00 2001 From: SarahAlidoost Date: Mon, 29 Sep 2025 10:47:33 +0200 Subject: [PATCH 14/14] refactor tests --- .../crop/test_leaf_dynamics.py | 103 ++++++------------ .../crop/test_root_dynamics.py | 91 ++++------------ tests/physical_models/utils.py | 52 +++++++++ 3 files changed, 107 insertions(+), 139 deletions(-) diff --git a/tests/physical_models/crop/test_leaf_dynamics.py b/tests/physical_models/crop/test_leaf_dynamics.py index 1ed555b..3c1a600 100644 --- a/tests/physical_models/crop/test_leaf_dynamics.py +++ b/tests/physical_models/crop/test_leaf_dynamics.py @@ -3,54 +3,22 @@ import pytest import torch import torch.testing -import yaml from numpy.testing import assert_almost_equal -from pcse.base.parameter_providers import ParameterProvider from pcse.engine import Engine from pcse.models import Wofost72_PP from diffwofost.physical_models.crop.leaf_dynamics import WOFOST_Leaf_Dynamics -from tests.physical_models.pcse_test_code import EngineTestHelper -from tests.physical_models.pcse_test_code import WeatherDataProviderTestHelper +from tests.physical_models.utils import EngineTestHelper +from tests.physical_models.utils import calculate_numerical_grad +from tests.physical_models.utils import get_test_data +from tests.physical_models.utils import prepare_engine_input from .. import phy_data_folder -def prepare_engine_input(file_path): - inputs = yaml.safe_load(open(file_path)) - agro_management_inputs = inputs["AgroManagement"] - cropd = inputs["ModelParameters"] - - weather_data_provider = WeatherDataProviderTestHelper(inputs["WeatherVariables"]) - crop_model_params_provider = ParameterProvider(cropdata=cropd) - external_states = inputs["ExternalStates"] - - # convert parameters to tensors - crop_model_params_provider.clear_override() - for name in ["SPAN", "TDWI", "TBASE", "PERDL", "RGRLAI"]: - value = torch.tensor(crop_model_params_provider[name], dtype=torch.float32) - crop_model_params_provider.set_override(name, value, check=False) - - # convert external states to tensors - tensor_external_states = [ - {k: v if k == "DAY" else torch.tensor(v, dtype=torch.float32) for k, v in item.items()} - for item in external_states - ] - return ( - crop_model_params_provider, - weather_data_provider, - agro_management_inputs, - tensor_external_states, - ) - - -def get_test_data(file_path): - inputs = yaml.safe_load(open(file_path)) - return inputs["ModelResults"], inputs["Precision"] - - def get_test_diff_leaf_model(): test_data_path = phy_data_folder / "test_leafdynamics_wofost72_01.yaml" + crop_model_params = ["SPAN", "TDWI", "TBASE", "PERDL", "RGRLAI"] (crop_model_params_provider, weather_data_provider, agro_management_inputs, external_states) = ( - prepare_engine_input(test_data_path) + prepare_engine_input(test_data_path, crop_model_params) ) config_path = str(phy_data_folder / "WOFOST_Leaf_Dynamics.conf") return DiffLeafDynamics( @@ -98,40 +66,19 @@ def forward(self, params_dict): ).unsqueeze(0) # shape: [1, time_steps, 2] -def calculate_numerical_grad(param_name, param_value, output_name): - delta = 1e-6 - p_plus = param_value.item() + delta - p_minus = param_value.item() - delta - - model = get_test_diff_leaf_model() - output = model({param_name: torch.nn.Parameter(torch.tensor(p_plus, dtype=torch.float64))}) - if output_name == "LAI": - loss_plus = output[0, :, 0].sum() - elif output_name == "TWLV": - loss_plus = output[0, :, 1].sum() - - model = get_test_diff_leaf_model() - output = model({param_name: torch.nn.Parameter(torch.tensor(p_minus, dtype=torch.float64))}) - if output_name == "LAI": - loss_minus = output[0, :, 0].sum() - elif output_name == "TWLV": - loss_minus = output[0, :, 1].sum() - - return (loss_plus.item() - loss_minus.item()) / (2 * delta) - - class TestLeafDynamics: def test_leaf_dynamics_with_testengine(self): """EngineTestHelper and not Engine because it allows to specify `external_states`.""" # prepare model input test_data_path = phy_data_folder / "test_leafdynamics_wofost72_01.yaml" + crop_model_params = ["SPAN", "TDWI", "TBASE", "PERDL", "RGRLAI"] ( crop_model_params_provider, weather_data_provider, agro_management_inputs, external_states, - ) = prepare_engine_input(test_data_path) + ) = prepare_engine_input(test_data_path, crop_model_params) config_path = str(phy_data_folder / "WOFOST_Leaf_Dynamics.conf") engine = EngineTestHelper( @@ -159,8 +106,9 @@ def test_leaf_dynamics_with_testengine(self): def test_leaf_dynamics_with_engine(self): # prepare model input test_data_path = phy_data_folder / "test_leafdynamics_wofost72_01.yaml" + crop_model_params = ["SPAN", "TDWI", "TBASE", "PERDL", "RGRLAI"] (crop_model_params_provider, weather_data_provider, agro_management_inputs, _) = ( - prepare_engine_input(test_data_path) + prepare_engine_input(test_data_path, crop_model_params) ) config_path = str(phy_data_folder / "WOFOST_Leaf_Dynamics.conf") @@ -177,8 +125,9 @@ def test_leaf_dynamics_with_engine(self): def test_wofost_pp_with_leaf_dynamics(self): # prepare model input test_data_path = phy_data_folder / "test_potentialproduction_wofost72_01.yaml" + crop_model_params = ["SPAN", "TDWI", "TBASE", "PERDL", "RGRLAI"] (crop_model_params_provider, weather_data_provider, agro_management_inputs, _) = ( - prepare_engine_input(test_data_path) + prepare_engine_input(test_data_path, crop_model_params) ) # get expected results from YAML test data @@ -225,11 +174,14 @@ def test_gradients_tdwi_lai_leaf_dynamics(self): def test_gradients_tdwi_lai_leaf_dynamics_numerical(self): # first check if the numerical gradient isnot zero i.e. the parameter has an effect tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float64)) - numerical_grad = calculate_numerical_grad("TDWI", tdwi, "LAI") # this is Δloss/Δtdwi + output_index = 0 # LAI is at index 0 + numerical_grad = calculate_numerical_grad( + get_test_diff_leaf_model, "TDWI", tdwi, output_index + ) # this is Δloss/Δtdwi model = get_test_diff_leaf_model() output = model({"TDWI": tdwi}) - lai = output[0, :, 0] + lai = output[0, :, output_index] loss = lai.sum() # this is ∂loss/∂tdwi, for comparison with numerical gradient grads = torch.autograd.grad(loss, tdwi, retain_graph=True)[0] @@ -260,11 +212,14 @@ def test_gradients_tdwi_twlv_leaf_dynamics(self): def test_gradients_tdwi_twlv_leaf_dynamics_numerical(self): # first check if the numerical gradient isnot zero i.e. the parameter has an effect tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float64)) - numerical_grad = calculate_numerical_grad("TDWI", tdwi, "TWLV") # this is Δloss/Δtdwi + output_index = 1 # TWLV is at index 1 + numerical_grad = calculate_numerical_grad( + get_test_diff_leaf_model, "TDWI", tdwi, output_index + ) # this is Δloss/Δtdwi model = get_test_diff_leaf_model() output = model({"TDWI": tdwi}) - twlv = output[0, :, 1] + twlv = output[0, :, output_index] loss = twlv.sum() # this is ∂loss/∂tdwi, for comparison with numerical gradient grads = torch.autograd.grad(loss, tdwi, retain_graph=True)[0] @@ -297,11 +252,14 @@ def test_gradients_span_lai_leaf_dynamics(self): def test_gradients_span_lai_leaf_dynamics_numerical(self): # first check if the numerical gradient isnot zero i.e. the parameter has an effect span = torch.nn.Parameter(torch.tensor(30, dtype=torch.float64)) - numerical_grad = calculate_numerical_grad("SPAN", span, "LAI") # this is Δloss/Δspan + output_index = 0 # LAI is at index 0 + numerical_grad = calculate_numerical_grad( + get_test_diff_leaf_model, "SPAN", span, output_index + ) # this is Δloss/Δspan model = get_test_diff_leaf_model() output = model({"SPAN": span}) - lai = output[0, :, 0] + lai = output[0, :, output_index] loss = lai.sum() # this is ∂loss/∂tdwi, for comparison with numerical gradient grads = torch.autograd.grad(loss, span, retain_graph=True)[0] @@ -332,11 +290,14 @@ def test_gradients_span_twlv_leaf_dynamics(self): def test_gradients_span_twlv_leaf_dynamics_numerical(self): # first check if the numerical gradient isnot zero i.e. the parameter has an effect span = torch.nn.Parameter(torch.tensor(30, dtype=torch.float64)) - numerical_grad = calculate_numerical_grad("SPAN", span, "TWLV") # this is Δloss/Δspan + output_index = 1 # TWLV is at index 1 + numerical_grad = calculate_numerical_grad( + get_test_diff_leaf_model, "SPAN", span, output_index + ) # this is Δloss/Δspan model = get_test_diff_leaf_model() output = model({"SPAN": span}) - twlv = output[0, :, 1] + twlv = output[0, :, output_index] loss = twlv.sum() # this is ∂loss/∂tdwi, for comparison with numerical gradient grads = torch.autograd.grad(loss, span, retain_graph=True)[0] diff --git a/tests/physical_models/crop/test_root_dynamics.py b/tests/physical_models/crop/test_root_dynamics.py index 29d8069..363a354 100644 --- a/tests/physical_models/crop/test_root_dynamics.py +++ b/tests/physical_models/crop/test_root_dynamics.py @@ -2,54 +2,22 @@ from unittest.mock import patch import pytest import torch -import yaml from numpy.testing import assert_almost_equal -from pcse.base.parameter_providers import ParameterProvider from pcse.engine import Engine from pcse.models import Wofost72_PP from diffwofost.physical_models.crop.root_dynamics import WOFOST_Root_Dynamics -from tests.physical_models.pcse_test_code import EngineTestHelper -from tests.physical_models.pcse_test_code import WeatherDataProviderTestHelper +from tests.physical_models.utils import EngineTestHelper +from tests.physical_models.utils import calculate_numerical_grad +from tests.physical_models.utils import get_test_data +from tests.physical_models.utils import prepare_engine_input from .. import phy_data_folder -def prepare_engine_input(file_path): - inputs = yaml.safe_load(open(file_path)) - agro_management_inputs = inputs["AgroManagement"] - cropd = inputs["ModelParameters"] - - weather_data_provider = WeatherDataProviderTestHelper(inputs["WeatherVariables"]) - crop_model_params_provider = ParameterProvider(cropdata=cropd) - external_states = inputs["ExternalStates"] - - # convert parameters to tensors - crop_model_params_provider.clear_override() - for name in ["RDI", "RRI", "RDMCR", "RDMSOL", "TDWI", "IAIRDU"]: - value = torch.tensor(crop_model_params_provider[name], dtype=torch.float32) - crop_model_params_provider.set_override(name, value, check=False) - - # convert external states to tensors - tensor_external_states = [ - {k: v if k == "DAY" else torch.tensor(v, dtype=torch.float32) for k, v in item.items()} - for item in external_states - ] - return ( - crop_model_params_provider, - weather_data_provider, - agro_management_inputs, - tensor_external_states, - ) - - -def get_test_data(file_path): - inputs = yaml.safe_load(open(file_path)) - return inputs["ModelResults"], inputs["Precision"] - - def get_test_diff_root_model(): test_data_path = phy_data_folder / "test_rootdynamics_wofost72_01.yaml" + crop_model_params = ["RDI", "RRI", "RDMCR", "RDMSOL", "TDWI", "IAIRDU"] (crop_model_params_provider, weather_data_provider, agro_management_inputs, external_states) = ( - prepare_engine_input(test_data_path) + prepare_engine_input(test_data_path, crop_model_params) ) config_path = str(phy_data_folder / "WOFOST_Root_Dynamics.conf") return DiffRootDynamics( @@ -97,40 +65,19 @@ def forward(self, params_dict): ) # shape: [1, time_steps, 2] -def calculate_numerical_grad(param_name, param_value, output_name): - delta = 1e-6 - p_plus = param_value.item() + delta - p_minus = param_value.item() - delta - - model = get_test_diff_root_model() - output = model({param_name: torch.nn.Parameter(torch.tensor(p_plus, dtype=torch.float64))}) - if output_name == "RD": - loss_plus = output[0, :, 0].sum() - elif output_name == "TWRT": - loss_plus = output[0, :, 1].sum() - - model = get_test_diff_root_model() - output = model({param_name: torch.nn.Parameter(torch.tensor(p_minus, dtype=torch.float64))}) - if output_name == "RD": - loss_minus = output[0, :, 0].sum() - elif output_name == "TWRT": - loss_minus = output[0, :, 1].sum() - - return (loss_plus.item() - loss_minus.item()) / (2 * delta) - - class TestRootDynamics: def test_root_dynamics_with_testengine(self): """EngineTestHelper and not Engine because it allows to specify `external_states`.""" # prepare model input test_data_path = phy_data_folder / "test_rootdynamics_wofost72_01.yaml" + crop_model_params = ["RDI", "RRI", "RDMCR", "RDMSOL", "TDWI", "IAIRDU"] ( crop_model_params_provider, weather_data_provider, agro_management_inputs, external_states, - ) = prepare_engine_input(test_data_path) + ) = prepare_engine_input(test_data_path, crop_model_params) config_path = str(phy_data_folder / "WOFOST_Root_Dynamics.conf") engine = EngineTestHelper( @@ -158,8 +105,9 @@ def test_root_dynamics_with_testengine(self): def test_root_dynamics_with_engine(self): # prepare model input test_data_path = phy_data_folder / "test_rootdynamics_wofost72_01.yaml" + crop_model_params = ["RDI", "RRI", "RDMCR", "RDMSOL", "TDWI", "IAIRDU"] (crop_model_params_provider, weather_data_provider, agro_management_inputs, _) = ( - prepare_engine_input(test_data_path) + prepare_engine_input(test_data_path, crop_model_params) ) config_path = str(phy_data_folder / "WOFOST_Root_Dynamics.conf") @@ -176,8 +124,9 @@ def test_root_dynamics_with_engine(self): def test_wofost_pp_with_root_dynamics(self): # prepare model input test_data_path = phy_data_folder / "test_potentialproduction_wofost72_01.yaml" + crop_model_params = ["RDI", "RRI", "RDMCR", "RDMSOL", "TDWI", "IAIRDU"] (crop_model_params_provider, weather_data_provider, agro_management_inputs, _) = ( - prepare_engine_input(test_data_path) + prepare_engine_input(test_data_path, crop_model_params) ) # get expected results from YAML test data @@ -225,11 +174,14 @@ def test_gradients_tdwi_rd_root_dynamics(self): def test_gradients_tdwi_rd_root_dynamics_numerical(self): tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float64)) - numerical_grad = calculate_numerical_grad("TDWI", tdwi, "RD") + output_index = 0 # Index 0 is "RD" + numerical_grad = calculate_numerical_grad( + get_test_diff_root_model, "TDWI", tdwi, output_index + ) model = get_test_diff_root_model() output = model({"TDWI": tdwi}) - rd = output[0, :, 0] # Index 0 is "RD" + rd = output[0, :, output_index] # Index 0 is "RD" loss = rd.sum() # this is ∂loss/∂tdwi, for comparison with numerical gradient @@ -243,7 +195,7 @@ def test_gradients_tdwi_twrt_root_dynamics(self): model = get_test_diff_root_model() tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float32)) output = model({"TDWI": tdwi}) - twlv = output[0, :, 1] # Index 1 is "TWRT" + twlv = output[0, :, 1] # Index 1 is "TWRT" loss = twlv.sum() # this is ∂loss/∂tdwi @@ -263,11 +215,14 @@ def test_gradients_tdwi_twrt_root_dynamics(self): def test_gradients_tdwi_twrt_root_dynamics_numerical(self): tdwi = torch.nn.Parameter(torch.tensor(0.2, dtype=torch.float64)) - numerical_grad = calculate_numerical_grad("TDWI", tdwi, "TWRT") + output_index = 1 # Index 1 is "TWRT" + numerical_grad = calculate_numerical_grad( + get_test_diff_root_model, "TDWI", tdwi, output_index + ) model = get_test_diff_root_model() output = model({"TDWI": tdwi}) - twrt = output[0, :, 1] + twrt = output[0, :, output_index] loss = twrt.sum() # this is ∂loss/∂tdwi, for comparison with numerical gradient diff --git a/tests/physical_models/utils.py b/tests/physical_models/utils.py index f8b2685..feec0d3 100644 --- a/tests/physical_models/utils.py +++ b/tests/physical_models/utils.py @@ -17,9 +17,12 @@ import logging import os +import torch +import yaml from pcse import signals from pcse.agromanager import AgroManager from pcse.base import ConfigurationLoader +from pcse.base.parameter_providers import ParameterProvider from pcse.base.simulationobject import SimulationObject from pcse.base.variablekiosk import VariableKiosk from pcse.base.weather import WeatherDataContainer @@ -241,3 +244,52 @@ def __init__(self, yaml_weather): weather.pop("SNOWDEPTH") wdc = WeatherDataContainer(**weather) self._store_WeatherDataContainer(wdc, wdc.DAY) + + +def prepare_engine_input(file_path, crop_model_params): + inputs = yaml.safe_load(open(file_path)) + agro_management_inputs = inputs["AgroManagement"] + cropd = inputs["ModelParameters"] + + weather_data_provider = WeatherDataProviderTestHelper(inputs["WeatherVariables"]) + crop_model_params_provider = ParameterProvider(cropdata=cropd) + external_states = inputs["ExternalStates"] + + # convert parameters to tensors + crop_model_params_provider.clear_override() + for name in crop_model_params: + value = torch.tensor(crop_model_params_provider[name], dtype=torch.float32) + crop_model_params_provider.set_override(name, value, check=False) + + # convert external states to tensors + tensor_external_states = [ + {k: v if k == "DAY" else torch.tensor(v, dtype=torch.float32) for k, v in item.items()} + for item in external_states + ] + return ( + crop_model_params_provider, + weather_data_provider, + agro_management_inputs, + tensor_external_states, + ) + + +def get_test_data(file_path): + inputs = yaml.safe_load(open(file_path)) + return inputs["ModelResults"], inputs["Precision"] + + +def calculate_numerical_grad(get_model_fn, param_name, param_value, output_index): + delta = 1e-6 + p_plus = param_value.item() + delta + p_minus = param_value.item() - delta + + model = get_model_fn() + output = model({param_name: torch.nn.Parameter(torch.tensor(p_plus, dtype=torch.float64))}) + loss_plus = output[0, :, output_index].sum() + + model = get_model_fn() + output = model({param_name: torch.nn.Parameter(torch.tensor(p_minus, dtype=torch.float64))}) + loss_minus = output[0, :, output_index].sum() + + return (loss_plus.item() - loss_minus.item()) / (2 * delta)