From 98d2baa6a486659245a06903ae3447c59c999304 Mon Sep 17 00:00:00 2001 From: eusimeo <116293153+eusimeo@users.noreply.github.com> Date: Wed, 26 Aug 2026 00:48:54 -0700 Subject: [PATCH 01/11] Update initialization.py Introduce C:N:P ratio file for daily monomer input --- src/initialization.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/initialization.py b/src/initialization.py index 6f11437..3c92ab9 100644 --- a/src/initialization.py +++ b/src/initialization.py @@ -45,12 +45,17 @@ def initialize_data(runtime_parameters, site): Ea_input = pd.read_csv(site + "/" + "enzyme_ea.csv", header=0, index_col=0).astype( "float32" ) # enzyme activation energy + elem_ratios = pd.read_csv(site+'/'+'elem_ratios.csv', header=0, index_col=0).astype('float32') # elemental (C:N:P) ratios of organic monomer inputs # climate forcings climate = pd.read_csv(site + "/" + "climate.csv", header=0, index_col=0) # daily temperature and water potential daily_temp = climate["Temp"].to_numpy(dtype="float32") # temperaure series daily_psi = climate["Psi"].to_numpy(dtype="float32") # water potential series + # Convert C:N:P ratios into fractions of total (each row sums to 1.0) + row_totals = elem_ratios.sum(axis=1) + elem_fracs = elem_ratios.div(row_totals, axis=0).fillna(0.0) + # ...an instance of Substrate class Substrates = Substrate(runtime_parameters, parameters, substrates_init) # ...substrate initial pool size @@ -138,6 +143,7 @@ def initialize_data(runtime_parameters, site): "Monomers": expand(monomers_initial_pool, gridsize), "Monomer_ratio": expand(monomer_ratio_inital, gridsize), "MonInput": expand(monomers_input_rate, gridsize), + "elem_fracs": elem_fracs, "Uptake_ReqEnz": expand(monomers_uptake_reqenzyme, gridsize), "Enzymes": expand(enzymes_initial_pool, gridsize), "Km0": expand(enzymes_Km, gridsize), # enzyme half-saturation constant From 03ba2a8f45fa16aef90ed1a00078f0cb105b8840 Mon Sep 17 00:00:00 2001 From: eusimeo <116293153+eusimeo@users.noreply.github.com> Date: Wed, 26 Aug 2026 00:55:35 -0700 Subject: [PATCH 02/11] Update grid.py Change grid.py into introducing daily monomers divided by elemental C:N:P ratios upon entrance --- src/grid.py | 67 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/src/grid.py b/src/grid.py index a1d1367..119e9a2 100644 --- a/src/grid.py +++ b/src/grid.py @@ -67,13 +67,16 @@ def __init__(self, runtime, data_init): ] # Rate for change of moisture reaction in decay module # Uptake - # self.Microbes_init = data_init['Microbes_pp'] # microbial community before placement + self.Microbes_init = data_init['Microbes_pp'] # microbial community before placement self.Microbes = data_init["Microbes"].copy( deep=True ) # microbial community after placement - # self.Monomers_init = data_init['Monomers'] # Monomers initialized + self.Monomers_init = data_init['Monomers'] # Monomers initialized self.Monomers = data_init["Monomers"].copy(deep=True) # Monomers self.MonInput = data_init["MonInput"] # Inputs of monomers + self.C_frac_org = np.tile(data_init['elem_fracs']['C'].values, self.gridsize) + self.N_frac_org = np.tile(data_init['elem_fracs']['N'].values, self.gridsize) + self.P_frac_org = np.tile(data_init['elem_fracs']['P'].values, self.gridsize) self.Uptake_Ea = data_init["Uptake_Ea"] # transporter enzyme Ea self.Uptake_Vmax0 = data_init["Uptake_Vmax0"] # transporter Vmax self.Uptake_Km0 = data_init["Uptake_Km0"] # transporter Km @@ -235,7 +238,7 @@ def degradation(self, day): ) # Update Substrates Pool by removing decayed C, N, & P. Depending on specific needs, adding inputs of substrates can be done here - self.Substrates -= SubstrateRatios.mul(DecayRates, axis=0) # + self.SubInput + self.Substrates -= SubstrateRatios.mul(DecayRates, axis=0) + self.SubInput # Pass these two back to the global variables to be used in the next method self.SubstrateRatios = SubstrateRatios @@ -264,6 +267,8 @@ def uptake(self, day): self.Monomers.index != "PO4" ) # organic monomers # is_mineral = (Monomers.index == "NH4") | (Monomers.index == "PO4") + is_NH4 = self.Monomers.index == "NH4" + is_PO4 = self.Monomers.index == "PO4" # Update monomer ratios in each time step with organic monomers following the substrates self.Monomer_ratios[is_org] = self.SubstrateRatios.values @@ -271,11 +276,33 @@ def uptake(self, day): # Determine monomer pool from decay and input # Organic monomers derived from substrate-decomposition Decay_Org = self.Monomer_ratios[is_org].mul(self.DecayRates.values, axis=0) + # Monomer pool determined + self.Monomers.loc[is_org] += Decay_Org #+ Input_Org + + # --- Route monomer inputs by pool --- + input_vals = self.MonInput.values # positionally aligned with self.Monomers + + # Organic monomers: input is carbon, goes to the C column + org_input = input_vals[is_org] + self.Monomers.loc[is_org, 'C'] += org_input * self.C_frac_org + self.Monomers.loc[is_org, 'N'] += org_input * self.N_frac_org + self.Monomers.loc[is_org, 'P'] += org_input * self.P_frac_org + + # Mineral N: NH4 input goes to the N column + self.Monomers.loc[is_NH4, 'N'] += input_vals[is_NH4] + + # Mineral P: PO4 input goes to the P column + self.Monomers.loc[is_PO4, 'P'] += input_vals[is_PO4] + + self.Monomers = self.Monomers.fillna(0.0) + self.Monomers[self.Monomers < 0] = np.float32(0) + + # inputs of organic and mineral monomers # Input_Org = MR_transition[is_org].mul(self.MonInput[is_org].tolist(),axis=0) # Input_Mineral = MR_transition[is_mineral].mul((self.MonInput[is_mineral]).tolist(),axis=0) # Monomer pool determined - self.Monomers.loc[is_org] += Decay_Org # + Input_Org + #self.Monomers.loc[is_org] += Decay_Org # + Input_Org # self.Monomers.loc[is_mineral] += Input_Mineral # Get the total mass of each monomer: C+N+P @@ -330,6 +357,7 @@ def uptake(self, day): # Update Monomers # By monomer: total uptake (monomer*gridsize) * 3(C-N-P) self.Monomers -= self.Monomer_ratios.mul(Uptake.sum(axis=1), axis=0) + self.Monomers[self.Monomers < 0] = np.float32(0) # Derive Taxon-specific total uptake of C, N, & P # By taxon: total uptake; (monomer*gridsize) * taxon @@ -744,6 +772,7 @@ def mortality(self, day): # Update monomer pools self.Monomers.loc[is_NH4, "N"] += sum(MicLoss["N"]) / self.gridsize self.Monomers.loc[is_PO4, "P"] += sum(MicLoss["P"]) / self.gridsize + self.Monomers[self.Monomers < 0] = np.float32(0) # Update Substrates pool by adding dead microbial biomass self.Substrates.loc[is_DeadMic] += Death_gridcell.values @@ -911,6 +940,15 @@ def reinitialization(self, initialization, microbes_pp, output, mode, pulse, *ar self.Substrates = initialization["Substrates"].copy(deep=True) self.Monomers = initialization["Monomers"].copy(deep=True) self.Enzymes = initialization["Enzymes"].copy(deep=True) + self.SubstrateRatios = pd.DataFrame( + np.zeros_like(initialization['Substrates']), + index=initialization['Substrates'].index, + columns=initialization['Substrates'].columns + ) + self.DecayRates = pd.Series( + np.zeros(len(initialization['Substrates'])), + index=initialization['Substrates'].index + ) # reinitialize microbial community in a new pulse as per the mode in three steps # first: retrieve the microbial pool; NOTE: copy() @@ -940,24 +978,9 @@ def reinitialization(self, initialization, microbes_pp, output, mode, pulse, *ar # calculate frequency of every taxon frequencies = cum_abundance / cum_abundance.sum() frequencies = frequencies.fillna(0) - frequencies = frequencies.clip( - lower=0, upper=1 - ) # guard against any stray negative/over-1 values (sum of 1) - frequencies = ( - frequencies / frequencies.sum() if frequencies.sum() > 0 else frequencies - ) # renormalize to exactly 1 # last: assign microbes to each grid box randomly based on prior densities - choose_taxa = np.zeros((self.n_taxa, self.gridsize), dtype="int8") + choose_taxa = np.zeros((self.n_taxa,self.gridsize), dtype='int8') for i in range(self.n_taxa): - freq = np.float64( - frequencies.iloc[1] - ) # working independent of indexing (based on location not index labels) - p_vec = np.array([freq, 1.0 - freq], dtype=np.float64) # solve numoy issues - p_vec = p_vec / p_vec.sum() - choose_taxa[i, :] = np.random.choice( - [1, 0], self.gridsize, replace=True, p=p_vec - ) - self.Microbes.loc[np.ravel(choose_taxa, order="F") == 0] = np.float32( - 0 - ) # NOTE order='F' + choose_taxa[i,:] = np.random.binomial(1, frequencies.iloc[i], self.gridsize) + self.Microbes.loc[np.ravel(choose_taxa,order='F')==0] = np.float32(0) # NOTE order='F' From 58be897421f2f2f983205dcf41717ecb877fc447 Mon Sep 17 00:00:00 2001 From: eusimeo <116293153+eusimeo@users.noreply.github.com> Date: Wed, 26 Aug 2026 00:56:50 -0700 Subject: [PATCH 03/11] Add files via upload --- grassland/elem_ratios.csv | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 grassland/elem_ratios.csv diff --git a/grassland/elem_ratios.csv b/grassland/elem_ratios.csv new file mode 100644 index 0000000..deb1e69 --- /dev/null +++ b/grassland/elem_ratios.csv @@ -0,0 +1,13 @@ +,C,N,P +DeadMic,0.0,0.0,0.0 +DeadEnz,0.0,0.0,0.0 +Cellulose,1.00,0.0,0.0 +Hemicellulose,1.00,0.0,0.0 +Starch,1.00,0.0,0.0 +Chitin,6.01,1.00,0.0 +Lignin,118.58,1.00,0.0 +Protein1,5.05,1.00,0.0 +Protein2,5.05,1.00,0.0 +Protein3,5.05,1.00,0.0 +OrgP1,26.08,0.0,1.00 +OrgP2,3.8,1.67,1.00 From 5a065a377526d8ae27de12c9ff511b9364a956fb Mon Sep 17 00:00:00 2001 From: Jeth Walkup Date: Wed, 26 Aug 2026 15:58:29 -0400 Subject: [PATCH 04/11] Ruff formatting. --- src/grid.py | 55 +++++++++++++++++++++++-------------------- src/initialization.py | 6 +++-- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/grid.py b/src/grid.py index 119e9a2..0248431 100644 --- a/src/grid.py +++ b/src/grid.py @@ -67,16 +67,18 @@ def __init__(self, runtime, data_init): ] # Rate for change of moisture reaction in decay module # Uptake - self.Microbes_init = data_init['Microbes_pp'] # microbial community before placement + self.Microbes_init = data_init[ + "Microbes_pp" + ] # microbial community before placement self.Microbes = data_init["Microbes"].copy( deep=True ) # microbial community after placement - self.Monomers_init = data_init['Monomers'] # Monomers initialized + self.Monomers_init = data_init["Monomers"] # Monomers initialized self.Monomers = data_init["Monomers"].copy(deep=True) # Monomers self.MonInput = data_init["MonInput"] # Inputs of monomers - self.C_frac_org = np.tile(data_init['elem_fracs']['C'].values, self.gridsize) - self.N_frac_org = np.tile(data_init['elem_fracs']['N'].values, self.gridsize) - self.P_frac_org = np.tile(data_init['elem_fracs']['P'].values, self.gridsize) + self.C_frac_org = np.tile(data_init["elem_fracs"]["C"].values, self.gridsize) + self.N_frac_org = np.tile(data_init["elem_fracs"]["N"].values, self.gridsize) + self.P_frac_org = np.tile(data_init["elem_fracs"]["P"].values, self.gridsize) self.Uptake_Ea = data_init["Uptake_Ea"] # transporter enzyme Ea self.Uptake_Vmax0 = data_init["Uptake_Vmax0"] # transporter Vmax self.Uptake_Km0 = data_init["Uptake_Km0"] # transporter Km @@ -277,32 +279,31 @@ def uptake(self, day): # Organic monomers derived from substrate-decomposition Decay_Org = self.Monomer_ratios[is_org].mul(self.DecayRates.values, axis=0) # Monomer pool determined - self.Monomers.loc[is_org] += Decay_Org #+ Input_Org - + self.Monomers.loc[is_org] += Decay_Org # + Input_Org + # --- Route monomer inputs by pool --- input_vals = self.MonInput.values # positionally aligned with self.Monomers # Organic monomers: input is carbon, goes to the C column org_input = input_vals[is_org] - self.Monomers.loc[is_org, 'C'] += org_input * self.C_frac_org - self.Monomers.loc[is_org, 'N'] += org_input * self.N_frac_org - self.Monomers.loc[is_org, 'P'] += org_input * self.P_frac_org - + self.Monomers.loc[is_org, "C"] += org_input * self.C_frac_org + self.Monomers.loc[is_org, "N"] += org_input * self.N_frac_org + self.Monomers.loc[is_org, "P"] += org_input * self.P_frac_org + # Mineral N: NH4 input goes to the N column - self.Monomers.loc[is_NH4, 'N'] += input_vals[is_NH4] + self.Monomers.loc[is_NH4, "N"] += input_vals[is_NH4] # Mineral P: PO4 input goes to the P column - self.Monomers.loc[is_PO4, 'P'] += input_vals[is_PO4] + self.Monomers.loc[is_PO4, "P"] += input_vals[is_PO4] self.Monomers = self.Monomers.fillna(0.0) self.Monomers[self.Monomers < 0] = np.float32(0) - # inputs of organic and mineral monomers # Input_Org = MR_transition[is_org].mul(self.MonInput[is_org].tolist(),axis=0) # Input_Mineral = MR_transition[is_mineral].mul((self.MonInput[is_mineral]).tolist(),axis=0) # Monomer pool determined - #self.Monomers.loc[is_org] += Decay_Org # + Input_Org + # self.Monomers.loc[is_org] += Decay_Org # + Input_Org # self.Monomers.loc[is_mineral] += Input_Mineral # Get the total mass of each monomer: C+N+P @@ -941,14 +942,14 @@ def reinitialization(self, initialization, microbes_pp, output, mode, pulse, *ar self.Monomers = initialization["Monomers"].copy(deep=True) self.Enzymes = initialization["Enzymes"].copy(deep=True) self.SubstrateRatios = pd.DataFrame( - np.zeros_like(initialization['Substrates']), - index=initialization['Substrates'].index, - columns=initialization['Substrates'].columns - ) + np.zeros_like(initialization["Substrates"]), + index=initialization["Substrates"].index, + columns=initialization["Substrates"].columns, + ) self.DecayRates = pd.Series( - np.zeros(len(initialization['Substrates'])), - index=initialization['Substrates'].index - ) + np.zeros(len(initialization["Substrates"])), + index=initialization["Substrates"].index, + ) # reinitialize microbial community in a new pulse as per the mode in three steps # first: retrieve the microbial pool; NOTE: copy() @@ -980,7 +981,11 @@ def reinitialization(self, initialization, microbes_pp, output, mode, pulse, *ar frequencies = frequencies.fillna(0) # last: assign microbes to each grid box randomly based on prior densities - choose_taxa = np.zeros((self.n_taxa,self.gridsize), dtype='int8') + choose_taxa = np.zeros((self.n_taxa, self.gridsize), dtype="int8") for i in range(self.n_taxa): - choose_taxa[i,:] = np.random.binomial(1, frequencies.iloc[i], self.gridsize) - self.Microbes.loc[np.ravel(choose_taxa,order='F')==0] = np.float32(0) # NOTE order='F' + choose_taxa[i, :] = np.random.binomial( + 1, frequencies.iloc[i], self.gridsize + ) + self.Microbes.loc[np.ravel(choose_taxa, order="F") == 0] = np.float32( + 0 + ) # NOTE order='F' diff --git a/src/initialization.py b/src/initialization.py index 3c92ab9..cfb4847 100644 --- a/src/initialization.py +++ b/src/initialization.py @@ -45,7 +45,9 @@ def initialize_data(runtime_parameters, site): Ea_input = pd.read_csv(site + "/" + "enzyme_ea.csv", header=0, index_col=0).astype( "float32" ) # enzyme activation energy - elem_ratios = pd.read_csv(site+'/'+'elem_ratios.csv', header=0, index_col=0).astype('float32') # elemental (C:N:P) ratios of organic monomer inputs + elem_ratios = pd.read_csv( + site + "/" + "elem_ratios.csv", header=0, index_col=0 + ).astype("float32") # elemental (C:N:P) ratios of organic monomer inputs # climate forcings climate = pd.read_csv(site + "/" + "climate.csv", header=0, index_col=0) # daily temperature and water potential @@ -143,7 +145,7 @@ def initialize_data(runtime_parameters, site): "Monomers": expand(monomers_initial_pool, gridsize), "Monomer_ratio": expand(monomer_ratio_inital, gridsize), "MonInput": expand(monomers_input_rate, gridsize), - "elem_fracs": elem_fracs, + "elem_fracs": elem_fracs, "Uptake_ReqEnz": expand(monomers_uptake_reqenzyme, gridsize), "Enzymes": expand(enzymes_initial_pool, gridsize), "Km0": expand(enzymes_Km, gridsize), # enzyme half-saturation constant From 467b9ee3f0812c7d830fbbefe326560d695e161e Mon Sep 17 00:00:00 2001 From: eusimeo <116293153+eusimeo@users.noreply.github.com> Date: Wed, 26 Aug 2026 13:14:00 -0700 Subject: [PATCH 05/11] Update substrate.py Guard substrates from negative values --- src/substrate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/substrate.py b/src/substrate.py index 30b663e..78128be 100644 --- a/src/substrate.py +++ b/src/substrate.py @@ -56,7 +56,7 @@ def substrate_input(self, sub_mon_input): SubInputN.name = "N" SubInputP.name = "P" SubInput_df = pd.concat([SubInputC, SubInputN, SubInputP], axis=1, sort=False) - SubInput_df["DeadMic"] = SubInput_df["DeadEnz"] = 0 # Change NAs to 0 + SubInput_df["DeadMic"] = SubInput_df.fillna(0) # fill NaN rows (e.g. DeadMic, DeadEnz) with 0 SubInput_df = SubInput_df.astype("float32") return SubInput_df From 1c3183435f840367011697ff781a981989f09fd1 Mon Sep 17 00:00:00 2001 From: eusimeo <116293153+eusimeo@users.noreply.github.com> Date: Wed, 26 Aug 2026 13:16:51 -0700 Subject: [PATCH 06/11] Update substrate.py Guarding against negative substrate values --- src/substrate.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/substrate.py b/src/substrate.py index 78128be..e01abfc 100644 --- a/src/substrate.py +++ b/src/substrate.py @@ -56,7 +56,8 @@ def substrate_input(self, sub_mon_input): SubInputN.name = "N" SubInputP.name = "P" SubInput_df = pd.concat([SubInputC, SubInputN, SubInputP], axis=1, sort=False) - SubInput_df["DeadMic"] = SubInput_df.fillna(0) # fill NaN rows (e.g. DeadMic, DeadEnz) with 0 + SubInput_df["DeadMic"] = SubInput_df.fillna(0) + # fill NaN rows (e.g. DeadMic, DeadEnz) with 0 SubInput_df = SubInput_df.astype("float32") return SubInput_df From 0e75c6ae711778ba52e973aa1eadaed50d13a03f Mon Sep 17 00:00:00 2001 From: eusimeo <116293153+eusimeo@users.noreply.github.com> Date: Wed, 26 Aug 2026 13:23:36 -0700 Subject: [PATCH 07/11] Update substrate.py --- src/substrate.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/substrate.py b/src/substrate.py index e01abfc..7ac4dc5 100644 --- a/src/substrate.py +++ b/src/substrate.py @@ -56,8 +56,7 @@ def substrate_input(self, sub_mon_input): SubInputN.name = "N" SubInputP.name = "P" SubInput_df = pd.concat([SubInputC, SubInputN, SubInputP], axis=1, sort=False) - SubInput_df["DeadMic"] = SubInput_df.fillna(0) - # fill NaN rows (e.g. DeadMic, DeadEnz) with 0 + SubInput_df = SubInput_df.fillna(0) SubInput_df = SubInput_df.astype("float32") return SubInput_df From 07d2cd17d8cb054df988916b72d8ba0375b10273 Mon Sep 17 00:00:00 2001 From: eusimeo <116293153+eusimeo@users.noreply.github.com> Date: Fri, 28 Aug 2026 18:02:17 -0700 Subject: [PATCH 08/11] Update grid.py Fix the appearance of negative substrate values --- src/grid.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/grid.py b/src/grid.py index 0248431..05f3d71 100644 --- a/src/grid.py +++ b/src/grid.py @@ -240,7 +240,9 @@ def degradation(self, day): ) # Update Substrates Pool by removing decayed C, N, & P. Depending on specific needs, adding inputs of substrates can be done here - self.Substrates -= SubstrateRatios.mul(DecayRates, axis=0) + self.SubInput + self.Substrates -= SubstrateRatios.mul(DecayRates, axis=0) + self.Substrates += self.SubInput + self.Substrates[self.Substrates < 0] = np.float32(0) # avoid negative values # Pass these two back to the global variables to be used in the next method self.SubstrateRatios = SubstrateRatios From 6ea7651bfaa0d1b78f767fa978d0421ae27523b5 Mon Sep 17 00:00:00 2001 From: eusimeo <116293153+eusimeo@users.noreply.github.com> Date: Fri, 28 Aug 2026 18:09:44 -0700 Subject: [PATCH 09/11] Update grid.py Ruff-format --- src/grid.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/grid.py b/src/grid.py index 05f3d71..ffb0b88 100644 --- a/src/grid.py +++ b/src/grid.py @@ -240,9 +240,11 @@ def degradation(self, day): ) # Update Substrates Pool by removing decayed C, N, & P. Depending on specific needs, adding inputs of substrates can be done here - self.Substrates -= SubstrateRatios.mul(DecayRates, axis=0) - self.Substrates += self.SubInput - self.Substrates[self.Substrates < 0] = np.float32(0) # avoid negative values + self.Substrates -= SubstrateRatios.mul( + DecayRates, axis=0 + ) # First remove decayed matter + self.Substrates += self.SubInput # then add daily substrates + self.Substrates[self.Substrates < 0] = np.float32(0) # Pass these two back to the global variables to be used in the next method self.SubstrateRatios = SubstrateRatios From 5ff39b097e6c55fcc570ac65de0626d13e290c14 Mon Sep 17 00:00:00 2001 From: eusimeo <116293153+eusimeo@users.noreply.github.com> Date: Fri, 28 Aug 2026 18:12:00 -0700 Subject: [PATCH 10/11] Update grid.py --- src/grid.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grid.py b/src/grid.py index ffb0b88..b644b84 100644 --- a/src/grid.py +++ b/src/grid.py @@ -241,7 +241,7 @@ def degradation(self, day): # Update Substrates Pool by removing decayed C, N, & P. Depending on specific needs, adding inputs of substrates can be done here self.Substrates -= SubstrateRatios.mul( - DecayRates, axis=0 + DecayRates, axis=0 ) # First remove decayed matter self.Substrates += self.SubInput # then add daily substrates self.Substrates[self.Substrates < 0] = np.float32(0) From 3cd4ed664be2af5e169281d09a06dede3f55c6d0 Mon Sep 17 00:00:00 2001 From: eusimeo <116293153+eusimeo@users.noreply.github.com> Date: Fri, 28 Aug 2026 18:18:06 -0700 Subject: [PATCH 11/11] Update grid.py --- src/grid.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grid.py b/src/grid.py index b644b84..2511ca4 100644 --- a/src/grid.py +++ b/src/grid.py @@ -244,7 +244,7 @@ def degradation(self, day): DecayRates, axis=0 ) # First remove decayed matter self.Substrates += self.SubInput # then add daily substrates - self.Substrates[self.Substrates < 0] = np.float32(0) + self.Substrates[self.Substrates < 0] = np.float32(0) # Pass these two back to the global variables to be used in the next method self.SubstrateRatios = SubstrateRatios