Examples input for the Cantera interface¶
Imports¶
Import the mumpce interface and the interface to Cantera.
In [1]:
import mumpce as mumpce
import mumpce.cantera_utils as mpct
/opt/anaconda3/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88
return f(*args, **kwds)
Import Numerical Python and Pandas
In [2]:
import numpy as np
import pandas as pd
Creating the Measurements¶
Reading the experimental data file¶
In [3]:
filename = 'Example_measurements.xlsx'
df_dict = pd.read_excel(filename,sheet_name=None)
This creates a dictionary of Pandas DataFrame objects, keyed by the sheet name in Excel. We will use these to create the measurement lists.
Initializing the experimental measurement list¶
Use each DataFrame in the data dictionary to initialize a measurement list.
In [4]:
measurements = dict()
for key in df_dict:
print(key)
df = df_dict[key]
measurements[key] = mpct.measurement_initialize_pd(df)
Flame speeds
Ignition delay
Single-pulse shock tube
Reactions
Write out comma-separated versions of the DataFrames for use in other parts of the documentation.
In [5]:
for key in df_dict:
csv_file = key + '.csv'
csv_example_file = key + ' example.csv'
print(csv_file)
df = df_dict[key].drop('Comment',axis=1)
df.to_csv(csv_file,index=False)
df[0:4].to_csv(csv_example_file,index=False)
Flame speeds.csv
Ignition delay.csv
Single-pulse shock tube.csv
Reactions.csv
Including activation energies as active parameters¶
In [6]:
keys_include_E = ['Single-pulse shock tube','Reactions']
for key in keys_include_E:
print(key)
df = df_dict[key]
measurements[key] = mpct.measurement_initialize_pd(df,no_energy=False)
Single-pulse shock tube
Reactions
Parameter uncertainties¶
Read the parameter uncertainties, which we will use when we conduct a full MUM-PCE analysis later
In [7]:
from read_uncertainties import read_uncertainties
mpct_model = measurements['Single-pulse shock tube'][0].model
parameter_uncertainties = read_uncertainties(uncertainty_file='uncert.txt',mumpce_cantera_model=mpct_model)
Creating the Projects¶
Projects from a single list¶
Each measurement list can be used to create an independent project.
In [8]:
projects = dict()
for key in df_dict:
projects[key] = mumpce.Project(measurement_list=measurements[key],name=key)
In [9]:
project = projects['Single-pulse shock tube']
print(project)
Single-pulse shock tube
15 measurements
pro_Aa1 (Active): Specified mole frac: 850 K, 211.63 kPa, C4H10:0.010711755,C6H5CH3:0.040294685,tBPO:3.32e-05,O2:0,AR:0.9489603600000001, mole fraction of C2H4 at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pro_Aa2 (Active): Specified mole frac: 950 K, 295.51 kPa, C4H10:0.010711755,C6H5CH3:0.040294685,tBPO:3.32e-05,O2:0,AR:0.9489603600000001, mole fraction of C2H4 at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pro_Aa3 (Active): Specified mole frac: 1050 K, 363.41 kPa, C4H10:0.010711755,C6H5CH3:0.040294685,tBPO:3.32e-05,O2:0,AR:0.9489603600000001, mole fraction of C2H4 at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pro_Ab1 (Active): Specified mole frac: 850 K, 211.63 kPa, C4H10:0.010711755,C6H5CH3:0.040294685,tBPO:3.32e-05,O2:0,AR:0.9489603600000001, mole fraction of C3H6 at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pro_Ab2 (Active): Specified mole frac: 950 K, 295.51 kPa, C4H10:0.010711755,C6H5CH3:0.040294685,tBPO:3.32e-05,O2:0,AR:0.9489603600000001, mole fraction of C3H6 at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pro_Ab3 (Active): Specified mole frac: 1050 K, 363.41 kPa, C4H10:0.010711755,C6H5CH3:0.040294685,tBPO:3.32e-05,O2:0,AR:0.9489603600000001, mole fraction of C3H6 at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Ac1 (Active): Concentration ratio: 850 K, 211.63 kPa, C4H10:0.010711755,C6H5CH3:0.040294685,tBPO:3.32e-05,O2:0,AR:0.9489603600000001, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Ac2 (Active): Concentration ratio: 950 K, 295.51 kPa, C4H10:0.010711755,C6H5CH3:0.040294685,tBPO:3.32e-05,O2:0,AR:0.9489603600000001, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Ac3 (Active): Concentration ratio: 1050 K, 363.41 kPa, C4H10:0.010711755,C6H5CH3:0.040294685,tBPO:3.32e-05,O2:0,AR:0.9489603600000001, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Cc1 (Active): Concentration ratio: 900 K, 137.66 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Cc2 (Active): Concentration ratio: 950 K, 157.68 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Cc3 (Active): Concentration ratio: 1000 K, 175.70 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Cc4 (Active): Concentration ratio: 1050 K, 192.00 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Cc5 (Active): Concentration ratio: 1100 K, 206.82 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Cc6 (Active): Concentration ratio: 1150 K, 220.34 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
In [10]:
project = projects['Reactions']
print(project)
Reactions
9 measurements
rxn_632_297 (Active): Reaction C4H10 + H <=> H2 + pC4H9:E: 297 K, 303.98 kPa
K.R. Jennings, R.J. Cvetanovic, J. Chem. Phys. 35 (1961), 1233-1240.
rxn_632_329 (Active): Reaction C4H10 + H <=> H2 + pC4H9:E: 329 K, 303.98 kPa
K. Yang, J. Phys. Chem. 67 (1963), 562-566.
rxn_632_513 (Active): Reaction C4H10 + H <=> H2 + pC4H9:E: 513 K, 303.98 kPa
K. Yang, J. Phys. Chem. 67 (1963), 562-566.
rxn_63r_318 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 318 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
rxn_63r_325 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 325 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
rxn_63r_350 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 350 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
rxn_63r_375 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 375 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
rxn_63r_400 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 400 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
rxn_63r_413 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 413 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
Projects from a combined list¶
Measurements from different lists can be split and combined to create a custom measurement list for a bigger project. In this case, we want to create a study of H-atom abstraction from butane by H atoms, a subset of the study by Manion, Sheen, & Awan. We start by building the project’s application list, which is going to be all of the single-pulse shock tube measurements where H-atom attack is the primary process. These measurements have names of the form ‘pul_Cxx’.
In [11]:
applist = [item for item in measurements['Single-pulse shock tube'] if '_C' in item.name]
Then we create the reaction list by pulling the experimental rate ratios from the list. We don’t include the low-temperature rate constant measurements because we already know from Manion, Sheen, & Awan that JetSurF is inconsistent with those measurements. The rate ratio measurements have names of the form ‘rxn_63r_xxx’.
In [12]:
rxnlist = [item for item in measurements['Reactions'] if 'r_' in item.name]
Then we create the measurement list by using python’s list.pop()
method, which lets us pull the 1 and 5 elements from the applist. We create the measurement list as a new list with these items, and then attach the reaction rate ratio measurements.
In [13]:
mlist = [applist.pop(5),applist.pop(1)] + rxnlist
Now with the measurement and application lists created, we initialize a new Project
with these lists. Notice that the application list has all of the ‘pul_Cxx’ except for those we added to the measurement list.
In [14]:
project_Habs = mumpce.Project(measurement_list=mlist,application_list=applist,
name='H_abstraction_from_butane_by_H',
parameter_uncertainties=parameter_uncertainties
)
print(project_Habs)
H_abstraction_from_butane_by_H
12 measurements
pul_Cc6 (Active): Concentration ratio: 1150 K, 220.34 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Cc2 (Active): Concentration ratio: 950 K, 157.68 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
rxn_63r_318 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 318 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
rxn_63r_325 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 325 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
rxn_63r_350 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 350 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
rxn_63r_375 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 375 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
rxn_63r_400 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 400 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
rxn_63r_413 (Active): Rate ratio k_[C4H10 + H <=> H2 + sC4H9:E]/k_[C4H10 + H <=> H2 + pC4H9:E]: 413 K, 303.98 kPa
J.M. Campbell, O.P. Strausz, H.E. Gunning, Can. J. Chem. 47 (1969), 3759-3762
pul_Cc1 (Application): Concentration ratio: 900 K, 137.66 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Cc3 (Application): Concentration ratio: 1000 K, 175.70 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Cc4 (Application): Concentration ratio: 1050 K, 192.00 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
pul_Cc5 (Application): Concentration ratio: 1100 K, 206.82 kPa, C4H10:0.001020921,HME:5.73e-05,O2:0,AR:0.998921779, [C2H4]/[C3H6] at 0.5 ms
J. A. Manion, D. A. Sheen, I. A. Awan, J. Phys. Chem. A 119 (2015), 7637-7658.
In [15]:
project_Habs.find_sensitivity()
pul_Cc6
pul_Cc2
rxn_63r_318
rxn_63r_325
rxn_63r_350
rxn_63r_375
rxn_63r_400
rxn_63r_413
pul_Cc1
pul_Cc3
pul_Cc4
pul_Cc5
In [16]:
project_Habs.find_active_parameters(0.02)
pul_Cc6
pul_Cc2
rxn_63r_318
rxn_63r_325
rxn_63r_350
rxn_63r_375
rxn_63r_400
rxn_63r_413
In [17]:
sensitivity_cutoff = 0.02
project_Habs.active_parameters = np.array([],dtype=int)
for meas in project_Habs:
all_parameters = np.arange(meas.model.number_parameters,dtype=int)
uncertainties_this = project_Habs.parameter_uncertainties[:meas.model.number_parameters]
impact_factor_list = meas.sensitivity_list * np.log(uncertainties_this)
max_sens = abs(impact_factor_list).max()*sensitivity_cutoff
active_parameters_this = all_parameters[abs(impact_factor_list) > max_sens]
project_Habs.active_parameters = np.union1d(project_Habs.active_parameters,active_parameters_this)
project_Habs.active_parameter_uncertainties = project_Habs.parameter_uncertainties[project_Habs.active_parameters]
print(project_Habs.active_parameters)
[ 377 540 541 877 878 879 880 881 898 914 915 942 968 988
989 990 991 992 1009 1312]
In [18]:
project_Habs.set_active_parameters()
In [19]:
project_Habs.make_response()
In [20]:
m = project_Habs.run_optimization()
(20,)
Both actual and predicted relative reductions in the sum of squares
are at most 0.000000
In [21]:
print(project_Habs.interpret_model())
Parameter name Value Uncert FactVal FactUnc NewVal Uncert
C2H4 + H (+M) <=> C2H5 (+M):HpA : 1.4e+06 3.00 0.63 0.79 2.7e+06 2.38
C3H6 + H <=> C2H4 + CH3:A : 8e+18 2.00 -0.10 0.99 7.5e+18 1.99
C3H6 + H <=> C2H4 + CH3:E : 4.7e+07 1.12 0.09 0.99 4.7e+07 1.12
C4H81 + H (+M) <=> sC4H9 (+M):HpA : 1.3e+10 3.00 -0.05 0.98 1.3e+10 2.93
C4H81 + H <=> C2H4 + C2H5:A : 1.6e+19 3.00 -0.08 1.00 1.5e+19 2.99
C4H81 + H <=> C2H4 + C2H5:E : 4.7e+07 1.20 0.06 1.00 4.7e+07 1.19
C4H81 + H <=> C3H6 + CH3:A : 3.2e+19 5.00 0.22 0.97 4.6e+19 4.77
C4H81 + H <=> C3H6 + CH3:E : 4.7e+07 1.20 -0.12 0.99 4.6e+07 1.20
C4H82 + H (+M) <=> sC4H9 (+M):HpA : 1.3e+10 3.00 0.06 0.98 1.4e+10 2.93
H + iC4H8 <=> C3H6 + CH3:A : 8e+18 3.00 0.15 0.99 9.4e+18 2.96
H + iC4H8 <=> C3H6 + CH3:E : 4.7e+07 1.20 -0.11 0.99 4.6e+07 1.19
C3H6 + CH3 (+M) <=> sC4H9 (+M):HpA : 1.7e+08 2.00 0.19 0.95 1.9e+08 1.93
tC4H9 (+M) <=> H + iC4H8 (+M):HpA : 8.3e+13 2.00 -0.09 1.00 7.8e+13 1.99
2 C2H5 (+M) <=> C4H10 (+M):HpA : 1.9e+11 2.00 0.25 0.97 2.2e+11 1.96
C4H10 + H <=> H2 + pC4H9:A : 9.2e+02 3.00 -0.09 0.73 8.3e+02 2.24
C4H10 + H <=> H2 + pC4H9:E : 2.8e+07 1.20 0.06 0.54 2.9e+07 1.10
C4H10 + H <=> H2 + sC4H9:A : 2.4e+03 3.00 -0.03 0.71 2.3e+03 2.19
C4H10 + H <=> H2 + sC4H9:E : 1.9e+07 1.20 0.21 0.83 1.9e+07 1.16
C4H10 + CH3 <=> CH4 + pC4H9:A : 0.0009 3.00 -0.00 1.00 0.0009 3.00
HME <=> 2 tC4H9:E : 2.9e+08 1.02 0.11 0.99 2.9e+08 1.02
In [22]:
project_Habs.remove_inconsistent_measurements()
(20,)
Both actual and predicted relative reductions in the sum of squares
are at most 0.000000
No inconsistent measurements
In [23]:
print(project_Habs.validate_solution())
Name Value Unc OptVal OptUnc MdlVal MdlUnc
pul_Cc6 : 0.20 0.05 0.24 0.06 0.30 0.75
pul_Cc2 : -0.14 0.05 -0.18 0.07 -0.24 0.86
rxn_63r_318 : 3.61 0.13 3.65 0.07 3.77 1.50
rxn_63r_325 : 3.55 0.13 3.58 0.06 3.69 1.48
rxn_63r_350 : 3.32 0.13 3.33 0.05 3.42 1.40
rxn_63r_375 : 3.13 0.13 3.11 0.05 3.20 1.34
rxn_63r_400 : 2.97 0.13 2.92 0.05 2.99 1.28
rxn_63r_413 : 2.88 0.13 2.83 0.05 2.90 1.26
pul_Cc1 : -0.25 0.05 2.80 3.55 -0.47 10.77
pul_Cc3 : -0.04 0.05 -0.07 0.19 -0.09 0.96
pul_Cc4 : 0.05 0.05 0.00 0.07 0.03 0.82
pul_Cc5 : 0.13 0.05 0.12 0.06 0.16 0.80
In [24]:
print(project_Habs.interpret_model())
Parameter name Value Uncert FactVal FactUnc NewVal Uncert
C2H4 + H (+M) <=> C2H5 (+M):HpA : 1.4e+06 3.00 0.63 0.79 2.7e+06 2.38
C3H6 + H <=> C2H4 + CH3:A : 8e+18 2.00 -0.10 0.99 7.5e+18 1.99
C3H6 + H <=> C2H4 + CH3:E : 4.7e+07 1.12 0.09 0.99 4.7e+07 1.12
C4H81 + H (+M) <=> sC4H9 (+M):HpA : 1.3e+10 3.00 -0.05 0.98 1.3e+10 2.93
C4H81 + H <=> C2H4 + C2H5:A : 1.6e+19 3.00 -0.08 1.00 1.5e+19 2.99
C4H81 + H <=> C2H4 + C2H5:E : 4.7e+07 1.20 0.06 1.00 4.7e+07 1.19
C4H81 + H <=> C3H6 + CH3:A : 3.2e+19 5.00 0.22 0.97 4.6e+19 4.77
C4H81 + H <=> C3H6 + CH3:E : 4.7e+07 1.20 -0.12 0.99 4.6e+07 1.20
C4H82 + H (+M) <=> sC4H9 (+M):HpA : 1.3e+10 3.00 0.06 0.98 1.4e+10 2.93
H + iC4H8 <=> C3H6 + CH3:A : 8e+18 3.00 0.15 0.99 9.4e+18 2.96
H + iC4H8 <=> C3H6 + CH3:E : 4.7e+07 1.20 -0.11 0.99 4.6e+07 1.19
C3H6 + CH3 (+M) <=> sC4H9 (+M):HpA : 1.7e+08 2.00 0.19 0.95 1.9e+08 1.93
tC4H9 (+M) <=> H + iC4H8 (+M):HpA : 8.3e+13 2.00 -0.09 1.00 7.8e+13 1.99
2 C2H5 (+M) <=> C4H10 (+M):HpA : 1.9e+11 2.00 0.25 0.97 2.2e+11 1.96
C4H10 + H <=> H2 + pC4H9:A : 9.2e+02 3.00 -0.09 0.73 8.3e+02 2.24
C4H10 + H <=> H2 + pC4H9:E : 2.8e+07 1.20 0.06 0.54 2.9e+07 1.10
C4H10 + H <=> H2 + sC4H9:A : 2.4e+03 3.00 -0.03 0.71 2.3e+03 2.19
C4H10 + H <=> H2 + sC4H9:E : 1.9e+07 1.20 0.21 0.83 1.9e+07 1.16
C4H10 + CH3 <=> CH4 + pC4H9:A : 0.0009 3.00 -0.00 1.00 0.0009 3.00
HME <=> 2 tC4H9:E : 2.9e+08 1.02 0.11 0.99 2.9e+08 1.02
In [ ]: