From 82a7ba9a0921a077ebab4d17636372126bbb4883 Mon Sep 17 00:00:00 2001 From: Sarah Jordan Date: Tue, 23 Apr 2024 11:32:10 -0500 Subject: [PATCH 1/5] change updateable static variable --- tests/test_6_nsm_module.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_6_nsm_module.py b/tests/test_6_nsm_module.py index 144816c..93daf42 100644 --- a/tests/test_6_nsm_module.py +++ b/tests/test_6_nsm_module.py @@ -65,7 +65,7 @@ def nutrient_budget_instance( return NutrientBudget( time_steps=time_steps, initial_state_values=initial_nsm1_state, - updateable_static_variables=['a10'], + updateable_static_variables=['vson'], time_dim='nsm1_time_step', ) @@ -87,7 +87,7 @@ def test_nsm1_specific_attributes(nutrient_budget_instance) -> None: assert isinstance(nutrient_budget_instance.global_parameters, dict) assert isinstance(nutrient_budget_instance.global_vars, dict) - assert nutrient_budget_instance.updateable_static_variables == ['a10'] + assert nutrient_budget_instance.updateable_static_variables == ['vson'] assert nutrient_budget_instance.algae_parameters == DEFAULT_ALGAE assert nutrient_budget_instance.alkalinity_parameters == DEFAULT_ALKALINITY From 1efe7ff86e31fe5872ffc3f6cec80b38734a4f4b Mon Sep 17 00:00:00 2001 From: kewalak Date: Wed, 8 May 2024 16:38:14 -0700 Subject: [PATCH 2/5] balgae tests 33 passing test for the benthic algae module --- .../nsm1/balgae/processes.py | 8 +- tests/test_8_nsm_balgae_calculationsy.py | 1985 +++++++++++++++++ 2 files changed, 1989 insertions(+), 4 deletions(-) create mode 100644 tests/test_8_nsm_balgae_calculationsy.py diff --git a/src/clearwater_modules/nsm1/balgae/processes.py b/src/clearwater_modules/nsm1/balgae/processes.py index f582708..abcb67c 100644 --- a/src/clearwater_modules/nsm1/balgae/processes.py +++ b/src/clearwater_modules/nsm1/balgae/processes.py @@ -15,7 +15,7 @@ def mub_max_tc( """Calculate mub_max_tc: Maximum benthic algal growth rate with temperature correction (1/d). Args: - mu_max_20: Maximum benthic algal growth rate at 20C (1/d) + mub_max_20: Maximum benthic algal growth rate at 20C (1/d) TwaterC: Water temperature (C) """ return arrhenius_correction(TwaterC, mub_max_20, 1.047) @@ -162,7 +162,7 @@ def FNb( """ FNb = xr.where(use_NH4 or use_NO3, (NH4 + NO3) / (KsNb + NH4 + NO3),1) FNb = xr.where(math.isnan(FNb),0.0, - xr.where(FNb < 1.0, 1, FNb)) + xr.where(FNb > 1.0, 1, FNb)) return FNb @@ -230,12 +230,12 @@ def mub( FPb: Benthic algae phosphorous limitation (unitless) FNb: Benthic algae nitrogen limitation (unitless) FSb: Benthic density attenuation (unitless), - """ + """ # Benthic Local Specific Growth Rate return xr.where(b_growth_rate_option == 1, mub_max_tc * FLb * FPb * FNb * FSb, mub_max_tc * FLb * FSb * min(FPb, FNb)) - +#TODO RAS WQ has an option for harmonic which the FORTAN code does not have @numba.njit def AbGrowth( diff --git a/tests/test_8_nsm_balgae_calculationsy.py b/tests/test_8_nsm_balgae_calculationsy.py new file mode 100644 index 0000000..beb0fd4 --- /dev/null +++ b/tests/test_8_nsm_balgae_calculationsy.py @@ -0,0 +1,1985 @@ +from numba import ( + types, + typed, +) +import pytest + +from clearwater_modules.nsm1 import NutrientBudget +from clearwater_modules.nsm1.constants import ( + AlgaeStaticVariables, + AlkalinityStaticVariables, + BalgaeStaticVariables, + NitrogenStaticVariables, + CarbonStaticVariables, + CBODStaticVariables, + DOXStaticVariables, + N2StaticVariables, + POMStaticVariables, + PathogenStaticVariables, + PhosphorusStaticVariables, + GlobalParameters, + GlobalVars +) + + +@pytest.fixture(scope='function') +def initial_nsm1_state() -> dict[str, float]: + """Return initial state values for the model.""" + return { + + 'Ap': 36.77, + 'Ab': 24, + 'NH4': 0.063, + 'NO3': 5.54, + 'OrgN': 1.7, + 'N2': 1, + 'TIP': 0.071, + 'OrgP': 0.25, + 'POC': 4.356, + 'DOC': 1, + 'DIC': 1, + 'POM': 10, + 'CBOD': 5, + 'DOX': 8, + 'PX': 1, + 'Alk': 1 + + } + +@pytest.fixture(scope='module') +def time_steps() -> int: + return 1 + +@pytest.fixture(scope='function') +def default_algae_params() -> AlgaeStaticVariables: + """Returns default algae static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return AlgaeStaticVariables( + AWd = 100, + AWc= 40, + AWn= 7.2, + AWp= 1, + AWa= 1000, + KL= 10, + KsN= 0.04, + KsP= 0.0012, + mu_max_20= 1, + kdp_20= 0.15, + krp_20= 0.2, + vsap= 0.15, + growth_rate_option = 1, + light_limitation_option = 1, + ) + +@pytest.fixture(scope='function') +def default_alkalinity_params() -> AlkalinityStaticVariables: + """Returns default alkalinity static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return AlkalinityStaticVariables( + r_alkaa = 14.0 / 106.0 / 12.0 / 1000.0, + r_alkan= 18.0 / 106.0 / 12.0 / 1000.0, + r_alkn = 2.0 / 14.0 / 1000.0, + r_alkden = 4.0 / 14.0 / 1000.0, + r_alkba = 14.0 / 106.0 / 12.0 / 1000.0, + r_alkbn =18.0 / 106.0 / 12.0 / 1000.0 + ) + +@pytest.fixture(scope='function') +def default_balgae_params() -> BalgaeStaticVariables: + """Returns default Benthic Algae static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return BalgaeStaticVariables( + BWd = 100, + BWc= 40, + BWn=7.2, + BWp= 1, + BWa= 5000, + KLb= 10, + KsNb= 0.25, + KsPb=0.125, + Ksb=10, + mub_max_20=0.4, + krb_20=0.2, + kdb_20=0.3, + b_growth_rate_option=1, + b_light_limitation_option=1, + Fw=0.9, + Fb=0.9 + ) + +@pytest.fixture(scope='function') +def default_nitrogen_params() -> NitrogenStaticVariables: + """Returns default nitrogen static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return NitrogenStaticVariables( + KNR= 0.6 , + knit_20= 0.1, + kon_20=0.1, + kdnit_20=0.002, + rnh4_20=0, + vno3_20=0, + KsOxdn=0.1, + PN=0.5, + PNb=0.5 + ) + +@pytest.fixture(scope='function') +def default_carbon_params() -> CarbonStaticVariables: + """Returns default carbon static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return CarbonStaticVariables( + f_pocp = 0.9, + kdoc_20= 0.01, + f_pocb=0.9, + kpoc_20= 0.005, + KsOxmc=1.0, + pCO2 = 383.0, + FCO2 = 0.2, + roc = 32.0/12.0 + ) + +@pytest.fixture(scope='function') +def default_CBOD_params() -> CBODStaticVariables: + """Returns default CBOD static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return CBODStaticVariables( + KsOxbod = 0.5, + kbod_20 = 0.12, + ksbod_20 = 0.0 + ) + +@pytest.fixture(scope='function') +def default_DOX_params() -> DOXStaticVariables: + """Returns default DOX static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return DOXStaticVariables( + ron = 2.0 * 32.0 / 14.0, + KsSOD =1, + ) + +@pytest.fixture(scope='function') +def default_N2_params() -> N2StaticVariables: + """Returns default N2 static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return N2StaticVariables( + + ) + +@pytest.fixture(scope='function') +def default_POM_params() -> POMStaticVariables: + """Returns default POM static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return POMStaticVariables( + kpom_20 = 0.1 + ) + +@pytest.fixture(scope='function') +def default_pathogen_params() -> PathogenStaticVariables: + """Returns default Pathogens static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return PathogenStaticVariables( + kdx_20=0.8, + apx=1, + vx=1 + ) + +@pytest.fixture(scope='function') +def default_phosphorus_params() -> PhosphorusStaticVariables: + """Returns default phosphorus static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return PhosphorusStaticVariables( + kop_20 = 0.1, + rpo4_20 =0, + kdpo4 = 0.0, + ) + +@pytest.fixture(scope='function') +def default_gp_params() -> GlobalParameters: + """Returns default global parameter static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return GlobalParameters( + use_NH4= True, + use_NO3= True, + use_OrgN= True, + use_OrgP = True, + use_TIP= True, + use_SedFlux= False, + use_POC = True, + use_DOC = True, + use_DOX= True, + use_DIC= True, + use_Algae= True, + use_Balgae= True, + use_N2 = True, + use_Pathogen = True, + use_Alk = True, + use_POM = True + ) + +@pytest.fixture(scope='function') +def default_gvars_params() -> GlobalVars: + """Returns default global variables static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return GlobalVars( + vson = 0.01, + vsoc = 0.01, + vsop = 999, + vs = 999, + SOD_20 = 999, + SOD_theta = 999, + vb = 0.01, + fcom = 0.4, + kaw_20_user = 999, + kah_20_user = 999, + hydraulic_reaeration_option = 2, + wind_reaeration_option = 2, + timestep = 1, #TODO Dynamic or static? + depth = 1.5, #TODO Dynamic or static? + TwaterC = 25, + theta = 1.047, + velocity = 1, + flow = 2, + topwidth = 1, + slope = 2, + shear_velocity = 4, + pressure_atm = 2, + wind_speed = 4, + q_solar = 500, + Solid = 1, + lambda0 = .02, + lambda1 = .0088, + lambda2 = .054, + lambdas = .052, + lambdam = .174, + Fr_PAR = .47 + ) + +def get_nutrient_budget_instance( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + +) -> NutrientBudget: + """Return an instance of the NSM1 class.""" + return NutrientBudget( + time_steps=time_steps, + initial_state_values=initial_nsm1_state, + algae_parameters=default_algae_params, + alkalinity_parameters=default_alkalinity_params, + balgae_parameters=default_balgae_params, + nitrogen_parameters=default_nitrogen_params, + carbon_parameters=default_carbon_params, + CBOD_parameters=default_CBOD_params, + DOX_parameters=default_DOX_params, + N2_parameters=default_N2_params, + POM_parameters=default_POM_params, + pathogen_parameters=default_pathogen_params, + phosphorus_parameters=default_phosphorus_params, + global_parameters=default_gp_params, + global_vars=default_gvars_params, + time_dim='nsm1_time_step', + ) + +@pytest.fixture(scope='module') +def tolerance() -> float: + """Controls the precision of the pytest.approx() function.""" + return 0.000001 + +def test_defaults( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel(nsm1_time_step=-1).Ab.values.item() + + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.82632 + +def test_changed_KLb( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['KLb'] = 15 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.74222 + +def test_changed_KsNb( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['KsNb'] = 0.4 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.81861 + +def test_changed_KsPb( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['KsPb'] = 0.05 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 9.01754 + +def test_changed_Ksb( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['Ksb'] = 20 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.99459 + +def test_changed_mub_max( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['mub_max_20'] = 1.5 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 9.67469 + +def test_changed_krb( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['krb_20'] = 0.01 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 14.92863 + +def test_changed_kdb( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['kdb_20'] = 0.8 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == -6.27152 + +def test_changed_Ab( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['Ab'] = 40 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 14.54599 + +def test_changed_NH4( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['NH4'] = 5 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.83262 + +def test_changed_NO3( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['NO3'] = 2 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.80525 + +def test_changed_TIP( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['TIP'] = 3 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 9.33539 + +def test_changed_TwaterC( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gvars_params['TwaterC'] = 30 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 4.39484 + +def test_changed_depth( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gvars_params['depth'] = 0.5 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 9.56564 + +def test_changed_Ap( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['Ap'] = 20 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.96109 + +def test_changed_lambda0( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gvars_params['lambda0'] = 5 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.51805 + +def test_changed_lambda1( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gvars_params['lambda1'] = 0.03 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.63363 + +def test_changed_lambda2( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gvars_params['lambda2'] = 1 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.51782 + +def test_changed_lambdam( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gvars_params['lambdam'] = 0.008 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 9.54539 + +def test_changed_POC( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['POC'] = 10 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.52808 + +def test_changed_fcom( + + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gvars_params['fcom'] = 0.25 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.58832 + +def test_changed_use_algae( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_Algae'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 9.22085 + +def test_changed_q_solar( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gvars_params['q_solar'] = 100 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.59497 + +def test_changed_use_TIP( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_TIP'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 9.36945 + +def test_changed_use_POC( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_POC'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 9.56670 + +def test_changed_use_NH4( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_NH4'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.82617 + +def test_changed_use_NO3( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_NO3'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.58268 + +def test_changed_use_NO3_use_NH4( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_NO3'] = False + default_gp_params['use_NH4'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.84008 + +def test_changed_g2_l1( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['b_growth_rate_option'] = 2 + default_balgae_params['b_light_limitation_option'] = 1 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.84008 + +def test_changed_g1_l2( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['b_growth_rate_option'] = 1 + default_balgae_params['b_light_limitation_option'] = 2 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.90818 + +def test_changed_g2_l2( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['b_growth_rate_option'] = 2 + default_balgae_params['b_light_limitation_option'] = 2 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.92559 + +def test_changed_g1_l3( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['b_growth_rate_option'] = 1 + default_balgae_params['b_light_limitation_option'] = 3 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 9.31883 + +def test_changed_g2_l3( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['b_growth_rate_option'] = 2 + default_balgae_params['b_light_limitation_option'] = 3 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 9.35457 \ No newline at end of file From e1e363d7edcc18cf76b16c78fad556888560658d Mon Sep 17 00:00:00 2001 From: kewalak Date: Wed, 8 May 2024 18:31:33 -0700 Subject: [PATCH 3/5] Nitrogen Test One working test for nitroge --- .../nsm1/{ => old}/CBOD/dynamic_variables.py | 0 .../nsm1/{ => old}/CBOD/processes.py | 0 .../nsm1/{ => old}/CBOD/static_variables.py | 0 .../nsm1/{ => old}/DOX/dynamic_variables.py | 0 .../nsm1/{ => old}/DOX/processes.py | 0 .../nsm1/{ => old}/DOX/static_variables.py | 0 .../nsm1/{ => old}/POM/dynamic_variables.py | 0 .../nsm1/{ => old}/POM/processes.py | 0 .../nsm1/{ => old}/POM/static_variables.py | 0 .../nsm1/{ => old}/algae/dynamic_variables.py | 0 .../nsm1/{ => old}/algae/processes.py | 0 .../nsm1/{ => old}/algae/static_variables.py | 0 .../{ => old}/alkalinity/dynamic_variables.py | 0 .../nsm1/{ => old}/alkalinity/processes.py | 0 .../{ => old}/alkalinity/static_variables.py | 0 .../{ => old}/balgae/dynamic_variables.py | 0 .../nsm1/{ => old}/balgae/processes.py | 0 .../nsm1/{ => old}/balgae/static_variables.py | 0 .../{ => old}/carbon/dynamic_variables.py | 0 .../nsm1/{ => old}/carbon/processes.py | 0 .../nsm1/{ => old}/carbon/static_variables.py | 0 .../nsm1/{ => old}/n2/dynamic_variables.py | 0 .../nsm1/{ => old}/n2/processes.py | 0 .../nsm1/{ => old}/n2/static_variables.py | 0 .../{ => old}/nitrogen/dynamic_variables.py | 0 .../nsm1/{ => old}/nitrogen/processes.py | 0 .../{ => old}/nitrogen/static_variables.py | 0 .../{ => old}/pathogens/dynamic_variables.py | 0 .../nsm1/{ => old}/pathogens/processes.py | 0 .../{ => old}/pathogens/static_variables.py | 0 .../{ => old}/phosphorus/dynamic_variables.py | 0 .../nsm1/{ => old}/phosphorus/processes.py | 0 .../{ => old}/phosphorus/static_variables.py | 0 .../{ => old}/sedflux/dynamic_variables.py | 0 .../nsm1/{ => old}/sedflux/processes.py | 0 .../nsm1/{ => old}/sedflux/static_variable.py | 0 src/clearwater_modules/nsm1/processes.py | 10 +- ...y.py => test_8_nsm_balgae_calculations.py} | 0 tests/test_9_nsm_nitrogen_calculations.py | 474 ++++++++++++++++++ 39 files changed, 481 insertions(+), 3 deletions(-) rename src/clearwater_modules/nsm1/{ => old}/CBOD/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/CBOD/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/CBOD/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/DOX/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/DOX/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/DOX/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/POM/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/POM/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/POM/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/algae/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/algae/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/algae/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/alkalinity/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/alkalinity/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/alkalinity/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/balgae/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/balgae/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/balgae/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/carbon/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/carbon/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/carbon/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/n2/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/n2/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/n2/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/nitrogen/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/nitrogen/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/nitrogen/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/pathogens/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/pathogens/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/pathogens/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/phosphorus/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/phosphorus/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/phosphorus/static_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/sedflux/dynamic_variables.py (100%) rename src/clearwater_modules/nsm1/{ => old}/sedflux/processes.py (100%) rename src/clearwater_modules/nsm1/{ => old}/sedflux/static_variable.py (100%) rename tests/{test_8_nsm_balgae_calculationsy.py => test_8_nsm_balgae_calculations.py} (100%) create mode 100644 tests/test_9_nsm_nitrogen_calculations.py diff --git a/src/clearwater_modules/nsm1/CBOD/dynamic_variables.py b/src/clearwater_modules/nsm1/old/CBOD/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/CBOD/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/CBOD/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/CBOD/processes.py b/src/clearwater_modules/nsm1/old/CBOD/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/CBOD/processes.py rename to src/clearwater_modules/nsm1/old/CBOD/processes.py diff --git a/src/clearwater_modules/nsm1/CBOD/static_variables.py b/src/clearwater_modules/nsm1/old/CBOD/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/CBOD/static_variables.py rename to src/clearwater_modules/nsm1/old/CBOD/static_variables.py diff --git a/src/clearwater_modules/nsm1/DOX/dynamic_variables.py b/src/clearwater_modules/nsm1/old/DOX/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/DOX/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/DOX/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/DOX/processes.py b/src/clearwater_modules/nsm1/old/DOX/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/DOX/processes.py rename to src/clearwater_modules/nsm1/old/DOX/processes.py diff --git a/src/clearwater_modules/nsm1/DOX/static_variables.py b/src/clearwater_modules/nsm1/old/DOX/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/DOX/static_variables.py rename to src/clearwater_modules/nsm1/old/DOX/static_variables.py diff --git a/src/clearwater_modules/nsm1/POM/dynamic_variables.py b/src/clearwater_modules/nsm1/old/POM/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/POM/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/POM/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/POM/processes.py b/src/clearwater_modules/nsm1/old/POM/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/POM/processes.py rename to src/clearwater_modules/nsm1/old/POM/processes.py diff --git a/src/clearwater_modules/nsm1/POM/static_variables.py b/src/clearwater_modules/nsm1/old/POM/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/POM/static_variables.py rename to src/clearwater_modules/nsm1/old/POM/static_variables.py diff --git a/src/clearwater_modules/nsm1/algae/dynamic_variables.py b/src/clearwater_modules/nsm1/old/algae/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/algae/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/algae/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/algae/processes.py b/src/clearwater_modules/nsm1/old/algae/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/algae/processes.py rename to src/clearwater_modules/nsm1/old/algae/processes.py diff --git a/src/clearwater_modules/nsm1/algae/static_variables.py b/src/clearwater_modules/nsm1/old/algae/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/algae/static_variables.py rename to src/clearwater_modules/nsm1/old/algae/static_variables.py diff --git a/src/clearwater_modules/nsm1/alkalinity/dynamic_variables.py b/src/clearwater_modules/nsm1/old/alkalinity/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/alkalinity/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/alkalinity/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/alkalinity/processes.py b/src/clearwater_modules/nsm1/old/alkalinity/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/alkalinity/processes.py rename to src/clearwater_modules/nsm1/old/alkalinity/processes.py diff --git a/src/clearwater_modules/nsm1/alkalinity/static_variables.py b/src/clearwater_modules/nsm1/old/alkalinity/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/alkalinity/static_variables.py rename to src/clearwater_modules/nsm1/old/alkalinity/static_variables.py diff --git a/src/clearwater_modules/nsm1/balgae/dynamic_variables.py b/src/clearwater_modules/nsm1/old/balgae/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/balgae/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/balgae/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/balgae/processes.py b/src/clearwater_modules/nsm1/old/balgae/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/balgae/processes.py rename to src/clearwater_modules/nsm1/old/balgae/processes.py diff --git a/src/clearwater_modules/nsm1/balgae/static_variables.py b/src/clearwater_modules/nsm1/old/balgae/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/balgae/static_variables.py rename to src/clearwater_modules/nsm1/old/balgae/static_variables.py diff --git a/src/clearwater_modules/nsm1/carbon/dynamic_variables.py b/src/clearwater_modules/nsm1/old/carbon/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/carbon/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/carbon/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/carbon/processes.py b/src/clearwater_modules/nsm1/old/carbon/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/carbon/processes.py rename to src/clearwater_modules/nsm1/old/carbon/processes.py diff --git a/src/clearwater_modules/nsm1/carbon/static_variables.py b/src/clearwater_modules/nsm1/old/carbon/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/carbon/static_variables.py rename to src/clearwater_modules/nsm1/old/carbon/static_variables.py diff --git a/src/clearwater_modules/nsm1/n2/dynamic_variables.py b/src/clearwater_modules/nsm1/old/n2/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/n2/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/n2/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/n2/processes.py b/src/clearwater_modules/nsm1/old/n2/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/n2/processes.py rename to src/clearwater_modules/nsm1/old/n2/processes.py diff --git a/src/clearwater_modules/nsm1/n2/static_variables.py b/src/clearwater_modules/nsm1/old/n2/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/n2/static_variables.py rename to src/clearwater_modules/nsm1/old/n2/static_variables.py diff --git a/src/clearwater_modules/nsm1/nitrogen/dynamic_variables.py b/src/clearwater_modules/nsm1/old/nitrogen/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/nitrogen/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/nitrogen/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/nitrogen/processes.py b/src/clearwater_modules/nsm1/old/nitrogen/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/nitrogen/processes.py rename to src/clearwater_modules/nsm1/old/nitrogen/processes.py diff --git a/src/clearwater_modules/nsm1/nitrogen/static_variables.py b/src/clearwater_modules/nsm1/old/nitrogen/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/nitrogen/static_variables.py rename to src/clearwater_modules/nsm1/old/nitrogen/static_variables.py diff --git a/src/clearwater_modules/nsm1/pathogens/dynamic_variables.py b/src/clearwater_modules/nsm1/old/pathogens/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/pathogens/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/pathogens/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/pathogens/processes.py b/src/clearwater_modules/nsm1/old/pathogens/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/pathogens/processes.py rename to src/clearwater_modules/nsm1/old/pathogens/processes.py diff --git a/src/clearwater_modules/nsm1/pathogens/static_variables.py b/src/clearwater_modules/nsm1/old/pathogens/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/pathogens/static_variables.py rename to src/clearwater_modules/nsm1/old/pathogens/static_variables.py diff --git a/src/clearwater_modules/nsm1/phosphorus/dynamic_variables.py b/src/clearwater_modules/nsm1/old/phosphorus/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/phosphorus/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/phosphorus/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/phosphorus/processes.py b/src/clearwater_modules/nsm1/old/phosphorus/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/phosphorus/processes.py rename to src/clearwater_modules/nsm1/old/phosphorus/processes.py diff --git a/src/clearwater_modules/nsm1/phosphorus/static_variables.py b/src/clearwater_modules/nsm1/old/phosphorus/static_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/phosphorus/static_variables.py rename to src/clearwater_modules/nsm1/old/phosphorus/static_variables.py diff --git a/src/clearwater_modules/nsm1/sedflux/dynamic_variables.py b/src/clearwater_modules/nsm1/old/sedflux/dynamic_variables.py similarity index 100% rename from src/clearwater_modules/nsm1/sedflux/dynamic_variables.py rename to src/clearwater_modules/nsm1/old/sedflux/dynamic_variables.py diff --git a/src/clearwater_modules/nsm1/sedflux/processes.py b/src/clearwater_modules/nsm1/old/sedflux/processes.py similarity index 100% rename from src/clearwater_modules/nsm1/sedflux/processes.py rename to src/clearwater_modules/nsm1/old/sedflux/processes.py diff --git a/src/clearwater_modules/nsm1/sedflux/static_variable.py b/src/clearwater_modules/nsm1/old/sedflux/static_variable.py similarity index 100% rename from src/clearwater_modules/nsm1/sedflux/static_variable.py rename to src/clearwater_modules/nsm1/old/sedflux/static_variable.py diff --git a/src/clearwater_modules/nsm1/processes.py b/src/clearwater_modules/nsm1/processes.py index 3837b07..11dfb34 100644 --- a/src/clearwater_modules/nsm1/processes.py +++ b/src/clearwater_modules/nsm1/processes.py @@ -704,7 +704,7 @@ def mub_max_tc( """Calculate mub_max_tc: Maximum benthic algal growth rate with temperature correction (1/d). Args: - mu_max_20: Maximum benthic algal growth rate at 20C (1/d) + mub_max_20: Maximum benthic algal growth rate at 20C (1/d) TwaterC: Water temperature (C) """ return arrhenius_correction(TwaterC, mub_max_20, 1.047) @@ -1169,7 +1169,7 @@ def kon_tc( kon_20: Decay rate of OrgN to NH4 (1/d) """ - return arrhenius_correction(TwaterC, kon_20, 1.074) + return arrhenius_correction(TwaterC, kon_20, 1.047) @@ -1490,6 +1490,8 @@ def NH4_ApGrowth( def NH4_AbRespiration( use_Balgae: bool, rnb: xr.DataArray, + Fb: xr.DataArray, + depth: xr.DataArray, AbRespiration: xr.DataArray, ) -> xr.DataArray: @@ -1499,10 +1501,12 @@ def NH4_AbRespiration( use_Balgae: true/false to use benthic algae module (unitless), rnb: xr.DataArray, AbRespiration: Benthic algal respiration rate (g/m^2/d), + depth: water depth (m), + Fb: Fraction of bottom area for benthic algae (unitless), """ # TODO changed the calculation for respiration from the inital FORTRAN due to conflict with the reference guide - return xr.where(use_Balgae, rnb * AbRespiration, 0.0 ) + return xr.where(use_Balgae, (rnb * AbRespiration*Fb)/depth, 0.0 ) def NH4_AbGrowth( use_Balgae: bool, diff --git a/tests/test_8_nsm_balgae_calculationsy.py b/tests/test_8_nsm_balgae_calculations.py similarity index 100% rename from tests/test_8_nsm_balgae_calculationsy.py rename to tests/test_8_nsm_balgae_calculations.py diff --git a/tests/test_9_nsm_nitrogen_calculations.py b/tests/test_9_nsm_nitrogen_calculations.py new file mode 100644 index 0000000..0ead854 --- /dev/null +++ b/tests/test_9_nsm_nitrogen_calculations.py @@ -0,0 +1,474 @@ +from numba import ( + types, + typed, +) +import pytest + +from clearwater_modules.nsm1 import NutrientBudget +from clearwater_modules.nsm1.constants import ( + AlgaeStaticVariables, + AlkalinityStaticVariables, + BalgaeStaticVariables, + NitrogenStaticVariables, + CarbonStaticVariables, + CBODStaticVariables, + DOXStaticVariables, + N2StaticVariables, + POMStaticVariables, + PathogenStaticVariables, + PhosphorusStaticVariables, + GlobalParameters, + GlobalVars +) + + +@pytest.fixture(scope='function') +def initial_nsm1_state() -> dict[str, float]: + """Return initial state values for the model.""" + return { + + 'Ap': 36.77, + 'Ab': 24, + 'NH4': 0.063, + 'NO3': 5.54, + 'OrgN': 1.726, + 'N2': 1, + 'TIP': 0.071, + 'OrgP': 0.25, + 'POC': 4.356, + 'DOC': 1, + 'DIC': 1, + 'POM': 10, + 'CBOD': 5, + 'DOX': 8, + 'PX': 1, + 'Alk': 1 + + } + +@pytest.fixture(scope='module') +def time_steps() -> int: + return 1 + +@pytest.fixture(scope='function') +def default_algae_params() -> AlgaeStaticVariables: + """Returns default algae static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return AlgaeStaticVariables( + AWd = 100, + AWc= 40, + AWn= 7.2, + AWp= 1, + AWa= 1000, + KL= 10, + KsN= 0.04, + KsP= 0.0012, + mu_max_20= 1, + kdp_20= 0.15, + krp_20= 0.2, + vsap= 0.15, + growth_rate_option = 1, + light_limitation_option = 1, + ) + +@pytest.fixture(scope='function') +def default_alkalinity_params() -> AlkalinityStaticVariables: + """Returns default alkalinity static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return AlkalinityStaticVariables( + r_alkaa = 14.0 / 106.0 / 12.0 / 1000.0, + r_alkan= 18.0 / 106.0 / 12.0 / 1000.0, + r_alkn = 2.0 / 14.0 / 1000.0, + r_alkden = 4.0 / 14.0 / 1000.0, + r_alkba = 14.0 / 106.0 / 12.0 / 1000.0, + r_alkbn =18.0 / 106.0 / 12.0 / 1000.0 + ) + +@pytest.fixture(scope='function') +def default_balgae_params() -> BalgaeStaticVariables: + """Returns default Benthic Algae static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return BalgaeStaticVariables( + BWd = 100, + BWc= 40, + BWn=7.2, + BWp= 1, + BWa= 5000, + KLb= 10, + KsNb= 0.25, + KsPb=0.125, + Ksb=10, + mub_max_20=0.4, + krb_20=0.2, + kdb_20=0.3, + b_growth_rate_option=1, + b_light_limitation_option=1, + Fw=0.9, + Fb=0.9 + ) + +@pytest.fixture(scope='function') +def default_nitrogen_params() -> NitrogenStaticVariables: + """Returns default nitrogen static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return NitrogenStaticVariables( + KNR= 0.6 , + knit_20= 0.1, + kon_20=0.1, + kdnit_20=0.002, + rnh4_20=0, + vno3_20=0, + KsOxdn=0.1, + PN=0.5, + PNb=0.5 + ) + +@pytest.fixture(scope='function') +def default_carbon_params() -> CarbonStaticVariables: + """Returns default carbon static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return CarbonStaticVariables( + f_pocp = 0.9, + kdoc_20= 0.01, + f_pocb=0.9, + kpoc_20= 0.005, + KsOxmc=1.0, + pCO2 = 383.0, + FCO2 = 0.2, + roc = 32.0/12.0 + ) + +@pytest.fixture(scope='function') +def default_CBOD_params() -> CBODStaticVariables: + """Returns default CBOD static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return CBODStaticVariables( + KsOxbod = 0.5, + kbod_20 = 0.12, + ksbod_20 = 0.0 + ) + +@pytest.fixture(scope='function') +def default_DOX_params() -> DOXStaticVariables: + """Returns default DOX static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return DOXStaticVariables( + ron = 2.0 * 32.0 / 14.0, + KsSOD =1, + ) + +@pytest.fixture(scope='function') +def default_N2_params() -> N2StaticVariables: + """Returns default N2 static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return N2StaticVariables( + + ) + +@pytest.fixture(scope='function') +def default_POM_params() -> POMStaticVariables: + """Returns default POM static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return POMStaticVariables( + kpom_20 = 0.1 + ) + +@pytest.fixture(scope='function') +def default_pathogen_params() -> PathogenStaticVariables: + """Returns default Pathogens static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return PathogenStaticVariables( + kdx_20=0.8, + apx=1, + vx=1 + ) + +@pytest.fixture(scope='function') +def default_phosphorus_params() -> PhosphorusStaticVariables: + """Returns default phosphorus static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return PhosphorusStaticVariables( + kop_20 = 0.1, + rpo4_20 =0, + kdpo4 = 0.0, + ) + +@pytest.fixture(scope='function') +def default_gp_params() -> GlobalParameters: + """Returns default global parameter static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return GlobalParameters( + use_NH4= True, + use_NO3= True, + use_OrgN= True, + use_OrgP = True, + use_TIP= False, + use_SedFlux= False, + use_POC = False, + use_DOC = True, + use_DOX= True, + use_DIC= True, + use_Algae= True, + use_Balgae= True, + use_N2 = True, + use_Pathogen = True, + use_Alk = True, + use_POM = True + ) + +@pytest.fixture(scope='function') +def default_gvars_params() -> GlobalVars: + """Returns default global variables static variable values for the model. + + NOTE: As of now (3/18/2022) these match the built in defaults, but are + copied here to allow for easy modification of the defaults in the future. + + Returns a typed dictionary, with string keys and float values. + """ + return GlobalVars( + vson = 0.01, + vsoc = 0.01, + vsop = 999, + vs = 999, + SOD_20 = 999, + SOD_theta = 999, + vb = 0.01, + fcom = 0.4, + kaw_20_user = 999, + kah_20_user = 999, + hydraulic_reaeration_option = 2, + wind_reaeration_option = 2, + timestep = 1, #TODO Dynamic or static? + depth = 1.5, #TODO Dynamic or static? + TwaterC = 25, + theta = 1.047, + velocity = 1, + flow = 150, + topwidth = 100, + slope = 0.0002, + shear_velocity = 0.05334, + pressure_atm = 1, + wind_speed = 3, + q_solar = 500, + Solid = 1, + lambda0 = .02, + lambda1 = .0088, + lambda2 = .054, + lambdas = .052, + lambdam = .174, + Fr_PAR = .47 + ) + +def get_nutrient_budget_instance( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + +) -> NutrientBudget: + """Return an instance of the NSM1 class.""" + return NutrientBudget( + time_steps=time_steps, + initial_state_values=initial_nsm1_state, + algae_parameters=default_algae_params, + alkalinity_parameters=default_alkalinity_params, + balgae_parameters=default_balgae_params, + nitrogen_parameters=default_nitrogen_params, + carbon_parameters=default_carbon_params, + CBOD_parameters=default_CBOD_params, + DOX_parameters=default_DOX_params, + N2_parameters=default_N2_params, + POM_parameters=default_POM_params, + pathogen_parameters=default_pathogen_params, + phosphorus_parameters=default_phosphorus_params, + global_parameters=default_gp_params, + global_vars=default_gvars_params, + time_dim='nsm1_time_step', + ) + +@pytest.fixture(scope='module') +def tolerance() -> float: + """Controls the precision of the pytest.approx() function.""" + return 0.000001 + +def test_defaults( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel(nsm1_time_step=-1).NH4.values.item() + + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.6101494 + + + ''' + NO3 = nsm1.dataset.isel(nsm1_time_step=-1).NO3.values.item() + + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.12614 + + OrgN = nsm1.dataset.isel(nsm1_time_step=-1).OrgN.values.item() + + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.89950 + ''' + +''' +def test_changed_KLb( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['KLb'] = 15 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + Ab = nsm1.dataset.isel( + nsm1_time_step=-1).Ab.values.item() + assert isinstance(Ab, float) + assert pytest.approx(Ab, tolerance) == 8.74222 +''' From 0ff1effd77cc42be4b5f12a777aaec857ec79549 Mon Sep 17 00:00:00 2001 From: kewalak Date: Thu, 9 May 2024 14:28:14 -0700 Subject: [PATCH 4/5] Update to Nitrogen Tests --- tests/test_9_nsm_nitrogen_calculations.py | 91 ++++++++++++++++++++--- 1 file changed, 79 insertions(+), 12 deletions(-) diff --git a/tests/test_9_nsm_nitrogen_calculations.py b/tests/test_9_nsm_nitrogen_calculations.py index 0ead854..fd40a4a 100644 --- a/tests/test_9_nsm_nitrogen_calculations.py +++ b/tests/test_9_nsm_nitrogen_calculations.py @@ -409,21 +409,17 @@ def test_defaults( assert isinstance(NH4, float) assert pytest.approx(NH4, tolerance) == 0.6101494 - - ''' NO3 = nsm1.dataset.isel(nsm1_time_step=-1).NO3.values.item() assert isinstance(NO3, float) - assert pytest.approx(NO3, tolerance) == 5.12614 + assert pytest.approx(NO3, tolerance) == 5.1260636 OrgN = nsm1.dataset.isel(nsm1_time_step=-1).OrgN.values.item() assert isinstance(OrgN, float) - assert pytest.approx(OrgN, tolerance) == 1.89950 - ''' + assert pytest.approx(OrgN, tolerance) == 1.899502 -''' -def test_changed_KLb( +def test_changed_knit( time_steps, initial_nsm1_state, default_algae_params, @@ -444,7 +440,7 @@ def test_changed_KLb( """Test the model with default parameters.""" # alter parameters as necessary initial_state_dict = initial_nsm1_state - default_balgae_params['KLb'] = 15 + default_nitrogen_params['knit_20'] = 10 # instantiate the model nsm1: NutrientBudget = get_nutrient_budget_instance( @@ -467,8 +463,79 @@ def test_changed_KLb( # Run the model nsm1.increment_timestep() - Ab = nsm1.dataset.isel( - nsm1_time_step=-1).Ab.values.item() - assert isinstance(Ab, float) - assert pytest.approx(Ab, tolerance) == 8.74222 + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == -0.3114223 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 6.0476352 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.8995017 + ''' +def test_changed_use_NH4( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_NH4'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.063 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.51575 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.8995017 + +''' \ No newline at end of file From ca28ae8fee302c1507316e44b6fe28798d17f340 Mon Sep 17 00:00:00 2001 From: kewalak Date: Mon, 3 Jun 2024 13:04:33 -0700 Subject: [PATCH 5/5] Nitrogen Test Tests comparted against FORTRAN code and HEC-RAS WQ. All cases match HEC-RAS WQ besides adjustments to variables use_NH4 and use_NO3 which matches FORTRAN code. --- src/clearwater_modules/nsm1/processes.py | 29 +- tests/test_9_nsm_nitrogen_calculations.py | 1428 ++++++++++++++++++++- 2 files changed, 1436 insertions(+), 21 deletions(-) diff --git a/src/clearwater_modules/nsm1/processes.py b/src/clearwater_modules/nsm1/processes.py index 11dfb34..ca9fa10 100644 --- a/src/clearwater_modules/nsm1/processes.py +++ b/src/clearwater_modules/nsm1/processes.py @@ -314,7 +314,7 @@ def rna( AWn: xr.DataArray, AWa: xr.DataArray ) -> xr.DataArray: - """Calculate rna (mg-N/ug-Chla). + """Calculate rna (mg-N/ug-Chla) using Redfield ratios. Args: AWn: Nitrogen Weight (mg) @@ -328,7 +328,7 @@ def rpa( AWp: xr.DataArray, AWa: xr.DataArray ) -> xr.DataArray: - """Calculate rpa (mg-P/ug-Chla). + """Calculate rpa (mg-P/ug-Chla) using Redfield ratios. Args: AWp: Phosphorus Weight (mg) @@ -343,7 +343,7 @@ def rca( AWc: xr.DataArray, AWa: xr.DataArray ) -> xr.DataArray: - """Calculate rca (mg-C/ug-Chla). + """Calculate rca (mg-C/ug-Chla) using Redfield ratios. Args: AWc: Carbon Weight (mg) @@ -357,7 +357,7 @@ def rda( AWd: xr.DataArray, AWa: xr.DataArray ) -> xr.DataArray: - """Calculate rda (mg-D/ug-Chla). + """Calculate rda (mg-D/ug-Chla) using Redfield ratios. Args: AWd: Dry Algal Weight (mg) @@ -743,7 +743,7 @@ def rnb( BWn: xr.DataArray, BWd: xr.DataArray ) -> xr.DataArray: - """Calculate rnb (mg-N/mg-D). + """Calculate rnb (mg-N/mg-D) using Redfield ratios. Args: BWn: Benthic algae nitrogen (unitless) @@ -757,7 +757,7 @@ def rpb( BWp: xr.DataArray, BWd: xr.DataArray ) -> xr.DataArray: - """Calculate rpd: Benthic algae phosphorus to dry weight ratio (mg-P/mg-D). + """Calculate rpd: Benthic algae phosphorus to dry weight ratio (mg-P/mg-D) using Redfield ratios. Args: BWp: Benthic algae phosphorus (mg-P) @@ -771,7 +771,7 @@ def rcb( BWc: xr.DataArray, BWd: xr.DataArray ) -> xr.DataArray: - """Calculate rcb: Benthic algae carbon to dry weight ratio (mg-C/mg-D). + """Calculate rcb: Benthic algae carbon to dry weight ratio (mg-C/mg-D) using Redfield ratios. Args: BWc: Benthic algae carbon (mg-C) @@ -785,7 +785,7 @@ def rab( BWa: xr.DataArray, BWd: xr.DataArray ) -> xr.DataArray: - """Calculate rab: Benthic algae chlorophyll-a to dry weight ratio (ug-Chla-a/mg-D). + """Calculate rab: Benthic algae chlorophyll-a to dry weight ratio (ug-Chla-a/mg-D) using Redfield ratios. Args: BWa: Benthic algae chlorophyll-a (ug-Chla-a) @@ -906,7 +906,8 @@ def FNb( default = FNb_orig ) - + + return FNb @@ -1012,7 +1013,7 @@ def mub( default = 0 ) - + return mub @@ -1100,7 +1101,7 @@ def Chlb( Ab: xr.DataArray, ) -> xr.DataArray: - """Calculate chlorophyll-a concentration (mg-Chla/m^2) + """Calculate chlorophyll-a concentration (mg-Chla/m^2) using Redfield ratios Args: rab: Balgae Chla to Dry ratio (mg-D/ug-Chla) @@ -1434,7 +1435,7 @@ def NH4_Nitrification( knit_tc: Nitrification rate ammonia decay NH4 to NO3 temperature correction (1/d). NH4: Ammonium concentration (mg-N/L), """ - + print("NH4_Nitrification", NH4_Nitrification) return xr.where(use_NH4,NitrificationInhibition * knit_tc * NH4,0) @@ -1484,7 +1485,6 @@ def NH4_ApGrowth( ApGrowth: Algal growth rate (ug-Chla/L/d), ApUptakeFr_NH4: Fraction of actual xr.DataArraying algal uptake from ammonia pool """ - return xr.where(use_Algae, ApUptakeFr_NH4 * rna * ApGrowth, 0.0) def NH4_AbRespiration( @@ -1709,7 +1709,6 @@ def dNO3dt( """ - return xr.where(use_NO3, NH4_Nitrification - NO3_Denit - NO3_BedDenit - NO3_ApGrowth - NO3_AbGrowth ,0) @@ -1948,8 +1947,6 @@ def DIPfromBed( """ return rpo4_tc / depth -#TODO calcuate fdp? - def TIP_Settling( vs: xr.DataArray, depth: xr.DataArray, diff --git a/tests/test_9_nsm_nitrogen_calculations.py b/tests/test_9_nsm_nitrogen_calculations.py index fd40a4a..37147c2 100644 --- a/tests/test_9_nsm_nitrogen_calculations.py +++ b/tests/test_9_nsm_nitrogen_calculations.py @@ -478,7 +478,715 @@ def test_changed_knit( assert isinstance(OrgN, float) assert pytest.approx(OrgN, tolerance) == 1.8995017 -''' +def test_changed_kon( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_nitrogen_params['kon_20'] = 1 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 2.564564 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.1260636 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == -0.05491296 + +def test_changed_kdnit( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_nitrogen_params['kdnit_20'] = 2 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.610149 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 4.955769 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.8995017 + +def test_changed_rnh4( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_nitrogen_params['rnh4_20'] = -1 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == -0.3424935 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.12606356 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.89950169 + +def test_changed_rnh4_KsOxdn( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_nitrogen_params['rnh4_20'] = 1 + default_nitrogen_params['KsOxdn'] = 10 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 1.5627923 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.11856308 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.89950169 + +def test_changed_vno3( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_nitrogen_params['vno3_20'] = 0.9 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.610149379 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 0.242017033 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.89950169 + +def test_changed_depth( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gvars_params['depth'] = 3 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.472669296 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.23749182 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.729153886 + +def test_changed_TwaterC( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gvars_params['TwaterC'] = 10 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.31604458 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.330296324 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.8073881 + +def test_changed_NH4( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['NH4'] = 0.01 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.569020898 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.114263537 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.89950169 + +def test_changed_NO3( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['NO3'] = 20 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.61359955 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 19.57664053 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.89950169 + +def test_changed_Ap( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['Ap'] = 5 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.5553608647 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.3696889 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.85633245 + +def test_changed_DOX( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['DOX'] = 1 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.6152233076 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.1199048523 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.899501691 + +def test_changed_OrgN( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + initial_nsm1_state['OrgN'] = 7 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 1.2736991965 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.12606356 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 6.47479187 + def test_changed_use_NH4( time_steps, initial_nsm1_state, @@ -500,7 +1208,658 @@ def test_changed_use_NH4( """Test the model with default parameters.""" # alter parameters as necessary initial_state_dict = initial_nsm1_state - default_gp_params['use_NH4'] = False + default_gp_params['use_NH4'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.063 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.1120288 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.89950169 + +def test_changed_use_NO3( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_NO3'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.40213002 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.54 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.89950169 + +def test_changed_use_OrgN( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_OrgN'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.392992196 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.126063560 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.726 + +def test_changed_use_DOX( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_DOX'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.61007213 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.12631127 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.89950169 + +def test_changed_use_Algae( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_Algae'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.54676037 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.409982005 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.849538428 + +def test_changed_use_Balgae( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_Balgae'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.33406138337 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.24974272 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.547299413 + +def test_changed_PN( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_nitrogen_params['PN'] = 0.3 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.6120854746 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.124127465 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.899501691 + +def test_changed_PNb( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_nitrogen_params['PNb'] = 0.7 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.60832257266 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.127890367 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.89950169 + +def test_changed_Fw( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['Fw'] = 0.5 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.610149379 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.12606356028 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.7429673455 + +def test_changed_Fb( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_balgae_params['Fb'] = 0.4 + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.456767159 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.194774206 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.703833759 + +def test_changed_use_Algae_use_Balgae( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_Algae'] = False + default_gp_params['use_Balgae'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.2708483787 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.549138339 + + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.49733615 + +def test_changed_use_Algae_use_NH4( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_Algae'] = False + default_gp_params['use_NH4'] = False # instantiate the model nsm1: NutrientBudget = get_nutrient_budget_instance( @@ -531,11 +1890,70 @@ def test_changed_use_NH4( NO3 = nsm1.dataset.isel( nsm1_time_step=-1).NO3.values.item() assert isinstance(NO3, float) - assert pytest.approx(NO3, tolerance) == 5.51575 + assert pytest.approx(NO3, tolerance) == 5.39915906 OrgN = nsm1.dataset.isel( nsm1_time_step=-1).OrgN.values.item() assert isinstance(OrgN, float) - assert pytest.approx(OrgN, tolerance) == 1.8995017 + assert pytest.approx(OrgN, tolerance) == 1.849538428 + +def test_changed_use_Algae_use_NH4_use_NO3( + time_steps, + initial_nsm1_state, + default_algae_params, + default_alkalinity_params, + default_balgae_params, + default_nitrogen_params, + default_carbon_params, + default_CBOD_params, + default_DOX_params, + default_N2_params, + default_POM_params, + default_pathogen_params, + default_phosphorus_params, + default_gp_params, + default_gvars_params, + tolerance, +) -> None: + """Test the model with default parameters.""" + # alter parameters as necessary + initial_state_dict = initial_nsm1_state + default_gp_params['use_Algae'] = False + default_gp_params['use_NH4'] = False + default_gp_params['use_NO3'] = False + + # instantiate the model + nsm1: NutrientBudget = get_nutrient_budget_instance( + time_steps=time_steps, + initial_nsm1_state=initial_nsm1_state, + default_algae_params=default_algae_params, + default_alkalinity_params=default_alkalinity_params, + default_balgae_params=default_balgae_params, + default_nitrogen_params=default_nitrogen_params, + default_carbon_params=default_carbon_params, + default_CBOD_params=default_CBOD_params, + default_DOX_params=default_DOX_params, + default_N2_params=default_N2_params, + default_POM_params=default_POM_params, + default_pathogen_params=default_pathogen_params, + default_phosphorus_params=default_phosphorus_params, + default_gp_params=default_gp_params, + default_gvars_params=default_gvars_params + ) + + # Run the model + nsm1.increment_timestep() + NH4 = nsm1.dataset.isel( + nsm1_time_step=-1).NH4.values.item() + assert isinstance(NH4, float) + assert pytest.approx(NH4, tolerance) == 0.063 + + NO3 = nsm1.dataset.isel( + nsm1_time_step=-1).NO3.values.item() + assert isinstance(NO3, float) + assert pytest.approx(NO3, tolerance) == 5.54 -''' \ No newline at end of file + OrgN = nsm1.dataset.isel( + nsm1_time_step=-1).OrgN.values.item() + assert isinstance(OrgN, float) + assert pytest.approx(OrgN, tolerance) == 1.849538428 \ No newline at end of file