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.

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

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.
Comments
Post a Comment