diff --git a/.gitignore b/.gitignore
index e92d8943..a5967717 100644
--- a/.gitignore
+++ b/.gitignore
@@ -72,4 +72,5 @@ tmp*
# Documentation files
doc/source/api_reference/**/smash
doc/*-dataset
-doc/*~
+doc/**/*~
+doc/**/*#
diff --git a/doc/source/_static/flowchart_forward_gridded.png b/doc/source/_static/flowchart_forward_gridded.png
deleted file mode 100644
index b2e63b0c..00000000
Binary files a/doc/source/_static/flowchart_forward_gridded.png and /dev/null differ
diff --git a/doc/source/_static/forward_composition_flowchart.png b/doc/source/_static/forward_composition_flowchart.png
index d830ce2d..38ddfb67 100644
Binary files a/doc/source/_static/forward_composition_flowchart.png and b/doc/source/_static/forward_composition_flowchart.png differ
diff --git a/doc/source/_static/forward_flowchart_detail_input_params_states_fluxes.png b/doc/source/_static/forward_flowchart_detail_input_params_states_fluxes.png
new file mode 100644
index 00000000..f9c3d8ef
Binary files /dev/null and b/doc/source/_static/forward_flowchart_detail_input_params_states_fluxes.png differ
diff --git a/doc/source/_static/forward_simple_flowchart.png b/doc/source/_static/forward_simple_flowchart.png
index 5c0dd4ef..4968dbd8 100644
Binary files a/doc/source/_static/forward_simple_flowchart.png and b/doc/source/_static/forward_simple_flowchart.png differ
diff --git a/doc/source/_static/gr4_structure.svg b/doc/source/_static/gr4_structure.svg
new file mode 100644
index 00000000..66b2cdb6
--- /dev/null
+++ b/doc/source/_static/gr4_structure.svg
@@ -0,0 +1,1006 @@
+
+
+
+
diff --git a/doc/source/_static/gr5_structure.svg b/doc/source/_static/gr5_structure.svg
new file mode 100644
index 00000000..5f9a779f
--- /dev/null
+++ b/doc/source/_static/gr5_structure.svg
@@ -0,0 +1,1095 @@
+
+
+
+
diff --git a/doc/source/_static/grd_structure.svg b/doc/source/_static/grd_structure.svg
new file mode 100644
index 00000000..e194a392
--- /dev/null
+++ b/doc/source/_static/grd_structure.svg
@@ -0,0 +1,548 @@
+
+
+
+
diff --git a/doc/source/_static/loieau_structure.svg b/doc/source/_static/loieau_structure.svg
new file mode 100644
index 00000000..57e22afa
--- /dev/null
+++ b/doc/source/_static/loieau_structure.svg
@@ -0,0 +1,788 @@
+
+
+
+
diff --git a/doc/source/_static/vic3l_structure.svg b/doc/source/_static/vic3l_structure.svg
new file mode 100644
index 00000000..20f5c6fc
--- /dev/null
+++ b/doc/source/_static/vic3l_structure.svg
@@ -0,0 +1,1318 @@
+
+
+
+
diff --git a/doc/source/asset/eqs_smash_doc.lyx b/doc/source/asset/eqs_smash_doc.lyx
index 2464a7e3..0724012c 100644
--- a/doc/source/asset/eqs_smash_doc.lyx
+++ b/doc/source/asset/eqs_smash_doc.lyx
@@ -489,7 +489,7 @@ J\left(\boldsymbol{U}\left(\boldsymbol{\rho}\right),\boldsymbol{Y}^{*}\right)
\begin_layout Standard
\begin_inset Graphics
- filename /home/pagarambois/Documents/Distant/smash/doc/source/_static/forward_simple_flowchart.png
+ filename ../_static/forward_simple_flowchart.png
\end_inset
@@ -498,7 +498,16 @@ J\left(\boldsymbol{U}\left(\boldsymbol{\rho}\right),\boldsymbol{Y}^{*}\right)
\begin_layout Standard
\begin_inset Graphics
- filename forward_composition_flowchart.png
+ filename ../_static/forward_composition_flowchart.png
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Graphics
+ filename ../_static/forward_flowchart_GMDv1.png
\end_inset
@@ -514,7 +523,7 @@ J\left(\boldsymbol{U}\left(\boldsymbol{\rho}\right),\boldsymbol{Y}^{*}\right)
\begin_layout Standard
\begin_inset Graphics
- filename Inversion_process_flowchart.png
+ filename ../_static/Inversion_process_flowchart.png
\end_inset
@@ -530,7 +539,43 @@ J\left(\boldsymbol{U}\left(\boldsymbol{\rho}\right),\boldsymbol{Y}^{*}\right)
\begin_layout Standard
\begin_inset Graphics
- filename /home/pagarambois/Documents/Distant/smash/doc/source/_static/flowchart_forward_gridded.png
+ filename ../_static/forward_flowchart_detail_input_params_states_fluxes.png
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Model structures :
+\end_layout
+
+\begin_layout Standard
+gr4-5
+\end_layout
+
+\begin_layout Standard
+\begin_inset Graphics
+ filename ../_static/gr_flowchart.png
+
+\end_inset
+
+
+\begin_inset Graphics
+ filename ../_static/gr_flowchart.png
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+grd
+\end_layout
+
+\begin_layout Standard
+\begin_inset Graphics
+ filename ../_static/grd_flowchart.png
\end_inset
diff --git a/doc/source/asset/smash_graphes_structures.odp b/doc/source/asset/smash_graphes_structures.odp
index ff9ef235..77bf6e93 100644
Binary files a/doc/source/asset/smash_graphes_structures.odp and b/doc/source/asset/smash_graphes_structures.odp differ
diff --git a/doc/source/contributor_guide/development_process_details.rst b/doc/source/contributor_guide/development_process_details.rst
index f5b71ed0..a3984052 100644
--- a/doc/source/contributor_guide/development_process_details.rst
+++ b/doc/source/contributor_guide/development_process_details.rst
@@ -19,7 +19,7 @@ System-level dependencies
`smash` uses compiled code for speed, which means you need compilers and some other system-level
(i.e, non-Python / non-PyPI) dependencies to build it on your system.
-Anaconda (recommanded)
+Anaconda (recommended)
''''''''''''''''''''''
If you are using `Conda `__, all the dependencies will be installed
@@ -35,6 +35,14 @@ It will create a Conda environment called ``smash-dev`` that can be activated as
conda activate smash-dev
+Once ``smash-dev`` is created, it is recommended to update pip and your Conda environment
+to ensure you have the latest package versions and to prevent any conflicts:
+
+.. code-block:: none
+
+ (smash-dev) python3 -m pip install --upgrade pip
+ (smash-dev) conda update --all
+
Linux
'''''
diff --git a/doc/source/math_num_documentation/forward_inverse_problem.rst b/doc/source/math_num_documentation/forward_inverse_problem.rst
index bce94ac8..810dcd0d 100644
--- a/doc/source/math_num_documentation/forward_inverse_problem.rst
+++ b/doc/source/math_num_documentation/forward_inverse_problem.rst
@@ -6,16 +6,16 @@ Forward & Inverse Problems
This section explains:
-- The **hydrological modeling problem statement (forward/direct problem)**, that consists in modeling the spatio-temporal evolution of water states-fluxes within a basin/domain given atmospheric forcings and basin physical descriptors.
+- The **hydrological modeling problem (forward/direct problem)**, that consists in modeling the spatio-temporal evolution of water states-fluxes within a spatio-temporal domain given atmospheric forcings and basin physical descriptors.
-- The **parameter estimation problem statement (inverse problem)**, that pertains to estimating uncertain or unknows model parameters from the available spatio-temporal observations of hydrological state-fluxes and from basin physical descriptors.
+- The **parameter estimation problem (inverse problem)**, that aims to estimating uncertain or unknows model parameters from the available spatio-temporal observations of hydrological state-fluxes and from basin physical descriptors.
Forward problem statement
-------------------------
The forward/direct hydrological modeling problem statement is formulated here.
-Let :math:`\Omega\subset\mathbb{R}^{2}` denote a 2D spatial domain, :math:`x\in\Omega` the spatial coordinates, and :math:`t\in\left]0,T\right]` the physical time.
+The 2D spatial domain is denoted :math:`\Omega` with :math:`x` the vector of spatial coordinates, and :math:`t` is the time in the simulation window :math:`\left]0,T\right]`.
Hydrological model definition
@@ -32,7 +32,7 @@ catchment physical descriptors :math:`\boldsymbol{D}` onto surface discharge :ma
\boldsymbol{U}(x,t)=(Q,\boldsymbol{h},\boldsymbol{q})(x,t)=\mathcal{M}\left(\left[\boldsymbol{I},\boldsymbol{D}\right](x,t);\left[\boldsymbol{\theta},\boldsymbol{h}_{0}\right](x)\right)
}
-with :math:`\boldsymbol{U}(x,t)` the modeled state-flux variables, :math:`\boldsymbol{\theta}` the parameters and :math:`\boldsymbol{h}_{0}` the initial states.
+with :math:`\boldsymbol{U}(x,t)` the modeled state-flux variables, :math:`\boldsymbol{\theta}` the parameters and :math:`\boldsymbol{h}_{0}=\boldsymbol{h}\left(x,t=0\right)` the initial states.
.. figure:: ../_static/forward_simple_flowchart.png
@@ -41,7 +41,7 @@ with :math:`\boldsymbol{U}(x,t)` the modeled state-flux variables, :math:`\bolds
Flowchart of the forward modeling problem: input data, forward hydrological model :math:`\mathcal{M}`, simulated quantites.
-.. dropdown:: Sizes of model variables
+.. dropdown:: Detail on model variables
:animate: fade-in-slide-down
The sizes of the variables in the forward/direct problem are detailed here. We denote by :math:`N=N_{x} \times N_{t}` with :math:`N_{x}` the number of cells in :math:`\Omega` and :math:`N_t` the number of simulation time steps in :math:`\left]0,T\right]`.
@@ -60,10 +60,14 @@ with :math:`\boldsymbol{U}(x,t)` the modeled state-flux variables, :math:`\bolds
- Initial states :math:`\boldsymbol{h}_{0}=\boldsymbol{h}(x,t=0)`
-Operators Composition
-*********************
+
+.. _math_num_documentation.forward_inverse_problem.chaining:
+
+
+Operators Chaining Principle
+****************************
-The **forward hydrological model** :math:`\mathcal{M}` is obtained by combining at least two operators: the hydrological operator :math:`\mathcal{M}_{rr}` to simulate runoff from atmospheric forcings and use this runoff to feed a routing operator :math:`\mathcal{M}_{hy}` for cell to cell flow routing.
+The **forward hydrological model** :math:`\mathcal{M}` is obtained by chaining through fluxes at least two operators: the hydrological operator :math:`\mathcal{M}_{rr}` to simulate runoff from atmospheric forcings and use this runoff to feed a routing operator :math:`\mathcal{M}_{hy}` for cell to cell flow routing.
A snow module :math:`\mathcal{M}_{snw}` can also be added.
@@ -112,6 +116,8 @@ Consequently, replacing in :ref:`Eq. 1 `.
Parameter Estimation problem statement
--------------------------------------
diff --git a/doc/source/math_num_documentation/forward_structure.rst b/doc/source/math_num_documentation/forward_structure.rst
index df7b9206..dbbcf88e 100644
--- a/doc/source/math_num_documentation/forward_structure.rst
+++ b/doc/source/math_num_documentation/forward_structure.rst
@@ -4,797 +4,818 @@
Forward Structure
=================
-This section explains the `smash` forward modeling paradigm. It details the various models structures available, composed of **differentiable hydrological-hydraulic operators**.
+In `smash` a forward/direct spatially distributed model is obtained by chaining **differentiable hydrological-hydraulic operators** via simulated fluxes:
-In `smash`, :math:`\forall x \in\Omega\;,\;\forall t \in]0 .. T]`, a forward model structure :math:`\mathcal{M}=\mathcal{M}_{hy}\left(\,.\,,\mathcal{M}_{rr}\left(\,.\,,\mathcal{M}_{snw}\left(.\right)\right)\right)` (cf. :ref:`Eq. 2 `) is a combination of 3 models:
+- (optional) a descriptors-to-parameters mapping :math:`\phi` either for parameters imposing spatial constrain and/or regional mapping between physical descriptor and model conceptual parameters, see :ref:`mapping section `.
+- (optional) a ``snow`` operator :math:`\mathcal{M}_{snw}` generating a melt flux :math:`m_{lt}` which is then summed with the precipitation flux to feed the ``hydrological`` operator :math:`\mathcal{M}_{rr}`.
+- A ``hydrological`` production operator :math:`\mathcal{M}_{rr}` generating an elementary discharge :math:`q_t` which feeds the routing operator.
+- A ``routing`` operator :math:`\mathcal{M}_{hy}` simulating propagation of discharge :math:`Q)`.
-- The ``snow`` model :math:`\mathcal{M}_{snw}` generating a melt flux :math:`m_{lt}(x,t)` which is then summed with the precipitation flux to feed the ``hydrological`` model :math:`\mathcal{M}_{rr}`.
-- The ``hydrological`` production module :math:`\mathcal{M}_{rr}` generating an elementary discharge :math:`q_t(x,t)` which feeds the routing model.
-- The ``routing`` model :math:`\mathcal{M}_{hy}` that simulates the routing of discharge :math:`Q(x,t)`.
+The operators chaining principle is presented in section :ref:`forward and inverse problems statement ` (cf. :ref:`Eq. 2 ` ) and the chaining fluxes are explicitated in the diagram below. The forward model obtained reads :math:`\mathcal{M}=\mathcal{M}_{hy}\left(\,.\,,\mathcal{M}_{rr}\left(\,.\,,\mathcal{M}_{snw}\left(.\right)\right)\right)` .
-.. figure:: ../_static/flowchart_forward_gridded.png
+This section describes the various operators available in `smash` with mathematical/numerical expression, **input data** :math:`\left[\boldsymbol{I},\boldsymbol{D}\right](x,t)`, **tunable conceptual parameters** :math:`\boldsymbol{\theta}(x,t)` and simulated **state and fluxes** :math:`\boldsymbol{U}(x,t)=\left[Q,\boldsymbol{h},\boldsymbol{q}\right](x,t)`.
+
+These operators are written below for a given pixel :math:`x` of the 2D spatial domain :math:`\Omega` and for a time :math:`t` in the simulation window :math:`\left]0,T\right]`.
+
+
+.. figure:: ../_static/forward_flowchart_detail_input_params_states_fluxes.png
:align: center
:width: 800
- Schematic view of a gridded model :math:`\mathcal{M}`: input data, model components, simulated quantites.
+ Diagram of input data, hydrological-hydraulic operators, simulated quantities of a forward model
+ :math:`\mathcal{M}=\mathcal{M}_{hy}\left(\,.\,,\mathcal{M}_{rr}\left(\,.\,,\mathcal{M}_{snw}\left(.\right)\right)\right)` (cf. :ref:`Eq. 2 `);
+ recall the composition principle is explained in section :ref:`forward and inverse problems statement `.
.. _math_num_documentation.forward_structure.snow_module:
-Snow module :math:`\mathcal{M}_{snw}`
--------------------------------------
+Snow operator :math:`\mathcal{M}_{snw}`
+---------------------------------------
.. image:: ../_static/snow_module.svg
:align: center
:width: 300
-zero
-****
+.. dropdown:: zero (Zero Snow)
+ :animate: fade-in-slide-down
-This snow module simply means that there is no snow module.
+ This snow operator simply means that there is no snow operator.
-.. math::
-
- m_{lt}(x, t) = 0
+ .. math::
+
+ m_{lt}(x, t) = 0
-with :math:`m_{lt}` the melt flux.
+ with :math:`m_{lt}` the melt flux.
-ssn (Simple Snow)
-*****************
+.. dropdown:: ssn (Simple Snow)
+ :animate: fade-in-slide-down
-This snow module is a simple degree-day snow module. It can be expressed as follows:
+ This snow operator is a simple degree-day snow operator. It can be expressed as follows:
-.. math::
+ .. math::
- m_{lt}(x, t) = f\left(\left[S, T_e\right](x, t), k_{mlt}(x), h_s(x, t)\right)
+ m_{lt}(x, t) = f\left(\left[S, T_e\right](x, t), k_{mlt}(x), h_s(x, t)\right)
-with :math:`m_{lt}` the melt flux, :math:`S` the snow, :math:`T_e` the temperature, :math:`k_{mlt}` the melt coefficient and :math:`h_s` the state of the snow reservoir.
+ with :math:`m_{lt}` the melt flux, :math:`S` the snow, :math:`T_e` the temperature, :math:`k_{mlt}` the melt coefficient and :math:`h_s` the state of the snow reservoir.
-.. note::
+ .. note::
- Linking with the forward problem equation :ref:`Eq. 1 `
-
- - Internal fluxes, :math:`\{m_{lt}\}\in\boldsymbol{q}`
- - Atmospheric forcings, :math:`\{S, T_e\}\in\boldsymbol{\mathcal{I}}`
- - Parameters, :math:`\{k_{mlt}\}\in\boldsymbol{\theta}`
- - States, :math:`\{h_s\}\in\boldsymbol{h}`
+ Linking with the forward problem equation :ref:`Eq. 1 `
+
+ - Internal fluxes, :math:`\{m_{lt}\}\in\boldsymbol{q}`
+ - Atmospheric forcings, :math:`\{S, T_e\}\in\boldsymbol{\mathcal{I}}`
+ - Parameters, :math:`\{k_{mlt}\}\in\boldsymbol{\theta}`
+ - States, :math:`\{h_s\}\in\boldsymbol{h}`
-The function :math:`f` is resolved numerically as follows:
+ The function :math:`f` is resolved numerically as follows:
-- Update the snow reservoir state :math:`h_s` for :math:`t^* \in \left] t-1 , t\right[`
+ - Update the snow reservoir state :math:`h_s` for :math:`t^* \in \left] t-1 , t\right[`
-.. math::
+ .. math::
- h_s(x, t^*) = h_s(x, t-1) + S(x, t)
+ h_s(x, t^*) = h_s(x, t-1) + S(x, t)
-- Compute the melt flux :math:`m_{lt}`
+ - Compute the melt flux :math:`m_{lt}`
-.. math::
- :nowrap:
+ .. math::
+ :nowrap:
- \begin{eqnarray}
+ \begin{eqnarray}
- m_{lt}(x, t) =
- \begin{cases}
+ m_{lt}(x, t) =
+ \begin{cases}
- 0 &\text{if} \; T_e(x, t) \leq 0 \\
- \min\left(h_s(x, t^*), k_{mlt}(x)\times T_e(x, t)\right) &\text{otherwise}
+ 0 &\text{if} \; T_e(x, t) \leq 0 \\
+ \min\left(h_s(x, t^*), k_{mlt}(x)\times T_e(x, t)\right) &\text{otherwise}
- \end{cases}
+ \end{cases}
- \end{eqnarray}
+ \end{eqnarray}
-- Update the snow reservoir state :math:`h_s`
+ - Update the snow reservoir state :math:`h_s`
-.. math::
+ .. math::
- h_s(x, t) = h_s(x, t^*) - m_{lt}(x, t)
+ h_s(x, t) = h_s(x, t^*) - m_{lt}(x, t)
.. _math_num_documentation.forward_structure.hydrological_module:
-Hydrological module :math:`\mathcal{M}_{rr}`
---------------------------------------------
+Hydrological operator :math:`\mathcal{M}_{rr}`
+----------------------------------------------
+
+Hydrological processes can be described at pixel scale in `smash` with one of the availabe hydrological operators adapted from state-of-the-art lumped models.
.. image:: ../_static/hydrological_module.svg
:align: center
:width: 500
-gr4 (Génie Rural 4)
-*******************
+.. _math_num_documentation.forward_structure.hydrological_module.gr4:
-This hydrological module is derived from the GR4 model :cite:p:`perrin2003improvement`.
+.. dropdown:: gr4 (Génie Rural 4)
+ :animate: fade-in-slide-down
-.. hint::
+ This hydrological operator is derived from the GR4 model :cite:p:`perrin2003improvement`.
- Helpful links about GR:
+ .. hint::
- - `Brief history of GR models `__
- - `Scientific papers `__
- - `GR models in a R package `__
+ Helpful links about GR:
-It can be expressed as follows:
+ - `Brief history of GR models `__
+ - `Scientific papers `__
+ - `GR models in a R package `__
-.. math::
+ .. figure:: ../_static/gr4_structure.svg
+ :align: center
+ :width: 400
+
+ Diagram of the ``gr4`` like hydrological operator
- q_{t}(x, t) = f\left(\left[P, E\right](x, t), m_{lt}(x, t), \left[c_i, c_p, c_t, k_{exc}\right](x), \left[h_i, h_p, h_t\right](x, t)\right)
+ It can be expressed as follows:
-with :math:`q_{t}` the elemental discharge, :math:`P` the precipitation, :math:`E` the potential evapotranspiration,
-:math:`m_{lt}` the melt flux from the snow module, :math:`c_i` the maximum capacity of the interception reservoir,
-:math:`c_p` the maximum capacity of the production reservoir, :math:`c_t` the maximum capacity of the transfer reservoir,
-:math:`k_{exc}` the exchange coefficient, :math:`h_i` the state of the interception reservoir, :math:`h_p` the state of the production reservoir
-and :math:`h_t` the state of the transfer reservoir.
+ .. math::
-.. note::
+ q_{t}(x, t) = f\left(\left[P, E\right](x, t), m_{lt}(x, t), \left[c_i, c_p, c_t, k_{exc}\right](x), \left[h_i, h_p, h_t\right](x, t)\right)
- Linking with the forward problem equation :ref:`Eq. 1 `
-
- - Internal fluxes, :math:`\{q_{t}, m_{lt}\}\in\boldsymbol{q}`
- - Atmospheric forcings, :math:`\{P, E\}\in\boldsymbol{\mathcal{I}}`
- - Parameters, :math:`\{c_i, c_p, c_t, k_{exc}\}\in\boldsymbol{\theta}`
- - States, :math:`\{h_i, h_p, h_t\}\in\boldsymbol{h}`
+ with :math:`q_{t}` the elemental discharge, :math:`P` the precipitation, :math:`E` the potential evapotranspiration,
+ :math:`m_{lt}` the melt flux from the snow operator, :math:`c_i` the maximum capacity of the interception reservoir,
+ :math:`c_p` the maximum capacity of the production reservoir, :math:`c_t` the maximum capacity of the transfer reservoir,
+ :math:`k_{exc}` the exchange coefficient, :math:`h_i` the state of the interception reservoir, :math:`h_p` the state of the production reservoir
+ and :math:`h_t` the state of the transfer reservoir.
-The function :math:`f` is resolved numerically as follows:
+ .. note::
-.. _math_num_documentation.forward_structure.hydrological_module.gr4.interception:
+ Linking with the forward problem equation :ref:`Eq. 1 `
+
+ - Internal fluxes, :math:`\{q_{t}, m_{lt}\}\in\boldsymbol{q}`
+ - Atmospheric forcings, :math:`\{P, E\}\in\boldsymbol{\mathcal{I}}`
+ - Parameters, :math:`\{c_i, c_p, c_t, k_{exc}\}\in\boldsymbol{\theta}`
+ - States, :math:`\{h_i, h_p, h_t\}\in\boldsymbol{h}`
-Interception
-''''''''''''
+ The function :math:`f` is resolved numerically as follows:
-- Compute interception evaporation :math:`e_i`
+ **Interception**
-.. math::
+ - Compute interception evaporation :math:`e_i`
- e_i(x, t) = \min(E(x, t), P(x, t) + m_{lt}(x, t) + h_i(x, t - 1)\times c_i(x))
+ .. math::
-- Compute the neutralized precipitation :math:`p_n` and evaporation :math:`e_n`
+ e_i(x, t) = \min(E(x, t), P(x, t) + m_{lt}(x, t) + h_i(x, t - 1)\times c_i(x))
-.. math::
- :nowrap:
+ - Compute the neutralized precipitation :math:`p_n` and evaporation :math:`e_n`
- \begin{eqnarray}
+ .. math::
+ :nowrap:
- &p_n(x, t)& &=& &\max \left(0, \; P(x, t) + m_{lt}(x, t) - c_i(x) \times (1 - h_i(x, t - 1)) - e_i(x, t) \right)\\
+ \begin{eqnarray}
- &e_n(x, t)& &=& &E(x, t) - e_i(x, t)
+ &p_n(x, t)& &=& &\max \left(0, \; P(x, t) + m_{lt}(x, t) - c_i(x) \times (1 - h_i(x, t - 1)) - e_i(x, t) \right)\\
- \end{eqnarray}
+ &e_n(x, t)& &=& &E(x, t) - e_i(x, t)
-- Update the interception reservoir state :math:`h_i`
+ \end{eqnarray}
-.. math::
+ - Update the interception reservoir state :math:`h_i`
- h_i(x, t) = h_i(x, t - 1) + \frac{P(x, t) + m_{lt}(x, t) + e_i(x, t) - p_n(x, t)}{c_i(x)}
+ .. math::
-.. _math_num_documentation.forward_structure.hydrological_module.gr4.production:
+ h_i(x, t) = h_i(x, t - 1) + \frac{P(x, t) + m_{lt}(x, t) + e_i(x, t) - p_n(x, t)}{c_i(x)}
-Production
-''''''''''
+ **Production**
-- Compute the production infiltrating precipitation :math:`p_s` and evaporation :math:`e_s`
+ - Compute the production infiltrating precipitation :math:`p_s` and evaporation :math:`e_s`
-.. math::
- :nowrap:
+ .. math::
+ :nowrap:
- \begin{eqnarray}
+ \begin{eqnarray}
- &p_s(x, t)& &=& &c_p(x) (1 - h_p(x, t - 1)^2) \frac{\tanh\left(\frac{p_n(x, t)}{c_p(x)}\right)}{1 + h_p(x, t - 1) \tanh\left(\frac{p_n(x, t)}{c_p(x)}\right)}\\
+ &p_s(x, t)& &=& &c_p(x) (1 - h_p(x, t - 1)^2) \frac{\tanh\left(\frac{p_n(x, t)}{c_p(x)}\right)}{1 + h_p(x, t - 1) \tanh\left(\frac{p_n(x, t)}{c_p(x)}\right)}\\
- &e_s(x, t)& &=& &h_p(x, t - 1) c_p(x) (2 - h_p(x, t - 1)) \frac{\tanh\left(\frac{e_n(x, t)}{c_p(x)}\right)}{1 + (1 - h_p(x, t - 1)) \tanh\left(\frac{e_n(x, t)}{c_p(x)}\right)}
- \end{eqnarray}
+ &e_s(x, t)& &=& &h_p(x, t - 1) c_p(x) (2 - h_p(x, t - 1)) \frac{\tanh\left(\frac{e_n(x, t)}{c_p(x)}\right)}{1 + (1 - h_p(x, t - 1)) \tanh\left(\frac{e_n(x, t)}{c_p(x)}\right)}
+ \end{eqnarray}
-- Update the production reservoir state :math:`h_p`
+ - Update the production reservoir state :math:`h_p`
-.. math::
+ .. math::
- h_p(x, t^*) = h_p(x, t - 1) + \frac{p_s(x, t) - e_s(x, t)}{c_p(x)}
+ h_p(x, t^*) = h_p(x, t - 1) + \frac{p_s(x, t) - e_s(x, t)}{c_p(x)}
-- Compute the production runoff :math:`p_r`
+ - Compute the production runoff :math:`p_r`
-.. math::
- :nowrap:
+ .. math::
+ :nowrap:
- \begin{eqnarray}
+ \begin{eqnarray}
- p_r(x, t) =
- \begin{cases}
+ p_r(x, t) =
+ \begin{cases}
- 0 &\text{if} \; p_n(x, t) \leq 0 \\
- p_n(x, t) - (h_p(x, t^*) - h_p(x, t - 1))c_p(x) &\text{otherwise}
+ 0 &\text{if} \; p_n(x, t) \leq 0 \\
+ p_n(x, t) - (h_p(x, t^*) - h_p(x, t - 1))c_p(x) &\text{otherwise}
- \end{cases}
+ \end{cases}
- \end{eqnarray}
+ \end{eqnarray}
-- Compute the production percolation :math:`p_{erc}`
+ - Compute the production percolation :math:`p_{erc}`
-.. math::
+ .. math::
- p_{erc}(x, t) = h_p(x, t^*) c_p(x) \left(1 - \left(1 + \left(\frac{4}{9}h_p(x, t^*)\right)^4\right)^{-1/4}\right)
+ p_{erc}(x, t) = h_p(x, t^*) c_p(x) \left(1 - \left(1 + \left(\frac{4}{9}h_p(x, t^*)\right)^4\right)^{-1/4}\right)
-- Update the production reservoir state :math:`h_p`
+ - Update the production reservoir state :math:`h_p`
-.. math::
+ .. math::
- h_p(x, t) = h_p(x, t^*) - \frac{p_{erc}(x, t)}{c_p(x)}
+ h_p(x, t) = h_p(x, t^*) - \frac{p_{erc}(x, t)}{c_p(x)}
-Exchange
-''''''''
+ **Exchange**
-- Compute the exchange flux :math:`l_{exc}`
+ - Compute the exchange flux :math:`l_{exc}`
-.. math::
+ .. math::
- l_{exc}(x, t) = k_{exc}(x) h_t(x, t - 1)^{7/2}
+ l_{exc}(x, t) = k_{exc}(x) h_t(x, t - 1)^{7/2}
+ **Transfer**
-.. _math_num_documentation.forward_structure.hydrological_module.gr4.transfer:
+ - Split the production runoff :math:`p_r` into two branches (transfer and direct), :math:`p_{rr}` and :math:`p_{rd}`
-Transfer
-''''''''
+ .. math::
+ :nowrap:
-- Split the production runoff :math:`p_r` into two branches (transfer and direct), :math:`p_{rr}` and :math:`p_{rd}`
+ \begin{eqnarray}
-.. math::
- :nowrap:
+ &p_{rr}(x, t)& &=& &0.9(p_r(x, t) + p_{erc}(x, t)) + l_{exc}(x, t)\\
+ &p_{rd}(x, t)& &=& &0.1(p_r(x, t) + p_{erc}(x, t))
- \begin{eqnarray}
+ \end{eqnarray}
- &p_{rr}(x, t)& &=& &0.9(p_r(x, t) + p_{erc}(x, t)) + l_{exc}(x, t)\\
- &p_{rd}(x, t)& &=& &0.1(p_r(x, t) + p_{erc}(x, t))
+ - Update the transfer reservoir state :math:`h_t`
- \end{eqnarray}
+ .. math::
+
+ h_t(x, t^*) = \max\left(0, h_t(x, t - 1) + \frac{p_{rr}(x, t)}{c_t(x)}\right)
-- Update the transfer reservoir state :math:`h_t`
+ - Compute the transfer branch elemental discharge :math:`q_r`
-.. math::
-
- h_t(x, t^*) = \max\left(0, h_t(x, t - 1) + \frac{p_{rr}(x, t)}{c_t(x)}\right)
+ .. math::
+ :nowrap:
-- Compute the transfer branch elemental discharge :math:`q_r`
+ \begin{eqnarray}
-.. math::
- :nowrap:
+ q_r(x, t) = h_t(x, t^*)c_t(x) - \left(\left(h_t(x, t^*)c_t(x)\right)^{-4} + c_t(x)^{-4}\right)^{-1/4}
- \begin{eqnarray}
+ \end{eqnarray}
- q_r(x, t) = h_t(x, t^*)c_t(x) - \left(\left(h_t(x, t^*)c_t(x)\right)^{-4} + c_t(x)^{-4}\right)^{-1/4}
+ - Update the transfer reservoir state :math:`h_t`
- \end{eqnarray}
+ .. math::
-- Update the transfer reservoir state :math:`h_t`
+ h_t(x, t) = h_t(x, t^*) - \frac{q_r(x, t)}{c_t(x)}
-.. math::
+ - Compute the direct branch elemental discharge :math:`q_d`
- h_t(x, t) = h_t(x, t^*) - \frac{q_r(x, t)}{c_t(x)}
+ .. math::
-- Compute the direct branch elemental discharge :math:`q_d`
+ q_d(x, t) = \max(0, p_{rd}(x, t) + l_{exc}(x, t))
-.. math::
+ - Compute the elemental discharge :math:`q_t`
- q_d(x, t) = \max(0, p_{rd}(x, t) + l_{exc}(x, t))
+ .. math::
-- Compute the elemental discharge :math:`q_t`
+ q_t(x, t) = q_r(x, t) + q_d(x, t)
-.. math::
+.. _math_num_documentation.forward_structure.hydrological_module.gr5:
- q_t(x, t) = q_r(x, t) + q_d(x, t)
+.. dropdown:: gr5 (Génie Rural 5)
+ :animate: fade-in-slide-down
-gr5 (Génie Rural 5)
-*******************
+ This hydrological operator is derived from the GR5 model :cite:p:`LeMoine_2008`. It consists in a gr4 like model stucture (see diagram above) with a modified exchange flux with two parameters to account for seasonal variaitons.
-This hydrological module is derived from the GR5 model :cite:p:`LeMoine_2008`.
+ .. hint::
-.. hint::
+ Helpful links about GR:
- Helpful links about GR:
+ - `Brief history of GR models `__
+ - `Scientific papers `__
+ - `GR models in a R package `__
- - `Brief history of GR models `__
- - `Scientific papers `__
- - `GR models in a R package `__
+ .. figure:: ../_static/gr5_structure.svg
+ :align: center
+ :width: 400
+
+ Diagram of the ``gr5`` like hydrological operator
-It can be expressed as follows:
+ It can be expressed as follows:
-.. math::
+ .. math::
- q_{t}(x, t) = f\left(\left[P, E\right](x, t), m_{lt}(x, t), \left[c_i, c_p, c_t, k_{exc}, a_{exc}\right](x), \left[h_i, h_p, h_t\right](x, t)\right)
+ q_{t}(x, t) = f\left(\left[P, E\right](x, t), m_{lt}(x, t), \left[c_i, c_p, c_t, k_{exc}, a_{exc}\right](x), \left[h_i, h_p, h_t\right](x, t)\right)
-with :math:`q_{t}` the elemental discharge, :math:`P` the precipitation, :math:`E` the potential evapotranspiration,
-:math:`m_{lt}` the melt flux from the snow module, :math:`c_i` the maximum capacity of the interception reservoir,
-:math:`c_p` the maximum capacity of the production reservoir, :math:`c_t` the maximum capacity of the transfer reservoir,
-:math:`k_{exc}` the exchange coefficient, :math:`a_{exc}` the exchange threshold, :math:`h_i` the state of the interception reservoir,
-:math:`h_p` the state of the production reservoir and :math:`h_t` the state of the transfer reservoir.
+ with :math:`q_{t}` the elemental discharge, :math:`P` the precipitation, :math:`E` the potential evapotranspiration,
+ :math:`m_{lt}` the melt flux from the snow operator, :math:`c_i` the maximum capacity of the interception reservoir,
+ :math:`c_p` the maximum capacity of the production reservoir, :math:`c_t` the maximum capacity of the transfer reservoir,
+ :math:`k_{exc}` the exchange coefficient, :math:`a_{exc}` the exchange threshold, :math:`h_i` the state of the interception reservoir,
+ :math:`h_p` the state of the production reservoir and :math:`h_t` the state of the transfer reservoir.
-.. note::
+ .. note::
- Linking with the forward problem equation :ref:`Eq. 1 `
-
- - Internal fluxes, :math:`\{q_{t}, m_{lt}\}\in\boldsymbol{q}`
- - Atmospheric forcings, :math:`\{P, E\}\in\boldsymbol{\mathcal{I}}`
- - Parameters, :math:`\{c_i, c_p, c_t, k_{exc}, a_{exc}\}\in\boldsymbol{\theta}`
- - States, :math:`\{h_i, h_p, h_t\}\in\boldsymbol{h}`
+ Linking with the forward problem equation :ref:`Eq. 1 `
+
+ - Internal fluxes, :math:`\{q_{t}, m_{lt}\}\in\boldsymbol{q}`
+ - Atmospheric forcings, :math:`\{P, E\}\in\boldsymbol{\mathcal{I}}`
+ - Parameters, :math:`\{c_i, c_p, c_t, k_{exc}, a_{exc}\}\in\boldsymbol{\theta}`
+ - States, :math:`\{h_i, h_p, h_t\}\in\boldsymbol{h}`
-The function :math:`f` is resolved numerically as follows:
+ The function :math:`f` is resolved numerically as follows:
-Interception
-''''''''''''
+ **Interception**
-Same as ``gr4`` interception, see :ref:`GR4 Interception `
+ Same as ``gr4`` interception, see :ref:`GR4 Interception `
-Production
-''''''''''
+ **Production**
-Same as ``gr4`` production, see :ref:`GR4 Production `
+ Same as ``gr4`` production, see :ref:`GR4 Production `
+ **Exchange**
-Exchange
-''''''''
+ - Compute the exchange flux :math:`l_{exc}`
-- Compute the exchange flux :math:`l_{exc}`
+ .. math::
-.. math::
+ l_{exc}(x, t) = k_{exc}(x) \left(h_t(x, t - 1) - a_{exc}(x)\right)
- l_{exc}(x, t) = k_{exc}(x) \left(h_t(x, t - 1) - a_{exc}(x)\right)
+ **Transfer**
-Transfer
-''''''''
+ Same as ``gr4`` transfer, see :ref:`GR4 Transfer `
-Same as ``gr4`` transfer, see :ref:`GR4 Transfer `
+.. _math_num_documentation.forward_structure.hydrological_module.grd:
-grd (Génie Rural Distribué)
-***************************
+.. dropdown:: grd (Génie Rural Distribué)
+ :animate: fade-in-slide-down
-This hydrological module is derived from the GR model :cite:p:`jay2019potential`.
+ This hydrological operator is derived from the GR models and is a simplified strucutre used in :cite:p:`jay2019potential`.
-It can be expressed as follows:
+ .. figure:: ../_static/grd_structure.svg
+ :align: center
+ :width: 300
+
+ Diagram of the ``grd`` hydrological operator, a simplified ``GR`` like
-.. math::
+ It can be expressed as follows:
- q_{t}(x, t) = f\left(\left[P, E\right](x, t), m_{lt}(x, t), \left[c_p, c_t\right](x), \left[h_p, h_t\right](x, t)\right)
+ .. math::
-with :math:`q_{t}` the elemental discharge, :math:`P` the precipitation, :math:`E` the potential evapotranspiration,
-:math:`m_{lt}` the melt flux from the snow module, :math:`c_p` the maximum capacity of the production reservoir,
-:math:`c_t` the maximum capacity of the transfer reservoir, :math:`h_p` the state of the production reservoir and
-:math:`h_t` the state of the transfer reservoir.
+ q_{t}(x, t) = f\left(\left[P, E\right](x, t), m_{lt}(x, t), \left[c_p, c_t\right](x), \left[h_p, h_t\right](x, t)\right)
-.. note::
+ with :math:`q_{t}` the elemental discharge, :math:`P` the precipitation, :math:`E` the potential evapotranspiration,
+ :math:`m_{lt}` the melt flux from the snow operator, :math:`c_p` the maximum capacity of the production reservoir,
+ :math:`c_t` the maximum capacity of the transfer reservoir, :math:`h_p` the state of the production reservoir and
+ :math:`h_t` the state of the transfer reservoir.
- Linking with the forward problem equation :ref:`Eq. 1 `
-
- - Internal fluxes, :math:`\{q_{t}, m_{lt}\}\in\boldsymbol{q}`
- - Atmospheric forcings, :math:`\{P, E\}\in\boldsymbol{\mathcal{I}}`
- - Parameters, :math:`\{c_p, c_t\}\in\boldsymbol{\theta}`
- - States, :math:`\{h_p, h_t\}\in\boldsymbol{h}`
+ .. note::
-The function :math:`f` is resolved numerically as follows:
+ Linking with the forward problem equation :ref:`Eq. 1 `
+
+ - Internal fluxes, :math:`\{q_{t}, m_{lt}\}\in\boldsymbol{q}`
+ - Atmospheric forcings, :math:`\{P, E\}\in\boldsymbol{\mathcal{I}}`
+ - Parameters, :math:`\{c_p, c_t\}\in\boldsymbol{\theta}`
+ - States, :math:`\{h_p, h_t\}\in\boldsymbol{h}`
-.. _math_num_documentation.forward_structure.hydrological_module.grd.interception:
+ The function :math:`f` is resolved numerically as follows:
-Interception
-''''''''''''
+ **Interception**
-- Compute the interception evaporation :math:`e_i`
+ - Compute the interception evaporation :math:`e_i`
-.. math::
+ .. math::
- e_i(x, t) = \min(E(x, t), P(x, t) + m_{lt}(x, t))
+ e_i(x, t) = \min(E(x, t), P(x, t) + m_{lt}(x, t))
-- Compute the neutralized precipitation :math:`p_n` and evaporation :math:`e_n`
+ - Compute the neutralized precipitation :math:`p_n` and evaporation :math:`e_n`
-.. math::
- :nowrap:
+ .. math::
+ :nowrap:
- \begin{eqnarray}
+ \begin{eqnarray}
- &p_n(x, t)& &=& &\max \left(0, \; P(x, t) + m_{lt}(x, t) - e_i(x, t) \right)\\
+ &p_n(x, t)& &=& &\max \left(0, \; P(x, t) + m_{lt}(x, t) - e_i(x, t) \right)\\
- &e_n(x, t)& &=& &E(x, t) - e_i(x, t)
+ &e_n(x, t)& &=& &E(x, t) - e_i(x, t)
- \end{eqnarray}
+ \end{eqnarray}
-Production
-''''''''''
+ **Production**
-Same as ``gr4`` production, see :ref:`GR4 Production `
+ Same as ``gr4`` production, see :ref:`GR4 Production `
-Transfer
-''''''''
+ **Transfer**
-- Update the transfer reservoir state :math:`h_t`
+ - Update the transfer reservoir state :math:`h_t`
-.. math::
-
- h_t(x, t^*) = \max\left(0, h_t(x, t - 1) + \frac{p_{r}(x, t)}{c_t(x)}\right)
+ .. math::
+
+ h_t(x, t^*) = \max\left(0, h_t(x, t - 1) + \frac{p_{r}(x, t)}{c_t(x)}\right)
-- Compute the transfer branch elemental discharge :math:`q_r`
+ - Compute the transfer branch elemental discharge :math:`q_r`
-.. math::
- :nowrap:
+ .. math::
+ :nowrap:
- \begin{eqnarray}
+ \begin{eqnarray}
- q_r(x, t) = h_t(x, t^*)c_t(x) - \left(\left(h_t(x, t^*)c_t(x)\right)^{-4} + c_t(x)^{-4}\right)^{-1/4}
+ q_r(x, t) = h_t(x, t^*)c_t(x) - \left(\left(h_t(x, t^*)c_t(x)\right)^{-4} + c_t(x)^{-4}\right)^{-1/4}
- \end{eqnarray}
+ \end{eqnarray}
-- Update the transfer reservoir state :math:`h_t`
+ - Update the transfer reservoir state :math:`h_t`
-.. math::
+ .. math::
- h_t(x, t) = h_t(x, t^*) - \frac{q_r(x, t)}{c_t(x)}
+ h_t(x, t) = h_t(x, t^*) - \frac{q_r(x, t)}{c_t(x)}
-- Compute the elemental discharge :math:`q_t`
+ - Compute the elemental discharge :math:`q_t`
-.. math::
+ .. math::
- q_t(x, t) = q_r(x, t)
+ q_t(x, t) = q_r(x, t)
-loieau (LoiEau)
-***************
+.. _math_num_documentation.forward_structure.hydrological_module.loieau:
-This hydrological module is derived from the GR model :cite:p:`Folton_2020`.
+.. dropdown:: loieau (LoiEau)
+ :animate: fade-in-slide-down
-.. hint::
+ This hydrological operator is derived from the GR model :cite:p:`Folton_2020`.
- Helpful links about LoiEau:
+ .. hint::
- - `Database `__
+ Helpful links about LoiEau:
-It can be expressed as follows:
+ - `Database `__
-.. math::
+ .. figure:: ../_static/loieau_structure.svg
+ :align: center
+ :width: 300
+
+ Diagram of the ``loieau`` like hydrological operator
- q_{t}(x, t) = f\left(\left[P, E\right](x, t), m_{lt}(x, t), \left[c_a, c_c, k_b\right](x), \left[h_a, h_c\right](x, t)\right)
+ It can be expressed as follows:
-with :math:`q_{t}` the elemental discharge, :math:`P` the precipitation, :math:`E` the potential evapotranspiration,
-:math:`m_{lt}` the melt flux from the snow module, :math:`c_a` the maximum capacity of the production reservoir,
-:math:`c_c` the maximum capacity of the transfer reservoir, :math:`k_b` the transfer coefficient,
-:math:`h_a` the state of the production reservoir and :math:`h_c` the state of the transfer reservoir.
+ .. math::
-.. note::
+ q_{t}(x, t) = f\left(\left[P, E\right](x, t), m_{lt}(x, t), \left[c_a, c_c, k_b\right](x), \left[h_a, h_c\right](x, t)\right)
- Linking with the forward problem equation :ref:`Eq. 1 `
-
- - Internal fluxes, :math:`\{q_{t}, m_{lt}\}\in\boldsymbol{q}`
- - Atmospheric forcings, :math:`\{P, E\}\in\boldsymbol{\mathcal{I}}`
- - Parameters, :math:`\{c_a, c_c, k_b\}\in\boldsymbol{\theta}`
- - States, :math:`\{h_a, h_c\}\in\boldsymbol{h}`
+ with :math:`q_{t}` the elemental discharge, :math:`P` the precipitation, :math:`E` the potential evapotranspiration,
+ :math:`m_{lt}` the melt flux from the snow operator, :math:`c_a` the maximum capacity of the production reservoir,
+ :math:`c_c` the maximum capacity of the transfer reservoir, :math:`k_b` the transfer coefficient,
+ :math:`h_a` the state of the production reservoir and :math:`h_c` the state of the transfer reservoir.
+
+ .. note::
-The function :math:`f` is resolved numerically as follows:
+ Linking with the forward problem equation :ref:`Eq. 1 `
+
+ - Internal fluxes, :math:`\{q_{t}, m_{lt}\}\in\boldsymbol{q}`
+ - Atmospheric forcings, :math:`\{P, E\}\in\boldsymbol{\mathcal{I}}`
+ - Parameters, :math:`\{c_a, c_c, k_b\}\in\boldsymbol{\theta}`
+ - States, :math:`\{h_a, h_c\}\in\boldsymbol{h}`
-Interception
-''''''''''''
+ The function :math:`f` is resolved numerically as follows:
-Same as ``grd`` interception, see :ref:`GRD Interception `
+ **Interception**
-Production
-''''''''''
+ Same as ``grd`` interception, see :ref:`GRD Interception `
-Same as ``gr4`` production, see :ref:`GR4 Production `
+ **Production**
-.. note::
+ Same as ``gr4`` production, see :ref:`GR4 Production `
- The parameter :math:`c_p` is replaced by :math:`c_a` and the state :math:`h_p` by :math:`h_a`
+ .. note::
-Transfer
-''''''''
+ The parameter :math:`c_p` is replaced by :math:`c_a` and the state :math:`h_p` by :math:`h_a`
-- Split the production runoff :math:`p_r` into two branches (transfer and direct), :math:`p_{rr}` and :math:`p_{rd}`
+ **Transfer**
-.. math::
- :nowrap:
+ - Split the production runoff :math:`p_r` into two branches (transfer and direct), :math:`p_{rr}` and :math:`p_{rd}`
- \begin{eqnarray}
+ .. math::
+ :nowrap:
- &p_{rr}(x, t)& &=& &0.9(p_r(x, t) + p_{erc}(x, t))\\
- &p_{rd}(x, t)& &=& &0.1(p_r(x, t) + p_{erc}(x, t))
+ \begin{eqnarray}
- \end{eqnarray}
+ &p_{rr}(x, t)& &=& &0.9(p_r(x, t) + p_{erc}(x, t))\\
+ &p_{rd}(x, t)& &=& &0.1(p_r(x, t) + p_{erc}(x, t))
-- Update the transfer reservoir state :math:`h_c`
+ \end{eqnarray}
-.. math::
-
- h_c(x, t^*) = \max\left(0, h_c(x, t - 1) + \frac{p_{rr}(x, t)}{c_c(x)}\right)
+ - Update the transfer reservoir state :math:`h_c`
-- Compute the transfer branch elemental discharge :math:`q_r`
+ .. math::
+
+ h_c(x, t^*) = \max\left(0, h_c(x, t - 1) + \frac{p_{rr}(x, t)}{c_c(x)}\right)
-.. math::
- :nowrap:
+ - Compute the transfer branch elemental discharge :math:`q_r`
- \begin{eqnarray}
+ .. math::
+ :nowrap:
- q_r(x, t) = h_c(x, t^*)c_c(x) - \left(\left(h_c(x, t^*)c_c(x)\right)^{-3} + c_c(x)^{-3}\right)^{-1/3}
+ \begin{eqnarray}
- \end{eqnarray}
+ q_r(x, t) = h_c(x, t^*)c_c(x) - \left(\left(h_c(x, t^*)c_c(x)\right)^{-3} + c_c(x)^{-3}\right)^{-1/3}
-- Update the transfer reservoir state :math:`h_c`
+ \end{eqnarray}
-.. math::
+ - Update the transfer reservoir state :math:`h_c`
- h_c(x, t) = h_c(x, t^*) - \frac{q_r(x, t)}{c_c(x)}
+ .. math::
-- Compute the direct branch elemental discharge :math:`q_d`
+ h_c(x, t) = h_c(x, t^*) - \frac{q_r(x, t)}{c_c(x)}
-.. math::
+ - Compute the direct branch elemental discharge :math:`q_d`
- q_d(x, t) = \max(0, p_{rd}(x, t))
+ .. math::
-- Compute the elemental discharge :math:`q_t`
+ q_d(x, t) = \max(0, p_{rd}(x, t))
-.. math::
+ - Compute the elemental discharge :math:`q_t`
- q_t(x, t) = k_b(x)\left(q_r(x, t) + q_d(x, t)\right)
+ .. math::
-vic3l (Variable Infiltration Curve 3 Layers)
-********************************************
+ q_t(x, t) = k_b(x)\left(q_r(x, t) + q_d(x, t)\right)
-This hydrological module is derived from the VIC model :cite:p:`liang1994simple`.
+.. _math_num_documentation.forward_structure.hydrological_module.vic3l:
-.. hint::
+.. dropdown:: vic3l (Variable Infiltration Curve 3 Layers)
+ :animate: fade-in-slide-down
- Helpful links about VIC:
+ This hydrological operator is derived from the VIC model :cite:p:`liang1994simple`.
- - `Model overview `__
- - `References `__
- - `GitHub `__
+ .. hint::
-It can be expressed as follows:
+ Helpful links about VIC:
-.. math::
+ - `Model overview `__
+ - `References `__
+ - `GitHub `__
- q_{t}(x, t) = f\left(\left[P, E\right](x, t), m_{lt}(x, t), \left[b, c_{usl}, c_{msl}, c_{bsl}, k_s, p_{bc}, d_{sm}, d_s, w_s\right](x), \left[h_{cl}, h_{usl}, h_{msl}, h_{bsl}\right](x, t)\right)
+ .. figure:: ../_static/vic3l_structure.svg
+ :align: center
+ :width: 300
+
+ Diagram of the ``vic3l`` like hydrological operator
-with :math:`q_{t}` the elemental discharge, :math:`P` the precipitation, :math:`E` the potential evapotranspiration,
-:math:`m_{lt}` the melt flux from the snow module, :math:`b` the variable infiltration curve parameter,
-:math:`c_{usl}` the maximum capacity of the upper soil layer, :math:`c_{msl}` the maximum capacity of the medium soil layer,
-:math:`c_{bsl}` the maximum capacity of the bottom soil layer, :math:`k_s` the saturated hydraulic conductivity,
-:math:`p_{bc}` the Brooks and Corey exponent, :math:`d_{sm}` the maximum velocity of baseflow,
-:math:`d_s` the non-linear baseflow threshold maximum velocity, :math:`w_s` the non-linear baseflow threshold soil moisture,
-:math:`h_{cl}` the state of the canopy layer, :math:`h_{usl}` the state of the upper soil layer,
-:math:`h_{msl}` the state of the medium soil layer and :math:`h_{bsl}` the state of the bottom soil layer.
+ It can be expressed as follows:
-.. note::
+ .. math::
- Linking with the forward problem equation :ref:`Eq. 1 `
-
- - Internal fluxes, :math:`\{q_{t}, m_{lt}\}\in\boldsymbol{q}`
- - Atmospheric forcings, :math:`\{P, E\}\in\boldsymbol{\mathcal{I}}`
- - Parameters, :math:`\{b, c_{usl}, c_{msl}, c_{bsl}, k_s, p_{bc}, d_{sm}, d_s, w_s\}\in\boldsymbol{\theta}`
- - States, :math:`\{h_{cl}, h_{usl}, h_{msl}, h_{bsl}\}\in\boldsymbol{h}`
+ q_{t}(x, t) = f\left(\left[P, E\right](x, t), m_{lt}(x, t), \left[b, c_{usl}, c_{msl}, c_{bsl}, k_s, p_{bc}, d_{sm}, d_s, w_s\right](x), \left[h_{cl}, h_{usl}, h_{msl}, h_{bsl}\right](x, t)\right)
-The function :math:`f` is resolved numerically as follows:
+ with :math:`q_{t}` the elemental discharge, :math:`P` the precipitation, :math:`E` the potential evapotranspiration,
+ :math:`m_{lt}` the melt flux from the snow operator, :math:`b` the variable infiltration curve parameter,
+ :math:`c_{usl}` the maximum capacity of the upper soil layer, :math:`c_{msl}` the maximum capacity of the medium soil layer,
+ :math:`c_{bsl}` the maximum capacity of the bottom soil layer, :math:`k_s` the saturated hydraulic conductivity,
+ :math:`p_{bc}` the Brooks and Corey exponent, :math:`d_{sm}` the maximum velocity of baseflow,
+ :math:`d_s` the non-linear baseflow threshold maximum velocity, :math:`w_s` the non-linear baseflow threshold soil moisture,
+ :math:`h_{cl}` the state of the canopy layer, :math:`h_{usl}` the state of the upper soil layer,
+ :math:`h_{msl}` the state of the medium soil layer and :math:`h_{bsl}` the state of the bottom soil layer.
-Canopy layer interception
-'''''''''''''''''''''''''
+ .. note::
-- Compute the canopy layer interception evaporation :math:`e_c`
+ Linking with the forward problem equation :ref:`Eq. 1 `
+
+ - Internal fluxes, :math:`\{q_{t}, m_{lt}\}\in\boldsymbol{q}`
+ - Atmospheric forcings, :math:`\{P, E\}\in\boldsymbol{\mathcal{I}}`
+ - Parameters, :math:`\{b, c_{usl}, c_{msl}, c_{bsl}, k_s, p_{bc}, d_{sm}, d_s, w_s\}\in\boldsymbol{\theta}`
+ - States, :math:`\{h_{cl}, h_{usl}, h_{msl}, h_{bsl}\}\in\boldsymbol{h}`
-.. math::
+ The function :math:`f` is resolved numerically as follows:
- e_c(x, t) = \min(E(x, t)h_{cl}(x, t - 1)^{2/3}, P(x, t) + m_{lt}(x, t) + h_{cl}(x, t - 1))
+ **Canopy layer interception**
-- Compute the neutralized precipitation :math:`p_n` and evaporation :math:`e_n`
+ - Compute the canopy layer interception evaporation :math:`e_c`
-.. math::
- :nowrap:
+ .. math::
- \begin{eqnarray}
+ e_c(x, t) = \min(E(x, t)h_{cl}(x, t - 1)^{2/3}, P(x, t) + m_{lt}(x, t) + h_{cl}(x, t - 1))
- &p_n(x, t)& &=& &\max\left(0, P(x, t) + m_{lt}(x, t) - (1 - h_{cl}(x, t - 1)) - e_c(x, t)\right)\\
- &e_n(x, t)& &=& &E(x, t) - e_c(x, t)
+ - Compute the neutralized precipitation :math:`p_n` and evaporation :math:`e_n`
- \end{eqnarray}
+ .. math::
+ :nowrap:
-- Update the canopy layer interception state :math:`h_{cl}`
+ \begin{eqnarray}
-.. math::
+ &p_n(x, t)& &=& &\max\left(0, P(x, t) + m_{lt}(x, t) - (1 - h_{cl}(x, t - 1)) - e_c(x, t)\right)\\
+ &e_n(x, t)& &=& &E(x, t) - e_c(x, t)
- h_{cl}(x, t) = h_{cl}(x, t - 1) + P(x, t) - e_c(x, t) - p_n(x, t)
+ \end{eqnarray}
-Upper soil layer evaporation
-''''''''''''''''''''''''''''
+ - Update the canopy layer interception state :math:`h_{cl}`
-- Compute the maximum :math:`i_{m}` and the corresponding soil saturation :math:`i_{0}` infiltration
+ .. math::
-.. math::
- :nowrap:
+ h_{cl}(x, t) = h_{cl}(x, t - 1) + P(x, t) - e_c(x, t) - p_n(x, t)
- \begin{eqnarray}
+ **Upper soil layer evaporation**
- &i_{m}(x, t)& &=& &(1 + b(x))c_{usl}(x)\\
- &i_{0}(x, t)& &=& &i_{m}(x, t)\left(1 - (1 - h_{usl}(x, t - 1))^{1/(1 - b(x))}\right)
+ - Compute the maximum :math:`i_{m}` and the corresponding soil saturation :math:`i_{0}` infiltration
- \end{eqnarray}
+ .. math::
+ :nowrap:
-- Compute the upper soil layer evaporation :math:`e_s`
+ \begin{eqnarray}
-.. math::
- :nowrap:
+ &i_{m}(x, t)& &=& &(1 + b(x))c_{usl}(x)\\
+ &i_{0}(x, t)& &=& &i_{m}(x, t)\left(1 - (1 - h_{usl}(x, t - 1))^{1/(1 - b(x))}\right)
- \begin{eqnarray}
+ \end{eqnarray}
- e_s(x, t) =
- \begin{cases}
+ - Compute the upper soil layer evaporation :math:`e_s`
- e_n(x, t) &\text{if} \; i_{0}(x, t) \geq i_{m}(x, t) \\
- \beta(x, t)e_n(x, t) &\text{otherwise}
+ .. math::
+ :nowrap:
- \end{cases}
+ \begin{eqnarray}
- \end{eqnarray}
+ e_s(x, t) =
+ \begin{cases}
-with :math:`\beta`, the beta function in the ARNO evaporation :cite:p:`todini1996arno` (Appendix A)
+ e_n(x, t) &\text{if} \; i_{0}(x, t) \geq i_{m}(x, t) \\
+ \beta(x, t)e_n(x, t) &\text{otherwise}
-.. FIXME Maybe explain what is the beta function, power expansion ...
+ \end{cases}
-- Update the upper soil layer reservoir state :math:`h_{usl}`
+ \end{eqnarray}
-.. math::
+ with :math:`\beta`, the beta function in the ARNO evaporation :cite:p:`todini1996arno` (Appendix A)
- h_{usl}(x, t) = h_{usl}(x, t - 1) - \frac{e_s(x, t)}{c_{usl}(x)}
+ .. FIXME Maybe explain what is the beta function, power expansion ...
-Infiltration
-''''''''''''
+ - Update the upper soil layer reservoir state :math:`h_{usl}`
-- Compute the maximum capacity :math:`c_{umsl}`, the soil moisture :math:`w_{umsl}` and the relative state :math:`h_{umsl}` of the first two layers
+ .. math::
-.. math::
- :nowrap:
+ h_{usl}(x, t) = h_{usl}(x, t - 1) - \frac{e_s(x, t)}{c_{usl}(x)}
- \begin{eqnarray}
+ **Infiltration**
- &c_{umsl}(x)& &=& &c_{usl}(x) + c_{msl}(x)\\
- &w_{umsl}(x, t - 1)& &=& &h_{usl}(x, t - 1)c_{usl}(x) + h_{msl}(x, t - 1)c_{msl}(x)\\
- &h_{umsl}(x, t - 1)& &=& &\frac{w_{umsl}(x, t - 1)}{c_{umsl}(x)}
+ - Compute the maximum capacity :math:`c_{umsl}`, the soil moisture :math:`w_{umsl}` and the relative state :math:`h_{umsl}` of the first two layers
- \end{eqnarray}
+ .. math::
+ :nowrap:
-- Compute the maximum :math:`i_{m}` and the corresponding soil saturation :math:`i_{0}` infiltration
+ \begin{eqnarray}
-.. math::
- :nowrap:
+ &c_{umsl}(x)& &=& &c_{usl}(x) + c_{msl}(x)\\
+ &w_{umsl}(x, t - 1)& &=& &h_{usl}(x, t - 1)c_{usl}(x) + h_{msl}(x, t - 1)c_{msl}(x)\\
+ &h_{umsl}(x, t - 1)& &=& &\frac{w_{umsl}(x, t - 1)}{c_{umsl}(x)}
- \begin{eqnarray}
+ \end{eqnarray}
- &i_{m}(x, t)& &=& &(1 + b(x))c_{umsl}(x)\\
- &i_{0}(x, t)& &=& &i_{m}(x, t)\left(1 - (1 - h_{umsl}(x, t - 1))^{1/(1 - b(x))}\right)
+ - Compute the maximum :math:`i_{m}` and the corresponding soil saturation :math:`i_{0}` infiltration
- \end{eqnarray}
+ .. math::
+ :nowrap:
-- Compute the infiltration :math:`i`
+ \begin{eqnarray}
-.. math::
- :nowrap:
+ &i_{m}(x, t)& &=& &(1 + b(x))c_{umsl}(x)\\
+ &i_{0}(x, t)& &=& &i_{m}(x, t)\left(1 - (1 - h_{umsl}(x, t - 1))^{1/(1 - b(x))}\right)
- \begin{eqnarray}
+ \end{eqnarray}
- i(x, t) =
- \begin{cases}
+ - Compute the infiltration :math:`i`
- c_{umsl}(x) - w_{umsl}(x, t - 1) &\text{if} \; i_{0}(x, t) + p_n(x, t) > i_{m}(x, t) \\
- c_{umsl}(x) - w_{umsl}(x, t - 1) - c_{umsl}(x)\left(1 - \frac{i_{0}(x, t) + p_n(x, t)}{i_m(x, t)}\right)^{b(x) + 1} &\text{otherwise}
+ .. math::
+ :nowrap:
- \end{cases}
+ \begin{eqnarray}
- \end{eqnarray}
+ i(x, t) =
+ \begin{cases}
-- Distribute the infiltration :math:`i` between the first two layers, :math:`i_{usl}` and :math:`i_{msl}`
+ c_{umsl}(x) - w_{umsl}(x, t - 1) &\text{if} \; i_{0}(x, t) + p_n(x, t) > i_{m}(x, t) \\
+ c_{umsl}(x) - w_{umsl}(x, t - 1) - c_{umsl}(x)\left(1 - \frac{i_{0}(x, t) + p_n(x, t)}{i_m(x, t)}\right)^{b(x) + 1} &\text{otherwise}
-.. math::
- :nowrap:
+ \end{cases}
- \begin{eqnarray}
+ \end{eqnarray}
- &i_{usl}(x, t)& &=& &\min((1 - h_{usl}(x, t - 1)c_{usl}(x), i(x, t))\\
- &i_{msl}(x, t)& &=& &\min((1 - h_{msl}(x, t - 1)c_{msl}(x), i(x, t) - i_{usl}(x, t))
+ - Distribute the infiltration :math:`i` between the first two layers, :math:`i_{usl}` and :math:`i_{msl}`
- \end{eqnarray}
+ .. math::
+ :nowrap:
-- Update the first two layers reservoir states, :math:`h_{usl}` and :math:`h_{msl}`
+ \begin{eqnarray}
-.. math::
- :nowrap:
+ &i_{usl}(x, t)& &=& &\min((1 - h_{usl}(x, t - 1)c_{usl}(x), i(x, t))\\
+ &i_{msl}(x, t)& &=& &\min((1 - h_{msl}(x, t - 1)c_{msl}(x), i(x, t) - i_{usl}(x, t))
- \begin{eqnarray}
+ \end{eqnarray}
- &h_{usl}(x, t)& &=& &h_{usl}(x, t - 1) + i_{usl}(x, t)\\
- &h_{msl}(x, t)& &=& &h_{msl}(x, t - 1) + i_{msl}(x, t)
+ - Update the first two layers reservoir states, :math:`h_{usl}` and :math:`h_{msl}`
- \end{eqnarray}
+ .. math::
+ :nowrap:
-- Compute the runoff :math:`q_r`
+ \begin{eqnarray}
-.. math::
+ &h_{usl}(x, t)& &=& &h_{usl}(x, t - 1) + i_{usl}(x, t)\\
+ &h_{msl}(x, t)& &=& &h_{msl}(x, t - 1) + i_{msl}(x, t)
- q_r(x, t) = p_n(x, t) - (i_{usl}(x, t) + i_{msl}(x, t))
+ \end{eqnarray}
-Drainage
-''''''''
+ - Compute the runoff :math:`q_r`
-- Compute the soil moisture in the first two layers, :math:`w_{usl}` and :math:`w_{msl}`
+ .. math::
-.. math::
- :nowrap:
+ q_r(x, t) = p_n(x, t) - (i_{usl}(x, t) + i_{msl}(x, t))
- \begin{eqnarray}
+ **Drainage**
- &w_{usl}(x, t - 1)& &=& &h_{usl}(x, t - 1)c_{usl}(x)\\
- &w_{msl}(x, t - 1)& &=& &h_{msl}(x, t - 1)c_{msl}(x)
+ - Compute the soil moisture in the first two layers, :math:`w_{usl}` and :math:`w_{msl}`
- \end{eqnarray}
+ .. math::
+ :nowrap:
-- Compute the drainage flux :math:`d_{umsl}` from the upper soil layer to medium soil layer
+ \begin{eqnarray}
-.. math::
+ &w_{usl}(x, t - 1)& &=& &h_{usl}(x, t - 1)c_{usl}(x)\\
+ &w_{msl}(x, t - 1)& &=& &h_{msl}(x, t - 1)c_{msl}(x)
- d_{umsl}(x, t^*) = k_s(x) * h_{usl}(x, t - 1)^{p_{bc}}
+ \end{eqnarray}
-- Update the drainage flux :math:`d_{umsl}` according to under and over soil layer saturation
+ - Compute the drainage flux :math:`d_{umsl}` from the upper soil layer to medium soil layer
-.. math::
+ .. math::
- d_{umsl}(x, t) = \min(d_{umsl}(x, t^*), \min(w_{usl}(x, t - 1), c_{msl}(x) - w_{msl}(x, t - 1)))
+ d_{umsl}(x, t^*) = k_s(x) * h_{usl}(x, t - 1)^{p_{bc}}
-- Update the first two layers reservoir states, :math:`h_{usl}` and :math:`h_{msl}`
+ - Update the drainage flux :math:`d_{umsl}` according to under and over soil layer saturation
-.. math::
- :nowrap:
+ .. math::
- \begin{eqnarray}
+ d_{umsl}(x, t) = \min(d_{umsl}(x, t^*), \min(w_{usl}(x, t - 1), c_{msl}(x) - w_{msl}(x, t - 1)))
- &h_{usl}(x, t)& &=& &h_{usl}(x, t - 1) - \frac{d_{umsl}(x, t)}{c_{usl}(x)}\\
- &h_{msl}(x, t)& &=& &h_{msl}(x, t - 1) + \frac{d_{umsl}(x, t)}{c_{msl}(x)}
+ - Update the first two layers reservoir states, :math:`h_{usl}` and :math:`h_{msl}`
- \end{eqnarray}
+ .. math::
+ :nowrap:
-.. note::
-
- The same approach is performed for drainage in the medium and bottom layers. Hence the three first steps are skiped for readability and the update of the reservoir states is directly written.
+ \begin{eqnarray}
-- Update of the reservoirs states, :math:`h_{msl}` and :math:`h_{bsl}`
+ &h_{usl}(x, t)& &=& &h_{usl}(x, t - 1) - \frac{d_{umsl}(x, t)}{c_{usl}(x)}\\
+ &h_{msl}(x, t)& &=& &h_{msl}(x, t - 1) + \frac{d_{umsl}(x, t)}{c_{msl}(x)}
-.. math::
- :nowrap:
+ \end{eqnarray}
- \begin{eqnarray}
+ .. note::
+
+ The same approach is performed for drainage in the medium and bottom layers. Hence the three first steps are skiped for readability and the update of the reservoir states is directly written.
- &h_{msl}(x, t)& &=& &h_{msl}(x, t - 1) - \frac{d_{mbsl}(x, t)}{c_{msl}(x)}\\
- &h_{bsl}(x, t)& &=& &h_{bsl}(x, t - 1) + \frac{d_{mbsl}(x, t)}{c_{bsl}(x)}
+ - Update of the reservoirs states, :math:`h_{msl}` and :math:`h_{bsl}`
- \end{eqnarray}
+ .. math::
+ :nowrap:
-Baseflow
-''''''''
+ \begin{eqnarray}
-- Compute the baseflow :math:`q_b`
+ &h_{msl}(x, t)& &=& &h_{msl}(x, t - 1) - \frac{d_{mbsl}(x, t)}{c_{msl}(x)}\\
+ &h_{bsl}(x, t)& &=& &h_{bsl}(x, t - 1) + \frac{d_{mbsl}(x, t)}{c_{bsl}(x)}
-.. math::
- :nowrap:
+ \end{eqnarray}
- \begin{eqnarray}
+ **Baseflow**
- q_b(x, t) =
- \begin{cases}
+ - Compute the baseflow :math:`q_b`
- \frac{d_{sm}(x)d_s(x)}{w_s(x)}h_{bsl}(x, t - 1) &\text{if} \; h_{bsl}(x, t - 1) > w_s(x) \\
- \frac{d_{sm}(x)d_s(x)}{w_s(x)}h_{bsl}(x, t - 1) + d_{sm}(x)\left(1 - \frac{d_s(x)}{w_s(x)}\right)\left(\frac{h_{bsl}(x, t - 1) - w_s(x)}{1 - w_s(x)}\right)^2 &\text{otherwise}
-
- \end{cases}
+ .. math::
+ :nowrap:
+
+ \begin{eqnarray}
- \end{eqnarray}
+ q_b(x, t) =
+ \begin{cases}
-- Update the bottom soil layer reservoir state :math:`h_{bsl}`
+ \frac{d_{sm}(x)d_s(x)}{w_s(x)}h_{bsl}(x, t - 1) &\text{if} \; h_{bsl}(x, t - 1) > w_s(x) \\
+ \frac{d_{sm}(x)d_s(x)}{w_s(x)}h_{bsl}(x, t - 1) + d_{sm}(x)\left(1 - \frac{d_s(x)}{w_s(x)}\right)\left(\frac{h_{bsl}(x, t - 1) - w_s(x)}{1 - w_s(x)}\right)^2 &\text{otherwise}
+
+ \end{cases}
-.. math::
+ \end{eqnarray}
- h_{bsl}(x, t) = h_{bsl}(x, t - 1) - \frac{q_b(x, t)}{c_{bsl}(x)}
+ - Update the bottom soil layer reservoir state :math:`h_{bsl}`
+
+ .. math::
+
+ h_{bsl}(x, t) = h_{bsl}(x, t - 1) - \frac{q_b(x, t)}{c_{bsl}(x)}
.. _math_num_documentation.forward_structure.routing_module:
-Routing module :math:`\mathcal{M}_{hy}`
----------------------------------------
+Routing operator :math:`\mathcal{M}_{hy}`
+-----------------------------------------
-The following routing operators are grid based and adapted to perform on the same grid than the snow and production modules.
+The following routing operators are grid based and adapted to perform on the same grid than the snow and production operators.
They take as input a 8 direction (D8) drainage plan :math:`\mathcal{D}_{\Omega}\left(x\right)` obtained by terrain elevation processing.
For all the following models, the 2D flow routing problem over the spatial domain :math:`\Omega` reduces to a 1D problem by using the
@@ -806,245 +827,241 @@ surface discharge can inflow the current cell :math:`x` - each cell has a unique
:align: center
:width: 300
-lag0 (Instantaneous Routing)
-****************************
+.. _math_num_documentation.forward_structure.routing_module.lag0:
-This routing module is a simple aggregation of upstream discharge to downstream following the drainage plan. It can be expressed as follows:
+.. dropdown:: lag0 (Instantaneous Routing)
+ :animate: fade-in-slide-down
-.. math::
+ This routing operator is a simple aggregation of upstream discharge to downstream following the drainage plan. It can be expressed as follows:
- Q(x, t) = f\left(Q(x', t), q_{t}(x, t)\right),\;\forall x'\in \Omega_x
+ .. math::
-with :math:`Q` the surface discharge, :math:`q_t` the elemental discharge and :math:`\Omega_x` a 2D spatial domain that corresponds to all upstream cells
-flowing into cell :math:`x`, i.e. the whole upstream catchment. Note that :math:`\Omega_x` is a subset of :math:`\Omega`, :math:`\Omega_x\subset\Omega` and for the most upstream cells,
-:math:`\Omega_x=\emptyset`.
+ Q(x, t) = f\left(Q(x', t), q_{t}(x, t)\right),\;\forall x'\in \Omega_x
-.. note::
+ with :math:`Q` the surface discharge, :math:`q_t` the elemental discharge and :math:`\Omega_x` a 2D spatial domain that corresponds to all upstream cells
+ flowing into cell :math:`x`, i.e. the whole upstream catchment. Note that :math:`\Omega_x` is a subset of :math:`\Omega`, :math:`\Omega_x\subset\Omega` and for the most upstream cells,
+ :math:`\Omega_x=\emptyset`.
- Linking with the forward problem equation :ref:`Eq. 1 `
-
- - Surface discharge, :math:`Q`
- - Internal fluxes, :math:`\{q_{t}\}\in\boldsymbol{q}`
+ .. note::
-The function :math:`f` is resolved numerically as follows:
+ Linking with the forward problem equation :ref:`Eq. 1 `
+
+ - Surface discharge, :math:`Q`
+ - Internal fluxes, :math:`\{q_{t}\}\in\boldsymbol{q}`
-.. _math_num_documentation.forward_structure.routing_module.lag0.upstream_discharge:
+ The function :math:`f` is resolved numerically as follows:
-Upstream discharge
-''''''''''''''''''
+ **Upstream discharge**
-- Compute the upstream discharge :math:`q_{up}`
+ - Compute the upstream discharge :math:`q_{up}`
-.. math::
- :nowrap:
+ .. math::
+ :nowrap:
- \begin{eqnarray}
+ \begin{eqnarray}
- q_{up}(x, t) =
- \begin{cases}
+ q_{up}(x, t) =
+ \begin{cases}
- 0 &\text{if} \; \Omega_x = \emptyset \\
- \sum_{k\in\Omega_x} Q(k, t) &\text{otherwise}
+ 0 &\text{if} \; \Omega_x = \emptyset \\
+ \sum_{k\in\Omega_x} Q(k, t) &\text{otherwise}
- \end{cases}
+ \end{cases}
- \end{eqnarray}
+ \end{eqnarray}
-Surface discharge
-'''''''''''''''''
+ **Surface discharge**
-- Compute the surface discharge :math:`Q`
+ - Compute the surface discharge :math:`Q`
-.. math::
+ .. math::
- Q(x, t) = q_{up}(x, t) + \alpha(x) q_t(x, t)
+ Q(x, t) = q_{up}(x, t) + \alpha(x) q_t(x, t)
-with :math:`\alpha` a conversion factor from :math:`mm.\Delta t^{-1}` to :math:`m^3.s^{-1}` for a single cell.
+ with :math:`\alpha` a conversion factor from :math:`mm.\Delta t^{-1}` to :math:`m^3.s^{-1}` for a single cell.
-lr (Linear Reservoir)
-*********************
+.. _math_num_documentation.forward_structure.routing_module.lr:
-This routing module is using a linear reservoir to rout upstream discharge to downstream following the drainage plan. It can be expressed as follows:
+.. dropdown:: lr (Linear Reservoir)
+ :animate: fade-in-slide-down
-.. math::
+ This routing operator is using a linear reservoir to rout upstream discharge to downstream following the drainage plan. It can be expressed as follows:
- Q(x, t) = f\left(Q(x', t), q_{t}(x, t), l_{lr}(x), h_{lr}(x, t)\right),\;\forall x'\in \Omega_x
+ .. math::
-with :math:`Q` the surface discharge, :math:`q_t` the elemental discharge, :math:`l_{lr}` the routing lag time,
-:math:`h_{lr}` the state of the routing reservoir and :math:`\Omega_x` a 2D spatial domain that corresponds to all upstream cells
-flowing into cell :math:`x`. Note that :math:`\Omega_x` is a subset of :math:`\Omega`, :math:`\Omega_x\subset\Omega` and for the most upstream cells,
-:math:`\Omega_x=\emptyset`.
+ Q(x, t) = f\left(Q(x', t), q_{t}(x, t), l_{lr}(x), h_{lr}(x, t)\right),\;\forall x'\in \Omega_x
-.. note::
+ with :math:`Q` the surface discharge, :math:`q_t` the elemental discharge, :math:`l_{lr}` the routing lag time,
+ :math:`h_{lr}` the state of the routing reservoir and :math:`\Omega_x` a 2D spatial domain that corresponds to all upstream cells
+ flowing into cell :math:`x`. Note that :math:`\Omega_x` is a subset of :math:`\Omega`, :math:`\Omega_x\subset\Omega` and for the most upstream cells,
+ :math:`\Omega_x=\emptyset`.
- Linking with the forward problem equation :ref:`Eq. 1 `
-
- - Surface discharge, :math:`Q`
- - Internal fluxes, :math:`\{q_{t}\}\in\boldsymbol{q}`
- - Parameters, :math:`\{l_{lr}\}\in\boldsymbol{\theta}`
- - States, :math:`\{h_{lr}\}\in\boldsymbol{h}`
+ .. note::
-The function :math:`f` is resolved numerically as follows:
+ Linking with the forward problem equation :ref:`Eq. 1 `
+
+ - Surface discharge, :math:`Q`
+ - Internal fluxes, :math:`\{q_{t}\}\in\boldsymbol{q}`
+ - Parameters, :math:`\{l_{lr}\}\in\boldsymbol{\theta}`
+ - States, :math:`\{h_{lr}\}\in\boldsymbol{h}`
-Upstream discharge
-''''''''''''''''''
+ The function :math:`f` is resolved numerically as follows:
-Same as ``lag0`` upstream discharge, see :ref:`LAG0 Upstream Discharge `
+ **Upstream discharge**
-Surface discharge
-'''''''''''''''''
+ Same as ``lag0`` upstream discharge, see :ref:`LAG0 Upstream Discharge `
-- Update the routing reservoir state :math:`h_{lr}`
+ **Surface discharge**
-.. math::
+ - Update the routing reservoir state :math:`h_{lr}`
- h_{lr}(x, t^*) = h_{lr}(x, t) + \frac{1}{\beta(x)} q_{up}(x, t)
+ .. math::
-with :math:`\beta` a conversion factor from :math:`mm.\Delta t^{-1}` to :math:`m^3.s^{-1}` for the whole upstream domain :math:`\Omega_x`.
+ h_{lr}(x, t^*) = h_{lr}(x, t) + \frac{1}{\beta(x)} q_{up}(x, t)
-- Compute the routed discharge :math:`q_{rt}`
+ with :math:`\beta` a conversion factor from :math:`mm.\Delta t^{-1}` to :math:`m^3.s^{-1}` for the whole upstream domain :math:`\Omega_x`.
-.. math::
+ - Compute the routed discharge :math:`q_{rt}`
- q_{rt}(x, t) = h_{lr}(x, t^*) \left(1 - \exp\left(\frac{-\Delta t}{60\times l_{lr}}\right)\right)
+ .. math::
-- Update the routing reservoir state :math:`h_{lr}`
+ q_{rt}(x, t) = h_{lr}(x, t^*) \left(1 - \exp\left(\frac{-\Delta t}{60\times l_{lr}}\right)\right)
-.. math::
+ - Update the routing reservoir state :math:`h_{lr}`
- h_{lr}(x, t) = h_{lr}(x, t^*) - q_{rt}(x, t)
+ .. math::
-- Compute the surface discharge :math:`Q`
+ h_{lr}(x, t) = h_{lr}(x, t^*) - q_{rt}(x, t)
-.. math::
+ - Compute the surface discharge :math:`Q`
- Q(x, t) = \beta(x)q_{rt}(x, t) + \alpha(x)q_t(x, t)
+ .. math::
-with :math:`\alpha` a conversion factor from from :math:`mm.\Delta t^{-1}` to :math:`m^3.s^{-1}` for a single cell.
+ Q(x, t) = \beta(x)q_{rt}(x, t) + \alpha(x)q_t(x, t)
-kw (Kinematic Wave)
-*******************
+ with :math:`\alpha` a conversion factor from from :math:`mm.\Delta t^{-1}` to :math:`m^3.s^{-1}` for a single cell.
-This routing module is based on a conceptual 1D kinematic wave model that is numerically solved with a linearized implicit numerical scheme :cite:p:`ChowAppliedhydrology`. This is applicable given the drainage plan :math:`\mathcal{D}_{\Omega}\left(x\right)` that enables reducing the routing problem to 1D.
+.. _math_num_documentation.forward_structure.routing_module.kw:
-The kinematic wave model is a simplification of 1D Saint-Venant hydraulic model. First the mass equation writes:
+.. dropdown:: kw (Kinematic Wave)
+ :animate: fade-in-slide-down
-.. math::
- :name: math_num_documentation.forward_structure.forward_problem_mass_KW
+ This routing operator is based on a conceptual 1D kinematic wave model that is numerically solved with a linearized implicit numerical scheme :cite:p:`ChowAppliedhydrology`. This is applicable given the drainage plan :math:`\mathcal{D}_{\Omega}\left(x\right)` that enables reducing the routing problem to 1D.
- \partial_{t}A+\partial_{x}Q =q
-
-with :math:`\partial_{\square}` denoting the partial derivation either in time or space, :math:`A` the cross sectional flow area, :math:`Q` the flow discharge and :math:`q` the lateral inflows.
+ The kinematic wave model is a simplification of 1D Saint-Venant hydraulic model. First the mass equation writes:
-Assuming that the momentum equation reduces to
+ .. math::
+ :name: math_num_documentation.forward_structure.forward_problem_mass_KW
-.. math::
- :name: math_num_documentation.forward_structure.forward_problem_momentum_KW
-
- S_0=S_f
-
-with :math:`S_0` the bottom slope and :math:`S_f` the friction slope - i.e. a locally uniform flow with energy grade line parallel to the channel bottom. This momentum equation can be written as :cite:p:`ChowAppliedhydrology`:
+ \partial_{t}A+\partial_{x}Q =q
+
+ with :math:`\partial_{\square}` denoting the partial derivation either in time or space, :math:`A` the cross sectional flow area, :math:`Q` the flow discharge and :math:`q` the lateral inflows.
-.. math::
- :name: math_num_documentation.forward_structure.conceptual_A_of_Q
-
- A=a_{kw} Q ^{b_{kw}}
+ Assuming that the momentum equation reduces to
-with :math:`a_{kw}` and :math:`b_{kw}` two constants to be estimated - that can also be written using Manning friction law.
+ .. math::
+ :name: math_num_documentation.forward_structure.forward_problem_momentum_KW
+
+ S_0=S_f
+
+ with :math:`S_0` the bottom slope and :math:`S_f` the friction slope - i.e. a locally uniform flow with energy grade line parallel to the channel bottom. This momentum equation can be written as :cite:p:`ChowAppliedhydrology`:
+
+ .. math::
+ :name: math_num_documentation.forward_structure.conceptual_A_of_Q
+
+ A=a_{kw} Q ^{b_{kw}}
-Injecting the momentum parameterization of :ref:`Eq. 3 ` into mass equation :ref:`Eq. 1 `
-leads to the following one equation kinematic wave model :cite:p:`ChowAppliedhydrology`:
+ with :math:`a_{kw}` and :math:`b_{kw}` two constants to be estimated - that can also be written using Manning friction law.
-.. math::
- :name: math_num_documentation.forward_structure.oneEq_KW_conceptual
+ Injecting the momentum parameterization of :ref:`Eq. 3 ` into mass equation :ref:`Eq. 1 `
+ leads to the following one equation kinematic wave model :cite:p:`ChowAppliedhydrology`:
- \partial_{x}Q+a_{kw}b_{kw} Q^{b_{kw}-1}\partial_{t}Q=q
-
+ .. math::
+ :name: math_num_documentation.forward_structure.oneEq_KW_conceptual
+ \partial_{x}Q+a_{kw}b_{kw} Q^{b_{kw}-1}\partial_{t}Q=q
-.. hint::
+ .. hint::
- Helpful link about kinematic wave:
+ Helpful link about kinematic wave:
- - `Numerical Solution `__ (page 294, section 9.6)
+ - `Numerical Solution `__ (page 294, section 9.6)
-The solution of this equation can written as:
+ The solution of this equation can written as:
-.. math::
+ .. math::
- Q(x, t) = f\left(Q(x', t'), q_{t}(x, t'), \left[a_{kw}, b_{kw}\right](x)\right),\;\forall (x', t') \in \Omega_x\times[t-1, t]
+ Q(x, t) = f\left(Q(x', t'), q_{t}(x, t'), \left[a_{kw}, b_{kw}\right](x)\right),\;\forall (x', t') \in \Omega_x\times[t-1, t]
-with :math:`Q` the surface discharge, :math:`q_t` the elemental discharge, :math:`a_{kw}` the alpha kinematic wave parameter,
-:math:`b_{kw}` the beta kinematic wave parameter and :math:`\Omega_x` a 2D spatial domain that corresponds to all upstream cells
-flowing into cell :math:`x`. Note that :math:`\Omega_x` is a subset of :math:`\Omega`, :math:`\Omega_x\subset\Omega` and for the most upstream cells,
-:math:`\Omega_x=\emptyset`.
+ with :math:`Q` the surface discharge, :math:`q_t` the elemental discharge, :math:`a_{kw}` the alpha kinematic wave parameter,
+ :math:`b_{kw}` the beta kinematic wave parameter and :math:`\Omega_x` a 2D spatial domain that corresponds to all upstream cells
+ flowing into cell :math:`x`. Note that :math:`\Omega_x` is a subset of :math:`\Omega`, :math:`\Omega_x\subset\Omega` and for the most upstream cells,
+ :math:`\Omega_x=\emptyset`.
-.. note::
+ .. note::
- Linking with the forward problem equation :ref:`Eq. 1 `
-
- - Surface discharge, :math:`Q`
- - Internal fluxes, :math:`\{q_{t}\}\in\boldsymbol{q}`
- - Parameters, :math:`\{a_{kw}, b_{kw}\}\in\boldsymbol{\theta}`
+ Linking with the forward problem equation :ref:`Eq. 1 `
+
+ - Surface discharge, :math:`Q`
+ - Internal fluxes, :math:`\{q_{t}\}\in\boldsymbol{q}`
+ - Parameters, :math:`\{a_{kw}, b_{kw}\}\in\boldsymbol{\theta}`
-For the sake of clarity, the following variables are renamed for this section and the finite difference numerical scheme writting:
+ For the sake of clarity, the following variables are renamed for this section and the finite difference numerical scheme writting:
-.. list-table:: Renamed variables
- :widths: 25 25
- :header-rows: 1
+ .. list-table:: Renamed variables
+ :widths: 25 25
+ :header-rows: 1
- * - Before
- - After
- * - :math:`Q(x, t)`
- - :math:`Q_i^j`
- * - :math:`Q(x, t - 1)`
- - :math:`Q_{i}^{j-1}`
- * - :math:`q_t(x, t)`
- - :math:`q_{i}^{j}`
- * - :math:`q_t(x, t - 1)`
- - :math:`q_{i}^{j-1}`
+ * - Before
+ - After
+ * - :math:`Q(x, t)`
+ - :math:`Q_i^j`
+ * - :math:`Q(x, t - 1)`
+ - :math:`Q_{i}^{j-1}`
+ * - :math:`q_t(x, t)`
+ - :math:`q_{i}^{j}`
+ * - :math:`q_t(x, t - 1)`
+ - :math:`q_{i}^{j-1}`
-The function :math:`f` is resolved numerically as follows:
+ The function :math:`f` is resolved numerically as follows:
-Upstream discharge
-''''''''''''''''''
+ **Upstream discharge**
-Same as ``lag0`` upstream discharge, see :ref:`LAG0 Upstream Discharge `
+ Same as ``lag0`` upstream discharge, see :ref:`LAG0 Upstream Discharge `
-.. note::
+ .. note::
- :math:`q_{up}` is denoted here :math:`Q_{i-1}^{j}`
+ :math:`q_{up}` is denoted here :math:`Q_{i-1}^{j}`
-Surface discharge
-'''''''''''''''''
+ **Surface discharge**
-- Compute the intermediate variables :math:`d_1` and :math:`d_2`
+ - Compute the intermediate variables :math:`d_1` and :math:`d_2`
-.. math::
- :nowrap:
+ .. math::
+ :nowrap:
- \begin{eqnarray}
+ \begin{eqnarray}
- &d_1& &=& &\frac{\Delta t}{\Delta x}\\
- &d_2& &=& &a_{kw} b_{kw} \left(\frac{\left(Q_i^{j-1} + Q_{i-1}^j\right)}{2}\right)^{b_{kw} - 1}
+ &d_1& &=& &\frac{\Delta t}{\Delta x}\\
+ &d_2& &=& &a_{kw} b_{kw} \left(\frac{\left(Q_i^{j-1} + Q_{i-1}^j\right)}{2}\right)^{b_{kw} - 1}
- \end{eqnarray}
+ \end{eqnarray}
-- Compute the intermediate variables :math:`n_1`, :math:`n_2` and :math:`n_3`
+ - Compute the intermediate variables :math:`n_1`, :math:`n_2` and :math:`n_3`
-.. math::
- :nowrap:
+ .. math::
+ :nowrap:
- \begin{eqnarray}
+ \begin{eqnarray}
- &n_1& &=& &d_1 Q_{i-1}^j\\
- &n_2& &=& &d_2 Q_{i}^{j-1}\\
- &n_3& &=& &d_1 \frac{\left(q_i^{j-1} + q_{i}^{j}\right)}{2}
+ &n_1& &=& &d_1 Q_{i-1}^j\\
+ &n_2& &=& &d_2 Q_{i}^{j-1}\\
+ &n_3& &=& &d_1 \frac{\left(q_i^{j-1} + q_{i}^{j}\right)}{2}
- \end{eqnarray}
+ \end{eqnarray}
-- Compute the surface discharge :math:`Q_i^j`
+ - Compute the surface discharge :math:`Q_i^j`
-.. math::
+ .. math::
- Q_i^j = Q(x, t) = \frac{n_1 + n_2 + n_3}{d_1 + d_2}
+ Q_i^j = Q(x, t) = \frac{n_1 + n_2 + n_3}{d_1 + d_2}
diff --git a/doc/source/release/1.0.1-notes.rst b/doc/source/release/1.0.1-notes.rst
new file mode 100644
index 00000000..5d9d27f1
--- /dev/null
+++ b/doc/source/release/1.0.1-notes.rst
@@ -0,0 +1,49 @@
+.. _release.1.0.1-notes:
+
+.. currentmodule:: smash
+
+=========================
+smash 1.0.1 Release Notes
+=========================
+
+The smash 1.0.1 release continues the ongoing work to improve the handling, fix possible bugs, clarify the documentation.
+The highlights are:
+
+- ``NumPy 2.0 support``
+ `smash` now supports NumPy ``2.0`` and is backwards compatible to NumPy ``1.24``
+
+- ``Math / Num documentation``
+ Adjustments have been made in the forward & inverse problems section, as well as in the forward structure
+ section, where flowcharts of the forward model and hydrological modules have been added.
+
+- ``Fortran character limit``
+ The character limit for directory paths and gauge codes has been increased from 128 to 256 and 20 to 128,
+ respectively.
+
+------------
+Contributors
+------------
+
+This release was made possible thanks to the contributions of:
+
+- François Colleoni (``__)
+- Pierre-André Garambois (``__)
+- Ngo Nghi Truyen Huynh (``__)
+
+--------------------
+Pull requests merged
+--------------------
+
+- `#191 `__: MAINT: Handle f90wrap compatibility
+- `#194 `__: Fix directory path max length
+- `#196 `__: Fix fortran char array
+- `#197 `__: Doc roll discharge comment
+- `#203 `__: FIX: Fix generate baseline
+- `#204 `__: DOC: Remove conda usage
+- `#205 `__: Doc graphes
+- `#206 `__: FIX PR: Add check and test on char maximum limit
+- `#214 `__: DOC: upgrade math num section
+- `#220 `__: MAINT: numpy 2.0 support
+- `#222 `__: FIX: VIC3L under and over flow
+- `#225 `__: MAINT: update pyproject.toml for compatibility with numpy 2
+- `#226 `__: FIX: fix code check with some bugs detected by ruff 0.5
diff --git a/doc/source/release/index.rst b/doc/source/release/index.rst
index 40e8b692..dfb4df0e 100644
--- a/doc/source/release/index.rst
+++ b/doc/source/release/index.rst
@@ -7,6 +7,7 @@ Release notes
.. toctree::
:maxdepth: 3
+ 1.0.1 <1.0.1-notes>
1.0.0 <1.0.0-notes>
0.5.0 <0.5.0-notes>
0.4.2 <0.4.2-notes>
diff --git a/environment-dev.yml b/environment-dev.yml
index 7ef7cd0b..887d80b9 100644
--- a/environment-dev.yml
+++ b/environment-dev.yml
@@ -12,7 +12,7 @@ dependencies:
- meson-python
- ninja
- numpy
- - f90wrap<0.2.14 # temporary upper bound until v0.2.15 is released
+ - f90wrap
- versioneer[toml]
- rasterio
- pandas
diff --git a/pyproject.toml b/pyproject.toml
index 99b55d11..4e4b2e65 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,8 +1,11 @@
[build-system]
requires = [
"meson-python",
- "numpy",
- "f90wrap<0.2.14", # temporary upper bound until v0.2.15 is released
+ # numpy requirement for wheel builds for distribution on PyPI - building
+ # against 2.x yields wheels that are also compatible with numpy 1.x at
+ # runtime.
+ "numpy>=2.0.0",
+ "f90wrap>=0.2.15",
"versioneer[toml]"
]
build-backend = "mesonpy"
@@ -18,13 +21,13 @@ authors = [
license = {text = "GPL-3.0"}
requires-python = ">=3.9"
dependencies = [
- "numpy",
- "f90wrap",
- "rasterio",
- "pandas",
- "h5py",
+ "numpy>=1.24",
+ "f90wrap>=0.2.15",
+ "rasterio>=1.3.10",
+ "pandas>=2.2.2",
+ "h5py>=3.11",
"tqdm",
- "scipy",
+ "scipy>=1.13",
"pyyaml",
"terminaltables",
]
@@ -58,7 +61,7 @@ doc = [
"sphinxcontrib-bibtex",
"sphinx-design",
"sphinx-autosummary-accessors",
- "matplotlib"
+ "matplotlib>=3.8.4"
]
dev = [
"ruff",
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 3a9aaeec..fcf56f0b 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -3,7 +3,7 @@ meson
meson-python
ninja
numpy
-f90wrap<0.2.14 # temporary upper bound until v0.2.15 is released
+f90wrap
versioneer[toml]
rasterio
pandas
diff --git a/smash/core/simulation/_standardize.py b/smash/core/simulation/_standardize.py
index 2562c049..83c57bf1 100644
--- a/smash/core/simulation/_standardize.py
+++ b/smash/core/simulation/_standardize.py
@@ -206,7 +206,7 @@ def _standardize_simulation_optimize_options_bounds(
f"Choices: {parameters}"
)
else:
- TypeError("bounds optimize_options must be a dictionary")
+ raise TypeError("bounds optimize_options must be a dictionary")
parameters_bounds = dict(
**model.get_rr_parameters_bounds(),
@@ -269,7 +269,7 @@ def _standardize_simulation_optimize_options_control_tfm(
f"Choices: {F90_OPTIMIZER_CONTROL_TFM[optimizer]}"
)
else:
- TypeError("control_tfm optimize_options must be a str")
+ raise TypeError("control_tfm optimize_options must be a str")
return control_tfm
diff --git a/smash/factory/mesh/_tools.py b/smash/factory/mesh/_tools.py
index 4d40617d..5f3c1b09 100644
--- a/smash/factory/mesh/_tools.py
+++ b/smash/factory/mesh/_tools.py
@@ -45,9 +45,9 @@ def _trim_mask_2d(
inv_mask = mask[::-1]
- start_ind = np.argmax(mask)
-
- end_ind = len(inv_mask) - np.argmax(inv_mask)
+ # Force cast from np.int64 to np.int32
+ start_ind = np.argmax(mask).astype(np.int32)
+ end_ind = len(inv_mask) - np.argmax(inv_mask).astype(np.int32)
if ax == 0:
slice_col = slice(start_ind, end_ind)
diff --git a/smash/fcore/forward/forward_db.f90 b/smash/fcore/forward/forward_db.f90
index 0c134482..944ea46d 100644
--- a/smash/fcore/forward/forward_db.f90
+++ b/smash/fcore/forward/forward_db.f90
@@ -15621,6 +15621,7 @@ SUBROUTINE VIC3L_INFILTRATION_D(pn, pn_d, b, b_d, cusl, cusl_d, cmsl, &
REAL(sp) :: cumsl_d, wumsl_d, humsl_d, iflm_d, ifl0_d, ifl_d, &
& ifl_usl_d, ifl_msl_d
INTRINSIC MIN
+ INTRINSIC MAX
REAL(sp) :: pwx1
REAL(sp) :: pwx1_d
REAL(sp) :: pwy1
@@ -15698,6 +15699,30 @@ SUBROUTINE VIC3L_INFILTRATION_D(pn, pn_d, b, b_d, cusl, cusl_d, cmsl, &
husl = husl + ifl_usl/cusl
hmsl_d = hmsl_d + (ifl_msl_d-ifl_msl*cmsl_d/cmsl)/cmsl
hmsl = hmsl + ifl_msl/cmsl
+ IF (0.999999_sp .GT. husl) THEN
+ husl = husl
+ ELSE
+ husl = 0.999999_sp
+ husl_d = 0.0_4
+ END IF
+ IF (1e-6_sp .LT. husl) THEN
+ husl = husl
+ ELSE
+ husl = 1e-6_sp
+ husl_d = 0.0_4
+ END IF
+ IF (0.999999_sp .GT. hmsl) THEN
+ hmsl = hmsl
+ ELSE
+ hmsl = 0.999999_sp
+ hmsl_d = 0.0_4
+ END IF
+ IF (1e-6_sp .LT. hmsl) THEN
+ hmsl = hmsl
+ ELSE
+ hmsl = 1e-6_sp
+ hmsl_d = 0.0_4
+ END IF
qr_d = pn_d - ifl_usl_d - ifl_msl_d
qr = pn - (ifl_usl+ifl_msl)
END SUBROUTINE VIC3L_INFILTRATION_D
@@ -15718,6 +15743,7 @@ SUBROUTINE VIC3L_INFILTRATION_B(pn, pn_b, b, b_b, cusl, cusl_b, cmsl, &
REAL(sp) :: cumsl_b, wumsl_b, humsl_b, iflm_b, ifl0_b, ifl_b, &
& ifl_usl_b, ifl_msl_b
INTRINSIC MIN
+ INTRINSIC MAX
REAL(sp) :: pwx1
REAL(sp) :: pwx1_b
REAL(sp) :: pwy1
@@ -15766,10 +15792,50 @@ SUBROUTINE VIC3L_INFILTRATION_B(pn, pn_b, b, b_b, cusl, cusl_b, cmsl, &
ifl_msl = (1._sp-hmsl)*cmsl
CALL PUSHCONTROL1B(1)
END IF
+ CALL PUSHREAL4(husl)
+ husl = husl + ifl_usl/cusl
+ CALL PUSHREAL4(hmsl)
+ hmsl = hmsl + ifl_msl/cmsl
+ IF (0.999999_sp .GT. husl) THEN
+ CALL PUSHCONTROL1B(0)
+ husl = husl
+ ELSE
+ husl = 0.999999_sp
+ CALL PUSHCONTROL1B(1)
+ END IF
+ IF (1e-6_sp .LT. husl) THEN
+ CALL PUSHCONTROL1B(0)
+ ELSE
+ CALL PUSHCONTROL1B(1)
+ END IF
+ IF (0.999999_sp .GT. hmsl) THEN
+ CALL PUSHCONTROL1B(0)
+ hmsl = hmsl
+ ELSE
+ hmsl = 0.999999_sp
+ CALL PUSHCONTROL1B(1)
+ END IF
+ IF (1e-6_sp .LT. hmsl) THEN
+ CALL PUSHCONTROL1B(0)
+ ELSE
+ CALL PUSHCONTROL1B(1)
+ END IF
pn_b = qr_b
- ifl_usl_b = husl_b/cusl - qr_b
- ifl_msl_b = hmsl_b/cmsl - qr_b
+ ifl_usl_b = -qr_b
+ ifl_msl_b = -qr_b
+ CALL POPCONTROL1B(branch)
+ IF (branch .NE. 0) hmsl_b = 0.0_4
+ CALL POPCONTROL1B(branch)
+ IF (branch .NE. 0) hmsl_b = 0.0_4
+ CALL POPCONTROL1B(branch)
+ IF (branch .NE. 0) husl_b = 0.0_4
+ CALL POPCONTROL1B(branch)
+ IF (branch .NE. 0) husl_b = 0.0_4
+ CALL POPREAL4(hmsl)
+ ifl_msl_b = ifl_msl_b + hmsl_b/cmsl
cmsl_b = cmsl_b - ifl_msl*hmsl_b/cmsl**2
+ CALL POPREAL4(husl)
+ ifl_usl_b = ifl_usl_b + husl_b/cusl
cusl_b = cusl_b - ifl_usl*husl_b/cusl**2
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
@@ -15856,6 +15922,7 @@ SUBROUTINE VIC3L_INFILTRATION(pn, b, cusl, cmsl, husl, hmsl, qr)
REAL(sp), INTENT(OUT) :: qr
REAL(sp) :: cumsl, wumsl, humsl, iflm, ifl0, ifl, ifl_usl, ifl_msl
INTRINSIC MIN
+ INTRINSIC MAX
REAL(sp) :: pwx1
REAL(sp) :: pwy1
REAL(sp) :: pwr1
@@ -15892,6 +15959,26 @@ SUBROUTINE VIC3L_INFILTRATION(pn, b, cusl, cmsl, husl, hmsl, qr)
END IF
husl = husl + ifl_usl/cusl
hmsl = hmsl + ifl_msl/cmsl
+ IF (0.999999_sp .GT. husl) THEN
+ husl = husl
+ ELSE
+ husl = 0.999999_sp
+ END IF
+ IF (1e-6_sp .LT. husl) THEN
+ husl = husl
+ ELSE
+ husl = 1e-6_sp
+ END IF
+ IF (0.999999_sp .GT. hmsl) THEN
+ hmsl = hmsl
+ ELSE
+ hmsl = 0.999999_sp
+ END IF
+ IF (1e-6_sp .LT. hmsl) THEN
+ hmsl = hmsl
+ ELSE
+ hmsl = 1e-6_sp
+ END IF
qr = pn - (ifl_usl+ifl_msl)
END SUBROUTINE VIC3L_INFILTRATION
diff --git a/smash/fcore/forward/forward_openmp_db.f90 b/smash/fcore/forward/forward_openmp_db.f90
index 67b5f90a..e66f7fb0 100644
--- a/smash/fcore/forward/forward_openmp_db.f90
+++ b/smash/fcore/forward/forward_openmp_db.f90
@@ -15959,6 +15959,7 @@ SUBROUTINE VIC3L_INFILTRATION_D(pn, pn_d, b, b_d, cusl, cusl_d, cmsl, &
REAL(sp) :: cumsl_d, wumsl_d, humsl_d, iflm_d, ifl0_d, ifl_d, &
& ifl_usl_d, ifl_msl_d
INTRINSIC MIN
+ INTRINSIC MAX
REAL(sp) :: pwx1
REAL(sp) :: pwx1_d
REAL(sp) :: pwy1
@@ -16036,6 +16037,30 @@ SUBROUTINE VIC3L_INFILTRATION_D(pn, pn_d, b, b_d, cusl, cusl_d, cmsl, &
husl = husl + ifl_usl/cusl
hmsl_d = hmsl_d + (ifl_msl_d-ifl_msl*cmsl_d/cmsl)/cmsl
hmsl = hmsl + ifl_msl/cmsl
+ IF (0.999999_sp .GT. husl) THEN
+ husl = husl
+ ELSE
+ husl = 0.999999_sp
+ husl_d = 0.0_4
+ END IF
+ IF (1e-6_sp .LT. husl) THEN
+ husl = husl
+ ELSE
+ husl = 1e-6_sp
+ husl_d = 0.0_4
+ END IF
+ IF (0.999999_sp .GT. hmsl) THEN
+ hmsl = hmsl
+ ELSE
+ hmsl = 0.999999_sp
+ hmsl_d = 0.0_4
+ END IF
+ IF (1e-6_sp .LT. hmsl) THEN
+ hmsl = hmsl
+ ELSE
+ hmsl = 1e-6_sp
+ hmsl_d = 0.0_4
+ END IF
qr_d = pn_d - ifl_usl_d - ifl_msl_d
qr = pn - (ifl_usl+ifl_msl)
END SUBROUTINE VIC3L_INFILTRATION_D
@@ -16056,6 +16081,7 @@ SUBROUTINE VIC3L_INFILTRATION_B(pn, pn_b, b, b_b, cusl, cusl_b, cmsl, &
REAL(sp) :: cumsl_b, wumsl_b, humsl_b, iflm_b, ifl0_b, ifl_b, &
& ifl_usl_b, ifl_msl_b
INTRINSIC MIN
+ INTRINSIC MAX
REAL(sp) :: pwx1
REAL(sp) :: pwx1_b
REAL(sp) :: pwy1
@@ -16104,11 +16130,51 @@ SUBROUTINE VIC3L_INFILTRATION_B(pn, pn_b, b, b_b, cusl, cusl_b, cmsl, &
ifl_msl = (1._sp-hmsl)*cmsl
CALL PUSHCONTROL1B(1)
END IF
+ CALL PUSHREAL4(husl)
+ husl = husl + ifl_usl/cusl
+ CALL PUSHREAL4(hmsl)
+ hmsl = hmsl + ifl_msl/cmsl
+ IF (0.999999_sp .GT. husl) THEN
+ CALL PUSHCONTROL1B(0)
+ husl = husl
+ ELSE
+ husl = 0.999999_sp
+ CALL PUSHCONTROL1B(1)
+ END IF
+ IF (1e-6_sp .LT. husl) THEN
+ CALL PUSHCONTROL1B(0)
+ ELSE
+ CALL PUSHCONTROL1B(1)
+ END IF
+ IF (0.999999_sp .GT. hmsl) THEN
+ CALL PUSHCONTROL1B(0)
+ hmsl = hmsl
+ ELSE
+ hmsl = 0.999999_sp
+ CALL PUSHCONTROL1B(1)
+ END IF
+ IF (1e-6_sp .LT. hmsl) THEN
+ CALL PUSHCONTROL1B(0)
+ ELSE
+ CALL PUSHCONTROL1B(1)
+ END IF
pn_b = qr_b
- ifl_usl_b = husl_b/cusl - qr_b
- ifl_msl_b = hmsl_b/cmsl - qr_b
+ ifl_usl_b = -qr_b
+ ifl_msl_b = -qr_b
+ CALL POPCONTROL1B(branch)
+ IF (branch .NE. 0) hmsl_b = 0.0_4
+ CALL POPCONTROL1B(branch)
+ IF (branch .NE. 0) hmsl_b = 0.0_4
+ CALL POPCONTROL1B(branch)
+ IF (branch .NE. 0) husl_b = 0.0_4
+ CALL POPCONTROL1B(branch)
+ IF (branch .NE. 0) husl_b = 0.0_4
+ CALL POPREAL4(hmsl)
+ ifl_msl_b = ifl_msl_b + hmsl_b/cmsl
!$OMP ATOMIC update
cmsl_b = cmsl_b - ifl_msl*hmsl_b/cmsl**2
+ CALL POPREAL4(husl)
+ ifl_usl_b = ifl_usl_b + husl_b/cusl
!$OMP ATOMIC update
cusl_b = cusl_b - ifl_usl*husl_b/cusl**2
CALL POPCONTROL1B(branch)
@@ -16206,6 +16272,7 @@ SUBROUTINE VIC3L_INFILTRATION(pn, b, cusl, cmsl, husl, hmsl, qr)
REAL(sp), INTENT(OUT) :: qr
REAL(sp) :: cumsl, wumsl, humsl, iflm, ifl0, ifl, ifl_usl, ifl_msl
INTRINSIC MIN
+ INTRINSIC MAX
REAL(sp) :: pwx1
REAL(sp) :: pwy1
REAL(sp) :: pwr1
@@ -16242,6 +16309,26 @@ SUBROUTINE VIC3L_INFILTRATION(pn, b, cusl, cmsl, husl, hmsl, qr)
END IF
husl = husl + ifl_usl/cusl
hmsl = hmsl + ifl_msl/cmsl
+ IF (0.999999_sp .GT. husl) THEN
+ husl = husl
+ ELSE
+ husl = 0.999999_sp
+ END IF
+ IF (1e-6_sp .LT. husl) THEN
+ husl = husl
+ ELSE
+ husl = 1e-6_sp
+ END IF
+ IF (0.999999_sp .GT. hmsl) THEN
+ hmsl = hmsl
+ ELSE
+ hmsl = 0.999999_sp
+ END IF
+ IF (1e-6_sp .LT. hmsl) THEN
+ hmsl = hmsl
+ ELSE
+ hmsl = 1e-6_sp
+ END IF
qr = pn - (ifl_usl+ifl_msl)
END SUBROUTINE VIC3L_INFILTRATION
diff --git a/smash/fcore/operator/md_vic3l_operator.f90 b/smash/fcore/operator/md_vic3l_operator.f90
index 51bea43e..89ea7ca6 100644
--- a/smash/fcore/operator/md_vic3l_operator.f90
+++ b/smash/fcore/operator/md_vic3l_operator.f90
@@ -29,6 +29,7 @@ subroutine vic3l_canopy_interception(prcp, pet, ccl, hcl, pn, en)
hcl = hcl + (prcp - ec - pn)/ccl
+ ! % Avoid under and overflow
hcl = min(0.999999_sp, hcl)
hcl = max(1e-6_sp, hcl)
@@ -105,6 +106,12 @@ subroutine vic3l_infiltration(pn, b, cusl, cmsl, husl, hmsl, qr)
husl = husl + ifl_usl/cusl
hmsl = hmsl + ifl_msl/cmsl
+ ! % Avoid under and overflow
+ husl = min(0.999999_sp, husl)
+ husl = max(1e-6_sp, husl)
+ hmsl = min(0.999999_sp, hmsl)
+ hmsl = max(1e-6_sp, hmsl)
+
qr = pn - (ifl_usl + ifl_msl)
end subroutine vic3l_infiltration
diff --git a/smash/io/handler/_hdf5_handler.py b/smash/io/handler/_hdf5_handler.py
index ac15a723..c7614166 100644
--- a/smash/io/handler/_hdf5_handler.py
+++ b/smash/io/handler/_hdf5_handler.py
@@ -148,8 +148,7 @@ def _load_hdf5_to_dict(h5: h5py.File | h5py.Group) -> dict[str, Any]:
elif isinstance(value, h5py.Dataset):
dct[key] = _load_hdf5_dataset_to_npndarray(value)
- for key, value in h5.attrs.items():
- dct[key] = value
+ dct.update(dict(h5.attrs.items()))
return dct
diff --git a/smash/tests/baseline.hdf5 b/smash/tests/baseline.hdf5
index 6748cc58..3de659a3 100644
Binary files a/smash/tests/baseline.hdf5 and b/smash/tests/baseline.hdf5 differ
diff --git a/smash/tests/core/simulation/test_bayesian_optimize.py b/smash/tests/core/simulation/test_bayesian_optimize.py
index 9580b0df..92089ad9 100644
--- a/smash/tests/core/simulation/test_bayesian_optimize.py
+++ b/smash/tests/core/simulation/test_bayesian_optimize.py
@@ -72,8 +72,8 @@ def generic_custom_bayesian_optimize(model: smash.Model, **kwargs) -> dict:
},
]
- for i, kwargs in enumerate(custom_sets):
- instance = smash.bayesian_optimize(model, **kwargs)
+ for i, inner_kwargs in enumerate(custom_sets):
+ instance = smash.bayesian_optimize(model, **inner_kwargs)
qsim = instance.response.q[:].flatten()
qsim = qsim[::10] # extract values at every 10th position
diff --git a/smash/tests/core/simulation/test_optimize.py b/smash/tests/core/simulation/test_optimize.py
index df876711..343ba910 100644
--- a/smash/tests/core/simulation/test_optimize.py
+++ b/smash/tests/core/simulation/test_optimize.py
@@ -220,8 +220,8 @@ def generic_custom_optimize(model: smash.Model, **kwargs) -> dict:
},
]
- for i, kwargs in enumerate(custom_sets):
- instance = smash.optimize(model, **kwargs)
+ for i, inner_kwargs in enumerate(custom_sets):
+ instance = smash.optimize(model, **inner_kwargs)
qsim = instance.response.q[:].flatten()
qsim = qsim[::10] # extract values at every 10th position
diff --git a/smash/tests/diff_baseline.csv b/smash/tests/diff_baseline.csv
index 963654e7..9025c3c4 100644
--- a/smash/tests/diff_baseline.csv
+++ b/smash/tests/diff_baseline.csv
@@ -1,8 +1,14 @@
-commit 307eb806a3ba38a0b22e3318a42de96a94793400
-Author: Francois Colleoni
-Date: Thu Mar 28 16:26:18 2024 +0100
+commit 7cae4e616421f7f31e3ea4d8fa8885057f945573
+Author: Francois Colleoni <110899888+inoelloc@users.noreply.github.com>
+Date: Thu Jun 27 15:25:22 2024 +0200
- FIX PR: Change test multiset estimate setup
+ MAINT: numpy 2.0 support (#220)
+
+ * MAINT: numpy 2.0 support
+
+ * MAINT: numpy 2.0 support - add f90wrap lower bound
+
+ * MAINT: numpy 2.0 support - elsize in mesh + multiset estimate test
TEST NAME |STATUS
bbox_mesh.active_cell |NON MODIFIED
@@ -23,63 +29,63 @@ bbox_mesh.xmin |NON MODIFIED
bbox_mesh.xres |NON MODIFIED
bbox_mesh.ymax |NON MODIFIED
bbox_mesh.yres |NON MODIFIED
-custom_bayesian_optimize.zero-gr4-lr.custom_set_1.sim_q |MODIFIED
-custom_bayesian_optimize.zero-gr4-lr.custom_set_2.sim_q |MODIFIED
-custom_bayesian_optimize.zero-gr4-lr.custom_set_3.sim_q |MODIFIED
-custom_bayesian_optimize.zero-gr4-lr.custom_set_4.sim_q |MODIFIED
-custom_optimize.zero-gr4-lr.custom_set_1.sim_q |MODIFIED
-custom_optimize.zero-gr4-lr.custom_set_2.sim_q |MODIFIED
-custom_optimize.zero-gr4-lr.custom_set_3.sim_q |MODIFIED
-custom_optimize.zero-gr4-lr.custom_set_4.sim_q |MODIFIED
-custom_optimize.zero-gr4-lr.custom_set_5.sim_q |MODIFIED
-custom_optimize.zero-gr4-lr.custom_set_6.sim_q |MODIFIED
-custom_optimize.zero-gr4-lr.custom_set_7.sim_q |MODIFIED
-custom_optimize.zero-gr4-lr.custom_set_8.sim_q |MODIFIED
-custom_optimize.zero-gr4-lr.custom_set_9.sim_q |MODIFIED
-forward_run.zero-gr4-kw.cost |MODIFIED
-forward_run.zero-gr4-kw.jobs |MODIFIED
-forward_run.zero-gr4-kw.q_domain |MODIFIED
+custom_bayesian_optimize.zero-gr4-lr.custom_set_1.sim_q |NON MODIFIED
+custom_bayesian_optimize.zero-gr4-lr.custom_set_2.sim_q |NON MODIFIED
+custom_bayesian_optimize.zero-gr4-lr.custom_set_3.sim_q |NON MODIFIED
+custom_bayesian_optimize.zero-gr4-lr.custom_set_4.sim_q |NON MODIFIED
+custom_optimize.zero-gr4-lr.custom_set_1.sim_q |NON MODIFIED
+custom_optimize.zero-gr4-lr.custom_set_2.sim_q |NON MODIFIED
+custom_optimize.zero-gr4-lr.custom_set_3.sim_q |NON MODIFIED
+custom_optimize.zero-gr4-lr.custom_set_4.sim_q |NON MODIFIED
+custom_optimize.zero-gr4-lr.custom_set_5.sim_q |NON MODIFIED
+custom_optimize.zero-gr4-lr.custom_set_6.sim_q |NON MODIFIED
+custom_optimize.zero-gr4-lr.custom_set_7.sim_q |NON MODIFIED
+custom_optimize.zero-gr4-lr.custom_set_8.sim_q |NON MODIFIED
+custom_optimize.zero-gr4-lr.custom_set_9.sim_q |NON MODIFIED
+forward_run.zero-gr4-kw.cost |NON MODIFIED
+forward_run.zero-gr4-kw.jobs |NON MODIFIED
+forward_run.zero-gr4-kw.q_domain |NON MODIFIED
forward_run.zero-gr4-kw.rr_states.hi |NON MODIFIED
-forward_run.zero-gr4-kw.rr_states.hp |MODIFIED
-forward_run.zero-gr4-kw.rr_states.ht |MODIFIED
-forward_run.zero-gr4-kw.sim_q |MODIFIED
-forward_run.zero-gr4-lag0.cost |MODIFIED
-forward_run.zero-gr4-lag0.jobs |MODIFIED
-forward_run.zero-gr4-lag0.q_domain |MODIFIED
+forward_run.zero-gr4-kw.rr_states.hp |NON MODIFIED
+forward_run.zero-gr4-kw.rr_states.ht |NON MODIFIED
+forward_run.zero-gr4-kw.sim_q |NON MODIFIED
+forward_run.zero-gr4-lag0.cost |NON MODIFIED
+forward_run.zero-gr4-lag0.jobs |NON MODIFIED
+forward_run.zero-gr4-lag0.q_domain |NON MODIFIED
forward_run.zero-gr4-lag0.rr_states.hi |NON MODIFIED
-forward_run.zero-gr4-lag0.rr_states.hp |MODIFIED
-forward_run.zero-gr4-lag0.rr_states.ht |MODIFIED
-forward_run.zero-gr4-lag0.sim_q |MODIFIED
-forward_run.zero-gr4-lr.cost |MODIFIED
-forward_run.zero-gr4-lr.jobs |MODIFIED
-forward_run.zero-gr4-lr.q_domain |MODIFIED
+forward_run.zero-gr4-lag0.rr_states.hp |NON MODIFIED
+forward_run.zero-gr4-lag0.rr_states.ht |NON MODIFIED
+forward_run.zero-gr4-lag0.sim_q |NON MODIFIED
+forward_run.zero-gr4-lr.cost |NON MODIFIED
+forward_run.zero-gr4-lr.jobs |NON MODIFIED
+forward_run.zero-gr4-lr.q_domain |NON MODIFIED
forward_run.zero-gr4-lr.rr_states.hi |NON MODIFIED
forward_run.zero-gr4-lr.rr_states.hlr |NON MODIFIED
-forward_run.zero-gr4-lr.rr_states.hp |MODIFIED
-forward_run.zero-gr4-lr.rr_states.ht |MODIFIED
-forward_run.zero-gr4-lr.sim_q |MODIFIED
-forward_run.zero-gr5-kw.cost |MODIFIED
-forward_run.zero-gr5-kw.jobs |MODIFIED
-forward_run.zero-gr5-kw.q_domain |MODIFIED
+forward_run.zero-gr4-lr.rr_states.hp |NON MODIFIED
+forward_run.zero-gr4-lr.rr_states.ht |NON MODIFIED
+forward_run.zero-gr4-lr.sim_q |NON MODIFIED
+forward_run.zero-gr5-kw.cost |NON MODIFIED
+forward_run.zero-gr5-kw.jobs |NON MODIFIED
+forward_run.zero-gr5-kw.q_domain |NON MODIFIED
forward_run.zero-gr5-kw.rr_states.hi |NON MODIFIED
-forward_run.zero-gr5-kw.rr_states.hp |MODIFIED
-forward_run.zero-gr5-kw.rr_states.ht |MODIFIED
-forward_run.zero-gr5-kw.sim_q |MODIFIED
-forward_run.zero-gr5-lag0.cost |MODIFIED
-forward_run.zero-gr5-lag0.jobs |MODIFIED
-forward_run.zero-gr5-lag0.q_domain |MODIFIED
+forward_run.zero-gr5-kw.rr_states.hp |NON MODIFIED
+forward_run.zero-gr5-kw.rr_states.ht |NON MODIFIED
+forward_run.zero-gr5-kw.sim_q |NON MODIFIED
+forward_run.zero-gr5-lag0.cost |NON MODIFIED
+forward_run.zero-gr5-lag0.jobs |NON MODIFIED
+forward_run.zero-gr5-lag0.q_domain |NON MODIFIED
forward_run.zero-gr5-lag0.rr_states.hi |NON MODIFIED
-forward_run.zero-gr5-lag0.rr_states.hp |MODIFIED
-forward_run.zero-gr5-lag0.rr_states.ht |MODIFIED
-forward_run.zero-gr5-lag0.sim_q |MODIFIED
-forward_run.zero-gr5-lr.cost |MODIFIED
-forward_run.zero-gr5-lr.jobs |MODIFIED
-forward_run.zero-gr5-lr.q_domain |MODIFIED
+forward_run.zero-gr5-lag0.rr_states.hp |NON MODIFIED
+forward_run.zero-gr5-lag0.rr_states.ht |NON MODIFIED
+forward_run.zero-gr5-lag0.sim_q |NON MODIFIED
+forward_run.zero-gr5-lr.cost |NON MODIFIED
+forward_run.zero-gr5-lr.jobs |NON MODIFIED
+forward_run.zero-gr5-lr.q_domain |NON MODIFIED
forward_run.zero-gr5-lr.rr_states.hi |NON MODIFIED
forward_run.zero-gr5-lr.rr_states.hlr |NON MODIFIED
-forward_run.zero-gr5-lr.rr_states.hp |MODIFIED
-forward_run.zero-gr5-lr.rr_states.ht |MODIFIED
-forward_run.zero-gr5-lr.sim_q |MODIFIED
+forward_run.zero-gr5-lr.rr_states.hp |NON MODIFIED
+forward_run.zero-gr5-lr.rr_states.ht |NON MODIFIED
+forward_run.zero-gr5-lr.sim_q |NON MODIFIED
forward_run.zero-grd-kw.cost |NON MODIFIED
forward_run.zero-grd-kw.jobs |NON MODIFIED
forward_run.zero-grd-kw.q_domain |NON MODIFIED
@@ -99,25 +105,25 @@ forward_run.zero-grd-lr.rr_states.hlr |NON MODIFIED
forward_run.zero-grd-lr.rr_states.hp |NON MODIFIED
forward_run.zero-grd-lr.rr_states.ht |NON MODIFIED
forward_run.zero-grd-lr.sim_q |NON MODIFIED
-forward_run.zero-loieau-kw.cost |MODIFIED
-forward_run.zero-loieau-kw.jobs |MODIFIED
-forward_run.zero-loieau-kw.q_domain |MODIFIED
-forward_run.zero-loieau-kw.rr_states.ha |MODIFIED
-forward_run.zero-loieau-kw.rr_states.hc |MODIFIED
-forward_run.zero-loieau-kw.sim_q |MODIFIED
-forward_run.zero-loieau-lag0.cost |MODIFIED
-forward_run.zero-loieau-lag0.jobs |MODIFIED
-forward_run.zero-loieau-lag0.q_domain |MODIFIED
-forward_run.zero-loieau-lag0.rr_states.ha |MODIFIED
-forward_run.zero-loieau-lag0.rr_states.hc |MODIFIED
-forward_run.zero-loieau-lag0.sim_q |MODIFIED
-forward_run.zero-loieau-lr.cost |MODIFIED
-forward_run.zero-loieau-lr.jobs |MODIFIED
-forward_run.zero-loieau-lr.q_domain |MODIFIED
-forward_run.zero-loieau-lr.rr_states.ha |MODIFIED
-forward_run.zero-loieau-lr.rr_states.hc |MODIFIED
+forward_run.zero-loieau-kw.cost |NON MODIFIED
+forward_run.zero-loieau-kw.jobs |NON MODIFIED
+forward_run.zero-loieau-kw.q_domain |NON MODIFIED
+forward_run.zero-loieau-kw.rr_states.ha |NON MODIFIED
+forward_run.zero-loieau-kw.rr_states.hc |NON MODIFIED
+forward_run.zero-loieau-kw.sim_q |NON MODIFIED
+forward_run.zero-loieau-lag0.cost |NON MODIFIED
+forward_run.zero-loieau-lag0.jobs |NON MODIFIED
+forward_run.zero-loieau-lag0.q_domain |NON MODIFIED
+forward_run.zero-loieau-lag0.rr_states.ha |NON MODIFIED
+forward_run.zero-loieau-lag0.rr_states.hc |NON MODIFIED
+forward_run.zero-loieau-lag0.sim_q |NON MODIFIED
+forward_run.zero-loieau-lr.cost |NON MODIFIED
+forward_run.zero-loieau-lr.jobs |NON MODIFIED
+forward_run.zero-loieau-lr.q_domain |NON MODIFIED
+forward_run.zero-loieau-lr.rr_states.ha |NON MODIFIED
+forward_run.zero-loieau-lr.rr_states.hc |NON MODIFIED
forward_run.zero-loieau-lr.rr_states.hlr |NON MODIFIED
-forward_run.zero-loieau-lr.sim_q |MODIFIED
+forward_run.zero-loieau-lr.sim_q |NON MODIFIED
forward_run.zero-vic3l-kw.cost |NON MODIFIED
forward_run.zero-vic3l-kw.jobs |NON MODIFIED
forward_run.zero-vic3l-kw.q_domain |NON MODIFIED
@@ -224,16 +230,16 @@ model_io.setup.end_time |NON MODIFIED
model_io.setup.start_time |NON MODIFIED
model_io.setup.structure |NON MODIFIED
multiset_estimate.mfwr.lcurve_multiset.alpha |NON MODIFIED
-multiset_estimate.mfwr.lcurve_multiset.alpha_opt |MODIFIED
-multiset_estimate.mfwr.lcurve_multiset.cost |MODIFIED
-multiset_estimate.mfwr.lcurve_multiset.mahal_dist |MODIFIED
-multiset_estimate.mfwr.sim_q |MODIFIED
-multiset_estimate.mopt_ml.sim_q |MODIFIED
+multiset_estimate.mfwr.lcurve_multiset.alpha_opt |NON MODIFIED
+multiset_estimate.mfwr.lcurve_multiset.cost |NON MODIFIED
+multiset_estimate.mfwr.lcurve_multiset.mahal_dist |NON MODIFIED
+multiset_estimate.mfwr.sim_q |NON MODIFIED
+multiset_estimate.mopt_ml.sim_q |NON MODIFIED
multiset_estimate.mopt_unf.lcurve_multiset.alpha |NON MODIFIED
-multiset_estimate.mopt_unf.lcurve_multiset.alpha_opt |MODIFIED
-multiset_estimate.mopt_unf.lcurve_multiset.cost |MODIFIED
-multiset_estimate.mopt_unf.lcurve_multiset.mahal_dist |MODIFIED
-multiset_estimate.mopt_unf.sim_q |MODIFIED
+multiset_estimate.mopt_unf.lcurve_multiset.alpha_opt |NON MODIFIED
+multiset_estimate.mopt_unf.lcurve_multiset.cost |NON MODIFIED
+multiset_estimate.mopt_unf.lcurve_multiset.mahal_dist |NON MODIFIED
+multiset_estimate.mopt_unf.sim_q |NON MODIFIED
net_init.bias_layer_1 |NON MODIFIED
net_init.bias_layer_2 |NON MODIFIED
net_init.bias_layer_3 |NON MODIFIED
@@ -243,84 +249,84 @@ net_init.weight_layer_1 |NON MODIFIED
net_init.weight_layer_2 |NON MODIFIED
net_init.weight_layer_3 |NON MODIFIED
net_init.weight_layer_4 |NON MODIFIED
-optimize.zero-gr4-kw.ann.sim_q |MODIFIED
-optimize.zero-gr4-kw.distributed.control_vector |MODIFIED
-optimize.zero-gr4-kw.distributed.iter_cost |MODIFIED
-optimize.zero-gr4-kw.distributed.sim_q |MODIFIED
-optimize.zero-gr4-kw.multi-linear.control_vector |MODIFIED
-optimize.zero-gr4-kw.multi-linear.iter_cost |MODIFIED
-optimize.zero-gr4-kw.multi-linear.sim_q |MODIFIED
-optimize.zero-gr4-kw.multi-polynomial.control_vector |MODIFIED
-optimize.zero-gr4-kw.multi-polynomial.iter_cost |MODIFIED
-optimize.zero-gr4-kw.multi-polynomial.sim_q |MODIFIED
-optimize.zero-gr4-kw.uniform.control_vector |MODIFIED
-optimize.zero-gr4-kw.uniform.iter_cost |MODIFIED
-optimize.zero-gr4-kw.uniform.sim_q |MODIFIED
-optimize.zero-gr4-lag0.ann.sim_q |MODIFIED
-optimize.zero-gr4-lag0.distributed.control_vector |MODIFIED
-optimize.zero-gr4-lag0.distributed.iter_cost |MODIFIED
-optimize.zero-gr4-lag0.distributed.sim_q |MODIFIED
-optimize.zero-gr4-lag0.multi-linear.control_vector |MODIFIED
-optimize.zero-gr4-lag0.multi-linear.iter_cost |MODIFIED
-optimize.zero-gr4-lag0.multi-linear.sim_q |MODIFIED
-optimize.zero-gr4-lag0.multi-polynomial.control_vector |MODIFIED
-optimize.zero-gr4-lag0.multi-polynomial.iter_cost |MODIFIED
-optimize.zero-gr4-lag0.multi-polynomial.sim_q |MODIFIED
-optimize.zero-gr4-lag0.uniform.control_vector |MODIFIED
-optimize.zero-gr4-lag0.uniform.iter_cost |MODIFIED
-optimize.zero-gr4-lag0.uniform.sim_q |MODIFIED
-optimize.zero-gr4-lr.ann.sim_q |MODIFIED
-optimize.zero-gr4-lr.distributed.control_vector |MODIFIED
-optimize.zero-gr4-lr.distributed.iter_cost |MODIFIED
-optimize.zero-gr4-lr.distributed.sim_q |MODIFIED
-optimize.zero-gr4-lr.multi-linear.control_vector |MODIFIED
-optimize.zero-gr4-lr.multi-linear.iter_cost |MODIFIED
-optimize.zero-gr4-lr.multi-linear.sim_q |MODIFIED
-optimize.zero-gr4-lr.multi-polynomial.control_vector |MODIFIED
-optimize.zero-gr4-lr.multi-polynomial.iter_cost |MODIFIED
-optimize.zero-gr4-lr.multi-polynomial.sim_q |MODIFIED
-optimize.zero-gr4-lr.uniform.control_vector |MODIFIED
-optimize.zero-gr4-lr.uniform.iter_cost |MODIFIED
-optimize.zero-gr4-lr.uniform.sim_q |MODIFIED
-optimize.zero-gr5-kw.ann.sim_q |MODIFIED
-optimize.zero-gr5-kw.distributed.control_vector |MODIFIED
-optimize.zero-gr5-kw.distributed.iter_cost |MODIFIED
-optimize.zero-gr5-kw.distributed.sim_q |MODIFIED
-optimize.zero-gr5-kw.multi-linear.control_vector |MODIFIED
-optimize.zero-gr5-kw.multi-linear.iter_cost |MODIFIED
-optimize.zero-gr5-kw.multi-linear.sim_q |MODIFIED
-optimize.zero-gr5-kw.multi-polynomial.control_vector |MODIFIED
-optimize.zero-gr5-kw.multi-polynomial.iter_cost |MODIFIED
-optimize.zero-gr5-kw.multi-polynomial.sim_q |MODIFIED
-optimize.zero-gr5-kw.uniform.control_vector |MODIFIED
-optimize.zero-gr5-kw.uniform.iter_cost |MODIFIED
-optimize.zero-gr5-kw.uniform.sim_q |MODIFIED
-optimize.zero-gr5-lag0.ann.sim_q |MODIFIED
-optimize.zero-gr5-lag0.distributed.control_vector |MODIFIED
-optimize.zero-gr5-lag0.distributed.iter_cost |MODIFIED
-optimize.zero-gr5-lag0.distributed.sim_q |MODIFIED
-optimize.zero-gr5-lag0.multi-linear.control_vector |MODIFIED
-optimize.zero-gr5-lag0.multi-linear.iter_cost |MODIFIED
-optimize.zero-gr5-lag0.multi-linear.sim_q |MODIFIED
-optimize.zero-gr5-lag0.multi-polynomial.control_vector |MODIFIED
-optimize.zero-gr5-lag0.multi-polynomial.iter_cost |MODIFIED
-optimize.zero-gr5-lag0.multi-polynomial.sim_q |MODIFIED
-optimize.zero-gr5-lag0.uniform.control_vector |MODIFIED
-optimize.zero-gr5-lag0.uniform.iter_cost |MODIFIED
-optimize.zero-gr5-lag0.uniform.sim_q |MODIFIED
-optimize.zero-gr5-lr.ann.sim_q |MODIFIED
-optimize.zero-gr5-lr.distributed.control_vector |MODIFIED
-optimize.zero-gr5-lr.distributed.iter_cost |MODIFIED
-optimize.zero-gr5-lr.distributed.sim_q |MODIFIED
-optimize.zero-gr5-lr.multi-linear.control_vector |MODIFIED
-optimize.zero-gr5-lr.multi-linear.iter_cost |MODIFIED
-optimize.zero-gr5-lr.multi-linear.sim_q |MODIFIED
-optimize.zero-gr5-lr.multi-polynomial.control_vector |MODIFIED
-optimize.zero-gr5-lr.multi-polynomial.iter_cost |MODIFIED
-optimize.zero-gr5-lr.multi-polynomial.sim_q |MODIFIED
-optimize.zero-gr5-lr.uniform.control_vector |MODIFIED
-optimize.zero-gr5-lr.uniform.iter_cost |MODIFIED
-optimize.zero-gr5-lr.uniform.sim_q |MODIFIED
+optimize.zero-gr4-kw.ann.sim_q |NON MODIFIED
+optimize.zero-gr4-kw.distributed.control_vector |NON MODIFIED
+optimize.zero-gr4-kw.distributed.iter_cost |NON MODIFIED
+optimize.zero-gr4-kw.distributed.sim_q |NON MODIFIED
+optimize.zero-gr4-kw.multi-linear.control_vector |NON MODIFIED
+optimize.zero-gr4-kw.multi-linear.iter_cost |NON MODIFIED
+optimize.zero-gr4-kw.multi-linear.sim_q |NON MODIFIED
+optimize.zero-gr4-kw.multi-polynomial.control_vector |NON MODIFIED
+optimize.zero-gr4-kw.multi-polynomial.iter_cost |NON MODIFIED
+optimize.zero-gr4-kw.multi-polynomial.sim_q |NON MODIFIED
+optimize.zero-gr4-kw.uniform.control_vector |NON MODIFIED
+optimize.zero-gr4-kw.uniform.iter_cost |NON MODIFIED
+optimize.zero-gr4-kw.uniform.sim_q |NON MODIFIED
+optimize.zero-gr4-lag0.ann.sim_q |NON MODIFIED
+optimize.zero-gr4-lag0.distributed.control_vector |NON MODIFIED
+optimize.zero-gr4-lag0.distributed.iter_cost |NON MODIFIED
+optimize.zero-gr4-lag0.distributed.sim_q |NON MODIFIED
+optimize.zero-gr4-lag0.multi-linear.control_vector |NON MODIFIED
+optimize.zero-gr4-lag0.multi-linear.iter_cost |NON MODIFIED
+optimize.zero-gr4-lag0.multi-linear.sim_q |NON MODIFIED
+optimize.zero-gr4-lag0.multi-polynomial.control_vector |NON MODIFIED
+optimize.zero-gr4-lag0.multi-polynomial.iter_cost |NON MODIFIED
+optimize.zero-gr4-lag0.multi-polynomial.sim_q |NON MODIFIED
+optimize.zero-gr4-lag0.uniform.control_vector |NON MODIFIED
+optimize.zero-gr4-lag0.uniform.iter_cost |NON MODIFIED
+optimize.zero-gr4-lag0.uniform.sim_q |NON MODIFIED
+optimize.zero-gr4-lr.ann.sim_q |NON MODIFIED
+optimize.zero-gr4-lr.distributed.control_vector |NON MODIFIED
+optimize.zero-gr4-lr.distributed.iter_cost |NON MODIFIED
+optimize.zero-gr4-lr.distributed.sim_q |NON MODIFIED
+optimize.zero-gr4-lr.multi-linear.control_vector |NON MODIFIED
+optimize.zero-gr4-lr.multi-linear.iter_cost |NON MODIFIED
+optimize.zero-gr4-lr.multi-linear.sim_q |NON MODIFIED
+optimize.zero-gr4-lr.multi-polynomial.control_vector |NON MODIFIED
+optimize.zero-gr4-lr.multi-polynomial.iter_cost |NON MODIFIED
+optimize.zero-gr4-lr.multi-polynomial.sim_q |NON MODIFIED
+optimize.zero-gr4-lr.uniform.control_vector |NON MODIFIED
+optimize.zero-gr4-lr.uniform.iter_cost |NON MODIFIED
+optimize.zero-gr4-lr.uniform.sim_q |NON MODIFIED
+optimize.zero-gr5-kw.ann.sim_q |NON MODIFIED
+optimize.zero-gr5-kw.distributed.control_vector |NON MODIFIED
+optimize.zero-gr5-kw.distributed.iter_cost |NON MODIFIED
+optimize.zero-gr5-kw.distributed.sim_q |NON MODIFIED
+optimize.zero-gr5-kw.multi-linear.control_vector |NON MODIFIED
+optimize.zero-gr5-kw.multi-linear.iter_cost |NON MODIFIED
+optimize.zero-gr5-kw.multi-linear.sim_q |NON MODIFIED
+optimize.zero-gr5-kw.multi-polynomial.control_vector |NON MODIFIED
+optimize.zero-gr5-kw.multi-polynomial.iter_cost |NON MODIFIED
+optimize.zero-gr5-kw.multi-polynomial.sim_q |NON MODIFIED
+optimize.zero-gr5-kw.uniform.control_vector |NON MODIFIED
+optimize.zero-gr5-kw.uniform.iter_cost |NON MODIFIED
+optimize.zero-gr5-kw.uniform.sim_q |NON MODIFIED
+optimize.zero-gr5-lag0.ann.sim_q |NON MODIFIED
+optimize.zero-gr5-lag0.distributed.control_vector |NON MODIFIED
+optimize.zero-gr5-lag0.distributed.iter_cost |NON MODIFIED
+optimize.zero-gr5-lag0.distributed.sim_q |NON MODIFIED
+optimize.zero-gr5-lag0.multi-linear.control_vector |NON MODIFIED
+optimize.zero-gr5-lag0.multi-linear.iter_cost |NON MODIFIED
+optimize.zero-gr5-lag0.multi-linear.sim_q |NON MODIFIED
+optimize.zero-gr5-lag0.multi-polynomial.control_vector |NON MODIFIED
+optimize.zero-gr5-lag0.multi-polynomial.iter_cost |NON MODIFIED
+optimize.zero-gr5-lag0.multi-polynomial.sim_q |NON MODIFIED
+optimize.zero-gr5-lag0.uniform.control_vector |NON MODIFIED
+optimize.zero-gr5-lag0.uniform.iter_cost |NON MODIFIED
+optimize.zero-gr5-lag0.uniform.sim_q |NON MODIFIED
+optimize.zero-gr5-lr.ann.sim_q |NON MODIFIED
+optimize.zero-gr5-lr.distributed.control_vector |NON MODIFIED
+optimize.zero-gr5-lr.distributed.iter_cost |NON MODIFIED
+optimize.zero-gr5-lr.distributed.sim_q |NON MODIFIED
+optimize.zero-gr5-lr.multi-linear.control_vector |NON MODIFIED
+optimize.zero-gr5-lr.multi-linear.iter_cost |NON MODIFIED
+optimize.zero-gr5-lr.multi-linear.sim_q |NON MODIFIED
+optimize.zero-gr5-lr.multi-polynomial.control_vector |NON MODIFIED
+optimize.zero-gr5-lr.multi-polynomial.iter_cost |NON MODIFIED
+optimize.zero-gr5-lr.multi-polynomial.sim_q |NON MODIFIED
+optimize.zero-gr5-lr.uniform.control_vector |NON MODIFIED
+optimize.zero-gr5-lr.uniform.iter_cost |NON MODIFIED
+optimize.zero-gr5-lr.uniform.sim_q |NON MODIFIED
optimize.zero-grd-kw.ann.sim_q |NON MODIFIED
optimize.zero-grd-kw.distributed.control_vector |NON MODIFIED
optimize.zero-grd-kw.distributed.iter_cost |NON MODIFIED
@@ -360,45 +366,45 @@ optimize.zero-grd-lr.multi-polynomial.sim_q |NON MODIFIED
optimize.zero-grd-lr.uniform.control_vector |NON MODIFIED
optimize.zero-grd-lr.uniform.iter_cost |NON MODIFIED
optimize.zero-grd-lr.uniform.sim_q |NON MODIFIED
-optimize.zero-loieau-kw.ann.sim_q |MODIFIED
-optimize.zero-loieau-kw.distributed.control_vector |MODIFIED
-optimize.zero-loieau-kw.distributed.iter_cost |MODIFIED
-optimize.zero-loieau-kw.distributed.sim_q |MODIFIED
-optimize.zero-loieau-kw.multi-linear.control_vector |MODIFIED
-optimize.zero-loieau-kw.multi-linear.iter_cost |MODIFIED
-optimize.zero-loieau-kw.multi-linear.sim_q |MODIFIED
-optimize.zero-loieau-kw.multi-polynomial.control_vector |MODIFIED
-optimize.zero-loieau-kw.multi-polynomial.iter_cost |MODIFIED
-optimize.zero-loieau-kw.multi-polynomial.sim_q |MODIFIED
-optimize.zero-loieau-kw.uniform.control_vector |MODIFIED
-optimize.zero-loieau-kw.uniform.iter_cost |MODIFIED
-optimize.zero-loieau-kw.uniform.sim_q |MODIFIED
-optimize.zero-loieau-lag0.ann.sim_q |MODIFIED
-optimize.zero-loieau-lag0.distributed.control_vector |MODIFIED
-optimize.zero-loieau-lag0.distributed.iter_cost |MODIFIED
-optimize.zero-loieau-lag0.distributed.sim_q |MODIFIED
-optimize.zero-loieau-lag0.multi-linear.control_vector |MODIFIED
-optimize.zero-loieau-lag0.multi-linear.iter_cost |MODIFIED
-optimize.zero-loieau-lag0.multi-linear.sim_q |MODIFIED
-optimize.zero-loieau-lag0.multi-polynomial.control_vector |MODIFIED
-optimize.zero-loieau-lag0.multi-polynomial.iter_cost |MODIFIED
-optimize.zero-loieau-lag0.multi-polynomial.sim_q |MODIFIED
-optimize.zero-loieau-lag0.uniform.control_vector |MODIFIED
-optimize.zero-loieau-lag0.uniform.iter_cost |MODIFIED
-optimize.zero-loieau-lag0.uniform.sim_q |MODIFIED
-optimize.zero-loieau-lr.ann.sim_q |MODIFIED
-optimize.zero-loieau-lr.distributed.control_vector |MODIFIED
-optimize.zero-loieau-lr.distributed.iter_cost |MODIFIED
-optimize.zero-loieau-lr.distributed.sim_q |MODIFIED
-optimize.zero-loieau-lr.multi-linear.control_vector |MODIFIED
-optimize.zero-loieau-lr.multi-linear.iter_cost |MODIFIED
-optimize.zero-loieau-lr.multi-linear.sim_q |MODIFIED
-optimize.zero-loieau-lr.multi-polynomial.control_vector |MODIFIED
-optimize.zero-loieau-lr.multi-polynomial.iter_cost |MODIFIED
-optimize.zero-loieau-lr.multi-polynomial.sim_q |MODIFIED
-optimize.zero-loieau-lr.uniform.control_vector |MODIFIED
-optimize.zero-loieau-lr.uniform.iter_cost |MODIFIED
-optimize.zero-loieau-lr.uniform.sim_q |MODIFIED
+optimize.zero-loieau-kw.ann.sim_q |NON MODIFIED
+optimize.zero-loieau-kw.distributed.control_vector |NON MODIFIED
+optimize.zero-loieau-kw.distributed.iter_cost |NON MODIFIED
+optimize.zero-loieau-kw.distributed.sim_q |NON MODIFIED
+optimize.zero-loieau-kw.multi-linear.control_vector |NON MODIFIED
+optimize.zero-loieau-kw.multi-linear.iter_cost |NON MODIFIED
+optimize.zero-loieau-kw.multi-linear.sim_q |NON MODIFIED
+optimize.zero-loieau-kw.multi-polynomial.control_vector |NON MODIFIED
+optimize.zero-loieau-kw.multi-polynomial.iter_cost |NON MODIFIED
+optimize.zero-loieau-kw.multi-polynomial.sim_q |NON MODIFIED
+optimize.zero-loieau-kw.uniform.control_vector |NON MODIFIED
+optimize.zero-loieau-kw.uniform.iter_cost |NON MODIFIED
+optimize.zero-loieau-kw.uniform.sim_q |NON MODIFIED
+optimize.zero-loieau-lag0.ann.sim_q |NON MODIFIED
+optimize.zero-loieau-lag0.distributed.control_vector |NON MODIFIED
+optimize.zero-loieau-lag0.distributed.iter_cost |NON MODIFIED
+optimize.zero-loieau-lag0.distributed.sim_q |NON MODIFIED
+optimize.zero-loieau-lag0.multi-linear.control_vector |NON MODIFIED
+optimize.zero-loieau-lag0.multi-linear.iter_cost |NON MODIFIED
+optimize.zero-loieau-lag0.multi-linear.sim_q |NON MODIFIED
+optimize.zero-loieau-lag0.multi-polynomial.control_vector |NON MODIFIED
+optimize.zero-loieau-lag0.multi-polynomial.iter_cost |NON MODIFIED
+optimize.zero-loieau-lag0.multi-polynomial.sim_q |NON MODIFIED
+optimize.zero-loieau-lag0.uniform.control_vector |NON MODIFIED
+optimize.zero-loieau-lag0.uniform.iter_cost |NON MODIFIED
+optimize.zero-loieau-lag0.uniform.sim_q |NON MODIFIED
+optimize.zero-loieau-lr.ann.sim_q |NON MODIFIED
+optimize.zero-loieau-lr.distributed.control_vector |NON MODIFIED
+optimize.zero-loieau-lr.distributed.iter_cost |NON MODIFIED
+optimize.zero-loieau-lr.distributed.sim_q |NON MODIFIED
+optimize.zero-loieau-lr.multi-linear.control_vector |NON MODIFIED
+optimize.zero-loieau-lr.multi-linear.iter_cost |NON MODIFIED
+optimize.zero-loieau-lr.multi-linear.sim_q |NON MODIFIED
+optimize.zero-loieau-lr.multi-polynomial.control_vector |NON MODIFIED
+optimize.zero-loieau-lr.multi-polynomial.iter_cost |NON MODIFIED
+optimize.zero-loieau-lr.multi-polynomial.sim_q |NON MODIFIED
+optimize.zero-loieau-lr.uniform.control_vector |NON MODIFIED
+optimize.zero-loieau-lr.uniform.iter_cost |NON MODIFIED
+optimize.zero-loieau-lr.uniform.sim_q |NON MODIFIED
optimize.zero-vic3l-kw.ann.sim_q |NON MODIFIED
optimize.zero-vic3l-kw.distributed.control_vector |NON MODIFIED
optimize.zero-vic3l-kw.distributed.iter_cost |NON MODIFIED
diff --git a/smash/tests/generate_baseline.py b/smash/tests/generate_baseline.py
index 6aedfe91..a7c7b7b0 100644
--- a/smash/tests/generate_baseline.py
+++ b/smash/tests/generate_baseline.py
@@ -101,7 +101,9 @@ def compare_baseline(f: h5py.File, new_f: h5py.File):
if key in new_f_keys and key in f_keys:
# % If an error occurs during check (inconsistent shapes ...)
try:
- if f[key][:].dtype == "object" or f[key][:].dtype.char == "S":
+ if f[key][:].size == 0:
+ is_equal = new_f[key][:].size == 0
+ elif f[key][:].dtype == "object" or f[key][:].dtype.char == "S":
is_equal = np.array_equal(f[key][:], new_f[key][:])
else:
is_equal = np.allclose(f[key][:], new_f[key][:], equal_nan=True, atol=1e-3)