• Nenhum resultado encontrado

Sumário

CAPÍTULO 3 PACOTE CFD OPENFOAM

3.3 OpenFOAM a nível de usuário desenvolvedor

Como já mencionado, uma das grandes vantagens em usar softwares com códigos abertos é a possibilidade do usuário alterar e criar novas rotinas. No entanto, o usuário desenvolvedor deve possuir conhecimentos prévios para conseguir realizar esta tarefa. No caso do OpenFOAM, os desenvolvedores necessitam ter um conhecimento em linguagem C++ e um conhecimento dos operadores, classes e funções já existentes no software. Além desses conhecimentos é indispensável um conhecimento em CFD.

As principais fontes sobre programação no OpenFOAM são seus manuais (User's Guide e Programmer's Guide) assim como a documentação disponível no site

http://www.openfoam.org/docs/cpp/ (OpenFOAM C++ Documentation). Também existem vários fóruns e comunidades que podem auxiliar muito na aprendizagem, além de cursos oferecidos pela OpenCFD e algumas instituições.

É altamente recomendado para o usuário desenvolvedor ler a tese de Jasak (JASAK, 1996) que apresenta detalhadamente vários aspectos sobre a formulação numérica, incluindo a metodologia de discretização, condições de contorno, etc., e a teoria de algoritmos implementados no OpenFOAM.

3.3.1 Orientação a objetos e C++

Uma das principais funções da Programação Orientada a Objeto (POO) é a possibilidade de desenvolvimento de códigos que podem ser reaproveitados. Na abordagem orientada a objetos, os dados são tratados como elementos críticos do programa e não é permitido alterá-los livremente. Os dados são associados a funções que acessam e operam, protegendo-os de modificações ocasionadas por funções externas. A orientação a objetos permite a decomposição do problema em entidades chamados objetos, a qual somente funções previamente criadas podem operar sobre esses objetos (YANG, 2001).

Para o entendimento da linguagem orientada a objetos, o desenvolvedor deve ter em mente os conceitos de objetos, classes, abstração de dados, encapsulamento, herança, e polimorfismo. Estes conceitos são considerados entidades básicas de um sistema orientado a objeto. Detalhes sobre esses conceitos podem ser encontrados em qualquer livro de

programação orientada a objetos. Uma boa referência para C++ com POO é o trabalho de YANG, 2001. A linguagem C++ foi desenvolvida por Bjarne Stroustrup em 1980, sendo chamada nesta época como C com classes. Atualmente ela é uma das principais linguagens de programação demonstrando-se ser altamente versátil e amplamente utilizada por uma grande parte de empresas desenvolvedoras de softwares (STROUSTRUP, 2000).

A seguir é descrito algumas vantagens da programação orientada a objetos em relação às abordagens convencionais:

 Fornecer uma estrutura modular para programas, facilitando a definição de tipos de dados abstratos onde detalhes de implementação estão ocultos e a unidade possui uma interface claramente definida;

 Tornar mais fácil a manutenção e a modificação de códigos, assim novos objetos podem ser criados a partir dos já existentes;

 Fornecer uma boa estrutura para bibliotecas de códigos onde os componentes de um software podem ser facilmente adaptados e modificados pelo programador.

Contudo, o desenvolvimento de aplicativos utilizando a linguagem C++ proporciona uma perda de 10% na velocidade de processamento em relação à linguagem C, devido principalmente as propriedades inerentes à orientação a objetos. Esta perda na eficiência pode variar dependendo da conscientização do programador. Alguns trabalhos (MALAN; LEWIS, 2004) foram realizados de forma a avaliar a aplicabilidade de códigos escritos em C++ na construção de algoritmos eficazes em cálculos de problemas CFD, aplicando algoritmos que reduzem o tráfego de dados e balanceando o polimorfismo do código com a eficiência computacional.

3.3.2 Desenvolvendo códigos no OpenFOAM

Uma das grandes vantagens 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 ideia de movimento com direção e magnitude juntamente com outras propriedades físicas. Matematicamente podemos 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 . Utilizar essa notação matemática possibilita expressar conceitos complexos com extrema clareza.

Com isso em mente os desenvolvedores do OpenFOAM buscaram utilizar as ferramentas disponíveis na linguagem C++ e técnicas de sobrecarregamento de operadores para criar uma simbologia matemática usual em seus códigos permitindo que fossem executadas operações sobre elas. Desta forma, foi possível utilizar uma sintaxe parecida com a notação matemática usual para representar as equações da mecânica do contínuo. As equações diferenciais parciais e os conceitos de escalares, vetores, tensores e seus respectivos campos, assim como a álgebra tensorial e sistemas de unidades podem ser invocados pelo OpenFOAM, facilitando em muito a implementação de novos solvers e também tornando muito mais ágil o desenvolvimento e a interpretação dos códigos pelo usuário.

As classes implementadas no OpenFOAM declaram tipos e operações 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 do OpenFOAM através do símbolo U e a magnitude desse campo de velocidades é representado por mag(U). Como já sabemos a velocidade é um campo vetorial e deve existir um código orientado a objetos com uma classe denominada vectorField, onde o campo de velocidade é visto como um objeto dessa classe.

A clareza no uso de objetos na programação para representar objetos físicos e entidades abstratas devem ser utilizadas com atenção. A própria estrutura das classes restringe o desenvolvimento do código dentro das próprias classes. Novas classes podem herdar propriedades de outras classes, como por exemplo, a classe vectorField que pode ser derivada de uma classe vector e/ou uma classe Field. O C++ fornece um mecanismo chamado de classes template, de forma que a classe Field<Type> pode representar um campo de qualquer <type>, como scalar, e vector tensor. Os templates juntamente com a herança reduzem a duplicação de código e criam hierarquias de classe que impõe uma estrutura ao código.

O método de discretização utilizado no OpenFOAM é dos volumes finitos e as bibliotecas responsáveis pelo processo de aproximação dos termos derivativos das variáveis tensoriais são fvm.H e fvc.H. Cada termo nas equações diferenciais parciais é representado individualmente no OpenFOAM utilizando duas classes denominadas finiteVolumeMethod (fvm.H) e finiteVolumeCalculus (fvc.H). Ambas as classes fvm.H e fvc.H contêm funções estáticas que representam os operadores diferenciais, como gradiente, divergente e

laplaciano. Apesar de ambas as bibliotecas possuírem o mesmo propósito, suas aplicações são totalmente diferentes.

A Tabela 3.1 apresenta alguns exemplos de operadores importantes em CFD e suas respectivas representações no OpenFOAM.

Tabela 3.1: Principais palavras chaves usadas no arquivo fvSchemes.

Palavra Chave Categoria do termo matemático

snGradSchemes Componente do gradiente normal a face da célula

gradSchemes Gradiente 

divSchemes Divergente  

laplacianSchemes Laplaciano 2

timeSchemes Primeira e segunda derivada temporal  te  2 2t

Uma representação da discretização do domínio da solução é mostrada na Figura 3.3. O domínio do espaço é discretizado em uma malha computacional onde as equações diferenciais parciais são subsequentemente discretizadas. A discretização no tempo, se necessária, é simples: ela é dividida em um conjunto de passos  , que podem mudar durante t uma simulação numérica, dependendo de alguma condição calculada durante o processo previamente simulado.

Figura 3.3: Discretização do domínio da solução. (Adaptado de: OpenFOAM Programmer's Guide)

Em um nível mais detalhado, a discretização no espaço requer a subdivisão do domínio em um número de células, ou volumes de controle. Essas células devem ser

contíguas, isto é, elas não devem sobrepor umas as outras e completar todo o domínio. Uma típica célula resultante da discretização do domínio é mostrada na Figura 3.4.

Figura 3.4: Parâmetros em uma discretização por volumes finitos. (Adaptado de: OpenFOAM

Programmer's Guide)

O ponto P corresponde à célula de interesse, onde as variáveis dependentes e outras propriedades são principalmente armazenadas, embora também possam ser armazenadas nas faces ou vértices. O ponto N corresponde a célula vizinha, f é a face de comunicação entre as duas células, d é o vetor de P até N e Sf é um vetor que contém a área da face.

No OpenFOAM não há limitação quanto ao número de faces que limitam cada célula e nem qualquer restrição ao alinhamento de cada face. Este tipo de malha muitas vezes é denominada como "arbitrariamente desestruturada" para diferenciá-las de malhas no qual as faces das células tem um alinhamento prescrita, tipicamente com os eixos das coordenadas.

Na figura é mostrada uma célula típica resultante da discretização do domínio no OpenFOAM através do método dos volumes finitos. Códigos com malhas arbitrariamente não estruturadas oferecem uma maior liberdade na geração e manipulação da malha, em particular, quando a geometria do domínio é complexa ou sofrem alterações ao longo do tempo.

Como já mencionado, a utilização das classes no OpenFOAM permite que a sintaxe de escrita dos solvers se assemelhem à solução de equações diferenciais parciais. Por exemplo, considere a equação abaixo:

. U U U p t         (3.1)

solve ( fvm::ddt(rho, U) + fvm::div(phi, U) - fvm::laplacian(mu,U) == - fvc::grad(p) );

Como pode ser observado, o código é simples de ser interpretado pelo usuário e sua representação se assemelha muito com a sintaxe matemática. Os códigos dos solvers são sequenciais já que representam um algoritmo de solução onde suas equações são sequenciais.

Os usuários não necessitam de um grande conhecimento de programação orientada a objetos e C++ para desenvolver um solver, mas devem conhecer bem os princípios por trás da orientação a objetos e ter um conhecimento da sintaxe de C++. O conhecimento das equações, modelos, métodos de discretização, solução e algoritmos é definitivamente mais importante.

Toda a implementação do código aplicado no OpenFOAM é baseado na teoria apresentada na tese de Jasak (JASAK, 1996). Mais dois materiais são recomendados para o apronfudamento no assunto, contendo detalhes sobre o código e aplicações práticas WELLER et al., 1998 e JASAK; WELLER; NORDIN, 2004.