March 13, 2008

Linguagem de Programação no OpenFOAM II

Neste post, vamos ver como os conceitos de orientação a objetos ajudam na interpretação de propriedades físicas pelo OpenFOAM.

Interpretação da Linguagem pelo OpenFOAM
A vantagem do uso da linguagem matemática é a eficiência em expressar conceitos abstratos. Por exemplo, no escoamento de um fluido, o termo "campo de velocidade" possui um significado mesmo sem qualquer menção à natureza do escoamento ou qualquer dado específico de velocidade. O termo encapsula a idéia de movimento com direção e magnitude e a relação com outras propriedades físicas. Na matemática, pode-se representar o campo de velocidades por um único símbolo, por exemplo, u, e expressar certos conceitos usando símbolos, por exemplo, o campo de magnitude de velocidade como |u|. Assim, se torna possível expressar conceitos complexos com extrema clareza.

As equações da mecânica do contínuo são usualmente apresentadas como equações diferenciais parciais em 3 dimensões no espaço e com variação no tempo. Estas equações contêm conceitos de escalares, vetores, tensores e seus respectivos campos, e envolvem álgebra tensorial, cálculo tensorial e sistemas de unidades. A solução destas equações envolve procedimentos de discretização, representação de matrizes e implementação de algoritmos de solução de sistemas de equações lineares. A técnica de orientação a objetos usada pelo OpenFOAM permitiu criar tipos de dados muito próximos aos usados na mecânica do contínuo, e a técnica de sobrecarregamento de operadores permitiu que a simbologia matemática usual fosse aplicada para operações básicas.

As classes implementadas no OpenFOAM declaram tipos e operações associadas que fazem parte da linguagem matemática utilizada na engenharia e no meio científico. O campo de velocidades apresentado anteriormente pode ser representado no código de programação pelo símbolo U e a magnitude do campo de velocidade pode ser mag(U). A velocidade é um campo vetorial e, portanto, deve existir, em um código com orientação a objetos, uma classe vectorField. Então, o campo de velocidade pode ser visto como um objeto da classe vectorField.

A clareza no uso de objetos na programação para representar objetos físicos e entidades abstratas não deve ser subestimada. A estrutura das classes restringe o desenvolvimento do código dentro das próprias classes, tornando o código mais fácil de manipular. Novas classes podem herdar propriedades de outras classes, por exemplo, um vectorField pode ser derivado de uma classe vector e uma classe Field. C++ fornece um mecanismo chamado de classes template, de forma que a classe Field pode representar um campo qualquer, como scalar, vector e tensor. As características gerais da classe template são passadas para qualquer classe criada a partir deste template. Os templates e a herança reduzem a duplicação de código e criam hierarquias de classe que impõe uma estrutura ao código.

Assim, utilizando as classes do OpenFOAM, a sintaxe de escrita dos solvers se assemelha à solução de equações diferenciais parciais. Por exemplo, veja a equação abaixoé representada pelo código em C++
solve
(
fvm::ddt(rho,U)
+ fvm::div(phi,U)
- fvm::laplacian(mu,U)
==
- fvc::grad(p)
);
Os códigos dos solvers são seqüenciais já que representam um algoritmo de solução e suas equações, que são seqüenciais por natureza. Os usuários não necessitam de um grande conhecimento de programação orientada a objetos e C++ para escrever um solver, mas devem conhecer os princípios por trás da orientação a objetos e ter um conhecimento básico da sintaxe de C++.

O conhecimento das equações, modelos, métodos de discretização, solução e algoritmos é definitivamente muito mais importante. Com esse ponto de vista, recomendo fortemente que o leitor interessado em estudar a fundo o OpenFOAM leia o trabalho de tese do Jasak (1996) [1]. O trabalho explica em detalhes vários aspectos sobre a formulação numérica (discretização por volumes finitos, funções de interpolação, condições de contorno, etc.) e a teoria dos algoritmos implementados (acoplamento pressão-velocidade, correção dos fluxos em malhas não estruturadas, etc.) no OpenFOAM. Toda a implementação do código é baseada na teoria apresentada nesta tese. Existem mais duas fontes na literatura, Jasak et al. (2004) [2] e Weller et al. (1998) [3] contendo detalhes sobre o código e aplicações práticas do OpenFOAM.

Se estão começando a estudar CFD (métodos numéricos e algoritmos) e querem usar o OpenFOAM, leiam os trabalhos citados aqui (os links para download estão logo abaixo). Mas nada impede que vocês já comecem a usar o OpenFOAM.

Referências Bibliográficas:
[1] Jasak, H., 1996. Error analysis and estimation for the Finite volume method with applications to Fluid Flows. Tese de Doutorado, Imperial College of Science, Technology and Medicine, UK.
[2] Jasak, H., Weller, H. G., Nordin, N., 2004. In-cylinder CFD simulation using a C++ object-oriented toolkit. Paper number 2004-01-0110. SAE World Congress, Detroit.
[3] Weller, H. G., Tabor, G., Jasak, H., Fureby, C., 1998. "A tensorial approach to continuum mechanics using object-oriented techniques". Computers in Physics 12 (6), 620 - 631.

No comments:

Post a Comment