• Non ci sono risultati.

Utilizzo di un codice CFD open source per la caratterizzazione aerodinamica di una vettura

N/A
N/A
Protected

Academic year: 2021

Condividi "Utilizzo di un codice CFD open source per la caratterizzazione aerodinamica di una vettura"

Copied!
135
0
0

Testo completo

(1)

i UNIVERSITA’ DI PISA

Facoltà di Ingegneria

Corso di Laurea Magistrale in Ingegneria Aerospaziale

Utilizzo di un codice CFD open source per la

caratterizzazione aerodinamica di una vettura

Candidato: Matteo Rossi

Relatori:

Prof. Ing. Giovanni Lombardi Prof. Ing. Marco Maganzi

(2)

ii

Ringraziamenti

Un grande, enorme, immenso grazie a tutta la mia famiglia, per aver sempre creduto in me ed avermi supportato (e sopportato) sia nei momenti migliori che in quelli più difficili, senza mai chiedere niente in cambio. Grazie quindi ai miei genitori, per le parole di incoraggiamento e per essere sempre stati d’esempio per me, grazie a mia sorella, perché senza qualche litigata la vita familiare non sarebbe altrettanto divertente, grazie ai miei nonni, per non avermi mai fatto perdere di vista i veri obiettivi.

Un sentito grazie anche al Professor Lombardi, per l’opportunità concessa e gli strumenti messi a disposizione, a Marco e ad Antonio, per la pazienza, la disponibilità e l’aiuto fornito.

Per ultimo, ma non per questo meno importante, un gigantesco grazie a tutti gli amici, vicini e lontani, per il sostegno morale e per essere stati in tutti questi anni una seconda famiglia.

(3)

iii

Astratto

L’importanza della CFD (Computational Fluid Dynamics) nell’investigazione dei fenomeni di natura aerodinamica ha assunto negli ultimi anni un ruolo sempre più preponderante. Il con- tinuo accrescere della potenza dei calcolatori ha permesso, e permetterà, uno studio sempre più accurato e approfondito di tali fenomeni senza la necessità di allestimento di lunghe e dis- pendiose campagne sperimentali in galleria del vento.

In futuro è probabile che le analisi numeriche soppianteranno quasi completamente quelle sper- imentali, dato che le inevitabili limitazioni che presentano quest’ultime, come la necessità di supporti per i modelli o il bloccaggio nelle gallerie più piccole, non costituiscono un

problema per l’analisi CFD, a patto di possedere strumenti sufficientemente potenti. Strumenti che, con il rapido processo di evoluzione tecnologica a cui stiamo assistendo, saranno disponibili alla portata di tutti nel giro di pochi anni.

In quest’ottica, è fondamentale disporre delle competenze necessarie all’impiego dei vari software di analisi CFD disponibili sul mercato.

Tra questi, va acquisendo sempre più importanza il software OpenFOAM, distribuito dal gruppo ESI e dalla OpenFOAM Foundation, principalmente grazie alla sua disponibilità in forma open source.

Sull’utilizzo di questo software si concentra la presente tesi, con il particolare obiettivo di studiare un modello di calcolo utilizzabile per simulare un veicolo completo.

(4)

iv

Indice dei contenuti

Ringraziamenti ... ii

Astratto ... iii

Indice dei contenuti ... iv

Indice delle figure ...vii

Indice delle tabelle ... viii

1.Introduzione ad OpenFOAM ... 1

1.1 Introduzione al codice ... 1

1.2 Struttura di un caso OpenFOAM ... 2

1.3 Formato dei file OpenFOAM ... 3

1.3.1 Dizionari ... 3

1.3.2 Data File Header... 3

1.3.3 Liste ... 3

1.3.4 Scalari, vettori e tensori... 3

1.3.5 Unità dimensionali ... 4

1.3.6 Variabili dimensionali e di campo... 4

1.4 Applicazioni OpenFOAM ... 6

1.5 Lancio delle applicazioni ... 6

1.6 Elaborazione in parallelo ... 6

1.6.1 Scomposizione del dominio ... 6

1.6.2 Lancio di un caso scomposto ... 8

1.6.3 Ricostruzione del caso ... 8

1.7 Il file Polymesh ... 9

1.7.1 Elementi della mesh ... 9

1.7.2 Struttura della Polymesh...10

1.7.3 Tipi di celle ...11

1.7.4 Tipi di patches ...12

1.7.5 Generazione della mesh ...13

1.8 Risolutori e proprietà fisiche ...14

1.8.1 Condizioni al contorno ...14

1.8.2 Modelli termofisici...15

1.8.3 Modelli di turbolenza ...16

1.8.4 Il modello kw SST ...16

(5)

v

1.9 Risoluzione di un caso ...21

1.9.1 Time control ...21

1.9.2 Opzioni di risoluzione ...22

1.9.3 Schemi numerici ...23

1.9.4 Risoluzione e controllo dell’algoritmo ...23

1.9.5 Controllo del risolutore ...24

1.9.6 Tolleranze della soluzione ...24

1.9.7 Soluzione sotto-rilassamento ...25

1.9.8 Algoritmi PISO e SIMPLE ...25

1.9.9 Pressione di riferimento...25

1.10 Gestione e monitoraggio dei casi ...26

1.10.1 Lo script foamLog...26

1.10.2Lo script foamJob ...27

1.11 Post-processing ...27

2.Studio di un profilo alare ...28

2.1 Presentazione del caso ...28

2.1.1 NACA 64212 ...28

2.2 Creazione del modello ...29

2.3 Meshing ...30

2.4 Setting delle condizioni al contorno ...31

2.5 Calcolo delle forze...35

2.6 Scelta del risolutore ...36

2.7 Risultati ...36

2.8 Effetto suolo ...38

2.9 Conclusioni ...46

3.Studio di un’ala di apertura finita ...47

3.1 Presentazione del caso ...47

3.2 Mesh e Size Box ...48

3.3 Setting delle condizioni al contorno ...50

3.4 Risultati e visualizzazioni...52

3.5 Vortici d’estremità ...55

4.Studio della ruota di un veicolo ...58

4.1 Presentazione del caso ...58

4.2 L’analisi di Fackrell ...58

(6)

vi

4.4 Condizioni al contorno e rotatingWallVelocity ...63

4.5 Elaborazione del caso e risultati numerici ...63

4.6 Visualizzazioni e considerazioni aggiuntive ...68

4.7 Analisi con Multiple Reference Frame ...71

4.7.1 Condizione al contorno CyclicAMI ...71

4.7.2 Setting della condizione MRF ...74

4.7.3 Risultati del caso MRF e visualizzazioni ...76

5.Modello di radiatore ...82

5.1 Presentazione del caso ...82

5.2 Geometria e mesh ...82

5.3 Legge di Darcy-Forchheimer ...83

5.4 Risultati e visualizzazioni...86

6.Studio del veicolo completo ...88

6.1 Presentazione del caso ...88

6.2 Geometria del modello ...88

6.3 Struttura della mesh ...92

6.4 Condizioni al contorno ...93

6.5 fvOptions e impostazioni dei risolutori...94

6.6 Inizializzazione con PotentialFoam ...95

6.7 Risultati ...96

6.8 Bilanciamento della vettura ...98

6.9 Visualizzazioni e considerazioni ... 100

Conclusioni e Lavori Futuri ... 112

Appendici... 114

6.7 Appendici A: testo integrale della simulazione finale ... 114

(7)

vii

Indice delle figure

Figura 1.1: Struttura di openFOAM ... 1

Figura 1.2: Struttura di un caso ... 2

Figura 1.3: Faccia di un elemento della mesh ... 9

Figura 1.4: Tipi di celle ...11

Figura 1.5: Funzioni di parete ...19

Figura 2.1: valori di riferimento del profilo NACA 64212 ...28

Figura 2.2: dominio di calcolo ...29

Figura 2.3: Mesh strutturata e non strutturata ...30

Figura 2.4: proprietà del modello (ANSA)...31

Figura 2.5: Coefficiente di pressione sul profilo alare ...37

Figura 2.6: Campo di velocità attorno al profilo alare ...37

Figura 2.7: progressione della distanza dal suolo ...38

Figura 2.8: andamento dei coefficienti CL e CD ...39

Figura 3.1: ala di apertura finita ...47

Figura 3.2: dominio di calcolo per l’ala di apertura finita ...48

Figura 3.3: mesh e size box ...49

Figura 4.1: dimensioni della galleria utilizzata da Fackrell ...58

Figura 4.2: dimensioni caratteristiche della ruota A2 di Fackrell ...59

Figura 4.3: creazione dello step di contatto con il terreno ...60

Figura 4.4: mesh della ruota di Fackrell ...61

Figura 4.5: mesh nella zona di contatto con il terreno ...62

Figura 4.6: sezione della mesh di volume attorno alla ruota ...62

Figure 4.7 - 4.10: grafici delle oscillazioni dei risultati, 10 nodi nello step ...64

Figure 4.11 - 4.14: grafici delle oscillazioni dei risultati, 20 nodi nello step ...65

Figure 4.15 - 4.18: grafici delle oscillazioni dei risultati, 30 nodi nello step ...66

Figura 4.19: raffinamento della mesh nello studio di Dianosis, Barber e Doig ...67

Figura 4.20: coefficiente di pressione intorno alla ruota ...68

Figura 4.21: campo di velocità intorno alla ruota ...69

Figura 4.22: campo di pressione intorno allo step di contatto ...70

(8)

viii

Figura 4.24: Dominio MRF e interfaccia CyclicAMI ...72

Figure 4.25 - 4.28: grafici delle oscillazioni dei risultati, 10 nodi nello step, MRF ...76

Figura 4.29 - 4.32: grafici delle oscillazioni dei risultati, 20 nodi nello step, MRF ...77

Figura 4.33: linee di corrente tridimensionali intorno al modello di ruota, caso MRF ...78

Figura 4.34: sezione del campo di pressione intorno alla ruota, caso MRF ...78

Figura 4.35: sezione del campo di velocità intorno alla ruota, caso MRF ...79

Figure 4.36 – 4.43: sezioni perpendicolari al flusso asintotico a valori crescenti di x/d, caso MRF ... 79,80 Figura 4.44: principali vortici intorno ad una ruota in rotazione ...81

Figura 5.1: Geometria del radiatore ...82

Figura 5.2: Mesh del radiatore ...83

Figura 5.3: Velocità del flusso attraverso il radiatore ...86

Figura 5.4: Variazione di pressione del flusso attraverso il radiatore ...86

Figura 6.1: CAD del modello di automobile ...88

Figura 6.2: sezione del modello impiegato lungo il piano di simmetria ...89

Figura 6.3: condotto del radiatore del veicolo analizzato ...90

Figura 6.4: dominio di calcolo intorno alla vettura ...91

Figura 6.5: size box per il controllo della crescita della mesh ...91

Figura 6.6: esempi di mesh superficiale ...92

Figura 6.7: superfici relative alle condizioni al contorno assegnate ...93

Figura 6.8-6.9: Andamento dei coefficienti aerodinamici ...96

Figura 6.10-6.11: Andamento di alcuni residui della simulazione ...96

Figura 6.12: Scomposizione delle forze aerodinamiche agenti sulla vettura ...98

Figura 6.13: sezione XZ del coefficiente di pressione in corrispondenza del piano di simm. del veicolo ... 100

Figura 6.14: sezione XZ del campo di velocità in corrispondenza del piano di simmetria del veicolo... 100

Figura 6.15: Coefficiente di pressione sulla superficie del veicolo ... 101

Figura 6.16: zona di depressione all’ingresso del sottoscocca ... 102

Figura 6.17 – 6.18: sezione XZ del campo di velocità e del coeff. di pressione all’ingresso del radiatore .. 103

Figura 6.19: sezione XZ del coefficiente di pressione passante per il piano di simmetria delle ruote ... 104

Figura 6.20: sezione XZ del campo di velocità passante per il piano di simmetria delle ruote ... 104

Figure 6.21 – 6.22: sezione XZ del campo di velocità attorno alle ruote ... 105

Figura 6.23: sezione YZ del campo di velocità attorno alla ruota posteriore ... 106

Figure 6.24 – 6.26: linee di corrente attorno al veicolo ... 107

Figura 6.27: Posizione delle sezioni delle Figure 6.23 – 6.35 ... 108 Figura 6.28 (A-L): Sezioni del flusso attorno alla vettura a distanza crescente dal muso del veicolo ... 109-110

(9)

ix

Indice delle tabelle

Tabella 1.1: Keyword ... 3

Tabella 1.2: Unità dimensionali ... 4

Tabella 1.3: Keywords associate ai campi tensoriali ... 5

Tabelle 1.3-1.5: coefficienti dei metodi di scomposizione ... 7

Tabelle 1.6 – 1.9: keywords del file controlDict ... 21,22 Tabella 2.1: risultati del profilo alare in condizioni di riferimento ...36

Tabella 2.2: Risultati al variare della distanza dal suolo ...39

Tabella 2.4: Evoluzione del coefficiente di pressione attorno al profilo ... 40-42 Tabella 2.5: Evoluzione del campo di velocità attorno al profilo ... 43-45 Tabella 3.1: risultati al variare della distanza dal suolo per l’ala di apertura finita ...52

Tabella 3.2: evoluzione del coefficiente di pressione al variare della distanza dal suolo ...53

Tabella 3.3: evoluzione del campo di velocità al variare della distanza dal suolo ...54

Tabella 3.4: campo di velocità nella scia dell’ala di apertura finita ... 55,56 Tabella 4.1: dimensioni caratteristiche della ruota A2 di Fackrell ...59

Tabella 4.2: CL e CD al variare del numero di nodi nello step di contatto ...67

Tabella 4.3: CL e CD al variare del numero di nodi nello step di contatto per il caso MRF ...78

Tabella 5.1: coefficienti di Darcy-Forchheimer ...85

Tabella 5.2: risultati della simulazione del radiatore ...87

Tabella 6.1: dimensioni caratteristiche del modello impiegato ...90

Tabella 6.2: Condizioni al contorno relative alle superfici di Fig. 6.7...93

Tabella 6.3: Contributi al Cx totale ...97

Tabella 6.4: Contributi al Cz totale ...97

Tabella 6.5: contributi ai coefficienti aerodinamici dovuti ai singoli componenti del veicolo ...98

Tabella 6.6: bilanciamento della vettura ...99

(10)

1

Capitolo 1: introduzione ad OpenFOAM

1.1 Introduzione al codice

OpenFOAM (open-source Field Operation and Manipulation) è un codice CFD, sviluppato a partire dal 1989 da Henry Weller con il nome originale di FOAM e successivamente distribuito in versione opensource, a partire dal 2004, sotto la licenza openCFD ltd.

OpenFOAM è principalmente un toolbox C++ per personalizzare ed estendere soluzioni software per vari tipi di simulazione. Viene fornito con una estesa libreria di risolutori (solvers), sempre ampliata, applicabile ad una generalità di problemi.

Fig. 1.1: Struttura di openFOAM.

La struttura di openFOAM si presenta come riportato nell’immagine 1.1, e cioè un insieme di strumenti di pre-processing (utilities per manipolare dati e per la preparazione della mesh di calcolo), solving (solvers e applicazioni user-defined, progettate per risolvere problemi specifici della meccanica dei fluidi) e post-processing (visualizzazione con software terzi e analisi dei dati).

A differenza di molti software CFD commerciali, openFOAM non presenta un’interfaccia grafica e l’interazione con le applicazioni disponibili avviene esclusivamente tramite il terminale del computer.

(11)

2

1.2 Struttura di un caso openFOAM

Un caso openFOAM è costituito da un’unica directory, rinominabile a piacimento, contenente tutti i file e le subdirectory necessarie.

Fig. 1.2: Struttura di un caso.

Come visibile in Figura 1.2, i file si organizzano in varie subdirectory dette system, constant e time

directories (ad es. 0,1,2,3,4..), che contengono tutte le informazioni necessarie alla risoluzione del

caso:

Ø Nella directory constant sono contenute tutte le informazioni riguardanti la mesh (subdir.

polyMesh) e le proprietà fisiche delle applicazioni coinvolte (xProperties);

Ø Nella directory system sono contenuti i parametri che regolano la simulazione, articolati nei files controlDict (per il controllo temporale della simulazione), fvSchemes (per gli schemi della soluzione), fvSolution (per le tolleranze e controlli sugli algoritmi risolutivi) ed eventuali ulteriori;

Ø Nelle time directories sono contenuti infine i dati relativi a ciascuna variabile campo (p, U..) ed in particolare nella directory 0 (se t=0 è l’istante iniziale della simulazione) sono contenute le informazioni iniziali su tali campi, assegnate dall’utente come condizioni al contorno. Durante l’esecuzione dei calcoli, verranno create automaticamente ulteriori time-directories, contenenti le informazioni dei rispettivi time-step, secondo le istruzioni indicate nel file

controlDict già descritto. A partire dai dati contenuti in queste cartelle verranno poi rielaborate

(12)

3

1.3 formato dei file openFOAM

Il formato dei file openFOAM segue alcune regole di base, atte a semplificarne la comprensione e la manipolazione effettuabile direttamente dell’utente e di seguito se ne descrive la struttura, che in generale segue i principi della programmazione C++.

1.3.1 I Dizionari

I dizionari sono il metodo più comune per specificare un set di dati, richiamabili rapidamente come input/output attraverso una apposita keyword.

1.3.2 Data File Header

Tutti i file letti e scritti da openFOAM iniziano con un dizionario, detto foamFile, contenente un set standard di keywords, elencate di seguito:

Keyword Description Entry

version I/O format version 2.0

format Data format ascii / binary

location Path to the file, in "…" (optional)

class OpenFOAM class constructed from the data file concerned typically dictionary or a field, e.g.vectorField

object Filename e.g.controlDict

Tab. 1.1: Keyword.

1.3.3 Liste

Nei vari file possono essere contenute delle liste (ad esempio per la numerazione delle facce della mesh) i cui valori sono specificati all’interno di parentesi tonde (..).

A seconda del formato precedente le parentesi, si parla di liste semplici, numerate (in cui si indica il numero di elementi della lista) o ‘token identifier’ (se si specifica la classe dei dati della lista, ad es. <scalar>). I formati numbered e token identifier permettono una lettura più rapida delle liste dato che preallocano la memoria necessaria alla lettura, ma per liste corte è più che sufficiente il formato semplice.

1.3.4 Scalari, vettori e tensori

Uno scalare è un singolo numero e come tale è rappresentato in un file. Un vettore invece è rappresentato come una lista semplice di 3 elementi (dato che la dimensione è fissata), mentre un

(13)

4 tensore è composto da 9 elementi. OpenFOAM non fa distinzione tra liste articolate su una o più linee, per cui, ad esempio, non esiste alcuna differenza tra i seguenti tensori:

Ø ( 1 0 0 0 1 0 0 0 1 ) Ø ( 1 0 0 0 1 0 0 0 1 ) 1.3.5 Unità dimensionali

Le unità di misura utilizzate nelle operazioni algebriche sono specificate assieme alle variabili come

dimensionSet, ovvero una lista semplice di 7 elementi delimitata da parentesi quadre. A ciascun

elemento corrisponde la potenza di una determinata unità di misura, come elencato nella seguente tabella:

Property SI unit USCS unit

1 Mass kilogram (kg) pound-mass (lbm)

2 Length metre (m) foot (ft)

3 Time second (s) second (s)

4 Temperature Kelvin (K) Degree Rankine (°R)

5 Quantity kilogram-mole (kgmol) pound-mole (lbmol)

6 Current Ampere (A) Ampere (A)

7 Luminous Intensity candela (cd) candela (cd)

Tab. 1.2: Unità dimensionali.

Ad esempio, la stringa [0 1 -1 0 0 0 0] rappresenta uno spazio diviso un tempo, quindi una velocità. Assegnando le proprietà fisiche alle variabili di campo, openFOAM è in grado di eseguire un check dimensionale ad ogni operazione tensoriale, così da prevenire operazioni prive di significato.

È possibile utilizzare sia il Sistema Internazionale (SI) che quello Americano (USCS), a patto di essere coerenti con costanti fisiche implementate in alcuni risolutori. Di default tali costanti sono settate in unità SI, ma è possibile cambiarle in qualunque altro sistema modificando la variabile

dimensionedConstant specificata nel file controlDict.

1.3.6 Variabili dimensionali e di campo

Il formato con cui si specifica una variabile dimensionale è il seguente: V [0 1 -1 0 0 0 0] 1

(14)

5 Dove V è la keyword (velocità), l’inciso tra parentesi quadre è il dimensionSet e l’ultimo valore è lo scalare associato a tale variabile.

Molti dati letti e scritti da openFOAM nei time directories sono campi tensoriali e in quanto tali sono memorizzati con le seguenti keywords:

Keyword Description

dimensions Dimensions of field internalField Value of internal field boundaryField Boundary field Tab. 1.3: Keywords associate ai campi tensoriali.

A titolo di esempio si riporta un estratto di un possibile dizionario contenente i dati relativi al campo di velocità: dimensions [0 1 -1 0 0 0 0]; internalField uniform (0 0 0); boundaryField { movingWall { type fixedValue; value uniform (1 0 0); } fixedWalls { type noSlip; } frontAndBack { type empty; } } Dove:

• dimensions specifica l’unità di misura della variabile;

• internalField specifica il valore preassegnato alla variabile in tutti i punti del campo, può essere uniform o nonuniform a seconda delle esigenze;

• boundaryField specifica il valore assegnato alla variabile in corrispondenza delle patch geometriche indicate nel file boundary della directory polyMesh;

(15)

6

1.4 Applicazioni openFOAM

Nella libreria di openFOAM sono presenti numerosi eseguibili, noti come applicazioni. Tali applicazioni sono divisibili in due macro categorie:

• Solvers, progettati per risolvere specifici problemi della meccanica dei continui; • Utilities, che eseguono semplici compiti di pre e post processing, principalmente

riguardanti manipolazione dei dati e calcoli algebrici.

Una panoramica dei solvers, delle utilities e delle libraries fornite con il codice sorgente è disponibile all’interno della guida utente di openFOAM.

1.5 Lancio delle applicazioni

Ogni applicazione è progettata per essere eseguita da terminale e lavorare con i dati inclusi nella directory del caso analizzato (tale generica directory verrà di seguito chiamata <caseDir>). Il lancio di una determinata applicazione avviene semplicemente digitando il rispettivo nome. Tale stringa può essere seguita da una serie di opzioni, che dipendono caso per caso dall’applicazione in gioco, consultabili direttamente da terminale digitando -help di seguito al nome dell’applicazione stessa. Ad esempio, con l’opzione -case <caseDir> è possibile eseguire l’applicazione senza posizionarsi direttamente nella cartella del caso.

Utilizzando invece la stringa applicationName > log &, è possibile eseguire l’applicazione in background e salvare il registro di avanzamento in un file che verrà creato all’interno della <caseDir> stessa.

1.6 Elaborazione in parallelo

OpenFOAM è in grado di lavorare in parallelo distribuendo le operazioni tra processori multipli. Tale metodo è noto come scomposizione del dominio, nel quale la geometria e i campi associati sono scomposti in parti e allocati a processori separati per la risoluzione. Il processo si scompone in:

1.6.1 Scomposizione del dominio

La scomposizione avviene con l’utility decomposePar, in maniera da avere una soluzione più efficiente. Le istruzioni per tale operazione sono contenute nel file decomposeParDict nella directory /system. Un esempio di tale script è il seguente:

(16)

7 numberOfSubdomains 4; method simple; coeffs { n (2 2 1); //delta 0.001; // default=0.001 } distributed no; roots ( );

È possibile scegliere tra quattro metodi di scomposizione:

• Simple: scomposizione geometrica secondo un vettore;

• Hierarchical: come Simple, con possibilità di specificare l’ordine della scomposizione;

• Scotch: scomposizione automatica che mira a distribuire equamente il numero di elementi del dominio e a minimizzare le comunicazioni tra i processori; • Manual: in cui è possibile specificare l’assegnazione di ogni cella di calcolo. Per ciascun metodo esistono un set di coefficienti da specificare, detti <method>Coeffs, elencati nelle Tabelle 1.3-1.5 estratte dalla guida utente di openFOAM.

Di seguito sono stati riportati solamente i coefficienti del metodo Scotch, in quanto questo è l’unico metodo di scomposizione applicato nel presente nel elaborato.

• Compulsory entries

numberOfSubdomains Total number of subdomains N

method Method of decomposition simple/ hierarchical/ scotch/ metis/ manual/

• ScotchCoeffs entries

processorWeights Weighting factors for allocation of cells to processors (<wt1>…<wtN>)

strategy Decomposition strategy (optional) /

• Distributed data entries

distributed Is the data distributed across several disk? yes/no

roots Root paths to directories (<rt1>…<rtN>)

Tab. 1.3-1.5: coefficienti dei metodi di scomposizione.

Al completamento dell’utility decomposePar, verranno create N subdirectory rappresentanti il numero del processore e contenenti tutte le relative informazioni parziali.

(17)

8

1.6.2 Lancio di un caso scomposto

Per il lancio in parallelo su un calcolatore locale multiprocessore, è sufficiente sfruttare l’implementazione MPI presente in openFOAM. Per fare ciò è sufficiente lanciare la stringa di comando:

mpirun -np <nProcs> <foamExec> <otherArgs> -parallel > log &

dove <nProcs> rappresenta il numero di processor (coerente con la scompozione effettuata), <foamExec> rappresenta il solver impiegato (simpleFoam, icoFoam, ecc.) e <otherArgs> rappresenta eventuali opzioni.

Nel caso in cui un caso venga lanciato su più calcolatori attraverso un network, è necessario specificare i nomi di tali calcolatori in un apposito file. Per ulteriori informazioni su questo particolare caso si rimanda alla guida utente di openFOAM.

1.6.3 Ricostruzione del caso

Dopo l’esecuzione dei calcoli, è possibile ricostruire il caso iniziale con l’utility reconstructPar. Con tale comando si va a ricostruire, a partire dalle molteplici cartelle generate in seguito alla scomposizione e contenenti ciascuna una parte delle informazioni di campo, delle cartelle uniche, una per ciascun time-step di calcolo salvato, necessarie alle attività di post-processing.

Infine, è possibile visualizzare i risultati con software appositi qual Beta Cae. META o ParaView, con il secondo integrato nell’installazione del software e richiamabile rapidamente con l’utility

(18)

9

1.7 Il file PolyMesh

La mesh è parte integrante della soluzione e deve soddisfare alcuni requisiti per assicurare una soluzione valida e accurata. Prima di ogni esecuzione, openFOAM controlla sempre che un set di stringenti requisiti siano soddisfatti ed interrompe l’elaborazione nel caso che non lo siano.

In generale, openFOAM definisce una mesh come un insieme di celle poliedriche tridimensionali, confinate da facce poligonali arbitrarie. Una mesh di questo tipo è detta polyMesh.

La libertà sulla struttura concessa da openFOAM può creare complicazioni in caso di importazione di mesh realizzate con cad convenzionali, ma sta all’esperienza dell’utente e agli strumenti di check a disposizione riconoscere la buona qualità della mesh in fase di realizzazione.

In ogni caso, il set di condizioni base da rispettare riguarda:

1.7.1 Elementi della mesh

- Punti:

Un punto è una posizione nello spazio 3D, definita da un vettore. I punti sono elencati in una lista e a ciascuno corrisponde una posizione della lista stessa. Una lista di punti non può contenere due punti differenti in una stessa identica posizione e neanche punti che non appartengono a nessuna faccia. - Facce:

Una faccia è una lista ordinata di punti, a cui ci si riferisce indicando la sopracitata posizione, connessi tra loro da spigoli. A loro volta, le facce sono elencate in una lista e si fa riferimento a loro di nuovo con la posizione in lista. L’orientamento della normale alla faccia è definito con la regola della mano destra, seguendo la numerazione dei punti (oraria o antioraria).

(19)

10 Sono definiti due tipi di facce:

- Internal faces, che connettono due celle a contatto. La numerazione dei punti di tali facce è tale che la normale alla faccia punti verso la cella con la posizione maggiore.

- Boundary faces, che appartengono ad una sola cella dato che coincidono con il limite del dominio. In questo caso la numerazione dei punti della faccia è tale che la normale punti verso l’esterno del dominio.

Le facce sono generalmente convesse, ma è sufficiente che almeno il loro centro appartenga alla faccia stessa. Possono essere distorte, cioè non è necessario che tutti i punti di una faccia siano complanari.

- Celle:

Una cella è, a sua volta, una lista di facce in ordine arbitrario. Le celle devono avere le seguenti proprietà:

- Contigue. Le celle devono ricoprire l’intero dominio e non sovrapporsi; - Chiuse. Ogni spigolo deve essere comune ad esattamente due facce; - Convesse. Il centro di ogni cella deve appartenere ad essa;

- Ortogonali. Considerate due celle interne, l’angolo tra il vettore normale alla faccia di contatto e il vettore centro-centro deve essere sempre minore di 90°.

- Boundaries:

Un contorno è una lista di patches, ciascuna associata con una condizione al contorno. Una patch è una lista di facce contenenti solo facce di confine e non interne. Il contorno deve essere chiuso, cioè la somma di tutti i vettori normali alle facce esterne deve essere uguale a zero (a meno della tolleranza della macchina).

1.7.2 Struttura della polyMesh

Nella directory constant è contenuta la descrizione completa della polyMesh. Tale descrizione è basata sulle facce, a ciascuna delle quali viene attribuito un owner (“possessore”, la cella di appartenenza) e un neighbour (“vicino”, la cella a contatto). Nei casi di celle di contorno, al parametro ‘neighbour’ viene assegnato -1.

Il file di input/output della polyMesh è quindi così strutturato: - Lista di Punti;

- Lista di Facce, - Lista di Owners;

(20)

11 - Lista di Neighbours;

- Lista di Patches, contenente un dizionario per ciascuna (relativo alla condizione al contorno) e costituente il contorno stesso.

OpenFOAM è in grado di studiare anche casi mono o bi-dimensionali, utilizzando polyMesh 3D ed applicando speciali condizioni al contorno su alcune patches. In particolare, con la condizione ‘empty’ si disabilitano i calcoli nella direzione della normale alla superficie del contorno stesso.

1.7.3 Tipi di celle

openFOAM contiene le definizioni delle forme standard di celle più diffuse e leggibili dalla maggiorparte dei generatori di mesh disponibili sul mercato, questo allo scopo di permettere una corretta conversione di ciascuna di esse nel formato polyMesh già descritto.

La descrizione di un tipo di cella prende il nome di cellShape ed è definita come un elenco ordinato delle posizioni dei punti della cella stessa. Ad esempio, considerando il seguente elenco di 8 punti:

8 ( (0 0 0) (1 0 0) (1 1 0) (0 1 0) (0 0 0.5) (1 0 0.5) (1 1 0.5) (0 1 0.5) )

Una cella esaedrica sarebbe definita come: (hex 8(0 1 2 3 4 5 6 7)).

Dove con hex si definisce la forma esaedrica. Altre forme riconoscibili da openFOAM sono quelle riportate nella Figura 1.4 seguente.

(21)

12

1.7.4 Tipi di patches

Allo scopo di assegnare le condizioni al contorno, l’intera boundary del dominio è suddivisa in una serie di patches geometriche, a ciascuna delle quali viene attribuita una certa proprietà. In linea di massima tutte le patches in cui si va a suddividere l’intera boundary avranno come type la generica keyword patch, salvo in particolari casi di vincoli geometrici (ad es. symmetry o empty).

Le informazioni su tali proprietà sono presenti nel file boundary nella directory /polyMesh. Un esempio di tale file è il seguente:

6 ( inlet { type patch; nFaces 50; startFace 10325; } outlet { type patch; nFaces 40; startFace 10375; } bottom { type symmetryPlane; inGroups 1(symmetryPlane); nFaces 25; startFace 10415; } top { type symmetryPlane; inGroups 1(symmetryPlane); nFaces 125; startFace 10440; } obstacle { type patch; nFaces 110; startFace 10565; } defaultFaces { type empty; inGroups 1(empty); nFaces 10500; startFace 10675; } ) // ****************************************** //

A ciascuna delle sei patch si attribuisce una keyword (inlet, outlet…) che permetterà convenientemente di richiamare il relativo insieme di facce in sede di assegnazione delle condizoni fisiche al contorno.

(22)

13 Di seguito si riportano i possibili types assegnabili alle varie patches, estratti dal manuale utente di openFOAM:

patch

The basic patch type for a patch condition that contains no geometric or topological information about the mesh (with the exception of wall), e.g. an inlet or an outlet.

wall

There are instances where a patch that coincides with a wall needs to be identifiable as such, particularly where specialist modelling is applied at wall boundaries. A good example is wall turbulence modelling where a wall must be specified with a wall patch type, so that the distance from the wall of the cell centres next to the wall are stored as part of the patch.

symmetryPlane

For a symmetry plane. empty

While OpenFOAM always generates geometries in 3 dimensions, it can be instructed to solve in 2 (or 1) dimensions by specifying a special empty condition on each patch whose plane is normal to the 3rd (and 2nd) dimension for which no solution is required.

wedge

For 2 dimensional axi-symmetric cases, e.g. a cylinder, the geometry is specified as a wedge of small angle and 1 cell thick running along the plane of symmetry, straddling one of the coordinate planes. The axi-symmetric wedge planes must be specified as separate patches of wedge type.

cyclic

Enables two patches to be treated as if they are physically connected; used for repeated geometries, e.g. heat exchanger tube bundles. One cyclic patch is linked to another through a neighbourPatch keyword in the boundary file. Each pair of connecting faces must have similar area to within a tolerance given by the matchTolerance keyword in the boundary file. Faces do not need to be of the same orientation.

processor

If a code is being run in parallel, on a number of processors, then the mesh must be divided up so that each processor computes on roughly the same number of cells. The boundaries between the different parts of the mesh are called processor boundaries.

1.7.5 Generazione della Mesh

OpenFOAM è in grado di lavorare sia con mesh realizzate con software terzi, per le quali sono implementati numerosi convertitori nel formato polyMesh, sia con mesh realizzate appositamente con utilities dedicate, quali blockMesh o snappyHexMesh. Per l’analisi di queste utilities si rimanda alla guida utente del software openFOAM, dato che allo scopo della redazione di questo documento si è fatto uso del software dedicato BETA CAE. ANSA, mesher in grado di esportare autonomamente un modello nel formato richiesto.

(23)

14

1.8 Risolutori e proprietà fisiche

La scelta del risolutore (solver), tra i numerosi disponibili, richiede da parte dell’utilizzatore di effettuare alcune scelte riguardanti le condizioni iniziali e determina molti dei parametri e delle proprietà fisiche necessarie al corretto funzionamento della simulazione. In questo paragrafo ci si occuperà di discutere i modelli più comunemente utilizzati e le relative proprietà.

1.8.1 Condizioni al contorno

Impostare le giuste condizioni al contorno è vitale per una simulazione corretta, dato che condizioni malposte condurrebbero a predizioni sbagliate o fisicamente non ammissibili.

Le condizioni al contorno disponibili sono organizzate in categorie. Condizioni di base: - fixedValue - fixedGradient - mixed - … Condizioni di vincolo: - symmetry - wedge - empty - cyclic - … Condizioni derivate: - fixedProfile - swirlFlowRateInletVelocity - inletOutlet - codedFixedValue - …

Esistono più di 70 condizioni al contorno, consultabili in Appendice B.

Tali condizioni iniziali vengono indicate nei file relativi alle specifiche proprietà fisiche presenti nella directory /0 del caso in esame.

A titolo di esempio si riporta un file relativo al campo iniziale di pressione:

dimensions [1 -1 -2 0 0 0 0];

internalField uniform 1;

(24)

15 boundaryField { inlet { type fixedValue; value uniform 1; } outlet { type waveTransmissive; field p; psi thermo:psi; gamma 1.4; fieldInf 1; lInf 3; value uniform 1; } bottom { type symmetryPlane; } top { type symmetryPlane; } obstacle { type zeroGradient; } defaultFaces { type empty; } } //******************************************** // 1.8.2 Modelli termofisici

Vengono impiegati modelli termofisici per descrivere casi in cui giocano un ruolo importante l’energia termica, la comprimibilità o trasferimento di massa.

OpenFOAM consente alle proprietà termofisiche di essere costanti o funzioni di temperatura, pressione e composizione. L’energia termica può essere descritta in termini di entalpia o energia interna.

In generale, un modello termofisico è costituito come un sistema pressione-Temperatura dal quale le altre proprietà sono calcolate.

Considerando che lo studio dei fenomeni di natura termica non è stato parte delle prove effettuate al fine di redigere il presente documento, non verrà approfondito ulteriormente. Per ulteriori informazioni in merito si rimanda al paragrafo 5.2 della guida utente del software.

(25)

16

1.8.3 Modelli di turbolenza

Il modello di turbolenza impiegato è indicato nel file turbolenceProperties presente nella directory

/constant.

In tale file è possibile specificare il tipo di modello nel campo della keyword simulationType. È possibile scegliere tra laminar (nessuna modellizzazione della turbolenza), RAS (modellizzazione Reynolds-averaged stress) e LES (modellizzazione Large Eddy Simulation). Nel caso si scelga RAS o LES, la scelta del modello va specificata in un subdizionario RASModel compilando i seguenti campi:

- RAS

RASModel Name of RAS turbulence model

turbulence Switch to turn turbulence modelling on/off

printCoeffs Switch to print model coeffs to terminal at simulation startup <RASModel>Coeffs Optional dictionary of coefficients for the respective RASModel

- LES

LESModel Name of LES model delta Name of delta ∂ model

<LESModel>Coeffs Dictionary of coefficients for the respective LESModel <delta>Coeffs Dictionary of coefficients for each delta model

1.8.4 Il modello di turbolenza k SST

Il modello scelto per la risoluzione dei casi presentati nell’ambito di questo studio è stato il modello k⍵ SST (Shear Stress Transport), variante del modello k⍵, presentato da Menter nel 1994. Il modello nasce dall’unione del modello k⍵ di Wilcox e del modello kε modificato in modo tale da far comparire ⍵ nelle equazioni.

In questo modo si uniscono l’efficacia del primo modello vicino alle pareti e la poca sensibilità alle condizioni del flusso asintotico tipiche del secondo.

Le equazioni che costituiscono il modello sono: • Equazione per l’energia cinetica turbolenta k:

∂k ∂t + u*) ∂k ∂x, = P − β∗⍵k + ∂ ∂234(ν + σ8ν9) ∂k ∂x,; • Equazione per il rateo medio di dissipazione ⍵:

∂ω ∂t + u*) ∂ω ∂x, = > ν9P − β? @+ ∂ ∂234(ν + σAν9) ∂ω ∂x,; + 2(1 − DE) FG@ ω ∂k ∂x, ∂ω ∂x, Con P = 2ν9S2, S = (SijSij)1/2, Sij = 0.5 (∂ui / ∂xj + ∂uj / ∂xi).

La funzione F1 presenta un valore unitario vicino alla parete, attivando così il modello k⍵, mentre allontanandosene assume valore nullo, passando così al modello kε.

(26)

17 La viscosità turbolenta (nut nelle variabili openFOAM) è definita come:

ν9 = WEk

max( WE?, ΩD@)

Dove Ω è il modulo della vorticità. All’interno dello strato limite F2 = 1 e Ω > WE?, limitando il valore relativo alla viscosità turbolenta così da tenere in considerazione l’effetto di trasporto legato agli sforzi di Reynolds, termine importante in presenza di un gradiente di pressione avverso.

Allontanandosi dalla parete F2 si comporta in maniera analoga a F1, così da ricondurre l’espressione della viscosità turbolenta a quella del modello kε standard.

Le funzioni F1 ed F2 sono così definite: DE = tanh (WZ[E\) WZ[E = ]^_ 4max ` √b β∗⍵d, 500e f@?g , 4bFG@ ijkGf@; ijkG = max `2FG@ 1 ⍵ ∂k ∂x, ∂ω ∂x,, 10l@mg D@ = tanh (WZ[@@) WZ[@ = max `2 √b β∗⍵d, 500e f@?g

Ed infine sono elencate di seguito le costanti utilizzate dal modello: σ8E = 0.85 σ8@ = 1.0 σAE = 0.5 σA@ = 0.856 βE= 0.075 β@ = 0.0828 q∗ = 0.09 b = 0.41 aE = 0.31

(27)

18

La versione implementata in openFOAM del modello differisce per alcuni dettagli dal modello k⍵ SST appena descritto, con alcune modifiche volte fondamentalmente a migliorare la stabilità numerica del calcolo. In particolare, le funzioni arg1 e arg2 sono state riscritte come:

WZ[Etu = min(WZ[ E, 10) WZ[@tu = min(WZ[

@, 100)

dato che da esse può dipendere una eccessiva crescita dei valori, causa di instabilità numerica e divergenza delle soluzioni.

1.8.5 Funzioni di parete

Per risolvere le zone caratterizzate dalla presenza di uno strato limite, quindi in prossimità delle superfici solide, è necessario disporre di una mesh con un sufficiente numero di celle di calcolo in direzione ortogonale alle superfici stesse, a causa del forte gradiente di velocità generato dalla condizione di aderenza alla parete.

Generalmente, questa regola si traduce nell’assicurarsi che il nodo di calcolo più vicino alla parete si trovi all’interno del substrato viscoso dello strato limite, ad una distanza adimensionale y+ ≤ 1, con y+ definita come:

dove u* indica la velocità di attrito alla parete più vicina, y indica la distanza da tale parete e ν è la viscosità cinematica del fluido.

Con l’aumentare della velocità del flusso, si può osservare come la dimensione della prima cella di calcolo si riduca progressivamente, con una conseguente richiesta sempre maggiore di risorse di calcolo. Inoltre, questa riduzione di altezza comporta anche aspetti delle singole celle sempre più schiacciati, e ciò può essere causa di problemi numerici in sede di elaborazione.

Per ovviare a questi problemi, sono stati sviluppati dei modelli alternativi, basati sull’osservazione di come l’andamento della velocità nello strato limite, detto legge di parete, abbia un carattere di tipo universale, ovvero indipendente dal tipo di flusso analizzato (se scalato opportunamente).

Con questa osservazione, si può assumere di conoscere a priori il comportamento del flusso all’interno del substrato viscoso e del buffer layer (Fig. 1.5), e di conseguenza è sufficiente andare a

(28)

19 posizionare il primo nodo della griglia di calcolo all’interno della regione logaritmica del flusso, ovvero a 30 < y+ < 300.

Fig. 1.5: Funzioni di parete.

Con questa assunzione, è possibile classificare i modelli di calcolo in due gruppi:

• Modelli di basso Reynolds: così detti perché il numero di Reynolds, calcolato con la velocità media interna alla prima cella di calcolo e la sua dimensione verticale, sarà basso, a causa delle dimensioni ridotte;

• Modelli di alto Reynolds: così detti perché il numero di Reynolds, calcolato con la velocità media interna alla prima cella di calcolo e la sua dimensione verticale, sarà più alto, a causa delle dimensioni maggiori;

Nell’ambito del presente elaborato è sempre stato utilizzato il modello k⍵ SST, in grado di fare uso delle funzioni di parete appena descritte e così consentire l’utilizzo di griglie meno raffinate e maggiormente idonee all’esecuzione sulle singole workstation a disposizione.

Per questo motivo, le varie griglie di calcolo impiegate presenteranno tutte quante una distanza adimensionale dalle pareti di almeno y+ = 30.

Va però osservato come non sia possibile stabilire con certezza la dimensione corrispondente ad una y+ corretta senza aver prima risolto l’intero campo di velocità (dato che da questo dipende il valore di u*), fortunatamente esistono delle utilities (tra cui una fornita direttamente assieme al software di meshing ANSA) che permettono di effettuarne una stima ragionevole. Va tenuto presente che il valore di y+ richiesto è diverso da punto a punto lungo la parete, ma per utilizzare le funzioni di parete è sufficiente che tale valore sia al minimo pari a 30, e non è un problema se in altre zone del campo

(29)

20 tale valore aumenta ulteriormente purchè rimanga sempre inferiore a circa 300, come indicato dai manuali utente di alcuni software commerciali.

In openFOAM è disponibile un limitato range di funzioni di parete applicabili come condizioni al contorno. La scelta di tale funzione è specificabile nei file relativi a ciascuna variabile nella directory /0, esattamente come ogni altra condizione al contorno.

Ad esempio, per quanto riguarda la variabile nut (viscosità turbolenta) avremo:

. . dimensions [0 2 -1 0 0 0 0]; internalField uniform 0; boundaryField { movingWall { type nutkWallFunction; value uniform 0; } fixedWalls { type nutkWallFunction; value uniform 0; } frontAndBack { type empty; } } //******************************************* //

Per la variabile nut sono disponibile alcune funzioni alternative, quali nutkWallFunction, nutUWallFunction, nutUSpaldingWallFunction. Per una descrizione approfondita di ciascuna di esse, si rimanda il lettore alla guida utente del software openFOAM.

(30)

21

1.9 Risoluzione di un caso

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

(31)

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); } } } } }

(32)

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; } // ****************************************** //

(33)

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.

(34)

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.

(35)

26

1.10 Gestione e Monitoraggio dei casi

Questo paragrafo si concentra sul lancio dei casi openFOAM. Quando un risolutore viene lanciato, riporta come output standard (cioè a terminale) lo status della soluzione di ciascuna equazione. Ad esempio, l’inizio della soluzione del caso tutorial cavity è riportato di seguito e vi si può vedere come per ciascuna equazione venga scritta in output una linea di report relativa alla variabile risolta, assieme ai suoi residui iniziale e finale per quella data iterazione.

Starting time loop Time = 0.005

Max Courant Number = 0

BICCG: Solving for Ux, Initial residual = 1, Final residual = 2.96338e-06, No Iterations 8 ICCG: Solving for p, Initial residual = 1, Final residual = 4.9336e-07, No Iterations 35

time step continuity errors : sum local = 3.29376e-09, global = -6.41065e-20, cumulative = -6.41065e-20 ICCG: Solving for p, Initial residual = 0.47484, Final residual = 5.41068e-07, No Iterations 34

time step continuity errors : sum local = 6.60947e-09, global = -6.22619e-19, cumulative = -6.86725e-19 ExecutionTime = 0.14 s

Time = 0.01

Max Courant Number = 0.585722

BICCG: Solving for Ux, Initial residual = 0.148584, Final residual = 7.15711e-06, No Iterations 6 BICCG: Solving for Uy, Initial residual = 0.256618, Final residual = 8.94127e-06, No Iterations 6 ICCG: Solving for p, Initial residual = 0.37146, Final residual = 6.67464e-07, No Iterations 33

time step continuity errors : sum local = 6.34431e-09, global = 1.20603e-19, cumulative = -5.66122e-19 ICCG: Solving for p, Initial residual = 0.271556, Final residual = 3.69316e-07, No Iterations 33

time step continuity errors : sum local = 3.96176e-09, global = 6.9814e-20, cumulative = -4.96308e-19 ExecutionTime = 0.16 s

Time = 0.015

Max Courant Number = 0.758267

BICCG: Solving for Ux, Initial residual = 0.0448679, Final residual = 2.42301e-06, No Iterations 6 BICCG: Solving for Uy, Initial residual = 0.0782042, Final residual = 1.47009e-06, No Iterations 7 ICCG: Solving for p, Initial residual = 0.107474, Final residual = 4.8362e-07, No Iterations 32

time step continuity errors : sum local = 3.99028e-09, global = -5.69762e-19, cumulative = -1.06607e-18 ICCG: Solving for p, Initial residual = 0.0806771, Final residual = 9.47171e-07, No Iterations 31 time step continuity errors : sum local = 7.92176e-09, global = 1.07533e-19, cumulative = -9.58537e-19 ExecutionTime = 0.19 s

1.10.1 Lo script foamJob

L’utente potrebbe voler monitorare i residui, le iterazioni, il numero di Courant ecc. al passare dei dati sul terminale. Per fare ciò è conveniente reindirizzare il report in un file log, per aumentare la velocità di calcolo. Lo script foamJob prevede opzioni utili a questo scopo, lanciando il risolutore come indicato nella seguente stringa:

foamJob <solver>

Il reindirizzamento del report nel file log è effettuabile anche a simulazione già avviata, semplicemente aggiungendo le nuove istruzioni con il comando tail:

(36)

27

1.10.2 Lo script foamLog

Può essere difficile estrarre informazione da un log file su un lungo periodo di tempo. Lo script

foamLog viene apposta fornito per estrarre i dati relativi ai residui, alle iterazioni, al numero di

Courant ecc. dal log file e presentarli in un set di files pronti ad essere plottati graficamente. Tale script viene lanciato digitando:

foamLog <logFile>

I file sono salvati in una subdirectory del caso chiamata logs. Ogni file è rinominato <var>_<subIter>, dove <var> è il nome della variabile e <subIter> è la relativa iterazione.

Per i residui vale la stessa nomenclatura con aggiunto <FinalRes>. Di default i dati sono presentati in un formato a due colonne, iterazione e valore estratto.

1.11 Post-Processing

OpenFOAM è fornito assieme ad un utility di post processing, paraFoam che, se richiamata, apre automaticamente il caso con il software opensource di visualizzazione ParaView. In alternativa, è possibile aprire il caso dopo aver avviato il software ParaView a patto di aver creato precedentemente nella cartella del caso un placeholder del tipo” nomecaso.foam”, azione effettuabile facilmente lanciando l’utility touch.foam direttamente da shell.

Rimane comunque possibile appoggiarsi a prodotti di terze parti, quali EnSight, FieldView o Fluent. Per un approfondimento relativo a questi software, si rimanda sia alla guida utente di openFOAM che alle guide utente di ciascun software elencato, dato che allo scopo di redigere la presente tesi non è stato necessario impiegarli.

(37)

28

Capitolo 2: Studio di un profilo alare

2.1 Presentazione del caso

Come caso introduttivo all’analisi di OpenFOAM è stato preso in considerazione un profilo NACA 64212, di cui sono note le caratteristiche aerodinamiche, e si è tentato di verificare che OpenFOAM fosse in grado di restituire risultati compatibili attraverso una analisi bidimensionale.

Tale analisi è stata articolata in due parti: la prima, volta a convalidare i settaggi utilizzati, effettuata quindi nelle stesse condizioni delle prove sperimentali descritte nel testo “Theory of Wing Sections” di I. H. Abbott, e la seconda, in presenza di una parete, volta a studiare l’effetto della vicinanza del suolo al variare della distanza dal profilo da esso.

2.1.1 NACA 64212

Il profilo alare scelto è il NACA 64212 in configurazione deportante, impiegato in campo automobilistico per la realizzazione di alettoni. Le caratteristiche del profilo sono riportate nella Figura 2.1 seguente:

(38)

29 In condizioni di incidenza nulla, con flusso non confinato e con numero di Reynolds pari a 3*106, i valori di riferimento di CL e CD sono rispettivamente:

CL = -0.157 CD = 0.0048

Va ricordato che tali valori sono stati ricavati empiricamente e non numericamente, con conseguenze non trascurabili di cui sarà tenuto conto nei paragrafi successivi.

Per completezza, si riportano le caratteristiche geometriche del profilo: c = 0.6 m;

t/c = 0.12 a x/c = 0.4; f = 1.1% a x/c = 0.5.

2.2 Creazione del modello

Il modello CAD realizzato per la simulazione è stato disegnato per punti con il software CATIA a partire dalle tabelle disponibili sul sito aerofoiltools.com.

Per replicare il caso di riferimento, il modello è stato confinato in un box di dimensioni sufficienti a ristabilire il corretto flusso asintotico alle pareti superiore e inferiore.

Per la precisione il dominio impiegato è largo 15 corde a monte e a valle del profilo e 10 corde sopra e sotto (Figura 2.2). I modelli di box impiegati per lo studio dell’effetto suolo verranno descritti successivamente.

(39)

30 Per poter essere importato in OpenFOAM, il modello 2D descritto deve essere estruso nella terza direzione (Y in Fig. 2.2), dato che i risolutori inclusi non prevedono la possibilità di risolvere un caso completamente bidimensionale.

Ciononostante, è possibile limitare i calcoli alle due sole direzioni principali (X e Z in figura), rendendo la soluzione indipendente dallo “spessore” del modello, ovvero dalla profondità della singola cella estrusa. In ogni caso, per semplicità, è stato scelto uno spessore di 1 millimetro.

2.3 Meshing

Tutte le operazioni di meshing dei modelli impiegati nel presente elaborato sono state eseguite con il software ANSA di BETA CAE. Systems. Il software è ottimizzato per l’uso con OpenFOAM e prevede la possibilità di generare direttamente i file contenenti i settaggi e la descrizione del dominio di calcolo in un formato (binario o ASCII) leggibile dai solver disponibili.

Come già detto, per la risoluzione di casi bidimensionali OpenFOAM richiede l’ulitizzo di mesh ad elementi prismatici estrusi lungo la terza direzione. È stata utilizzata quindi una mesh ibrida, di tipo strutturato attorno al profilo (prism layer) e non strutturato per il resto del dominio (Fig. 2.3).

Riferimenti

Documenti correlati

E infine, ancora a dimostrazione dell’autenticità della proposta di Rodari di far squadra con bambini e ragazzi e di dare significato profondo alla parola, viene riportata una

445/2000 e che, inoltre , qualora dal controllo effettuato emerga la non veridicità del contenuto di taluna delle dichiarazioni rese, decadrà dai benefici conseguenti al

In questa tesi viene proposto un verificatore che ottimizza l’utilizzo delle risorse attraverso una analisi del grafo di flusso del codice: l’idea di base è di scomporre il codice

Both case studies seem instead to support the resistance principle (adapted from Guardiano et al., 2016), whereby language contact fosters, and never suppresses, language

Lunghezza massima: 200 caratteri Telefono Sede Legale * Campo obbligatorio.. Email dell'Ente Sito Web Sede Legale Indirizzo Sede Operativa Telefono

Colore: Beige rosato superficie esterna ed interna.. Grigio in

The lower rate of acute toxicity in our study, with a consequent acceptable rate and duration of treatment breaks is notable, since overall treatment time is of paramount im-

12.5 – Caratteristiche geometriche della spalla e azioni dovute al peso proprio