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
2 changes: 2 additions & 0 deletions docs/source/_toc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,8 @@ subtrees:
title: The constants submodule
- file: api/models/soil/env_factors
title: The env_factors submodule
- file: api/models/soil/microbial_groups
title: The microbial_groups submodule
- file: api/models/soil/soil_model
title: The soil_model submodule
- file: api/models/plants
Expand Down
33 changes: 33 additions & 0 deletions docs/source/api/models/soil/microbial_groups.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
jupytext:
cell_metadata_filter: -all
formats: md:myst
main_language: python
text_representation:
extension: .md
format_name: myst
format_version: 0.13
jupytext_version: 1.16.7
kernelspec:
display_name: Python 3 (ipykernel)
language: python
name: python3
language_info:
codemirror_mode:
name: ipython
version: 3
file_extension: .py
mimetype: text/x-python
name: python
nbconvert_exporter: python
pygments_lexer: ipython3
version: 3.11.9
---

# API documentation for the {mod}`~virtual_ecosystem.models.soil.microbial_groups` module

```{eval-rst}
.. automodule:: virtual_ecosystem.models.soil.microbial_groups
:autosummary:
:members:
```
47 changes: 44 additions & 3 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,47 @@ def reset_module_registry():


@pytest.fixture
def fixture_config():
def microbial_groups_cfg():
"""Configuration string containing full set of required microbial groups."""
return """
[[soil.microbial_group_definition]]
name = "bacteria"
max_uptake_rate_labile_C = 0.04
activation_energy_uptake_rate = 47000
half_sat_labile_C_uptake = 0.364
activation_energy_uptake_saturation = 30000
max_uptake_rate_ammonium = 5e-3
half_sat_ammonium_uptake = 0.02275
max_uptake_rate_nitrate = 5e-4
half_sat_nitrate_uptake = 0.02275
max_uptake_rate_labile_p = 0.0025
half_sat_labile_p_uptake = 0.02275
turnover_rate = 0.005
activation_energy_turnover = 20000
c_n_ratio = 5.2
c_p_ratio = 16

[[soil.microbial_group_definition]]
name = "fungi"
max_uptake_rate_labile_C = 0.04
activation_energy_uptake_rate = 47000
half_sat_labile_C_uptake = 0.364
activation_energy_uptake_saturation = 30000
max_uptake_rate_ammonium = 5e-3
half_sat_ammonium_uptake = 0.02275
max_uptake_rate_nitrate = 5e-4
half_sat_nitrate_uptake = 0.02275
max_uptake_rate_labile_p = 0.0025
half_sat_labile_p_uptake = 0.02275
turnover_rate = 0.005
activation_energy_turnover = 20000
c_n_ratio = 6.5
c_p_ratio = 40.0
"""


@pytest.fixture
def fixture_config(microbial_groups_cfg):
"""Simple configuration fixture for use in tests."""

from virtual_ecosystem.core.config import Config
Expand Down Expand Up @@ -250,7 +290,7 @@ def fixture_config():
[hydrology]
"""

return Config(cfg_strings=cfg_string)
return Config(cfg_strings=[cfg_string, microbial_groups_cfg])


@pytest.fixture
Expand Down Expand Up @@ -288,7 +328,8 @@ def dummy_carbon_data(fixture_core_components):
data_values = {
"soil_c_pool_lmwc": [0.05, 0.02, 0.1, 0.005],
"soil_c_pool_maom": [2.5, 1.7, 4.5, 0.5],
"soil_c_pool_microbe": [5.8, 2.3, 11.3, 1.0],
"soil_c_pool_bacteria": [5.8, 2.3, 11.3, 1.0],
"soil_c_pool_fungi": [0.89, 8.55, 2.21, 4.54],
"soil_c_pool_pom": [0.1, 1.0, 0.7, 0.35],
"soil_c_pool_necromass": [0.058, 0.015, 0.093, 0.105],
"soil_enzyme_pom": [0.022679, 0.009576, 0.050051, 0.003010],
Expand Down
3 changes: 2 additions & 1 deletion tests/core/test_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -968,7 +968,8 @@ def test_output_current_state(mocker, dummy_carbon_data, time_index):
[
"soil_c_pool_maom",
"soil_c_pool_lmwc",
"soil_c_pool_microbe",
"soil_c_pool_bacteria",
"soil_c_pool_fungi",
"soil_c_pool_pom",
"soil_c_pool_necromass",
"soil_enzyme_pom",
Expand Down
20 changes: 16 additions & 4 deletions tests/models/soil/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@


@pytest.fixture
def fixture_soil_config():
def fixture_soil_config(microbial_groups_cfg):
"""Create a soil config with faster update interval."""
from virtual_ecosystem.core.config import Config

return Config(
cfg_strings="[core]\n[core.timing]\nupdate_interval = '12 hours'\n[soil]\n"
"[hydrology]\n"
cfg_strings=[
"[core]\n[core.timing]\nupdate_interval = '12 hours'",
microbial_groups_cfg,
]
)


Expand Down Expand Up @@ -120,7 +122,7 @@ def microbial_changes(
soil_n_pool_nitrate=dummy_carbon_data["soil_n_pool_nitrate"],
soil_p_pool_dop=dummy_carbon_data["soil_p_pool_dop"],
soil_p_pool_labile=dummy_carbon_data["soil_p_pool_labile"],
soil_c_pool_microbe=dummy_carbon_data["soil_c_pool_microbe"],
soil_c_pool_bacteria=dummy_carbon_data["soil_c_pool_bacteria"],
soil_enzyme_pom=dummy_carbon_data["soil_enzyme_pom"],
soil_enzyme_maom=dummy_carbon_data["soil_enzyme_maom"],
soil_temp=dummy_carbon_data["soil_temperature"][
Expand Down Expand Up @@ -177,3 +179,13 @@ def maom_desorption(dummy_carbon_data):
soil_c_pool_maom=dummy_carbon_data["soil_c_pool_maom"],
desorption_rate_constant=SoilConsts.maom_desorption_rate,
)


@pytest.fixture
def functional_groups(fixture_config):
"""Set of functional groups based on the soil model constants."""
from virtual_ecosystem.models.soil.microbial_groups import (
make_full_set_of_microbial_groups,
)

return make_full_set_of_microbial_groups(config=fixture_config)
197 changes: 197 additions & 0 deletions tests/models/soil/test_microbial_groups.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
"""Test module for soil.microbial_groups.py.

This module tests the functions which generate microbial functional groups.
"""

from logging import CRITICAL

import pytest

from tests.conftest import log_check
from virtual_ecosystem.core.config import Config, ConfigurationError


def test_make_full_set_of_microbial_groups(fixture_config):
"""Test that the function to make all the microbial group works."""
from virtual_ecosystem.models.soil.microbial_groups import (
MicrobialGroupConstants,
make_full_set_of_microbial_groups,
)

expected_groups = ["bacteria", "fungi"]

functional_groups = make_full_set_of_microbial_groups(fixture_config)

assert set(expected_groups) == set(functional_groups.keys())

for group in expected_groups:
assert type(functional_groups[group]) is MicrobialGroupConstants

# Only testing one value, as testing them all seems like overkill/hard to maintain
assert functional_groups["bacteria"].c_n_ratio == 5.2
assert functional_groups["fungi"].c_n_ratio == 6.5


@pytest.mark.parametrize(
argnames=["cfg_strings", "exp_log"],
argvalues=[
pytest.param(
"""[core]""",
[
(CRITICAL, "Model configuration for soil model not found."),
],
id="no_soil_config",
),
pytest.param(
"""
[[soil.microbial_group_definition]]
name = "bacteria"
max_uptake_rate_labile_C = 0.04
activation_energy_uptake_rate = 47000
half_sat_labile_C_uptake = 0.364
activation_energy_uptake_saturation = 30000
max_uptake_rate_ammonium = 5e-3
half_sat_ammonium_uptake = 0.02275
max_uptake_rate_nitrate = 5e-4
half_sat_nitrate_uptake = 0.02275
max_uptake_rate_labile_p = 0.0025
half_sat_labile_p_uptake = 0.02275
turnover_rate = 0.005
activation_energy_turnover = 20000
c_n_ratio = 5.2
c_p_ratio = 16
""",
[
(
CRITICAL,
"The following expected soil microbial groups are not defined: "
"fungi",
)
],
id="missing_fungi",
),
pytest.param( # archaea included but they shouldn't be
"""
[[soil.microbial_group_definition]]
name = "bacteria"
max_uptake_rate_labile_C = 0.04
activation_energy_uptake_rate = 47000
half_sat_labile_C_uptake = 0.364
activation_energy_uptake_saturation = 30000
max_uptake_rate_ammonium = 5e-3
half_sat_ammonium_uptake = 0.02275
max_uptake_rate_nitrate = 5e-4
half_sat_nitrate_uptake = 0.02275
max_uptake_rate_labile_p = 0.0025
half_sat_labile_p_uptake = 0.02275
turnover_rate = 0.005
activation_energy_turnover = 20000
c_n_ratio = 5.2
c_p_ratio = 16

[[soil.microbial_group_definition]]
name = "fungi"
max_uptake_rate_labile_C = 0.04
activation_energy_uptake_rate = 47000
half_sat_labile_C_uptake = 0.364
activation_energy_uptake_saturation = 30000
max_uptake_rate_ammonium = 5e-3
half_sat_ammonium_uptake = 0.02275
max_uptake_rate_nitrate = 5e-4
half_sat_nitrate_uptake = 0.02275
max_uptake_rate_labile_p = 0.0025
half_sat_labile_p_uptake = 0.02275
turnover_rate = 0.005
activation_energy_turnover = 20000
c_n_ratio = 5.2
c_p_ratio = 16

[[soil.microbial_group_definition]]
name = "archaea"
max_uptake_rate_labile_C = 0.04
activation_energy_uptake_rate = 47000
half_sat_labile_C_uptake = 0.364
activation_energy_uptake_saturation = 30000
max_uptake_rate_ammonium = 5e-3
half_sat_ammonium_uptake = 0.02275
max_uptake_rate_nitrate = 5e-4
half_sat_nitrate_uptake = 0.02275
max_uptake_rate_labile_p = 0.0025
half_sat_labile_p_uptake = 0.02275
turnover_rate = 0.005
activation_energy_turnover = 20000
c_n_ratio = 5.2
c_p_ratio = 16
""",
[
(
CRITICAL,
"The following microbial groups are not valid: archaea",
),
],
id="unexpected_archaea",
),
pytest.param(
"""
[[soil.microbial_group_definition]]
name = "bacteria"
max_uptake_rate_labile_C = 0.04
activation_energy_uptake_rate = 47000
half_sat_labile_C_uptake = 0.364
activation_energy_uptake_saturation = 30000
max_uptake_rate_ammonium = 5e-3
half_sat_ammonium_uptake = 0.02275
max_uptake_rate_nitrate = 5e-4
half_sat_nitrate_uptake = 0.02275
max_uptake_rate_labile_p = 0.0025
half_sat_labile_p_uptake = 0.02275
turnover_rate = 0.005
activation_energy_turnover = 20000
c_n_ratio = 5.2
c_p_ratio = 16

[[soil.microbial_group_definition]]
name = "archaea"
max_uptake_rate_labile_C = 0.04
activation_energy_uptake_rate = 47000
half_sat_labile_C_uptake = 0.364
activation_energy_uptake_saturation = 30000
max_uptake_rate_ammonium = 5e-3
half_sat_ammonium_uptake = 0.02275
max_uptake_rate_nitrate = 5e-4
half_sat_nitrate_uptake = 0.02275
max_uptake_rate_labile_p = 0.0025
half_sat_labile_p_uptake = 0.02275
turnover_rate = 0.005
activation_energy_turnover = 20000
c_n_ratio = 5.2
c_p_ratio = 16
""",
[
(
CRITICAL,
"The following expected soil microbial groups are not defined: "
"fungi",
),
(
CRITICAL,
"The following microbial groups are not valid: archaea",
),
],
id="missing_fungi_and_unexpected_archaea",
),
],
)
def test_make_full_set_of_microbial_groups_errors(caplog, cfg_strings, exp_log):
"""Check that bad configs generate errors during microbial group generation."""
from virtual_ecosystem.models.soil.microbial_groups import (
make_full_set_of_microbial_groups,
)

config = Config(cfg_strings=cfg_strings)
caplog.clear()

with pytest.raises(ConfigurationError):
_ = make_full_set_of_microbial_groups(config)

log_check(caplog, exp_log)
Loading