ParaView per OpenFOAM: analisi quantitativa e post-processing scientifico
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.
| Operazione | Domanda alla quale risponde | Errore frequente |
|---|---|---|
Slice | Che cosa accade su un piano? | Pensare che sia una media di tutto il volume |
Plot Over Line | Come varia una grandezza lungo un segmento? | Interpretare punti campionati come media di sezione |
Probe | Quanto vale la grandezza in un punto? | Usare un punto per rappresentare un’intera uscita |
Integrate Variables | Qual è l’integrale su linea, superficie o volume? | Confondere integrale e media |
Calculator | Quale quantità derivata voglio calcolare? | Trascurare le unità o l’associazione del campo |
Gradient / Stream Tracer | Dove 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.

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.

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:
ReconstructedoDecomposed; il secondo leggeprocessor*/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
- Nel
Pipeline Browserselezionare il file sorgente e aprire la schedaInformation: controllare geometria, estensione spaziale, tempo, numero di celle/punti e array disponibili. - Individuare le unità nei file OpenFOAM (
0/p,0/Uecc.): ParaView mostra spesso il nome del campo senza certificarne l’unità. - Verificare se
peUsono dati di cella (Cell Data) o di punto (Point Data). Una conversione conCell Data to Point Datainterpola i valori: utile per rappresentare, ma non identica al dato numerico originale. - Mostrare
Surface With Edgessulla mesh, poi passare aSurfaceper i campi. Selezionare una scala colori coerente e indicare sempre unità e estremi. - 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 è laResolution.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.

Procedura senza ambiguità
- Sul caso originale applicare un
Slicecon normale X inx = x_Ae verificare che la geometria ottenuta sia la sezione fluida corretta, senza pareti o altri blocchi. Per un patch già esistente, può essere preferibileExtract Blockdella sola superficieinlet/outlet. - Applicare
Integrate VariablesalSlice. Nella vistaSpreadsheet View/Informationleggere l’integrale della pressione; leggere anche la misura di Area, se restituita dalla geometria/filtro, oppure integrare esplicitamente il campo costante unitarioone = 1conCalculatorsullo stessoSliceper ottenere l’area. Calcolarep_mean = integral(p)/Area. - Ripetere la sequenza in
x = x_Bcon identica convenzione. CalcolareDelta p = p_mean,A − p_mean,B. Se la pressione del caso è cinematica, convertirla in Pa usando la densità dichiarata. - Per la portata, sul medesimo
Slicecostruire conCalculatorla componente assialeU_axial = Ux, quindiIntegrate 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. - Ripetere in almeno due sezioni e verificare che
Q_AeQ_Bcoincidano entro una tolleranza motivata. Per fluido a densità variabile la quantità conservativa è la portata massicam_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.

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 lineaLength; su un volumeVolume. È 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 unoSlicei 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.

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.
- Creare
Slice_ineSlice_out, con normal e posizioni registrate. - Per ciascuno:
Integrate Variablesper la pressione, misura dell’area,p_mean. - Verificare la portata con l’integrale di
U · n(oppure della componente assiale nel caso planare allineato). - Convertire la differenza in Pa solo se necessario e dimensionamente corretto.
- Salvare una tabella
Q,DeltaP,rho,mu,x_A,x_B, tempo, mesh e nome della simulazione. - 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.

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. UsareFile → 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
.pvsminsieme 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 conpvpythonopvbatch, 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
| Sintomo | Possibile causa | Verifica operativa |
|---|---|---|
In Windows non compaiono i file del disco C: | ParaView connesso a pvserver apre file sul server | Usare percorso Linux; copiare solo se serve |
U o p non appaiono | Array non selezionati, regione errata, tempo vuoto | Properties del reader, Apply, Information |
Plot Over Line mostra buchi | Parte della linea è esterna al fluido | Rivedere estremi/maschera di validità |
Integrate Variables dà numero inatteso | Geometria, associazione array o dimensione sbagliata | Verificare area, superficie e campo |
| DeltaP mille volte diversa | Pressione cinematica scambiata per Pa, densità errata | Leggere dimensions in OpenFOAM |
| Q cambia segno | Normale della sezione invertita | Dichiarare la convenzione di segno |
| Streamlines non compaiono | Seed nel solido o array vettoriale errato | Riposizionare seed, scegliere U |
| I filtri rallentano molto | Troppi blocchi/campi, dataset grande | Disattivare array inutili, filtrare sul server |
Lo stato .pvsm non si riapre | Percorsi dati cambiati, server non collegato | Collegare pvserver, rilocalizzare i file |
| Profili diversi ma scala colore identica | Differenze nascoste dalla rappresentazione | Quantificare 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):
- Identificativo e versione del caso; versione di OpenFOAM/ParaView; data e directory di origine.
- Campo, dimensioni fisiche, unità finali; pressione cinematica o fisica.
- Tempo/iterazione, mesh e condizioni al contorno pertinenti.
- Posizione delle linee o dei piani; normali; area o spessore; eventuale selezione di blocchi.
- Filtro e parametri (
Plot Over Line,Calculator,Integrate Variables, ecc.). - Valori numerici e verifica indipendente (almeno bilancio di portata oppure previsione analitica pertinente).
- 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
- ParaView 5.13.2 — User Guide: Filtering Data — Slice, Plot Over Line, Calculator, Gradient, Integrate Variables.
- ParaView 5.13.2 — Remote and parallel visualization — connessione client/server e tunnel SSH.
- ParaView 5.13.2 — Saving Results — export e salvataggio degli stati PVSM.
- ParaView 5.13.2 — Targeted: Computational Fluid Dynamics — streamline e filtri CFD.
- OpenFOAM Foundation v14 — User Guide, ParaView — lettori e post-processing.
- OpenFOAM Foundation v14 — Backward-facing step — tutorial
pitzDailySteady. - OpenFOAM Foundation v14 — Formato e dimensioni — dimensioni dei campi e unità.
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.