-> When the time step is (0.5 / diffusion rate), a 2-bin system equilibrates in a single step, and some 3-bin systems can over-shoot equilibrium!
-> When the time step is (0.33333 / diffusion rate), some 3-bin systems equilibrate in a single step
So, (0.33333 / diffusion rate) is a - rather lax - upper bound for sensible single time steps!
IMPORTANT: The above is for delta_x = 1; in general, multiply by delta_x**2
The "Von Neumann stability analysis", which provides a slighly looser max value of time steps, is also discussed.
That value of 0.33333 is saved in the Class variable "time_step_threshold"
LAST REVISED: June 23, 2024 (using v. 1.0 beta34.1)
import set_path # Importing this module will add the project's home directory to sys.path
Added 'D:\Docs\- MY CODE\BioSimulations\life123-Win7' to sys.path
from life123 import ChemData as chem
from life123 import BioSim1D
chem_data = chem(diffusion_rates=[10.])
bio = BioSim1D(n_bins=2, chem_data=chem_data)
bio.inject_conc_to_bin(bin_address=0, delta_conc=100., species_index=0)
bio.describe_state()
SYSTEM STATE at Time t = 0: 2 bins and 1 species: Species 0 (Chemical 1). Diff rate: 10.0. Conc: [100. 0.]
bio.time_step_threshold = 0.51 # To bypass the safety limit (for maximum delta Time) that is typically in place
# When the time step is (0.5 / diffusion rate),
# a 2-bin system equilibrates in a single step!
bio.diffuse(time_step=0.05, n_steps=1)
print(bio.system)
[[50. 50.]]
Note: [[50. 50.]] : the two bins have equilibrated!
bio = BioSim1D(n_bins=3, chem_data=chem_data)
bio.inject_conc_to_bin(bin_address=1, delta_conc=100., species_index=0)
bio.describe_state()
#3 bins and 1 species: [[ 0. 100. 0.]]
SYSTEM STATE at Time t = 0: 3 bins and 1 species: Species 0 (Chemical 1). Diff rate: 10.0. Conc: [ 0. 100. 0.]
bio.time_step_threshold = 0.51 # To bypass the safety limit (for maximum delta Time) that is typically in place
# When the time step is (0.5 / diffusion rate),
# a 3-bin system can overshoot equilibrium!
bio.diffuse(time_step=0.05, n_steps=1)
print(bio.system)
[[50. 0. 50.]]
Note: [[50. 0. 50.]] : the diffusion has over-shot equilibrium!!!
bio = BioSim1D(n_bins=3, chem_data=chem_data)
bio.inject_conc_to_bin(bin_address=1, delta_conc=100., species_index=0)
bio.describe_state()
SYSTEM STATE at Time t = 0: 3 bins and 1 species: Species 0 (Chemical 1). Diff rate: 10.0. Conc: [ 0. 100. 0.]
bio.time_step_threshold = 0.34 # To bypass the safety limit (for maximum delta Time) that is typically in place
bio.diffuse(time_step=0.033333, n_steps=1)
print(bio.system)
[[33.333 33.334 33.333]]
bio = BioSim1D(n_bins=3, chem_data=chem_data)
bio.inject_conc_to_bin(bin_address=1, delta_conc=100., species_index=0)
bio.describe_state()
SYSTEM STATE at Time t = 0: 3 bins and 1 species: Species 0 (Chemical 1). Diff rate: 10.0. Conc: [ 0. 100. 0.]
bio.time_step_threshold = 1000 # To bypass the safety limit (for maximum delta Time) that is typically in place
# When the time step is (0.33333 / diffusion rate),
# a 3-bin system, configured as above, equilibrates in a single step!
bio.diffuse(time_step=3.3333, n_steps=1, delta_x=10)
print(bio.system)
[[33.333 33.334 33.333]]
delta_t < delta_x*2 0.5 / diffusion rate
diffuse()
method enforces the stricter upper bound¶diffuse()
method.¶An explanation can be found at: https://www.youtube.com/watch?v=QUiUGNwNNmo