How to solve coupled partial differential equations with method of lines?
24 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Ari Dillep Sai
el 30 de Mayo de 2022
Comentada: Sona
el 11 de En. de 2023
I am getting problem in solving the partial differential equations used for modelling of packed bed adsorption column. I have attached the equations which I need to solve.
I solved it using method of lines approach with the help of some code which I got on mathworks ask community. But the graph which I am getting is different from which I need to get.
Can anyone help me in solving these equations?
I am also providing the code which I used to solve.
% parameters
eps = 0.41; % bed porosity
volflow = 5e-7; % volumetric flow rate in m3/sec
dia = 0.022; % bed internal dia in m
bedarea = pi*dia^2/4;
u = volflow/bedarea; % superficial velocity in m/s
Dl = 0.08e-4; % axial dipsersion coefficient in m2/sec
rhop = 1228.5; % particle density
Kl = 0.226; % overall mass transfer coeff in sec-1
P = 102000; % total pressure in pascals
R = 8.314; % gas constant in jol/mol-k
T = 500; % gas temp in K
yco2 = 0.2; % co2 mole fraction
cfeed = yco2*P/(R*T); % feed conc in mol/m3
K0 = 4.31e-9; % in pascal-1
delh = -29380; % heat of adsorption in j/mol
Keq = K0*exp(-delh/(R*T)); % equilibrium constant in pascal-1
% using method of lines
tf = 300; % End time
nz = 400; % Number of gateways
np = nz + 1; % Number of gateposts
% Initial Concentrations
C = zeros(np,1);
q = zeros(np,1);
c0 = [C; q];
dt = tf/300;
tspan = 0:dt:tf;
[t, c] = ode15s(@rates, tspan, c0);
% Plot results
plot(t,c(:,np-4)/cfeed),grid
xlabel('time'), ylabel('C/Cfeed')
function dcdt = rates(~,c)
eps = 0.41; % bed porosity
volflow = 5e-7; % volumetric flow rate in m3/sec
dia = 0.022; % bed internal dia in m
bedarea = pi*dia^2/4;
u = volflow/bedarea; % superficial velocity in m/s
Dl = 0.08e-4; % axial dipsersion coefficient in m2/sec
rhop = 1228.5; % particle density
Kl = 0.226; % overall mass transfer coeff in sec-1
P = 102000; % total pressure in pascals
R = 8.314; % gas constant in jol/mol-k
T = 500; % gas temp in K
yco2 = 0.2; % co2 mole fraction
cfeed = yco2*P/(R*T); % feed conc in mol/m3
K0 = 4.31e-9; % in pascal-1
delh = -29380; % heat of adsorption in j/mol
Keq = K0*exp(-delh/(R*T)); % equilibrium constant in pascal-1
qm = 5.09; % max adsrobed conc in mol/kg
n = 0.429; % toth isotherm parameter
L = 0.171;
nz = 400;
np = nz + 1;
dz = L/nz;
C = c(1:np);
q = c(np+1:2*np);
dCdt = zeros(np,1);
dqdt = zeros(np,1);
% boundary condition at z=0
C(1) = (1/(eps*Dl+u*dz))*((eps*Dl*C(2)+u*cfeed*dz));
for i = 2:np-1
dCdt(i) = (Dl/dz^2)*(C(i+1)-2*C(i)+C(i-1)) - (u/(2*eps*dz))*(C(i+1)-C(i-1)) - (((1-eps)*rhop)/eps)*dqdt(i);
dqdt(i) = Kl*((qm*Keq*C(i)*R*T/(1+(Keq*C(i)*R*T)^n)^(1/n)) - q(i));
end
% boundary conditions at z=L
dCdt(np) = dCdt(np-1);
% Combine rates for the function to return to the calling routine
dcdt = [real(dCdt); real(dqdt)];
end
Here I used time interms of seconds. So when I plot the graph the x-axis is also in seconds and my breakthrough time which I am getting is around 35 seconds. But in the experimental values for showed that the breakthrough time for the graph is around 300 minutes.
so please someone help whether there is any mistake which I am doing in my code.
4 comentarios
Respuesta aceptada
Davide Masiello
el 31 de Mayo de 2022
Editada: Davide Masiello
el 31 de Mayo de 2022
The breakthrough now is found to be sometimes after 4000 s (or ~67 mins), so not the 300 mins you have suggested, but maybe a bit better than the 35 s you were getting before.
Also note the following improvements to the code:
1 - I have passed all the constants as external parameters, so you don't have to define them again in the function.
2 - I have written the method of lines without use of for loops, but with wise use of logical indexing.
3 - ode15s solves a system of DAEs now, which is necessary given the algebraic nature of the boundary conditions for the diffusion equation.
I am not sure this will work for you but it might be a good starting point to develop your final solution.
I suggest you go throught the equations and the values of the parameters again, and ensure that everything is correct.
clear,clc
% Parameters
p.eps = 0.41; % bed porosity
p.volflow = 5e-7; % volumetric flow rate in m3/sec
p.dia = 0.022; % bed internal dia in m
p.bedarea = pi*p.dia^2/4;
p.u = p.volflow/p.bedarea; % superficial velocity in m/s
p.Dl = 0.08e-4; % axial dipsersion coefficient in m2/sec
p.rhop = 1228.5; % particle density
p.Kl = 0.226; % overall mass transfer coeff in sec-1
p.P = 102000; % total pressure in pascals
p.R = 8.314; % gas constant in jol/mol-k
p.T = 500; % gas temp in K
p.yco2 = 0.2; % co2 mole fraction
p.cfeed = p.yco2*p.P/(p.R*p.T); % feed conc in mol/m3
p.K0 = 4.31e-9; % in pascal-1
p.delh = -29380; % heat of adsorption in j/mol
p.Keq = p.K0*exp(-p.delh/(p.R*p.T)); % equilibrium constant in pascal-1
p.qm = 5.09; % max adsrobed conc in mol/kg
p.n = 0.429; % toth isotherm parameter
p.L = 0.171; % bed length
% using method of lines
tf = 300*60; % End time
p.nz = 400; % Number of nodes
z = linspace(0,p.L,p.nz); % Space domain
dz = diff(z); p.dz = dz(1); % Space increment
% Initial conditions
c = zeros(p.nz,1);
q = zeros(p.nz,1);
y0 = [c;q];
tspan = [0 tf];
% Mass matrix (for DAE system)
M = eye(2*p.nz);
M(1,1) = 0;
M(p.nz,p.nz) = 0;
options = odeset('Mass',M,'MassSingular','yes');
[t,y] = ode15s(@(t,y)rates(t,y,p),tspan,y0,options);
% Plot results
plot(t/60,y(:,p.nz)/p.cfeed)
grid
xlabel('time (mins)')
ylabel('C/Cfeed')
title('Dimensionless concentration at ''z = L''')
hold on
plot(t/60,0.05*ones(size(t)),'--r')
legend('C/Cfeed','breakthrough')
function out = rates(~,y,p)
% Variables
c = y(1:p.nz,1);
q = y(p.nz+1:2*p.nz,1);
% Space derivatives
dcdz = zeros(p.nz,1);
d2cdz2 = zeros(p.nz,1);
dcdz(2:end-1) = (c(3:end)-c(1:end-2))/(2*p.dz);
d2cdz2(2:end-1) = (c(3:end)-2*c(2:end-1)+c(1:end-2))/(p.dz^2);
% Saturation
qstar = p.qm*p.Keq*c*p.R*p.T./((1+(p.Keq*c*p.R*p.T).^(p.n)).^(1/p.n));
% Governing equations
dqdt = p.Kl*(qstar-q);
dcdt = p.Dl*d2cdz2-p.u*dcdz/p.eps-p.rhop*(1-p.eps)*dqdt/p.eps;
% Boundary conditions
dcdt(1) = p.eps*p.Dl*(c(2)-c(1))/p.dz+p.u*(p.cfeed-c(1));
dcdt(end) = c(end)-c(end-1);
% Output
out = [dcdt;dqdt];
end
22 comentarios
Más respuestas (1)
Torsten
el 30 de Mayo de 2022
Editada: Torsten
el 30 de Mayo de 2022
The sink term
- (((1-eps)*rhop)/eps)*dqdt(i);
for the concentration of your gaseous species is always 0 because you specify dqdt(i) after dCdt(i) in the for-loop.
Thus the breakthrough is at the time instant
t_break = L/(u/eps)
4 comentarios
Ver también
Categorías
Más información sobre Performance and Memory en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!