3. Teoretisk rammeverk
3.1 Standardmodellen for arbeidstilbud
Neste trabalho, a biblioteca OpenLB foi utilizada para resolver as simulações pelo método de lattice Boltzmann. Trata-se de um código aberto em linguagem C++, utilizado
para simular fenômenos físicos de diversas naturezas. O código permite a paralelização dos processos de forma bastante eficiente, permitindo a utilização de vários núcleos de processamento para que menos tempo de simulação seja gasto (HEUVELINE; KRAUSE; LATT, 2009). O projeto teve seu início em 2006, e é coordenado pelo Dr. Mathias Krause, do Instituto de Tecnologia de Karlsruhe (KIT), na Alemanha. Hoje conta com a colaboração de desenvolvedores de outras instituições, como a Universidade Tecnológica de Munique (Alemanha), Universidade (Hochschule) de Mannheim (Alemanha), a Universidade de Tunis El Manar (Tunísia), entre outras instituições e empresas.
Os passos seguidos para a implementação do método de lattice Boltzmann no código OpenLB consistem em:
• escolha do arranjo da rede (DqQq);
• escolha das propriedades do fluido, como densidade (ρ) e viscosidade (µ); • definição do parâmetro de discretização ou espaçamento entre os nós (latticeL); • escolha dos parâmetros característicos da simulação, como comprimento (charL) e
velocidade (charU);
• conversão entre unidades físicas e de rede;
• input da geometria, voxelização e atribuição dos materiais; • definição das condições iniciais e de contorno;
• cálculo da frequência de relaxação ω, que é recomendável ser menor que 2, ou 0 < τ < 0.5 já que ω = 1
τ, para garantir estabilidade numérica no modelo LBGK,
como mencionado anteriormente;
• atualização das funções de distribuição, pela Equação 3.21;
• cálculo das grandezas de interesse, pelas Equações 3.30, 3.31 e 3.32; • output dos resultados.
As propriedades do fluido e os parâmetros de discretização são definidos pelo usuário em unidades físicas (geralmente no S.I., sistema internacional de unidades). Entretanto, o método trabalha com unidades de rede e, portanto, uma conversão deve ser realizada antes do início da simulação. Na biblioteca OpenLB, esta conversão é realizada pela classe LBconverter, que permite converter unidades métricas em unidades de rede, e vice versa. Como entrada, o usuário deve fornecer o comprimento característico (charL), que está relacionado com as dimensões da geometria, e a velocidade característica (charU), que pode ter relação com o fluxo de entrada de fluido no sistema, ambos em unidades físicas. Além disso, o parâmetro latticeL também deve ser definido pelo usuário, o qual
corresponde à distância entre os nós, em unidades físicas. A partir deste último, o parâmetro de discretização espacial adimensional (δx) é calculado como:
δx = latticeL
charL . (3.38)
Para calcular o parâmetro de discretização temporal adimensional (δt), é necessário fornecer também mais um parâmetro de entrada, chamado latticeU. Este último é proporcional ao número de Mach (adimensional entre a velocidade do escoamento e a velocidade do som no meio) e, por este motivo, latticeU é utilizado para se controlar os efeitos de compressibilidade do escoamento e é tido como entrada da simulação, ao invés de fornecer diretamente o parâmetro de discretização temporal adimensional (KRAUSE, 2016).
Após a escolha das propriedades e parâmetros da simulação, é necessário definir a geometria do problema. Isto pode ser realizado de duas formas: utilizando as funções Indicator, já implementadas no código, para construir geometrias bi ou tridimensionais a partir de formas geométricas simples, como linhas, círculos, retângulos e elipses, ou importando um arquivo em formato STL. A seguir, é necessário transformar a geometria em diversos voxels, que são os pequenos cubos cujos vértices são os nós onde as funções de distribuição são definidas. Este processo é chamado voxelização, como ilustrado na Figura 3.10. A etapa (1) mostra uma geometria em formato STL, utilizada como input na simulação. O passo (2) consiste em criar sub-domínios menores que compreendam toda a geometria importada, (3) sendo que aqueles voxels que não fazem parte da geometria são removidos. Os sub-domínios remanescentes são reduzidos em tamanho (4), e em seguida são atribuídos a funções que tem como objetivo a comunicação entre cada sub-domínio (5). Por fim, o domínio computacional é obtido (6), constituindo a estrutura superGeometry associada ao código OpenLB.
Figura 3.10 – Processo de criação da geometria e voxelização.
Fonte: Krause (2016).
identificado como BlockLattice. Um mesmo domínio pode possuir vários BlockLattice caso malhas não-uniformes sejam utilizadas, ou quando a estratégia de paralelização é utilizada, e vários sub-domínios são observados de acordo com o número de cores desejados. Este conjunto de sub-domínios é chamado SuperLattice. A Figura 3.11 ilustra estas três hierarquias de dados.
Figura 3.11 – Estrutura de dados do OpenLB.
Fonte: Krause (2016).
Após definida a geometria, cada nó deve ser identificado por um número, que corresponde a diferentes materiais. O objetivo geral é atribuir um número para cada nó, de acordo com a região (onde há fluido, as fronteiras, regiões vazias). Por exemplo, a Figura 3.12 ilustra o caso de um escoamento ao redor de um cilindro bidimensional, confinado entre duas placas planas paralelas, no qual o material 1 corresponde à região onde há fluido, o material 2 se refere à fronteira sólida, os materiais 3 e 4 correspondem à entrada e à saída de fluido no sistema, respectivamente, o material 5 corresponde à condição de contorno na fronteira (bounce back, por exmeplo)e o material 0 é equivalente ao espaço onde não há escoamento de fluido. Posteriormente, as condições de contorno são atribuídas a cada número.
Figura 3.12 – Números correspondentes aos diferentes materiais para o caso de um cilindro bidimensional entre placas planas.
0 0 0 0 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Fonte: Krause (2016).
A atualização das funções de distribuição é realizada através das etapas de colisão e propagação (Figura 3.13). Durante o processo de colisão, a magnitude da função fi
é alterada, e durante a etapa de propagação as distribuições fi se movem para os nós
vizinhos, de acordo com as direções das velocidades discretas ci. A Equação 3.21 pode
ser dividida nestas duas etapas, para fins de implementação:
˜ fi(x,t) = − 1 τ(fi− f eq i ), (3.39) fi(x + c∆t, t + ∆t) = f˜i(x,t), (3.40)
em que ˜fi é um valor intermediário. A Equação 3.39 representa a etapa de colisão,
que é um processo local, e acontece em cada nó do domínio computacional. Este passo consiste basicamente no cálculo das grandezas macroscópicas densidade ρ e velocidade macroscópica v, para que seja possível encontrar as funções de distribuição no equilíbrio, e então os valores intermediários pós-colisão ˜fi. A Equação 3.40 se refere à etapa de
propagação, que não é local, e depende dos nós vizinhos. Neste processo, as funções de distribuição intermediárias ˜fi são propagadas aos nós vizinhos.
Figura 3.13 – Etapas de colisão e propagação.
Fonte: Acervo pessoal.
O algoritmo básico para cálculos envolvendo o método de lattice Boltzmann pode ser resumido da seguinte forma:
Algoritmo 1: esquema LBM
Entrada dos parâmetros da simulação e conversão entre unidades físicas e de rede Definição da geometria (arquivos STL ou Indicators)
Definição da distribuição inicial de equilíbrio Definição das condições de contorno
for t < tmáx do
Etapa de colisão; Etapa de propagação; Pós-processamento; end