Ich vermute, Sie lösen das folgende System:
∂tT=αi∂2xT
mit αi=κi/ρichcp , ich für Material ich, vorbehaltlich der Bedingungen:
T.( x , 0 ) =T.∞T.( 0 , t ) =T.h- κ∂xT.( L , t ) = h [ T.( L , t ) -T.∞]]
Jetzt können Sie verschiedene Materialien folgendermaßen simulieren:
- Definieren Sie eine Schnittstelle an einem Knoten unter xb;; machenαich eine Funktion von x, haben α =α1 in der Region 0 ≤ x ≤xb und α =α2 in der Region xb≤ x ≤ L..
- Auferlegen eines thermischen Gleichgewichts und einer Kontinuität des Wärmeflusses an der Grenzfläche; dh:
T.(x- -b) =T.(x+b)- -κ1∂xT.(x- -b) =-κ2∂xT.(x+b)
Ich würde den Knoten entsprechend machen x=0 gleicht T=Th und der Knoten entsprechend x=L gleicht:
−κ2T(L−,t)−T(L,t)Δx=h[T(L,t)−T∞]
T(L,t)=T(L−,t)−βT∞1−ββ=hΔxκ2
wo T(L−,t) ist der Knoten links von x=L.
Lösung basierend auf endlichem Volumen
Ich beschloss, dies noch einmal zu betrachten und fand eine Lösung auf der Basis von Finite Volume, die meiner Meinung nach besser funktioniert. Zufälligerweise ist eine 1D-FV-Lösung dieselbe wie eine 1D-FD-Lösung, außer dass das Gitter versetzt ist. Beginnen wir einfach und fügen Komplexität hinzu, nachdem alles richtig funktioniert hat.
Einige wichtige Annahmen, die ich in der Analyse getroffen habe:
- Knoten sind bei monospaced Δx=L/N wo L ist die Länge der Domain und Ndie Anzahl der Knoten; Dies vereinfacht die Analyse erheblich.
- Die Grenzen und die Grenzfläche befinden sich genau auf halber Strecke zwischen den Knoten. Dies ermöglicht eine genaue Approximation zweiter Ordnung von Temperaturen und Gradienten an diesen Grenzen.
- Ich kümmere mich nicht um die zeitliche Integration dieser Systeme, sondern überlasse dies einem relevanten ODE-Solver, der lineare Systeme verarbeiten kann (siehe Verwendung des
odeint
von Scipy bereitgestellten Solvers im unten angehängten Python-Code). Ein guter Löser verfügt über adaptive Zeitschritte, mit denen ich Probleme mit numerischer Instabilität im Zusammenhang mit dem CFL-Kriterium vermeiden kann.
Wir beginnen mit einer einfachen Diffusion zwischen zwei vom System definierten Grenzen:
∂tT=α∂2xT
T(x,0)=T∞T(0,t)=ThT(L,t)=T∞
In FV definieren wir eine Durchschnittstemperatur über dem Kontrollvolumen dV=Adx::
T¯i=∫VTdV∫VdV=1Δx∫i+12Δxi−12ΔxTdx
Wir integrieren dann unsere PDE:
1Δx∫i+12Δxi−12Δx∂tTdx=αΔx∫i+12Δxi−12Δx∂2xTdx
∂tT¯i=αΔx[∂xT|i−12Δx−∂xT|i+12Δx]
∂tT¯i=αΔx2[T¯i−Δx−2T¯i+T¯i+Δx]
Hier 0≤i≤N−1 sind die inklusiven Knoten, dh die Knoten liegen innerhalb der Domäne gemäß diesem Schema:
Die Umrechnung von der Knotenposition in die räumliche Position ist gegeben durch:
i=NxL−12
In diesem versetzten Gitter sind die Grenzen x=0 und x=Lbefinden sich auf halber Strecke zwischen zwei Knoten. Wenn wir uns jedoch einen Geisterknoten bei vorstelleni=−1 und i=Nkönnen wir die Grenztemperaturen definieren als:
Th=T¯−1+T¯02→T¯−1=2Th−T¯0
T∞=T¯N−1+T¯N2→T¯N=2T∞−T¯N−1
Dies ergibt dann die folgenden ODEs für i=0 und i=N−1::
∂tT¯0=αΔx2[T¯−1−2T¯0+T¯1]=αΔx2[2Th−3T¯0+T¯1]
∂tT¯N−1=αΔx2[T¯N−2−2T¯N−1+T¯N]=αΔx2[T¯N−2−3T¯N−1+2T∞]
Jetzt sind wir in der Lage, unser lineares System zu definieren. Wenn wir einen Temperaturvektor definieren:
T¯=[T¯0T¯1⋯T¯N−2T¯N−1]T
Das ODE-System kann wie folgt geschrieben werden:
∂tT¯=ω(A⋅T¯+b)ω=αΔx2
wo:
A=⎡⎣⎢⎢⎢⎢⎢⎢⎢−310001−2⋱0001⋱1000⋱−210001−3⎤⎦⎥⎥⎥⎥⎥⎥⎥b=⎡⎣⎢⎢⎢⎢⎢⎢2Th0002T∞⎤⎦⎥⎥⎥⎥⎥⎥
Lösen dieses Systems für Th=1, T∞=0, L=1ergibt folgendes Ergebnis:
wobei die Temperaturprofile zu unterschiedlichen Zeiten angegeben werden und die Marker die analytische Lösung sind, die gegeben ist durch:
T=Th−(Th−T∞)xL
Hinzufügen einer konvektiven Randbedingung
Lassen Sie uns die Randbedingung bei ändern x=L zu:
−k∂xT(L,t)=h(T(L,t)−T∞)
Wir diskretisieren diesen Zustand:
−k(T¯N−T¯N−1Δx)=h(T¯N−1+T¯N2−T∞)
und neu anordnen für die Geisterknotentemperatur bei i=N::
T¯N=Nux1+12NuxT∞+1−12Nux1+12NuxT¯N−1Nux=hΔxk
Dies ist nun eine Funktion einer Gitter-Nusselt-Zahl, die die relative Bedeutung der konvektiven für die leitende Wärmeübertragung angibt. Wenn
Nux≪1 dann ist die Konvektion im Vergleich zur Leitung vernachlässigbar und umgekehrt, wenn
Nux≫1.
Beachten Sie, dass, wenn wir die Grenzen nehmen:
limNux→0T¯N=T¯N−1limNux→∞T¯N=2T∞−T¯N−1
Wir erhalten eine Bedingung ohne Fluss als
Nux→0 und die zuvor gefundene konstante Temperaturbedingung als
Nux→∞. Dies gibt einen guten Hinweis auf die Richtigkeit der Implementierung.
Um diese Bedingung zu berücksichtigen, ändern wir die ODE wie folgt:
∂tT¯N−1=αΔx2[T¯N−2−2T¯N−1+T¯N]=αΔx2[T¯N−2−(2−1−12Nux1+12Nux)T¯N−1+Nux1+12NuxT∞]
was ändert A und b zu:
A=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢−310001−2⋱0001⋱1000⋱−210001−(2−1−12Nux1+12Nux)⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥b=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢2Th000Nux1+12NuxT∞⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
Um die Temperatur bei zu erhalten x=L, wir haben:
TL=T¯N−1+T¯N2=12Nux1+12NuxT∞+11+12NuxT¯N−1
Das Ergebnis für das gleiche System wie oben mit Nu=NNux=1 ist:
Die analytische Lösung ist gegeben durch:
T=Th−(Th−T∞)Nu1+NuxL
Nu=hLk=NuxLΔx=NNux
Verbundmaterial simulieren
Um ein Verbundmaterial zu simulieren, definieren wir eine Schnittstelle unter x=xb befindet sich am Knoten i=ib wo die Region 1 (0≤x<xb) ist charakterisiert durch α1 und Region 2 (xb<x≤L) ist charakterisiert durch α2. An der Grenzfläche muss ein thermisches Gleichgewicht und eine Kontinuität des Wärmeflusses bestehen:
T.1(xb, t ) =T.2(xb, t )
- -k1∂xT.1(xb, t ) = -k2∂xT.2(xb, t )
wo ich- -b und ich+b sind die Knoten ich am nächsten an der Schnittstelle in der Region 1 und 2beziehungsweise; dhich- -b=floor(ib) and i+b=ceil(ib).
We discretize the equations:
T¯i−b,1+T¯i−b+Δx,12=T¯i+b−Δx,2+T¯i+b,22
−k1T¯i−b+Δx,1−T¯i−b,1Δx=−k2T¯i+b,2−T¯i+b−Δx,2Δx
and solve for the ghost nodes:
T¯i−b+Δx,1=κ−1κ+1T¯i−b,1+2κ+1T¯i+b,2
T¯i+b−Δx,2=2κκ+1T¯i−b,1−κ−1κ+1T¯i+b,2
where κ=k1/k2.
The ODEs closest to the interface node are changed to:
∂tT¯i−b=α1Δx2[T¯i−b−Δx−(2−κ−1κ+1)T¯i−b+2κ+1T¯i−b+Δx]
∂tT¯i+b=α2Δx2[2κκ+1T¯i+b−Δx−(2+κ−1κ+1)T¯i+b+T¯i+b+Δx]
which modifies the linear system to:
∂tT¯=ω⋅(A⋅T¯+b)
A=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢−311−2⋱1⋱1⋱−211−(2−γ)2κκ+12κ+1−(2+γ)11−2⋱1⋱1⋱−211−(2−δ)⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
γ=κ−1κ+1δ=1−12Nux1+12Nux
b=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢2ThNux1+12NuxT∞⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥ω=1Δx2⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢α1⋱⋱⋱α1α2⋱⋱⋱α2⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
where I have defined a new matrix ω which takes care of different values of α at different nodes.
To obtain the temperature at x=xb, we have:
Txb,1=T¯i−b,1+T¯i−b+Δx,12=κκ+1T¯i−b,1+1κ+1T¯i+b,2
Txb,2=T¯i+b−Δx,2+T¯i+b,22=κκ+1T¯i−b,1+1κ+1T¯i+b,2
which shows Txb,1=Txb,2 as imposed by the boundary condition at the interface.
Solving this system, with similar parameters as above and α1=k1=10 and α2=k2=1 yields this nice result:
The analytical solution is given by:
T1=Th+(T∞−Th)1κΓΠ1+ΠxL
T2=Th+(T∞−Th)1+ΓΠxL1+Π
Γ=Nu1+NuΠ=1ΓLxbκ1−κ
Python code:
The following Python code is used to generate the results.
import math
import numpy as np
import scipy.integrate as spi
import matplotlib.pyplot as plt
from __future__ import division, print_function
l, xb = 1, 0.5
a2, alpha = 1, 10 #alpha = a1/a2
k2, kappa = 1, 10 #kappa = k1/k2
Th, Tinf = 1, 0
Nu = 1 #= hL/k2
tp = l**2/a2
n = 100
dx = l/n
Nux = Nu/n
ib = n*xb/l-0.5
ibm = int(math.floor(ib))
ibp = int(math.ceil(ib))
A = np.zeros((n,n))
b = np.zeros((n,))
omega = np.zeros((n,n))
A[0,0], A[0,1], b[0], omega[0,0] = -3, 1, 2*Th, alpha*a2/dx**2
for i in xrange(1,ibm):
A[i,i-1], A[i,i], A[i,i+1], omega[i,i] = 1, -2, 1, alpha*a2/dx**2
A[ibm,ibm-1], A[ibm,ibm], A[ibm,ibm+1], omega[ibm,ibm] = 1, -(2-(kappa-1)/(kappa+1)), 2/(kappa+1), alpha*a2/dx**2
A[ibp,ibp-1], A[ibp,ibp], A[ibp,ibp+1], omega[ibp,ibp] = 2*kappa/(kappa+1), -(2+(kappa-1)/(kappa+1)), 1, a2/dx**2
for i in xrange(ibp+1,n-1):
A[i,i-1], A[i,i], A[i,i+1], omega[i,i] = 1, -2, 1, a2/dx**2
A[n-1,n-2], A[n-1,n-1], b[n-1], omega[n-1,n-1] = 1, -(2-(1-Nux/2)/(1+Nux/2)), Nux/(1+Nux/2)*Tinf, a2/dx**2
def diff_eq(T,t):
return np.dot(omega, np.dot(A,T) + b)
i = np.linspace(0,n-1,n)
x = l/n*(i+1/2)
t = tp*np.logspace(-4,1,6)
T0 = Tinf*np.ones((n,))
sol = spi.odeint(diff_eq, T0, t)
## boundary condition at x=0
x = np.insert(x, 0, 0)
sol = np.insert(sol, 0, Th, axis=1)
## boundary condition at x=l
x = np.insert(x, n+1, l)
Tl = (Nux/2*Tinf + sol[:,-1])/(1+Nux/2)
sol = np.insert(sol, n+1, Tl, axis=1)
gamma = Nu/(1+Nu)
pi = l/xb/gamma*kappa/(1-kappa)
ana1 = Th+(Tinf-Th)*(gamma*pi/kappa*x/l)/(1+pi)
ana2 = Th+(Tinf-Th)*(1+gamma*pi*x/l)/(1+pi)
ana = np.append(ana1[x<xb],ana2[x>=xb])
plt.plot(x, np.transpose(sol), '-',
x[::n//10], ana[::n//10], 'o')
plt.xlabel('Spatial coordinate, x')
plt.ylabel('Temperature coordinate, T')
plt.show()
Second order approximations on boundaries:
I want to quickly show that these approximations are indeed second-order accurate. To do this we take a Taylor expansion about the relevant boundary:
T(xb+12Δx,t)=T(xb,t)+∂xT(xb)⋅12Δx+12∂2xT(xb)⋅(12Δx)2+O(Δx3)
T(xb−12Δx,t)=T(xb,t)−∂xT(xb)⋅12Δx+12∂2xT(xb)⋅(12Δx)2+O(Δx3)
If we add these equations:
T(xb+12Δx,t)+T(xb−12Δx,t)=2T(xb,t)+O(Δx2)
and rearrange we get:
T(xb,t)=T(xb+12Δx,t)+T(xb−12Δx,t)2+O(Δx2)
which is our approximation for the temperature at a boundary shown to be indeed second-order in Δx.
If we subtract the two Taylor expansion:
T(xb+12Δx,t)−T(xb−12Δx,t)=∂xT(xb)Δx+O(Δx3)
and rearrange, we get:
∂xT(xb)=T(xb+12Δx,t)−T(xb−12Δx,t)Δx+O(Δx2)
which is the approximation for the temperature gradient at a boundary, again shown to be second-order accurate in Δx.