Volúmenes Finitos y la ecuación de transporte

Métodos Numéricos Avanzados. 2023-2024

David Gómez-Castro

Universidad Complutense de Madrid

Volúmenes Finitos

Ecuación de continuidad

Trabajamos en dimensión \(d = 1\) y estudiamos leyes de conservación de la forma \[\begin{equation} \tag{C} \label{eq:conservacion} \frac{\partial}{\partial t} \rho = - \diver \flux \end{equation}\]

integrando en \([x_{i-\frac 1 2}, x_{i+\frac 1 2}]\) tomamos la semi-discretización espacial \[\begin{equation} \frac{\diff}{\diff t} \rho_i (t) = - \frac{ \flux_{i+\frac 1 2} (t) - \flux_{i-\frac 1 2} (t) }{x_{i+\frac 1 2} - x_{i-\frac 1 2}}, \qquad i = 1, \cdots, N. \end{equation}\]

En nuestro tipo de leyes de conservación, será frecuente que estudiemos EDPs cuyas soluciones exactas sean positivas: \(\rho \ge 0\).

Muchos de los razonamientos se pueden generalizar al caso de cambio de signo.

Conservación

Estos métodos son naturales para leyes de conservación porque \[\begin{align*} \frac{\diff}{\diff t} \sum_{i=1}^N \Big(x_{i+\frac 1 2} - x_{i-\frac 1 2}\Big)\rho_i (t) &= - \left( \flux_{\frac 3 2} (t) - \flux_{\frac 1 2} (t) \right) - \left( \flux_{\frac 5 2} (t) - \flux_{\frac 3 2} (t) \right) - \cdots - \left( \flux_{N-\frac 1 2} (t) - \flux_{N + \frac 1 2} (t) \right) \\ &= - F_{N+\frac 1 2} (t) + F_{\frac 1 2} (t) \end{align*}\]

Conservación de masa es equivalente a que \[ F_{N+\frac 1 2} (t) = F_{\frac 1 2} (t) \]

En algunas ocasiones se toman ambos flujos igual a 0 para que el problema esté bien determinado.

En otras ocasiones tomaremos condiciones periódicas en \(\rho\), es decir \[ \rho_0 = \rho_N, \qquad \rho_1 = \rho_{N+1}. \]

Ecuación de Transporte

Ecuación de transporte

El caso más sencillo es \(\flux(t,x) = a \rho (t,x) \ge 0\) con \(a\) constante

\[\frac{\partial \rho}{\partial t} + a\frac{\partial \rho}{\partial x} = 0\]

Soluciones exactas

Suelen llamarse características a curvas \((t,X(t))\) tales que la EDP se puede resolver aisladamente a lo largo de curva.

En este caso, buscamos curvas \(X(t)\) tales que \(\rho(t, X(t)) = \rho_0 (y)\), donde \(a(0) = 1\). \[ \partial_t \rho + \frac{\partial \rho}{\partial x} \frac{\diff X}{\diff t} = 0. \]

Luego \(\frac{\diff X}{\diff t}(t) = a\). Y \(X(t,y) = y + at\).

Finalmente resolviendo \(x = y + at\) tenemos \[ \rho(t,x) = \rho_0 (x - a t). \] Es decir, solución en el punto \((t,x)\) depende sólo del valor inicial en \((0,x - at)\).

Restricción a un intervalo cerrado

Si queremos trabajar un intervalo acotado, digamos \((0,1)\), no puede admitir condiciones de flujo nulo.

Puede, sin embargo, admitir condiciones de periódicas. Por ejemplo, para \(t \in (0,1)\) y \(a > 0\) \[ \rho(t,0) = \rho(t,1) = \rho_0(1 - at). \]

Imponer condiciones de flujo periódico consiste en decir \[ a \rho(t,1) = F(t,1) = F(t,0) = a \rho(t,0). \]

Desde el punto de vista exacto, es de nuevo imponer condiciones de periódicas en \(\rho\).

Discretización temporal

Hemos de elegir un método de discretizar \(\frac{\diff \rho_i}{\diff t}\).

Probaremos el método de Euler \[ \frac{\rho_i^{n+1} - \rho_i^n}{\Delta t} = - \frac{ F_{i+\frac 1 2}^{n+1} - F_{i - \frac 1 2}^{n+1} }{\Delta x} \]

Para que sea explícito \(F_{i+\frac 1 2}^{n+1} = G_{i+\frac 1 2} ( \rho_i^n, \rho_{i+1}^n )\).

Es decir \(F_{i+\frac 1 2}^{n+1} = a\rho_i^n , a\rho_{i+1}^n\) u otro valor.

Experimentación numérica

Hagamos unos experimentos para ver qué elección de \(\rho_i\) funciona mejor.

using Plots

N  = 64
T  = 1
x  = range(-1.0,1.0,N+1); x = vec(x[1:end-1])
Δx = x[2] - x[1] 
ρ0 = min.(1,max.(-4*abs.(x).+2,0));
a  = 1;

\(F_{i+\frac 1 2}^{n+1} = a\rho_i^n\)

Tenemos el método \[ \rho^{n+1}_i = \rho^n_i - a\frac{\Delta t}{\Delta x} ( \rho_{i}^n - \rho_{i-1}^n ) \]

ρ = copy0); Δt = Δx/2
@gif for n=1:ceil(T/Δt)
    ρn = copy(ρ)
    
    ρ[1] = ρn[1] - Δt/Δx * a * (ρn[1] - ρn[end])
    for i = 2:length(ρ)
        ρ[i] = ρn[i] - a * Δt/Δx * ( ρn[i] - ρn[i-1] )
    end
    
    plot(x,ρ,
        ylim=(0.0,1.2),
        title="t=$(round(n*Δt,digits=3))",
        linewidth=2,thickness_scaling = 1.5,label="") 
end

Ejercicio. \(F_{i+\frac 1 2}^{n+1} = a\rho_{i+1}^n\)

\[\rho^{n+1}_i = \rho^n_i - a\frac{\Delta t}{\Delta x} ( \rho_{i+1}^n - \rho_{i}^n )\]

Code
ρ = copy0); Δt = Δx/2
@gif for n=1:ceil(T/Δt)
    ρn = copy(ρ)
    
    ρ[1:end-1] = ρn[1:end-1] - Δt/Δx * a * ( ρn[2:end] - ρn[1:end-1] )
    ρ[end] = ρn[end] - a * Δt/Δx * ( ρn[1] - ρn[end] )
    
    plot(x,ρ,
        ylim=(0.0,1.2),
        title="t=$(round(n*Δt,digits=3))",
        linewidth=2,thickness_scaling = 1.5,label="") 
end

Up-winding. Euler explícito

Tomamos el método \[ \rho^{n+1}_i = \rho^n_i - a\frac{\Delta t}{\Delta x} ( \rho_{i}^n - \rho_{i-1}^n ) %= (1- a\frac{\Delta t}{\Delta x}) \rho_i^n + a\frac{\Delta t}{\Delta x} \rho_{i-1}^n. \]

Tomemos \(\rho^0 = (0,1,0,0,\cdots)\). Entonces \(\rho^1 = ( 0,1- a\frac{\Delta t}{\Delta x} , a\frac{\Delta t}{\Delta x} , 0, \cdots )\).

Así \(\rho^1 \ge 0\) si y sólo si \[ 0 \le a\frac{\Delta t}{\Delta x} \le 1. \]

La primera desigualdad dice que este método sólo funciona si \(a \ge 0\). Esto se llama up-winding

La segunda desigualdad dice que \(\Delta t\) debe ser “pequeño” \[ \Delta t \le \frac 1 a \Delta x. \]

Ejercicios

Ejercicio. Comprobar que esta condición es suficiente para si \(\rho_i^0 \ge 0\) para todo \(i\), entonces \(\rho_i^1 \ge 0\) para todo \(i\).

Ejercicio. Comprobar que para \(\rho^{n+1}_i = \rho^n_i - a\frac{\Delta t}{\Delta x} ( \rho_{i}^n - \rho_{i-1}^n )\)

la condición es \(0 \le -a\frac{\Delta t}{\Delta x} \le 1\).

Up-winding. Semi-discretización espacial

Tomemos \(a > 0\). Observamos que \[ \begin{aligned} \frac{d \rho_i}{dt} (t) &= \frac{a}{\Delta x} \rho_{i} (t) \,\, \underbrace{- \frac{a}{\Delta x} \rho_{i+1}(t) }_{negativo} \end{aligned} \]

La solución es \[ \rho_i(t) = e^{\frac{a}{\Delta x}t} \rho_i(0) - \frac{a}{\Delta x} \int_0^t e^{\frac{a}{\Delta x}(t-s)} \rho_{i+1} (s) d s\]

Podría cambiar de signo.

Up-winding. Semi-discretización espacial

Sin embargo \[\begin{aligned} \frac{d \rho_i}{dt} (t) = - \frac{a}{\Delta x} \rho_{i} (t) \,\, \underbrace{+ \frac{a}{\Delta x} \rho_{i-1}(t) }_{positivo} \end{aligned} \]

La solución es \[ \rho_i(t) = e^{-\frac{a}{\Delta x}t} \rho_i(0) + \frac{a}{\Delta x} \int_0^t e^{-\frac{a}{\Delta x}(t-s)} \rho_{i-1} (s) d s \]

Si \(\rho_i (0) \ge 0\) para todo \(i\). Entonces \(\rho_i \ge 0\).

Esta elección de flujo se conoce como up-winding.

Condición Courant–Friedrichs–Lewy

Tomamos \(a>0\) y el método con up-winding. Se cumple el siguiente mantra:

      Un método numérico sólo puede ser convergente si el dominio de dependencia numérico contiene al dominio de dependencia la EDP, al menos cuando \(\Delta t\) y \(\Delta x\) tienden a \(0\).

Code
using Plots, Kronecker, LaTeXStrings

a = 0.9; T = 1; 
@gif for log2Δt=-3:1:0 , log2Δx=-3:1:1    
    Δt=2.0^log2Δt; Δx=2.0^log2Δx

    if Δt <= Δx/a
        inequality = "\\leq"
        color = :green
    else
        inequality = ">"
        color = :red
    end

    plot(ylim=(-.1,1.1), xlim=(-2.0,2.0),
        aspect_ratio=:equal,
        xlabel=L"x", ylabel=L"t", legend=:outerbottom, 
        title=latexstring("\\Delta t=$Δt " * inequality * " \\Delta x / a, \\Delta x = $(Δx), a = $a"),
        titlefontcolor=color)

    plot!([0.0,-a],[1.0,0.0],label="Característica",color=:blue,
        linewidth=3.0)

    for i in -(2/Δx):(2/Δx), j in 0:(T/Δt)
      scatter!([i*Δx], [j*Δt],  color=:white , label="")
    end
    
    for i in 0:(T/Δt), j in 0:(T/Δt-i)
      scatter!([-j*Δx], [i*Δt],  color=:red , label="")
    end
    scatter!([0], [1.0],  color=:red , label="Dependencia del método numérico")

end fps=0.5

Queremos que \(0 \le a \frac{\Delta t}{\Delta x} \le 1\) para que todo funcione bien.

Simulación que cumple CFL

Δt = .75*Δx
ρ = copy0); 

@gif for n=1:ceil(T/Δt)
    ρn = copy(ρ)
    
    ρ[1]     = ρn[1]     - a * Δt/Δx * ( ρn[1]   - ρn[end] )
    ρ[2:end] = ρn[2:end] - a * Δt/Δx * ( ρn[2:end] - ρn[1:end-1] )
    
    plot(x,ρ,
        ylim=(0.0,1.2),
        title="t=$(round(n*Δt,digits=3))",
        linewidth=2,thickness_scaling = 1.5,label="") 
end