Solución de Matlab para la ecuación implícita de calor de diferencia finita con reacciones cinéticas

8

Estoy tratando de modelar la conducción de calor dentro de un cilindro de madera usando métodos implícitos de diferencias finitas. La ecuación de calor general que estoy usando para formas cilíndricas y esféricas es:

ingrese la descripción de la imagen aquí

Donde p es el factor de forma, p = 1 para el cilindro y p = 2 para la esfera. Las condiciones de contorno incluyen convección en la superficie. Para obtener más detalles sobre el modelo, consulte los comentarios en el código de Matlab a continuación.

El archivo m principal es:

%--- main parameters
rhow = 650;     % density of wood, kg/m^3
d = 0.02;       % wood particle diameter, m
Ti = 300;       % initial particle temp, K
Tinf = 673;     % ambient temp, K
h = 60;         % heat transfer coefficient, W/m^2*K

% A = pre-exponential factor, 1/s and E = activation energy, kJ/mol
A1 = 1.3e8;     E1 = 140;   % wood -> gas
A2 = 2e8;       E2 = 133;   % wood -> tar
A3 = 1.08e7;    E3 = 121;   % wood -> char 
R = 0.008314;   % universal gas constant, kJ/mol*K

%--- initial calculations
b = 1;          % shape factor, b = 1 cylinder, b = 2 sphere
r = d/2;        % particle radius, m

nt = 1000;      % number of time steps
tmax = 840;     % max time, s
dt = tmax/nt;   % time step spacing, delta t
t = 0:dt:tmax;  % time vector, s

m = 20;         % number of radius nodes
steps = m-1;    % number of radius steps
dr = r/steps;   % radius step spacing, delta r

%--- build initial vectors for temperature and thermal properties
i = 1:m;
T(i,1) = Ti;    % column vector of temperatures
TT(1,i) = Ti;   % row vector to store temperatures 
pw(1,i) = rhow; % initial density at each node is wood density, rhow
pg(1,i) = 0;    % initial density of gas
pt(1,i) = 0;    % inital density of tar
pc(1,i) = 0;    % initial density of char

%--- solve system of equations [A][T]=[C] where T = A\C
for i = 2:nt+1

    % kinetics at n
    [rww, rwg, rwt, rwc] = funcY(A1,E1,A2,E2,A3,E3,R,T',pw(i-1,:));
    pw(i,:) = pw(i-1,:) + rww.*dt;      % update wood density
    pg(i,:) = pg(i-1,:) + rwg.*dt;      % update gas density
    pt(i,:) = pt(i-1,:) + rwt.*dt;      % update tar density
    pc(i,:) = pc(i-1,:) + rwc.*dt;      % update char density
    Yw = pw(i,:)./(pw(i,:) + pc(i,:));  % wood fraction
    Yc = pc(i,:)./(pw(i,:) + pc(i,:));  % char fraction
    % thermal properties at n
    cpw = 1112.0 + 4.85.*(T'-273.15);   % wood heat capacity, J/(kg*K) 
    kw = 0.13 + (3e-4).*(T'-273.15);    % wood thermal conductivity, W/(m*K)
    cpc = 1003.2 + 2.09.*(T'-273.15);   % char heat capacity, J/(kg*K)
    kc = 0.08 - (1e-4).*(T'-273.15);    % char thermal conductivity, W/(m*K)
    cpbar = Yw.*cpw + Yc.*cpc;  % effective heat capacity
    kbar = Yw.*kw + Yc.*kc;     % effective thermal conductivity
    pbar = pw(i,:) + pc(i,:);   % effective density
    % temperature at n+1
    Tn = funcACbar(pbar,cpbar,kbar,h,Tinf,b,m,dr,dt,T);

    % kinetics at n+1
    [rww, rwg, rwt, rwc] = funcY(A1,E1,A2,E2,A3,E3,R,Tn',pw(i-1,:));
    pw(i,:) = pw(i-1,:) + rww.*dt;
    pg(i,:) = pg(i-1,:) + rwg.*dt;
    pt(i,:) = pt(i-1,:) + rwt.*dt;
    pc(i,:) = pc(i-1,:) + rwc.*dt;
    Yw = pw(i,:)./(pw(i,:) + pc(i,:));
    Yc = pc(i,:)./(pw(i,:) + pc(i,:));
    % thermal properties at n+1
    cpw = 1112.0 + 4.85.*(Tn'-273.15);
    kw = 0.13 + (3e-4).*(Tn'-273.15);
    cpc = 1003.2 + 2.09.*(Tn'-273.15);
    kc = 0.08 - (1e-4).*(Tn'-273.15);
    cpbar = Yw.*cpw + Yc.*cpc;
    kbar = Yw.*kw + Yc.*cpc; 
    pbar = pw(i,:) + pc(i,:);
    % revise temperature at n+1
    Tn = funcACbar(pbar,cpbar,kbar,h,Tinf,b,m,dr,dt,T);

    % store temperature at n+1
    T = Tn;
    TT(i,:) = T';
end

%--- plot data
figure(1)
plot(t./60,TT(:,1),'-b',t./60,TT(:,m),'-r')
hold on
plot([0 tmax/60],[Tinf Tinf],':k')
hold off
xlabel('Time (min)'); ylabel('Temperature (K)');
sh = num2str(h);  snt = num2str(nt);  sm = num2str(m);
title(['Cylinder Model, d = 20mm, h = ',sh,', nt = ',snt,', m = ',sm])
legend('Tcenter','Tsurface',['T\infty = ',num2str(Tinf),'K'],'location','southeast')

figure(2)
plot(t./60,pw(:,1),'--',t./60,pw(:,m),'-','color',[0 0.7 0])
hold on
plot(t./60,pg(:,1),'--b',t./60,pg(:,m),'b')
hold on
plot(t./60,pt(:,1),'--k',t./60,pt(:,m),'k')
hold on
plot(t./60,pc(:,1),'--r',t./60,pc(:,m),'r')
hold off
xlabel('Time (min)'); ylabel('Density (kg/m^3)');

La función m-file, funcACbar, que crea el sistema de ecuaciones para resolver es:

% Finite difference equations for cylinder and sphere
% for 1D transient heat conduction with convection at surface
% general equation is:
% 1/alpha*dT/dt = d^2T/dr^2 + p/r*dT/dr for r ~= 0
% 1/alpha*dT/dt = (1 + p)*d^2T/dr^2     for r = 0
% where p is shape factor, p = 1 for cylinder, p = 2 for sphere

function T = funcACbar(pbar,cpbar,kbar,h,Tinf,b,m,dr,dt,T)

alpha = kbar./(pbar.*cpbar);    % effective thermal diffusivity
Fo = alpha.*dt./(dr^2);         % effective Fourier number
Bi = h.*dr./kbar;               % effective Biot number

% [A] is coefficient matrix at time level n+1
% {C} is column vector at time level n
A(1,1) = 1 + 2*(1+b)*Fo(1);
A(1,2) = -2*(1+b)*Fo(2);
C(1,1) = T(1);

for k = 2:m-1
    A(k,k-1) = -Fo(k-1)*(1 - b/(2*(k-1)));   % Tm-1
    A(k,k) = 1 + 2*Fo(k);                    % Tm
    A(k,k+1) = -Fo(k+1)*(1 + b/(2*(k-1)));   % Tm+1
    C(k,1) = T(k);
end

A(m,m-1) = -2*Fo(m-1);
A(m,m) = 1 + 2*Fo(m)*(1 + Bi(m) + (b/(2*m))*Bi(m));
C(m,1) = T(m) + 2*Fo(m)*Bi(m)*(1 + b/(2*m))*Tinf;

% solve system of equations [A]{T} = {C} where temperature T = [A]\{C}
T = A\C;

end

Y finalmente, la función que se ocupa de las reacciones cinéticas, de manera funcional, es:

% Kinetic equations for reactions of wood, first-order, Arrhenious type equations
% K = A*exp(-E/RT) where A = pre-exponential factor, 1/s
% and E = activation energy, kJ/mol

function [rww, rwg, rwt, rwc] = funcY(A1,E1,A2,E2,A3,E3,R,T,pww)

K1 = A1.*exp(-E1./(R.*T));    % wood -> gas (1/s)
K2 = A2.*exp(-E2./(R.*T));    % wood -> tar (1/s)
K3 = A3.*exp(-E3./(R.*T));    % wood -> char (1/s)

rww = -(K1+K2+K3).*pww;      % rate of wood consumption (rho/s)
rwg = K1.*pww;               % rate of gas production from wood (rho/s)
rwt = K2.*pww;               % rate of tar production from wood (rho/s)
rwc = K3.*pww;               % rate of char production from wood (rho/s)

end

Ejecutar el código anterior proporciona un perfil de temperatura en el centro y la superficie del cilindro de madera:

ingrese la descripción de la imagen aquí

Como puede ver en este gráfico, por alguna razón, las temperaturas del centro y de la superficie convergen rápidamente en la marca de 2 minutos que no es correcta.

¿Alguna sugerencia sobre cómo solucionar esto o crear una forma más eficiente de resolver el problema?

meneando
fuente
Migraré esto a Computational Science , es más sobre el tema para ellos :)
Manishearth
@Manishearth gracias, he cambiado el título de "solución de Matlab para la ecuación del calor de diferencias finitas implícito con las reacciones cinéticas" para explicar mejor la cuestión de esperar
wigging
@Gavin: Gracias por incluir el código. Una sugerencia para hacer preguntas: intente elegir descripciones breves de los métodos numéricos que utiliza y póngalos al frente. Los "métodos implícitos de diferencias finitas" son un buen comienzo, y si puede profundizar más en eso, los usuarios tendrán que profundizar menos en su código para descubrir qué está pasando, lo que significa que es más probable que lo ayuden. Como puede ver en mi respuesta, tuve que investigar mucho su código para descubrir lo que hizo. Es útil saber cosas como "Euler hacia atrás" y "Tengo algunas otras ecuaciones en mi modelo".
Geoff Oxberry

Respuestas:

2

Parece que el modelo que estás tratando de resolver es:

(1/α(w,c))Tt(r,t)=Trr(r,t)+(p/r)Tr(r,t)wt(r,t)=(k1(T(r,t))+k2(T(r,t))+k3(T(r,t)))w(r,t)gt(r,t)=k1(T(r,t))w(r,t)at(r,t)=k2(T(r,t))w(r,t)ct(r,t)=k3(T(r,t))w(r,t)

dónde:

  • r= radio
  • t= tiempo
  • T= temperatura
  • w= densidad de madera
  • g= densidad de gas
  • a= densidad de alquitrán
  • c= densidad del carbón
  • ki es un coeficiente de velocidad parai=1,2,3
  • α es una difusividad térmica que es función de ywc
  • p es un factor de forma constante

y los subíndices de y denotan derivados.tr

Solo tiene condiciones límite para la temperatura (que son las únicas condiciones límite que necesita). Aunque menciona la condición de límite de convección en la superficie, su otra condición de límite debe ser una condición de simetría: para siempre, que debe imponer como parte del sistema que forma en , en lugar de omitir ese término del PDE en y discretizar la ecuación resultante.Tr(r=0,t)=0funcACbarr=0

Parece que está utilizando algún tipo de esquema implícito de predictor-corrector de dos etapas para integrar las ecuaciones de temperatura, donde hace lo siguiente:

T~(r,tn+1)=T(r,tn)+hf(T~(r,tn+1))T(r,tn+1)=T~(r,tn+1)+hf(T(r,tn+1))

donde la función denota el lado derecho de la ecuación diferencial para (en realidad es una función de más variables, pero trata las otras variables como esencialmente constantes en cada una de las dos etapas de su integrador.fT

Dentro de cada etapa, avanzas las densidades de especies usando Euler explícito.

Veo un par de posibles problemas con este esquema:

  • Dado que la temperatura está realmente acoplada a las densidades de madera y carbón, está introduciendo lo que se llama un error de división (física) que podría estar causando los artefactos numéricos que ha mencionado. Reducir su paso de tiempo reducirá este error.
  • Los términos de la fuente química a veces son rígidos. Los está integrando con Euler explícito, que no creo que haga intuitivamente (en función de los problemas que estudio), debido a problemas de estabilidad. Sin embargo, para la mayor parte de su problema, no parece haber una gran inestabilidad, y cualquier inestabilidad que tenga está apagada, por lo que tal vez eso no sea un problema. La combinación de métodos explícitos e implícitos de esta manera generalmente limita la precisión al primer o segundo orden (dependiendo de la división), a menos que use métodos IMEX (implícito-explícito).
  • Su mayor problema es crear su propio integrador de tiempo, por lo que no tiene control de precisión. O más bien, su única forma de controlar la precisión es reducir el intervalo de tiempo, mirar su solución y ver si la nueva solución es más precisa.

Esto es lo que haría:

  • Discretice sus ecuaciones en el espacio y resuelva todas ellas simultáneamente (por ahora). Si tiene veinte puntos en la dirección radial y cinco variables de estado en la formulación continua de su PDE, solo tendrá 100 variables de estado en su lado derecho. MATLAB debería poder manejar eso con bastante facilidad. La implementación de esta sugerencia eliminará los errores de división.
  • Para la integración de tiempo, use algo de una biblioteca. Dado que tiene términos de difusión y términos químicos, probablemente quiera usar algo implícito. Si encuentra que ninguno de los integradores MATLAB incorporados funciona, descargue la interfaz MATLAB a SUNDIALS, instálela y use CVODE. La implementación de esta sugerencia le proporcionará una integración de tiempo controlada por error, y estos integradores adaptarán sus pasos de tiempo para satisfacer las tolerancias de error que usted suministra, de modo que pueda solicitar soluciones que sean más precisas o menos precisas según sus requisitos de precisión.

Después de hacer esas cosas, será más fácil resolver sus problemas.

Geoff Oxberry
fuente
Con eso, ¿quiere decir que necesita incluir un flujo Dufour o algún tipo de término advectivo sin factor de forma?
Geoff Oxberry
En lugar de usar Creo que tendré que crear un modelo basado en donde varían con la temperatura.
1αTt=2Tr2+prTr
ρ(T)Cp(T)Tt=1r2r(k(T)r2Tr)
ρ(T),Cp(T),k(T)
peluca
Eso tiene sentido. La última forma se deriva directamente de la conservación de la energía; el primero esencialmente supone que la conductividad térmica tiene una dependencia radial insignificante. Todas las sugerencias que hice anteriormente todavía se aplican. Todavía sugeriría una formulación totalmente implícita y totalmente acoplada para comenzar, y usar una biblioteca para el paso del tiempo, que debería ocuparse de los problemas que tiene con los artefactos numéricos. Si la simulación lleva demasiado tiempo, puedo hacer más sugerencias sobre cómo acelerar las cosas.
Geoff Oxberry
@Gavin: Probablemente sea mejor hacerla como una pregunta separada, ya que el hilo aquí ya es bastante largo.
Geoff Oxberry
Consulte la siguiente pregunta scicomp.stackexchange.com/questions/8609/… que se relaciona directamente con la publicada aquí.
peluca