| | | |

Método dos Elementos Finitos

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

2.1 Malha e espaço

Vamos introduzir a malha do domínio computacional 2D a partir de uma triangularização. O espaço de elementos finitos é tomado como o espaço de polinômios afins por partes construído sobre esta malha. Estudos de interpolação e projeção de funções neste espaço são, então, realizados.

2.1.1 Malha

Seja Ω2 um domínio limitado com fronteira Ω suave e poligonal111Ω é, também, chamado de domínio computacional. Uma malha (ou triangularização) 𝒦 de Ω é um conjunto de {K} células (ou elementos) K, em que Ω=K𝒦K e tal que a interseção de duas células é ou um lado, um canto ou vazia.

Uma escolha clássica é tomar as células K como triângulos. O comprimento do maior lado da célula K define o chamado tamanho local da malha hK. O tamanho global da malha é definido por h=maxK𝒦hK.

Uma malha é dita regular quando existe uma constante c0>0 tal que cK>c0 para todo K𝒦, sendo cK:=dK/hK e dK o diâmetro do circulo inscrito em K. Esta condição significa que os triângulos K da malha não podem ter ângulos muito grandes nem muito pequenos. Ao longo do texto, a menos que especificado o contrário, assumiremos trabalhar com malhas regulares.

Exemplo 2.1.1.

O seguinte Código 13, gera uma malha uniforme no domínio Ω=[0,1]2.

Refer to caption
Figura 2.1: Malha triangular no domínio computacional Ω=[0,1]2.
Código 13: ex_malha2D.py
1from mpi4py import MPI
2from dolfinx import mesh
3
4# malha triangular
5domain = mesh.create_unit_square(MPI.COMM_WORLD,
6 nx = 5, ny = 5)
7
8# gráfico da malha
9import pyvista
10pyvista.set_jupyter_backend("static")
11
12from dolfinx import plot
13tdim = domain.topology.dim
14domain.topology.create_connectivity(tdim, tdim)
15topology, cell_types, geometry = plot.vtk_mesh(domain, tdim)
16grid = pyvista.UnstructuredGrid(topology, cell_types, geometry)
17
18plotter = pyvista.Plotter()
19plotter.add_mesh(grid, show_edges=True, line_width=2)
20plotter.add_axes(interactive=True, line_width=2, color='black', x_color='red', y_color='green', z_color='blue')
21plotter.view_xy()
22plotter.show()
23figure = plotter.screenshot("fig.png", )

2.1.2 Espaço dos polinômios afins

Seja K2 um triângulo e seja P1(K) o espaço dos polinômios afins em K, i.e.

P1(K)={v;v=c0+c1x+c2y, (2.1)
(x,y)K,c0,c1,c2}.

Observamos que toda função vP1(K) é unicamente determinada por seus valores nodais

αi=v(Ni),i=0,1,2, (2.2)

onde Ni=(xi,yi) é o i-ésimo nodo (ou vértice) do triângulo K. Isto segue do fato de que o sistema (2.2) tem forma matricial

[1x0y01x1y11x2y2][c0c1c2]=[α0α1α2] (2.3)

Ainda, o valor absoluto do determinante da matriz de coeficientes é 2|K|, onde |K| denota a área de K, a qual é não nula222Consulte o E.LABEL:exer:detK.

Afim de usarmos os valores nodais como graus de liberdade (incógnitas), nós introduzimos a seguinte base nodal {λ0,λ1,λ2} com

λj(Ni)={1,i=j,0,ij,i,j=0,1,2. (2.4)

Com esta base, toda função vP1(K) pode ser escrita como

v=α0λ0+α1λ1+α2λ2, (2.5)

onde αi=v(Ni).

Interpolação

Dada uma função contínua f em um triângulo K com nodos Ni, i=0,1,2, sua interpolação linear πfP1(K) é definida por

πf=i=02f(Ni)λi. (2.6)

Logo, temos πf(Ni)=f(Ni) para todo i=0,1,2.

Afim de determinar estimativas para o erro de interpolação, precisamos da chamada derivada total de primeira ordem

Df=(|fx|2+|fy|2)1/2 (2.7)

e da derivada total de segunda ordem

D2f=(|2fx2|2+|2fxy|2+|2fy2|2)1/2. (2.8)
Proposição 2.1.1.(Erro da interpolação no espaço P1)

A interpolação πf satisfaz as seguintes estimativas

fπfL2(K) ChK2D2fL2(K), (2.9)
D(fπf)L2(K) ChKD2fL2(K). (2.10)
Demonstração.

Consulte [2]. ∎

Observação 2.1.1.(Malha regular)

A constante C na Proposição 2.1.1 depende do inverso de sen(θK) onde θK é o menor angulo de K. Desta forma, para um triângulo com θK muito pequeno, as estimativas (2.9) e (2.10) perdem sentido. Este fato indica a necessidade de se trabalhar com malhas regulares.

2.1.3 Espaço contínuo dos polinômios afins por partes

O espaço contínuo dos polinômios afins por partes na malha 𝒦 é definido por

Vh={v;vC0(Ω),v|KP1(K),K𝒦}. (2.11)

Observamos que toda função vVh é unicamente determinada por seus valores nodais {v(Nj)}j=0np1, onde np é número de nodos da malha 𝒦.

De fato, os valores nodais determinam uma única função em P1(K) para cada K𝒦 e, portanto, uma função em Vh é unicamente determinada por seus valores nos nodos. Agora, consideremos dois triângulos K1 e K2 compartilhando um lado E=K1K2. Sejam v1 e v2 os dois únicos polinômios em v1P1(K1) e v2P1(K2), respectivamente determinados pelos valores nodais em K1 e K2. Como v1 e v2 também são polinômios lineares em E e seus valores coincidem nos nodos de E, temos v1=v2 em E. Portanto, concluímos que toda função vVh é unicamente determinada por seus valores nodais.

Afim de termos os valores nodais como graus de liberdade (incógnitas), definimos a base nodal {φj}j=1npVh tal que

φj(Ni)={1,i=j0,ij,i,j=0,1,,np1. (2.12)

Notamos que cada função base φj é contínua, polinômio linear por partes e com suporte somente em um pequeno conjunto de triângulos que compartilham o nodo Nj. Além disso, toda a função vVh pode, então, ser escrita como

v=i=0np1αiφi, (2.13)

onde αi=v(Ni), i=0,1,,np, são os valores nodais de v.

Interpolação

A interpolação no espaço Vh de uma dada função f no domínio Ω é denotada por πfVh e definida por

πf=i=0np1f(Ni)φi. (2.14)
Proposição 2.1.2.(Erro de interpolação em Vh)

O interpolador πfVh satisfaz as seguintes estimativas

fπfL2(Ω)2CK𝒦hK4D2fL2(K)2, (2.15)
D(fπf)L2(Ω)2CK𝒦hK2D2fL2(K)2,. (2.16)
Demonstração.

Consulte o E.2.1.3. ∎

Exemplo 2.1.2.

No seguinte código, alocamos um espaço de elementos finitos Vh sobre uma malha regular no domínio Ω=[0,1]2. Ainda, uma função uhVh é alocada com valores nodais

u(x,y)=sen(πx)sen(πy). (2.17)
Refer to caption
Figura 2.2: Interpolação de u(x,y)=sen(πx)sen(πy) no espaço Vh.
Código 14: ex_mef2d_interp.py
1from mpi4py import MPI
2from dolfinx import mesh
3
4# malha
5domain = mesh.create_unit_square(MPI.COMM_WORLD, 16, 16)
6
7from dolfinx import fem
8
9# espaço de elementos finitos
10V = fem.functionspace(domain, ("P",1))
11
12# função do espaço V
13import numpy as np
14uh = fem.Function(V)
15uh.interpolate(lambda x: np.sin(np.pi*x[0])*np.sin(np.pi*x[1]))
16
17# gráfico da função
18import pyvista
19from dolfinx import plot
20
21topology, cell_types, geometry = plot.vtk_mesh(V)
22grid = pyvista.UnstructuredGrid(topology, cell_types, geometry)
23grid.point_data["uh"] = uh.x.array.real
24grid.set_active_scalars("uh")
25
26plotter = pyvista.Plotter()
27plotter.add_mesh(grid, show_edges=True)
28plotter.add_axes()
29plotter.view_xy()
30plotter.show()
31figure = plotter.screenshot("fig.png")

2.1.4 Exercícios

E. 2.1.1.

Mostre que o determinante da matriz de coeficientes do sistema (2.2) é 2|K|, onde |K| é a área do triângulo K.

E. 2.1.2.

Mostre que, para K triângulo de vértices N0=(0,0), N1=(1,0) e N2=(1,1), a base nodal P1(K)=span{λ0,λ1,λ2} é dada por

λ0(x,y)=1x, (2.18)
λ1(x,y)=xy, (2.19)
λ2(x,y)=y. (2.20)

Então, escreva a base nodal para um triângulo genérico K, usando uma matriz de transformação afim.

E. 2.1.3.

Prove a Proposição 2.1.2. Dica: demonstração análoga a Proposição 1.1.2.

E. 2.1.4.

Considere a função u(x,y)=sen(πx)cos(πy) definida no domínio D=[0,1]2. Calcule os erros de interpolação uπuL2(Ω) e D(uπu)L2(Ω) para diferentes refinamentos de malha. Estime a taxa de convergência do erro de interpolação.


Envie seu comentário

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
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.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Pedro H A Konzen
| | | |