• Non ci sono risultati.

Di seguito si descrive come risolvere e gestire i casi openFOAM, incluso il controllo temporale, dell’output, del risolutore e dell’avanzamento della soluzione.

1.9.1 Case Control

Il file che controlla i parametri di input essenziali per l’evoluzione della soluzione è il controlDict, nella directory /system.

Nelle tabelle di seguito si riportano le keyword corrispondenti ai parametri da settare all’interno di tale file con a fianco una breve descrizione delle stesse, estratte dal manuale utente di openFOAM.

Time control

startFrom Controls the start time of the simulation.

- firstTime Earliest time step from the set of time directories. - startTime Time specified by the startTime keyword entry. - latestTime Most recent time step from the set of time directories. startTime Start time for the simulation with startFrom startTime; stopAt Controls the end time of the simulation.

- endTime Time specified by the endTime keyword entry.

- writeNow Stops simulation on completion of current time step and writes data.

- noWriteNow Stops simulation on completion of current time step and does not write out data. - nextWrite Stops simulation on completion of next scheduled write time, specified by writeControl. endTime End time for the simulation when stopAt endTime; is specified.

deltaT Time step of the simulation.

Time step control

adjustTimeStep yes/no to adjust time step according to maximum Courant number in transient simulation. maxCo Maximum Courant number allowed.

maxDeltaT Maximum time step allowed in transient simulation.

Data writing

writeControl Controls the timing of write output to file. - timeStep† Writes data every writeInterval time steps.

- runTime Writes data every writeInterval seconds of simulated time. - cpuTime Writes data every writeInterval seconds of CPU time. - clockTime Writes data out every writeInterval seconds of real time. writeInterval Scalar used in conjunction with writeControl described above.

Integer representing a limit on the number of time directories that are stored by overwriting time directories on a cyclic basis. Example of purgeWrite , and purgeWrite 2; data written into 2 directories, 6 and 7, before returning to write the data at 8 in 6, data at 9 into 7, etc. To disable the time directory limit, specify purgeWrite 0;

For steady-state solutions, results from previous iterations can be continuously overwritten by specifying purgeWrite 1;

writeFormat Specifies the format of the data files.

- ascii ASCII format, written to writePrecision significant figures. - binary Binary format.

writePrecision Integer used in conjunction with writeFormat described above, 6 by default writeCompression Specifies the compression of the data files.

- uncompressed No compression. - compressed gzip compression.

timeFormat Choice of format of the naming of the time directories. - fixed where the number of s is set by timePrecision. - scientific where the number of s is set by timePrecision.

- general Specifies scientific format if the exponent is less than -4 or greater than or equal to that specified by timePrecision. timePrecision Integer used in conjunction with timeFormat described above, 6 by default

22

Data reading

runTimeModifiable yes/no switch for whether dictionaries, e.g.controlDict, are re-read by OpenFOAM at the beginning of each time step.

libs List of additional libraries to be loaded at run-time; functions List of functions, e.g. probes to be loaded at run-time;

Tab. 1.6 – 1.9: keywords del file controlDict

1.9.2 Opzioni di risoluzione

Il file fvOptions, nella directory /system contiene ulteriori opzioni legate alla risoluzione. Includono svariate funzioni che, dalla versione 2.2 di OpenFOAM in poi, sono state raggruppate in un unico file per evitare di avere un numero eccessivo di risolutori specifici per ogni singolo caso.

Nei casi analizzati nell’ambito del presente elaborato, le opzioni più utilizzate sono state quella legata alla porosità e quella legata alle zone MRF (Multiple Reference Frame). Specificando i settaggi opportuni per ciascuna opzione, si può istruire il risolutore impiegato (simpleFoam, ad esempio), a risolvere specifiche zone della mesh in maniera non convenzionale.

Se, ad esempio, un volume della mesh deve essere risolto come volume poroso, nel file fvOptions si devono indicare i parametri fondamentali della porosità:

porosityProperty_1 { type explicitPorositySource; active yes; explicitPorositySourceCoeffs { type DarcyForchheimer; selectionMode cellZone; cellZone porousVolume; DarcyForchheimerCoeffs { d d [ 0 -2 0 0 0 0 0 ] ( 2e7 0 0 ); f f [ 0 -1 0 0 0 0 0 ] ( 2000. 0. 0. ); porosity 0.5 coordinateSystem { type cartesian; origin (-0.005 0 0); coordinateRotation { type axesRotation; e1 (1 0 0); e2 (0 1 0); e3 (0 0 1); } } } } }

23

1.9.3 Schemi numerici

Il dizionario fvSchemes nella directory /system imposta gli schemi numerici per la risoluzione dei termini differenziali presenti nelle equazioni.

La scelta di uno schema di risoluzione piuttosto che un altro viene effettuata manualmente dall’utente in funzione delle proprie esigenze e della mesh di calcolo a disposizione. Con mesh di alta qualità e necessità di risultati più precisi è consigliato utilizzare schemi di risoluzione di tipo linearUpwind, ovvero al secondo ordine di accuratezza.

In assenza di tali esigenze, sono sufficienti degli schemi al primo ordine di accuratezza, detti semplicemente Upwind.

In caso di divergenza della soluzione numerica con schemi al secondo ordine, è possibile passare al risolutore di grado più basso, meno accurato ma più robusto e meno soggetto ad instabilità.

Per un maggiore approfondimento di ciascuna delle categorie appena elencate si rimanda al capitolo 6.2 della guida utente.

1.9.4 Risoluzione e controllo dell’algoritmo

I risolutori, le tolleranze e gli algoritmi sono controllati dal dizionario fvSolution della directory /system. Un esempio di tale dizionario è riportato di seguito, per il caso particolare di risolutore

icoFoam: solvers { p { solver PCG; preconditioner DIC; tolerance 1e-06; relTol 0.05; } U { solver smoothSolver; smoother symGaussSeidel; tolerance 1e-05; relTol 0; } } PISO { nNonOrthogonalCorrectors 0; pRefCell 0; pRefValue 0; } // ****************************************** //

24

fvSolution contiene un set di subdizionari specifici del risolutore impiegato. Esiste comunque un

ristretto numero di subdizionari che coprono tutti quelli necessari ai risolutori più comuni. Nei paragrafi seguenti ne verranno descritti più dettagliatamente alcuni.

1.9.5 Controllo del Risolutore

Facendo riferimento al file d’esempio sopra riportato, il primo subdizionario elencato è solvers, che specifica ogni risolutore impiegato per ciascuna equazione del sistema.

La sintassi di ciascun punto all’interno di solvers è costituita da una serie di keywords relative alle impostazioni di ciascuna variabile. Ad esempio per la variabile U è stato scelto il risolutore

smoothSolver ed una tolleranza di risoluzione pari a 1*10-5.

Come già detto in proposito degli schemi di risoluzione (paragrafo 1.13.3), anche la scelta del risolutore è un parametro importante per l’ottenimento di risultati validi in tempi accettabili.

1.9.6 Tolleranze della soluzione

La risoluzione avviene in maniera iterativa e si basa sulla progressiva riduzione dei residui delle equazioni. I residui sono una misura dell’errore della soluzione, per cui tanto minori saranno, tanto più la soluzione sarà accurata. Più precisamente, il residuo è valutato sostituendo la soluzione corrente nell’equazione e valutandone la differenza con l’iterazione precedente.

Prima di risolvere un’equazione di una precisa variabile di campo viene valutato il residuo iniziale basato sugli attuali valori assunti dalla soluzione, e lo stesso viene fatto dopo ogni iterazione. Il risolutore si ferma nel momento in cui una delle seguenti condizioni risulta soddisfatta:

- Il residuo si riduce a meno della tolleranza della soluzione;

- Il rapporto tra il residuo attuale e iniziale scende al di sotto della tolleranza relativa del

risolutore;

- Il numero di iterazioni supera il massimo numero consentito, maxIter.

La tolleranza del risolutore dovrebbe rappresentare il livello al quale il residuo è abbastanza piccolo da considerare la soluzione sufficientemente accurata, mentre la tolleranza relativa del risolutore indica il miglioramento relativo dalla soluzione iniziale a quella finale. Nello studio dei transienti è uso comune impostare tale tolleranza relativa a zero per forzare la soluzione a convergere fino alla

tolleranza del risolutore.

Le tolleranze sono un parametro obbligatorio di ogni risolutore, mentre il numero di iterazioni è opzionale.

25

1.9.7 Soluzione Sotto-Rilassamento

Un secondo subdizionario spesso utilizzato è il relaxationFactor, che controlla il Sotto-Rilassamento (più noto come under-relaxation), una tecnica utilizzata per migliorare la stabilità del calcolo, in particolare per i problemi stazionari. Il Sotto-Rilassamento funziona limitando la quantità di cui una variabile può cambiare ad ogni iterazione, sia modificando il campo stesso che la matrice di risoluzione. Un fattore di Sotto-Rilassamento alpha (0 < alpha <= 1) specifica tale incremento, da un minimo di zero per alpha = 1 e aumentando per alpha → 0. Il caso limite per alpha = 0 rappresenta una soluzione che non cambia nelle iterazioni successive. La scelta corretta di tale parametro è il giusto compromesso tra un valore piccolo abbastanza da assicurare stabilità ma grande abbastanza da far procedere la simulazione rapidamente.

1.9.8 Algoritmi PISO e SIMPLE

La maggiorparte dei risolutori di openFOAM usano gli algoritmi pressure-implicit split-operator (PISO) o il semi-implicit method for pressure-linked equations (SIMPLE). Tali algoritmi sono procedure iterative per la risoluzione delle equazioni per la velocità e la pressione, il PISO per i casi transienti e il SIMPLE per i casi stazionari.

Entrambi gli algoritmi sono basati sulla valutazione di alcune soluzioni iniziali e sulla loro correzione. Una correzione aggiuntiva di cui tener conto è legata alla non-ortogonalità della mesh. Una mesh è

ortogonale se, per ogni faccia, la sua normale è parallela al vettore tra i centri delle celle connesse da

tale faccia. Il numero di correttori non-ortogonali è specificato dalla keyword

nNonOrthogonalCorrectors e in linea di massima dovrebbe valere 0 per mesh perfettamente

ortogonali ed aumentare, fino ad un massimo di 20, per mesh fortemente non-ortogonali.

1.9.9 Pressione di riferimento

In un sistema chiuso ed incomprimibile, la pressione è relativa: è la variazione di pressione che conta e non i valori assoluti. In questi casi, il risolutore imposta un valore di riferimento pRefValue in una cella pRefCell, dove in questo caso p è la variabile pressione.

26

Documenti correlati