├── .gitignore ├── name_params.py ├── LICENSE ├── README.md ├── tableLookUpOneImplicit.py ├── flamelet_integration.py ├── tableLookUpTwoImplicit.py ├── beta_integration.py ├── SLFM.py ├── FM2csv.py ├── flameletTableSingleParameter.py ├── plot_S_curve.ipynb └── test_beta_integration.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore all 2 | * 3 | */ 4 | 5 | # unignore all with extensions 6 | !*.* 7 | 8 | # unignore makefile 9 | !Makefile 10 | 11 | # ignore files 12 | *.ipynb 13 | *.eps 14 | *.swp 15 | *.csv 16 | *.npy 17 | *.h5 18 | .DS_store 19 | 20 | !plot_*.ipynb 21 | !test_*.ipynb 22 | 23 | 24 | # ignore folders 25 | .ipynb_checkpoints/ 26 | __pycache__/ 27 | flamelets/ 28 | OutSteady/ 29 | OutExtinction/ 30 | tables/ 31 | -------------------------------------------------------------------------------- /name_params.py: -------------------------------------------------------------------------------- 1 | def params2name(params): 2 | params_str = [] 3 | for k, v in params.items(): 4 | try: 5 | param_str = '{0}-{1:g}'.format(k,v) 6 | except ValueError: 7 | param_str = '{0}-{1}'.format(k,v) 8 | params_str.append(param_str) 9 | return '_'.join(params_str) 10 | 11 | def name2params(name): 12 | params = {} 13 | params_str = name.split('_') 14 | for param_str in params_str: 15 | param = param_str.split('-',maxsplit=1) 16 | key = param[0] 17 | try: 18 | params[key] = float( param[1] ) 19 | except ValueError: 20 | params[key] = param[1] 21 | return params 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Zhen Lu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # flamelet2table 2 | python scripts to generate table from flamelet solutions 3 | 4 | FM2csv.py: convert FlameMaster solutions to csv files. The file "speciestranslated" is required in the folder of FlameMaster solutions, which is generated when converting CK format to FM format. 5 | 6 | flameletTableSingleParameter.py: integrate the flamelet solutions to obtain a table, output to a hdf5 file 7 | 8 | Beta distribution is assumed for the independent variable in flamelet solution, e.g., mixture fraction and progress variable for nonpremixed and premixed flames respectively. For the flamelet parameter, such as the stoichiometric scalar dissipation rate and reaction progress parameter, delta and beta distributions are available. 9 | 10 | To get the options and help information: 11 | ``` 12 | python FM2csv -h 13 | ``` 14 | ``` 15 | python flameletTableSingleParameter.py -h 16 | ``` 17 | 18 | reference: 19 | ``` 20 | @inproceedings{Lu2018, 21 | author = {{Lu}, Zhen and {Elbaz}, Ayman M. and {Hernandez Perez}, Francisco E. and {Roberts}, William L. and {Im}, Hong G.}, 22 | title = "{LES/flamelet study of vortex-flame interaction in a turbulent nonpremixed swirl burner}", 23 | booktitle = {14th International Conference on Combustion and Energy Utilization}, 24 | year = "2018", 25 | month = "November", 26 | address = "Sendai, Japan" 27 | } 28 | ``` 29 | -------------------------------------------------------------------------------- /tableLookUpOneImplicit.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import h5py 3 | from scipy import interpolate 4 | 5 | def tableLookUpOneImplicit( 6 | x_ave, x_var, p, 7 | filename = 'flameletTable.h5', 8 | p_name = 'ProgressVariable'): 9 | 10 | with h5py.File(filename,'r') as f: 11 | table = f['flameletTable'] 12 | 13 | variable = list(f['variable']) 14 | x_ave_axis = np.array(f[table.dims[1].label]) 15 | x_var_axis = np.array(f[table.dims[2].label]) 16 | param_axis = np.array(f[table.dims[3].label]) 17 | 18 | data = np.array(table) 19 | 20 | idx_p = variable.index( p_name ) 21 | 22 | param_table = np.empty(data.shape[3]) 23 | 24 | # interpolate with explicit index 25 | for i in range( param_axis.size ): 26 | f = interpolate.interp2d(x_var_axis, x_ave_axis, 27 | data[idx_p,:,:,i] ) 28 | param_table[i] = f(x_var, x_ave) 29 | 30 | # interpolate with implicit index 31 | # inverse table 32 | f = interpolate.interp1d( 33 | param_table, param_axis, bounds_error=False, 34 | fill_value=(param_axis[0], param_axis[-1])) 35 | param = f( p ) 36 | 37 | # interpolate all variables 38 | var_table = np.empty((data.shape[0],data.shape[3])) 39 | for i in range( data.shape[0] ): 40 | for j in range( param_axis.size ): 41 | f = interpolate.interp2d(x_var_axis, x_ave_axis, data[i,:,:,j]) 42 | var_table[i,j] = f(x_var, x_ave) 43 | 44 | f = interpolate.interp1d( param_axis, var_table ) 45 | phi = f(param) 46 | 47 | return phi 48 | -------------------------------------------------------------------------------- /flamelet_integration.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from name_params import * 3 | from beta_integration import * 4 | 5 | def single_solution_integration( 6 | solution, x_name, x_ave, x_var, y_names): 7 | 8 | x = solution[x_name] 9 | 10 | f = np.empty((y_names.size, x.size)) 11 | 12 | for i, name in enumerate(y_names): 13 | if name.endswith('Variance'): 14 | f[i,:] = np.square( solution[name[:-8]] ) 15 | else: 16 | f[i,:] = solution[name] 17 | 18 | integration = beta_integration_table(f, x, x_ave, x_var) 19 | 20 | return integration 21 | 22 | def param_solution_integration( 23 | filenames, x_name, x_ave, x_var, y_names): 24 | 25 | table = np.empty((y_names.size, x_ave.size, x_var.size, filenames.size)) 26 | 27 | for i, filename in enumerate( filenames ): 28 | solution = np.genfromtxt(filename, names=True, delimiter=',') 29 | 30 | table[:,:,:,i] = single_solution_integration( 31 | solution, x_name, x_ave, x_var, y_names) 32 | 33 | return table 34 | 35 | 36 | def table_integration( f, x, x_ave, x_var, pdf ): 37 | 38 | if pdf == 'beta' : 39 | table = beta_integration_table(f, x, x_ave, x_var) 40 | else: 41 | table = delta_integration(f, x, x_ave) 42 | 43 | return table 44 | 45 | def geometric_progression_01( n, ratio ): 46 | 47 | v = np.geomspace( 1., np.power(ratio, n-2), num = n-1 ) 48 | r = np.zeros( n ) 49 | 50 | for i in range( n-1 ): 51 | r[i+1] = np.sum( v[:i+1] ) 52 | r /= r[-1] 53 | 54 | return r 55 | 56 | def dependent_variable_names(flamelet, independent_variable): 57 | 58 | names = list( flamelet.dtype.names ) 59 | names.remove( independent_variable ) 60 | 61 | return names 62 | 63 | def dependent_variable_names_print(filename, independent_variable): 64 | with open(filename, 'r') as f: 65 | names = f.readline().rstrip().split(',') 66 | 67 | names.remove( independent_variable ) 68 | 69 | return names 70 | 71 | def sequence_01(mesh, npts, solution, ratio): 72 | 73 | if mesh == 'solution' : 74 | return solution 75 | elif mesh == 'geometric' : 76 | return geometric_progression_01(npts, ratio) 77 | else : 78 | return np.linspace(0., 1., num = npts) 79 | 80 | def reference_solution(filenames, ref_param, p_str, p_end): 81 | 82 | ref_var = np.empty(filenames.size) 83 | 84 | for i, filename in enumerate(filenames): 85 | ref_var[i] = name2params(filename[p_str:p_end])[ref_param] 86 | 87 | filename = filenames[-1] 88 | for i in range( filenames.size-2 ): 89 | if ref_var[i] < ref_var[i+1] and ref_var[i+1] > ref_var[i+2]: 90 | filename = filenames[i+1] 91 | 92 | return np.genfromtxt(filename, names=True, delimiter=',') 93 | -------------------------------------------------------------------------------- /tableLookUpTwoImplicit.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import h5py 3 | from scipy import interpolate 4 | 5 | def tableLookUpTwoImplicit( 6 | x_ave, x_var, p0, p1, 7 | filename = 'flameletTable.h5', 8 | p0_name = 'ProgressVariable', 9 | p1_name = 'ProgressVariableVariance'): 10 | 11 | with h5py.File(filename,'r') as f: 12 | table = f['flameletTable'] 13 | 14 | variable = list(f['variable']) 15 | x_ave_axis = np.array(f[table.dims[1].label]) 16 | x_var_axis = np.array(f[table.dims[2].label]) 17 | param_axis_0 = np.array(f[table.dims[3].label]) 18 | param_axis_1 = np.array(f[table.dims[4].label]) 19 | 20 | data = np.array(table) 21 | 22 | idx_p0 = variable.index( p0_name ) 23 | idx_p1 = variable.index( p1_name ) 24 | 25 | param_table = np.empty((2,)+data.shape[3:]) 26 | 27 | # interpolate with explicit index 28 | for i in range( param_axis_0.size ): 29 | for j in range( param_axis_1.size ): 30 | f = interpolate.interp2d(x_var_axis, x_ave_axis, 31 | data[idx_p0,:,:,i,j] ) 32 | param_table[0,i,j] = f(x_var, x_ave) 33 | 34 | f = interpolate.interp2d(x_var_axis, x_ave_axis, 35 | data[idx_p1,:,:,i,j] ) 36 | param_table[1,i,j] = f(x_var, x_ave) 37 | 38 | # interpolate with implicit index 39 | # inverse table 40 | table_inverse = np.empty( (2, param_axis_0.size) ) 41 | for i in range( param_axis_0.size ): 42 | f = interpolate.interp1d( 43 | param_table[1,i,:], param_table[0,i,:], bounds_error=False, 44 | fill_value=(param_table[0,i,0], param_table[0,i,-1]) ) 45 | table_inverse[0,i] = f( p1 ) 46 | 47 | f = interpolate.interp1d( 48 | param_table[1,i,:], param_axis_1, bounds_error=False, 49 | fill_value=(param_axis_1[0], param_axis_1[-1])) 50 | table_inverse[1,i] = f( p1 ) 51 | 52 | f = interpolate.interp1d( 53 | table_inverse[0,:], table_inverse[1,:], bounds_error=False, 54 | fill_value=(table_inverse[1,0], table_inverse[1,-1])) 55 | param_1 = f( p0 ) 56 | 57 | f = interpolate.interp1d( 58 | table_inverse[0,:], param_axis_0, bounds_error=False, 59 | fill_value=(param_axis_0[0], param_axis_0[-1])) 60 | param_0 = f( p0 ) 61 | 62 | # interpolate all variables 63 | var_table = np.empty((data.shape[0],)+data.shape[3:]) 64 | for k in range( data.shape[0] ): 65 | for i in range( param_axis_0.size ): 66 | for j in range( param_axis_1.size ): 67 | f = interpolate.interp2d(x_var_axis, x_ave_axis, data[k,:,:,i,j]) 68 | var_table[k,i,j] = f(x_var, x_ave) 69 | 70 | phi = np.zeros(var_table.shape[0]) 71 | for k in range( var_table.shape[0] ): 72 | f = interpolate.interp2d( param_axis_1, param_axis_0, var_table[k,:,:] ) 73 | phi[k] = f(param_0, param_1) 74 | 75 | return phi 76 | -------------------------------------------------------------------------------- /beta_integration.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import numpy.polynomial.polynomial as P 3 | from scipy.stats import beta 4 | from scipy.interpolate import interp1d 5 | import scipy as sp 6 | 7 | # calculate the beta pdf coefficients alpha and beta 8 | def beta_coef(ave, var): 9 | 10 | a = ave*(1./var-1.) 11 | b = (1.-ave)*(1./var-1.) 12 | 13 | return a, b 14 | 15 | 16 | # analytic integration with beta pdf, with linear fit of the target function 17 | def beta_integration_analytic(f, x, B, CDF0, CDF1): 18 | 19 | c0 = np.zeros(x.size) 20 | c1 = np.zeros(x.size) 21 | 22 | for i in range(x.size-1): 23 | cl1 = (f[i+1] - f[i])/(x[i+1]-x[i]) 24 | cl0 = f[i] - cl1*x[i] 25 | 26 | c0[i] -= cl0 27 | c0[i+1] += cl0 28 | 29 | c1[i] -= cl1 30 | c1[i+1] += cl1 31 | 32 | c1 *= B 33 | 34 | return np.sum(c0*CDF0+c1*CDF1) 35 | 36 | 37 | # integration with the delta pdf, implemented as a linear interp 38 | def delta_integration(f, x, x_ave): 39 | 40 | y = interp1d(x, f, kind='linear') 41 | 42 | return y(x_ave) 43 | 44 | 45 | # integration with the bimodal pdf 46 | def bimodal_integration(f, x_ave): 47 | 48 | return f[0]*(1.-x_ave)+f[-1]*x_ave 49 | 50 | 51 | # beta integration of one average and one variance 52 | def beta_integration( 53 | f, x, x_ave, x_nvar, 54 | B, CDF0, CDF1, EPS): 55 | 56 | if x_ave < EPS: 57 | return f[0] 58 | elif x_ave > 1.-EPS: 59 | return f[-1] 60 | elif x_nvar < EPS: 61 | return delta_integration(f, x, x_ave) 62 | elif x_nvar > 1.-EPS: 63 | return bimodal_integration(f, x_ave) 64 | else: 65 | return beta_integration_analytic( 66 | f, x, B, CDF0, CDF1) 67 | 68 | 69 | # calculate the coefficients for analytic beta integration 70 | def beta_integration_coef(x, x_ave, x_nvar): 71 | 72 | a, b = beta_coef(x_ave, x_nvar) 73 | 74 | rv0 = beta(a, b) 75 | cdf0 = rv0.cdf(x) 76 | B0 = sp.special.beta(a, b) 77 | 78 | rv1 = beta(a+1., b) 79 | cdf1 = rv1.cdf(x) 80 | B1 = sp.special.beta(a+1, b) 81 | 82 | B = B1/B0 83 | 84 | return B, cdf0, cdf1 85 | 86 | 87 | # calculate the coefficients for analytic beta integration 88 | def beta_integration_coef_table(x, x_ave, x_var, EPS): 89 | 90 | B = np.empty((x_ave.size, x_var.size)) 91 | CDF0 = np.empty((x_ave.size, x_var.size, x.size)) 92 | CDF1 = np.empty((x_ave.size, x_var.size, x.size)) 93 | 94 | for j, ave in enumerate(x_ave): 95 | for k, var in enumerate(x_var): 96 | if ave > EPS and ave < 1.-EPS and var > EPS and var < 1.-EPS : 97 | B[j,k], CDF0[j,k,:], CDF1[j,k,:] = beta_integration_coef( 98 | x, ave, var) 99 | 100 | return B, CDF0, CDF1 101 | 102 | 103 | # beta integration of a average and variance table 104 | def beta_integration_table(f, x, x_ave, x_var, EPS=1.e-9): 105 | 106 | f_flatten = np.reshape(f, (-1, x.size), order='F') 107 | 108 | variable_number = f_flatten.shape[0] 109 | 110 | table_flatten = np.empty((variable_number, x_ave.size, x_var.size)) 111 | 112 | B, CDF0, CDF1 = beta_integration_coef_table(x, x_ave, x_var, EPS) 113 | 114 | for i, v in enumerate(f_flatten): 115 | for j, ave in enumerate(x_ave): 116 | for k, var in enumerate(x_var): 117 | table_flatten[i,j,k] = beta_integration( 118 | v, x, ave, var, 119 | B[j,k], CDF0[j,k,:], CDF1[j,k,:], EPS) 120 | 121 | table = np.reshape(table_flatten, 122 | f.shape[:-1]+(x_ave.size, x_var.size), 123 | order='F') 124 | 125 | return table 126 | -------------------------------------------------------------------------------- /SLFM.py: -------------------------------------------------------------------------------- 1 | import os 2 | import glob 3 | import argparse 4 | import numpy as np 5 | import h5py 6 | from beta_integration import beta_integration 7 | from flamelet_integration import * 8 | from name_params import * 9 | 10 | def table_SLFM(dir_name = 'flamelets', 11 | average_mesh = 'solution', 12 | average_num = 100, 13 | variance_mesh = 'geometric', 14 | variance_num = 15, 15 | variance_ratio = 1.1): 16 | 17 | independent_variable = 'Z' 18 | 19 | # get the flamelet solutions 20 | file_suffix = 'csv' 21 | 22 | chi = np.zeros(1) 23 | os.chdir(dir_name) 24 | for filename in glob.glob('.'.join(['*', file_suffix])): 25 | params = name2params( filename[:-1-len(file_suffix)] ) 26 | chi = np.append(chi, params['chi']) 27 | os.chdir('..') 28 | chi = np.delete( chi, 0, 0 ) 29 | chi = np.sort( chi ) 30 | 31 | # take the flamelet solution with largest chi_st 32 | params = { 'chi' : chi[-1] } 33 | file_prefix = params2name( params ) 34 | 35 | filename = '{0}/{1}.{2}'.format(dir_name, file_prefix, file_suffix) 36 | flamelet = np.genfromtxt(filename, names=True, delimiter=',') 37 | 38 | # the variables to be integrated 39 | variable_names = dependent_variable_names( 40 | flamelet, independent_variable, 'chi') 41 | 42 | # the average axis 43 | independent_average = average_sequence( 44 | average_mesh,flamelet[independent_variable],average_num) 45 | 46 | # the variance axis 47 | independent_variance = sequence_01( 48 | variance_mesh, variance_num, variance_ratio) 49 | 50 | flamelet_table = np.empty((variable_names.size, 51 | independent_average.size, 52 | independent_variance.size, 53 | chi.size)) 54 | 55 | for l, chi_st in enumerate(chi): 56 | params = { 'chi' : chi_st } 57 | file_prefix = params2name( params ) 58 | 59 | filename = '{0}/{1}.{2}'.format(dir_name, file_prefix, file_suffix) 60 | flamelet = np.genfromtxt(filename, names=True, delimiter=',') 61 | 62 | flamelet_table[:,:,:,l] = single_solution_integration( 63 | flamelet, 64 | independent_variable, 65 | independent_average, 66 | independent_variance, 67 | variable_names) 68 | 69 | # save the flamelet table 70 | with h5py.File('flameletTable.h5', 'w') as f: 71 | 72 | f['flameletTable'] = flamelet_table 73 | 74 | # strings 75 | dt = h5py.special_dtype(vlen=str) 76 | ds = f.create_dataset('variable', 77 | variable_names.shape, 78 | dtype=dt) 79 | ds[...] = variable_names 80 | 81 | f['mixtureFractionAverage'] = independent_average 82 | f['mixtureFractionNormalizedVariance'] = independent_variance 83 | f['stoichiometricScalarDissipationRate'] = chi 84 | 85 | f['flameletTable'].dims.create_scale( 86 | f['variable'], 87 | 'variable') 88 | 89 | f['flameletTable'].dims.create_scale( 90 | f['mixtureFractionAverage'], 91 | 'mixtureFractionAverage') 92 | 93 | f['flameletTable'].dims.create_scale( 94 | f['mixtureFractionNormalizedVariance'], 95 | 'mixtureFractionNormalizedVariance') 96 | 97 | f['flameletTable'].dims.create_scale( 98 | f['stoichiometricScalarDissipationRate'], 99 | 'stoichiometricScalarDissipationRate') 100 | 101 | f['flameletTable'].dims[3].attach_scale( 102 | f['stoichiometricScalarDissipationRate']) 103 | 104 | f['flameletTable'].dims[2].attach_scale( 105 | f['mixtureFractionNormalizedVariance']) 106 | 107 | f['flameletTable'].dims[1].attach_scale( 108 | f['mixtureFractionAverage']) 109 | 110 | f['flameletTable'].dims[0].attach_scale( 111 | f['variable']) 112 | 113 | return 114 | 115 | if __name__ == '__main__': 116 | 117 | parser = argparse.ArgumentParser() 118 | 119 | parser.add_argument( 120 | '-f', '--folder', 121 | default = 'flamelets', 122 | type = str, 123 | help = 'folder of the flamelet solutions [flamelets]') 124 | 125 | parser.add_argument( 126 | '-a', '--average-mesh', 127 | default = 'solution', 128 | type = str, 129 | help = 'mesh of average [solution]/uniform') 130 | 131 | parser.add_argument( 132 | '--number-average', 133 | default = 100, 134 | type = int, 135 | help = 'the number of points on the axis of average [100]') 136 | 137 | parser.add_argument( 138 | '-v', '--variance-mesh', 139 | default = 'geometric', 140 | type = str, 141 | help = 'mesh of variance [geometric]/uniform') 142 | 143 | parser.add_argument( 144 | '--number-variance', 145 | default = 15, 146 | type = int, 147 | help = 'the number of points on the axis of variance [15]') 148 | 149 | parser.add_argument( 150 | '--ratio-variance', 151 | default = 1.1, 152 | type = float, 153 | help = 'growth rate of the variance mesh [1.1]') 154 | 155 | args = parser.parse_args() 156 | 157 | table_SLFM(dir_name = args.folder, 158 | average_mesh = args.average_mesh, 159 | average_num = args.number_average, 160 | variance_mesh = args.variance_mesh, 161 | variance_num = args.number_variance, 162 | variance_ratio = args.ratio_variance) 163 | -------------------------------------------------------------------------------- /FM2csv.py: -------------------------------------------------------------------------------- 1 | """ 2 | A python script to transfer FlameMaster output to csv tables 3 | """ 4 | 5 | import numpy as np 6 | from scipy.interpolate import interp1d 7 | import os 8 | import sys 9 | import glob 10 | import argparse 11 | from name_params import params2name 12 | 13 | def FM2csv(mode = 'SLFM', 14 | flamelet_prefix = 'CH4_p01_0', 15 | FlameMaster_dir = 'OutSteady', 16 | csv_dir = 'flamelets'): 17 | 18 | if not os.path.exists(FlameMaster_dir): 19 | sys.exit('FlameMaster output not found') 20 | 21 | os.makedirs(csv_dir,exist_ok=True) 22 | 23 | # the number of columns in FlameMaster output 24 | NCOL = 5 25 | file_suffix = 'csv' 26 | 27 | # read the species names into dictionary 28 | # key: species names in FlameMaster 29 | # value: species names in Chemkin mechanism 30 | name_dict = {} 31 | with open('{}/speciestranslated'.format(FlameMaster_dir),'r') as f: 32 | for line in f: 33 | names = line.split() 34 | name_dict['-'.join(['massfraction',names[1]])] = names[0] 35 | 36 | name_dict['temperature'] = 'T' 37 | name_dict['density'] = 'rho' 38 | 39 | extra_var = ['Z', 'chi', 'lambda', 'cp', 'mu', 'D', 40 | 'ProdRateCO2', 'ProdRateH2O', 'ProdRateCO', 'ProdRateH2', 41 | 'TotalEnthalpy', 'HeatRelease', 42 | 'ProgressVariable', 'ProdRateProgressVariable'] 43 | 44 | prog_var_spe = ['CO2', 'CO', 'H2O', 'H2'] 45 | 46 | for name in extra_var: 47 | name_dict[name] = name 48 | 49 | for flamelet in glob.glob('{0}/{1}*'.format(FlameMaster_dir, 50 | flamelet_prefix)): 51 | 52 | # skip diverged solution 53 | if flamelet.endswith('noC'): 54 | continue 55 | 56 | params = {} 57 | 58 | params['chi'] = float( 59 | flamelet[flamelet.find('chi')+3:flamelet.find('tf')]) 60 | 61 | with open(flamelet,'r') as f: 62 | 63 | # read the header part 64 | for line in f: 65 | if line.startswith('Z_st'): 66 | Zst = float(line.split()[2]) 67 | elif line.startswith('gridPoints'): 68 | npts = int(line.split()[-1]) 69 | nrow = np.ceil(npts/NCOL) 70 | elif line.startswith('body'): 71 | break 72 | 73 | name_FlameMaster = list(name_dict.keys()) 74 | name_csv = list(name_dict.values()) 75 | 76 | data = np.zeros((npts, len(name_FlameMaster)),order='F') 77 | 78 | for line in f: 79 | 80 | if line.strip() == '': 81 | continue 82 | elif line.startswith('trailer'): 83 | break 84 | 85 | var_name = line.split()[0] 86 | 87 | # read data 88 | var = [] 89 | for i in np.arange(nrow): 90 | data_line = f.readline().split() 91 | var.extend([float(x) for x in data_line]) 92 | 93 | # map names 94 | if var_name in name_FlameMaster : 95 | i = name_csv.index( name_dict[var_name] ) 96 | data[:,i] = np.array( var ) 97 | 98 | # calculate Diffusivity with Le = 1 99 | idx_D = name_csv.index( 'D' ) 100 | idx_lambda = name_csv.index( 'lambda' ) 101 | idx_rho = name_csv.index( 'rho' ) 102 | idx_cp = name_csv.index( 'cp' ) 103 | data[:,idx_D] = data[:,idx_lambda]/(data[:,idx_rho]*data[:,idx_cp]) 104 | 105 | # calculate the progress variable based on the list prog_var_spe 106 | idx_C = name_csv.index( 'ProgressVariable' ) 107 | idx_C_rate = name_csv.index( 'ProdRateProgressVariable' ) 108 | for spe in prog_var_spe: 109 | idx_spe = name_csv.index( spe ) 110 | idx_spe_rate = name_csv.index( 'ProdRate{}'.format(spe) ) 111 | 112 | data[:,idx_C] += data[:,idx_spe] 113 | data[:,idx_C_rate] += data[:,idx_spe_rate] 114 | 115 | 116 | if mode == 'FPV' : 117 | params['T'] = float( 118 | flamelet[flamelet.find('Tst')+3:]) 119 | 120 | idx_Z = name_csv.index( 'Z' ) 121 | y = interp1d( data[:,idx_Z], data[:,idx_C] ) 122 | params['ProgressVariable'] = y( Zst ) 123 | 124 | # file name 125 | file_prefix = params2name( params ) 126 | 127 | np.savetxt('{}/{}.{}'.format(csv_dir,file_prefix,file_suffix), 128 | data, 129 | fmt = '%12.6e', 130 | delimiter = ',', 131 | header = ','.join(name_csv), 132 | comments='') 133 | 134 | return 135 | 136 | if __name__ == '__main__' : 137 | parser = argparse.ArgumentParser() 138 | parser.add_argument( 139 | '-m', '--mode', 140 | default = 'SLFM', 141 | type = str, 142 | help = 'use of the flamelet solutions: [SLFM]/FPV') 143 | parser.add_argument( 144 | '-p', '--prefix', 145 | default = 'CH4_p01_0', 146 | type = str, 147 | help = 'file prefix of the flamelet solution [CH4_p01_0]') 148 | parser.add_argument( 149 | '--FlameMasterFolder', 150 | default = 'OutSteady', 151 | type = str, 152 | help = 'folder of the FlameMaster solutions [OutSteady]') 153 | parser.add_argument( 154 | '--csvFolder', 155 | default = 'flamelets', 156 | type = str, 157 | help = 'folder for output csv files [flamelets]') 158 | args = parser.parse_args() 159 | 160 | FM2csv(mode = args.mode, 161 | flamelet_prefix = args.prefix, 162 | FlameMaster_dir = args.FlameMasterFolder, 163 | csv_dir = args.csvFolder) 164 | -------------------------------------------------------------------------------- /flameletTableSingleParameter.py: -------------------------------------------------------------------------------- 1 | import glob 2 | import argparse 3 | import numpy as np 4 | import h5py 5 | from flamelet_integration import * 6 | from beta_integration import delta_integration 7 | from name_params import name2params 8 | 9 | def single_param_table( 10 | mode = 'SLFM', dir_name = 'flamelets', output='flameletTable.h5', 11 | param_mesh = 'solution', param_pdf = 'delta', 12 | average_mesh = 'solution', average_num = 100, 13 | variance_mesh = 'geometric', variance_num = 15, variance_ratio = 1.1): 14 | 15 | if mode == 'SLFM' : 16 | independent_variable = 'Z' 17 | param_name = 'chi' 18 | ref_param = 'chi' 19 | elif mode == 'FPV' : 20 | independent_variable = 'Z' 21 | param_name = 'ProgressVariable' 22 | ref_param = 'chi' 23 | elif mode == 'FPI' : 24 | independent_variable = 'ProgressVariable' 25 | param_name = 'Z' 26 | ref_param = 'ProgressVariable' 27 | else : 28 | print('mode not implemented') 29 | return 30 | 31 | # get the flamelet solutions 32 | file_suffix = 'csv' 33 | 34 | p_str = 1 + len( dir_name ) 35 | p_end = -1 - len( file_suffix ) 36 | 37 | # get file and parameter list 38 | param = [] 39 | filenames = [] 40 | 41 | for filename in glob.glob('{}/*.{}'.format(dir_name,file_suffix)): 42 | params = name2params(filename[p_str:p_end]) 43 | param.append( params[param_name] ) 44 | filenames.append( filename ) 45 | 46 | param = np.array(param) 47 | idx = np.argsort(param) 48 | 49 | param = param[idx] 50 | param = (param-param[0])/(param[-1]-param[0]) 51 | 52 | filenames = np.array( filenames )[idx] 53 | 54 | # get the referecen flamelet 55 | flamelet = reference_solution(filenames, ref_param, p_str, p_end) 56 | 57 | # the variables to be integrated 58 | names = dependent_variable_names( 59 | flamelet, independent_variable) 60 | 61 | if param_pdf != 'delta' and mode != 'FPI' : 62 | names.append('{}Variance'.format(param_name)) 63 | 64 | variable_names = np.array( names ) 65 | 66 | names = dependent_variable_names_print( 67 | filenames[0], independent_variable) 68 | 69 | names_print = np.array( names ) 70 | 71 | # the independent variable average axis 72 | independent_average = sequence_01( 73 | average_mesh, average_num, flamelet[independent_variable], 1.) 74 | 75 | # the variance axis 76 | normalized_variance = sequence_01( 77 | variance_mesh, variance_num, np.linspace(0.,1.), variance_ratio) 78 | 79 | # the parameter average axis 80 | param_average = sequence_01( 81 | param_mesh, average_num, param, 1.) 82 | 83 | # flamelet table with the parameter from solutions 84 | flamelet_table_solution = param_solution_integration( 85 | filenames, 86 | independent_variable, independent_average, normalized_variance, 87 | variable_names) 88 | 89 | flamelet_table = table_integration(flamelet_table_solution, 90 | param, 91 | param_average, 92 | normalized_variance, 93 | param_pdf) 94 | 95 | if mode == 'FPI' : 96 | # integration of the max progress variable for normalization 97 | normalization_param = np.zeros( (2, param.size) ) 98 | for i in range( param.size ): 99 | params = name2params( filenames[i][p_str:p_end] ) 100 | normalization_param[0,i] = params[ref_param] 101 | normalization_param[1,:] = np.square( normalization[0,:] ) 102 | 103 | normalization_table = table_integration(normalization_param, 104 | param, 105 | param_average, 106 | normalized_variance, 107 | param_pdf) 108 | elif param_pdf != 'delta' : 109 | # variance for implicit parameter 110 | idx = list(variable_names).index( param_name ) 111 | flamelet_table[-1,:,:,:,:] -= np.square( flamelet_table[idx,:,:,:,:] ) 112 | 113 | # name of data axis 114 | axis = [] 115 | axis.append( 'variables' ) 116 | axis.append( '{}Average'.format(independent_variable) ) 117 | axis.append( '{}NormalizedVariance'.format(independent_variable) ) 118 | axis.append( 'Parameter{}Average'.format(param_name) ) 119 | axis.append( 'Parameter{}Variance'.format(param_name) ) 120 | 121 | # save the flamelet table 122 | with h5py.File(output, 'w') as f: 123 | 124 | f['flameletTable'] = flamelet_table 125 | 126 | # strings 127 | dt = h5py.special_dtype(vlen=str) 128 | ds = f.create_dataset(axis[0], 129 | names_print.shape, 130 | dtype=dt) 131 | ds[...] = names_print 132 | 133 | f[axis[1]] = independent_average 134 | f[axis[2]] = normalized_variance 135 | f[axis[3]] = param_average 136 | 137 | if param_pdf != 'delta': 138 | f[axis[4]] = normalized_variance 139 | else: 140 | del axis[-1] 141 | 142 | for i, v in enumerate(axis): 143 | f['flameletTable'].dims[i].label = v 144 | f['flameletTable'].dims.create_scale(f[v], v) 145 | f['flameletTable'].dims[i].attach_scale(f[v]) 146 | 147 | if mode == 'FPI' : 148 | f['maxProgressVariable'] = normalization_table 149 | 150 | f['maxProgressVariable'].dims[0].label = 'MeanAndSquareMean' 151 | for i, v in enumerate(axis[3:]): 152 | f['maxProgressVariable'].dims[i+1].label = v 153 | 154 | return 155 | 156 | if __name__ == '__main__': 157 | 158 | parser = argparse.ArgumentParser() 159 | 160 | parser.add_argument( 161 | '-m', '--mode', 162 | default = 'FPV', 163 | type = str, 164 | help = 'use of the flamelet solutions: SLFM/[FPV]/FPI') 165 | 166 | parser.add_argument( 167 | '-f', '--folder', 168 | default = 'flamelets', 169 | type = str, 170 | help = 'folder of the flamelet solutions [flamelets]') 171 | 172 | parser.add_argument( 173 | '-o', '--output', 174 | default = 'flameletTable.h5', 175 | type = str, 176 | help = 'output file name [flameletTable.h5]') 177 | 178 | parser.add_argument( 179 | '-p', '--parameter-mesh', 180 | default = 'uniform', 181 | type = str, 182 | help = 'mesh of the flamelet parameter solution/[uniform]') 183 | 184 | parser.add_argument( 185 | '--parameter-pdf', 186 | default = 'delta', 187 | type = str, 188 | help = 'pdf of the flamelet parameter [delta]/beta') 189 | 190 | parser.add_argument( 191 | '-a', '--average-mesh', 192 | default = 'uniform', 193 | type = str, 194 | help = 'mesh of average solution/[uniform]') 195 | 196 | parser.add_argument( 197 | '--number-average', 198 | default = 100, 199 | type = int, 200 | help = 'the number of points on the axis of average [100]') 201 | 202 | parser.add_argument( 203 | '-v', '--variance-mesh', 204 | default = 'geometric', 205 | type = str, 206 | help = 'mesh of variance [geometric]/uniform') 207 | 208 | parser.add_argument( 209 | '--number-variance', 210 | default = 15, 211 | type = int, 212 | help = 'the number of points on the axis of variance [15]') 213 | 214 | parser.add_argument( 215 | '--ratio-variance', 216 | default = 1.1, 217 | type = float, 218 | help = 'growth rate of the variance mesh [1.1]') 219 | 220 | args = parser.parse_args() 221 | 222 | args = parser.parse_args() 223 | 224 | single_param_table( 225 | mode = args.mode, dir_name = args.folder, output = args.output, 226 | param_mesh = args.parameter_mesh, param_pdf = args.parameter_pdf, 227 | average_mesh = args.average_mesh, average_num = args.number_average, 228 | variance_mesh = args.variance_mesh, variance_num = args.number_variance, 229 | variance_ratio = args.ratio_variance) 230 | -------------------------------------------------------------------------------- /plot_S_curve.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import os\n", 10 | "import glob\n", 11 | "import numpy as np\n", 12 | "import matplotlib.pyplot as plt\n", 13 | "from name_params import *\n", 14 | "from flamelet_integration import *" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 2, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "filenum = 100.\n", 24 | "dir_name = 'flamelets'\n", 25 | "file_suffix = 'csv'\n", 26 | "\n", 27 | "filenames = []\n", 28 | "chi = np.zeros(1)\n", 29 | "T = np.zeros(1)\n", 30 | "C = np.zeros(1)\n", 31 | "\n", 32 | "os.chdir(dir_name)\n", 33 | "for filename in glob.glob('.'.join(['*', file_suffix])):\n", 34 | " params = name2params( filename[:-1-len(file_suffix)] )\n", 35 | " chi = np.append(chi, params['chi'])\n", 36 | " T = np.append(T, params['T'])\n", 37 | " C = np.append(C, params['ProgressVariable'])\n", 38 | " filenames.append(filename)\n", 39 | "os.chdir('..')\n", 40 | "\n", 41 | "chi = np.delete( chi, 0, 0 )\n", 42 | "T = np.delete( T, 0, 0 )\n", 43 | "C = np.delete( C, 0, 0 )" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 3, 49 | "metadata": {}, 50 | "outputs": [], 51 | "source": [ 52 | "idx = np.argsort( T )[::-1]" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 4, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "chi = chi[idx]\n", 62 | "T = T[idx]\n", 63 | "C = C[idx]\n", 64 | "filenames = np.array( filenames )[idx]" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 5, 70 | "metadata": {}, 71 | "outputs": [], 72 | "source": [ 73 | "list_delete = []\n", 74 | "Lambda = (T-T[-1])/(T[0]-T[-1])\n", 75 | "#Lambda = (C-C[-1])/(C[0]-C[-1])\n", 76 | "diff_limit = 1./3./filenum\n", 77 | "v_old = Lambda[0] + 1.\n", 78 | "for i, v in enumerate(Lambda):\n", 79 | " if v_old - v > diff_limit :\n", 80 | " v_old = v\n", 81 | " else:\n", 82 | " list_delete.append(i)" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 6, 88 | "metadata": {}, 89 | "outputs": [ 90 | { 91 | "data": { 92 | "text/plain": [ 93 | "[]" 94 | ] 95 | }, 96 | "execution_count": 6, 97 | "metadata": {}, 98 | "output_type": "execute_result" 99 | }, 100 | { 101 | "data": { 102 | "image/png": "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\n", 103 | "text/plain": [ 104 | "
" 105 | ] 106 | }, 107 | "metadata": { 108 | "needs_background": "light" 109 | }, 110 | "output_type": "display_data" 111 | } 112 | ], 113 | "source": [ 114 | "plt.semilogx(chi, T, '.')" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 7, 120 | "metadata": {}, 121 | "outputs": [ 122 | { 123 | "data": { 124 | "text/plain": [ 125 | "[]" 126 | ] 127 | }, 128 | "execution_count": 7, 129 | "metadata": {}, 130 | "output_type": "execute_result" 131 | }, 132 | { 133 | "data": { 134 | "image/png": "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\n", 135 | "text/plain": [ 136 | "
" 137 | ] 138 | }, 139 | "metadata": { 140 | "needs_background": "light" 141 | }, 142 | "output_type": "display_data" 143 | } 144 | ], 145 | "source": [ 146 | "plt.plot(chi,T,'.')" 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": 8, 152 | "metadata": {}, 153 | "outputs": [ 154 | { 155 | "data": { 156 | "text/plain": [ 157 | "[]" 158 | ] 159 | }, 160 | "execution_count": 8, 161 | "metadata": {}, 162 | "output_type": "execute_result" 163 | }, 164 | { 165 | "data": { 166 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAD8CAYAAACRkhiPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xd8lFXa//HPRe+9k8SAFOktYlvL6q5ixYarq8Kij+iuus3dn2199NEHV9eyllV8cEHEgrr2giKoyOrSQhUIBEINBAiEHhJSrt8fc7M7YoCQSTKTzPf9euWVe86ce+Y63CFX5pxzn2PujoiIxKca0Q5ARESiR0lARCSOKQmIiMQxJQERkTimJCAiEseUBERE4piSgIhIHFMSEBGJY0oCIiJxrFa0AziaVq1aeXJycrTDEBGpMubNm7fN3VuXpm7MJ4Hk5GRSU1OjHYaISJVhZutKW1fdQSIicUxJQEQkjh01CZhZopl9ZWZpZrbUzH4TlD9mZsvNbLGZvWdmzYLyZDPbb2YLg68Xwl5rkJl9Z2arzOwZM7OKa5qIiBxNaT4JFAJ3uHsP4GTgVjPrCUwFert7XyAduDvsnAx37x983RJWPgYYBXQNvoaURyNERKRsjpoE3D3L3ecHx3uANKCju3/u7oVBtVlAwpFex8zaA03cfaaHNjGYCFwaUfQiIhKRYxoTMLNkYAAw+5CnbgA+DXvcycwWmNnXZnZ6UNYRyAyrkxmUlfQ+o8ws1cxSs7OzjyVEERE5BqVOAmbWCHgH+K277w4rv5dQl9FrQVEWkOTuA4DfA6+bWROgpP7/Erc1c/ex7p7i7imtW5dqqquIiJRBqZKAmdUmlABec/d3w8pHABcB1wZdPLh7vrtvD47nARlAN0J/+Yd3GSUAm8qjESIi1cm8dTsYOyOjUt6rNLODDBgHpLn7k2HlQ4A7gUvcPTesvLWZ1QyOOxMaAF7t7lnAHjM7OXjN4cAH5doaEZEq7v0FG7l67Exem72effmFRz8hQqW5Y/g04HrgOzNbGJTdAzwD1AWmBjM9ZwUzgc4AHjSzQqAIuMXdc4LzfglMAOoTGkMIH0cQEYlrX63Yyh3/WMSJyc154bpBNKxb8Ys6HPUd3P0bSu7Pn3yY+u8Q6joq6blUoPexBCgiEg/mr9/Br16dzwntGvP3ESfSqBISAOiOYRGRqFuzbR83TphLmyZ1mTBycKUlAFASEBGJqq278xg+PjTr/uWRg2nduG6lvn/MryIqIlJd7ckrYPj4OWzfe4DXbzqZ5FYNKz0GJQERkSgoKCrmttcXsHLrXiaMPJH+ic2iEoe6g0REKpm7c+973/F1ejb/e2lvTu8avZtilQRERCrZC1+v5q3UTH59dheuGZwU1ViUBEREKtFnS7L4y5TlXNS3Pb/7abdoh6MkICJSWZZs3MVv31zIgMRmPD6sH7GwpYqSgIhIJdi2N59RE1Np2bAuY4enUK92zWiHBGh2kIhIhTtQWMyvXp1PTu4B3r7lVFo1qtx7AY5ESUBEpAK5O/e9v4Q5a3N4+ur+9O7YNNohfY+6g0REKtDYGat5M3UDt/24C0P7l7iPVlQpCYiIVJDZq7fz6GfLubBPe+44N/ozgUqiJCAiUgG27snjtkkLOK5lQx65ok9MzAQqicYERETK2cElIfbmFfLqjSfRuF7taId0WEoCIiLl7LEpK5izJoenftaf7u0aRzucIyrN9pKJZvaVmaWZ2VIz+01Q3sLMpprZyuB786DczOwZM1tlZovNbGDYa40I6q8M9icWEalWPlq0ibEzVjP8lOO4dEDsDQQfqjRjAoXAHe7eAzgZuNXMegJ3AV+4e1fgi+AxwPmE9hXuCowCxkAoaQD3AycBg4H7DyYOEZHqYHHmTv4QbA9574U9oh1OqRw1Cbh7lrvPD473AGlAR2Ao8HJQ7WXg0uB4KDDRQ2YBzcysPXAeMNXdc9x9BzAVGFKurRERiZKduQf45avzadWoLi9cN4i6tWLjjuCjOabZQWaWDAwAZgNt3T0LQokCaBNU6whsCDstMyg7XLmISJVWXOzc8dYitu7J47lrB9Iyhu4IPppSJwEza0RoA/nfuvvuI1UtocyPUF7Se40ys1QzS83Ozi5tiCIiUTHm6wy+WL6VP13YM2qbw5RVqZKAmdUmlABec/d3g+ItQTcPwfetQXkmkBh2egKw6QjlP+DuY909xd1TWreO3mYLIiJH83V6No9/voJL+nVg+CnHRTucY1aa2UEGjAPS3P3JsKc+BA7O8BkBfBBWPjyYJXQysCvoLpoCnGtmzYMB4XODMhGRKmnd9n3c/vp8urdtHNM3hB1Jae4TOA24HvjOzBYGZfcAjwBvmdmNwHpgWPDcZOACYBWQC4wEcPccM3sImBvUe9Ddc8qlFSIilWxvfiGjJs7DzBh7fQoN6lTN266OGrW7f0PJ/fkA55RQ34FbD/Na44HxxxKgiEisKS52fvvGQlZlhzaJT2rZINohlZnWDhIROUZPTUtnWtoW7ruwR1Q3iS8PSgIiIsfgsyVZPPPlKq5KSWDEqcnRDidiSgIiIqW0aMNOfv/WIvonNuOhS3tXyYHgQykJiIiUQkb2XkZOmEuLhnUYe33VuSP4aJQERESOYuPO/QwfN4caBq/ceBJtmtSLdkjlpmrOaRIRqSRb9+Rx7Yuz2J1XwKSbTqZTq4bRDqlc6ZOAiMhhbN6Vx7UvzmbrnnwmjBwcc5vElwd9EhARKcGqrXsZMX4Ou/YXMG7EiQw6rnqufK8kICJyiDlrcrj5lVRq1qjBG6NOrpafAA5Sd5CISJhJc9Zz7d9n0bxBHd755SnVOgGAPgmIiACQV1DE6E/SeGXWOs7s1ppnrhlA0/qxu0F8eVESEJG4l75lD7+etIDlm/cw6ozO3DnkBGrWqPo3gpWGkoCIxC1355VZ6xj9SRqN69Vi/C9SOPuEttEOq1IpCYhIXErL2s1/f7CEuWt3cFb31jx2ZT9aN64620KWFyUBEYkru/MKePLzdF6ZtY6m9Wvz6BV9uColsVqsA1QWSgIiEhfcnY8WZ/HgR8vYvi+fa09K4g/ndqdZgzrRDi2qlAREpNrbkJPLn95fwtfp2fRNaMpLvziRPgnVe+pnaR01CZjZeOAiYKu79w7K3gS6B1WaATvdvb+ZJQNpwIrguVnufktwziBgAlCf0BaUvwl2IRMRqRAFRcWM+2YNT01Lp6YZ91/ck+GnJMfNzJ/SKM0ngQnA34CJBwvc/WcHj83sCWBXWP0Md+9fwuuMAUYBswglgSHAp8cesojIkRUWFTN12Rae/mIlyzfv4dyebfmfob1o37R+tEOLOaXZY3hG8Bf+D1hoJOUq4OwjvYaZtQeauPvM4PFE4FKUBESkHOXsO8Abc9fz6sx1bNqVR2KL+vzf9YM4r1e7aIcWsyIdEzgd2OLuK8PKOpnZAmA38Cd3/yfQEcgMq5MZlImIRCwtazcvfbuGDxZuIr+wmNO6tOSBS3pxTo+26vo5ikiTwDXApLDHWUCSu28PxgDeN7NeQElX4bDjAWY2ilDXEUlJSRGGKCLVkbszc/V2Xvh6NTPSs6lXuwZXDEpgxCnJdG/XONrhVRllTgJmVgu4HBh0sMzd84H84HiemWUA3Qj95Z8QdnoCsOlwr+3uY4GxACkpKRo8FpF/Kyp2pizdzAtfZ7A4cxetGtXlj+d159qTkuJ+umdZRPJJ4CfAcnf/dzePmbUGcty9yMw6A12B1e6eY2Z7zOxkYDYwHHg2ksBFJL7kFRTx9rxMXvznatZtz6VTq4Y8fFkfLh/YkXq1q8d+v9FQmimik4CzgFZmlgnc7+7jgKv5flcQwBnAg2ZWCBQBt7h7TvDcL/nPFNFP0aCwiJTCrtwCXpm1lgn/Wsu2vQfol9CUu64dyLm92qm/vxxYrE/VT0lJ8dTU1GiHISKVbENOLuO/XcObczeQe6CIs7q35uYzjufkzi3idomH0jKzee6eUpq6umNYRGKGuzNv3Q7GfbOGKUs3U8OMi/q25+Yzj6dH+ybRDq9aUhIQkagrKCrm0yWbGffNGhZt2EnT+rW5+czjGXFKMu2a1ot2eNWakoCIRM2OfQd4fc56Xpm5js2780hu2YCHhvbiikEJNKijX0+VQf/KIlLpVmzew0vfruG9BRv/fXPX6Mt68+Pubaihwd5KpSQgIpXC3fk6PZtx36zhnyu3UbdWDS4f2JFfnNpJN3dFkZKAiFSo/MIiPliwib9/s5r0LXtp0zh0c9c1g5No0VA3d0WbkoCIVIgd+w7w6qx1vDxzHdv25nNCu8Y8MawfF/frQJ1aNaIdngSUBESkXK3Zto9x36zm7XmZ5BUUc1b31tx0emdOPb6l5vfHICUBESkXqWtzePGfq/l82RZq16jBpQM68F+nd6ZbW/X3xzIlAREpM3dn+opsnvtqFanrdtC0fm1uPasLw089jjaNNb+/KlASEJFjVlTsfPJdFmOmZ5CWtZuOzerzwMU9uerERM3vr2J0tUSk1PIKinh3/kbGzshg7fZcjm/dkMeH9WNo/w7UrqnB3qpISUBEjmpn7gFembmOl2eGVvLsm9CUF64byLk92+nmripOSUBEDmtDTi7jvgmt5Lm/ILSS56gzOnNKZ830qS6UBETkB1Zu2cOY6Rl8sGgTNQwu6deRUWd01p291ZCSgIj826INO3l++iqmLN1C/do1GXlqMjee3on2TetHOzSpIEoCInHu4IbtY6Zn8M+V22hSrxa/PrsLvzitk5Z1iAOl2V5yPHARsNXdewdlDwA3AdlBtXvcfXLw3N3AjYS2l/y1u08JyocATwM1gb+7+yPl2xQRORbFxc60tC08Pz2DhRt20qpRXe46/wSuPSmJxvVqRzs8qSSl+SQwAfgbMPGQ8r+6++PhBWbWk9Dew72ADsA0M+sWPP0c8FMgE5hrZh+6+7IIYheRMigsKuajxZsYMz2D9C17SWhen4cu7c2wQQnasD0OHTUJuPsMM0su5esNBd5w93xgjZmtAgYHz61y99UAZvZGUFdJQKSS5BcW8c68jbzwdQbrc3Lp3rYxT/2sPxf1bU8tzfGPW5GMCdxmZsOBVOAOd98BdARmhdXJDMoANhxSftLhXtjMRgGjAJKSkiIIUUT2Hyhi0pz1jJ2xms278+iX0JQ/XTiIn/Roqzn+UuYkMAZ4CPDg+xPADUBJP1EOlPRnhh/uxd19LDAWICUl5bD1ROTw8gqKeG32ep7/ahXb9x1gcKcWPDasLz/q0kpz/OXfypQE3H3LwWMzexH4OHiYCSSGVU0ANgXHhysXkXJUWFTMu/M38tS0dDbtyuO0Li35zTndGNypRbRDkxhUpiRgZu3dPSt4eBmwJDj+EHjdzJ4kNDDcFZhD6BNCVzPrBGwkNHj880gCF5HvKy52Ji/J4q9T08nI3ke/hKY8Nqwfp3VpFe3QJIaVZoroJOAsoJWZZQL3A2eZWX9CXTprgZsB3H2pmb1FaMC3ELjV3YuC17kNmEJoiuh4d19a7q0RiUNFxc7k77J49suVpG/ZS5c2jXjhukGc16utun3kqMw9trvcU1JSPDU1NdphiMScg8s5P/vFSlZu3UvXNo24/ZyuXNinPTU14BvXzGyeu6eUpq7uGBapgmakZ/Pw5DSWb95Dt7aN+NvPB3BB7/aa7SPHTElApApZvnk3D09ezoz0bJJaNODZawZwYR/98peyUxIQqQKy9+TzxOcreCt1A43r1ea+i3py3clJ1K2lO3wlMkoCIjEsr6CIl75dy3NfrSKvoIiRp3Xi9rO70KyBFnaT8qEkIBKjpi7bwoMfL2VDzn5+0qMt91xwAp1bN4p2WFLNKAmIxJgd+w7wwEdL+WDhJrq3bcyrN57Ej7pqrr9UDCUBkRgyIz2b37+1iJ25B/jtT7ryq7O6UKeWFneTiqMkIBIj3l+wkT/8YxFd2jRi4g2D6dmhSbRDkjigJCASA16ZuZb7PljKKZ1bMnb4IG3qIpVGSUAkyjKy9/I/Hy3j7BPa8Py1A7Wxi1QqdTaKRNmfJy+nXu2aPHpFXyUAqXRKAiJRtH57LtPStnDDjzrRunHdaIcjcUhJQCSKXp29jhoG1wxOPHplkQqgJCASJTn7DvDqrHVc1LcD7ZvWj3Y4EqeUBESi5Klp6ewvKOL2s7tEOxSJY0oCIlEwfcVWJs5cx4hTkunatnG0w5E4dtQkYGbjzWyrmS0JK3vMzJab2WIze8/MmgXlyWa238wWBl8vhJ0zyMy+M7NVZvaMacsjiVPrt+fyh38solvbRtx1/gnRDkfiXGk+CUwAhhxSNhXo7e59gXTg7rDnMty9f/B1S1j5GGAUoX2Hu5bwmiLV3pbdeVw7bhaFxa57AiQmHDUJuPsMIOeQss/dvTB4OAtIONJrmFl7oIm7z/TQfpYTgUvLFrJI1bR5Vx7Xj5tNzt4DTBg5mC5t1A0k0VceYwI3AJ+GPe5kZgvM7GszOz0o6whkhtXJDMpE4sKSjbsY+tw3bNyxnxeHp9A/sVm0QxIBIlw2wszuBQqB14KiLCDJ3beb2SDgfTPrBZTU/3/YHe7NbBShriOSkpIiCVEk6j5bspnfvbmQFg3r8PYvT6VHey0MJ7GjzEnAzEYAFwHnBF08uHs+kB8czzOzDKAbob/8w7uMEoBNh3ttdx8LjAVISUk5bLIQiWWFRcU8OTWd56dn0C+xGS8OH0SbxvWiHZbI95QpCZjZEOBO4Ex3zw0rbw3kuHuRmXUmNAC82t1zzGyPmZ0MzAaGA89GHr5IbNq2N59fT1rAvzK2c83gJO6/uKcGgSUmHTUJmNkk4CyglZllAvcTmg1UF5gazPScFcwEOgN40MwKgSLgFnc/OKj8S0IzjeoTGkMIH0cQqTZmpGfzx7cXsTO3gMeu7MuwFC0JIbHLgp6cmJWSkuKpqanRDkPkqPblF/Lw5DRem72e41s35JlrBtCrQ9NohyVxyMzmuXtKaepqPwGRcjB79Xb+8PYiMnfs56bTO3HHud3V/SNVgpKASARyDxTyl89WMOFfa0lq0YC3bj6FE5NbRDsskVJTEhApo5kZ27nzncWsz8nlF6cm8/+GdKdBHf2XkqpFP7Eixyhn3wFGf5LGO/MzOa5lA94cdTIndW4Z7bBEykRJQKSU3J1/pGby8Kdp7M0r5FdnHc/tZ3elfh31/UvVpSQgUgort+zh3veXMGdNDicmN2f0ZX3opiWgpRpQEhA5gn35hTzzxUrGfbOGhnVr8egVfRg2KJEaNbQSulQPSgIiJXB3Pl2ymYc+XkbWrjyuSkngziEn0LKRNoOX6kVJQOQQa7bt4/4PlzIjPZse7Zvwt58PYNBxmvYp1ZOSgEhg/4Einp++iv/7ejV1a9Xg/ot7cv3Jx1GrpnZhlepLSUAEmLZsCw98tJTMHfu5tH8H7rmgB22aaMVPqf6UBCSurdq6l4c+XsbX6dl0bdOISTedzCnHa86/xA8lAYlLu/YX8PS0lUycuZb6tWvypwt7MOLUZGqr60fijJKAxJXiYufteZk88tlyduQe4OoTk7jj3G600qwfiVNKAhI3lmzcxZ/eX8LCDTtJOa45D1wymN4dtdSzxDclAan2duw7wBNTV/Da7PW0bFiHJ4b14/KBHQk2RBKJa0oCUm0VFBXzysx1PDUtnb35hYw4JZnf/bQbTevXjnZoIjGjVKNgZjbezLaa2ZKwshZmNtXMVgbfmwflZmbPmNkqM1tsZgPDzhkR1F8ZbFQvUiG+WrGV856awYMfL6NfYjM+/c0ZPHBJLyUAkUOUdirEBGDIIWV3AV+4e1fgi+AxwPmENpjvCowCxkAoaRDan/gkYDBw/8HEIVJe1m3fx3+9PJeRL83FHcaNSGHiDYPp3k6LvYmUpFTdQe4+w8ySDykeSmgDeoCXgenAnUH5RA9tXjzLzJqZWfug7tSDG8+b2VRCiWVSRC0QIXS375jpq3hhxmpq1zDuPv8ERp7WiTq1NOVT5EgiGRNo6+5ZAO6eZWZtgvKOwIaweplB2eHKRcqsuNh5b8FGHv98BVm78ri0fwfuvqAHbXW3r0ipVMTAcElTLvwI5T98AbNRhLqSSEpKKr/IpFqZmbGd0ZOXsWTjbvomNOXpqwcwuJMWehM5FpEkgS1m1j74FNAe2BqUZwKJYfUSgE1B+VmHlE8v6YXdfSwwFiAlJaXERCHxKyN7L3+enMa0tK10bFafp6/uz8V9O2iNf5EyiCQJfAiMAB4Jvn8QVn6bmb1BaBB4V5AopgAPhw0GnwvcHcH7S5zZG2zwMv6bNdSvXZM7h5zAyNOSqVdb2zuKlFWpkoCZTSL0V3wrM8skNMvnEeAtM7sRWA8MC6pPBi4AVgG5wEgAd88xs4eAuUG9Bw8OEoscibvzwcJNPDw5jey9+fwsJZE/nNddSz2IlAMLTeKJXSkpKZ6amhrtMCRK5q/fwehP0pi3bgd9E5ry4NDe9E9sFu2wRGKamc1z95TS1NUdwxKT1m/P5dEpy/lkcRatG9flkcv7MCwlkZrq9xcpV0oCElN27S/gb1+uZMK/1lKrRg1+c05XRp3RmYZ19aMqUhH0P0tiQmFRMW/M3cCTU9PZkXuAYYMSuOPc7prvL1LBlAQk6r5ZuY2HPl7Gii17OKlTC+67qKeWeBapJEoCEjUZ2Xt5+JM0vli+lcQW9XnhuoGc16udlngWqURKAlLpduYe4OkvVvLKzHXUq12Tu84PzfevW0vz/UUqm5KAVJoDhcW8Mmsdz3yxkj15BVw9OInf/1RbO4pEk5KAVDh3Z8rSLTzyaRprt+dyetdW3HthD05o1yTaoYnEPSUBqVCLM3fyvx+nMWdtDt3aNmLCyBM5q3ubo58oIpVCSUAqxOZdefxlynLenb+RVo3qMPqy3vwsJZFaNbW+v0gsURKQcpVXUMTYGasZMz2DomLnljOP59YfH0/jetrWUSQWKQlIuSgqdt6Zn8lfp6aTtSuPC/q04+7ze5DYokG0QxORI1ASkIi4O18u38qjny0nfcte+iU246mf9eekzi2jHZqIlIKSgJTZd5m7eOiTZcxZk0OnVg15/tqBnN9bN3uJVCVKAnLMsvfk8/iUFbw1bwMtGtThoaG9uHpwErU16CtS5SgJSKnlFRTx0rdree6rVeQXFnHT6Z257ewuNNGgr0iVpSQgR+XufLQ4i0c/Xc7Gnfv5SY+23HPBCXRu3SjaoYlIhMqcBMysO/BmWFFn4L+BZsBNQHZQfo+7Tw7OuRu4ESgCfu3uU8r6/lI55q3bwf9+sowF63fSs30THruyL6d2aRXtsESknJQ5Cbj7CqA/gJnVBDYC7xHaU/iv7v54eH0z6wlcDfQCOgDTzKybuxeVNQapOBtycnn0s+V8vDiLNo3r8pcr+3LFwATt7CVSzZRXd9A5QIa7rzvCzJChwBvung+sMbNVwGBgZjnFIOVgd14Bz3+Vwfhv11DD0M5eItVcef3PvhqYFPb4NjMbDqQCd7j7DqAjMCusTmZQ9gNmNgoYBZCUlFROIcqRFBYVM2nuBv46NZ2cfQe4YmACfzivG+2b1o92aCJSgSKe02dmdYBLgH8ERWOA4wl1FWUBTxysWsLpXtJruvtYd09x95TWrVtHGqIcxYz0bM5/+p/c9/4SurZpxEe3/YgnruqnBCASB8rjk8D5wHx33wJw8DuAmb0IfBw8zAQSw85LADaVw/tLGa3O3svoYGev41o24IXrBnFer7a62UskjpRHEriGsK4gM2vv7lnBw8uAJcHxh8DrZvYkoYHhrsCccnh/OUY79oV29np1lnb2Eol3ESUBM2sA/BS4Oaz4L2bWn1BXz9qDz7n7UjN7C1gGFAK3amZQ5covLGLiv9bx7Jcr2ZtfyM9OTOJ3P+1Km8b1oh2aiERJREnA3XOBloeUXX+E+qOB0ZG8pxw7d2fyd5t59LPlrM/J5cxurbnngh50b9c42qGJSJRp3l81N3/9DkZ/ksa8dTs4oV1jJt4wmDO6abBdREKUBKqprXvyeGTyct5dsJHWjevyyOV9GJaSqJu9ROR7lASqmfzCIl6ZuY6np60kr7CIX511PLf+uItu9hKREuk3QzXh7ny6ZDOPfPqffv/7L+6pRd5E5IiUBKqBBUG/f+q6HXRv25iXbxjMmer3F5FSUBKowjbk5PKXKSv4aNEmWjWqy58v78OwQQnU0uYuIlJKSgJV0O68Ap77ahUvfbuWGga3n92Fm888nkbq9xeRY6TfGlVIYVExb6Zu4InP09mRe4DLBnTkj+d11xo/IlJmSgJVxLertvHQx8tYvnkPgzu14L8v6knvjk2jHZaIVHFKAjFuzbZ9jP4kjWlpW0hoXp8x1w5kSO92WuRNRMqFkkCM2p1XwN++XMVL366hTs0a/L8h3bnhtE7Uq61F3kSk/CgJxJiiYufNuRt44vMV5OQe4KpBidxxXjct8iYiFUJJIIb8a9U2HjzY75/cgpcvVr+/iFQsJYEYsGbbPh6enMbUZaF+/+evHcj56vcXkUqgJBBFu3ILePbLlbw8cy11atbgj+d158Yfqd9fRCqPkkAUFBQV8/rs9Tw1LZ2d+wvU7y8iUaMkUIncnS+Xb2X05DRWZ+/jlM4t+dNFPejVQf3+IhIdEScBM1sL7AGKgEJ3TzGzFsCbQDKhLSavcvcdFurkfhq4AMgFfuHu8yONoSpIy9rN6E/S+GbVNjq3asjfh6dwTo826vcXkagqr08CP3b3bWGP7wK+cPdHzOyu4PGdwPmENpjvCpwEjAm+V1ubdu7nyanpvDM/k6b1a/PAxT259uTjqK1F3kQkBlRUd9BQ4Kzg+GVgOqEkMBSY6O4OzDKzZmbW3t2zKiiOqNm+N5/np2fwyqx1AIw6vTO/OqsLTRvUjnJkIiL/UR5JwIHPzcyB/3P3sUDbg7/Y3T3LzNoEdTsCG8LOzQzKvpcEzGwUMAogKSmpHEKsPHvzC3lxxmr+/s/V7C8o4vKBCfz2J11JaN4g2qGJiPxAeSSB09x9U/CLfqqZLT9C3ZI6wP0HBaFEMhYgJSXlB8/HovzCIt6cu4Gnp61k+74DnN+7HXec240ubRpHOzQRkcOKOAk39GJqAAAH3ElEQVS4+6bg+1Yzew8YDGw52M1jZu2BrUH1TCAx7PQEYFOkMURTQVEx78zL5NkvV7Fx534Gd2rB+At60C+xWbRDExE5qoiSgJk1BGq4+57g+FzgQeBDYATwSPD9g+CUD4HbzOwNQgPCu6rqeEBxsfPR4k08OTWdddtz6ZfQlIcv78MZXVtpxo+IVBmRfhJoC7wX/NKrBbzu7p+Z2VzgLTO7EVgPDAvqTyY0PXQVoSmiIyN8/6iYmbGdhyen8d3GXfRo30TTPUWkyoooCbj7aqBfCeXbgXNKKHfg1kjeM5pWbtnDo58tZ1raVjo0rceTV/Xj0v4dqVFDv/xFpGrSHcOlsDP3AI9+tpw3526gQZ1aWttfRKoNJYEjcHfenb+RP3+axo7cAkacmsztZ3elRcM60Q5NRKRcKAkcxvrtufzx7UXMXpND/8RmTLyhDz07NIl2WCIi5UpJoAQfLNzIve8twYBHLu/DVSmJ6vcXkWpJSSDM5l15PPjxUiZ/t5mBSc145poButNXRKo1JQFC+/pOnLmWx6esoKDY+eN53bn5jM7U0iJvIlLNxX0SCO/7P6Nbax4a2ovjWjaMdlgiIpUibpNAXkERY2es5rmvVlGrhvGXK/sybFCCbvgSkbgSl0kgLWs3t70+n4zsfVzQpx33XdST9k3rRzssEZFKF1dJoLjYmfCvtTzy2XKa1a/NKzcO5vSuraMdlohI1MRNEti2N5/bX1/AzNXbOfuENjx2ZV9aNqob7bBERKIqLpLA7NXbuX3SAnbtL+DRK0Lz/tX3LyISB0ngo0WbuOOtRSQ0r89LI0+kV4em0Q5JRCRmVNsk4O68Ons9972/hBOTm/Pi8BSaNdCaPyIi4aplEtidV8CI8XNYsH4nZ3Zrzdjhg6hbSyt+iogcqlomgcZ1a3FciwYMG5TIlYMSqFNLd/6KiJSkzL8dzSzRzL4yszQzW2pmvwnKHzCzjWa2MPi6IOycu81slZmtMLPzyqMBh4mNp64ewM9PSlICEBE5gkg+CRQCd7j7fDNrDMwzs6nBc39198fDK5tZT+BqoBfQAZhmZt3cvSiCGEREJAJl/jPZ3bPcfX5wvAdIAzoe4ZShwBvunu/uawjtMzy4rO8vIiKRK5e+EjNLBgYAs4Oi28xssZmNN7PmQVlHYEPYaZkcOWmIiEgFizgJmFkj4B3gt+6+GxgDHA/0B7KAJw5WLeF0P8xrjjKzVDNLzc7OjjREERE5jIiSgJnVJpQAXnP3dwHcfYu7F7l7MfAi/+nyyQQSw05PADaV9LruPtbdU9w9pXVrre0jIlJRIpkdZMA4IM3dnwwrbx9W7TJgSXD8IXC1mdU1s05AV2BOWd9fREQiF8nsoNOA64HvzGxhUHYPcI2Z9SfU1bMWuBnA3Zea2VvAMkIzi27VzCARkegqcxJw928ouZ9/8hHOGQ2MLut7iohI+TL3EsdmY4aZZQPrynh6K2BbOYYTi9TG6kFtrB5ipY3HuXupBlRjPglEwsxS3T0l2nFUJLWxelAbq4eq2EatqSAiEseUBERE4lh1TwJjox1AJVAbqwe1sXqocm2s1mMCIiJyZNX9k4CIiBxBlUwCZjYk2JNglZndVcLzdc3szeD52cECdwefq5Q9DSJV1jaaWbKZ7Q/bz+GFyo69tErRxjPMbL6ZFZrZlYc8N8LMVgZfIyov6mMTYRuLwq7jh5UX9bErRTt/b2bLgoUlvzCz48Keqy7X8khtjN1r6e5V6guoCWQAnYE6wCKg5yF1fgW8EBxfDbwZHPcM6tcFOgWvUzPabSrnNiYDS6LdhnJqYzLQF5gIXBlW3gJYHXxvHhw3j3abyrONwXN7o92Gcmznj4EGwfEvw35eq9O1LLGNsX4tq+IngcHAKndf7e4HgDcI7VUQbijwcnD8NnBOsNZRVdnTIJI2VhVHbaO7r3X3xUDxIeeeB0x19xx33wFMBYZURtDHKJI2ViWlaedX7p4bPJxFaAFJqF7X8nBtjGlVMQmUZl+Cf9dx90JgF9CylOfGgkjaCNDJzBaY2ddmdnpFB1tGkVyL6nQdj6ResKT6LDO7tHxDK1fH2s4bgU/LeG60RNJGiOFrWRU3mi/NvgSHq1PqPQ2iLJI2ZgFJ7r7dzAYB75tZLw/t9RBLIrkW1ek6HkmSu28ys87Al2b2nbtnlFNs5elY9gq5DkgBzjzWc6MskjZCDF/LqvhJoDT7Evy7jpnVApoCOaU8NxaUuY1BV9d2AHefR6gfs1uFR3zsIrkW1ek6Hpa7bwq+rwamE9q9LxaVqp1m9hPgXuASd88/lnNjQCRtjO1rGe1BiWP9IvTpZTWhgd2DAzS9DqlzK98fNH0rOO7F9weGVxObA8ORtLH1wTYRGsTaCLSIdpvK0sawuhP44cDwGkIDic2D4+rWxuZA3eC4FbCSQwYiY+WrlD+vAwj9QdL1kPJqcy2P0MaYvpZRD6CMF+QCID34B783KHuQUPYFqAf8g9DA7xygc9i59wbnrQDOj3ZbyruNwBXA0uCHdD5wcbTbEkEbTyT0F9g+YDuwNOzcG4K2rwJGRrst5d1G4FTgu+A6fgfcGO22RNjOacAWYGHw9WE1vJYltjHWr6XuGBYRiWNVcUxARETKiZKAiEgcUxIQEYljSgIiInFMSUBEJI4pCYiIxDElARGROKYkICISx/4/vu5jXy0eOE4AAAAASUVORK5CYII=\n", 167 | "text/plain": [ 168 | "
" 169 | ] 170 | }, 171 | "metadata": { 172 | "needs_background": "light" 173 | }, 174 | "output_type": "display_data" 175 | } 176 | ], 177 | "source": [ 178 | "plt.plot(C, T)" 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "execution_count": 9, 184 | "metadata": {}, 185 | "outputs": [], 186 | "source": [ 187 | "chi_new = np.delete(chi, list_delete)\n", 188 | "T_new = np.delete(T, list_delete)\n", 189 | "C_new = np.delete(C, list_delete)" 190 | ] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": 10, 195 | "metadata": {}, 196 | "outputs": [ 197 | { 198 | "data": { 199 | "text/plain": [ 200 | "[]" 201 | ] 202 | }, 203 | "execution_count": 10, 204 | "metadata": {}, 205 | "output_type": "execute_result" 206 | }, 207 | { 208 | "data": { 209 | "image/png": "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\n", 210 | "text/plain": [ 211 | "
" 212 | ] 213 | }, 214 | "metadata": { 215 | "needs_background": "light" 216 | }, 217 | "output_type": "display_data" 218 | } 219 | ], 220 | "source": [ 221 | "plt.plot(C_new, T_new, '.')" 222 | ] 223 | }, 224 | { 225 | "cell_type": "markdown", 226 | "metadata": {}, 227 | "source": [ 228 | "Lambda" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 11, 234 | "metadata": {}, 235 | "outputs": [], 236 | "source": [ 237 | "for i in list_delete:\n", 238 | " os.remove('{}/{}'.format(dir_name,filenames[i]))" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": 12, 244 | "metadata": {}, 245 | "outputs": [ 246 | { 247 | "data": { 248 | "text/plain": [ 249 | "array([2222., 2214., 2203., 2192., 2183., 2175., 2168., 2155., 2145.,\n", 250 | " 2132., 2120., 2108., 2092., 2079., 2066., 2032., 2019., 2000.,\n", 251 | " 1987., 1963., 1950., 1926., 1907., 1886., 1865., 1843., 1820.,\n", 252 | " 1798., 1766., 1743., 1722., 1699., 1676., 1653., 1629., 1605.,\n", 253 | " 1580., 1557., 1533., 1510., 1486., 1463., 1439., 1418., 1395.,\n", 254 | " 1376., 1356., 1339., 1322., 1303., 1283., 1261., 1238., 1213.,\n", 255 | " 1189., 1170., 1142., 1115., 1090., 1068., 1044., 1024., 1002.,\n", 256 | " 973., 952., 931., 905., 887., 855., 836., 812., 796.,\n", 257 | " 737., 721., 680., 666., 621., 564., 547., 517., 506.,\n", 258 | " 487., 480., 461., 441., 433., 424., 416., 409., 402.,\n", 259 | " 394., 387., 380., 373., 366., 359., 352., 345., 338.,\n", 260 | " 331., 324., 317., 310., 303., 298.])" 261 | ] 262 | }, 263 | "execution_count": 12, 264 | "metadata": {}, 265 | "output_type": "execute_result" 266 | } 267 | ], 268 | "source": [ 269 | "T" 270 | ] 271 | }, 272 | { 273 | "cell_type": "code", 274 | "execution_count": 13, 275 | "metadata": {}, 276 | "outputs": [ 277 | { 278 | "data": { 279 | "text/plain": [ 280 | "array([2222., 2214., 2203., 2192., 2183., 2175., 2168., 2155., 2145.,\n", 281 | " 2132., 2120., 2108., 2092., 2079., 2066., 2032., 2019., 2000.,\n", 282 | " 1987., 1963., 1950., 1926., 1907., 1886., 1865., 1843., 1820.,\n", 283 | " 1798., 1766., 1743., 1722., 1699., 1676., 1653., 1629., 1605.,\n", 284 | " 1580., 1557., 1533., 1510., 1486., 1463., 1439., 1418., 1395.,\n", 285 | " 1376., 1356., 1339., 1322., 1303., 1283., 1261., 1238., 1213.,\n", 286 | " 1189., 1170., 1142., 1115., 1090., 1068., 1044., 1024., 1002.,\n", 287 | " 973., 952., 931., 905., 887., 855., 836., 812., 796.,\n", 288 | " 737., 721., 680., 666., 621., 564., 547., 517., 506.,\n", 289 | " 487., 480., 461., 441., 433., 424., 416., 409., 402.,\n", 290 | " 394., 387., 380., 373., 366., 359., 352., 345., 338.,\n", 291 | " 331., 324., 317., 310., 303.])" 292 | ] 293 | }, 294 | "execution_count": 13, 295 | "metadata": {}, 296 | "output_type": "execute_result" 297 | } 298 | ], 299 | "source": [ 300 | "T_new" 301 | ] 302 | } 303 | ], 304 | "metadata": { 305 | "kernelspec": { 306 | "display_name": "Python 3", 307 | "language": "python", 308 | "name": "python3" 309 | }, 310 | "language_info": { 311 | "codemirror_mode": { 312 | "name": "ipython", 313 | "version": 3 314 | }, 315 | "file_extension": ".py", 316 | "mimetype": "text/x-python", 317 | "name": "python", 318 | "nbconvert_exporter": "python", 319 | "pygments_lexer": "ipython3", 320 | "version": "3.7.3" 321 | } 322 | }, 323 | "nbformat": 4, 324 | "nbformat_minor": 2 325 | } 326 | -------------------------------------------------------------------------------- /test_beta_integration.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# beta distribution\n", 8 | "The distribution is\n", 9 | "\\begin{equation}\n", 10 | " \\begin{split}\n", 11 | " f(x;\\alpha,\\beta) &= \\dfrac{x^{\\alpha-1}(1-x)^{\\beta-1}}{\\int_0^1 u^{\\alpha-1}(1-u)^{\\beta-1} du} \\\\\n", 12 | " & = \\dfrac{\\Gamma(\\alpha+\\beta)}{\\Gamma(\\alpha)\\Gamma(\\beta)}x^{\\alpha-1}(1-x)^{\\beta-1} \\\\\n", 13 | " & = \\dfrac{1}{B(\\alpha, \\beta)}x^{\\alpha-1}(1-x)^{\\beta-1}\n", 14 | " \\end{split}\n", 15 | "\\end{equation}\n", 16 | "$\\Gamma$ and $B$ are gamma and beta function respectively.\n", 17 | "\n", 18 | "Average and variance are,\n", 19 | "\\begin{equation}\n", 20 | " \\begin{split}\n", 21 | " \\bar{X} &= \\dfrac{\\alpha}{\\alpha+\\beta} \\\\\n", 22 | " \\bar{X\\prime\\prime^2} &= \\dfrac{\\alpha\\beta}{(\\alpha+\\beta)^2(\\alpha+\\beta+1)} \n", 23 | " \\end{split}\n", 24 | "\\end{equation}\n", 25 | "With the mean and variance,\n", 26 | "\\begin{equation}\n", 27 | " \\begin{split}\n", 28 | " \\alpha & = \\bar{X}\\left(\\dfrac{1}{\\eta_X}-1\\right) \\\\\n", 29 | " \\beta & = \\left(1-\\bar{X}\\right)\\left(\\dfrac{1}{\\eta_X}-1\\right)\n", 30 | " \\end{split}\n", 31 | "\\end{equation}\n", 32 | "where\n", 33 | "\\begin{equation}\n", 34 | " \\eta_X = \\dfrac{\\bar{X\\prime\\prime^2}}{\\bar{X}\\left(1-\\bar{X}\\right)}\n", 35 | "\\end{equation}" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 1, 41 | "metadata": {}, 42 | "outputs": [], 43 | "source": [ 44 | "import sys\n", 45 | "import numpy as np\n", 46 | "import matplotlib.pyplot as plt\n", 47 | "import numpy.polynomial.polynomial as P\n", 48 | "from scipy.integrate import simps\n", 49 | "from scipy.stats import beta\n", 50 | "from scipy.interpolate import interp1d\n", 51 | "import scipy as sp" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": 2, 57 | "metadata": {}, 58 | "outputs": [], 59 | "source": [ 60 | "def beta_coef(ave, var):\n", 61 | " \"\"\"Obtain the coefficients for beta distribution with average and variance\"\"\"\n", 62 | " a = ave*(1./var-1.)\n", 63 | " b = (1.-ave)*(1./var-1.)\n", 64 | " return a, b" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 3, 70 | "metadata": {}, 71 | "outputs": [], 72 | "source": [ 73 | "# Numerical Integration" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 4, 79 | "metadata": {}, 80 | "outputs": [], 81 | "source": [ 82 | "def beta_integration_direct(f, x, a, b, fit='cubic'):\n", 83 | " \"\"\"Integrate over the given sample, intepolate pdf at the boundary\"\"\"\n", 84 | " # f(x): function value\n", 85 | " # x: axis points\n", 86 | " # a: alpha for the beta distribution\n", 87 | " # b: beta for the beta distribution\n", 88 | " # fit: fitting formula\n", 89 | " \n", 90 | " rv = beta(a, b)\n", 91 | " pdf = rv.pdf(x)\n", 92 | " \n", 93 | " y = interp1d(x[1:-1], pdf[1:-1],\n", 94 | " kind=fit,\n", 95 | " fill_value='extrapolate'\n", 96 | " )\n", 97 | " \n", 98 | " if a < 1. :\n", 99 | " pdf[0] = y(0.) if y(0.) > 0. else 0.\n", 100 | " if b < 1. :\n", 101 | " pdf[-1] = y(1.) if y(1.) > 0. else 0.\n", 102 | " \n", 103 | " return simps(f*pdf, x)" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": 5, 109 | "metadata": {}, 110 | "outputs": [], 111 | "source": [ 112 | "def beta_integration_log(f, x, a, b, fit='cubic', epsilon=1.e-9, n_ext=100):\n", 113 | " \"\"\"Integrate over the given sample, log spaced intepolation of function and pdf towards the boundary\"\"\"\n", 114 | " \n", 115 | " f_interp = interp1d(f, x,\n", 116 | " kind = fit,\n", 117 | " fill_value = 'extrapolate'\n", 118 | " )\n", 119 | " \n", 120 | " if a < 1.:\n", 121 | " x_ext = np.logspace(np.log10(epsilon),\n", 122 | " np.log10(x[1]), \n", 123 | " num=n_ext\n", 124 | " )\n", 125 | " x_ext = np.insert(x_ext, 0, 0.)\n", 126 | " f_ext = f_interp(x_ext)\n", 127 | " \n", 128 | " x = np.hstack((x_ext, x[2:]))\n", 129 | " f = np.hstack((f_ext, f[2:]))\n", 130 | " \n", 131 | " if b < 1.:\n", 132 | " x_ext = np.logspace(np.log10(epsilon), \n", 133 | " np.log10(1.-x[-2]), \n", 134 | " num=n_ext\n", 135 | " )\n", 136 | " x_ext = np.flip( 1. - np.insert(x_ext, 0, 0.) )\n", 137 | " f_ext = f_interp(x_ext)\n", 138 | " \n", 139 | " x = np.hstack((x[:-2], x_ext))\n", 140 | " f = np.hstack((f[:-2], f_ext))\n", 141 | " \n", 142 | " rv = beta(a, b)\n", 143 | " pdf = rv.pdf(x)\n", 144 | " \n", 145 | " y = interp1d(x[1:-1], pdf[1:-1],\n", 146 | " kind=fit,\n", 147 | " fill_value='extrapolate'\n", 148 | " )\n", 149 | " \n", 150 | " if a < 1. :\n", 151 | " pdf[0] = y(0.) if y(0.) > 0. else 0.\n", 152 | " if b < 1. :\n", 153 | " pdf[-1] = y(1.) if y(1.) > 0. else 0.\n", 154 | " \n", 155 | " return simps(f*pdf, x)" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 6, 161 | "metadata": {}, 162 | "outputs": [], 163 | "source": [ 164 | "def beta_integration_linear(f, x, a, b, fit='cubic', n_ext=100):\n", 165 | " \"\"\"Integrate over the given sample, linear spaced intepolation of function and pdf towards the boundary\"\"\"\n", 166 | " \n", 167 | " f_interp = interp1d(f, x,\n", 168 | " kind = fit,\n", 169 | " fill_value = 'extrapolate'\n", 170 | " )\n", 171 | " \n", 172 | " if a < 1.:\n", 173 | " x_ext = np.linspace(0., x[1], num=n_ext)\n", 174 | " f_ext = f_interp(x_ext)\n", 175 | " \n", 176 | " x = np.hstack((x_ext, x[2:]))\n", 177 | " f = np.hstack((f_ext, f[2:]))\n", 178 | " \n", 179 | " if b < 1.:\n", 180 | " x_ext = np.linspace(x[-2], 1., num=n_ext)\n", 181 | " f_ext = f_interp(x_ext)\n", 182 | " \n", 183 | " x = np.hstack((x[:-2], x_ext))\n", 184 | " f = np.hstack((f[:-2], f_ext))\n", 185 | " \n", 186 | " rv = beta(a, b)\n", 187 | " pdf = rv.pdf(x)\n", 188 | " \n", 189 | " y = interp1d(x[1:-1], pdf[1:-1],\n", 190 | " kind=fit,\n", 191 | " fill_value='extrapolate'\n", 192 | " )\n", 193 | " \n", 194 | " if a < 1. :\n", 195 | " pdf[0] = y(0.) if y(0.) > 0. else 0.\n", 196 | " if b < 1. :\n", 197 | " pdf[-1] = y(1.) if y(1.) > 0. else 0.\n", 198 | " \n", 199 | " return simps(f*pdf, x)" 200 | ] 201 | }, 202 | { 203 | "cell_type": "markdown", 204 | "metadata": {}, 205 | "source": [ 206 | "# Analytical integration of the beta distribution\n", 207 | "For the polynomial function\n", 208 | "\\begin{equation}\n", 209 | " \\phi(x) = \\sum_{i=0}^n c_i x^i,\n", 210 | "\\end{equation}\n", 211 | "integration with the beta distribution\n", 212 | "\\begin{equation}\n", 213 | " \\begin{split}\n", 214 | " \\int_{x_1}^{x_2} \\phi(x) f(x;\\alpha, \\beta) dx &= \\int_{x_1}^{x_2} \\sum_{i=0}^n c_i x^i f(x;\\alpha, \\beta) dx \\\\\n", 215 | " &= \\sum_{i=0}^n c_i\\dfrac{B(\\alpha+i,\\beta)}{B(\\alpha,\\beta)}\\int_{x_1}^{x_2} f(x;\\alpha+i, \\beta) dx\n", 216 | " \\end{split}\n", 217 | "\\end{equation}" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": 7, 223 | "metadata": {}, 224 | "outputs": [], 225 | "source": [ 226 | "def beta_integration_analytic(f, x, a, b):\n", 227 | " \n", 228 | " rv0 = beta(a, b)\n", 229 | " cdf0 = rv0.cdf(x)\n", 230 | " B0 = sp.special.beta(a, b)\n", 231 | " \n", 232 | " rv1 = beta(a+1., b)\n", 233 | " cdf1 = rv1.cdf(x)\n", 234 | " B1 = sp.special.beta(a+1, b)\n", 235 | " \n", 236 | " c0 = np.zeros(x.size)\n", 237 | " c1 = np.zeros(x.size)\n", 238 | " \n", 239 | " for i in range(x.size-1):\n", 240 | " c = P.polyfit(x[i:i+2], f[i:i+2], 1)\n", 241 | " \n", 242 | " c0[i] -= c[0]\n", 243 | " c0[i+1] += c[0]\n", 244 | " \n", 245 | " c1[i] -= c[1]\n", 246 | " c1[i+1] += c[1]\n", 247 | " \n", 248 | " c1 *= B1/B0\n", 249 | " \n", 250 | " return np.sum(c0*cdf0+c1*cdf1)" 251 | ] 252 | }, 253 | { 254 | "cell_type": "code", 255 | "execution_count": 8, 256 | "metadata": {}, 257 | "outputs": [], 258 | "source": [ 259 | "def delta_integration(f, x, x_ave):\n", 260 | " y = interp1d(x, f, kind='cubic')\n", 261 | " return y(x_ave)" 262 | ] 263 | }, 264 | { 265 | "cell_type": "code", 266 | "execution_count": 9, 267 | "metadata": {}, 268 | "outputs": [], 269 | "source": [ 270 | "def bimodal_integration(f, x_ave):\n", 271 | " return f[0]*(1.-x_ave)+f[-1]*x_ave" 272 | ] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": 10, 277 | "metadata": {}, 278 | "outputs": [], 279 | "source": [ 280 | "def beta_integration(f, x, x_ave, x_nvar, method='analytic'):\n", 281 | " \n", 282 | " epsilon = 1.e-9\n", 283 | " \n", 284 | " if x_ave < epsilon:\n", 285 | " return f[0]\n", 286 | " elif x_ave > 1.-epsilon:\n", 287 | " return f[-1]\n", 288 | " elif x_nvar < epsilon:\n", 289 | " return delta_integration(f, x, x_ave)\n", 290 | " elif x_nvar > 1.-epsilon:\n", 291 | " return bimodal_integration(f, x_ave)\n", 292 | " else:\n", 293 | " a, b = beta_coef(x_ave, x_nvar)\n", 294 | " #return beta_integration_analytic(f, x, a, b)\n", 295 | " \n", 296 | " if method == 'analytic' :\n", 297 | " return beta_integration_analytic(f, x, a, b)\n", 298 | " elif method == 'log' :\n", 299 | " return beta_integration_log(v, v, a, b)\n", 300 | " elif method == 'linear' :\n", 301 | " return beta_integration_linear(v, v, a, b)\n", 302 | " else :\n", 303 | " return beta_integration_direct(v, v, a, b)" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": 11, 309 | "metadata": {}, 310 | "outputs": [], 311 | "source": [ 312 | "# load flamelet solution\n", 313 | "flamelet = np.genfromtxt('Table_1.csv', delimiter=',', names=True)" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": 12, 319 | "metadata": {}, 320 | "outputs": [], 321 | "source": [ 322 | "methods = ['direct', 'log', 'linear', 'analytic']\n", 323 | "ls = ['g:', 'b-.', 'c:', 'r--']\n", 324 | "varName = 'Z'\n", 325 | "v = flamelet[varName]\n", 326 | "npts = 1000\n", 327 | "\n", 328 | "data = np.zeros((npts, len(methods)))" 329 | ] 330 | }, 331 | { 332 | "cell_type": "code", 333 | "execution_count": 14, 334 | "metadata": {}, 335 | "outputs": [], 336 | "source": [ 337 | "nvar = 0.8\n", 338 | "for i, ave in enumerate(np.linspace(0., 1., num=npts)):\n", 339 | " for j, m in enumerate(methods):\n", 340 | " data[i, j] = beta_integration(v, v, ave, nvar, method=m)" 341 | ] 342 | }, 343 | { 344 | "cell_type": "code", 345 | "execution_count": 15, 346 | "metadata": {}, 347 | "outputs": [ 348 | { 349 | "data": { 350 | "image/png": "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\n", 351 | "text/plain": [ 352 | "
" 353 | ] 354 | }, 355 | "metadata": { 356 | "needs_background": "light" 357 | }, 358 | "output_type": "display_data" 359 | } 360 | ], 361 | "source": [ 362 | "plt.figure(0)\n", 363 | "for j, m in enumerate(methods):\n", 364 | " plt.plot(np.linspace(0., 1., num=npts), data[:,j], ls[j], label=m, lw=1)\n", 365 | "plt.legend()" 366 | ] 367 | }, 368 | { 369 | "cell_type": "code", 370 | "execution_count": 16, 371 | "metadata": {}, 372 | "outputs": [], 373 | "source": [ 374 | "ave = 0.1\n", 375 | "for i, nvar in enumerate(np.linspace(0., 1., num=npts)):\n", 376 | " for j, m in enumerate(methods):\n", 377 | " data[i, j] = beta_integration(v, v, ave, nvar, method=m)" 378 | ] 379 | }, 380 | { 381 | "cell_type": "code", 382 | "execution_count": 17, 383 | "metadata": {}, 384 | "outputs": [ 385 | { 386 | "data": { 387 | "text/plain": [ 388 | "" 389 | ] 390 | }, 391 | "execution_count": 17, 392 | "metadata": {}, 393 | "output_type": "execute_result" 394 | }, 395 | { 396 | "data": { 397 | "image/png": "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\n", 398 | "text/plain": [ 399 | "
" 400 | ] 401 | }, 402 | "metadata": { 403 | "needs_background": "light" 404 | }, 405 | "output_type": "display_data" 406 | } 407 | ], 408 | "source": [ 409 | "plt.figure(1)\n", 410 | "for j, m in enumerate(methods):\n", 411 | " plt.plot(np.linspace(0., 1., num=npts), data[:,j], ls[j], label=m, lw=1)\n", 412 | "plt.legend()" 413 | ] 414 | } 415 | ], 416 | "metadata": { 417 | "kernelspec": { 418 | "display_name": "Python 3", 419 | "language": "python", 420 | "name": "python3" 421 | }, 422 | "language_info": { 423 | "codemirror_mode": { 424 | "name": "ipython", 425 | "version": 3 426 | }, 427 | "file_extension": ".py", 428 | "mimetype": "text/x-python", 429 | "name": "python", 430 | "nbconvert_exporter": "python", 431 | "pygments_lexer": "ipython3", 432 | "version": "3.7.3" 433 | } 434 | }, 435 | "nbformat": 4, 436 | "nbformat_minor": 2 437 | } 438 | --------------------------------------------------------------------------------