| | | | |

2.1 Malha e Espaço

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

Em revisão

2.1.1 Malha

Em revisão

Seja Ω2 um domínio limitado com fronteira Ω suave e poligonal. 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 vazio.

Classicamente as células K são escolhidas 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 é definida 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, gera uma malha uniforme no domínio Ω=[0,1]2.

Refer to caption
Figura 2.1: Esboço de uma malha triangular no domínio D=[0,1]2.
Código 8: ex_malha.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
10# pyvista.set_jupyter_backend('static')
11print(pyvista.global_theme.jupyter_backend)
12
13from dolfinx import plot
14pyvista.start_xvfb()
15tdim = domain.topology.dim
16topology, cell_types, geometry = plot.vtk_mesh(domain, tdim)
17grid = pyvista.UnstructuredGrid(topology, cell_types, geometry)
18
19plotter = pyvista.Plotter()
20plotter.add_mesh(grid, show_edges=True)
21plotter.view_xy()
22pyvista.OFF_SCREEN=True
23if not pyvista.OFF_SCREEN:
24    plotter.show()
25else:
26    figure = plotter.screenshot("malha.png")

2.1.2 Espaço de Polinômios Lineares

Em revisão

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

P1(K)={v;v=c0+c1x0+c2x1, (2.1)
(x0,x1)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=(x0(i),x1(i)) é o i-ésimo nodo (vértice) do triângulo K. Isto segue do fato de que o sistema (2.2) tem forma matricial

[1x0(0)x1(0)1x0(1)x1(1)1x0(2)x1(2)][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 nula.

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).

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

Em revisão

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

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

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.7)

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.8)

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

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(𝒙)=sen(πx0)sen(πx1). (2.9)
Refer to caption
Figura 2.2: Esboço de uma função no espaço Vh com valores nodais u(𝒙)=sen(πx0)sen(πx1).
1from mpi4py import MPI
2from dolfinx import mesh
3
4# malha
5domain = mesh.create_unit_square(MPI.COMM_WORLD, 5, 5)
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
13uh = fem.Function(V)
14
15# valor nodais
16from numpy import sin, pi
17for i,x in enumerate(domain.geometry.x):
18  uh.x.array[i] = sin(pi*x[0])*sin(pi*x[1])
19
20# gráfico
21u_topology, u_cell_types, u_geometry = plot.vtk_mesh(V)
22u_grid = pyvista.UnstructuredGrid(u_topology, u_cell_types, u_geometry)
23u_grid.point_data["u"] = uh.x.array.real
24u_grid.set_active_scalars("u")
25u_plotter = pyvista.Plotter()
26u_plotter.add_mesh(u_grid, show_edges=True)
27u_plotter.view_xy()
28if not pyvista.OFF_SCREEN:
29  u_plotter.show()
30else:
31  figure = u_plotter.screenshot("u.png")

2.1.4 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!