root_to_shoot

Two models, a root model and a shoot model, that are both run via wrappers around functions. The root model receives the initial root mass, growth rate, and time steps from files. For each time step, the root model computes the new root mass and sends it to the shoot model. The shoot model receives the initial shoot mass, growth rate, and time steps from files. For each time step, the shoot model receives the new root mass from the root model, calculates the next shoot mass and outputs it to a file.

Mixed Version

Model Code:

 1import time
 2
 3
 4def calc_shoot_mass(r_s, dt, S_t, R_t, R_tp1):
 5    r"""Calculate the shoot mass.
 6
 7    Args:
 8        r_s (float): Relative shoot growth rate.
 9        dt (float): The time step.
10        S_t (float): Previous shoot mass.
11        R_t (float): Previous root mass.
12        R_tp1 (float): Root mass at the next timestep.
13
14    Returns:
15        float: Shoot mass at the next timestep.
16
17    """
18    time.sleep(0.1)  # To simulate a longer calculation
19    return (S_t * r_s * dt) + S_t - (R_tp1 - R_t)

Model YAML:

 1model:
 2  name: RootModel
 3  language: c
 4  args: ./src/root_wrapper.c
 5  inputs:
 6    - name: root_growth_rate
 7      units: hr**-1
 8    - name: init_root_mass
 9      units: g
10    - name: root_time_step
11      units: hr
12  outputs:
13    - name: next_root_mass
14      units: g
 1model:
 2  name: ShootModel
 3  language: python
 4  args: ./src/shoot_wrapper.py
 5  inputs:
 6    - name: shoot_growth_rate
 7      units: d**-1
 8    - name: init_shoot_mass
 9      units: kg
10    - name: shoot_time_step
11      units: d
12    - name: next_root_mass
13      units: kg
14  outputs:
15    - name: next_shoot_mass
16      units: kg
 1connections:
 2  # Root input connections
 3  - input: ./Input/root_growth_rate.txt
 4    output: root_growth_rate
 5    filetype: table
 6  - input: ./Input/init_root_mass.txt
 7    output: init_root_mass
 8    filetype: table
 9  - input: ./Input/timesteps.txt
10    output: root_time_step
11    filetype: table
12
13  # Root-to-shoot connection
14  - input: next_root_mass
15    output: next_root_mass
16
17  # Shoot input connections
18  - input: ./Input/shoot_growth_rate.txt
19    output: shoot_growth_rate
20    filetype: table
21    transform: select_scalar
22  - input: ./Input/init_shoot_mass.txt
23    output: init_shoot_mass
24    filetype: table
25    transform: select_scalar
26  - input: ./Input/timesteps.txt
27    output: shoot_time_step
28    filetype: table
29    transform: select_scalar
30
31  # Shoot output connection
32  - input: next_shoot_mass
33    output: ./Output/shoot_output.txt
34    filetype: table
35    field_names: shoot_mass

Mixed w/o Matlab Version

Model Code:

 1import time
 2
 3
 4def calc_shoot_mass(r_s, dt, S_t, R_t, R_tp1):
 5    r"""Calculate the shoot mass.
 6
 7    Args:
 8        r_s (float): Relative shoot growth rate.
 9        dt (float): The time step.
10        S_t (float): Previous shoot mass.
11        R_t (float): Previous root mass.
12        R_tp1 (float): Root mass at the next timestep.
13
14    Returns:
15        float: Shoot mass at the next timestep.
16
17    """
18    time.sleep(0.1)  # To simulate a longer calculation
19    return (S_t * r_s * dt) + S_t - (R_tp1 - R_t)

Model YAML:

 1model:
 2  name: RootModel
 3  language: c
 4  args: ./src/root_wrapper.c
 5  inputs:
 6    - name: root_growth_rate
 7      units: hr**-1
 8    - name: init_root_mass
 9      units: g
10    - name: root_time_step
11      units: hr
12  outputs:
13    - name: next_root_mass
14      units: g
 1model:
 2  name: ShootModel
 3  language: python
 4  args: ./src/shoot_wrapper.py
 5  inputs:
 6    - name: shoot_growth_rate
 7      units: d**-1
 8    - name: init_shoot_mass
 9      units: kg
10    - name: shoot_time_step
11      units: d
12    - name: next_root_mass
13      units: kg
14  outputs:
15    - name: next_shoot_mass
16      units: kg
 1connections:
 2  # Root input connections
 3  - input: ./Input/root_growth_rate.txt
 4    output: root_growth_rate
 5    filetype: table
 6  - input: ./Input/init_root_mass.txt
 7    output: init_root_mass
 8    filetype: table
 9  - input: ./Input/timesteps.txt
10    output: root_time_step
11    filetype: table
12
13  # Root-to-shoot connection
14  - input: next_root_mass
15    output: next_root_mass
16
17  # Shoot input connections
18  - input: ./Input/shoot_growth_rate.txt
19    output: shoot_growth_rate
20    filetype: table
21    transform: select_scalar
22  - input: ./Input/init_shoot_mass.txt
23    output: init_shoot_mass
24    filetype: table
25    transform: select_scalar
26  - input: ./Input/timesteps.txt
27    output: shoot_time_step
28    filetype: table
29    transform: select_scalar
30
31  # Shoot output connection
32  - input: next_shoot_mass
33    output: ./Output/shoot_output.txt
34    filetype: table
35    field_names: shoot_mass

C Version

Model Code:

Model YAML:

 1model:
 2  name: RootModel
 3  language: c
 4  args: ./src/root_wrapper.c
 5  inputs:
 6    - name: root_growth_rate
 7      units: hr**-1
 8    - name: init_root_mass
 9      units: g
10    - name: root_time_step
11      units: hr
12  outputs:
13    - name: next_root_mass
14      units: g
 1connections:
 2  # Input connections
 3  - input: ./Input/root_growth_rate.txt
 4    output: root_growth_rate
 5    filetype: table
 6  - input: ./Input/init_root_mass.txt
 7    output: init_root_mass
 8    filetype: table
 9  - input: ./Input/timesteps.txt
10    output: root_time_step
11    filetype: table
12
13  # Output connections
14  - input: next_root_mass
15    output: ./Output/root_output.txt
16    filetype: table
17    field_names: root_mass

Python Version

Model Code:

 1import time
 2
 3
 4def calc_shoot_mass(r_s, dt, S_t, R_t, R_tp1):
 5    r"""Calculate the shoot mass.
 6
 7    Args:
 8        r_s (float): Relative shoot growth rate.
 9        dt (float): The time step.
10        S_t (float): Previous shoot mass.
11        R_t (float): Previous root mass.
12        R_tp1 (float): Root mass at the next timestep.
13
14    Returns:
15        float: Shoot mass at the next timestep.
16
17    """
18    time.sleep(0.1)  # To simulate a longer calculation
19    return (S_t * r_s * dt) + S_t - (R_tp1 - R_t)

Model YAML:

 1model:
 2  name: ShootModel
 3  language: python
 4  args: ./src/shoot_wrapper.py
 5  inputs:
 6    - name: shoot_growth_rate
 7      units: d**-1
 8    - name: init_shoot_mass
 9      units: kg
10    - name: shoot_time_step
11      units: d
12    - name: next_root_mass
13      units: kg
14  outputs:
15    - name: next_shoot_mass
16      units: kg
 1connections:
 2  # Input connections
 3  - input: ./Input/shoot_growth_rate.txt
 4    output: shoot_growth_rate
 5    filetype: table
 6    transform: select_scalar
 7  - input: ./Input/init_shoot_mass.txt
 8    output: init_shoot_mass
 9    filetype: table
10    transform: select_scalar
11  - input: ./Input/timesteps.txt
12    output: shoot_time_step
13    filetype: table
14    transform: select_scalar
15  - input: ./Input/root_output.txt
16    output: next_root_mass
17    filetype: table
18    transform: select_scalar
19
20  # Output connections
21  - input: next_shoot_mass
22    output: ./Output/shoot_output.txt
23    filetype: table
24    field_names: shoot_mass