Skip to content

Commit 7154ab0

Browse files
authored
Merge branch 'main' into IJM_NSM_v2
2 parents adc7515 + 701a965 commit 7154ab0

39 files changed

+14218
-18
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"""
2+
File contains dynamic variables related to the CBOD module
3+
"""
4+
5+
import clearwater_modules.shared.processes as shared_processes
6+
from clearwater_modules import base
7+
from clearwater_modules.nsm1.model import NutrientBudget
8+
import clearwater_modules.nsm1.CBOD.processes as processes
9+
10+
11+
@base.register_variable(models=NutrientBudget)
12+
class Variable(base.Variable):
13+
...
14+
15+
16+
Variable(
17+
name='kbod_tc',
18+
long_name='Temperature adjusted oxidation rate',
19+
units='1/d',
20+
description='Temperature adjusted oxidation rate',
21+
use='dynamic',
22+
process=processes.kbod_tc
23+
)
24+
25+
Variable(
26+
name='ksbod_tc',
27+
long_name='Temperature adjusted sedimentation rate',
28+
units='m/d',
29+
description='Temperature adjusted sedimentation rate',
30+
use='dynamic',
31+
process=processes.ksbod_tc
32+
)
33+
34+
Variable(
35+
name='CBOD_oxidation',
36+
long_name='CBOD oxidation',
37+
units='mg/L/d',
38+
description='CBOD oxidation',
39+
use='dynamic',
40+
process=processes.CBOD_oxidation
41+
)
42+
43+
Variable(
44+
name='CBOD_sedimentation',
45+
long_name='CBOD sedimentation',
46+
units='mg/L/d',
47+
description='CBOD sedimentation',
48+
use='dynamic',
49+
process=processes.CBOD_sedimentation
50+
)
51+
52+
Variable(
53+
name='dCBODdt',
54+
long_name='Change in CBOD concentration for the given timestep',
55+
units='mg/L/d',
56+
description='Change in CBOD concentration for the given timestep',
57+
use='dynamic',
58+
process=processes.dCBODdt
59+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
"""
2+
File contains process to calculate new CBOD concentration and associated dependent variables
3+
"""
4+
5+
import numba
6+
import xarray as xr
7+
from clearwater_modules.shared.processes import arrhenius_correction
8+
import math
9+
10+
@numba.njit
11+
def kbod_tc(
12+
TwaterC: xr.DataArray,
13+
kbod_20: xr.DataArray,
14+
) -> xr.DataArray:
15+
"""Calculate the temperature adjusted CBOD oxidation rate (1/d)
16+
17+
Args:
18+
TwaterC: water temperature in Celsius
19+
kbod_20: CBOD oxidation rate at 20 degrees Celsius (1/d)
20+
"""
21+
22+
kbod_tc = arrhenius_correction(TwaterC, kbod_20, 1.047)
23+
return kbod_tc
24+
25+
26+
@numba.njit
27+
def ksbod_tc(
28+
TwaterC: xr.DataArray,
29+
ksbod_20: xr.DataArray,
30+
) -> xr.DataArray:
31+
"""Calculate the temperature adjusted CBOD sedimentation rate (m/d)
32+
33+
Args:
34+
TwaterC: water temperature in Celsius
35+
ksbod_20: CBOD sedimentation rate at 20 degrees Celsius (m/d)
36+
"""
37+
38+
ksbod_tc = arrhenius_correction(TwaterC, ksbod_20, 1.024)
39+
return ksbod_tc
40+
41+
42+
43+
def CBOD_oxidation(
44+
DOX: xr.DataArray,
45+
CBOD: xr.DataArray,
46+
kbod_tc: xr.DataArray,
47+
KsOxbod: xr.DataArray,
48+
use_DOX: xr.DataArray
49+
) -> xr.DataArray:
50+
"""Calculates CBOD oxidation
51+
52+
Args:
53+
DOX: Dissolved oxygen concentration (mg-O2/L)
54+
CBOD: Carbonaceous biochemical oxygen demand (mg-O2/L)
55+
kbod_tc: Temperature adjusted CBOD oxidation rate (1/d)
56+
KsOxbod: Half-saturation oxygen attenuation for CBOD oxidation (mg-O2/L)
57+
use_DOX: Option to consider DOX concentration in calculation of CBOD oxidation
58+
"""
59+
da: xr.DataArray = xr.where(use_DOX == True, (DOX / (KsOxbod + DOX)) * kbod_tc * CBOD, kbod_tc * CBOD)
60+
61+
return da
62+
63+
64+
@numba.njit
65+
def CBOD_sedimentation(
66+
CBOD: xr.DataArray,
67+
ksbod_tc: xr.DataArray
68+
) -> xr.DataArray:
69+
"""Calculates CBOD sedimentation for each group
70+
71+
Args:
72+
CBOD: CBOD concentration (mg-O2/L)
73+
ksbod_tc: Temperature adjusted sedimentation rate (m/d)
74+
"""
75+
76+
CBOD_sedimentation = CBOD * ksbod_tc
77+
return CBOD_sedimentation
78+
79+
80+
@numba.njit
81+
def dCBODdt(
82+
CBOD_oxidation: xr.DataArray,
83+
CBOD_sedimentation: xr.DataArray
84+
) -> xr.DataArray:
85+
"""Computes change in each CBOD group for a given timestep
86+
87+
Args:
88+
CBOD_oxidation: CBOD concentration change due to oxidation (mg/L/d)
89+
CBOD_sedimentation: CBOD concentration change due to sedimentation (mg/L/d)
90+
"""
91+
return - CBOD_oxidation - CBOD_sedimentation
92+
93+
94+
@numba.njit
95+
def CBOD(
96+
CBOD: xr.DataArray,
97+
dCBODdt: xr.DataArray,
98+
timestep: xr.DataArray
99+
) -> xr.DataArray:
100+
"""Calculates new CBOD concentration for next timestep
101+
102+
Args:
103+
CBOD: CBOD concentration from previous timestep (mg/L)
104+
dCBODdt: CBOD concentration change for current timestep (mg/L/d)
105+
timestep: current iteration timestep (d)
106+
"""
107+
return CBOD + dCBODdt * timestep
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"""
2+
File contains static variables related to the CBOD module
3+
"""
4+
5+
import clearwater_modules.base as base
6+
from clearwater_modules.nsm1.model import NutrientBudget
7+
8+
9+
@base.register_variable(models=NutrientBudget)
10+
class Variable(base.Variable):
11+
...
12+
13+
14+
Variable(
15+
name='kbod_20',
16+
long_name='CBOD oxidation rate at 20C',
17+
units='1/d',
18+
description='CBOD oxidation rate at 20C',
19+
use='static'
20+
)
21+
22+
Variable(
23+
name='ksbod_20',
24+
long_name='CBOD sedimentation rate at 20C',
25+
units='m/d',
26+
description='CBOD sedimentation rate at 20C',
27+
use='static'
28+
)
29+
30+
Variable(
31+
name='KsOxbod',
32+
long_name='Half saturation oxygen attenuation constant for CBOD oxidation',
33+
units='mg-O2/L',
34+
description='Half saturation oxygen attenuation constant for CBOD oxidation',
35+
use='static'
36+
)
37+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# TODO: figure out imports
2+
3+
import clearwater_modules.shared.processes as shared_processes
4+
from clearwater_modules import base
5+
from clearwater_modules.nsm1.model import NutrientBudget
6+
import clearwater_modules.nsm1.DOX.processes as processes
7+
8+
9+
@base.register_variable(models=NutrientBudget)
10+
class Variable(base.Variable):
11+
...
12+
13+
14+
Variable(
15+
name='DOX_sat',
16+
long_name='DO saturation concentration',
17+
units='mg/L',
18+
description='DO saturation concentration in water as a function of water temperature (K)',
19+
use='dynamic',
20+
process=processes.DOX_sat
21+
)
22+
23+
Variable(
24+
name='pwv',
25+
long_name='Partial pressure of water vapor',
26+
units='atm',
27+
description='Partial pressure of water vapor',
28+
use='dynamic',
29+
process=processes.pwv
30+
)
31+
32+
Variable(
33+
name='DOs_atm_alpha',
34+
long_name='DO saturation atmospheric correction coefficient',
35+
units='unitless',
36+
description='DO saturation atmospheric correction coefficient',
37+
use='dynamic',
38+
process=processes.DOs_atm_alpha
39+
)
40+
41+
Variable(
42+
name='Atm_O2_reaeration',
43+
long_name='Atmospheric oxygen reaeration',
44+
units='mg/L/d',
45+
description='Atmospheric oxygen reaeration, can fluctuate both in and out of waterbody',
46+
use='dynamic',
47+
process=processes.Atm_O2_reaeration
48+
)
49+
50+
# TODO: UPDATE BASED ON FORTRAN
51+
Variable(
52+
name='DOX_ApGrowth',
53+
long_name='Dissolved oxygen flux due to algal photosynthesis',
54+
units='mg/L/d',
55+
description='Dissolved oxygen flux due to algal photosynthesis',
56+
use='dynamics',
57+
process=processes.DOX_ApGrowth
58+
)
59+
60+
# TODO: UPDATE BASED ON FORTRAN
61+
Variable(
62+
name='DOX_algal_respiration',
63+
long_name='Dissolved oxygen flux due to algal respiration',
64+
units='mg/L/d',
65+
description='Dissolved oxygen flux due to algal respiration',
66+
use='dynamic',
67+
process=processes.DOX_ApRespiration
68+
)
69+
70+
Variable(
71+
name='DOX_Nitrification',
72+
long_name='Dissolved oxygen flux due to nitrification',
73+
units='mg/L/d',
74+
description='Dissolved oxygen flux due to nitrification',
75+
use='dynamic',
76+
process=processes.DOX_Nitrification
77+
)
78+
79+
Variable(
80+
name='DOX_DOC_Oxidation',
81+
long_name='Dissolved oxygen flux due to DOC oxidation',
82+
units='mg/L/d',
83+
description='Dissolved oxygen flux due to DOC oxidation',
84+
use='dynamic',
85+
process=processes.DOX_DOC_Oxidation
86+
)
87+
88+
Variable(
89+
name='DOX_CBOD_Oxidation',
90+
long_name='Dissolved oxygen flux due to CBOD oxidation',
91+
units='mg/L/d',
92+
description='Dissolved oxygen flux due to CBOD oxidation',
93+
use='dynamic',
94+
process=processes.DOX_CBOD_Oxidation
95+
)
96+
97+
Variable(
98+
name='DOX_AbGrowth',
99+
long_name='Dissolved oxygen flux due to benthic algae photosynthesis',
100+
units='mg/L/d',
101+
description='Dissolved oxygen flux due to benthic algae photosynthesis',
102+
use='dynamics',
103+
process=processes.DOX_AbGrowth
104+
)
105+
106+
Variable(
107+
name='DOX_AbRespiration',
108+
long_name='Dissolved oxygen flux due to benthic algae respiration',
109+
units='mg/L/d',
110+
description='Dissolved oxygen flux due to benthic algae respiration',
111+
use='dynamic',
112+
process=processes.DOX_AbRespiration
113+
)
114+
115+
116+
Variable(
117+
name='DOX_SOD',
118+
long_name='Dissolved oxygen flux due to sediment oxygen demand',
119+
units='mg/L/d',
120+
description='Dissolved oxygen flux due to sediment oxygen demand',
121+
use='dynamic',
122+
process=processes.DOX_SOD
123+
)
124+
125+
Variable(
126+
name='dDOXdt',
127+
long_name='Change in dissolved oxygen concentration for one timestep',
128+
units='mg/L/d',
129+
description='Change in dissolved oxygen concentration for one timestep',
130+
use='dynamic',
131+
process=processes.dDOXdt
132+
)

0 commit comments

Comments
 (0)