{
"cells": [
{
"cell_type": "markdown",
"id": "3bbe8002-bdf3-490c-bde0-80dd3713a3d0",
"metadata": {},
"source": [
"## Association/Dissociation reaction `A + B <-> C`\n",
"#### with 1st-order kinetics for each species, taken to equilibrium.\n",
"#### Exploration of debugging and diagnostics options\n",
"(Adaptive variable time substeps are used)\n",
"\n",
"_See also the experiment \"1D/reactions/reaction_4\"_ \n",
"\n",
" # For the 0-th reaction (the only reaction in our case)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "13e55c1d-609f-4bf0-a004-6c45bcfcbc99",
"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": "bdad128a-9214-46f5-aeb9-a7b77c81aa3e",
"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": "83c3cc5f-de21-4f66-9988-2806fbf0666d",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-> Output will be LOGGED into the file 'react_3.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": "9329208b-070f-4902-8f37-0f11ddf75ed6",
"metadata": {},
"source": [
"# Initialize the System\n",
"Specify the chemicals and the reactions"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "72b4245c-de4e-480d-a501-3495b7ed8bc4",
"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\", \"C\"])\n",
"\n",
"# Reaction A + B <-> C , with 1st-order kinetics for each species\n",
"chem_data.add_reaction(reactants=[\"A\" , \"B\"], products=[\"C\"],\n",
" forward_rate=5., reverse_rate=2.)\n",
"\n",
"print(\"Number of reactions: \", chem_data.number_of_reactions())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "00ea560d-9a49-4041-b119-6de11bfcc7af",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of reactions: 1 (at temp. 25 C)\n",
"0: A + B <-> C (kF = 5 / kR = 2 / Delta_G = -2,271.45 / K = 2.5) | 1st order in all reactants & products\n"
]
}
],
"source": [
"chem_data.describe_reactions()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "cb582868-431c-4022-aa0e-a2f554f80d6c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[GRAPHIC ELEMENT SENT TO LOG FILE `react_3.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": "98a9fbe5-2090-4d38-9c5f-94fbf7c3eae2",
"metadata": {},
"source": [
"# Start the simulation"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "c2f4a554-807b-49f9-8ca2-8d929fe6eeef",
"metadata": {},
"outputs": [],
"source": [
"dynamics = ReactionDynamics(reaction_data=chem_data)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "ae304704-c8d9-4cef-9e0b-2587bb3909ef",
"metadata": {},
"outputs": [],
"source": [
"# Initial concentrations of all the chemicals, in index order\n",
"dynamics.set_conc([10., 50., 20.], snapshot=True)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "a605dacf-2c67-403e-9aa9-5be25fc9f481",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SYSTEM STATE at Time t = 0:\n",
"3 species:\n",
" Species 0 (A). Conc: 10.0\n",
" Species 1 (B). Conc: 50.0\n",
" Species 2 (C). Conc: 20.0\n"
]
}
],
"source": [
"dynamics.describe_state()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "0ff2c242-a15b-456d-ad56-0ba1041c0b4c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" SYSTEM TIME | \n",
" A | \n",
" B | \n",
" C | \n",
" caption | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.0 | \n",
" 10.0 | \n",
" 50.0 | \n",
" 20.0 | \n",
" Initial state | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" SYSTEM TIME A B C caption\n",
"0 0.0 10.0 50.0 20.0 Initial state"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dynamics.get_history()"
]
},
{
"cell_type": "markdown",
"id": "fc516ca2-e62d-4784-b826-5372ff7f4c75",
"metadata": {
"tags": []
},
"source": [
"## Run the reaction"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "2502cd11-0df9-4303-8895-98401a1df7b8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"single_compartment_react(): setting abs_fast_threshold to 2.5\n",
"15 total step(s) taken\n"
]
}
],
"source": [
"dynamics.set_diagnostics() # To save diagnostic information about the call to single_compartment_react()\n",
"#dynamics.verbose_list = [1] # Uncomment for detailed run information (meant for debugging the adaptive variable time step)\n",
"\n",
"dynamics.single_compartment_react(time_step=0.004, reaction_duration=0.06,\n",
" snapshots={\"initial_caption\": \"1st reaction step\",\n",
" \"final_caption\": \"last reaction step\"},\n",
" dynamic_substeps=2, rel_fast_threshold=1)"
]
},
{
"cell_type": "markdown",
"id": "99a9a4b2-a588-4ba5-85c9-0a5a5d1dbaad",
"metadata": {},
"source": [
"### Note: the argument _dynamic_step=2_ splits the time steps in 2 whenever the reaction is \"fast\" (as determined using the given value of _fast_threshold_ )"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "80fbaee3-bd6f-4197-9270-23374d46a4a7",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" SYSTEM TIME | \n",
" A | \n",
" B | \n",
" C | \n",
" caption | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.000 | \n",
" 10.000000 | \n",
" 50.000000 | \n",
" 20.000000 | \n",
" Initial state | \n",
"
\n",
" \n",
" | 1 | \n",
" 0.002 | \n",
" 5.080000 | \n",
" 45.080000 | \n",
" 24.920000 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 2 | \n",
" 0.004 | \n",
" 2.889616 | \n",
" 42.889616 | \n",
" 27.110384 | \n",
" 1st reaction step | \n",
"
\n",
" \n",
" | 3 | \n",
" 0.006 | \n",
" 1.758712 | \n",
" 41.758712 | \n",
" 28.241288 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 4 | \n",
" 0.008 | \n",
" 1.137262 | \n",
" 41.137262 | \n",
" 28.862738 | \n",
" | \n",
"
\n",
" \n",
" | 5 | \n",
" 0.010 | \n",
" 0.784874 | \n",
" 40.784874 | \n",
" 29.215126 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 6 | \n",
" 0.012 | \n",
" 0.581625 | \n",
" 40.581625 | \n",
" 29.418375 | \n",
" | \n",
"
\n",
" \n",
" | 7 | \n",
" 0.014 | \n",
" 0.463266 | \n",
" 40.463266 | \n",
" 29.536734 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 8 | \n",
" 0.016 | \n",
" 0.393960 | \n",
" 40.393960 | \n",
" 29.606040 | \n",
" | \n",
"
\n",
" \n",
" | 9 | \n",
" 0.018 | \n",
" 0.353248 | \n",
" 40.353248 | \n",
" 29.646752 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 10 | \n",
" 0.020 | \n",
" 0.329288 | \n",
" 40.329288 | \n",
" 29.670712 | \n",
" | \n",
"
\n",
" \n",
" | 11 | \n",
" 0.022 | \n",
" 0.315171 | \n",
" 40.315171 | \n",
" 29.684829 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 12 | \n",
" 0.024 | \n",
" 0.306849 | \n",
" 40.306849 | \n",
" 29.693151 | \n",
" | \n",
"
\n",
" \n",
" | 13 | \n",
" 0.026 | \n",
" 0.301940 | \n",
" 40.301940 | \n",
" 29.698060 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 14 | \n",
" 0.028 | \n",
" 0.299045 | \n",
" 40.299045 | \n",
" 29.700955 | \n",
" | \n",
"
\n",
" \n",
" | 15 | \n",
" 0.032 | \n",
" 0.295628 | \n",
" 40.295628 | \n",
" 29.704372 | \n",
" | \n",
"
\n",
" \n",
" | 16 | \n",
" 0.036 | \n",
" 0.295013 | \n",
" 40.295013 | \n",
" 29.704987 | \n",
" | \n",
"
\n",
" \n",
" | 17 | \n",
" 0.040 | \n",
" 0.294902 | \n",
" 40.294902 | \n",
" 29.705098 | \n",
" | \n",
"
\n",
" \n",
" | 18 | \n",
" 0.044 | \n",
" 0.294882 | \n",
" 40.294882 | \n",
" 29.705118 | \n",
" | \n",
"
\n",
" \n",
" | 19 | \n",
" 0.048 | \n",
" 0.294878 | \n",
" 40.294878 | \n",
" 29.705122 | \n",
" | \n",
"
\n",
" \n",
" | 20 | \n",
" 0.052 | \n",
" 0.294878 | \n",
" 40.294878 | \n",
" 29.705122 | \n",
" | \n",
"
\n",
" \n",
" | 21 | \n",
" 0.056 | \n",
" 0.294877 | \n",
" 40.294877 | \n",
" 29.705123 | \n",
" | \n",
"
\n",
" \n",
" | 22 | \n",
" 0.060 | \n",
" 0.294877 | \n",
" 40.294877 | \n",
" 29.705123 | \n",
" last reaction step | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" SYSTEM TIME A B C \\\n",
"0 0.000 10.000000 50.000000 20.000000 \n",
"1 0.002 5.080000 45.080000 24.920000 \n",
"2 0.004 2.889616 42.889616 27.110384 \n",
"3 0.006 1.758712 41.758712 28.241288 \n",
"4 0.008 1.137262 41.137262 28.862738 \n",
"5 0.010 0.784874 40.784874 29.215126 \n",
"6 0.012 0.581625 40.581625 29.418375 \n",
"7 0.014 0.463266 40.463266 29.536734 \n",
"8 0.016 0.393960 40.393960 29.606040 \n",
"9 0.018 0.353248 40.353248 29.646752 \n",
"10 0.020 0.329288 40.329288 29.670712 \n",
"11 0.022 0.315171 40.315171 29.684829 \n",
"12 0.024 0.306849 40.306849 29.693151 \n",
"13 0.026 0.301940 40.301940 29.698060 \n",
"14 0.028 0.299045 40.299045 29.700955 \n",
"15 0.032 0.295628 40.295628 29.704372 \n",
"16 0.036 0.295013 40.295013 29.704987 \n",
"17 0.040 0.294902 40.294902 29.705098 \n",
"18 0.044 0.294882 40.294882 29.705118 \n",
"19 0.048 0.294878 40.294878 29.705122 \n",
"20 0.052 0.294878 40.294878 29.705122 \n",
"21 0.056 0.294877 40.294877 29.705123 \n",
"22 0.060 0.294877 40.294877 29.705123 \n",
"\n",
" caption \n",
"0 Initial state \n",
"1 Interm. step, due to the fast rxns: [0] \n",
"2 1st reaction step \n",
"3 Interm. step, due to the fast rxns: [0] \n",
"4 \n",
"5 Interm. step, due to the fast rxns: [0] \n",
"6 \n",
"7 Interm. step, due to the fast rxns: [0] \n",
"8 \n",
"9 Interm. step, due to the fast rxns: [0] \n",
"10 \n",
"11 Interm. step, due to the fast rxns: [0] \n",
"12 \n",
"13 Interm. step, due to the fast rxns: [0] \n",
"14 \n",
"15 \n",
"16 \n",
"17 \n",
"18 \n",
"19 \n",
"20 \n",
"21 \n",
"22 last reaction step "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = dynamics.get_history()\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "1598a75b-0322-45ac-bf2c-21fd09049966",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"From time 0 to 0.028, in 14 substeps of 0.002 (each 1/2 of full step)\n",
"From time 0.028 to 0.06, in 8 FULL steps of 0.004\n"
]
}
],
"source": [
"dynamics.explain_time_advance()"
]
},
{
"cell_type": "markdown",
"id": "9fb5f6b8-dde3-415d-9e90-b8d102bfd748",
"metadata": {},
"source": [
"### Notice how the reaction proceeds in smaller steps in the early times, when the concentrations are changing much more rapidly"
]
},
{
"cell_type": "markdown",
"id": "b1366038-2dea-4d69-a655-ae464ca22922",
"metadata": {},
"source": [
"## Note: \"A\" (now largely depleted) is the limiting reagent"
]
},
{
"cell_type": "markdown",
"id": "c02a8f55-a671-4771-86c9-fc4d1b126bf8",
"metadata": {},
"source": [
"### Check the final equilibrium"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "b139f5e4-625f-4a5e-8f57-8f00244dced4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.29487741, 40.29487741, 29.70512259])"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dynamics.get_system_conc()"
]
},
{
"cell_type": "markdown",
"id": "d25eedf3-89f8-4f8c-a49a-d2689103528b",
"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] = 0.29487741 , [B] = 40.29487741 , [C] = 29.70512259\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "765f6f39-4b2e-4a86-b6a9-ace9d1941663",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"A + B <-> C\n",
"Final concentrations: [C] = 29.71 ; [A] = 0.2949 ; [B] = 40.29\n",
"1. Ratio of reactant/product concentrations, adjusted for reaction orders: 2.5\n",
" Formula used: [C] / ([A][B])\n",
"2. Ratio of forward/reverse reaction rates: 2.5\n",
"Discrepancy between the two values: 1.598e-06 %\n",
"Reaction IS in equilibrium (within 1% tolerance)\n",
"\n"
]
},
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Verify that the reaction has reached equilibrium\n",
"dynamics.is_in_equilibrium()"
]
},
{
"cell_type": "markdown",
"id": "6ac3dd4e-9dd0-4d3a-aa83-76102bd79524",
"metadata": {
"tags": []
},
"source": [
"## Plots of changes of concentration with time"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "5f73e330-2d43-4cef-b2a0-c6eb379eea2e",
"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": "red",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines",
"name": "A",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
0,
0.002,
0.004,
0.006,
0.008,
0.01,
0.012,
0.014,
0.016,
0.018000000000000002,
0.02,
0.022,
0.024,
0.026000000000000002,
0.028,
0.032,
0.036000000000000004,
0.04000000000000001,
0.04400000000000001,
0.048000000000000015,
0.05200000000000002,
0.05600000000000002,
0.060000000000000026
],
"xaxis": "x",
"y": [
10,
5.08,
2.889616,
1.75871232972544,
1.1372618579290792,
0.7848744219907281,
0.5816248769235212,
0.46326555167185557,
0.3939601190827676,
0.3532481852190524,
0.3292880755869497,
0.3151713866825845,
0.30684881643298606,
0.3019403326325964,
0.2990447586043246,
0.29562803829905593,
0.2950126646128477,
0.29490178216002727,
0.294881800952302,
0.2948782002521845,
0.2948775513887401,
0.2948774344603777,
0.2948774133893138
],
"yaxis": "y"
},
{
"hovertemplate": "Chemical=B
SYSTEM TIME=%{x}
concentration=%{y}",
"legendgroup": "B",
"line": {
"color": "violet",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines",
"name": "B",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
0,
0.002,
0.004,
0.006,
0.008,
0.01,
0.012,
0.014,
0.016,
0.018000000000000002,
0.02,
0.022,
0.024,
0.026000000000000002,
0.028,
0.032,
0.036000000000000004,
0.04000000000000001,
0.04400000000000001,
0.048000000000000015,
0.05200000000000002,
0.05600000000000002,
0.060000000000000026
],
"xaxis": "x",
"y": [
50,
45.08,
42.889616000000004,
41.75871232972544,
41.13726185792908,
40.78487442199073,
40.58162487692353,
40.46326555167186,
40.39396011908278,
40.35324818521906,
40.32928807558696,
40.31517138668259,
40.306848816432996,
40.301940332632604,
40.29904475860433,
40.295628038299064,
40.295012664612855,
40.29490178216003,
40.294881800952304,
40.294878200252185,
40.294877551388744,
40.29487743446038,
40.294877413389315
],
"yaxis": "y"
},
{
"hovertemplate": "Chemical=C
SYSTEM TIME=%{x}
concentration=%{y}",
"legendgroup": "C",
"line": {
"color": "green",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines",
"name": "C",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
0,
0.002,
0.004,
0.006,
0.008,
0.01,
0.012,
0.014,
0.016,
0.018000000000000002,
0.02,
0.022,
0.024,
0.026000000000000002,
0.028,
0.032,
0.036000000000000004,
0.04000000000000001,
0.04400000000000001,
0.048000000000000015,
0.05200000000000002,
0.05600000000000002,
0.060000000000000026
],
"xaxis": "x",
"y": [
20,
24.92,
27.110384,
28.24128767027456,
28.86273814207092,
29.21512557800927,
29.41837512307648,
29.536734448328147,
29.606039880917233,
29.64675181478095,
29.67071192441305,
29.684828613317418,
29.693151183567014,
29.698059667367403,
29.700955241395675,
29.704371961700943,
29.704987335387152,
29.70509821783997,
29.705118199047696,
29.705121799747815,
29.70512244861126,
29.70512256553962,
29.705122586610685
],
"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 <-> C . Changes in concentrations with time"
},
"xaxis": {
"anchor": "y",
"autorange": true,
"domain": [
0,
1
],
"range": [
0,
0.060000000000000026
],
"title": {
"text": "SYSTEM TIME"
},
"type": "linear"
},
"yaxis": {
"anchor": "x",
"autorange": true,
"domain": [
0,
1
],
"range": [
-2.466518285866835,
52.76139569925615
],
"title": {
"text": "concentration"
},
"type": "linear"
}
}
},
"image/png": "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EEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAA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",
"text/html": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dynamics.plot_curves(colors=['red', 'violet', 'green'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "226c1b6e-6838-46f3-aab1-9cb20c409724",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "5c747824-a170-439e-96a5-dd35bc81e08b",
"metadata": {},
"source": [
"# Everthing below is just for diagnostic insight \n",
"## into the adaptive variable time steps"
]
},
{
"cell_type": "markdown",
"id": "205c421b-e126-48be-aac6-b44899edf2ea",
"metadata": {},
"source": [
"## WARNING: The explanations below are based on an older system of using RELATIVE concentration changes, and no longer applicable to the newer approach; it'll be corrected in future versions (COMMENTED OUT FOR NOW)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "1af5a2a3-4dc7-49f1-82b8-40e374b9f282",
"metadata": {},
"outputs": [],
"source": [
"# This approach, from the run data, is only usable with single-reaction runs\n",
"#dynamics.examine_run(df=df, time_step=0.004, rel_fast_threshold=1)\n",
"# The arguments step MUST match the value used in call to single_compartment_react()"
]
},
{
"cell_type": "markdown",
"id": "7425390e-197f-4aeb-a6b9-d9d2fb9b422e",
"metadata": {},
"source": [
"# Take a peek at internal diagnostic data from the reactions"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "178211ae-e413-40e6-8684-47ad1d6e5e80",
"metadata": {},
"outputs": [],
"source": [
"# This approach, from internal diagnostic data, \n",
"# is more generally applicable also to runs with multiple reactions\n",
"#dynamics.diagnose_variable_time_steps()"
]
},
{
"cell_type": "markdown",
"id": "6311059b-af68-4dea-bfb1-d032d817ffd6",
"metadata": {},
"source": [
"### The above diagnostics are based on the following diagnostic data:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "4e3012c6-c870-411c-bb80-7e1076233ca3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Reaction: A + B <-> C\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" TIME | \n",
" Delta A | \n",
" Delta B | \n",
" Delta C | \n",
" reaction | \n",
" substep | \n",
" time_subdivision | \n",
" delta_time | \n",
" caption | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.000 | \n",
" -4.920000e+00 | \n",
" -4.920000e+00 | \n",
" 4.920000e+00 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 1 | \n",
" 0.002 | \n",
" -2.190384e+00 | \n",
" -2.190384e+00 | \n",
" 2.190384e+00 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 2 | \n",
" 0.004 | \n",
" -1.130904e+00 | \n",
" -1.130904e+00 | \n",
" 1.130904e+00 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 3 | \n",
" 0.006 | \n",
" -6.214505e-01 | \n",
" -6.214505e-01 | \n",
" 6.214505e-01 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 4 | \n",
" 0.008 | \n",
" -3.523874e-01 | \n",
" -3.523874e-01 | \n",
" 3.523874e-01 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 5 | \n",
" 0.010 | \n",
" -2.032495e-01 | \n",
" -2.032495e-01 | \n",
" 2.032495e-01 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 6 | \n",
" 0.012 | \n",
" -1.183593e-01 | \n",
" -1.183593e-01 | \n",
" 1.183593e-01 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 7 | \n",
" 0.014 | \n",
" -6.930543e-02 | \n",
" -6.930543e-02 | \n",
" 6.930543e-02 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 8 | \n",
" 0.016 | \n",
" -4.071193e-02 | \n",
" -4.071193e-02 | \n",
" 4.071193e-02 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 9 | \n",
" 0.018 | \n",
" -2.396011e-02 | \n",
" -2.396011e-02 | \n",
" 2.396011e-02 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 10 | \n",
" 0.020 | \n",
" -1.411669e-02 | \n",
" -1.411669e-02 | \n",
" 1.411669e-02 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 11 | \n",
" 0.022 | \n",
" -8.322570e-03 | \n",
" -8.322570e-03 | \n",
" 8.322570e-03 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 12 | \n",
" 0.024 | \n",
" -4.908484e-03 | \n",
" -4.908484e-03 | \n",
" 4.908484e-03 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 13 | \n",
" 0.026 | \n",
" -2.895574e-03 | \n",
" -2.895574e-03 | \n",
" 2.895574e-03 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0.002 | \n",
" | \n",
"
\n",
" \n",
" | 14 | \n",
" 0.028 | \n",
" -3.416720e-03 | \n",
" -3.416720e-03 | \n",
" 3.416720e-03 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.004 | \n",
" | \n",
"
\n",
" \n",
" | 15 | \n",
" 0.032 | \n",
" -6.153737e-04 | \n",
" -6.153737e-04 | \n",
" 6.153737e-04 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.004 | \n",
" | \n",
"
\n",
" \n",
" | 16 | \n",
" 0.036 | \n",
" -1.108825e-04 | \n",
" -1.108825e-04 | \n",
" 1.108825e-04 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.004 | \n",
" | \n",
"
\n",
" \n",
" | 17 | \n",
" 0.040 | \n",
" -1.998121e-05 | \n",
" -1.998121e-05 | \n",
" 1.998121e-05 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.004 | \n",
" | \n",
"
\n",
" \n",
" | 18 | \n",
" 0.044 | \n",
" -3.600700e-06 | \n",
" -3.600700e-06 | \n",
" 3.600700e-06 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.004 | \n",
" | \n",
"
\n",
" \n",
" | 19 | \n",
" 0.048 | \n",
" -6.488634e-07 | \n",
" -6.488634e-07 | \n",
" 6.488634e-07 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.004 | \n",
" | \n",
"
\n",
" \n",
" | 20 | \n",
" 0.052 | \n",
" -1.169284e-07 | \n",
" -1.169284e-07 | \n",
" 1.169284e-07 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.004 | \n",
" | \n",
"
\n",
" \n",
" | 21 | \n",
" 0.056 | \n",
" -2.107106e-08 | \n",
" -2.107106e-08 | \n",
" 2.107106e-08 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0.004 | \n",
" | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" TIME Delta A Delta B Delta C reaction substep \\\n",
"0 0.000 -4.920000e+00 -4.920000e+00 4.920000e+00 0 0 \n",
"1 0.002 -2.190384e+00 -2.190384e+00 2.190384e+00 0 1 \n",
"2 0.004 -1.130904e+00 -1.130904e+00 1.130904e+00 0 0 \n",
"3 0.006 -6.214505e-01 -6.214505e-01 6.214505e-01 0 1 \n",
"4 0.008 -3.523874e-01 -3.523874e-01 3.523874e-01 0 0 \n",
"5 0.010 -2.032495e-01 -2.032495e-01 2.032495e-01 0 1 \n",
"6 0.012 -1.183593e-01 -1.183593e-01 1.183593e-01 0 0 \n",
"7 0.014 -6.930543e-02 -6.930543e-02 6.930543e-02 0 1 \n",
"8 0.016 -4.071193e-02 -4.071193e-02 4.071193e-02 0 0 \n",
"9 0.018 -2.396011e-02 -2.396011e-02 2.396011e-02 0 1 \n",
"10 0.020 -1.411669e-02 -1.411669e-02 1.411669e-02 0 0 \n",
"11 0.022 -8.322570e-03 -8.322570e-03 8.322570e-03 0 1 \n",
"12 0.024 -4.908484e-03 -4.908484e-03 4.908484e-03 0 0 \n",
"13 0.026 -2.895574e-03 -2.895574e-03 2.895574e-03 0 1 \n",
"14 0.028 -3.416720e-03 -3.416720e-03 3.416720e-03 0 0 \n",
"15 0.032 -6.153737e-04 -6.153737e-04 6.153737e-04 0 0 \n",
"16 0.036 -1.108825e-04 -1.108825e-04 1.108825e-04 0 0 \n",
"17 0.040 -1.998121e-05 -1.998121e-05 1.998121e-05 0 0 \n",
"18 0.044 -3.600700e-06 -3.600700e-06 3.600700e-06 0 0 \n",
"19 0.048 -6.488634e-07 -6.488634e-07 6.488634e-07 0 0 \n",
"20 0.052 -1.169284e-07 -1.169284e-07 1.169284e-07 0 0 \n",
"21 0.056 -2.107106e-08 -2.107106e-08 2.107106e-08 0 0 \n",
"\n",
" time_subdivision delta_time caption \n",
"0 2 0.002 \n",
"1 2 0.002 \n",
"2 2 0.002 \n",
"3 2 0.002 \n",
"4 2 0.002 \n",
"5 2 0.002 \n",
"6 2 0.002 \n",
"7 2 0.002 \n",
"8 2 0.002 \n",
"9 2 0.002 \n",
"10 2 0.002 \n",
"11 2 0.002 \n",
"12 2 0.002 \n",
"13 2 0.002 \n",
"14 1 0.004 \n",
"15 1 0.004 \n",
"16 1 0.004 \n",
"17 1 0.004 \n",
"18 1 0.004 \n",
"19 1 0.004 \n",
"20 1 0.004 \n",
"21 1 0.004 "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dynamics.get_diagnostic_data(rxn_index=0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f48bc0d4-2ab7-41dc-a80a-c8870dd732bb",
"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
}