{
"cells": [
{
"cell_type": "markdown",
"id": "5cbc8640",
"metadata": {},
"source": [
"### Adaptive time substeps (variable time resolution) for reaction `A <-> B`,\n",
"with 1st-order kinetics in both directions, taken to equilibrium\n",
"\n",
"Same as the experiment _\"react_1\"_ , but with adaptive time substeps\n",
"\n",
"LAST REVISED: Feb. 5, 2023"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "b01eafc2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Added 'D:\\Docs\\- MY CODE\\BioSimulations\\life123-Win7' to sys.path\n"
]
}
],
"source": [
"# Extend the sys.path variable, to contain the project's root directory\n",
"import set_path\n",
"set_path.add_ancestor_dir_to_syspath(2) # The number of levels to go up \n",
" # to reach the project's home, from the folder containing this notebook"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "85b2f63e",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from experiments.get_notebook_info import get_notebook_basename\n",
"\n",
"from src.modules.reactions.reaction_data import ReactionData as chem\n",
"from src.modules.reactions.reaction_dynamics import ReactionDynamics\n",
"\n",
"import numpy as np\n",
"import plotly.express as px\n",
"from src.modules.visualization.graphic_log import GraphicLog"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "121fdfdd",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-> Output will be LOGGED into the file 'react_2.log.htm'\n"
]
}
],
"source": [
"# Initialize the HTML logging (for the graphics)\n",
"log_file = get_notebook_basename() + \".log.htm\" # Use the notebook base filename for the log file\n",
"\n",
"# Set up the use of some specified graphic (Vue) components\n",
"GraphicLog.config(filename=log_file,\n",
" components=[\"vue_cytoscape_1\"],\n",
" extra_js=\"https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.21.2/cytoscape.umd.js\")"
]
},
{
"cell_type": "markdown",
"id": "10c710ac",
"metadata": {},
"source": [
"# Initialize the System\n",
"Specify the chemicals and the reactions"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "78077d8c",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of reactions: 1\n"
]
}
],
"source": [
"# Specify the chemicals\n",
"chem_data = chem(names=[\"A\", \"B\"])\n",
"\n",
"# Reaction A <-> B , with 1st-order kinetics in both directions\n",
"chem_data.add_reaction(reactants=[\"A\"], products=[\"B\"], forward_rate=3., reverse_rate=2.)\n",
"\n",
"print(\"Number of reactions: \", chem_data.number_of_reactions())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "58433072",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of reactions: 1 (at temp. 25 C)\n",
"0: A <-> B (kF = 3 / kR = 2 / Delta_G = -1,005.13 / K = 1.5) | 1st order in all reactants & products\n"
]
}
],
"source": [
"chem_data.describe_reactions()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "373afeb1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[GRAPHIC ELEMENT SENT TO LOG FILE `react_2.log.htm`]\n"
]
}
],
"source": [
"# Send a plot of the network of reactions to the HTML log file\n",
"graph_data = chem_data.prepare_graph_network()\n",
"GraphicLog.export_plot(graph_data, \"vue_cytoscape_1\")"
]
},
{
"cell_type": "markdown",
"id": "e0529a0c",
"metadata": {},
"source": [
"# Start the simulation"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "f9736433",
"metadata": {},
"outputs": [],
"source": [
"dynamics = ReactionDynamics(reaction_data=chem_data)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "9fc3948d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SYSTEM STATE at Time t = 0:\n",
"2 species:\n",
" Species 0 (A). Conc: 10.0\n",
" Species 1 (B). Conc: 50.0\n"
]
}
],
"source": [
"# Initial concentrations of all the chemicals, in index order\n",
"dynamics.set_conc([10., 50.], snapshot=True)\n",
"\n",
"dynamics.describe_state()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "0cc938cc",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" SYSTEM TIME | \n",
" A | \n",
" B | \n",
" caption | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.0 | \n",
" 10.0 | \n",
" 50.0 | \n",
" Initial state | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" SYSTEM TIME A B caption\n",
"0 0.0 10.0 50.0 Initial state"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dynamics.history.get()"
]
},
{
"cell_type": "markdown",
"id": "987af2c5",
"metadata": {
"tags": []
},
"source": [
"## Run the reaction"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "ad665050",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"single_compartment_react(): setting abs_fast_threshold to 10.0\n",
"12 total step(s) taken\n"
]
}
],
"source": [
"dynamics.set_diagnostics() # To save diagnostic information about the call to single_compartment_react()\n",
"\n",
"dynamics.single_compartment_react(time_step=0.1, n_steps=11,\n",
" snapshots={\"initial_caption\": \"1st reaction step\",\n",
" \"final_caption\": \"last reaction step\"},\n",
" dynamic_substeps=2, rel_fast_threshold=100)"
]
},
{
"cell_type": "markdown",
"id": "2169c3b3",
"metadata": {},
"source": [
"## The argument _dynamic_step=2_ splits the time steps in 2 whenever the reaction is \"fast\" (as determined using the specified value of _fast_threshold_ )"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "2d5df59c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" SYSTEM TIME | \n",
" A | \n",
" B | \n",
" caption | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.00 | \n",
" 10.000000 | \n",
" 50.000000 | \n",
" Initial state | \n",
"
\n",
" \n",
" | 1 | \n",
" 0.05 | \n",
" 13.500000 | \n",
" 46.500000 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 2 | \n",
" 0.10 | \n",
" 16.125000 | \n",
" 43.875000 | \n",
" 1st reaction step | \n",
"
\n",
" \n",
" | 3 | \n",
" 0.15 | \n",
" 18.093750 | \n",
" 41.906250 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 4 | \n",
" 0.20 | \n",
" 19.570312 | \n",
" 40.429688 | \n",
" | \n",
"
\n",
" \n",
" | 5 | \n",
" 0.25 | \n",
" 20.677734 | \n",
" 39.322266 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 6 | \n",
" 0.30 | \n",
" 21.508301 | \n",
" 38.491699 | \n",
" | \n",
"
\n",
" \n",
" | 7 | \n",
" 0.35 | \n",
" 22.131226 | \n",
" 37.868774 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 8 | \n",
" 0.40 | \n",
" 22.598419 | \n",
" 37.401581 | \n",
" | \n",
"
\n",
" \n",
" | 9 | \n",
" 0.50 | \n",
" 23.299210 | \n",
" 36.700790 | \n",
" | \n",
"
\n",
" \n",
" | 10 | \n",
" 0.60 | \n",
" 23.649605 | \n",
" 36.350395 | \n",
" | \n",
"
\n",
" \n",
" | 11 | \n",
" 0.70 | \n",
" 23.824802 | \n",
" 36.175198 | \n",
" | \n",
"
\n",
" \n",
" | 12 | \n",
" 0.80 | \n",
" 23.912401 | \n",
" 36.087599 | \n",
" | \n",
"
\n",
" \n",
" | 13 | \n",
" 0.90 | \n",
" 23.956201 | \n",
" 36.043799 | \n",
" | \n",
"
\n",
" \n",
" | 14 | \n",
" 1.00 | \n",
" 23.978100 | \n",
" 36.021900 | \n",
" | \n",
"
\n",
" \n",
" | 15 | \n",
" 1.10 | \n",
" 23.989050 | \n",
" 36.010950 | \n",
" | \n",
"
\n",
" \n",
" | 16 | \n",
" 1.20 | \n",
" 23.994525 | \n",
" 36.005475 | \n",
" last reaction step | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" SYSTEM TIME A B caption\n",
"0 0.00 10.000000 50.000000 Initial state\n",
"1 0.05 13.500000 46.500000 Interm. step, due to the fast rxns: [0]\n",
"2 0.10 16.125000 43.875000 1st reaction step\n",
"3 0.15 18.093750 41.906250 Interm. step, due to the fast rxns: [0]\n",
"4 0.20 19.570312 40.429688 \n",
"5 0.25 20.677734 39.322266 Interm. step, due to the fast rxns: [0]\n",
"6 0.30 21.508301 38.491699 \n",
"7 0.35 22.131226 37.868774 Interm. step, due to the fast rxns: [0]\n",
"8 0.40 22.598419 37.401581 \n",
"9 0.50 23.299210 36.700790 \n",
"10 0.60 23.649605 36.350395 \n",
"11 0.70 23.824802 36.175198 \n",
"12 0.80 23.912401 36.087599 \n",
"13 0.90 23.956201 36.043799 \n",
"14 1.00 23.978100 36.021900 \n",
"15 1.10 23.989050 36.010950 \n",
"16 1.20 23.994525 36.005475 last reaction step"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = dynamics.get_history() # The system's history, saved during the run of single_compartment_react()\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "1092029f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"From time 0 to 0.4, in 8 substeps of 0.05 (each 1/2 of full step)\n",
"From time 0.4 to 1.2, in 8 FULL steps of 0.1\n"
]
}
],
"source": [
"dynamics.explain_time_advance()"
]
},
{
"cell_type": "markdown",
"id": "edb7c015",
"metadata": {},
"source": [
"## Notice how the reaction proceeds in smaller steps (half steps) in the early times, when [A] and [B] are changing much more rapidly\n",
"### That resulted from passing the argument _dynamic_steps=2_ to single_compartment_react()\n",
"\n",
"* For example, upon completing the half step to t=0.30, i.e. **going from 0.25 to 0.30**, the last change in [A] was (21.508301 - 20.677734) = 0.830567 \n",
"The threshold we specified for a reaction to be considered fast is 100% per full step, for any of the involved chemicals. For a half step, that corresponds to 50%, i.e. 0.5 \n",
"Since abs(0.830567) > 0.5 , the reaction is therefore marked \"FAST\" (as it has been so far), and the simulation then proceeds in a half step, to t=0.35"
]
},
{
"cell_type": "markdown",
"id": "d6e85fb4",
"metadata": {},
"source": [
"* (Note: at t=0, in the absence of any simulation data, ALL reactions are _assumed_ to be fast)"
]
},
{
"cell_type": "markdown",
"id": "6047485b",
"metadata": {},
"source": [
"* By contrast, upon completing the half step to t=0.40, i.e. **going from 0.35 to 0.40**, the following changes occur in [A] and [B]: "
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "63f23745",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"SYSTEM TIME 0.35\n",
"A 22.131226\n",
"B 37.868774\n",
"caption Interm. step, due to the fast rxns: [0]\n",
"Name: 7, dtype: object"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.iloc[7]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "6b5bce14",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"SYSTEM TIME 0.4\n",
"A 22.598419\n",
"B 37.401581\n",
"caption \n",
"Name: 8, dtype: object"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.iloc[8]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "1d98fa27",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([22.1312255859375, 37.8687744140625], dtype=object)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s_0_35 = df.iloc[7][['A', 'B']].to_numpy()\n",
"s_0_35 # Concentrations of A and B at t=0.35"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "22612d84",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([22.598419189453125, 37.401580810546875], dtype=object)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s_0_40 = df.iloc[8][['A', 'B']].to_numpy()\n",
"s_0_40 # Concentrations of A and B at t=0.40"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "d194328b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.467193603515625, -0.467193603515625], dtype=object)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(s_0_40 - s_0_35)"
]
},
{
"cell_type": "markdown",
"id": "2127ef7d",
"metadata": {},
"source": [
"Again, the threshold we specified for a reaction to be considered fast is 100% per full step, for any of the involved chemicals. \n",
"For a half step, that corresponds to 50%, i.e. 0.5 \n",
"BOTH A's change of abs(0.46) AND B's change of abs(-0.46) are SMALLER than that. \n",
"The reaction is therefore marked \"SLOW\", and the simulation then proceeds in a _full time step_ of 0.1 (i.e. a more relaxed time resolution), to t=0.50"
]
},
{
"cell_type": "markdown",
"id": "6deca814",
"metadata": {},
"source": [
"### Check the final equilibrium"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "95c56197",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([23.99452507, 36.00547493])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dynamics.get_system_conc()"
]
},
{
"cell_type": "markdown",
"id": "2437b566",
"metadata": {},
"source": [
"NOTE: Consistent with the 3/2 ratio of forward/reverse rates (and the 1st order reactions),\n",
" the systems settles in the following equilibrium:\n",
"\n",
"[A] = 23.99316406\n",
" \n",
"[B] = 36.00683594\n",
"\n",
"The presence of equilibrium may be automatically checked withe the following handy function:\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "23c4b3ba",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"A <-> B\n",
"Final concentrations: [B] = 36.01 ; [A] = 23.99\n",
"1. Ratio of reactant/product concentrations, adjusted for reaction orders: 1.50057\n",
" Formula used: [B] / [A]\n",
"2. Ratio of forward/reverse reaction rates: 1.5\n",
"Discrepancy between the two values: 0.03803 %\n",
"Reaction IS in equilibrium (within 1% tolerance)\n",
"\n"
]
},
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Verify that the reaction has reached equilibrium\n",
"dynamics.is_in_equilibrium()"
]
},
{
"cell_type": "markdown",
"id": "03866901",
"metadata": {
"tags": []
},
"source": [
"## Plots of changes of concentration with time"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "baf7c0f4",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
" \n",
" "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.plotly.v1+json": {
"config": {
"plotlyServerURL": "https://plot.ly"
},
"data": [
{
"hovertemplate": "Chemical=A
SYSTEM TIME=%{x}
concentration=%{y}",
"legendgroup": "A",
"line": {
"color": "navy",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines",
"name": "A",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
0,
0.05,
0.1,
0.15000000000000002,
0.2,
0.25,
0.30000000000000004,
0.35000000000000003,
0.4,
0.5,
0.6,
0.7,
0.7999999999999999,
0.8999999999999999,
0.9999999999999999,
1.0999999999999999,
1.2
],
"xaxis": "x",
"y": [
10,
13.5,
16.125,
18.09375,
19.5703125,
20.677734375,
21.50830078125,
22.1312255859375,
22.598419189453125,
23.299209594726562,
23.64960479736328,
23.82480239868164,
23.91240119934082,
23.95620059967041,
23.978100299835205,
23.989050149917603,
23.9945250749588
],
"yaxis": "y"
},
{
"hovertemplate": "Chemical=B
SYSTEM TIME=%{x}
concentration=%{y}",
"legendgroup": "B",
"line": {
"color": "darkorange",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines",
"name": "B",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
0,
0.05,
0.1,
0.15000000000000002,
0.2,
0.25,
0.30000000000000004,
0.35000000000000003,
0.4,
0.5,
0.6,
0.7,
0.7999999999999999,
0.8999999999999999,
0.9999999999999999,
1.0999999999999999,
1.2
],
"xaxis": "x",
"y": [
50,
46.5,
43.875,
41.90625,
40.4296875,
39.322265625,
38.49169921875,
37.8687744140625,
37.401580810546875,
36.70079040527344,
36.35039520263672,
36.17519760131836,
36.08759880065918,
36.04379940032959,
36.021899700164795,
36.0109498500824,
36.0054749250412
],
"yaxis": "y"
}
],
"layout": {
"autosize": true,
"legend": {
"title": {
"text": "Chemical"
},
"tracegroupgap": 0
},
"template": {
"data": {
"bar": [
{
"error_x": {
"color": "#2a3f5f"
},
"error_y": {
"color": "#2a3f5f"
},
"marker": {
"line": {
"color": "#E5ECF6",
"width": 0.5
},
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "bar"
}
],
"barpolar": [
{
"marker": {
"line": {
"color": "#E5ECF6",
"width": 0.5
},
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "barpolar"
}
],
"carpet": [
{
"aaxis": {
"endlinecolor": "#2a3f5f",
"gridcolor": "white",
"linecolor": "white",
"minorgridcolor": "white",
"startlinecolor": "#2a3f5f"
},
"baxis": {
"endlinecolor": "#2a3f5f",
"gridcolor": "white",
"linecolor": "white",
"minorgridcolor": "white",
"startlinecolor": "#2a3f5f"
},
"type": "carpet"
}
],
"choropleth": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "choropleth"
}
],
"contour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "contour"
}
],
"contourcarpet": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "contourcarpet"
}
],
"heatmap": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "heatmap"
}
],
"heatmapgl": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "heatmapgl"
}
],
"histogram": [
{
"marker": {
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "histogram"
}
],
"histogram2d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2d"
}
],
"histogram2dcontour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2dcontour"
}
],
"mesh3d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "mesh3d"
}
],
"parcoords": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "parcoords"
}
],
"pie": [
{
"automargin": true,
"type": "pie"
}
],
"scatter": [
{
"fillpattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
},
"type": "scatter"
}
],
"scatter3d": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatter3d"
}
],
"scattercarpet": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattercarpet"
}
],
"scattergeo": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergeo"
}
],
"scattergl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergl"
}
],
"scattermapbox": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattermapbox"
}
],
"scatterpolar": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolar"
}
],
"scatterpolargl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolargl"
}
],
"scatterternary": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterternary"
}
],
"surface": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "surface"
}
],
"table": [
{
"cells": {
"fill": {
"color": "#EBF0F8"
},
"line": {
"color": "white"
}
},
"header": {
"fill": {
"color": "#C8D4E3"
},
"line": {
"color": "white"
}
},
"type": "table"
}
]
},
"layout": {
"annotationdefaults": {
"arrowcolor": "#2a3f5f",
"arrowhead": 0,
"arrowwidth": 1
},
"autotypenumbers": "strict",
"coloraxis": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"colorscale": {
"diverging": [
[
0,
"#8e0152"
],
[
0.1,
"#c51b7d"
],
[
0.2,
"#de77ae"
],
[
0.3,
"#f1b6da"
],
[
0.4,
"#fde0ef"
],
[
0.5,
"#f7f7f7"
],
[
0.6,
"#e6f5d0"
],
[
0.7,
"#b8e186"
],
[
0.8,
"#7fbc41"
],
[
0.9,
"#4d9221"
],
[
1,
"#276419"
]
],
"sequential": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"sequentialminus": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
]
},
"colorway": [
"#636efa",
"#EF553B",
"#00cc96",
"#ab63fa",
"#FFA15A",
"#19d3f3",
"#FF6692",
"#B6E880",
"#FF97FF",
"#FECB52"
],
"font": {
"color": "#2a3f5f"
},
"geo": {
"bgcolor": "white",
"lakecolor": "white",
"landcolor": "#E5ECF6",
"showlakes": true,
"showland": true,
"subunitcolor": "white"
},
"hoverlabel": {
"align": "left"
},
"hovermode": "closest",
"mapbox": {
"style": "light"
},
"paper_bgcolor": "white",
"plot_bgcolor": "#E5ECF6",
"polar": {
"angularaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"bgcolor": "#E5ECF6",
"radialaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
}
},
"scene": {
"xaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
},
"yaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
},
"zaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
}
},
"shapedefaults": {
"line": {
"color": "#2a3f5f"
}
},
"ternary": {
"aaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"baxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"bgcolor": "#E5ECF6",
"caxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
}
},
"title": {
"x": 0.05
},
"xaxis": {
"automargin": true,
"gridcolor": "white",
"linecolor": "white",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "white",
"zerolinewidth": 2
},
"yaxis": {
"automargin": true,
"gridcolor": "white",
"linecolor": "white",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "white",
"zerolinewidth": 2
}
}
},
"title": {
"text": "Reaction A <-> B . Changes in concentrations with time"
},
"xaxis": {
"anchor": "y",
"autorange": true,
"domain": [
0,
1
],
"range": [
0,
1.2
],
"title": {
"text": "SYSTEM TIME"
},
"type": "linear"
},
"yaxis": {
"anchor": "x",
"autorange": true,
"domain": [
0,
1
],
"range": [
7.777777777777778,
52.22222222222222
],
"title": {
"text": "concentration"
},
"type": "linear"
}
}
},
"image/png": "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",
"text/html": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = px.line(data_frame=dynamics.get_history(), x=\"SYSTEM TIME\", y=[\"A\", \"B\"], \n",
" title=\"Reaction A <-> B . Changes in concentrations with time\",\n",
" color_discrete_sequence = ['navy', 'darkorange'],\n",
" labels={\"value\":\"concentration\", \"variable\":\"Chemical\"})\n",
"fig.show()"
]
},
{
"cell_type": "markdown",
"id": "306e3db7",
"metadata": {},
"source": [
"## Note how the left-hand side of this plot is much smoother than it was in experiment \"react_1\", where no adaptive time substeps were used!"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0c40429d",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "317b8747",
"metadata": {},
"source": [
"# Diagnostics of the run may be investigated as follows:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "04c04327",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" TIME | \n",
" A | \n",
" B | \n",
" is_primary | \n",
" primary_timestep | \n",
" n_substeps | \n",
" substep_number | \n",
" caption | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.00 | \n",
" 10.000000 | \n",
" 50.000000 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 1 | \n",
" 0.05 | \n",
" 13.500000 | \n",
" 46.500000 | \n",
" False | \n",
" 0.1 | \n",
" 2 | \n",
" 1 | \n",
" | \n",
"
\n",
" \n",
" | 2 | \n",
" 0.10 | \n",
" 16.125000 | \n",
" 43.875000 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 3 | \n",
" 0.15 | \n",
" 18.093750 | \n",
" 41.906250 | \n",
" False | \n",
" 0.1 | \n",
" 2 | \n",
" 1 | \n",
" | \n",
"
\n",
" \n",
" | 4 | \n",
" 0.20 | \n",
" 19.570312 | \n",
" 40.429688 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 5 | \n",
" 0.25 | \n",
" 20.677734 | \n",
" 39.322266 | \n",
" False | \n",
" 0.1 | \n",
" 2 | \n",
" 1 | \n",
" | \n",
"
\n",
" \n",
" | 6 | \n",
" 0.30 | \n",
" 21.508301 | \n",
" 38.491699 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 7 | \n",
" 0.35 | \n",
" 22.131226 | \n",
" 37.868774 | \n",
" False | \n",
" 0.1 | \n",
" 2 | \n",
" 1 | \n",
" | \n",
"
\n",
" \n",
" | 8 | \n",
" 0.40 | \n",
" 22.598419 | \n",
" 37.401581 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 9 | \n",
" 0.50 | \n",
" 23.299210 | \n",
" 36.700790 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 10 | \n",
" 0.60 | \n",
" 23.649605 | \n",
" 36.350395 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 11 | \n",
" 0.70 | \n",
" 23.824802 | \n",
" 36.175198 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 12 | \n",
" 0.80 | \n",
" 23.912401 | \n",
" 36.087599 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 13 | \n",
" 0.90 | \n",
" 23.956201 | \n",
" 36.043799 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 14 | \n",
" 1.00 | \n",
" 23.978100 | \n",
" 36.021900 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 15 | \n",
" 1.10 | \n",
" 23.989050 | \n",
" 36.010950 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
" | 16 | \n",
" 1.20 | \n",
" 23.994525 | \n",
" 36.005475 | \n",
" True | \n",
" 0.1 | \n",
" 2 | \n",
" 0 | \n",
" | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" TIME A B is_primary primary_timestep n_substeps \\\n",
"0 0.00 10.000000 50.000000 True 0.1 2 \n",
"1 0.05 13.500000 46.500000 False 0.1 2 \n",
"2 0.10 16.125000 43.875000 True 0.1 2 \n",
"3 0.15 18.093750 41.906250 False 0.1 2 \n",
"4 0.20 19.570312 40.429688 True 0.1 2 \n",
"5 0.25 20.677734 39.322266 False 0.1 2 \n",
"6 0.30 21.508301 38.491699 True 0.1 2 \n",
"7 0.35 22.131226 37.868774 False 0.1 2 \n",
"8 0.40 22.598419 37.401581 True 0.1 2 \n",
"9 0.50 23.299210 36.700790 True 0.1 2 \n",
"10 0.60 23.649605 36.350395 True 0.1 2 \n",
"11 0.70 23.824802 36.175198 True 0.1 2 \n",
"12 0.80 23.912401 36.087599 True 0.1 2 \n",
"13 0.90 23.956201 36.043799 True 0.1 2 \n",
"14 1.00 23.978100 36.021900 True 0.1 2 \n",
"15 1.10 23.989050 36.010950 True 0.1 2 \n",
"16 1.20 23.994525 36.005475 True 0.1 2 \n",
"\n",
" substep_number caption \n",
"0 0 \n",
"1 1 \n",
"2 0 \n",
"3 1 \n",
"4 0 \n",
"5 1 \n",
"6 0 \n",
"7 1 \n",
"8 0 \n",
"9 0 \n",
"10 0 \n",
"11 0 \n",
"12 0 \n",
"13 0 \n",
"14 0 \n",
"15 0 \n",
"16 0 "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dynamics.diagnostic_data_baselines.get()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "2144da8f-498a-4954-8a51-a0e606055979",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Reaction: A <-> B\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" TIME | \n",
" Delta A | \n",
" Delta B | \n",
" reaction | \n",
" substep | \n",
" time_subdivision | \n",
" delta_time | \n",
" caption | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.00 | \n",
" 3.500000 | \n",
" -3.500000 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.05 | \n",
" | \n",
"
\n",
" \n",
" | 1 | \n",
" 0.05 | \n",
" 2.625000 | \n",
" -2.625000 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.05 | \n",
" | \n",
"
\n",
" \n",
" | 2 | \n",
" 0.10 | \n",
" 1.968750 | \n",
" -1.968750 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.05 | \n",
" | \n",
"
\n",
" \n",
" | 3 | \n",
" 0.15 | \n",
" 1.476562 | \n",
" -1.476562 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.05 | \n",
" | \n",
"
\n",
" \n",
" | 4 | \n",
" 0.20 | \n",
" 1.107422 | \n",
" -1.107422 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.05 | \n",
" | \n",
"
\n",
" \n",
" | 5 | \n",
" 0.25 | \n",
" 0.830566 | \n",
" -0.830566 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.05 | \n",
" | \n",
"
\n",
" \n",
" | 6 | \n",
" 0.30 | \n",
" 0.622925 | \n",
" -0.622925 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.05 | \n",
" | \n",
"
\n",
" \n",
" | 7 | \n",
" 0.35 | \n",
" 0.467194 | \n",
" -0.467194 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.05 | \n",
" | \n",
"
\n",
" \n",
" | 8 | \n",
" 0.40 | \n",
" 0.700790 | \n",
" -0.700790 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.10 | \n",
" | \n",
"
\n",
" \n",
" | 9 | \n",
" 0.50 | \n",
" 0.350395 | \n",
" -0.350395 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.10 | \n",
" | \n",
"
\n",
" \n",
" | 10 | \n",
" 0.60 | \n",
" 0.175198 | \n",
" -0.175198 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.10 | \n",
" | \n",
"
\n",
" \n",
" | 11 | \n",
" 0.70 | \n",
" 0.087599 | \n",
" -0.087599 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.10 | \n",
" | \n",
"
\n",
" \n",
" | 12 | \n",
" 0.80 | \n",
" 0.043799 | \n",
" -0.043799 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.10 | \n",
" | \n",
"
\n",
" \n",
" | 13 | \n",
" 0.90 | \n",
" 0.021900 | \n",
" -0.021900 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.10 | \n",
" | \n",
"
\n",
" \n",
" | 14 | \n",
" 1.00 | \n",
" 0.010950 | \n",
" -0.010950 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.10 | \n",
" | \n",
"
\n",
" \n",
" | 15 | \n",
" 1.10 | \n",
" 0.005475 | \n",
" -0.005475 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.10 | \n",
" | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" TIME Delta A Delta B reaction substep time_subdivision delta_time \\\n",
"0 0.00 3.500000 -3.500000 0 0 2 0.05 \n",
"1 0.05 2.625000 -2.625000 0 1 2 0.05 \n",
"2 0.10 1.968750 -1.968750 0 0 2 0.05 \n",
"3 0.15 1.476562 -1.476562 0 1 2 0.05 \n",
"4 0.20 1.107422 -1.107422 0 0 2 0.05 \n",
"5 0.25 0.830566 -0.830566 0 1 2 0.05 \n",
"6 0.30 0.622925 -0.622925 0 0 2 0.05 \n",
"7 0.35 0.467194 -0.467194 0 1 2 0.05 \n",
"8 0.40 0.700790 -0.700790 0 0 1 0.10 \n",
"9 0.50 0.350395 -0.350395 0 0 1 0.10 \n",
"10 0.60 0.175198 -0.175198 0 0 1 0.10 \n",
"11 0.70 0.087599 -0.087599 0 0 1 0.10 \n",
"12 0.80 0.043799 -0.043799 0 0 1 0.10 \n",
"13 0.90 0.021900 -0.021900 0 0 1 0.10 \n",
"14 1.00 0.010950 -0.010950 0 0 1 0.10 \n",
"15 1.10 0.005475 -0.005475 0 0 1 0.10 \n",
"\n",
" caption \n",
"0 \n",
"1 \n",
"2 \n",
"3 \n",
"4 \n",
"5 \n",
"6 \n",
"7 \n",
"8 \n",
"9 \n",
"10 \n",
"11 \n",
"12 \n",
"13 \n",
"14 \n",
"15 "
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dynamics.get_diagnostic_data(rxn_index=0) # For the 0-th reaction (the only reaction in our case)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "98515b8d",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}