# OpenFOAM

OpenFOAM (Open Field Operation And Manipulation) è principalmente un toolbox C++ per customizzare ed estendere soluzioni software per la simulazione. È un finalizzatore (solver) basato sulla teoria della meccanica dei continui che include la fluidodinamica computazionale (CFD, Computational Fluid Dynamics). Viene fornito con una estesa libreria di solver, sempre ampliata, applicabile ad una generalità di problemi.
OpenFOAM è uno dei primi maggiori pacchetti software scientifici scritti in C++.
Ci sono tre versioni principali di OpenFOAM, gratuite e che sono rilasciate sotto la licenza GPL:
* La versione ufficiale di OpenFOAM La versione rilasciata ogni 6 mesi da ESI-OpenCFD Ltd.,
* La fork della OpenFOAM-Foundation rilasciata da CFD Direct Ltd. a nome di OpenFOAM Foundation, e
* La fork del progetto FOAM-Extend rilasciata da Wikki Ltd..
Oltre a queste versioni principali, ci sono diverse altre varianti mantenute e rilasciate per specifiche applicazioni da altre entità. Ad esempio: blueCFD®-Core, SIMSCALE, e iconCFD. È prodotto dalla società britannica OpenCFD Ltd. e dal 2004, e nel 2007 il nome OpenFOAM è stato registrato come marchio e garantisce l'uso del suo marchio OpenFOAM alle terze parti tramite licenza. ESI Group e la OpenFOAM Foundaation Ltd. possono attualmente utilizzare il nome e il dominio.

## Storia

L'uso del nome FOAM viene fatto risalire per la prima volta come utility di post-processing scritta da Charlie Hill all'inizio degli anni '90 nel gruppo del Prof. David Gosman all'Imperial College di Londra.
Ciònonostante, i primi sviluppi di FOAM (poi OpenFOAM) come strumento di simulazione fluidodinamica furono iniziati da Henry Weller allo stesso istituto utilizzando come linguaggio C++, invece del de facto standard del periodo, FORTRAN. Henry Weller e Hrvoje Jasak continuarono a sviluppare OpenFOAM sotto il nome di Nabla Ltd, per quasi un decennio. Per alcuni anni, FOAM fu venduto come codice commerciale dalla Nabla Ltd., ma a partire dal 2004, FOAM venne rilasciato sotto licenza GPL e rinominato OpenFOAM.
Dopo il fallimento della Nabla Ltd. nel 2004, Henry Weller, Chris Greenshields e Mattijs Janssens fondarono OpenFOAM Ltd per sviluppare e rilasciare OpenFOAM. Allo stesso tempo, Hrvoje Jasak fonda la compagnia di consulenza Wikki Ltd e mantiene una fork di OpenFOAM chiamata openfoam-extend.
Dall'8 Agosto 2011, OpenCFD fu acquisita da Silicon Graphics International (SGI). Dal 12 Settembre 2012, il gruppo ESI annunciò l'acquisizione di OpenCFD Ltd. e del marchio OpenFOAM da SGI.
Nel 2014, Welle e Greenshields lasciano il gruppo ESI, e fondano CFD Direct Ltd,, creando la fork di OpenFOAM della OpenFOAM Foundation.
La figura seguente presenta un riassunto dello sviluppo cronologico delle tre diverse varianti di OpenFOAM, con le frecce indicanti la direzione del trasferimento di funzionalità tra le diverse versioni. In particolare:
* La versione ufficiale di OpenFOAM (trademark) Versione principalmente sviluppata e mantenuta da ESI-OpenCFD Ltd. con una sigla indicante la data di rilascio (e.g. v1906),
* La versione della OpenFOAM-Foundation fork principalmente mantenuta da CFD Direct Ltd. con una sigla basata su una sequenza incrementale (e.g. 6.0),
* La versione del progetto FOAM-Extend fork principalmente mantenuta da Wikki Ltd..

## Funzionalità

OpenFOAM si confronta con successo con le funzionalità dei maggiori pacchetti software CFD commerciali. Esso si basa sulla scelta degli utenti di utility di pre e post-processing di terze parti, e viene fornito come:
* un plugin (paraFoam) per la visualizzazione dei dati finiti e mesh in ParaView.
* ampia varietà di convertitori delle griglie tridimensionali permettendo l'importazione da una serie di importanti pacchetti commerciali
* un mesher automatico di esaedri per creare le griglie poligonali per le configurazioni in ingegneria.

## Struttura di OpenFOAM

OpenFOAM è stato concepito come piattaforma per la meccanica dei continui ma è ideale per creare simulazioni in vari ambiti della fisica. La libreria di base di OpenFOAM è quella su cui si basano le capacità di base del codice:
* Operazioni su tensori e campi
* Discretizzazione di equazioni alle derivate parziali
* Soluzione di sistemi lineari
* Soluzione di equazioni alle derivate ordinarie
* Parallelizzazione automatica di operazioni di alto livello
* Gestione di mesh dinamiche
* Modelli fisici generali:
** Modelli reologici
** Modelli termodinamici
** Modelli di turbolenza
** Reazioni chimiche e modelli cinetici
** Tracciamento di particelle lagrangiane
** Modelli di trasferimento di calore per radiazione
** Metodi a singolo e multiplo sistema di riferimento
Le capacità in dotazione alla libreria sono poi utilizzate per sviluppare le applicazioni. Le applicazioni sono scritte utilizzando la sintassi di alto livello introdotta da OpenFOAM, che cerca di riprodurre la notazione matematica convenzionale. Due categorie di applicazioni esistono:
* Solver: risolvono uno specifico problema di meccanica del continuo, effettuando i calcoli necessari
* Utility: usate per preparare la mesh, preparare il caso simulativo, e processare i risultati.
Ogni applicazione provvede diverse capacità: ad esempio l'applicazione chiamata blockMesh permette di generare una mesh esaedrica dall'input dell'utente, mentre l'applicazione icoFoam risolve le equazioni di Navier-Stokes per un flusso incomprimibile laminare.
Infine, un set di pacchetti di terze parti sono utilizzati per provvedere funzionalità quali la parallelizzazione e il post processing grafico.

## Capacità

La libreria di OpenFOAM include solver capaci di risolvere:
* Basic CFD (fluidodinamica computazionale di base)
* Flussi incomprimibili con metodi RANS e LES
* Flussi comprimibili con metodi RANS e LES
* Flussi governati dal galleggiamento
* DNS e LES
* Flussi multifase
* Solver con tracciamento della fase lagrangiana
* Combustione
* Trasferimento termico coniugato alla fase solida
* Dinamica molecolare
* Simulazione diretta Monte Carlo
* Elettromagnetismo
* Dinamica dei solidi
* Finanza (flussi finanziari)
Le utility di OpenFOAM sono suddivise in:
* Utility di meshing
** Generazione della mesh: creano la griglia computazionale a partire da un file di input (blockMesh) o a partire da una file che rappresenti la geometria d'interesse, che viene meshata con una griglia a dominanza esaedrica (snappyHexMesh).
** Conversione della mesh: convertono griglie generate con altri meshatori in mesh compatibili con OpenFOAM
** Manipolazione della mesh: permettono di effettuare operazioni specifiche sulla mesh, come raffinamento locale, definizione di regioni, ed altre.
* Utility di parallelizzazione: Permettono di decomporre, ricostruire o ridistribuire il caso per permettere la simulazione in parallelo
* Pre-processing: utility per preparare le simulazioni
* Post-processing: utility per processare i risultati.
* Utility di manipolazione delle superfici: per preparare le geometrie da utilizzare per il setup dei casi
* Termofisiche: per valutare proprietà del flusso

### Sintassi

Oltre ai solvers standard, una delle funzionalità che distinguono OpenFOAM è la sua relativa facilità di creazione soluzioni solvers customizzate. OpenFOAM consente all'utente di utilizzare la sintassi che assomigliano molto alle equazioni alle derivate parziali in fase di soluzione.
Per esempio l'equazione:
    ${\frac {\partial \rho \mathbf {U} }{\partial t}}+\nabla \cdot \phi \mathbf {U} -\nabla \cdot \mu \nabla \mathbf {U} =-\nabla p$
è rappresentata dal codice:
Questa sintassi, raggiunta attraverso l'uso di una programmazione orientata agli oggetti e Polimorfismo, permette all'utente di creare solver con relativa facilità.

### Espandibilità

L'utente di OpenFOAM può creare oggetti personalizzati, come condizioni al contorno o modelli di turbolenza, che funzionano con il resto della libreria, senza la necessità di modificare o ricompilare il codice sorgente esistente. OpenFOAM raggiunge questo obiettivo combinando costruttori virtuali con l'uso di classi base semplici come interfacce. Ciò da ad OpenFOAM una buona espandibilità.

## FreeFOAM

FreeFOAM è un fork della suite OpenFOAM. È orientata verso la liberazione di OpenFOAM dal suo sistema di dipendenze, rendendola più portabile e più facile da installare. Il progetto segue da vicino la release ufficiale e non include ulteriori funzionalità. CMake è utilizzato come compilatore.