grammi stessi — non sono divulgabili. In appendice A sono riportati i listati dei programmi FORTRAN e MATLABr scritti durante lo svolgimento dello stage; le parti non originali, tratte da routines di propriet`a di Piaggio Aero, sono coperte da omissis.
2.1
Il solutore CFD
Il “cuore” del codice di ottimizzazione `e rappresentato dal programma di risoluzione numerica delle equazioni della fluidodinamica, dai cui risultati si traggono i valori delle forze aerodinamiche che compongono la funzione costo; l’ottimizzatore pu`o fare uso indifferentemente di qualsiasi tipo di solutore CFD: nel caso presente si `e utilizzato un software (ns3d), sempre di propriet`a di Piaggio Aero, le cui caratteristiche sono descritte nel seguito.
ns3d`e un codice a elementi finiti per la risoluzione numerica delle equazioni di Eulero tridimensonali per fluidi comprimiili non viscosi. L’equazione del-l’energia `e attivata, perci`o il codice `e in grado di rilevare l’eventuale presenza di onde d’urto.
Le forze aerodinamiche sono calcolate come l’integrale delle pressioni agenti su ciascuna faccia componente la superficie del corpo, e successiva-mente adimensionalizzate nei coefficienti delle forze Cx, Cy, Cz, e dei
mo-menti CM x, CM y, CM z. Le quantit`a che adimensionalizzano le forze sono la
densit`a ρ∞ e il modulo della velocit`a U∞ del flusso indisturbato, coincidenti
con le condizioni imposte al contorno, e una superfice di riferimento Sref.
Dai coefficienti Cx, Cy, Cz si ottengono il CL e il CD, cio`e le componenti
rispettivamente perpendicolare e parallela alla direzione del flusso asintotico. Il programma richiede in ingresso una griglia tetraedrica non strutturata, organizzata in un formato apposito denominato .alya; per ottenere meshes in tale formato, a partire da files prodotti con il grigliatore commerciale Gambitr 2.16, disponibili presso l’Universit`a di Pisa, `e stato necessario sviluppare una routine FORTRAN di traduzione dal formato FLUENTr al formato compatibile con il codice Eulero. Il funzionamento di tale routine, denominata fluent2ns3d, `e descritto nel seguito; il listato del programma `e invece riportato in appendice A.1.
2.1.1
La
routine fluent2ns3d
Il programma fluent2ns3d `e in grado di leggere le informazioni contenute nel file della mesh in formato FLUENTr, di rielaborarle e di riscriverle su un file in formato .alya.
Il formato .alya contiene tutte e sole le informazioni necessarie a definire la mesh teraedrica: le coordinate nodali (espresse in m), la connettivit`a degli elementi (divisi in elementi fluidi ed elementi solidi1
), la connettivit`a delle facce esterne2
, e le condizioni al bordo; queste informazioni vengono elencate attraverso una struttura molto semplice. Le altre impostazioni del solutore non appartengono al file della mesh, ma vanno specificate in un file differente. Le condizioni al bordo imponibili sono tre: wall, symmetry e pressure-far-field. Nel primo caso al solutore CFD `e richiesto di applicare la condizione di tangenza del flusso e di calcolare il valore della pressione, nel secondo caso `e richiesto di applicare la condizione di tangenza senza calcolare la pressione, mentre nell’ultimo caso il valore della velocit`a e della densit`a `e imposto e pari al valore asintotico. La connettivit`a `e “element-based ”: per ogni ele-mento tetraedrico si elencano i quattro nodi che ne costituiscono i vertici. La connettivit`a delle facce esterne `e data in maniera simile: per ciascuna faccia triangolare, si elencano i tre nodi che ne costituiscono gli angoli.
Il file della mesh in formato FLUENTr viene prodotto dal grigliatore Gambitr o direttamente dal solutore; data la natura del solutore
commer-1Si definiscono elementi fluidi quelli che fanno parte del dominio di soluzione delle
equazioni di Eulero, ed elementi solidi quelli che invece non prendono parte al calcolo fluidodinamico.
2Si definiscono facce interne quelle che appartengono a due elementi e ne costituiscono
la giunzione, cio`e quelle che si trovano dentro il dominio di calcolo, e facce esterne quelle che appartengono a un solo elemento. Ciascuna faccia esterna richiede la definizione di una condizione al bordo.
Figura 2.1: Traduzione della mesh
ciale, che `e in grado di risolvere una grande quantit`a di problemi, questi files contengono molte pi`u informazioni di quelle contenute in un file .alya: ad esempio, gli elementi della mesh possono essere di diverse forme e non solo tetraedrici, e le condizioni al bordo imponibili sono pi`u delle tre accettate da ns3d; inoltre, l’unit`a di misura con cui sono espresse le coordinate dei nodi non `e necessariamente il m.
Ci sono poi due differenze sostanziali tra i due formati: la prima e pi`u importante `e che nel formato FLUENTr la connettivit`a degli elementi `e “face-based ”, cio`e vengono elencate tutte le facce interne, e per ciascuna si indicano i nodi che ne costituiscono i vertici e i due elementi ad essa adiacenti: perci`o fluent2ns3d deve estrapolare le informazioni relative agli elementi attraverso un procedimento ricorsivo. La seconda differenza `e che nel formato FLUENTr le facce esterne sono raggruppate in zone, e le condizioni al contorno sono imposte sulle zone invece che sulle singole facce. Anche le facce interne sono organizzate in zone. Ulteriori difficolt`a, infine, nascono nel caso che la mesh contienga sia elementi fluidi che solidi; in questo caso, l’ambiguit`a nella definizione delle facce di giunzione tra elementi fluidi e solidi (esterne per ns3d, ma interne per FLUENTr) rende complicata l’operazione di assemblaggio degli elementi. In figura 2.1 `e riportato uno schema grafico che riassume quanto esposto finora.
Il programma fluent2ns3d `e stato sviluppato dall’ing. Dario Pinelli per Piaggio Aero, ed `e stato messo a disposizione per questo lavoro; la versione originale era per`o stata programmata per leggere files prodotti dal grigliatore ICEMr, la cui struttura formale `e differente rispetto al formato FLUENTr: per questo motivo `e stato necessario riscriverne buona parte. In figura 2.2 `e riportato uno schema a blocchi che descrive il funzionamento della routine originale; lo schema in figura 2.3 descrive invece il funzionamento della
ver-Figura 2.2: Il programma fluent2ns3d: versione originale.
sione finale del programma: i blocchi colorati indicano gli elementi che sono stati aggiunti o rielaborati nel corso della tesi.
2.2
L’algoritmo di ottimizzazione
L’algoritmo di ottimizzazione utilizzato `e quello del simplesso (Nelder e Mead [3]), con alcune modifiche; esso `e un metodo di ricerca del minimo della funzione di N variabili y : RN → R, globale e non derivativo.
Nel-l’ottimizzazione aerodinamica, le N variabili corrispondono agli altrettanti gradi di libert`a concessi alla deformazione, cio`e agli spostamenti dei punti di controllo lungo la direzione di un asse coordinato. La funzione y `e la funzione costo o obiettivo (J), e il punto di minimo della funzione costo coincide con la configurazione ottimizzata.
Ciascuna configurazione (o individuo) `e rappresentata da un punto nello spazio N-dimensionale; N +1 punti in questo spazio, ciascuno corrispondente a un diverso individuo, costituiscono i vertici di un poliedro detto simplesso. Il metodo consiste nell’eseguire iterativamente i seguenti passi:
0. Si inizializza il simplesso, cio`e si fissano N + 1 punti (xj, con j =
1 . . . N + 1) che definiscono il simplesso di partenza; di solito, un punto corrisponde all’origine, cio`e alla configurazione iniziale, mentre gli altri N costituiscono una base ortonormale dello spazio RN. Per ciascuno
Figura 2.3: Il programma fluent2ns3d: versione finale.
1. Si identificano il vertice peggiore xh (h per high) e il migliore xl (l per
low) del simplesso, cio`e quelli caratterizzati dal valore rispettivamente massimo e minimo di y.
2. Si calcola il centroide ¯x degli N punti tali che j 6= h (il centroide appartiene all’iper-piano dei punti rimanenti).
3. Si cerca di rimpiazzare il punto peggiore con uno dei seguenti candidati, ciascuno ottenuto con una delle seguenti operazioni:
Riflessione: xr = ¯x+ α(¯x− xh)
Espansione: xe= ¯x+ γ(xr−¯x)
Contrazione esterna: xc = ¯x+ β(xr−x)¯
Contrazione interna: xcc= ¯x+ β(xh−¯x)
I coefficienti α, β e γ sono definiti rispettivamente coefficienti di rifles-sione, di contrazione e di espansione.
4. Per ciascuno dei candidati si calcola il valore della funzione costo. Quando uno di essi risulta migliore di xh (ad esempio, y(xr) < y(xh)),
risulta migliore anche di xl, allora si ha un nuovo minimo o
configu-razione vincente. Nel caso (raro) che nessuno dei quattro candidati risulti migliore di xh, si procede con la riduzione dell’intero simplesso
intorno al vertice migliore:
Riduzione: xi = xl+ σ(xi− xl) , i = 1 . . . N + 1
Il coefficiente σ `e definito coefficiente di riduzione. 5. Il procedimento iterativo prosegue dal punto 1.
6. Le iterazioni terminano quando la differenza y(xh) − y(xl) scende sotto
un valore prefissato (nel caso presente, questo valore `e pari a 10−5
). In figura 2.4 `e mostrato graficamente l’effetto delle cinque operazioni di riflessione, espansione, contrazione esterna/interna e riduzione per un sim-plesso con N = 2, cio`e un triangolo in uno spazio a due dimensioni, per i valori standard dei coefficienti: α = 1, γ = 2, β = 1/2 e σ = 1/2.
Questo semplice metodo ha il pregio di richiedere, per ogni passo di iter-azione (o generiter-azione), il calcolo di quattro configurazioni al massimo (eccet-to che nel caso di riduzione del simplesso); essendo proprio il calcolo della fun-zione costo l’elemento che richiede il maggiore sforzo computazionale, questo significa che i tempi di calcolo dell’ottimizzazione sono ridotti al minimo. Al-goritmi derivativi (tanto pi`u se di grado superiore al primo), o altri metodi (ad esempio, gli Algoritmi Genetici) che richiedono la rigenerazione dell’intero set di configurazioni ad ogni iterazione, comportano un costo computazionale notevolmente pi`u elevato.
2.3
La tecnica di
Free Form Deformation
Come si `e detto nell’Introduzione, il codice di ottimizzazione crea le nuove configurazioni deformando la mesh di partenza, cio`e spostandone i nodi ma lasciandone invariata la struttura (o connettivit`a). La legge di spostamento dei nodi deriva dalla tecnica di Free-Form Deformation (da qui in poi FFD) sviluppata da Sederberg e Parry [2] come strumento per la computer graphics. La FFD `e una tecnica che permette di deformare “plasticamente” qual-siasi figura nello spazio, in funzione dello spostamento di alcuni punti di controllo; nel caso presente, essa `e applicata a tutti i nodi facenti parte della mesh. L’effetto di questa deformazione appare chiaro osservando le figura 2.6 e 2.7.
La FFD fa uso dei polinomi tensoriali di Bernstein, per la cui definizione e propriet`a si rimanda al survey di B¨ohm et al. [6]; tuttavia, una descrizione
(a) Riflessione (b) Espansione
(c) Contrazione esterna (d) Contrazione inter-na
(e) Riduzione
Figura 2.4: Rappresentazione 2-D delle operazioni svolte dall’algoritmo del simplesso, da Lagarias et al. [5]. Il simplesso originale `e disegnato con la linea tratteggiata; x1 ≡ xl, x3 ≡ xh.
Figura 2.5: Sistema di coordinate locali (s, t, u), da Sederberg e Parry [2] sufficientemente esauriente di questa tecnica pu`o essere svolta anche senza approfondire gli aspetti matematici. Il primo passo della tecnica di FFD consiste nell’imporre un sistema di coordinate locali con versori S, T, U su una regione dello spazio a forma di parallelepipedo (box ), come mostrato in figura 2.5. Ogni punto X dello spazio pu`o essere definito attraverso delle coordinate (s, t, u) nel nuovo sistema:
X= X0+ sS + tT + uU
Le coordinate (s, t, u) possono essere determinate attraverso semplici for-mule di algebra lineare:
s = T× U ·(X − X0) T× U · S , t = S× U ·(X − X0) S× U · T , u = S× T ·(X − X0) S× T · U Si noti che per ogni punto all’interno del box di partenza `e 0 < s < 1, 0 < t < 1, 0 < u < 1. Si impongono successivamente una griglia di punti di controllo Pijk sul parallelepipedo, che formano l + 1 piani normali a S,
m + 1 piani normali a T e n + 1 piani normali a U (d’ora in poi ci si riferir`a a questa situazione col termine “punti di controllo l-m-n”); in figura 2.6 `e rappresentato un esempio. La posizione di questi punti `e specificata dalla
Figura 2.6: Punti di controllo 1-2-3, da Sederberg e Parry [2] seguente equazione: Pijk= X0+ i lS+ j mT+ k nU
La deformazione dello spazio `e specificata dal movimento dei punti di controllo; la funzione di deformazione `e appunto un polinomio tensoriale di Bernstein, e i Pijk ne sono i coefficienti. Per i nostri scopi, `e sufficiente
specificare che la posizione XF F D di un punto successiva alla deformazione
dipende esclusivamente dalle sue coordinate (s, t, u) e dalla nuova posizione ˜
Pijk degli (l + 1)(m + 1)(n + 1) punti di controllo:
XF F D = f (s, t, u, ˜Pijk) , i = 1 . . . l, j = 1 . . . m, k = 1 . . . n
In figura 2.7 `e rappresentato l’esempio precedente dopo lo spostamento dei punti di controllo. La tecnica di FFD presenta una serie di vantaggi fondamentali per il funzionamento dell’ottimizzatore:
• preservazione della connettivit`a della forma originale, qualsiasi sia lo spostamento dei punti di controllo;
• possibilit`a di realizzare FFD locali o globali;
Figura 2.7: Punti di controllo in posizione deformata, da Sederberg e Parry [2] • facilit`a di imposizione della continuit`a Ck (∀k ∈ N) della deformazione.
La FFD `e locale quando il box iniziale contiene solo una parte del corpo; in questo caso, uno spostamento qualsiasi dei punti di controllo pu`o generare deformazioni caratterizzate da discontinuit`a, come nel primo caso di figura 2.8 e 2.9. Per garantire la continuit`a della deformazione lungo una direzione, `e sufficiente impedire lo spostamento di una fila di punti di controllo che giacciono su un piano perpendicolare a quella direzione, come nel secondo caso delle figure citate. `E possibile garantire anche la continuit`a della deriva-ta prima e seconda, semplicemente “bloccando” due o tre file di punti di controllo (terzo e quarto caso in figura 2.8 e 2.9); questo fatto deriva dalle propriet`a dei polinomi di Bernstein.
La possibilit`a di avere FFD locali e continue permette di realizzare ot-timizzazioni locali, in cui solo un particolare del corpo viene deformato, man-tenendo intatta la mesh. L’ottimizzatore richiede di specificare un bounding box e un bumper box, definiti come segue:
• Il bounding box `e un parallelepipedo che racchiude lo spazio conte-nente il particolare da deformare; su di esso giace la griglia dei pun-ti di controllo, i cui spostamenpun-ti coincidono con i gradi di libert`a dell’ottimizzatore.
• Il bumper box `e un parallelepipedo esterno al bounding box, su cui gi-acciono dei punti di controllo di cui non `e permesso lo spostamento.
Figura 2.8: Punti di controllo C−1
, C0
, C1
e C2
, da Sederberg e Parry [2]
Figura 2.9: Deformazioni locali C−1
, C0
, C1
e C2
Il suo scopo consiste nel garantire la continuit`a della deformazione in tutte le direzioni; esso delimita quindi il volume all’esterno del quale la FFD non ha effetto.
In figura 4.1 a pagina 45 sono rappresentati il bounding box e il bumper box del modello utilizzato nel corso del lavoro di tesi; come si vede, essi non hanno la forma di parallelepipedi: la spiegazione di questo fatto sar`a fornita nella prossima sezione.
2.4
Parametrizzazione del dominio
Come si `e detto, la tecnica di FFD permette di realizzare una deformazione locale all’interno di un volume a forma di parallelepipedo; questo rappresenta un limite per l’ottimizzazione di forme aerodinamiche: infatti, spesso (come nel caso presente) si vorrebbe costruire un bounding box di forma generica, in maniera tale da racchiudere la geometria di elementi che non sono allineati con gli assi coordinati. `E appunto il caso del canard del P180, caratterizzato da rastremazione, angolo di freccia e angolo diedro.
Per superare questo problema, il codice di ottimizzazione fa ricorso a una tecnica di parametrizzazione del dominio nel caso che non sia possibile applicare direttamente la FFD come nello schema seguente:
X =⇒ FFD =⇒ XF F D
Il metodo consiste nell’associare alle coordinate di ogni punto X dello spazio di partenza dei parametri, detti di B´ezier ; questi parametri rappre-sentano le coordinate del punto corrispondente ˜X in uno spazio trasformato che ha certe propriet`a. La FFD viene quindi applicata allo spazio trasfor-mato, e dai parametri deformati si risale alle coordinate dei punti deformati attraverso un’operazione di “parametrizzazione inversa”:
˜
X =⇒ FFD =⇒ X˜F F D
⇑ ⇓
X XF F D
Si deve quindi realizzare la parametrizzazione in modo tale che, nello spazio trasformato, il bounding box abbia la forma di un parallelepipedo. Nel caso presente, `e stato necessario scrivere una routine in linguaggio MATLABr, denominata alya2bzparam, che viene descritta nel seguito; il listato del programma `e invece riportato in appendice A.2.
Figura 2.10: Il programma alya2bzparam
2.4.1
La
routine alya2bzparam
Compito del programma alya2bzparam `e di leggere le informazioni sulle coordinate nodali contenute nella mesh in formato .alya, di costruire il bounding box seguendo la forma del corpo e le indicazioni dell’utente, e di salvare in un file a parte i parametri di B´ezier per ciascun nodo della mesh. Il programma `e stato pensato per adattare il bounding box a superfici pi`u o meno orizzontali, ad esempio le superfici portanti di un aeromobile, ma con semplici modifiche pu`o essere applicato anche a situazioni diverse. All’utente `e chiesto solo di specificare i limiti in x e y del bounding box : nel caso presente, si tratta di localizzare la posizione longitudinale e l’estensione in apertura del canard ; una volta inseriti questi dati, il codice adatta il box alle dimensioni e all’orientamento del corpo.
La trasformazione (x, y, z) ⇒ (˜x, ˜y, ˜z) non cambia la direzione degli assi coordinati, `e lineare a tratti nelle tre direzioni x, y, z, e deforma il bounding box nel cubo 0 < ˜x < 1, 0 < ˜y < 1, 0 < ˜z < 1 e il resto del dominio nel cubo −1 < ˜x < 2, −1 < ˜y < 2, −1 < ˜z < 2. Il funzionamento della routine `e schematizzato in figura 2.10.