March 27, 2008

Linguagem de Programação no OpenFOAM III

Este post é o último de uma seqüência que mostra conceitos e detalhes da linguagem de programação no OpenFOAM. Agora, por fim, vamos analisar uma biblioteca (header) usada em todos os códigos dos solvers do OpenFOAM, o fvCFD.H. Na declaração (ou uso) deste último, várias outras bibliotecas são definidas e fornecem acesso a vários comandos, operadores, funções, etc. implementados nas classes e templates do OpenFOAM. Vamos ao post!

Estruturas das bibliotecas no OpenFOAM
Como já foi mencionado, com base na programação orientada a objetos, as classes e templates podem encapsular tipos e operações sobre variáveis. Os arquivos que contém as classes são chamados de bibliotecas (ou headers) com extensão *.H. As classes devem ser declaradas no início do código para que seja possível usar e acessar os comandos presentes na mesma. A principal biblioteca do OpenFOAM é a fvCFD.H, usada para acessar várias outras bibliotecas importantes para o funcionamento do código. Sendo assim, qualquer solver do OpenFOAM possui esta biblioteca declarada no início de seu código. A estrutura básica desta biblioteca está representada na figura abaixo, indicando a declaração de algumas das principais bibliotecas do pacote CFD.
A biblioteca fvMesh.H é responsável por alocar os dados necessários para a discretização do domínio por volumes finitos, incluindo informações topológicas e geométricas da malha. Além disso, fvMesh.H (classe fvMesh) mantém esses dados atualizados durante a simulação, tendo liberdade para apagar informações sobre as células (volume, área da faces, posição do centro da célula/face, etc.) e recalculá-las quando for necessário. Assim, com esta biblioteca é possível apagar ou modificar dados referentes a mudanças topológicas (refinamento de malha) ou geométricas (malhas poliédricas móveis).

O OpenFOAM usa o método dos volumes finitos para discretizar os campos geométricos nas equações simuladas e as bibliotecas fvm.H e fvc.H são responsáveis pelo processo de aproximação dos termos derivativos das variáveis tensoriais calculadas. Apesar destas bibliotecas possuírem o mesmo propósito, suas aplicações são diferentes. A biblioteca fvm.H reúne funções para realizar operações implícitas de discretização pelo método dos volumes finitos e os resultados são armazenados em uma matriz definida pela classe fvMatrix. Em outras palavras, a classe fvm discretiza os termos das equações que irão ser resolvidos na simulação e constrói um sistema de equações lineares. A biblioteca fvm.H ainda é capaz de montar a matriz utilizando termos fontes com discretização implícita ou explícita. A formulação obtida pela classe fvm está descrita na equação mostrada abaixo, para uma variável φ genérica na célula k da malha, com vizinhos i.
Já a biblioteca fvc.H agrupa funções para calcular operações explícitas de discretização dos termos presentes nas equações. Os termos discretizados por essa classe não são armazenados em uma matriz, como na biblioteca fvm.H. Neste caso, as operações realizadas com a classe fvc retornam explicitamente um campo geométrico (classe geometricField). Por exemplo, essa biblioteca é particularmente útil na solução da equação mostrada acima, já que o OpenFOAM não inclui a pressão na matriz fvMatrix, já que utiliza um método segregado de solução para o acoplamento pressão-velocidade. Além das operações de discretização, essa biblioteca possui classes para integração de um campo tensorial sobre um volume ou superfície. As opções colocadas no arquivo de configuração da simulação fvSchemes selecionam em tempo de execução as classes responsáveis pela discretização das equações.

A biblioteca linear.H possui uma classe específica para interpolação com diferenciação central dos campos alocados no centro da célula para sua superfície.

Para resolver o sistema linear proveniente da equação discretizada utiliza-se a biblioteca fvMatrices.H. Esta última possui ferramentas para montar a matriz e o solucionador de sistemas de equações lineares especificamente projetados para soluções por volumes finitos de equações escalares. O endereçamento das variáveis nas faces dos volumes é usado para montar a estrutura da matriz e a vetorização dos laços de solução. O arquivo de configuração fvSolution seleciona em tempo de execução as classes usadas para solução dos sistemas lineares.

A definição das classes (fixedValueFvPatchField e calculatedFvPatchFields) que implementam a estrutura de dados e aplicam as condições de contorno na simulação são acessadas com a declaração das bibliotecas fixedValueFvPatchFields.H e calculatedFvPatchFields.H. As classes fixedValueFvPatchField e calculatedFvPatchFields retornam os coeficientes da matriz afetados pela condição de contorno (diagonal da matriz e termo fonte) para determinado patch. Ambas classes são derivadas de fvPatchField.H, uma classe abstrata (fvPatchField<Type>) que fornece uma interface que cobre todas as possíveis classes derivadas aplicadas ao contorno. A classe fvPatchField<Type> divide-se em dois níveis de classes derivadas, onde o primeiro nível é responsável pelas condições de gradiente nulo, gradiente fixo, campo com valor fixo e condições mistas no contorno. O segundo nível cobre todas as condições de contorno especializadas com procedimentos de cálculo específicos, particulares a determinadas situações e campos.

Ainda existem outras bibliotecas definidas em fvCFD.H, porém, apesar de serem importantes, eu as considerei como auxiliares. Entre estas, pode-se citar as bibliotecas parRun.H que testa e avalia os argumentos de uma simulação em paralelo; Time.H, que monta um banco de dados para controle de tempo (instante inicial, final, passo de tempo, etc.) da simulação e define operadores de incremento de tempo; physicalConstants.H que define os valores de variáveis constantes; Ospecific.H que contém funções específicas para operações no SO Unix; e argList.H para criação, escrita e checagem da lista de argumentos (argc e argv) que são passados para o programa executável.

Em muitos casos, os arquivos *.H declarados ao longo dos códigos de solvers do OpenFOAM têm apenas a função de executar comandos e definir variáveis. Apesar dessa prática fugir da definição básica de uma biblioteca, eu chamei todos os arquivos *.H como bibliotecas (ou headers).

Para entender melhor tudo o que eu escrevi aqui, é necessário estudar mais a fundo os códigos dos solvers do OpenFOAM (e C++ também, né?). É por isso que no futuro vou mostrar um estudo de caso. A avaliação de um dos códigos mais simples implementados no OpenFOAM: o laplacianFoam (usado na solução da equação de Laplace transiente). A partir dele, é possível entender melhor o funcionamento deste pacote CFD e seus códigos.

No comments:

Post a Comment