# OpenFOAM

OpenFOAM ("Open source Field Operation And Manipulation") é um programa em linguagem C++ para o desenvolvimento de ferramentas de análise numérica com pré- e pós-processamento para solução de problemas da mecânica do contínuo, incluindo Dinâmica dos Fluidos Computacional (CFD). O código é lançado com o status livre e fonte aberta sob a GNU General Public License. É gerenciado, mantido e distribuído pela The OpenFOAM Foundation, suportada por contribuidores voluntários. O nome OpenFOAM é uma marca registrada da OpenCFD Ltd e licenciado para a OpenFOAM Foundation Ltd.

## História

O OpenFOAM (originalmente FOAM) foi criado por Henry Weller no final da década de 1980 no Imperial College London, com o propósito de desenvolver uma plataforma de simulação geral mais capacitada e flexível que o padrão da época, a linguagem Fortran. Isto levou à escolha do C++ como linguagem de programação, devido à sua modularidade e características de orientação a objetos. Em 2004 Henry Weller, Chris Greenshields e Mattijs Janssens fundaram a OpenCFD Ltd, com o propósito de desenvolver e lançar o OpenFOAM. Em 8 de agosto de 2011 a OpenCFD foi adquirida pela Silicon Graphics International (SGI). Ao mesmo tempo o copyright do OpenFOAM foi transferido para a OpenFOAM Foundation, organização então fundada, sem fins lucrativos, que gerencia o OpenFOAM e o distribui ao público em geral. Em 12 de setembro de 2012 o Grupo ESI Group anunciou a aquisição da OpenCFD Ltd do SGI. Em 2014 Weller e Greenshields deixaram o ESI Group e continuaram o desenvolvimento e gerência do OpenFOAM, em nome da OpenFOAM Foundation, do CFD Direct.

## Características de destaque
### Sintaxe

Uma característica de destaque do OpenFOAM é sua sintaxe para operações com tensores e equações diferenciais parciais, que identifica em sua codificação de forma clara as equações a serem resolvidas. Por exemplo, a equação
    ${\frac {\partial \rho \mathbf {U} }{\partial t}}+\nabla \cdot \phi \mathbf {U} -\nabla \cdot \mu \nabla \mathbf {U} =-\nabla p$
é codificada como
Esta sintaxe, obtida mediante o uso de Programação Orientada a Objetos (POO) e sobrecarga de operadores, permite aos usuários criar solvers padronizados com relativa facilidade. Contudo, a padronização de códigos torna-se mais desafiadora com o aumento da penetração no código da biblioteca OpenFOAM, devido à deficiência de documentação, e grande uso de metaprogramação C++.

### Extensibilidade

Os usuários podem criar objetos personalizados, tais como condições de contorno ou modelos de turbulência, que irão funcionar com solvers existentes sem a necessidade de modificar ou recompilar o código fonte existente. O OpenFOAM faz isto através da combinação de construtores virtuais com o uso de classes de base simplificadas como interfaces. Como resultado, isto confere ao OpenFOAM boas qualidades de extensibilidade. O OpenFOAM refere-se a esta capacidade como seleção em tempo de execução.

## Estrutura do OpenFOAM

O OpenFOAM é constituído de uma grande biblioteca base, que dispõe de estruturas essenciais dos códigos:
* Operações tensoriais e de campo
* Discretização de equações diferenciais parciais usando uma sintaxe legível
* Solução de sistemas lineares
* Solução de equações diferenciais ordinárias
* Paralelização automática de operações de alto-nível
* Malha dinâmica
* Modelos físicos gerais
** Modelos reológicos
** Modelos termodinâmicos e base de dados
** Modelos de turbulência
** Reações químicas e modelos cinéticos
** Métodos de rastreamento lagrangiano de partículas
** Modelos de transmissão de calor por radiação
** Metodologias de estrutura multi-referenciada e simples-referenciada.
Os recursos fornecidos pela biblioteca são então usados para desenvolver aplicativos. Os aplicativos são escritos usando a sintaxe de alto nível introduzido pelo OpenFOAM, que visa reproduzir a notação matemática convencional. Existem duas categorias de aplicativos:
* Solvers: efetuam os cálculos para resolver um problema específico da mecânica do contínuo
* Utilitários: são usados para preparar a malha, selecionar o caso de simulação, processar os resultados e para realizar outras operações além de resolver o problema em análise.