ParaView per OpenFOAM: analisi quantitativa e post-processing scientifico

di giux CFD e OpenFOAM, in evidenza 24 min di lettura

Terza guida operativa su OpenFOAM installato su un server Linux e usato da Windows. La prima spiega come collegare ParaView al server attraverso un tunnel SSH; la seconda come controllare il calcolo e la convergenza. Questa riguarda il passo successivo: usare ParaView per misurare, con OpenFOAM Foundation 14 e ParaView 5.13.2.

ParaView: analisi quantitativa e post-processing scientifico
Dai campi numerici alle misure riproducibili — OpenFOAM Foundation 14 e ParaView 5.13.2
Edizione: 16 ottobre 2026 · Manuale operativo generale · client Windows / server Linux

Obiettivo. Usare ParaView non soltanto per rappresentare i risultati, ma per misurare profili, medie su sezioni, portate, cadute di pressione e zone di ricircolo. I casi CFD risiedono sul server Linux; l’utente lavora prevalentemente dal client Windows. Si presuppongono noti FileZilla, PowerShell/SSH e l’avvio di pvserver dalla Guida 1. Non è richiesto Visual Studio Code.

Come leggere questa guida. Il percorso minimo è costituito dai capitoli 1, 2, 4, 5 e 9. I capitoli 6–8 offrono tre esercitazioni autonome. I riquadri Richiamo sono facoltativi per chi conosce la fluidodinamica. Le figure originali sono schematiche o analitiche, non risultati di simulazioni eseguite per questa guida.

1. Prima regola: visualizzare non significa misurare

Una mappa colorata è un utile strumento di orientamento ma non dimostra l’entità di una perdita di carico, il rispetto della continuità o la corrispondenza con un modello teorico. Per ogni risultato annotare: nome del caso, istante o iterazione, campo e unità, regione geometrica, filtro usato, impostazioni, quantità estratta ed eventuale confronto di riferimento.

OperazioneDomanda alla quale rispondeErrore frequente
SliceChe cosa accade su un piano?Pensare che sia una media di tutto il volume
Plot Over LineCome varia una grandezza lungo un segmento?Interpretare punti campionati come media di sezione
ProbeQuanto vale la grandezza in un punto?Usare un punto per rappresentare un’intera uscita
Integrate VariablesQual è l’integrale su linea, superficie o volume?Confondere integrale e media
CalculatorQuale quantità derivata voglio calcolare?Trascurare le unità o l’associazione del campo
Gradient / Stream TracerDove esistono gradienti o strutture del moto?Confondere una streamline con la traiettoria transitoria

Richiamo — un valore numerico dipende dal dominio di integrazione. L’integrale di pressione su una superficie ha dimensioni pressione × area; una media di pressione richiede la divisione per l’area. L’integrale di velocità normale su una superficie ha dimensioni di portata volumetrica.

Flusso client/server e prodotti dell'analisi
Flusso client/server e prodotti dell’analisi

2. Apertura del caso da Windows con pvserver

2.1 Verifiche preliminari

La versione di ParaView sul client e quella del server devono essere compatibili, preferibilmente identiche (qui 5.13.2). Controllare sul server:

foamVersion
pvserver --version
cd ~/cases/nomeCaso
pwd
ls -d 0 constant system

Nella cartella del caso si può creare un file-segnaposto per il lettore nativo OpenFOAM di ParaView:

touch nomeCaso.foam

Questo file vuoto serve a indicare la directory da aprire. Non è un file di risultati. Il lettore deve essere disponibile sul server, dato che l’apertura avviene sul suo filesystem. L’integrazione paraFoam/PVFoamReader compilata con OpenFOAM è un’altra strada: non va confusa con il lettore nativo e può avere vincoli di versione differenti. Se il lettore non funziona, valutare foamToVTK come formato di scambio, verificando i campi esportati. Per casi paralleli controllare le opzioni del lettore relative a reconstructed/decomposed case.

2.2 Connessione sicura: esempio di riferimento

Avviare sul server pvserver, in una sessione che resti aperta:

pvserver --server-port=11111

Da una nuova PowerShell di Windows, aprire il tunnel SSH verso il server (lasciare la finestra aperta):

ssh -N -L 11111:127.0.0.1:11111 UTENTE@SERVER

Su Windows aprire ParaView e usare File → Connect → Add Server, tipo Client / Server, host localhost, porta 11111, quindi Connect. La sicurezza della connessione dipende dal tunnel SSH e da una corretta configurazione di rete/firewall sul server: non esporre direttamente la porta di pvserver a Internet. Se la porta locale è occupata, per esempio usare 11112:127.0.0.1:11111 e collegarsi alla porta locale 11112.

Dopo la connessione, File → Open visualizza le cartelle del server Linux, non il disco C: di Windows. Aprire il file nomeCaso.foam e premere Apply; selezionare le regioni/campi necessari. Se non si vedono p o U, controllare i campi abilitati nel lettore, l’intervallo temporale e il tipo di regione.

Mappa indicativa dell'interfaccia: non è una schermata catturata dal programma
Mappa indicativa dell’interfaccia: non è una schermata catturata dal programma

Regola di efficienza. Applicare prima filtri sul server, esportare in CSV i dati ridotti e usare FileZilla solo per trasferirli quando serve. Evitare di copiare sistematicamente l’intero caso su Windows.

Approfondimento · Limitare pvserver al loopback, come nella prima guida

Il comando pvserver --server-port=11111 ascolta su tutte le interfacce di rete del server; la protezione resta affidata al firewall. Con ParaView 5.13 conviene aggiungere --bind-address=127.0.0.1, così la porta è raggiungibile solo dal tunnel SSH, che consegna il traffico proprio a 127.0.0.1:

pvserver --server-port=11111 --bind-address=127.0.0.1

La prima guida usa questa forma e mostra anche un file ~/.ssh/config con LocalForward, che riduce la connessione a ssh cfd-paraview. Su un server condiviso ogni utente dovrebbe usare una porta propria, con lo stesso numero nei tre punti (tunnel, pvserver, ParaView).

Approfondimento · Le opzioni del lettore OpenFOAM che cambiano i numeri
  • Create cell-to-point filtered data (attiva per impostazione predefinita): oltre ai dati di cella originali crea dati di punto interpolati con lo stesso nome. Se un filtro usa gli array di punto, lavora su valori interpolati, non su quelli calcolati da OpenFOAM.
  • Mesh Regions: internalMesh è il volume fluido; i patch (patch/inlet, patch/outlet, …) sono superfici separate, utili per integrali su ingresso e uscita.
  • Case Type: Reconstructed o Decomposed; il secondo legge processor*/ senza ricostruire.
  • Skip Zero Time: nasconde 0/; disattivalo per controllare le condizioni iniziali.
  • Decompose polyhedra: rilevante per mesh con poliedri generici (snappyHexMesh); per mesh esaedriche di blockMesh non cambia nulla.

3. Conoscere i dati prima di applicare filtri

  1. Nel Pipeline Browser selezionare il file sorgente e aprire la scheda Information: controllare geometria, estensione spaziale, tempo, numero di celle/punti e array disponibili.
  2. Individuare le unità nei file OpenFOAM (0/p, 0/U ecc.): ParaView mostra spesso il nome del campo senza certificarne l’unità.
  3. Verificare se p e U sono dati di cella (Cell Data) o di punto (Point Data). Una conversione con Cell Data to Point Data interpola i valori: utile per rappresentare, ma non identica al dato numerico originale.
  4. Mostrare Surface With Edges sulla mesh, poi passare a Surface per i campi. Selezionare una scala colori coerente e indicare sempre unità e estremi.
  5. Nei casi 2D estrusi con patch empty, ricordare che lo spessore computazionale può non rappresentare quello fisico dell’apparato.

Richiamo — pressione cinematica. Molti casi incomprimibili OpenFOAM memorizzano p con dimensioni m²/s², cioè pressione cinematica. Con densità costante rho, una differenza fra due sezioni si converte in pressione fisica con DeltaP [Pa] = rho [kg/m³] × Deltap [m²/s²]. Per casi comprimibili o impostazioni diverse, verificare le dimensioni effettive del campo; non applicare il fattore rho automaticamente. Una differenza di pressione non dipende dalla scelta di uno zero additivo di pressione, se effettuata in modo coerente.

Filtri di orientamento

  • Slice: definire l’origine e la normale del piano; utile per sezioni interne. Un piano che attraversa un ostacolo genera una sezione soltanto nel fluido effettivamente presente.
  • Clip: elimina una porzione della geometria per vedere l’interno; non equivale a una sezione misurabile automaticamente.
  • Threshold: isola celle entro un intervallo di valori. La selezione varia a seconda che si usino dati di punto o cella e della modalità di inclusione.
  • Gradient: può calcolare gradienti, divergenza, vorticità e criterio Q. I derivati sono sensibili a discretizzazione, interpolazione e qualità della mesh.

4. Misurare profili e costruire grafici

4.1 Plot Over Line

Selezionare la sorgente che contiene il campo U (di solito il caso o il ramo della regione fluid). Attivare Filters → Data Analysis → Plot Over Line, oppure cercare il filtro con la barra di ricerca dei filtri. Definire i due estremi della linea, ad esempio da (x0,y0,z0) a (x1,y1,z1), e impostare una risoluzione iniziale di 100–300 campioni; premere Apply.

Nella Line Chart View scegliere solo la componente di interesse (U_X/componente X di U, secondo il lettore) o il modulo |U|. Controllare l’asse orizzontale: usare distanza lungo la linea oppure una coordinata appropriata, esplicitandola nel grafico. Se una parte della linea cade fuori dalla regione fluida, possono comparire valori invalidi o interruzioni: non interpolare attraverso il solido.

Per salvare i dati selezionare l’output PlotOverLine, quindi File → Save Data… e CSV. Nel dialogo verificare se si stanno esportando array di punto/cella e quali colonne verranno scritte. Non dare per scontato che il CSV esportato contenga esattamente le stesse intestazioni in tutte le versioni dei lettori.

Approfondimento · Modalità di campionamento e colonne del CSV

In ParaView 5.13 Plot Over Line ha l’opzione Sampling Pattern:

  • Sample Uniformly: N punti equidistanti, valori interpolati; il numero di punti è la Resolution.
  • Sample At Cell Boundaries: un campione dove la linea entra ed esce da ogni cella.
  • Sample At Segment Centers: un campione al centro di ogni tratto interno a una cella; con i dati di cella restituisce i valori calcolati da OpenFOAM senza interpolazione.

Nel CSV esportato le coordinate compaiono come Points:0, Points:1, Points:2, le componenti di un vettore come U:0, U:1, U:2, la distanza lungo la linea come arc_length; la colonna vtkValidPointMask vale 0 per i punti caduti fuori dalla mesh e va usata per scartarli.

4.2 Probe e confronto temporale

Con Probe si misura il campo presso una coordinata. Annotare se il punto si trova in una cella fluida. Per una serie di istanti, esplorare Plot Selection Over Time o i file postProcessing/probes prodotti da OpenFOAM (Guida 2). Il grafico spaziale Plot Over Line di un singolo tempo non è un grafico temporale.

4.3 Calculator: grandezze derivate

Nella scheda Properties, il filtro Calculator permette operazioni fra array compatibili. Per un flusso in direzione X, selezionare la componente X di U dall’elenco degli array, evitando di digitare alla cieca nomi di componenti che cambiano tra lettori. Assegnare al risultato un nome chiaro, come U_axial. Per pressioni cinematiche con densità costante, si può creare p_Pa = rho × p specificando numericamente rho e annotandola nella scheda dell’analisi.

Approfondimento · Lo stesso profilo con uno script pvpython

Le operazioni ripetute (lo stesso profilo su più casi o su più tempi) conviene scriverle. ParaView include pvpython e pvbatch, che si possono eseguire direttamente sul server senza interfaccia grafica. Lo script legge il caso, prende l’ultimo tempo, applica Plot Over Line ed esporta il CSV accanto al caso:

# profilo.py  -  eseguire sul server:  pvbatch profilo.py   (oppure pvpython)
from paraview.simple import *

case = '/home/UTENTE/cases/nomeCaso/nomeCaso.foam'
r = OpenFOAMReader(FileName=case)
r.MeshRegions = ['internalMesh']
r.CellArrays = ['p', 'U']
r.UpdatePipelineInformation()
t = r.TimestepValues[-1]                 # ultimo tempo scritto

pol = PlotOverLine(Input=r)
pol.Point1 = [0.08, -0.001, 0.0]         # estremi della linea: adattarli al dominio
pol.Point2 = [0.08,  0.001, 0.0]
pol.Resolution = 200
pol.UpdatePipeline(t)

SaveData('/home/UTENTE/cases/nomeCaso/profilo_x080.csv', proxy=pol,
         PointDataArrays=['U', 'p', 'arc_length', 'vtkValidPointMask'])
print('scritto profilo_x080.csv al tempo', t)

Un modo rapido per ottenere uno script di partenza è Tools → Start Trace: ParaView registra in Python le operazioni fatte nell’interfaccia, e Stop Trace mostra il codice da salvare e adattare.

5. Medie di sezione, caduta di pressione e portata

Per una sezione S del fluido, la media pesata sull’area e la portata sono:

[ \overline{p}_S = \frac{\int_S p\,dA}{\int_S dA}, \qquad Q_S = \int_S \mathbf{U}\cdot\mathbf{n}\,dA. ]

Nell’interfaccia, gli integrali sono ottenibili con Integrate Variables, ma il filtro restituisce un integrale, non una media pronta. Per un piano normale all’asse X, usando la componente U_x, si può integrare U_x sulla sezione e assegnare il segno in funzione della normale desiderata.

Integrali di sezione: media e portata non sono sinonimi
Integrali di sezione: media e portata non sono sinonimi

Procedura senza ambiguità

  1. Sul caso originale applicare un Slice con normale X in x = x_A e verificare che la geometria ottenuta sia la sezione fluida corretta, senza pareti o altri blocchi. Per un patch già esistente, può essere preferibile Extract Block della sola superficie inlet/outlet.
  2. Applicare Integrate Variables al Slice. Nella vista Spreadsheet View/Information leggere l’integrale della pressione; leggere anche la misura di Area, se restituita dalla geometria/filtro, oppure integrare esplicitamente il campo costante unitario one = 1 con Calculator sullo stesso Slice per ottenere l’area. Calcolare p_mean = integral(p)/Area.
  3. Ripetere la sequenza in x = x_B con identica convenzione. Calcolare Delta p = p_mean,A − p_mean,B. Se la pressione del caso è cinematica, convertirla in Pa usando la densità dichiarata.
  4. Per la portata, sul medesimo Slice costruire con Calculator la componente assiale U_axial = Ux, quindi Integrate Variables: Q = integral(U_axial), per un piano la cui normale è lungo X. Nella forma generale occorre il prodotto scalare con la normale alla sezione (U · n) orientata correttamente.
  5. Ripetere in almeno due sezioni e verificare che Q_A e Q_B coincidano entro una tolleranza motivata. Per fluido a densità variabile la quantità conservativa è la portata massica m_dot = integral(rho U · n).

Attenzione. Integrare |U| non è la portata normale, salvo il caso particolare in cui la velocità sia ovunque normale e dello stesso verso. Integrare la pressione su una faccia di parete misura una forza scalare distribuita, non la pressione media di una sezione interna.

Sezioni di misura lungo la direzione del flusso, esempio schematico
Sezioni di misura lungo la direzione del flusso, esempio schematico

Richiamo — segni e sezioni. Se le normali geometriche dei patch di ingresso e uscita sono entrambe uscenti dal volume, un ingresso ha portata firmata negativa e un’uscita positiva. La conservazione si verifica con la somma firmata delle portate: non invertire segni arbitrariamente per rendere simili due numeri.

Approfondimento · Integrate Variables: area, dati di cella e media diretta
  • Su una superficie il filtro restituisce una colonna Area; su una linea Length; su un volume Volume. È la misura geometrica del dominio integrato: confrontala con l’area attesa della sezione come primo controllo.
  • Integra sia i dati di punto sia quelli di cella, in due tabelle (attributo selezionabile nella Spreadsheet View). Su uno Slice i dati di cella sono i valori delle celle tagliate, i dati di punto sono interpolati: con mesh fini coincidono, con mesh grossolane no, e la differenza è un’indicazione dell’incertezza della misura.
  • L’opzione Divide Cell Data By Volume divide gli integrali dei dati di cella per la misura del dominio (area, nel caso di una sezione): restituisce direttamente la media pesata sull’area dei dati di cella.

Un controllo incrociato indipendente da ParaView sono le function object surfaceFieldValue della seconda guida: su inlet e outlet i due metodi devono dare la stessa portata.

6. Esercitazione 1 — Canale laminare e profilo di Poiseuille

Obiettivo. Misurare un profilo U_x(y) in una zona già sviluppata, confrontarlo con la soluzione analitica e calcolare un errore verificabile.

Caso richiesto. Un canale rettilineo, moto laminare incomprimibile, pareti no-slip, sezione costante. Non viene distribuito qui un case OpenFOAM pronto all’uso: usare una copia del proprio esempio verificato o un caso analogo del percorso introduttivo. Il riferimento vale solo per flusso stazionario, completamente sviluppato e senza accelerazioni esterne rilevanti.

Parametri numerici illustrativi e coerenti: altezza complessiva H = 0,002 m, lunghezza di misura L = 0,100 m, densità rho = 1000 kg/m³, viscosità dinamica mu = 0,001 Pa·s, velocità media U_mean = 0,100 m/s; spessore fisico, se necessario per Q: W = 0,010 m. Per questi dati: Re_H = rho·U_mean·H/mu = 200 e il profilo piano ideale è

[ U_x(y)=\frac32 U_{mean}\left[1-\left(\frac{2y}{H}\right)^2\right],\quad -H/2\le y\le H/2. ]

Il massimo teorico è U_max = 0,150 m/s e, nel tratto completamente sviluppato, la caduta di pressione è DeltaP = 12 mu L U_mean/H² = 30 Pa (Delta p = 0,030 m²/s² se p è cinematica). La portata fisica vale Q = U_mean H W = 2,0 × 10⁻⁶ m³/s. Sono valori analitici, non risultati CFD.

Profilo analitico di Poiseuille: asse della velocità normalizzato alla media
Profilo analitico di Poiseuille: asse della velocità normalizzato alla media

Procedura pratica. Aprire il caso alla soluzione finale, applicare Plot Over Line lungo Y su una sezione distante dall’ingresso, impostando gli estremi sul dominio fluido (evitare le celle fuori dominio). Esportare U_x con la posizione Y. Costruire in un foglio di calcolo colonne y, U_CFD, U_teoria, differenza e differenza al quadrato. Usare solo campioni validi interni al fluido, con posizioni e convenzioni confrontabili.

Errore da riportare, per N punti sulla stessa griglia di confronto:

[ RMSE=\sqrt{\frac1N\sum_{i=1}^{N}(U_{CFD,i}-U_{teoria,i})^2},\quad RMSE_{rel}=100\,RMSE/U_{mean}. ]

La versione relativa specifica qui la normalizzazione rispetto a U_mean; usare una definizione stabile anche nelle comparazioni fra mesh. Il file examples/poiseuille_reference.csv contiene una tabella teorica campionata, utile per provare il grafico prima di avere dati simulati.

Controlli finali. Verificare assenza di slip sulle pareti, centrolinea circa a 1,5·U_mean, simmetria, stabilità del profilo lungo due sezioni successive, coerenza fra Q integrata e Q calcolata dalla media. Non prendere la previsione di 30 Pa come criterio di accettazione se il tratto contiene ancora gli effetti di ingresso.

Approfondimento · Calcolare RMSE con Python sul CSV di ParaView

Lo script usa i nomi di colonna standard dei CSV di ParaView, scarta i punti fuori dal fluido e confronta con la formula di Poiseuille. yc è la coordinata dell’asse del canale: se la mesh va da 0 a H, imposta yc = H/2.

# rmse_poiseuille.py  -  python rmse_poiseuille.py profilo_x080.csv
import csv, math, sys

H, Umean = 0.002, 0.100                    # dati del caso
yc = 0.0                                   # coordinata y dell'asse del canale
rows = list(csv.DictReader(open(sys.argv[1], newline='')))
pts = []
for r in rows:
    if r.get('vtkValidPointMask', '1') in ('0', '0.0'):
        continue                           # punto fuori dal fluido
    y = float(r['Points:1']) - yc
    u = float(r['U:0'])                    # componente x della velocita
    if abs(y) <= H / 2:
        pts.append((y, u))
err2 = [(u - 1.5 * Umean * (1 - (2 * y / H) ** 2)) ** 2 for y, u in pts]
rmse = math.sqrt(sum(err2) / len(err2))
umax = max(u for _, u in pts)
print(f'N = {len(pts)}  RMSE = {rmse:.4g} m/s  RMSE_rel = {100 * rmse / Umean:.3g} %')
print(f'U_max CFD = {umax:.4g} m/s  (teoria {1.5 * Umean:.4g})')

Con Sample At Segment Centers (sezione 4) i punti coincidono con i centri delle celle attraversate e l’errore misura la soluzione numerica, non l’interpolazione di ParaView.

Approfondimento · Dove il flusso è davvero sviluppato

All’ingresso il profilo è piatto e si trasforma in parabola lungo una lunghezza di sviluppo. Per un condotto in regime laminare una stima di prima approssimazione molto usata è L_e ≈ 0,05·Re·D_h, con D_h diametro idraulico (per due lastre piane D_h = 2H). Con i dati dell’esercitazione Re_Dh = 400 e L_e è dell’ordine di 8 cm: un profilo misurato a pochi millimetri dall’ingresso non è confrontabile con Poiseuille.

Il criterio pratico è quello della guida: due profili in sezioni successive devono coincidere. Se non coincidono, la sezione di misura è ancora nella zona di sviluppo, oppure il canale è troppo corto per il numero di Reynolds scelto.

7. Esercitazione 2 — Caduta di pressione in un elemento fluido

Obiettivo. Ricavare una misura DeltaP riproducibile e confrontare più portate o geometrie.

Preparazione. Scegliere due piani a monte e a valle, entrambi su tratti geometricamente appropriati, sufficientemente lontani da condizioni al contorno artefatte. Annotare coordinate e dimensioni delle sezioni. Non collocare i piani dentro solidi, zone di ingresso numericamente perturbate o regioni con campi assenti. Tenere identiche le sezioni fra varianti geometriche ove il confronto lo consenta.

  1. Creare Slice_in e Slice_out, con normal e posizioni registrate.
  2. Per ciascuno: Integrate Variables per la pressione, misura dell’area, p_mean.
  3. Verificare la portata con l’integrale di U · n (oppure della componente assiale nel caso planare allineato).
  4. Convertire la differenza in Pa solo se necessario e dimensionamente corretto.
  5. Salvare una tabella Q, DeltaP, rho, mu, x_A, x_B, tempo, mesh e nome della simulazione.
  6. Ripetere su altre portate senza cambiare involontariamente la definizione dei piani. Tracciare DeltaP(Q) e segnalare eventuali dipendenze non lineari.

Esempio puramente illustrativo, non risultato di OpenFOAM: p_mean,A = 0,120 m²/s², p_mean,B = 0,085 m²/s², rho = 998 kg/m³ ⇒ DeltaP = 998·(0,120−0,085) = 34,93 Pa. Un confronto fisico può essere invalidato anche da una scelta differente dei piani di misura, pur con solutori entrambi convergenti.

Richiamo — pressione statica e perdita di carico. Su sezioni con area diversa o con energia cinetica differente, la sola differenza fra pressioni statiche non coincide necessariamente con la perdita energetica irreversibile. Definire esplicitamente l’osservabile: differenza di pressione statica fra piani, pressione totale o coefficiente di perdita, secondo l’applicazione.

Approfondimento · Pressione totale e coefficiente di perdita con Calculator

Con pressione cinematica la pressione totale cinematica si ottiene con un Calculator sui dati di cella:

p_tot = p + 0.5*mag(U)^2

La media pesata sull’area di p_tot sulle due sezioni dà la perdita di pressione totale Δp_tot; il coefficiente di perdita adimensionale è K = Δp_tot / (½·U_rif²) (in forma cinematica, senza densità), con U_rif la velocità media di una sezione dichiarata. Per un rigore maggiore la media della pressione totale andrebbe pesata sulla portata (∫ p_tot U·n dA / Q): con profili molto non uniformi le due medie differiscono, e va indicato quale si usa.

8. Esercitazione 3 — Scie e regioni di ricircolo

Caso suggerito. Il tutorial ufficiale OpenFOAM Foundation 14 incompressibleFluid/pitzDailySteady, relativo a un salto di sezione. Copiare il tutorial in una directory personale e completare la simulazione seguendo l’User Guide v14, non modificare il tutorial originale. Il caso è tipicamente quasi bidimensionale, con spessore numerico; la fisica non è automaticamente trasferibile a qualsiasi geometria tridimensionale.

Moto dopo un salto di sezione: rappresentazione concettuale, non output OpenFOAM
Moto dopo un salto di sezione: rappresentazione concettuale, non output OpenFOAM

Parte A — visualizzazione. Aprire la soluzione finale, mostrare U su una sezione interna. Applicare Stream Tracer con seed nella regione fluida a monte; verificare la corretta selezione del vettore U, lunghezza massima e direzione dell’integrazione. Le streamlines indicano direzioni istantanee del campo; non sono automaticamente traiettorie di particelle per flussi transitori.

Parte B — misura. Per flusso medio diretto lungo +X, applicare Calculator per ottenere U_axial; usare Threshold per isolare celle con U_axial < 0, verificando che l’associazione dei dati sia coerente con il campo originale. Se il campo è in 2D estruso, l’integrale del volume del dominio U_x < 0 è una misura geometrica della regione selezionata incluso lo spessore numerico; per la misura di area 2D usare una sezione sul piano adeguato. Indicare unità e selezione.

Parte C — verifica. Estrarre più profili U_x(y) a valle del salto; cercare inversioni di segno e variazione della regione di separazione. La lunghezza di riattacco non è automaticamente la coordinata dove termina una streamline colorata: richiede un criterio dichiarato, per esempio l’annullamento/inversione della tensione tangenziale di parete opportunamente campionata. Se il segnale cambia con la mesh, dichiarare la sensibilità: la validazione verrà trattata nella Guida 4.

Approfondimento · Misurare il riattacco con la tensione di parete

OpenFOAM calcola la tensione tangenziale di parete con la function object wallShearStress. Sui tempi già scritti si applica in post-processing, indicando il modulo di solver perché servono il modello di trasporto e i campi di turbolenza:

foamPostProcess -solver incompressibleFluid -func wallShearStress -latestTime

Il campo wallShearStress viene scritto nella cartella dell’ultimo tempo. In ParaView: ricarica il caso, seleziona in Mesh Regions il patch della parete inferiore a valle del salto, applica Plot Over Line (o Plot Data sul patch) e leggi dove la componente X cambia segno. Con la convenzione di OpenFOAM la tensione di parete è riferita al fluido sulla parete: verifica il segno nella zona di flusso diretto lontano dal salto e usa il cambio di segno, non il valore assoluto.

Il criterio Q, disponibile nel filtro Gradient (Compute QCriterion), evidenzia i vortici nelle zone di taglio, ma la soglia scelta per l’isosuperficie è arbitraria: va dichiarata insieme all’immagine.

9. Confrontare casi, esportare e ricostruire il lavoro

9.1 Confronti corretti

Creare una tabella di osservabili (template incluso) con una riga per simulazione: mesh, condizioni al contorno, densità, viscosità, portata, caduta di pressione, sezione e tempo. Confrontare grafici solo se usano la stessa coordinata e le stesse unità. Per sovrapporre profili campionati su mesh differenti, esportare i CSV e interpolare in un insieme comune di punti, documentando il metodo; non sottrarre alla cieca righe non allineate.

9.2 Salvare risultati utilizzabili su Windows

  • File → Save Data…: selezionare il filtro giusto nel Pipeline Browser prima di esportare; scegliere CSV dove appropriato. Nei casi client/server verificare il percorso di salvataggio offerto dal dialogo: per alcuni formati/dataset il file può essere scritto sul server, poi recuperato con FileZilla.
  • File → Save Screenshot…: scegliere risoluzione, sfondo e legenda; se un’immagine sarà pubblicata riportare il nome della grandezza, l’unità e un intervallo di colori confrontabile.
  • File → Save State… salva lo stato della pipeline in .pvsm. Usare File → Load State… per riaprire; lo stato non contiene i file CFD e può chiedere di rilocalizzarli. Una pipeline caricata con server diverso può richiedere la correzione dei percorsi sul server remoto.
  • Tenere uno o più CSV e un file .pvsm insieme a una scheda di misura. Non distribuire soltanto PNG senza dati né unità.

Organizzazione proposta sul proprio computer Windows:

analisi_CFD/
  01_caso_e_condizioni.txt
  02_profili_csv/
  03_sezioni_e_integrali/
  04_grafici_png/
  05_paraview_state/
  06_report/

L’analisi numerica dei CSV può essere svolta con un foglio di calcolo (LibreOffice Calc o Excel); Notepad++ è adatto a ispezionare intestazioni e file testuali. FileZilla rimane la soluzione semplice per recuperare il materiale dal server. Non è necessario trasferire l’intero campo volumetrico per ottenere un grafico U_x(y).

Approfondimento · Stati, script e riproducibilità
  • Uno stato .pvsm è un file XML: si può aprire con Notepad++ per vedere percorsi, filtri e parametri, e correggere un percorso del server prima di ricaricarlo.
  • File → Save State… permette anche il formato Python (.py): lo stesso stato diventa uno script eseguibile con pvpython o pvbatch, utile per rifare l’analisi su un altro caso cambiando un solo percorso.
  • Per confronti tra mesh, uno script come quello della sezione 6 applicato ai CSV di ogni mesh produce una riga di tabella per mesh, con gli stessi punti e la stessa definizione di errore.

10. Errori ricorrenti e diagnosi

SintomoPossibile causaVerifica operativa
In Windows non compaiono i file del disco C:ParaView connesso a pvserver apre file sul serverUsare percorso Linux; copiare solo se serve
U o p non appaionoArray non selezionati, regione errata, tempo vuotoProperties del reader, Apply, Information
Plot Over Line mostra buchiParte della linea è esterna al fluidoRivedere estremi/maschera di validità
Integrate Variables dà numero inattesoGeometria, associazione array o dimensione sbagliataVerificare area, superficie e campo
DeltaP mille volte diversaPressione cinematica scambiata per Pa, densità errataLeggere dimensions in OpenFOAM
Q cambia segnoNormale della sezione invertitaDichiarare la convenzione di segno
Streamlines non compaionoSeed nel solido o array vettoriale erratoRiposizionare seed, scegliere U
I filtri rallentano moltoTroppi blocchi/campi, dataset grandeDisattivare array inutili, filtrare sul server
Lo stato .pvsm non si riaprePercorsi dati cambiati, server non collegatoCollegare pvserver, rilocalizzare i file
Profili diversi ma scala colore identicaDifferenze nascoste dalla rappresentazioneQuantificare con CSV, non solo con le immagini

11. Checklist e scheda finale di misura

Prima di considerare comunicabile un risultato, completare la seguente scheda (è presente un template CSV nell’archivio):

  1. Identificativo e versione del caso; versione di OpenFOAM/ParaView; data e directory di origine.
  2. Campo, dimensioni fisiche, unità finali; pressione cinematica o fisica.
  3. Tempo/iterazione, mesh e condizioni al contorno pertinenti.
  4. Posizione delle linee o dei piani; normali; area o spessore; eventuale selezione di blocchi.
  5. Filtro e parametri (Plot Over Line, Calculator, Integrate Variables, ecc.).
  6. Valori numerici e verifica indipendente (almeno bilancio di portata oppure previsione analitica pertinente).
  7. File prodotti (CSV, grafico PNG, stato PVSM) e limiti dell’interpretazione.

Risultato dell’apprendimento. Chi completa le esercitazioni deve poter ricavare un profilo, un errore RMSE, una portata e una differenza di pressione, distinguere ricircolo da artefatti di visualizzazione e consegnare un risultato ricostruibile da un’altra persona.

Approfondimento · Un modello di scheda in CSV

Una riga per misura, con queste colonne, si apre in qualsiasi foglio di calcolo e tiene insieme dati, metodo e file:

case_id,time_or_iteration,mesh_cells,field,field_dimension,rho_kg_m3,mu_Pa_s,section_A_x_m,section_B_x_m,area_A_m2,area_B_m2,p_mean_A_field_units,p_mean_B_field_units,deltaP_Pa,Q_A_m3_s,Q_B_m3_s,method_notes,csv_file,pvsm_file

La colonna field_dimension (per esempio kinematic_m2_s2) evita l’errore più frequente, il fattore rho applicato o dimenticato.

Riferimenti ufficiali e note sulle illustrazioni

Origine figure: tutte le figure incorporate sono state create per questa guida e rappresentano schemi operativi o grafici analitici. La mappa della GUI è una ricostruzione illustrativa, non uno screenshot di ParaView. I grafici illustrativi non sono risultati CFD, salvo esplicita indicazione contraria. Le descrizioni delle funzioni sono verificate sulla documentazione ufficiale.

Guide collegate: OpenFOAM su server Linux, lavorando da Windows, monitoraggio, diagnostica e verifica della convergenza e il percorso Imparare OpenFOAM 14.

#CFD #OpenFOAM #ParaView #post-processing #profilo di Poiseuille