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 <em>file_input.geo</em> -o <em>file_mesh.msh</em>
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 <em>root</em> <em>case</em> <em>file_mesh.msh</em>
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
Disegno della mesh
Triangolare - lc = 0.07 - 752

Mesh rettangolari
Disegno della mesh
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 grigliaTempo di calcolo (s) *
75222,64
145147,03
232984,79
4106203,42
9327902,25
165282481,25

Mesh rettangolare

Numero di elementi della grigliaTempo di calcolo (s) *
72015,74
162045,82
288099,2
4500216,4
115201168,88
180002592,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

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

Commenti

Ritratto di Anonimo

The file attachment

The file attachment "simulation_case.tar.gz" is _NOT_ opening up when downloaded (file-size mismatch and extracting it shows errors). Could you please upload a correct file, so that it is easy to setup the case in OpenFOAM? Thanks.

Ritratto di Anonimo

SOLVED

Ok - Half the problem is on my side and half on your side (I think).
I was getting problem in extracting the tar.gz on Ubuntu 9.04. But now when I logged in Windows - I could extract is using 7-Zip. I went through some bugs in Ubuntu and yes there is some _noise_ been heard on the same lines - so that was my problem.
Now your problem - I could as well _NOT_ open another tar.gz on your website (again in Ubuntu and the same opened well under Windows). When I extracted the tar.gz file, I found that it is containing a .tar inside a .tar and then the real_case_files. This whole was packed inside tar.gz. I think the normal packaging is tar.gz containing a .tar and that .tar contains your files/folders. I think that is your problem.
I am _NOT_ expert on Linux system. I hope some else having this problem will get benefited with this post.

SDCPune

Ritratto di Anonimo

Ma è possibile usarlo con

Ma è possibile usarlo con mesh esaedrica o poliedrica già generata da un generatore di mesh???

Ritratto di mavimo

Si, è possibile.

Esistono diversi applicativi per le conversioni da mesh già esistenti verso questi applicativi, per esempio da Fluent, gmsh e molti altri. Per una panoramica più completa ti rimando alla User Guide

Ritratto di Anonimo

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

Ritratto di mavimo

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 :)

Invia nuovo commento





  • Elementi HTML permessi: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <h2> <h3> <h4>
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Linee e paragrafi vanno a capo automaticamente.
  • Indirizzi web o e-mail vengono trasformati in link automaticamente

Maggiori informazioni sulle opzioni di formattazione.



Condividi contenuti