Prestazioni e analisi delle mesh

In questo articolo vedremo come è possibile ottimizzare le prestazioni per il calcolo di una semplice geometria utilizzando delle griglie appropriate ed in particolare come varia la velocità di calcolo per griglie costituite da triangoli o quadrangoli, oltre che in base alla densità della griglia di calcolo.
Come dominio si è utilizzato quello rappresentato nella seguente figura (le dimensioni sono indicate in metri):
Dimensioni e struttura della geometria sottoposta ad analisi.

Il tutto è stato risolto per un caso bidimensionale e usando il risolutore simpleFoam (ovvero adatto a un fluido non comprimibile e viscosità costante) e usando le caratteristiche tipiche dell'acqua. E' evidente che nel caso di geometrie tridimensionali le differenze che si riscontreranno saranno ancora più accentuate.

L'ingresso avviene dalla parete superiore sinistra (INLET) con una velocità di 5m/s e l'uscita è dalla parete inferiore destra (OUTLET) dove viene ipotizzata una pressione nulla opposta al flusso del fluido.
Le ipotesi per le pareti sono di assenza di scorrimento lungo di esse.

Le mesh sono state generate tramite gmsh e utilizzando dei parametri, per permettere di modificare la densità della griglia di calcolo senza dover ricostruire il modello per le differenti mesh. Potete scaricare i file necessari per la generazione di mesh triangolari e rettangolari.

Per le mesh rettangolari il parametro da modificare per variare la densità della griglia è nm che indica la quantità di elementi in cui viene suddiviso ogni decimetro della struttura, è evidente che la densità della griglia è proporzionale al quadrato di questo parametro ed in particolare il numero di elementi che la compongono è pari a:
180 * nc^2
Per la modificare la densità delle mesh triangolari è necessario modificare il parametro lc che indica quanto densa deve essere la griglia.

La generazione della mesh viene effettuata da shell tramite il seguente comando:
gmsh -3 file_input.geo -o file_mesh.msh
ove, ovviamente, andranno utilizzati i nomi appropriati per i file in ingresso e uscita.

Per la realizzazione del caso da studiare tramite OpenFOAM si rimanda agli articoli precedenti, in particolare si veda Esempio di simulazione con OpenFOAM e Seconda simulazione.
L'importazione della mesh prodotta precedentemente a gmsh avviene tramite il comando:
gmshToFoam root case file_mesh.msh
Dove ovviamente andranno modificati i parametri necessari.

Di seguito sono riportate le mesh ricavate. Per ognuna di esse trovate il tipo di elementi utilizzati per la realizzazione della griglia di calcolo il valore del parametro (nm o lc) utilizzato e il numero di elementi che la compongono. Per evitare di inserire molte immagini ripetitive viene riportato solo la mesh meno densa, le altre le pote visualizzare presso seguendo i link indicati.
Maggiori informazioni su ogni griglia possono essere ottenuti tramite il comando checkMesh.

Mesh triangolari

Triangolare - lc = 0.07 - 752

Mesh rettangolari

Rettangolare - nm = 2 - 720

Una volta terminata l'importazione della mesh è necessario andare a modificare le tipologie delle pareti, in particolare è necessario settare, dal file case_name/constant/polyMesh/boundary:

  • patch0 - patch
  • patch1 - patch
  • patch2 - patch
  • patch3 - empty
  • defaultFaces - empty

Trovate il file boudary già pronto per uno dei vari casi che andremo risolvere in questo articolo.

L'operazione successiva è l'impostazione delle condizioni al contorno della nostra simulazione. Trovate un esempio già completo allegato a questo articolo.

Per l'esecuzione della comparazione sono state effettuate diverse prove per le farie tipologie di mesh in base al numero di elementi che la compongono. Come macchina di calcolo è stata utilizzata una CPU ADM 1700+ (operante a 1466MHz) equipaggiata di 768MB di RAM (operante a 200MHz) su cui si trova un sistema Linux con kernel 2.6.17.10

A seguito delle simulazioni svolte si sono riscontrati i seguenti risultati:

Mesh triangolare

Numero di elementi della griglia Tempo di calcolo (s) *
752 22,64
1451 47,03
2329 84,79
4106 203,42
9327 902,25
16528 2481,25

Mesh rettangolare

Numero di elementi della griglia Tempo di calcolo (s) *
720 15,74
1620 45,82
2880 99,2
4500 216,4
11520 1168,88
18000 2592,17

*) Il tempo di calcolo è stato misurato considerando l'utilizzo effettivo della CPU, escludendo i tempi di I/O sull'hard disk della macchina usata come sistema di calcolo. Nel caso si fosse utilizzato un sistema di calcolo distribuito sarebbero stati esclusi i tempi di latenza della rete che portano ad un aumento ulteriore del tempo di risoluzione.

Di seguito è visibile il grafico che paragona le prestazioni (come tempo di calcolo) ottenuto utilizzando le due diverse tipologie di griglie, ove risulta evidente una diminuzione di circa il 10% delle tempistiche di calcolo per le griglie rettangolari rispetto le griglie con pari numero di elementi triangolari.

Grafico paragone delle tempistiche di calcolo

I risultati ottenuti per le diverse simulazioni svolte sono stati graficati considerando a velocità del flusso dopo 100 e 1000 secondi dall'inizio del flusso per ogni tipo di griglia risolta. Onde evitare di rendere troppo lungo il seguente articolo potete visualizzarle cliccando sui link seguenti.

Mesh triangolari

Mesh rettangolari

Per i nostri fini ci limitiamo a considerarne alcune, in particolare è evidente che, per griglie rettangolari, quindi caratterizzate da una elevata regolarità, usando un numero insufficiente di elementi (inferiori al migliaio) il sistema non porta ad una soluzione stabile, infatti come risultato si ha solution singularity. Ciò non avviene per mesh triangolari, poiché le irregolarità nella griglia portano il sistema ad essere più elastico e a gestire anche situazioni limite (seppur con tutte le approssimazioni che ne derivano).

Utilizzando un numero di elementi della griglia maggiori (ma inferiori alla decina di migliaia) si può notare che in entrambi i casi (mesh triangolari e rettangolari) a 100s dall'inizio non si notano in maniera evidente le ricircolazioni dei flussi in prossimità della parete sinistra inferiore e dei due setti intermedi.

Velocità per mesh (4500 elementi) rettangolare a 100s

Velocità per mesh (4106 elementi) rettangolare a 100s

Aumentando il numero di elementi della griglia (superiore alla decina di migliaia) il sistema tende a rappresentare im maniera più precisa il sistema reale, a scapito dei tempi di calcolo necessari. E' altresì evidente che aumentando il numero di elementi della griglia tende a ridursi la differenza dei risultati ottenuti tra mesh rettangolari e triangolari.

Velocità per mesh (18000 elementi) rettangolare a 100s

Velocità per mesh (16528 elementi) rettangolare a 100s

E inoltre arrivando a 1000s dall'inizio i risultati ottenuti sono gli stessi:
Velocità per mesh (18000 elementi) rettangolare a 1000s

Velocità per mesh (16528 elementi) rettangolare a 1000s

AttachmentSize
boundary1.25 KB
triangoli.geo1.05 KB
rettangoli.geo1.86 KB
simulation_case.tar.gz173.61 KB

Comments

Gmsh

Hi there,
How did you get the rectangular mesh? Did you use gmsh to generate it? I'm sorry, I don't read italian (only english + portuguese). It looks like you have a lot of useful information that can be used by a openfoam newbie like me. Also, it looks like the links for the images on your webpage are not working.....

Keep up with the great work!

Thanks,
Bruno

gmesh for structurated mesh

Hi Bruno,
sorry for my bad english, gmsh can generate rectangular mesh but not from GUI, you can read the geo file with a text editor and writing text inside it. If you open the file rettangoli.geo you can see this:
lc = 0.03;
nm = 5;

2 parameters for generating the mesh. They are not indispensable.
Point(1) = {0,0,0,lc};
Add a point into position (0,0,0) with caracteristic length lc
l1[] = Extrude {0,0.5,0} {
Point{1}; Layers{nm*5,1};
};

This code extrudes Point 1 into direction (0,0.5,0) and splits the resulting line into nm*5 elements. Other lines of code are similar. For example:
__ __ __ __ __ __ Line 1
there is only one line but it's separated into 6 segments.
s1[] = Extrude {0.5,0,0} {
Line{l3[1]}; Layers{nm*5,1}; Recombine;
};

This command extrudes the Line 3 (l3) into direction (0.5, 0, 0) and splits plane into nm*5 subplanes. Example is:
__ __ __ __ __ Line 1
|__|__|__|__|__|
|__|__|__|__|__| Plane
|__|__|__|__|__|
|__|__|__|__|__|

You can assembly the subplanes into one element (not necessary)
stot[] = {s1[1], s2[1], s3[1], s4[1], s5[1], s6[1], s7[1], s8[1], s9[1], s10[1], s11[1], s12[1]};
and after that generate a volume with 3D rectangular mesh.
Extrude {0,0,0.1} {
Surface{stot[]}; Layers{1,1}; Recombine;
}

It ins't easy generate complex 3D mesh but, if you are intresting to use OpenFOAM is possible use the internal mesh generator for rectangular 3D mesh (is so easy) and gmsh for unstructurated mesh.
You can contact me by email (I'm the site webmaster, see on bottom of page ;D)

Bye
Marco

PS: thanks Andrea :)

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <table> <td> <tr> <img> <h2> <h3>
  • Lines and paragraphs break automatically.

More information about formatting options

Syndicate content