| | | | |

1.5 Aplicação: EDP Evolutiva

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

Em revisão

Como exemplo de aplicação do método de elementos finitos (MEF) na solução de equações diferenciais parciais evolutivas no tempo, consideramos a equação do calor com dadas condição inicial e condições de contorno de Dirichlet homogêneas

ut=αuxx+f,(t,x)(0,tf]×(a,b), (1.165a)
u(0,x)=u0(x),x[a,b], (1.165b)
u(t,a)=u(t,b)=0,t[0,tf], (1.165c)

onde f=f(t,x) denota uma dada fonte.

1.5.1 Discretização do Tempo

Consideramos os nt+1 tempos discretos t(k)=kht, passo no tempo ht=tf/nt, k=0,1,2,,nt. Seguindo esquema θ denotando u(k)u(t(k),x) e f(k)=f(t(k),x), o problema (1.5) pode ser aproximado pela iteração

u(k+1)u(k)ht=θ(αuxx(k+1)+f(k+1))
(1θ)(αuxx(k)+f(k)), (1.166a)
u(k+1)(a)=u(k+1)(b)=0, (1.166b)

onde u(0)=u0.

Observação 1.5.1.

(Esquema θ.) O esquema θ e um forma robusta de escrever diferentes esquemas de discretização em uma única expressão:

  • θ=0.: Euler explícito.

  • θ=1.: Euler implícito.

  • θ=0.5: Crank-Nicolson.

Por simplificação da notação, vamos suprimir o super-índice k, denotando u(k+1):=u, u(k)=u0 e similar para f(k). Com isso e rearranjando os termos, cada iteração (1.5.1) se resume ao seguinte problema de valores de contorno

αθuxx+1htu=1htu0+(1θ)αuxx0
+(1θ)f0+θf, (1.167a)
u(a)=u(b)=0. (1.167b)

1.5.2 Formulação de Elementos Finitos

A formulação fraca do problema (1.5.1) consiste em: encontrar uV:=H01(a,b) tal que

a(u,v)=L(v),vV, (1.168)

onde

a(u,v):=abθαuv𝑑x+ab1htuv𝑑x, (1.169)
L(v):=(1θ)abαu0v𝑑x+ab1htu0v𝑑x
θabfv𝑑x+(1θ)abf0v𝑑x (1.170)

Então, assumindo uma malha com nx células Ii=[xi,xi+1] de tamanho hx=(ba)/nx e nodos xi=a+(i1)hx, i=0,1,2,,nx, escolhemos o espaço de elementos finitos

Vh,0:={vC0([a,b]):v|IiP1(Ii),i=0,1,,nx,v(a)=v(b)=0}. (1.171)

Com isso, a formulação de elementos finitos do problema (1.5.1) consiste em: encontrar uhVh,0 tal que

a(uh,vh)=L(vh),vhVh,0. (1.172)
Exemplo 1.5.1.

Consideramos o seguinte problema de calor

ut=uxx+(π21)etsen(πx),(t,x)(0,1]×(0,1), (1.173a)
u(0,x)=sen(πx),x[0,1], (1.173b)
u(t,0)=u(t,1)=0. (1.173c)
1from mpi4py import MPI
2import ufl
3from dolfinx import mesh
4from dolfinx import fem
5from dolfinx import default_scalar_type
6from dolfinx.fem.petsc import LinearProblem
7
8# parâmetros
9tf = 1.
10alpha = 1.
11
12# esquema theta
13theta = 0.5
14
15# discretização no tempo
16nt = 10
17ht = tf/nt
18
19# malha
20domain = mesh.create_unit_interval(MPI.COMM_WORLD,
21                                    nx = 5)
22x = ufl.SpatialCoordinate(domain)
23
24# espaço
25V = fem.functionspace(domain, ('P', 1))
26
27# fonte
28f = fem.Function(V)
29def f(t,x):
30    return (ufl.pi**2-1.)*ufl.exp(-t)*ufl.sin(ufl.pi*x[0])
31
32# condição de contorno
33import numpy as np
34uD = fem.Function(V)
35uD.interpolate(lambda x: np.full(x.shape[1], 0.))
36
37def boundary_D(x):
38    return np.logical_or(np.isclose(x[0], 0.),
39                          np.isclose(x[0], 1.))
40
41dofs_D = fem.locate_dofs_geometrical(V, boundary_D)
42bc = fem.dirichletbc(uD, dofs_D)
43
44# mef fun.s
45u = ufl.TrialFunction(V)
46v = ufl.TestFunction(V)
47
48# condição inicial
49t = 0.
50u0 = fem.Function(V)
51u0.interpolate(lambda x: np.sin(np.pi*x[0]))
52
53# fonte
54def f(t, x):
55    return (ufl.pi**2-1.)*ufl.exp(-t)*ufl.sin(ufl.pi*x[0])
56
57# visualização (paraview)
58from dolfinx import io
59from pathlib import Path
60results_folder = Path("results")
61results_folder.mkdir(exist_ok=True, parents=True)
62
63# iteração no tempo
64for k in range(nt):
65    t += ht
66
67    # forma bilinear
68    a = theta * ufl.dot(ufl.grad(u), ufl.grad(v)) * ufl.dx
69    a += u * v / ht * ufl.dx
70
71    # forma linear
72    L = (theta-1.) * ufl.dot(ufl.grad(u0), ufl.grad(v)) * ufl.dx
73    L += u0 * v / ht * ufl.dx
74    L += theta * f(t, x) * v * ufl.dx
75    L += (1.-theta) * f(t-ht, x) * v * ufl.dx
76
77    problem = LinearProblem(a, L, bcs=[bc])
78    uh = problem.solve()
79
80    # armazena para visualização (paraview)
81    filename = results_folder / f"u_{k:0>6}"
82    with io.XDMFFile(domain.comm, filename.with_suffix(".xdmf"), "w") as xdmf:
83        xdmf.write_mesh(domain)
84        xdmf.write_function(uh, t)
85
86    u0.x.array[:] = uh.x.array[:]

1.5.3 Exercícios

Em construção


Envie seu comentário

As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!