File:
```python
# -*- coding: utf-8 -*-
"""
Created on Sun, April 17 2022
This script is written to analytically and semi-analytical-emperically fitting to solve overall kGAv for spray system that absorbs CO2 from the surrounding air/flue gas
@author: Awan
"""
import math
import numpy as np
from matplotlib import pyplot as plt
from scipy.optimize import *
import pandas as pd
from Input_Params import *
from Side_Functions import *
plt.close('all')
WritetoFolder='Results'
# def KGAv_Theo(Q_l_flux, Q_g_flux, P_CO2_in, T, CO2_loading):
# hm, U, d = hm_calc(Q_l_flux, Q_g_flux, P_CO2_in, T, CO2_loading)
# A_1d = 4*3.14*d*d/4
# Vol_1d = (4/3)*3.14*(d**3)/8
# Q_L = Q_l_flux*A_D/3600 # Liquid flow rate [m3/s] when Q_l_flux is in m3/m2-h
# Q_G =Q_g_flux*A_D/3600 # Gas Flow Rate [m3/s] (For aroonwilas paper, the flow rate is assumed total gas flow rate for now as info is not clerarly mentioned in paper)
# Q_G_mole = 3600*(Q_G*1000/(22.4*1000))*((T/298)/(P_tot/101.325))/(A_D) #Gas Flow Rate in kmol/m2-hr
# X2_theo = X1*math.exp(-hm*Q_L*A_1d*H/(Q_G*Vol_1d*U))
# Y2_theo = X2_theo/(1-X2_theo)
# KGAv_theo = (Q_G_mole*(1-X1)/(P_tot*H))*(math.log(Y1/Y2_theo) + Y1 - Y2_theo)
# cap_eff = (X1-X2_theo)*100/X1 ### Change the definition as per paper that it is being validated to, if needed
# return KGAv_theo, cap_eff
X = np.zeros(2) #X[0] is loading and X[1] is X_CO2
# def loading_func(z, CO2_loading):
# hm, U, d = hm_calc(Q_l_flux, Q_g_flux, P_CO2_in, T, CO2_loading)
# AB = (P_tot/(C_init*Rbar*T))*(6/(d*U))*hm
# return AB*P_CO2_in/P_tot
# def X_CO2_func(z,X_CO2):
# hm, U, d = hm_calc(Q_l_flux, Q_g_flux, P_CO2_in, T, CO2_loading)
# B = (Q_l_flux/Q_g_flux)*(6/(d*U))*hm
# return B*X_CO2
def X_func(z, X):
hm, d = hm_calc(Q_l_flux, Q_g_flux, X[1]*P_tot, T, X[0]/(1-X[0]), U)
AB = (P_tot/(C_init*Rbar*T))*(6/(d*U))*hm
B = (Q_l_flux/Q_g_flux)*(6/(d*U))*hm
print(AB*X[1], B*X[1])
return AB*X[1], B*X[1]
npoints = len(x_exp)
Inputs = np.zeros([len(x_exp),4])
KGAv_Theo_all = np.zeros(npoints)
cap_eff_all = np.zeros(npoints)
KGAv_Fit_all = np.zeros(npoints)
cap_eff_Fit_all = np.zeros(npoints)
# def X2_calc_integrand():#, Q_l_flux, Q_g_flux, P_CO2_in, T):
# hm, U, d = hm_calc(Q_l_flux, Q_g_flux, P_CO2_in, T, CO2_loading_bottomUp)
# A_1d = 4*3.14*d*d/4
# Vol_1d = (4/3)*3.14*(d**3)/8
# Q_L = Q_l_flux*A_D/3600 # Liquid flow rate [m3/s] when Q_l_flux is in m3/m2-h
# Q_G =Q_g_flux*A_D/3600 # Gas Flow Rate [m3/s] (For aroonwilas paper, the flow rate is assumed total gas flow rate for now as info is not clerarly mentioned in paper)
# return -hm*Q_L*A_1d/(Q_G*Vol_1d*U)
for i in range(npoints):
if Var == 'Liquid Flow Rate':
Q_l_flux = x_exp[i]
Inputs[i] = [Q_l_flux, Q_g_flux, P_CO2_in, T]
if Var == 'Gas Flow Rate':
Q_g_flux = x_exp[i]
Inputs[i] = [Q_l_flux, Q_g_flux, P_CO2_in, T]
U = U_calc2(Q_l_flux, Q_g_flux, T)
print('Starting X_sol')
# loading_sol = scipy.integrate.solve_ivp(loading_func, [0, H], [0])
# X_CO2_sol = scipy.integrate.solve_ivp(X_CO2_func, [0, H], [0.01])
X_sol = scipy.integrate.solve_ivp(X_func, (0, H), [0, 0.1])
# CO2_loading_bottomUp = loading_sol.y[::-1]
# z_array_bottomUp = loading_sol.t[::-1]
# z_array_bottomUp[:] = H-z_array_bottomUp[:]
# hm, U, d = hm_calc(Q_l_flux, Q_g_flux, P_CO2_in, T, CO2_loading_bottomUp)
# ln_X2_array = X2_calc_integrand()
# Integrand = scipy.integrate.simps(ln_X2_array, z_array_bottomUp)
# print (Integrand)
# X2 = X1*math.exp(Integrand)
#lnX2_by_X1 = scipy.integrate.quad(X2_calc_integrand, 0, H)
#print(X2)
# for j in range(len(loading_sol.y)):
# hm_array =
# KGAv_theo, cap_eff = KGAv_Theo(Q_l_flux, Q_g_flux, P_CO2_in, T, CO2_loading)
# KGAv_Theo_all[i] = KGAv_theo
# cap_eff_all[i] = cap_eff
# def KGAv_Fit(Inputs, K, c):
# for i in range(npoints):
# [Q_l_flux, Q_g_flux, P_CO2_in, T] = Inputs[i]
# hm, U, d = hm_calc(Q_l_flux, Q_g_flux, P_CO2_in, T)
# A_1d = 4*3.14*d*d/4
# Vol_1d = (4/3)*3.14*(d**3)/8
# Q_L = Q_l_flux*A_D/3600 # Liquid flow rate [m3/s] when Q_l_flux is in m3/m2-h
# Q_G =Q_g_flux*A_D/3600 # Gas Flow Rate [m3/s] (For aroonwilas paper, the flow rate is assumed total gas flow rate for now as info is not clerarly mentioned in paper)
# Q_G_mole = 3600*(Q_G*1000/(22.4*1000))*((T/298)/(P_tot/101.325))/(A_D) #Gas Flow Rate in kmol/m3-hr
# X2_Fit = X1*math.exp(-hm*Q_L*A_1d*H*K/(Q_G*Vol_1d*U))
# Y2_Fit = X2_Fit/(1-X2_Fit)
# KGAv_Fit = (Q_G_mole*(1-X1)/(P_tot*H))*(math.log(Y1/Y2_Fit) + Y1 - Y2_Fit) + c
# KGAv_Fit_all[i] = KGAv_Fit
# cap_eff_Fit = (X1-X2_Fit)*100/X1 ### Change the definition as per paper that it is being validated to, if needed
# cap_eff_Fit_all[i] = cap_eff_Fit
# return KGAv_Fit_all
# params, extras = curve_fit(KGAv_Fit, Inputs, y_exp)
# K = params[0]
# c = params[1]
# print(K,c)
# KGAv_Fit_all = KGAv_Fit(Inputs, K, c)
plt.figure()
plt.plot(x_exp, KGAv_Theo_all, 'go-', label = 'Analytical Model')
# plt.plot(x_exp, KGAv_Fit_all, 'ro-', label = 'Model with Fitting')
plt.plot(x_exp, y_exp, 'bo-', label = 'Expt Data')
plt.legend()
# if Var == 'Liquid Flow Rate':
# Q_l_flux_array = np.zeros(len(x_exp))
# Q_l_flux_array[:] = x_exp[:]
# Q_g_flux = 382 #m3/m2-h
# Q_G =Q_g_flux*A_D/3600 #Gas Flow Rate [m3/s] (Assumed total gas flow rate for now as info is not clerarly mentioned in paper)
# Q_G_mole = 3600*(Q_G*1000/(22.4*1000))*(((273+T)/298)/(P_tot/101.325))/(A_D) #Gas Flow Rate in kmol/m3-hr
# hm_array, U_array, d_array = hm_calc_QLarray(Q_l_flux_array, Q_g_flux, A_D, K_factor, d_orifice, P_CO2_in, P_tot, T, nozzle_type)
# def KGAv_Theo_for_Ql(Q_l_flux_array, hm_array, U_array, d_array):
# Q_L_array = np.zeros(len(Q_l_flux_array))
# X2_theo = np.zeros(len(Q_l_flux_array))
# Y2_theo = np.zeros(len(Q_l_flux_array))
# KGAv_theo = np.zeros(len(Q_l_flux_array))
# for i in range(len(Q_l_flux_array)):
# Q_L_array[i] = Q_l_flux_array[i]*A_D/3600
# d = d_array[i]
# A_1d = 4*3.14*d*d/4
# Vol_1d = (4/3)*3.14*(d**3)/8
# X2_theo[i] = X1*math.exp(-hm_array[i]*Q_L_array[i]*A_1d*H/(Q_G*Vol_1d*U_array[i]))
# #X2_calc[i] = X1*math.exp(-c*H*((Q_L_array[i]*d_orifice)**.5)/Q_G)
# Y2_theo[i] = X2_theo[i]/(1-X2_theo[i])
# KGAv_theo[i] = (Q_G_mole*(1-X1)/(P_tot*H))*(math.log(Y1/Y2_theo[i])+Y1-Y2_theo[i])
# return KGAv_theo
# if Var == 'Gas Flow Rate':
# Q_g_flux_array = np.zeros(len(x2_exp))
# Q_g_flux_array[:] = x2_exp[:]
# Q_L = Q_l_flux*A_D/3600
# hm_array, U_array, d_array = hm_calc_QGarray(Q_g_flux_array, Q_l_flux, A_D, K_factor, d_orifice, P_CO2_in, P_tot, T, nozzle_type)
# def KGAv_Theo_for_Qg(Q_g_flux_array, hm_array, U_array, d_array):
# Q_G_array = np.zeros(len(Q_g_flux_array))
# Q_G_mole_array = np.zeros(len(Q_g_flux_array))
# X2_theo = np.zeros(len(Q_g_flux_array))
# Y2_theo = np.zeros(len(Q_g_flux_array))
# KGAv_theo = np.zeros(len(Q_g_flux_array))
# for i in range(len(Q_g_flux_array)):
# Q_G_array[i] = Q_g_flux_array[i]*A_D/3600
# Q_G_mole_array[i] = 3600*(Q_G_array[i]*1000/(22.4*1000))*(((273+T)/298)/(P_tot/101.325))/(A_D)
# d = d_array[i]
# A_1d = 4*3.14*d*d/4
# Vol_1d = (4/3)*3.14*(d**3)/8
# X2_theo[i] = X1*math.exp(-hm_array[i]*Q_L*A_1d*H/(Q_G_array[i]*Vol_1d*U_array[i]))
# #X2_calc[i] = X1*math.exp(-c*H*((Q_L_array[i]*d_orifice)**.5)/Q_G)
# Y2_theo[i] = X2_theo[i]/(1-X2_theo[i])
# KGAv_theo[i] = (Q_G_mole_array[i]*(1-X1)/(P_tot*H))*(math.log(Y1/Y2_theo[i])+Y1-Y2_theo[i])
# return KGAv_theo
# def KGAv_Calculator_for_Ql(Q_l_flux_array, c, K):
# Q_L_array = np.zeros(len(Q_l_flux_array))
# X2_calc = np.zeros(len(Q_l_flux_array))
# Y2_calc = np.zeros(len(Q_l_flux_array))
# KGAv_calc = np.zeros(len(Q_l_flux_array))
# for i in range(len(Q_l_flux_array)):
# Q_L_array[i] = Q_l_flux_array[i]*A_D/3600
# X2_calc[i] = X1*math.exp(-c*hm_array[i]*H*((Q_L_array[i]*d_orifice)**.5)/Q_G)
# #X2_calc[i] = X1*math.exp(-c*H*((Q_L_array[i]*d_orifice)**.5)/Q_G)
# Y2_calc[i] = X2_calc[i]/(1-X2_calc[i])
# #KGAv_calc[i] = (Q_G_mole*(1-X1)/(P_tot*H))*(math.log(Y1/Y2_calc[i])+Y1-Y2_calc[i])
# KGAv_calc[i] = (Q_G_mole*(1-X1)/(P_tot*H))*(math.log(Y1/Y2_calc[i])+Y1-Y2_calc[i]) + K
# return KGAv_calc
# #def KGAv_Calculator_for_Qg(Q_g_flux_array, c, K):
# def KGAv_Calculator_for_Qg(Q_g_flux_array, c, K, c2):
# Q_G_array = np.zeros(len(Q_g_flux_array))
# X2_calc = np.zeros(len(Q_g_flux_array))
# Y2_calc = np.zeros(len(Q_g_flux_array))
# KGAv_calc = np.zeros(len(Q_g_flux_array))
# for i in range(len(Q_g_flux_array)):
# Q_G_array[i] = Q_g_flux_array[i]*A_D/3600
# X2_calc[i] = X1*math.exp(-c*hm_array[i]*H*((Q_L*d_orifice)**.5)/Q_G_array[i]**c2)
# #X2_calc[i] = X1*math.exp(-c*6*hm_array[i]*H*Q_L/(d_array[i]*Q_G_array[i]*U_array[i]))
# Y2_calc[i] = X2_calc[i]/(1-X2_calc[i])
# print(Y2_calc[i])
# Q_G_mole = 3600*(Q_G_array[i]*1000/(22.4*1000))*(((273+T)/298)/(P_tot/101.325))/(A_D)
# #KGAv_calc[i] = (Q_G_mole*(1-X1)/(P_tot*H))*(math.log(Y1/Y2_calc[i])+Y1-Y2_calc[i])
# KGAv_calc[i] = (Q_G_mole*(1-X1)/(P_tot*H))*(math.log(Y1/Y2_calc[i])+Y1-Y2_calc[i]) + K
# return KGAv_calc
# if Var == 'Liquid Flow Rate':
# params, extras = curve_fit(KGAv_Calculator_for_Ql, x_exp, y_exp)
# c = params[0]
# K = params[1]
# plt.plot(x_exp, KGAv_Theo_for_Ql(Q_l_flux_array, hm_array, U_array, d_array), 'go-', label = 'Analytical Model')
# plt.plot(x_exp, KGAv_Calculator_for_Ql(Q_l_flux_array, c, K), 'ro-', label = 'Semi-Analytical-Empirical Fit')
# plt.plot(x_exp, y_exp, 'bo-', label = 'Experimental data')
# plt.xlabel('Liquid flow rate (m3/m2-h)')
# if Var == 'Gas Flow Rate':
# params, extras = curve_fit(KGAv_Calculator_for_Qg, x2_exp, y_exp)
# c = params[0]
# K = params[1]
# c2 = params[2]
# #plt.plot(x2_exp, KGAv_Theo_for_Qg(Q_g_flux_array, hm_array, U_array, d_array), 'g', label = 'Theoretical Model')
# plt.plot(x2_exp, KGAv_Calculator_for_Qg(Q_g_flux_array, c, K, c2), 'ro-', label = 'Analytical Fit')
# #plt.plot(x2_exp, KGAv_Calculator_for_Qg(Q_g_flux_array, c, K), 'ro', label = 'Analytical Fit')
# plt.plot(x2_exp, y_exp, 'bo-', label = 'Experimental data')
# plt.xlabel('Gas flow rate (m3/m2-h)')
# plt.ylabel('KgAe (kmol/m3-h-kPa)')
# plt.legend(loc='best')
# #plt.title('Kuntz fit 2f and 2c')
# #plt.savefig()#'%s/Concentration_timehistory.pdf'%WritetoFolder, bbox_inches='tight')
# if nozzle_type == 'P-40':
# c_P40 = c
# K_P40 = K
# if nozzle_type == 'P-28':
# c_P28 = c
# K_P28 = K
# print(c, K)
######plt.plot(x_exp, KGAv_Calculator_for_Ql(x_exp, c), 'r')
# plt.plot(x_exp, KGAv_Calculator_for_Ql(x_exp, c, K), 'ro', label = 'Analytical Fit')
# #####plt.plot(x_exp, KGAv_Calculator_for_Ql(x_exp, 504.1583049223172, -1.6742542161512164), 'g')
# #####plt.plot(x_exp, KGAv_Calculator_for_Ql(x_exp, 246.1363698486537, -0.17978853997655872), 'g')
# ######plt.plot(x_exp, KGAv_Calculator_for_Ql(x_exp, 1737430449.8144524, 1.39), 'g')
# plt.plot(x_exp, y_exp, 'bo', label = 'Experimental data')
#plt.plot(x2_exp, KGAv_Calculator_for_Qg(x2_exp, c,c2, K), 'ro', label = 'Analytical Fit')
#plt.plot(x2_exp, y_exp, 'bo', label = 'Experimental data')
#
# r_probe=R/8
# t_probe=1
# C_probe=DropletDiffusion_Functions.calc_probe(r_probe,t_probe,R,Rbar,kg,Bi,Henry,DCO2,Cinit,PCO2)
# tstart=1
# tfinal=100
# Ntime=20
# tsample=np.linspace(tstart,tfinal,Ntime)
# C_all_Rover4=np.zeros((Ntime,))
# C_all_Rover2=np.zeros((Ntime,))
# C_all_Rover1=np.zeros((Ntime,))
# for i in range(0,Ntime):
# C_all_Rover4[i]=DropletDiffusion_Functions.calc_probe(R/4,tsample[i],R,Rbar,kg,Bi,Henry,DCO2,Cinit,PCO2)
# C_all_Rover2[i]=DropletDiffusion_Functions.calc_probe(R/2,tsample[i],R,Rbar,kg,Bi,Henry,DCO2,Cinit,PCO2)
# C_all_Rover1[i]=DropletDiffusion_Functions.calc_probe(R/1,tsample[i],R,Rbar,kg,Bi,Henry,DCO2,Cinit,PCO2)
# Ngrid=20
# rstart=R/Ngrid
# rsample=np.linspace(rstart,R,Ngrid)
# C_all_t10=np.zeros((Ngrid,))
# C_all_t20=np.zeros((Ngrid,))
# C_all_t30=np.zeros((Ngrid,))
# for i in range(0,Ngrid):
# C_all_t10[i]=DropletDiffusion_Functions.calc_probe(rsample[i],10,R,Rbar,kg,Bi,Henry,DCO2,Cinit,PCO2)
# C_all_t20[i]=DropletDiffusion_Functions.calc_probe(rsample[i],20,R,Rbar,kg,Bi,Henry,DCO2,Cinit,PCO2)
# C_all_t30[i]=DropletDiffusion_Functions.calc_probe(rsample[i],30,R,Rbar,kg,Bi,Henry,DCO2,Cinit,PCO2)
# plt.figure()
# plt.plot(tsample,C_all_Rover4,label='R/4')
# plt.plot(tsample,C_all_Rover2,label='R/2')
# plt.plot(tsample,C_all_Rover1,label='R')
# plt.xlabel('time (s)')
# plt.ylabel('Concentration (mol/m3)')
# plt.legend(loc='best')
# plt.title('Time history of concentration at various locations of the droplet')
# # plt.savefig('%s/Concentration_timehistory.pdf'%WritetoFolder, bbox_inches='tight')
# plt.figure()
# plt.plot(rsample,C_all_t10,label='t=10s')
# plt.plot(rsample,C_all_t20,label='t=20s')
# plt.plot(rsample,C_all_t30,label='t=30s')
# plt.xlabel('r (m)')
# plt.ylabel('Concentration (mol/m3)')
# plt.legend(loc='best')
# plt.title('Radial distribution of concentration in the droplet at various times')
# # plt.savefig('%s/Concentration_timehistory.pdf'%WritetoFolder, bbox_inches='tight')
```
```python
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 4 17:50:33 2022
@author: ab65462
"""
#### Includes design parameters, droplet size, add more..
import os
import math
import numpy as np
import pandas as pd
import scipy.interpolate
### Universal Constants-
g = 9.8 # Gravitational acceleration [m/s2]
Rbar = 8.3145 # Universal gas constant [J/mol/K]
### Pressure and Temperature at Inlet and ambient/operating conditions
P_tot = 101.325 #Ambient Pressure [kPa]
T = 25 + 273.15 #Inlet Temperature [K]
P_CO2_in = 15.000 #Inlet CO2 partial pressure [kPa]
X1= P_CO2_in/P_tot
Y1 = X1/(1-X1)
C_init = 5 #Initial Concentration in [M] or [kmol/m3]
###Reactor/Channel Design Specs-
D = 0.1 #Inner Diameter of Channel [m]
H = 0.55 #Height of channel [m]
A_D = np.pi*D*D/4 #Cross sectional area of channel
#nozzle_type = 'P-40'
#nozzle_type = 'P-28'
#nozzle_type = 'MPL30N'
folder = r"C:\Users\ab65462\Desktop\CO2 Musk Foundation\Spray Model\Kuntz_Aroonwilas_Data"
#fig_validate = '2b-1.91.csv'
#fig_validate = '2b-4.59.csv'
#fig_validate = '2fc-P28.csv'
fig_validate = '2f-P40.csv'
filename = os.path.join(folder,fig_validate)
df = pd.read_csv(filename)
kG_v_Q = df.to_numpy()
x_exp = np.array(kG_v_Q[:,0])
y_exp = np.array(kG_v_Q[:,1])
### Need to create filename for df so that these if conditions become cleaner
if fig_validate == '2b-1.91.csv':
nozzle_type = 'P-28'
Q_l_flux = 1.91 # Flux of liquid flow rate in m3/m2-h
Var = 'Gas Flow Rate'
if fig_validate == '2b-4.59.csv':
nozzle_type = 'P-28'
Q_l_flux = 4.59 # Flux of liquid flow rate in m3/m2-h
Var = 'Gas Flow Rate'
if fig_validate == '2fc-P28.csv':
nozzle_type = 'P-28'
Q_g_flux = 382 # Flux of gas flow rate in m3/m2-h
Var = 'Liquid Flow Rate'
if fig_validate == '2f-P40.csv':
nozzle_type = 'P-40'
Q_g_flux = 382 # Flux of gas flow rate in m3/m2-h
Var = 'Liquid Flow Rate'
#nozzle_type = 'MPL30N'
####Nozzle Specs-
if nozzle_type == 'P-40':
df_Q_vs_delP = pd.read_csv(r'C:\Users\ab65462\Desktop\CO2 Musk Foundation\Spray Model\Manufacturer Data\P-40-gpm_vs_psi.csv')
df_d_vs_delP = pd.read_csv(r'C:\Users\ab65462\Desktop\CO2 Musk Foundation\Spray Model\Manufacturer Data\P-40-micron_vs_psi.csv')
QvP = df_Q_vs_delP.to_numpy()
dvP = df_d_vs_delP.to_numpy()
d_orifice = 0.042*0.254 #[m]
K_factor = .0443 #Manufacturer's design parameter for nozzle that relates deltaP and GPM
if nozzle_type == 'P-28':
df_Q_vs_delP = pd.read_csv(r'C:\Users\ab65462\Desktop\CO2 Musk Foundation\Spray Model\Manufacturer Data\P-28-gpm_vs_psi.csv')
df_d_vs_delP = pd.read_csv(r'C:\Users\ab65462\Desktop\CO2 Musk Foundation\Spray Model\Manufacturer Data\P-28-micron_vs_psi.csv')
QvP = df_Q_vs_delP.to_numpy()
dvP = df_d_vs_delP.to_numpy()
d_orifice = 0.028*0.254 #[m]
K_factor = .0206 #Manufacturer's design parameter for nozzle that relates deltaP and GPM
if nozzle_type == 'MPL30N':
df_Q_vs_delP = pd.read_csv(r'C:\Users\ab65462\Desktop\CO2 Musk Foundation\Spray Model\Manufacturer Data\MPL30N-gpm_vs_psi.csv')
df_d_vs_delP = pd.read_csv(r'C:\Users\ab65462\Desktop\CO2 Musk Foundation\Spray Model\Manufacturer Data\MPL30N-micron_vs_psi.csv')
QvP = df_Q_vs_delP.to_numpy()
dvP = df_d_vs_delP.to_numpy()
d_orifice = 1.1*1e-3 #[m]
#K_factor = ? #Manufacturer's design parameter for nozzle that relates deltaP and GPM
def d_from_Q(Q_GPM): #Returns droplet diameter in um from flowrate in gpm
f_PvQ = scipy.interpolate.interp1d(QvP[:,1], QvP[:,0])
f_dvP = scipy.interpolate.interp1d(dvP[:,0], dvP[:,1])
delP = f_PvQ(Q_GPM)
#print(delP, 'psi')
droplet_dia = f_dvP(delP)
return droplet_dia
#print(d_from_Q(.3))
```
```python
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 6 21:05:44 2022
@author: ab65462
"""
### Includes simple side functions like viscosity, henry constant etc calculators
import numpy as np
import math
import matplotlib.pyplot as plt
import scipy.interpolate
from Input_Params import *
from scipy.integrate import *
def D_and_H_CO2_l_calc(T): # Temp input is in K, returns D and H for CO2 in 5M MEA at 30C
D_N2O_w = 5.07*1e-6*math.exp(-2371/T) # m2/s ADDD REFERENCE FOR THESE if it is not Tsai etal 2000!!!!
D_CO2_w = 2.35*1e-6*math.exp(-2119/T) # m2/s
D_N2O_MEA = 1.41*1e-9 # 30C and 5M MEA, data from Jium-Jie Ko et al 2001, [m2/s]
D_CO2_MEA = D_N2O_MEA*D_CO2_w/D_N2O_w
H_N2O_w = 8.547*1e6*math.exp(-2284/T) #[kPa-m3/kmol]
H_CO2_w = 2.8249*1e6*math.exp(-2044/T) #[kPa-m3/kmol]
H_N2O_MEA = 4924 #30C and 5M, data from Tsai et al 2000, [kPa-m3/kmol]
H_CO2_MEA = H_N2O_MEA*H_CO2_w/H_N2O_w
##### need to add a function of temp to H_N2O_MEA and D_N2O_MEA, then later add effect of concentration on all this too
return D_CO2_MEA, H_CO2_MEA
def k2_calc(T): #Temp input is in K
k2 = 1.72*1e11*math.exp(-4915.5/T) #Ramezaini etal 2021, 2nd order reaction rate used here, [m3/mols]
return k2
def calc_viscosity(T): #T in Kelvin, and dynamic viscosity in [kg/m-s]
#The following relation is based on Sutherland's formula for 3 coefficients (values are taken for air) ...ref- https://www.afs.enea.it/project/neptunius/docs/fluent/html/ug/node294.htm
T0 = 273.11 #K
mu_0 = 1.716*1e-5 #kg/m-s
Suth = 110.56 #Sutherland Constant (K)
mu = mu_0*((T/T0)**1.5)*((T0+Suth)/(T+Suth))
return mu
#plt.figure()
def U_calc(d, Ujet, nu_gas, U_G, H, rho_gas, rho_drop):
tau = (d**2)*(rho_drop/rho_gas)/(18*nu_gas)
#print(tau)
#print((U_G+Ujet)*d/nu_gas, 'Re')
U0 = Ujet + U_G # Adjusts the jet velocity to relative velocity wrt air (counterflow)
n_points = 1001
tf = 5
t = np.linspace(0,tf,n_points)
U = np.zeros(n_points) # Absolute Velocity of fluid in m/s
s = np.zeros(n_points)
reached_column_end = 0
for i in range(n_points):
U[i] = U0*math.exp(-t[i]/tau) + g*tau*(1-math.exp(-t[i]/tau)) - U_G
s[i] = U0*tau*(1-math.exp(-t[i]/tau)) + g*tau*t[i] - g*(tau**2)*(1-math.exp(-t[i]/tau)) - U_G*t[i]
#print(t[i], s[i], U[i])
if s[i] > H and reached_column_end == 0:
print('Here!!')
reached_column_end = 1
n_points_needed = i+1
residence_time = (t[i] +t[i-1])/2
plt.plot(t[:], s[:], 'b-', label = 'U vs s')
#print(s[i])
#residence_time = (t[i-1])/2
print(residence_time, 't_res')
break
n_points_needed = i+1
print(n_points_needed)
plt.plot(t[:], s[:], 'g-', label = 'U vs s')
U_fn_t = np.zeros(n_points_needed)
s_fn_t = np.zeros(n_points_needed)
t_fn_t = np.zeros(n_points_needed)
for j in range(n_points_needed):
U_fn_t[j] = U[j]
s_fn_t[j] = s[j]
t_fn_t[j] = t[j]
z = np.linspace(0,H,n_points_needed)
U_z = scipy.interpolate.interp1d(s_fn_t, U_fn_t)
U_fn_z = U_z(z)
t_z = scipy.interpolate.interp1d(s_fn_t, t_fn_t)
t_fn_z = t_z(z)
#s_z = scipy.interpolate.interp1d(s_fn_t, U_fn_t)
#plt.plot(z[:], U_fn_z[:], 'go', label = 'U vs s')
return U_fn_z, s_fn_t, t_fn_z, residence_time, z
def calc_gas_prop(P_CO2_in,T):
X1 = P_CO2_in/P_tot
mu_air=calc_viscosity(T) # named as mu_air because it is currently evaluating for air only and not for flue gas
mu_gas = mu_air # Assumed viscosity of flue gas is same as that of air
M_gas = 0.028*(1-X1) + 0.044*(X1)
rho_gas = P_tot*1000/(Rbar/M_gas)/(T)
nu_gas = mu_gas/rho_gas
return nu_gas, rho_gas
def U_calc2(Q_l_flux, Q_g_flux, T):
Q_L = Q_l_flux*A_D/3600 #Liquid flow rate [m3/s] when Q_l_flux is in m3/m2-h
Q_L_GPM = Q_L*15850.3 #Liquid Flow Rate in Gallons/minute
d = d_from_Q(Q_L_GPM)*1e-6 #droplet SMD in [m]
Q_G =Q_g_flux*A_D/3600 # Gas Flow Rate [m3/s] (For aroonwilas paper, the flow rate is assumed total gas flow rate for now as info is not clerarly mentioned in paper)
U_G = Q_G/A_D # Gas Velocity [m/s]
U_jet = Q_L*4/(3.14*d_orifice*d_orifice) # Velocity of the droplet.. jet velocity is used here [m/s]
nu_gas, rho_gas = calc_gas_prop(P_CO2_in,T)
rho_drop = 1000 # Density of the droplet [kg/m3]. Both MEA and water have a density around 1000
U_fn_z, s_fn_z, t_fn_z, t_res, z = U_calc(d, U_jet, nu_gas, U_G, H, rho_gas, rho_drop)
U = H/t_res #Average velocity
return U
def hm_calc(Q_l_flux, Q_g_flux, P_CO2_in, T, CO2_loading, U):
Q_L = Q_l_flux*A_D/3600 #Liquid flow rate [m3/s] when Q_l_flux is in m3/m2-h
Q_L_GPM = Q_L*15850.3 #Liquid Flow Rate in Gallons/minute
d = d_from_Q(Q_L_GPM)*1e-6 #droplet SMD in [m]
R = d/2
Vol_1d = (4/3)*3.14*(d**3)/8
X1 = P_CO2_in/P_tot # Mole fraction of CO2 at inlet
####some gas quantities are for air, rest for flue gas, I need to incorporate the air part to flue gas as well later...
mu_air=calc_viscosity(T) # named as mu_air because it is currently evaluating for air only and not for flue gas
mu_gas = mu_air # Assumed viscosity of flue gas is same as that of air
M_gas = 0.028*(1-X1) + 0.044*(X1)
rho_gas = P_tot*1000/(Rbar/M_gas)/(T)
nu_gas = mu_gas/rho_gas
nu_gas, rho_gas = calc_gas_prop(P_CO2_in,T)
######remove####DCO2_w=1.92e-9 # Diffusivity of CO2 in the droplet [m2/s]. This value is for MEA wt30%
D_CO2_air = 1.6e-5 # Diffusivity of CO2 in the air [m2/s]
######remove#####Henry=4219 # Henry's coefficient in [m3Pa/mol]. This value is for water (AbuArabi 2001)
rho_drop = 1000 # Density of the droplet [kg/m3]. Both MEA and water have a density around 1000
mu_drop = 2.48*1e-3 # Dynamic viscosity of the droplet at about 30C and 30wt% or 5M MEA [Pas] Ref: Arachchigeetal 2013
nu_drop = mu_drop/rho_drop
D_CO2_MEA, H_CO2_MEA = D_and_H_CO2_l_calc(T)
#print(D_CO2_MEA, H_CO2_MEA)
#Cinit=0 # Initial CO2 concentration in the droplet [mol/m3] .. To be used later when C(z) will be added
k2 = k2_calc(T) #m3/mol-s
C_drop = C_init #kmol/m3 or M
#print(k2)
print(CO2_loading)
1/0
# if CO2_loading > 0.5:
# if CO2_loading < 0.5:
k_liq_w_kin = ((k2*D_CO2_MEA*C_init*(1-2*CO2_loading)*1000)**0.5/H_CO2_MEA) #[mol/(Pa-m2-s)] or [mol-s/(kg-m)]
#print(k_liq_w_kin)
###Flow Parameters-
# Q_G =Q_g_flux*A_D/3600 #Gas Flow Rate [m3/s] (For aroonwilas paper, the flow rate is assumed total gas flow rate for now as info is not clerarly mentioned in paper)
# U_G = Q_G/A_D #Gas Velocity [m/s]
U_jet = Q_L*4/(3.14*d_orifice*d_orifice) # Velocity of the droplet.. jet velocity is used here [m/s]
# # U_fn_z, s_fn_z, t_fn_z, t_res, z = U_calc(d, U_jet, nu_gas, U_G, H, rho_gas, rho_drop) ### Gives velocity of droplet at each location of height, and droplet residence time
# U = H/t_res #Average velocity
# #U = U_jet
#print('Gas velocity is', U_G, 'and droplet velocity is', U)
# tau = d*d/(18*nu_drop) #Time constant for velocity variation
# U_rel_terminal = g*tau
# U_terminal = U_rel_terminal-U_G
# #print( 'Gas velocity is', U_G, 'and droplet velocity is', U, 'and terminal velocity is', U_terminal)
# U_array[j] = U_terminal
# print(U_terminal, U, U_G)
Re_drop = U*d/nu_gas ###Should it be relative velocity or absolute fluid velocity
Sc_drop = nu_gas/D_CO2_air # Check these!! Also check if the diffusion represented here is co2 or amine
Sh_drop = 2 + 0.552*(Re_drop**(1/2))*(Sc_drop**(1/3)) #Froessling Equation
#print(Sh_drop, 'is sherwood number')
#print('nu_gas=',nu_gas)
Re_jet = U_jet*d/nu_gas
Stop_dist = (rho_drop*d/rho_gas)*(Re_jet**(1/3)-math.sqrt(6)*math.atan(Re_jet**(1/3)/math.sqrt(6)))
#print('S=', Stop_dist)
kg=Sh_drop*D_CO2_air/(Rbar*T*d) # [mol/(Pa-m2-s)] or [mol-s/(kg-m)]
#print(kg)
#kG = kg
kG = 1/(1/kg + 1/k_liq_w_kin)
hm = kG*Rbar*T #[m/s]
# print('kL = ', k_liq_w_kin, 'kg = ', kg, 'and kG = ', kG)
#print('Kgav in mol/Pa-m3-hr assuming area for all droplets = ', kG*3600*H*Q_L/(U*Vol_1d*A_D*H) )
#print(hm, 'is hm')
Bi=kg*(d)*Rbar*T/D_CO2_air
#print("Biot is %2.2f" %(Bi))
return hm, d
```
```
```