Matlab-Lösung für implizite Finite-Differenzen-Wärmegleichung mit kinetischen Reaktionen


8

Ich versuche, die Wärmeleitung innerhalb eines Holzzylinders mit impliziten Finite-Differenzen-Methoden zu modellieren. Die allgemeine Wärmegleichung, die ich für zylindrische und sphärische Formen verwende, lautet:

Geben Sie hier die Bildbeschreibung ein

Wobei p der Formfaktor ist, p = 1 für den Zylinder und p = 2 für die Kugel. Randbedingungen umfassen Konvektion an der Oberfläche. Weitere Informationen zum Modell finden Sie in den Kommentaren im Matlab-Code unten.

Die Haupt-M-Datei ist:

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

Die Funktion m-file, funcACbar, die das zu lösende Gleichungssystem erstellt, lautet:

% 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

Und schließlich ist die Funktion, die sich mit den kinetischen Reaktionen befasst, 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

Wenn Sie den obigen Code ausführen, erhalten Sie ein Temperaturprofil in der Mitte und auf der Oberfläche des Holzzylinders:

Geben Sie hier die Bildbeschreibung ein

Wie Sie aus diesem Diagramm ersehen können, konvergieren die Mittel- und Oberflächentemperaturen aus irgendeinem Grund schnell bei der 2-Minuten-Marke, was nicht korrekt ist.

Irgendwelche Vorschläge, wie Sie dieses Problem beheben oder einen effizienteren Weg zur Lösung des Problems finden können?


Ich werde dies zu Computational Science migrieren , es ist mehr zum Thema für sie :)
Manishearth

@ Manishearth danke, ich habe den Titel in "Matlab-Lösung für implizite Finite-Differenzen-Wärmegleichung mit kinetischen Reaktionen"
geändert,

@ Gavin: Danke, dass Sie den Code aufgenommen haben. Ein Vorschlag zum Stellen von Fragen: Bitte versuchen Sie, kurze Beschreibungen der von Ihnen verwendeten numerischen Methoden herauszusuchen und sie in den Vordergrund zu stellen. "Implizite Finite-Differenzen-Methoden" ist ein guter Anfang, und wenn Sie das genauer ausarbeiten können, müssen Benutzer Ihren Code weniger durchforsten, um herauszufinden, was los ist, was bedeutet, dass sie Ihnen eher helfen. Wie Sie in meiner Antwort sehen können, musste ich viel in Ihrem Code stöbern, um herauszufinden, was Sie getan haben. Dinge wie "rückwärts Euler" und "Ich habe auch einige andere Gleichungen in meinem Modell" sind hilfreich zu wissen.
Geoff Oxberry

Antworten:


2

Es sieht so aus, als ob das Modell, das Sie lösen möchten, Folgendes ist:

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

wo:

  • r=
  • t=
  • T=
  • w=
  • g=
  • a=
  • c=
  • kii=1,2,3
  • αwc
  • p

tr

Tr(r=0,t)=0funcACbarr=0

Es scheint, als würden Sie ein zweistufiges implizites Prädiktor-Korrektor-ähnliches Schema verwenden, um die Gleichungen für die Temperatur zu integrieren, wobei Sie Folgendes tun:

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

fT

Innerhalb jeder Stufe erhöhen Sie die Artendichte mit explizitem Euler.

Ich sehe ein paar mögliche Probleme mit diesem Schema:

  • Da die Temperatur wirklich an die Holz- und Holzkohle-Dichte gekoppelt ist, führen Sie einen sogenannten (physikalischen) Aufteilungsfehler ein, der die von Ihnen erwähnten numerischen Artefakte verursachen kann. Durch Verkleinern Ihres Zeitschritts wird dieser Fehler verringert.
  • Chemische Quellenbegriffe sind manchmal steif. Sie integrieren sie in explizites Euler, was ich aufgrund von Stabilitätsproblemen nicht intuitiv tun würde (basierend auf den Problemen, die ich untersuche). Für die meisten Ihrer Probleme scheint es jedoch keine große Instabilität zu geben, und alle Instabilitäten, die Sie haben, sind gedämpft. Vielleicht ist das also kein Problem. Wenn Sie explizite und implizite Methoden auf diese Weise kombinieren, wird die Genauigkeit normalerweise auf die erste oder zweite Ordnung beschränkt (abhängig von der Aufteilung), es sei denn, Sie verwenden IMEX-Methoden (implizit-explizit).
  • Ihr größtes Problem ist das Rollen Ihres eigenen Zeitintegrators, sodass Sie keine Genauigkeitskontrolle haben. Die einzige Möglichkeit, die Genauigkeit zu steuern, besteht darin, den Zeitschritt zu verkleinern, Ihre Lösung zu überprüfen und festzustellen, ob die neue Lösung genauer ist.

Folgendes würde ich tun:

  • Diskretisieren Sie Ihre Gleichungen im Raum und lösen Sie sie alle gleichzeitig (vorerst). Wenn Sie zwanzig Punkte in radialer Richtung und fünf Zustandsvariablen in der kontinuierlichen Formulierung Ihrer PDE haben, haben Sie nur 100 Zustandsvariablen auf Ihrer rechten Seite. MATLAB sollte in der Lage sein, dies ziemlich einfach zu handhaben. Durch die Implementierung dieses Vorschlags werden Aufteilungsfehler vermieden.
  • Verwenden Sie für die Zeitintegration etwas aus einer Bibliothek. Angesichts der Tatsache, dass Sie Diffusions- und Chemiebegriffe haben, möchten Sie wahrscheinlich etwas Implizites verwenden. Wenn Sie feststellen, dass keiner der integrierten MATLAB-Integratoren funktioniert, laden Sie die MATLAB-Schnittstelle auf SUNDIALS herunter, installieren Sie sie und verwenden Sie CVODE. Durch die Implementierung dieses Vorschlags erhalten Sie eine fehlergesteuerte Zeitintegration. Diese Integratoren passen ihre Zeitschritte an die von Ihnen angegebenen Fehlertoleranzen an, sodass Sie nach Lösungen fragen können, die je nach Ihren Genauigkeitsanforderungen genauer oder weniger genau sind.

Nachdem Sie diese Dinge getan haben, ist es einfacher, Ihre Probleme zu beheben.


Meinen Sie damit, dass Sie einen Dufour-Fluss oder einen Advektivbegriff ohne Formfaktor einschließen müssen?
Geoff Oxberry

1αTt=2Tr2+prTr
ρ(T)Cp(T)Tt=1r2r(k(T)r2Tr)
ρ(T),Cp(T),k(T)

Das macht Sinn. Die letztere Form leitet sich direkt aus der Energieeinsparung ab; Ersteres geht im Wesentlichen davon aus, dass die Wärmeleitfähigkeit eine vernachlässigbare radiale Abhängigkeit aufweist. Alle Vorschläge, die ich oben gemacht habe, gelten weiterhin. Ich würde immer noch eine vollständig implizite, vollständig gekoppelte Formulierung vorschlagen, um zu beginnen und eine Bibliothek für den Zeitschritt zu verwenden, die sich um die Probleme kümmern sollte, die Sie mit numerischen Artefakten haben. Wenn die Simulation zu lange dauert, kann ich weitere Vorschläge machen, wie Sie die Dinge beschleunigen können.
Geoff Oxberry

@ Gavin: Es ist wahrscheinlich besser, es als separate Frage zu stellen, da der Thread hier schon ziemlich lang ist.
Geoff Oxberry

Bitte lesen Sie die folgende Frage scicomp.stackexchange.com/questions/8609/…, die sich direkt auf die hier gepostete bezieht.
Wigging
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.