March 8, 2008

Linguagem de Programação no OpenFOAM I

Uma das dificuldades inerentes aos novos desenvolvedores são referentes aos conceitos e a sintaxe básica de programação no OpenFOAM, sejam eles leigos em programação ou não. Uma boa fonte para o leitor interessado é estudar C++ pelos livros do Deitel (as edições anteriores possuem versão em português) e do Yang (ótimos exemplos aplicados a métodos numéricos). Gosto muito desse último.

Atualmente, as únicas fontes sobre programação no OpenFOAM estão em seus manuais (User's Guide e Programmer's Guide). Porém, ao meu ver, estes não são suficientes para que o usuário iniciante seja capaz de escrever seu próprio solver, sendo necessário um certo esforço para estudar os códigos existentes, a estrutura e o funcionamento dos algoritmos implementados.

Em uma seqüência de 3 posts, vou tentar passar os conceitos básicos sobre orientação a objetos (com ênfase e aplicações em C++) e a minha experiência no aprendizado da linguagem do OpenFOAM, evitando entrar em detalhes sobre sintaxe do código neste primeiro momento (mas vou chegar lá... esperem só pra ver!). Neste primeiro post, vamos ver o que C++ pode nos oferecer para a programação de um código científico.

Orientação a Objetos e C++
A maior vantagem na abordagem aplicada à orientação a objetos é remover algumas das falhas encontradas na abordagem seqüencial ou contínua. 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 os acessam e operam, protegendo-os de modificações por uso de funções externas. A orientação a objetos permite a decomposição do problema em entidades chamadas objetos, com a construção de dados e funções para operar sobre esses objetos. Uma grande vantagem na abordagem de orientação a objetos é a reusabilidade do código.
Para melhor entendimento da linguagem orientada a objetos, os conceitos de objetos, classes, abstração de dados e encapsulamento, herança e polimorfismo estão colocados na seqüência.
Objetos são as entidades básicas de um sistema orientado a objeto. A programação é analisada em termos de objetos e na forma de comunicação entre eles. Quando um programa é executado, os objetos interagem uns com os outros por envio de mensagens, mesmo sem que estes tenham conhecimento sobre detalhes dos dados ou código. As classes formam uma coleção de objetos similares entre si.

A abstração se refere ao ato de representar aspectos essenciais do programa sem incluir detalhes ou explicações básicas de programação. Classes usam o conceito de abstração e são definidas como uma lista de atributos abstratos. O armazenamento de dados e funções em uma única unidade (classe) é chamado encapsulamento. Com isso, os dados não podem ser acessados diretamente e somente as funções encapsuladas na classe podem acessá-los.

Herança é o processo no qual os objetos podem adquirir as propriedades de objetos de outras classes. Esta característica proporciona a reusabilidade do código, como adicionar novas propriedades a uma classe existente sem modificá-la. Para tal, deriva-se uma nova classe a partir de uma já existente. A nova classe terá aspectos combinados das duas classes.

Por fim, o polimorfismo caracteriza a habilidade de realizar operações com diferentes comportamentos em situações diversas. O comportamento da operação depende do tipo de dado usado na operação. O polimorfismo é usado extensivamente na implementação da herança do código.

Tendo sido colocado essas informações, pode-se descrever algumas vantagens da programação orientada a objetos em relação às abordagens convencionais, como:
  • Fornecer uma estrutura modular para programas, facilitando a definição de tipos de dados abstratos onde detalhes da implementação estão escondidos e a unidade possui uma interface claramente definida.
  • Tornar mais fácil a manutenção e a modificação de códigos, assim como novos objetos podem ser criados com pequenas diferenças entre os existentes.
  • Fornecer uma boa estrutura para bibliotecas de códigos onde os componentes de um software podem ser facilmente adaptados e modificados pelo programador.
Para entender como é o funcionamento das bibliotecas do OpenFOAM, é necessário ter um conhecimento prévio de C++, a linguagem base do OpenFOAM. Esta é uma linguagem orientada a objetos e, portanto possui todas as características descritas acima. Por ser baseada na linguagem precursora C, C++ é uma linguagem de programação apropriada para trabalho científico, devido à rapidez com que os cálculos são efetuados. Contudo, as propriedades inerentes à orientação a objetos em C++ propiciam uma perda de cerca de 10% na velocidade de processamento em relação à linguagem C. Esta perda na eficiência pode variar dependendo da conscientização do programador em relação à efetividade computacional. Estudos [1] foram realizados avaliando 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.

Por fim...
Se você realmente está interessado em desenvolver programas CFD usando o OpenFOAM, entenda os conceitos de C++ antes de mais nada. Leia este post com carinho, clicando nos links com as definições (que eu tive a paciência de procurar para você!!) e entendendo o que cada uma delas significa. Em seguida, parta para o estudo básico da linguagem chegando ao avançado (usando um livro como base, apostilas, internet, grupos de discussão...).

Até a próxima!

Referências Bibliográficas:
[1] Malan, A. G., Lewis, R. W., 2004. On the development of high-performance C++ object-oriented code with application to an explicit edge-based fluid dynamics scheme. Computers & Fluids 33 (10), 1291.

Ps.: Atualmente, estou treinando 4 alunos de graduação em OpenFOAM. Nenhum deles tinha experiência em programação e a intenção é que eles trabalhem em desenvolvimento de códigos CFD. Eu comecei o treinamento deles com o estudo do livro do Yang, fazendo os exercícios que eu tinha selecionado (se quiserem, depois posso postar quais foram). Mas um detalhe! Eles não podiam mexer no OpenFOAM até chegarem ao Cap. 5 do livro, onde os conceitos de orientação a objetos eram introduzidos. A partir desse ponto, os alunos começaram o treinamento em OpenFOAM lendo o User's Guide e executando os tutoriais e, em paralelo, continuavam o estudo de C++. "Mas por que fazer assim, Luiz F.?", você deve se perguntar...
Nessa etapa, o básico de programação (iteração, laço, condicionais, entrada e saída de arquivos, etc...) já foi aprendido e os alunos estão prontos para aprender os conceitos de orientação a objetos (e C++ avançado). Apesar de estar nas entrelinhas, estes conceitos estão entranhados no User's e Programmer's Guide do OpenFOAM. Assim, os alunos irão aprender a linguagem avançada de C++ e sua aplicação na estrutura do OpenFOAM concomitantemente. Pode até ser que os alunos não se dêem conta disso no primeiro momento, mas quando eles acabarem o estudo do Yang (classes, templates, etc) e de ler os dois guias do OpenFOAM vão ter uma visão muito mais completa do código CFD.

Além disso, não mexer em CFD até chegar ao Cap. 5 de um livro?? Putz... Eles querem chegar logo ao OpenFOAM!! Estudam o livro e fazem os exercícios rapidinho!!

E aí, o que você acha disso? Comente!

No comments:

Post a Comment