Solução Matlab para equação implícita de calor por diferença finita implícita com reações cinéticas


8

Estou tentando modelar a condução de calor dentro de um cilindro de madeira usando métodos implícitos de diferenças finitas. A equação geral de calor que estou usando para formas cilíndricas e esféricas é:

insira a descrição da imagem aqui

Onde p é o fator de forma, p = 1 para cilindro ep = 2 para esfera. As condições de contorno incluem convecção na superfície. Para mais detalhes sobre o modelo, consulte os comentários no código do Matlab abaixo.

O principal arquivo m é:

%--- 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)');

A função m-file, funcACbar, que cria o sistema de equações a resolver é:

% 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

E, finalmente, a função que lida com as reações cinéticas, funcY, é:

% 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

A execução do código acima fornece um perfil de temperatura no centro e na superfície do cilindro de madeira:

insira a descrição da imagem aqui

Como você pode ver neste gráfico, por alguma razão, as temperaturas do centro e da superfície convergem rapidamente na marca de 2 minutos, o que não está correto.

Alguma sugestão sobre como corrigir isso ou criar uma maneira mais eficiente de resolver o problema?


Vou migrar isso para Ciência Computacional , é mais sobre o tema para eles :)
Manishearth

@Manishearth obrigado, mudei o título para "Solução Matlab para equação implícita de calor por diferença finita implícita com reações cinéticas" para, esperamos, explicar melhor a pergunta
agitando

@ Gavin: Obrigado por incluir o código. Uma sugestão para fazer perguntas: tente escolher breves descrições dos métodos numéricos usados ​​e apresentá-los com antecedência. "Métodos de diferença finita implícita" é um bom começo, e se você puder descobrir mais isso, os usuários terão que pesquisar menos seu código para descobrir o que está acontecendo, o que significa que eles terão mais chances de ajudá-lo. Como você pode ver na minha resposta, eu tive que pesquisar bastante seu código para descobrir o que você fez. Coisas como "Euler retrógrado" e "Eu também tenho outras equações no meu modelo" são úteis para saber.
Geoff Oxberry

Respostas:


2

Parece que o modelo que você está tentando resolver é:

(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)

Onde:

  • r= raio
  • t= tempo
  • T= temperatura
  • w= densidade da madeira
  • g= densidade do gás
  • a= densidade do alcatrão
  • c= densidade do char
  • ki é um coeficiente de taxa parai=1,2,3
  • α é uma difusividade térmica que é uma função de ewc
  • p é um fator de forma constante

e índices de e derivados denotam.tr

Você só tem condições de contorno para temperatura (que são as únicas condições de contorno necessárias). Embora você mencione a condição de limite de convecção na superfície, sua outra condição de limite deve ser uma condição de simetria: para todo o tempo, que você deve impor como parte do sistema em que você forma , em vez de omitir esse termo do PDE em e discretizar a equação resultante.Tr(r=0,t)=0funcACbarr=0

Parece que você está usando algum tipo de esquema implícito de preditor-corretor de dois estágios para integrar as equações de temperatura, onde você faz o seguinte:

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))

onde a função indica o lado direito da equação diferencial para (é realmente uma função de mais variáveis, mas você trata as outras variáveis ​​como essencialmente constantes em cada um dos dois estágios do seu integrador.TfT

Dentro de cada estágio, você avança as densidades das espécies usando Euler explícito.

Vejo alguns problemas em potencial com esse esquema:

  • Como a temperatura está realmente acoplada às densidades de madeira e carvão, você está introduzindo o que é chamado de erro de divisão (física) que pode estar causando os artefatos numéricos mencionados. Diminuir sua etapa do tempo reduzirá esse erro.
  • Às vezes, os termos das fontes químicas são rígidos. Você os está integrando ao Euler explícito, o que eu não pensaria em fazer intuitivamente (com base nos problemas que estudo), devido a problemas de estabilidade. No entanto, para a maior parte do seu problema, não parece haver grande instabilidade e as instabilidades que você tem são amortecidas, portanto, talvez isso não seja um problema. A combinação de métodos explícitos e implícitos dessa maneira geralmente limita a precisão à primeira ou segunda ordem (dependendo da divisão), a menos que você use métodos IMEX (implícito-explícito).
  • Seu maior problema é lançar seu próprio integrador de tempo, para que você não tenha controle de precisão. Ou melhor, sua única maneira de controlar a precisão é diminuir o tempo, olhar para a sua solução e verificar se a nova solução é mais precisa.

Aqui está o que eu faria:

  • Discrete suas equações no espaço e resolva todas simultaneamente (por enquanto). Se você tiver vinte pontos na direção radial e cinco variáveis ​​de estado na formulação contínua do seu PDE, você terá apenas 100 variáveis ​​de estado no lado direito. O MATLAB deve ser capaz de lidar com isso com bastante facilidade. A implementação desta sugestão eliminará erros de divisão.
  • Para integração de tempo, use algo de uma biblioteca. Dado que você tem termos de difusão e termos de química, provavelmente deseja usar algo implícito. Se você achar que nenhum dos integradores integrados do MATLAB funciona, faça o download da interface do MATLAB para SUNDIALS, instale-a e use o CVODE. A implementação dessa sugestão fornecerá uma integração de tempo controlada por erros, e esses integradores adaptarão suas etapas de tempo para satisfazer as tolerâncias de erro fornecidas, para que você possa solicitar soluções mais precisas ou menos precisas, dependendo de seus requisitos de precisão.

Depois de fazer essas coisas, será mais fácil solucionar seus problemas.


Com isso, você quer incluir um fluxo Dufour ou algum tipo de termo que não seja um fator de forma?
amigos estão dizendo

Em vez de usar Acho que vou ter que criar um modelo baseado em onde variam com a temperatura. ρ(T)Cp(T)T
1αTt=2Tr2+prTr
ρ(T),Cp(T),k(T)
ρ(T)Cp(T)Tt=1r2r(k(T)r2Tr)
ρ(T),Cp(T),k(T)
wigging

Isso faz sentido. A última forma é derivada diretamente da conservação de energia; o primeiro pressupõe essencialmente que a condutividade térmica tem uma dependência radial desprezível. Todas as sugestões que fiz acima ainda se aplicam. Eu ainda sugeriria uma formulação totalmente implícita e totalmente acoplada para iniciar e usar uma biblioteca para a etapa do tempo, que deve cuidar dos problemas que você tem com artefatos numéricos. Se a simulação demorar muito, posso fazer mais sugestões sobre como você pode acelerar as coisas.
amigos estão dizendo sobre geoff

@ Gavin: Provavelmente é melhor fazer isso como uma pergunta separada, já que o tópico aqui já é bastante longo.
Geoff Oxberry

Consulte a seguinte pergunta, scicomp.stackexchange.com/questions/8609/…, diretamente relacionada à postada aqui.
wigging
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.