Ecuacion de Difusion Con Coeficiente Variable
Click here to load reader
-
Upload
jesus-t-espinoza-sandoval -
Category
Documents
-
view
21 -
download
1
description
Transcript of Ecuacion de Difusion Con Coeficiente Variable
![Page 1: Ecuacion de Difusion Con Coeficiente Variable](https://reader037.fdocuments.mx/reader037/viewer/2022100310/563dbb6a550346aa9aacfe28/html5/thumbnails/1.jpg)
Proyecto Métodos Numéricos
Jesús Toribio Espinoza Sandoval
15 de enero de 2015
Problema
Resolver la ecuación de difusión con coe�ciente de-pendiente de la longitud, tal como se expresa en lasecuaciones 1 y 2.
∂P
∂T= D
∂2P
∂X2(1)
D = 1 + αX (2)
Sujeta a las siguientes condiciones de frontera e ini-ciales:
P (T = 0) = PoP (X = 0) = PfP (X = L) = Po
(3)
Propuesta de solución
Para la solución de la ecuación 1, se propone sim-pli�car el espacio paramétrico utilizando un conjuntode números adimensionales para su transformación.Posteriormente, se propone su solución mediante elmétodo numérico explicito y mediante el método deCrank y Nicolson
Modelo adimensional
Conjunto de transformación:
p = P−Po
Pf−Po
x = XL
t = TL/α
(4)
Ecuaciones adimensionales1:
∂p
∂t=
1
αL(1 + αLx)
∂2p
∂x2(5)
p(t = 0) = 0p(x = 0) = 1p(x = 1) = 0
(6)
1La deducción se muestra en el Apéndice A en la página 3.
Método explicito
De acuerdo a (1) la solución de la ecuación de difu-sión por el método explicito requiere aproximacionesde la segunda derivada en el espacio, y de la primeraderivada en el tiempo. La segunda derivada se repre-senta mediante una diferencia dividida �nita centrada(ecuación (8)), mientras que la derivada con respec-to al tiempo se realiza con una diferencia �nita haciaadelante ((7)).
∂p
∂t=pi,k+1 − pi,k
2∆t(7)
∂2p
∂x2=pi+1,k − 2pi,k + pi−1,k
∆x2(8)
x = xi (9)
combinando las ecuaciones 5, 7, 8, y 9 se obtiene
pi,k+1 − pi,k2∆t
=1
αL(1 + αLxi)
pi+1,k − 2pi,k + pi−1,k
∆x2
(10)Las condiciones de frontera en diferencias �nitas se
expresan como:
pi,1 = 0p1,k = 1
pimax,k = 0(11)
De (10) se despeja el termino del tiempo hacia ade-lante
pi,k+1 = 2r1
αL(1+αLxi) (pi+1,k − 2pi,k + pi−1,k)+pi,k
(12)donde r = ∆t
∆x2
La programación del método explicito es sencilla,se realizó en fortran 90 con las siguientes subrutinas:
MainEqDifExp: Es la subrutina principal, se en-carga de la ejecución de las demas subrutinas.
InputEqDifExp: Llama a un archivo donde se in-gresan los datos.
1
![Page 2: Ecuacion de Difusion Con Coeficiente Variable](https://reader037.fdocuments.mx/reader037/viewer/2022100310/563dbb6a550346aa9aacfe28/html5/thumbnails/2.jpg)
GridEqDifExp: Genera los puntos de la malla queresuelve la ecuación 12
InitialEqDifExp: Contiene la condición inicial mos-trada en 11
BoundaryEqDifExp: Contiene las condiciones defrontera mostradas en 11
SolveEqDifExp: Resuelve la ecuación de difusión.
OutEqDifExp: Genera un archivo de salida de re-sultados.
Los códigos de estas subrutinas se muestran en elApéndice B.
Método de Crank y Nicolson
La solución de la ecuación de difusión por el mé-todo de Crank y Nicolson requiere de�nir la derivadaespacial de 5 en un promedio del tiempo actual y an-terior, y a la derivada temporal en un tiempo actualy anterior, tal como se muestra a continuación:
∂2p
∂x2= λ
pi+1,k − 2pi,k + pi−1,k
∆x2
+(1− λ)pi+1,k−1 − 2pi,k−1 + pi−1,k−1
∆x2(13)
∂p
∂t=pi,k − pi,k−1
∆t(14)
Por tanto, la ecuación 5 se puede reescribir como:
pi.k − pi,k−1 = 1αL (1 + αLxi)
[λr (pi+1,k − 2pi,k + pi−1,k) + (15)
(1− λ)r (pi+1,k−1 − 2pi,k−1 + pi,k−1)]
en la cual se re ordenan los términos para ingresar-los a una matriz tridiagonal.
pi−1,k
[−λr
(1αL (1 + αLxi)
)]+
pi,k[1 + 2 1
αL (1 + αLxi)]
+pi+1,k
[−λr
(1αL (1 + αLxi)
)]= (1− λ)r
(1αL (1 + αLxi)
)(pi+1,k−1 − 2pi,k−1 + pi,k−1)
(16)
Esta ecuación se satisface para valores de i = 2 →iMax − 1y k ≥ 2. Lo que da un total de iMax − 2ecuaciones en cada paso de tiempo k. Por lo que lasdos ecuaciones necesarias restantes son las condicio-nes de frontera, que para el presente modelo son deltipo Dirichlet.Por tanto, el modelo a programar por el método de
Crank y Nicolson es:
ai = −λr(
1
αL(1 + αLxi)
)(17)
bi = 1 + 21
αL(1 + αLxi) (18)
ci = −λr(
1
αL(1 + αLxi)
)(19)
ri =(1− λ)r
(1αL (1 + αLxi)
)(pi+1,k−1 − 2pi,k−1 + pi,k−1)
(20)
con condiciones de frontera:
p1,k = 1 (21)
b1 = 1 (22)
c1 = 0 (23)
r1 = 1 (24)
pimax,k = 0 (25)
aimax = 0 (26)
bimax = 1 (27)
rimax = 0 (28)
La programación del metodo de Crank - Nicholsones un poco más complicada que la del método expli-cito. Las subrutinas utilizadas son las mismas que lasmostradas en la página 1 pero con código diferente,el cual se muestra en el Apéndice C.
Resultados
La �gura 1 muestra los resultados obtenidos me-diante el método explicito y la �gura 2los resultadospor el método de Crank Nicholson. Se observa queambas grá�cas son muy similares, por lo que se con-cluye que los resultados obtenidos son correctos deacuerdo al modelo planteado.
100 read(5,*)IMax
50000 read(5,*)kMax0.125 read(5,*)r10 read(5,*)alfa1 read(5,*)LMax
Cuadro 1: Datos de entrada para el método explicito
2
![Page 3: Ecuacion de Difusion Con Coeficiente Variable](https://reader037.fdocuments.mx/reader037/viewer/2022100310/563dbb6a550346aa9aacfe28/html5/thumbnails/3.jpg)
Figura 1: Método Explicito
100 read(5,*)iMax
1000 read(5,*)kMax1 read(5,*)ZMax0.5 read(5,*)lammda10 read(5,*)alfa1 read(5,*)LMax
Cuadro 2: Datos de entrada para el método implicito
Figura 2: Método de Crank Nicholson
Referencias
[1] Chapra, Steven C; Canale Raymond P. 2006. Nu-merical Methods for Engineers, Fith Edition.
Apéndice A Deducción de mode-
lo adimensional de la ecuación de
difusión
Partiendo de la regla de la cadena, se tiene que:
∂P
∂T=∂P
∂p
∂p
∂t
∂t
∂T(29)
∂P
∂X=∂P
∂p
∂p
∂x
∂x
∂X(30)
∂2P
∂2X=
∂
∂X
(∂P
∂X
)(31)
donde, a partir de 4 en la página 1
∂P
∂p= (Pf − Po)
∂t
∂T=α
L
∂x
∂X=
1
Lpor tanto
∂P
∂T= (Pf − Po)
α
L
∂p
∂t(32)
∂P
∂X= (Pf − Po)
1
L
∂p
∂x(33)
∂2P
∂2X=
∂
∂(Lx)
((Pf − Po)
1
L
∂p
∂x
)∂2P
∂2X=
(Pf − Po)L2
∂2p
∂x2(34)
Combinando las ecuaciones 32, 33 y 34, se obtienela ecuación de difusión en su forma adimensional, quese muestra en 5.
Apéndice B Códigos del método
explicito
Código principal
program MainEqDifExp
use VarEqDifExp
implicit none
call InputEqDifExp
call GridEqDifExp
call InitialEqDifExp
call BoundaryEqDifExp
call SolveEqDifExp
call OutEqDifExp
end program MainEqDifExp
3
![Page 4: Ecuacion de Difusion Con Coeficiente Variable](https://reader037.fdocuments.mx/reader037/viewer/2022100310/563dbb6a550346aa9aacfe28/html5/thumbnails/4.jpg)
Código de variables
module VarEqDifExp
implicit none
integer(kind=4)::i,iMax,k,kMax,status
real(kind=8)::alfa,L,r,dx,dt
real(kind=8), &
allocatable:: p(:,:),x(:),t(:)
end module VarEqDifExp
Código de entrada de datos
subroutine InputEqDifExp
use VarEqDifExp
implicit none
open(unit=5, file='InputEqDifExp.dat')
read(5,*)IMax
read(5,*)kMax
read(5,*)r
read(5,*)alfa
read(5,*)L
close(unit=5)
end subroutine InputEqDifExp
Código de generación de malla
subroutine GridEqDifExp
use VarEqDifExp
implicit none
allocate (x(iMax),t(kMax),p(iMax,kMax),&
stat=status)
if (status /= 0) then
write(*,*) 'Error opening &
RAM memory'
stop
end if
do i=1,iMax
x(i) = (i-1.d0)/(iMax-1.d0)
end do
dx = x(2)
dt = r*dx**2
do k=1,kMax
t(k) = (k-1.d0)*dt
end do
!r = dt/dx**2
write(*,*) 'r = ',r
write(*,*) 'tMax = ',t(kmax)
end subroutine GridEqDifExp
Código de condiciones iniciales
subroutine InitialEqDifExp
use VarEqDifExp
implicit none
do i=1, iMax
p(i,1) = 0.d0
end do
end subroutine InitialEqDifExp
Código de condiciones de frontera
subroutine BoundaryEqDifExp
use VarEqDifExp
implicit none
do k=2, kMax
p(1 ,k) = 1.d0
p(iMax,k) = 0.d0
end do
end subroutine BoundaryEqDifExp
Código de solución de la ecuación de di-
fusión
subroutine SolveEqDifExp
use VarEqDifExp
implicit none
do k=2, kMax-1
do i=2, iMax-1
p(i,k+1) = r*(1/(alfa*L))&
*(1 + alfa*L*x(i))*&
(p(i+1,k)- 2*p(i,k)&
+ p(i-1,k)) + p(i,k)
end do
end do
end subroutine SolveEqDifExp
Código de salida de datos
subroutine OutEqDifExp
use VarEqDifExp
implicit none
open(unit=5, file='Diffusion.plt')
write(5,*)'TITLE = "Diffusion"&
' write(5,*)'VARIABLES = "x" &
' write(5,*)'"y"' write(5,*)'&
"Sat"' write(5,*)'ZONE T= "Unica"&
' write(5,*)'I=', kMax, 'J=',iMax,'K=1,&
F=POINT' !head del archivo de salida
do i=1, iMax
do k=1, kMax &
4
![Page 5: Ecuacion de Difusion Con Coeficiente Variable](https://reader037.fdocuments.mx/reader037/viewer/2022100310/563dbb6a550346aa9aacfe28/html5/thumbnails/5.jpg)
write(5,102)x(i),t(k),p(i,k)
end do
end do 102
format(6e22.14)
close(unit=5)
end subroutine OutEqDifExp
Apéndice C Códigos del Método
de Crank Nicholson
Código principal
program mainEDI
use VarEDI
use VarTridiag
implicit none
call InputEDI
call GridEDI
call InitialEDI
allocate( At(iMax),Bt(iMax),&
Ct(iMax),Rt(iMax), &
Ut(iMax), GAM(iMax), stat=status)
do k=2,kMax
call SolveEDI
end do
deallocate( At, Bt, Ct, Rt, Ut, GAM)
call OutputEDI
end program mainEDI
Código de variables de programa prin-
cipal
module VarEDI
implicit none
integer(kind=4):: i,iMax,&
k,kMax,status
real(kind=8):: alfa, LMax
real(kind=8):: r,lammda,dx,dt,tMax
real(kind=8), allocatable :: u(:,:)&
,t(:),x(:)
end module VarEDI
Código de variables para resolver ma-
triz tridiagonal
module VarTridiag
integer(kind=4)::Nt, Jt
real(kind=8), allocatable ::&
At(:), Bt(:), Ct(:), Rt(:),&
Ut(:), GAM(:)
real(kind=8) :: BET
end module VarTridiag
Código de entrada de datos
subroutine InputEDI
use VarEDI
implicit none
open(unit=5,file='InputEDI.dat')
read(5,*)iMax
read(5,*)kMax
read(5,*)tMax
read(5,*)lammda
read(5,*)alfa
read(5,*)LMax
close(unit=5)
end subroutine InputEDI
Código de generación de malla
subroutine GridEDI
use VarEDI
implicit none
allocate (x(iMax), t(kMax),&
u(iMax,kMax), stat = status )
if(status /= 0) then
write(*,*)'Error opening RAM memory'
stop
end if
do i=1,iMax
x(i) = (i-1.d0)/(iMax-1.d0)
end do
do k=1,kMax
t(k) = tMax*(k-1.d0)/(kMax-1.d0)
end do
dx = x(2)
dt = t(2)
r = dt/dx**2
write(*,*)'r =',r
end subroutine GridEDI
Código de condiciones iniciales
subroutine InitialEDI
use VarEDI
implicit none
do i=1,iMax
u(i,1) = 0.d0
end do
end subroutine InitialEDI
Código para solución de matriz tridia-
gonal
subroutine tridiag
use VarTridiag
implicit none
if (bt(1) == 0.d0)&
5
![Page 6: Ecuacion de Difusion Con Coeficiente Variable](https://reader037.fdocuments.mx/reader037/viewer/2022100310/563dbb6a550346aa9aacfe28/html5/thumbnails/6.jpg)
pause 'tridiag : &
reescribe las ecuaciones' bet=bt(1)
ut(1)=rt(1)/bet
do jt=2,Nt
gam(jt)=ct(Jt-1)/bet
bet=bt(jt)-at(jt)*gam(jt)
if (bet == 0.d0)&
pause 'Error en tridiag'
ut(jt)=(rt(jt)-at(jt)*ut(jt-1))/bet
end do
do jt=Nt-1,1,-1
ut(jt)=ut(jt)-gam(jt+1)*ut(jt+1)
end do
end subroutine tridiag
Código para solución de ecuación de di-
fusión
subroutine SolveEDI
use VarEDI
use VarTridiag
implicit none
bt(1) = 1.d0
ct(1) = 0.d0
rt(1) = 1.d0
do i=2,iMax-1
at(i) = -lammda*r*&
(1/(alfa*Lmax)*(1+alfa*LMax*x(i)))
bt(i) = (1.d0 + 2*lammda*r*&
(1/(alfa*Lmax)*(1+alfa*LMax*x(i))))
ct(i) = -lammda*r*(1/(alfa*Lmax)*&
(1+alfa*LMax*x(i)))
rt(i) = (1.d0-lammda)*r*(1/(alfa*Lmax)*&
(1+alfa*LMax*x(i)))*(u(i+1,k-1) - 2*u(i,k-1)&
+ u(i-1,k-1)) + u(i,k-1)
end do
at(iMax) = 0.d0
bt(iMax) = 1.d0
rt(iMax) = 0.d0
Nt = iMax
call tridiag
do i=1,iMax
u(i,k) = Ut(i)
end do
end subroutine SolveEDI
Código de salida de datos
subroutine OutputEDI
use VarEDI
implicit none
open(unit=5, file='Diffusion.plt')
write(5,*)'TITLE = "Diffusion" '
write(5,*)'VARIABLES = "x"'
write(5,*)'"y"'
write(5,*)'"U"'
write(5,*)'ZONE T= "unica"'
write(5,*)'I=',kMax,' J=',iMax,' K=1,F=POINT'
do i=1,iMax
do k=1,kMax
write(5,102)x(i),t(k),u(i,k)
end do
end do
102 format(6e22.14)
close(unit=5)
end subroutine OutputEDI
6