Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions doc/source/math_num_documentation/forward_structure.rst
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Snow operator :math:`\mathcal{M}_{snw}`
:align: center
:width: 300

.. dropdown:: zero (Zero Snow)
.. dropdown:: Zero Snow (zero)
:animate: fade-in-slide-down

This snow operator simply means that there is no snow operator.
Expand All @@ -46,7 +46,7 @@ Snow operator :math:`\mathcal{M}_{snw}`

with :math:`m_{lt}` the melt flux.

.. dropdown:: ssn (Simple Snow)
.. dropdown:: Simple Snow (ssn)
:animate: fade-in-slide-down

This snow operator is a simple degree-day snow operator. It can be expressed as follows:
Expand Down Expand Up @@ -1736,6 +1736,19 @@ surface discharge can inflow the current cell :math:`x` - each cell has a unique
:align: center
:width: 300

.. _math_num_documentation.forward_structure.routing_module.zero:

.. dropdown:: Zero Routing (zero)
:animate: fade-in-slide-down

This routing operator simply means that there is no routing operator.

.. math::

Q(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.

.. _math_num_documentation.forward_structure.routing_module.lag0:

.. dropdown:: Instantaneous Routing (lag0)
Expand Down
42 changes: 18 additions & 24 deletions smash/_constant.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,31 @@ def get_structure() -> list[str]:

def get_rr_parameters_from_structure(structure: str) -> list[str]:
rr_parameters = []
[rr_parameters.extend(MODULE_RR_PARAMETERS[module]) for module in structure.split("-")]
sm, hm, rm = structure.split("-")
rr_parameters.extend(SNOW_MODULE_RR_PARAMETERS[sm])
rr_parameters.extend(HYDROLOGICAL_MODULE_RR_PARAMETERS[hm])
rr_parameters.extend(ROUTING_MODULE_RR_PARAMETERS[rm])

return rr_parameters


def get_rr_states_from_structure(structure: str) -> list[str]:
rr_states = []
[rr_states.extend(MODULE_RR_STATES[module]) for module in structure.split("-")]
sm, hm, rm = structure.split("-")
rr_states.extend(SNOW_MODULE_RR_STATES[sm])
rr_states.extend(HYDROLOGICAL_MODULE_RR_STATES[hm])
rr_states.extend(ROUTING_MODULE_RR_STATES[rm])

return rr_states


def get_rr_internal_fluxes_from_structure(structure: str) -> list[str]:
rr_internal_fluxes = []
[rr_internal_fluxes.extend(MODULE_RR_INTERNAL_FLUXES[module]) for module in structure.split("-")]
sm, hm, rm = structure.split("-")
rr_internal_fluxes.extend(SNOW_MODULE_RR_INTERNAL_FLUXES[sm])
rr_internal_fluxes.extend(HYDROLOGICAL_MODULE_RR_INTERNAL_FLUXES[hm])
rr_internal_fluxes.extend(ROUTING_MODULE_RR_INTERNAL_FLUXES[rm])

return rr_internal_fluxes


Expand Down Expand Up @@ -74,7 +84,7 @@ def get_neurons_from_hydrological_module(hydrological_module: str, hidden_neuron
"vic3l",
]

ROUTING_MODULE = ["lag0", "lr", "kw"]
ROUTING_MODULE = ["zero", "lag0", "lr", "kw"]

MODULE = SNOW_MODULE + HYDROLOGICAL_MODULE + ROUTING_MODULE

Expand Down Expand Up @@ -111,14 +121,7 @@ def get_neurons_from_hydrological_module(hydrological_module: str, hidden_neuron

# % Following ROUTING_MODULE order
ROUTING_MODULE_RR_PARAMETERS = dict(
zip(ROUTING_MODULE, [[], ["llr"], ["akw", "bkw"]]) # % lag0 # % lr # % kw
)

# % Following MODULE order
MODULE_RR_PARAMETERS = dict(
**SNOW_MODULE_RR_PARAMETERS,
**HYDROLOGICAL_MODULE_RR_PARAMETERS,
**ROUTING_MODULE_RR_PARAMETERS,
zip(ROUTING_MODULE, [[], [], ["llr"], ["akw", "bkw"]]) # % zero, lag0, lr, kw
)

# % Following SNOW_MODULE order
Expand Down Expand Up @@ -151,15 +154,12 @@ def get_neurons_from_hydrological_module(hydrological_module: str, hidden_neuron

# % Following ROUTING_MODULE order
ROUTING_MODULE_RR_STATES = dict(
zip(ROUTING_MODULE, [[], ["hlr"], []]) # % lag0 # % lr # % kw
zip(ROUTING_MODULE, [[], [], ["hlr"], []]) # % zero, lag0, lr, kw
)

# % Following MODULE order
MODULE_RR_STATES = dict(**SNOW_MODULE_RR_STATES, **HYDROLOGICAL_MODULE_RR_STATES, **ROUTING_MODULE_RR_STATES)

# % Following ROUTING_MODULE order
ROUTING_MODULE_NQZ = dict(
zip(ROUTING_MODULE, [1, 1, 2]) # % lag0 # % lr # % kw
zip(ROUTING_MODULE, [1, 1, 1, 2]) # % zero, lag0, lr, kw
)

# % Following SNOW_MODULE order
Expand Down Expand Up @@ -197,13 +197,7 @@ def get_neurons_from_hydrological_module(hydrological_module: str, hidden_neuron

# % Following ROUTING_MODULE order
ROUTING_MODULE_RR_INTERNAL_FLUXES = dict(
zip(ROUTING_MODULE, [["qup"], ["qup"], ["qim1j"]]) # % lag0 # % lr # % kw
)

MODULE_RR_INTERNAL_FLUXES = dict(
**SNOW_MODULE_RR_INTERNAL_FLUXES,
**HYDROLOGICAL_MODULE_RR_INTERNAL_FLUXES,
**ROUTING_MODULE_RR_INTERNAL_FLUXES,
zip(ROUTING_MODULE, [[], ["qup"], ["qup"], ["qim1j"]]) # % zero, lag0, lr, kw
)

### STRUCTURE ###
Expand Down
1 change: 1 addition & 0 deletions smash/core/model/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ class Model:
routing_module : `str`, default 'lr'
Name of routing module. Should be one of:

- ``'zero'``
- ``'lag0'``
- ``'lr'``
- ``'kw'``
Expand Down
41 changes: 28 additions & 13 deletions smash/fcore/forward/forward_db.f90
Original file line number Diff line number Diff line change
Expand Up @@ -26781,6 +26781,10 @@ SUBROUTINE SIMULATION_CHECKPOINT_D(setup, mesh, input_data, parameters&
END SELECT
! Routing module
SELECT CASE (setup%routing_module)
CASE ('zero')
! 'zero' module
checkpoint_variable_d%ac_qz = checkpoint_variable_d%ac_qtz
checkpoint_variable%ac_qz = checkpoint_variable%ac_qtz
CASE ('lag0')
! 'lag0' module
CALL LAG0_TIME_STEP_D(setup, mesh, options, returns, t, &
Expand Down Expand Up @@ -27748,6 +27752,10 @@ SUBROUTINE SIMULATION_CHECKPOINT_B(setup, mesh, input_data, parameters&
END SELECT
! Routing module
SELECT CASE (setup%routing_module)
CASE ('zero')
! 'zero' module
checkpoint_variable%ac_qz = checkpoint_variable%ac_qtz
CALL PUSHCONTROL3B(1)
CASE ('lag0')
! 'lag0' module
CALL PUSHREAL4ARRAY(checkpoint_variable%ac_qz, SIZE(&
Expand All @@ -27756,7 +27764,7 @@ SUBROUTINE SIMULATION_CHECKPOINT_B(setup, mesh, input_data, parameters&
CALL LAG0_TIME_STEP(setup, mesh, options, returns, t, &
& checkpoint_variable%ac_qtz, checkpoint_variable%&
& ac_qz)
CALL PUSHCONTROL2B(1)
CALL PUSHCONTROL3B(2)
CASE ('lr')
! 'lr' module
! % To avoid potential aliasing tapenade warning (DF02)
Expand All @@ -27773,7 +27781,7 @@ SUBROUTINE SIMULATION_CHECKPOINT_B(setup, mesh, input_data, parameters&
& ac_rr_parameters(:, rr_parameters_inc+1), h1, &
& checkpoint_variable%ac_qz)
checkpoint_variable%ac_rr_states(:, rr_states_inc+1) = h1
CALL PUSHCONTROL2B(2)
CALL PUSHCONTROL3B(3)
CASE ('kw')
! 'kw' module
! % akw
Expand All @@ -27786,29 +27794,33 @@ SUBROUTINE SIMULATION_CHECKPOINT_B(setup, mesh, input_data, parameters&
& ac_rr_parameters(:, rr_parameters_inc+1), &
& checkpoint_variable%ac_rr_parameters(:, &
& rr_parameters_inc+2), checkpoint_variable%ac_qz)
CALL PUSHCONTROL2B(3)
CALL PUSHCONTROL3B(4)
CASE DEFAULT
CALL PUSHCONTROL2B(0)
CALL PUSHCONTROL3B(0)
END SELECT
CALL STORE_TIME_STEP(setup, mesh, output, returns, &
& checkpoint_variable, t)
END DO
DO t=end_time_step,start_time_step,-1
CALL STORE_TIME_STEP_B(setup, mesh, output, output_b, returns, &
& checkpoint_variable, checkpoint_variable_b, t)
CALL POPCONTROL2B(branch)
CALL POPCONTROL3B(branch)
IF (branch .LT. 2) THEN
IF (branch .NE. 0) THEN
CALL POPREAL4ARRAY(checkpoint_variable%ac_qz, SIZE(&
& checkpoint_variable%ac_qz, 1)*SIZE(&
& checkpoint_variable%ac_qz, 2))
CALL LAG0_TIME_STEP_B(setup, mesh, options, returns, t, &
& checkpoint_variable%ac_qtz, &
& checkpoint_variable_b%ac_qtz, &
& checkpoint_variable%ac_qz, &
& checkpoint_variable_b%ac_qz)
checkpoint_variable_b%ac_qtz = checkpoint_variable_b%ac_qtz + &
& checkpoint_variable_b%ac_qz
checkpoint_variable_b%ac_qz = 0.0_4
END IF
ELSE IF (branch .EQ. 2) THEN
CALL POPREAL4ARRAY(checkpoint_variable%ac_qz, SIZE(&
& checkpoint_variable%ac_qz, 1)*SIZE(&
& checkpoint_variable%ac_qz, 2))
CALL LAG0_TIME_STEP_B(setup, mesh, options, returns, t, &
& checkpoint_variable%ac_qtz, &
& checkpoint_variable_b%ac_qtz, &
& checkpoint_variable%ac_qz, checkpoint_variable_b&
& %ac_qz)
ELSE IF (branch .EQ. 3) THEN
h1_b = 0.0_4
h1_b = checkpoint_variable_b%ac_rr_states(:, rr_states_inc+1)
CALL POPREAL4ARRAY(h1, mesh%nac)
Expand Down Expand Up @@ -29720,6 +29732,9 @@ SUBROUTINE SIMULATION_CHECKPOINT(setup, mesh, input_data, parameters, &
END SELECT
! Routing module
SELECT CASE (setup%routing_module)
CASE ('zero')
! 'zero' module
checkpoint_variable%ac_qz = checkpoint_variable%ac_qtz
CASE ('lag0')
! 'lag0' module
CALL LAG0_TIME_STEP(setup, mesh, options, returns, t, &
Expand Down
41 changes: 28 additions & 13 deletions smash/fcore/forward/forward_openmp_db.f90
Original file line number Diff line number Diff line change
Expand Up @@ -28030,6 +28030,10 @@ SUBROUTINE SIMULATION_CHECKPOINT_D(setup, mesh, input_data, parameters&
END SELECT
! Routing module
SELECT CASE (setup%routing_module)
CASE ('zero')
! 'zero' module
checkpoint_variable_d%ac_qz = checkpoint_variable_d%ac_qtz
checkpoint_variable%ac_qz = checkpoint_variable%ac_qtz
CASE ('lag0')
! 'lag0' module
CALL LAG0_TIME_STEP_D(setup, mesh, options, returns, t, &
Expand Down Expand Up @@ -28997,6 +29001,10 @@ SUBROUTINE SIMULATION_CHECKPOINT_B(setup, mesh, input_data, parameters&
END SELECT
! Routing module
SELECT CASE (setup%routing_module)
CASE ('zero')
! 'zero' module
checkpoint_variable%ac_qz = checkpoint_variable%ac_qtz
CALL PUSHCONTROL3B(1)
CASE ('lag0')
! 'lag0' module
CALL PUSHREAL4ARRAY(checkpoint_variable%ac_qz, SIZE(&
Expand All @@ -29005,7 +29013,7 @@ SUBROUTINE SIMULATION_CHECKPOINT_B(setup, mesh, input_data, parameters&
CALL LAG0_TIME_STEP(setup, mesh, options, returns, t, &
& checkpoint_variable%ac_qtz, checkpoint_variable%&
& ac_qz)
CALL PUSHCONTROL2B(1)
CALL PUSHCONTROL3B(2)
CASE ('lr')
! 'lr' module
! % To avoid potential aliasing tapenade warning (DF02)
Expand All @@ -29022,7 +29030,7 @@ SUBROUTINE SIMULATION_CHECKPOINT_B(setup, mesh, input_data, parameters&
& ac_rr_parameters(:, rr_parameters_inc+1), h1, &
& checkpoint_variable%ac_qz)
checkpoint_variable%ac_rr_states(:, rr_states_inc+1) = h1
CALL PUSHCONTROL2B(2)
CALL PUSHCONTROL3B(3)
CASE ('kw')
! 'kw' module
! % akw
Expand All @@ -29035,29 +29043,33 @@ SUBROUTINE SIMULATION_CHECKPOINT_B(setup, mesh, input_data, parameters&
& ac_rr_parameters(:, rr_parameters_inc+1), &
& checkpoint_variable%ac_rr_parameters(:, &
& rr_parameters_inc+2), checkpoint_variable%ac_qz)
CALL PUSHCONTROL2B(3)
CALL PUSHCONTROL3B(4)
CASE DEFAULT
CALL PUSHCONTROL2B(0)
CALL PUSHCONTROL3B(0)
END SELECT
CALL STORE_TIME_STEP(setup, mesh, output, returns, &
& checkpoint_variable, t)
END DO
DO t=end_time_step,start_time_step,-1
CALL STORE_TIME_STEP_B(setup, mesh, output, output_b, returns, &
& checkpoint_variable, checkpoint_variable_b, t)
CALL POPCONTROL2B(branch)
CALL POPCONTROL3B(branch)
IF (branch .LT. 2) THEN
IF (branch .NE. 0) THEN
CALL POPREAL4ARRAY(checkpoint_variable%ac_qz, SIZE(&
& checkpoint_variable%ac_qz, 1)*SIZE(&
& checkpoint_variable%ac_qz, 2))
CALL LAG0_TIME_STEP_B(setup, mesh, options, returns, t, &
& checkpoint_variable%ac_qtz, &
& checkpoint_variable_b%ac_qtz, &
& checkpoint_variable%ac_qz, &
& checkpoint_variable_b%ac_qz)
checkpoint_variable_b%ac_qtz = checkpoint_variable_b%ac_qtz + &
& checkpoint_variable_b%ac_qz
checkpoint_variable_b%ac_qz = 0.0_4
END IF
ELSE IF (branch .EQ. 2) THEN
CALL POPREAL4ARRAY(checkpoint_variable%ac_qz, SIZE(&
& checkpoint_variable%ac_qz, 1)*SIZE(&
& checkpoint_variable%ac_qz, 2))
CALL LAG0_TIME_STEP_B(setup, mesh, options, returns, t, &
& checkpoint_variable%ac_qtz, &
& checkpoint_variable_b%ac_qtz, &
& checkpoint_variable%ac_qz, checkpoint_variable_b&
& %ac_qz)
ELSE IF (branch .EQ. 3) THEN
h1_b = 0.0_4
h1_b = checkpoint_variable_b%ac_rr_states(:, rr_states_inc+1)
CALL POPREAL4ARRAY(h1, mesh%nac)
Expand Down Expand Up @@ -30969,6 +30981,9 @@ SUBROUTINE SIMULATION_CHECKPOINT(setup, mesh, input_data, parameters, &
END SELECT
! Routing module
SELECT CASE (setup%routing_module)
CASE ('zero')
! 'zero' module
checkpoint_variable%ac_qz = checkpoint_variable%ac_qtz
CASE ('lag0')
! 'lag0' module
CALL LAG0_TIME_STEP(setup, mesh, options, returns, t, &
Expand Down
5 changes: 5 additions & 0 deletions smash/fcore/forward/md_simulation.f90
Original file line number Diff line number Diff line change
Expand Up @@ -856,6 +856,11 @@ subroutine simulation_checkpoint(setup, mesh, input_data, parameters, output, op
! Routing module
select case (setup%routing_module)

! 'zero' module
case ("zero")

checkpoint_variable%ac_qz = checkpoint_variable%ac_qtz

! 'lag0' module
case ("lag0")

Expand Down
Binary file modified smash/tests/baseline.hdf5
Binary file not shown.
Loading
Loading