header blog

Blog R&D

Storie di innovazione e facili tutorial per conoscere il mondo dell'opensource

Questa guida è una traduzione in italiano, un po' rivisitata, dell'ottima “Tips and tricks in OpenFOAM” scritta dai ragazzi di www.wolfdynamics.com che ringrazio personalmente.

This is just a translation, if you are looking for the english version take a look at the complete original guide written by the guys of www.wolfdynamics.com


Capitolo #1 : la mesh – trucchi e suggerimenti

mesh OF

 

A livello generale per qualsiasi software CFD ai volume finiti la mesh, o griglia di calcolo, è un elemento fondamentale per la buona riuscita della simulazione. Ricordate che il computer per definizione è un moltiplicatore, pertanto: spazzatura in ingresso = spazzatura in uscita, oppure rileggendolo in forma positiva: buona mesh = buoni risultati. A fronte dell’esperienza maturata negli anni non mi stancherò mai di ripeterlo in questa guida: per ottenere risultati di qualità serve  una mesh di altrettanta buona qualità, una mesh non idonea porta a risultati falsati, quindi totalmente inutili, o addirittura “all’esplosione” della simulazione per mancata convergenza. Provare a correggere la simulazione attraverso schemi di risoluzione più robusti può migliorare la situazione ma non è in grado di risolverla completamente. Il consiglio è sempre quello di rigenerale la mesh (anche se costa ore di calcolo) e quindi procedere con la simulazione. Ma come faccio a sapere se la mia mesh è idonea?


checkMesh

Ogni programma ha il suo strumento di analisi e pertanto anche OpenFOAM ha la sua utility: checkMesh che è possibile lanciare dal terminale aperto nella cartella della simulazione. checkMesh, come dice il nome stesso, controlla la mesh presente nella cartella e fornisce un report finale che indica la presenza o  meno di errori e la loro tipologia.

checkMehs inoltre è in grado di salvare tutte le celle “difettose” (inclusi le facce e i punti problematici) in un dataset all’interno della cartella constant/polyMesh/sets/. Convertendoli in formato VTK attraverso il comando foamToVTK è possibile aprire questo dataset in paraFoam o paraview e visualizzare direttamente cosa “non piace” a OpenFOAM della vostra mesh.


Linee guida generali per una mesh a scopo CFD.

Queste regole sono valide anche per altri software, cito ad esempio Code_Saturne sviluppato dall’EDF, in quanto sono “naturale conseguenza” delle dinamiche risolutive del metodo ai volumi finiti. Facendo una breve lista:

  • Minimizzare il più possibile la non-ortogonalità tra le celle
  • Evitare rapporti di forma troppo elevati nelle celle, specialmente vicino alle condizioni al contorno
  • Evitare fattori di crescita (growth rate) troppo elevati in quanto portano a gradienti di dimensione cella troppo forti (zone a celle molto piccole vicino a celle troppo grandi)
  • Evitare inoltre forti gradienti dimensionali in direzione normale alle condizioni al contorno vicino agli ingressi e all’uscita del fluido
  • Come regola generale nelle pareti sottili: discretizzare lo spessore facendo in modo che vi siano almeno 3 o più celle. A questo scopo tornano molto utili le funzioni layer-mesh definite anche viscous-layer durante la formulazione della mesh.

Suggerimento finale : renumberMesh

Prima di lanciare una simulazione può essere molto utile eseguire il comando renumberMesh. Questa utility rinumera la mesh compattandone la banda e rendendola quindi più facilmente risolvibile. Ciò significa che il risolutore lineare sarà in grado di procedere più velocemente (almeno per i primi time-step) ed è pertanto un’ottima abitudine da eseguire sempre dopo  il checkMesh e prima dell’inizio del calcolo, specialmente per le mesh di grandi dimensioni.

Il principale utilizzo della fluidodinamica computazione (CFD) è quello di risolvere un dominio composto da uno o più fluidi in movimento atraverso le equazioni di Navier-Stokes. La risoluzione per via analitica di queste equazioni è fattibile solamente in casi semplici con flussi laminari, e geometrie semplici (sfere, lastre piane), mentre le risoluzioni di casi reali, in cui compaiono di frequente flussi turbolenti, richiedono necessariamente un approccio numerico approssimato, ovvero in cui qualcosa viene semplificato o trascurato, al fine di ridurre drasticamente il costo computazionale mantenendo comunque un risultato significativo.

 RANSvsLES img1


Esistono quindi diversi metodi per risolvere le equazioni di Navier-Stokes:

   Direct Numerical Simulation (Simulazione Numerica Diretta: DNS): è l'approccio concettualmente più semplice, si discretizzano lo spazio e il tempo con griglie della dimensione voluta e si eseguono i calcoli su esse. È l'approccio che restituisce i risultati più accurati ma ha un costo computazionale elevatissimo, devono essere impiegati dei supercomputer. Per le applicazioni industriali risulta quindi troppo dispendioso.

   Reynolds Averaged Navier-Stokes (Equazioni mediate alla Reynolds: RANS): si basano sull'assunzione che si possa vedere il moto turbolento come formato da un moto medio e da una sua fluttuazione nel tempo. Le grandezze delle equazioni di partenza vengono mediate in un certo intervallo di tempo; così facendo i tempi di calcolo vengono notevolmente ridotti in quanto le scale del moto medio risultano essere notevolmente maggiori di quelle del moto turbolento. Richiedono l'utilizzo di ulteriori set di equazioni (ad esempio il modello turbolento k-ε) per mantenere chiuso il bilancio fisico del problema.

   Large Eddy Simulation (LES): consiste nel calcolare numericamente il comportamento delle scale turbolente più grandi e “tagliare” opportunamente attraverso un filtro le scale più piccole (Sub-grid Scale o scale di Kolmogorov). Fornisce risultati più accurati ad un costo computazionale leggermente superiore delle RANS ma al contempo notevolmente inferiore a quello della DNS, per questo motivo è un metodo in forte sviluppo.


Nel software opensource Code Saturne, sviluppato da EDF, è possibile impostare la risoluzione del modello sia con i metodi RANS sia con i metodi LES. Nel video allegato la differenza di modellizzazione per lo stesso condotto a T in cui due fluidi si incontrano a velocità diverse e si mischiano per proseguire lungo il condotto.

L’accortezza dell’operatore sta nella realizzazione della griglia di calcolo (mesh) in modo che sia ottimizzata per un metodo piuttosto che per un altro e nella scelta del modello più opportuno per la scala temporale che si intende analizzare. La precisione di un risultato è sempre un costo ed è opportuno sapere esattamente il livello di dettaglio necessario per risolvere in maniera affidabile il problema senza “spendere” troppo. Risulta quindi ovvio che non ha senso calcolare tutti i vortici “istantanei” in una simulazione semi-stazionaria (flussi mediamente stabili nel tempo) e quindi convengono i metodi RANS per costo computazionale e rapidità di soluzione. Allo stesso modo non ha senso utilizzare metodi LES su griglie troppo grossolane in quanto il software non avrebbe modo di risolvere correttamente il movimento turbolento.

 

Le nuove tecniche di produzione, ad esempio la stampa 3D o più genericamente l'additive manufacturing, permettono di estremizzare il concetto di geometria liberandosi dai vincoli di formatura delle tecniche convenzionali. Non è quindi un caso che l'ottimizzazione topologica negli ultimi anni stia guadagnando sempre più appeal nella progettazione di componenti strutturali. L'approccio dell'ottimizzazione topologica consiste nell'impiegare materiale solamente dove è strettamente necessario a sostenere i carichi di impiego. In questo modo è possibile sfruttare in maniera omogenea il materiale e ottenere al contempo componenti notevolmente alleggeriti. Proprio la possibilità di risparmiare preziosa materia prima e di ridurre il peso complessivo del componente (minori consumi in un veicolo = minori emissioni) rendono l'ottimizzazione topologica un processo estremamente "green". L'ottimizzazione topologica può quindi diventare il fattore chiave della progettazione del futuro, consentendo di rientrare nei sempre più stringenti vincoli ambientali promossi dagli enti normativi.

ARGO srl, grazie alla maturata esperienza nei software opensource, contribuisce attivamente allo sviluppo di una piattaforma libera per il calcolo di geometrie ottimizzate.

I primi algoritmi, liberamente disponibili alla pagina dedicata, sono ereditati dal lavoro di Frederic Renou sugli algoritmi SIMP sviluppati per il software Code_aster. 

Come esempio di ottimizzazione topologica su di una geometria semplice è stato pubblicato un video disponibile a questo link.


 

 

In questo terzo tutorial verrà illustrata la grande flessibilità del software Code_Aster nella gestione di condizioni al contorno particolari. L'esempio riguarda il raffreddamento per immersione in un bagno temprante di un componente in acciaio. Nei tutorial precedenti il raffreddamento era guidato da un coefficiente di scambio termico h [W/m^2 K ] costante; in realtà tale coefficiente subisce forti variazioni in funzione della temperatura superficiale del componente. Un generico mezzo temprante in fase liquida (sia acqua che olio) attraversa infatti 3 fasi di raffreddamento dette :

- film boiling : valori di coeff. h bassi

- nucleation/bubble boiling : valori di coeff.h molto alti

- convezione naturale : valori di coeff. h medio/bassi

 Nell'immagine sottostante un esempio di quanto il coefficiente di scambio per l'acqua e per l'olio possa variare durante le fasi di raffreddamento.

Fonte : ALD VACUUM TECHNOLOGIES

 A livello numerico la simulazione di un raffreddamento con coefficiente h variabile con la temperatura diventa pertanto non lineare in campo termico, Code_Aster in questi casi prevede l'utilizzo della funzione THER_NON_LINE.

La condizione al contorno di scambio termico tuttavia non prevede un coefficiente h funzione della temperatura h(T) ma solamente funzione del tempo : h(t); bisogna quindi sviluppare una condizione al contorno, definita dall'utente, che gestisca lo scambio di calore alla superficie.

Inizialmente vengono inseriti nel software i valori di coefficiente h in funzione delle diverse temperature di superficie, quindi vengono interpolati in modo lineare su tutto il dominio generando così la funzione "hT"; si definisce quindi la FORMULA "hec" (heat exchange coefficient) dello scambio termico funzione della temperatura T.

hec(T) = hT(T) * (Text - T) 

con Text la temperatura del bagno di tempra.

L'algoritmo di simulazione è stato testato su di un generico componente di media complessità a forma cilindrica ottenuto da GrabCad. Il componente alla temperatura di 850° in acciaio è stato immerso in un bagno di tempra a base olio. In questa simulazione per semplicità è stato considerato un tempo di immersione così ridotto da trascurare la velocità di ingresso nel bagno temprante. Di seguito i profili di temperatura rispettivamente dopo 2 e 10 secondi dall'immersione.

 

Profili di temperatura alla superficie ed in sezione dopo 2 secondi
Profili di temperatura alla superficie ed in sezione dopo 10 secondi

 CONCLUSIONI

Si può notare come, a causa dei diversi regimi di raffreddamento implementati, il gradiente di temperatura tra superficie e cuore varia in maniera non lineare rispetto al tempo: dopo 2 s il deltaT è di circa 200°C mentre dopo 10 s il deltaT è aumentato a 340 °C per poi ridursi via via che si raggiunge la temperatura di equilibrio del bagno. Questo avviene perchè alcune zone raggiungono una velocità di raffreddamento superiore ( passaggio tra film boiling e nucleation boiling) alcuni istanti prima di altre e questo fa si che la forbice di valori si allarghi notevolmente.

 

In questo secondo tutorial di Code_Aster verrà trattato il tema delle deformazioni indotte da uno shock termico o da un generico raffreddamento brusco in un componente metallico, sarà pertanto necessario accoppiare l'analisi termica ad un'analisi meccanica (sforzo-deformazione).

Durante la tempra (raffreddamento improvviso) di componenti dalla geometria complessa è importante trovare la disposizione o orientamento che minimizza le deformazioni e le tensioni residue. Nella realtà il raffreddamento non è omogeneo; è impossibile infatti che tutte le facce del componente vengono raffreddate nello stesso identico istante. Per questo motivo è opportuno inserire nella simulazione, come condizione al contorno, la direzione e la velocità di immersione nel bagno di tempra.

Nel tutorial viene introdotta una funzione arbitraria per la gestione della condizione al contorno superficiale durante l'immersione. La funzione generata è una funzione logistica in quanto l'obiettivo dichiarato è avere una variazione brusca del coefficiente_h ma non istantanea. Tale funzione ha come variabili la direzione di immersione (coordinata Z ad esempio) e il tempo (INST). Il componente utilizzato, un generico carter di forma mediamente complessa, è stato scaricato da GrabCad .

Sono state simulate due direzioni di immersione, scelte in modo arbitrario, allo scopo di evidenziare il raffreddamento non omogeneo e conseguentemente la differente distribuzione di tensioni residue nel pezzo alla fine del trattamento.


 


 

RISULTATI

 

Distribuzione di temperatura nella configurazione Z dopo 1,2 secondi dall'immersione

 

Tensioni residue dopo raffreddamento in configurazione Y

 

Tensioni residue dopo raffreddamento in configurazione Z

CONCLUSIONI 

Come era possibile aspettarsi, la direzione lungo Y genera maggiori tensioni residue all'interno del pezzo rispetto alla direzione Z. La disposizione "di piatto" (lungo Z) del carter in lega d'alluminio durante il ciclo di trattamento sembra pertanto da preferirsi per diminuire sia le deformazioni sia gli stress residui da tempra

 

Le immagini ottenute attraverso un microscopio a scansione elettronica (SEM) sono, per vincoli tecnici, ricostruzioni in bianco e nero (toni di grigio) della superficie osservata . Attualmente lo standard di pubblicazione di riviste con alto fattore di impatto richiede che tali immagini vengano colorate per aumentarne la profondità di campo e migliorarne la visualizzabilità. Esistono svariati metodi di complessità crescente per aggiungere colore alle immagini SEM. In questa prima guida verrà introdotto un metodo relativamente semplice per aumentare la profondità di campo a partire da una singola immagine utilizzando il software opensource GIMP (https://www.gimp.org/). Di seguito la procedura in pochi semplici passi:

1- Importare l'immagine in GIMP.

2- Convertirla in formato a colori (RGB) : Immagine -> Modalità -> RGB.

3- Generare due immagini identiche sovrapposte : Livello -> Duplica Livello.

4- Dal pannello laterale Livelli  ridurre l'opacità del livello più alto (livello 2) ad un valore compreso tra il 50% ed il 70%, a seconda del tipo di immagine.

5- Colorare il livello 1 (ad opacità 100%) : selezionare il livello 1 quindi  Colori -> Colora . Selezionare un colore di fondo dell'immagine dosandone anche saturazione e luminosità.

6- Intervenire sul livello 2 : selezionare il livello 2 quindi Colori -> Bilanciamento colore . In questa fase non esiste una regola precisa, generalmente operando su alte luci e ombre è possibile generare sfumature colorate in grado di aumentare il livello di profondità fittizia dell'immagine.

7- Ripetere il punto 4 fino a trovare la condizione di equilibrio desiderata.

8- Lavorare sul contrasto del livello 2 : Colori -> Luminosità-contrasto . Apportare piccoli cambiamenti al contrasto, generalmente aumentandolo, può portare ad un risultato sensibilmente migliore.

Nota: bisogna porre attenzione a non rovinare la risoluzione sgranando o "bruciando" (sovraesposizione) i colori durante le modifiche.

 

Fonte : http://remf.dartmouth.edu/images/insectPart3SEM/source/25.html

 

 

Fonte: http://www.azonano.com/article.aspx?ArticleID=3646

L.THEME