57
POLITECNICO DI MILANO Facolt ` a di Ingegneria dei Sistemi Corso di Studi in INGEGNERIA MATEMATICA Analisi Numerica Delle EDP 2 Programmmazione Avanzata per il Calcolo Scientifico Stabilizzazione e Controllo del Raffreddamento a Fluido di un Chip in Regime Stazionario Turbolento Michele Coti Zelati, matr. 706600 Lorenzo Tamellini, matr. 708092 Anno Accademico 2007-2008

POLITECNICO DI MILANO - mate.polimi.itforma/Didattica/ProgettiPacs/CotiZelati... · POLITECNICO DI MILANO Facolta di Ingegneria dei Sistemi` ... la stesura del codice di risoluzione

  • Upload
    ngonhu

  • View
    216

  • Download
    0

Embed Size (px)

Citation preview

POLITECNICO DI MILANO

Facolta di Ingegneria dei Sistemi

Corso di Studi in INGEGNERIA MATEMATICA

Analisi Numerica Delle EDP 2

Programmmazione Avanzata per il Calcolo

Scientifico

Stabilizzazione e Controllo del

Raffreddamento a Fluido di un Chip

in Regime Stazionario Turbolento

Michele Coti Zelati,

matr. 706600

Lorenzo Tamellini,

matr. 708092

Anno Accademico 2007-2008

Indice

1 Introduzione 3

2 Il problema di controllo 52.1 Aspetti modellistici . . . . . . . . . . . . . . . . . . . . . . . . 52.2 Questioni di esistenza . . . . . . . . . . . . . . . . . . . . . . 72.3 Metodo dei moltiplicatori di Lagrange . . . . . . . . . . . . . 11

2.3.1 Il problema di stato . . . . . . . . . . . . . . . . . . . 132.3.2 Il problema aggiunto . . . . . . . . . . . . . . . . . . . 142.3.3 Il principio di minimo . . . . . . . . . . . . . . . . . . 15

3 Formulazione variazionale nello spazio di Galerkin 163.1 L’approccio “ottimizzare-poi-stabilizzare” . . . . . . . . . . . 16

3.1.1 Stabilizzazione GaLS . . . . . . . . . . . . . . . . . . 173.2 L’approccio “stabilizzare-poi-ottimizzare” . . . . . . . . . . . 18

3.2.1 Stabilizzazione GaLS . . . . . . . . . . . . . . . . . . 193.3 La scelta di δ . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

4 Discretizzazione numerica 214.1 Un algoritmo iterativo . . . . . . . . . . . . . . . . . . . . . . 214.2 Il metodo FEM . . . . . . . . . . . . . . . . . . . . . . . . . . 23

4.2.1 Il problema di stato . . . . . . . . . . . . . . . . . . . 234.2.2 Il problema aggiunto . . . . . . . . . . . . . . . . . . . 244.2.3 Tecniche di stabilizzazione . . . . . . . . . . . . . . . . 24

4.3 Dettagli implementativi . . . . . . . . . . . . . . . . . . . . . 254.3.1 La griglia . . . . . . . . . . . . . . . . . . . . . . . . . 264.3.2 Integratore numerico bidimensionale . . . . . . . . . . 294.3.3 Integratore numerico monodimensionale . . . . . . . . 334.3.4 La struttura dati per i problemi . . . . . . . . . . . . 354.3.5 Struttura dati per il ciclo iterativo . . . . . . . . . . . 404.3.6 L’eseguibile . . . . . . . . . . . . . . . . . . . . . . . . 45

4.4 Cenni sulla stabilizzazione streamline-upwind . . . . . . . . . 46

1

5 Risultati numerici 475.1 Il caso non stabilizzato . . . . . . . . . . . . . . . . . . . . . . 485.2 Il caso stabilizzato: confronto tra gli approcci di risoluzione . 53

Bibliografia 55

2

Capitolo 1

Introduzione

Negli ultimi cinquant’anni, lo studio dei problemi di controllo ottimo hasuscitato grande interesse negli ambiti scientifici piu disparati. In un certosenso, la teoria del controllo generalizza la disciplina del calcolo delle vari-azioni al fine di realizzare una legge per il raggiungimento di un certo criteriodi ottimalita.

Le applicazioni di tale teoria si trovano in sistemi di vario tipo, espressi informa algebrica o per mezzo di equazioni differenziali ordinarie o a derivateparziali.

In questo lavoro, studieremo il problema del raffreddamento a fluido diun chip. Il sistema e governato da un’equazione alle derivate parziali di tipodiffusione-trasporto. La variabile di controllo e la velocita di immissionedel fluido di raffreddamento, mentre il criterio di ottimalita e fornito da unfunzionale che descrive la temperatura della scatola di raffreddamento inpresenza del chip. L’obiettivo e far sı che la temperatura del chip risulti“vicina” ad una temperatura media desiderata.

Nel capitolo 2 tratteremo l’aspetto modellistico del problema e ne forma-lizzeremo la definizione dal punto di vista teorico. Sara dimostrata la buonaposizione del problema di controllo ottimo e ricaveremo i problemi di stato,aggiunto e il principio di minimo attraverso la tecnica dei moltiplicatori diLagrange.

Dal momento che la componente di trasporto e di gran lunga dominante,il capitolo 3 sara dedicato allo studio dei metodi di stabilizzazione per lasimulazione numerica del problema. Presenteremo gli approcci “ottimizzare-poi-stabilizzare” e “stabilizzare-poi-ottimizzare”, due paradigmi per la di-scretizzazione numerica di un problema di controllo. Per entrambi gli ap-procci, utilizzeremo la stabilizzazione Galerkin least square (GaLS).

Il capitolo 4 approfondira la discretizzazione dello stato, dell’aggiunto edel principio di minimo e la formulazione algebrica nello spazio agli elemen-ti finiti. Inoltre, presenteremo alcuni dettagli implementativi riguardantila stesura del codice di risoluzione in linguaggio C++. Tutto il program-

3

ma e stato costruito autonomamente, dalle strutture dati necessarie per lamemorizzazione della griglia al solutore agli elementi finiti di grado 1.

Infine, nel capitolo 5 saranno illustrati alcuni risultati numerici e di-versi confronti tra gli approcci di discretizzazione utilizzati, al variare deiparametri significativi (fittezza della griglia, )

4

Capitolo 2

Il problema di controllo

In questo capitolo presenteremo in maniera dettagliata il problema del con-trollo di flusso per il raffreddamento a fluido di un chip.

La sua struttura puo essere inquadrata nella vasta classe di problemidi controllo ottimo che e possibile riformulare come problemi di minimovincolato in spazi di Banach infinito-dimensionali.

In generale, la soluzione dipendera da una variabile, detta controllo, che epossibile variare per raggiungere un “risultato” che si considera ottimale. Nelnostro caso specifico, vorremo che la temperatura T del chip, che dipendedalla velocita U del fluido di raffreddamento attraverso un’equazione allederivate parziali, sia quanto piu “vicina” ad un valor medio desiderato Td.

2.1 Aspetti modellistici

La scatola di raffreddamento di un chip puo essere rappresentata in duedimensioni per mezzo di un dominio rettangolare Ω = [0, 3] × [0, 1] (figura2.1). Siano:

• T : temperatura in Ω;

• k ≈ 10−4: coefficiente di diffusivita dell’aria;

• q: flusso di calore generato dal dispositivo (q ≈ 50 per un comunemicrochip);

• U : intensita del campo di velocita del fluido di raffreddamento.

Supporremo che il congegno di raffreddamento sia situato su Γ1 e che il chipsi trovi su Γ3. Di conseguenza, le condizioni al contorno imposte saranno

T = 0 su Γ1,

k∇T · ν = 0 su Γ2,

k∇T · ν = q su Γ3.

5

Il fluido di raffreddamento, infatti, non genera una condizione non omo-genea, bensı interviene direttamente nel campo di trasporto all’interno deldominio. E infine naturale porre una condizione di Neumann omogenea suΓ2, imponendo flusso nullo attraverso le pareti della scatola.

Γ3Γ2 Γ2

Γ2

Γ2Γ1 Ωq

Figura 2.1: Modello per la scatola di raffreddamento del chip.

Riassumendo, studieremo il seguente problema stazionario:−k∆T + b(U) · ∇T = 0 in Ω,T = 0 su Γ1,

k∇T · ν = 0 su Γ2,

k∇T · ν = q su Γ3,

(2.1)

doveb(U) = Uη(y)i.

Si noti che il campo e a divergenza nulla:

div(b(U)) = 0.

La funzione η(y) descrive il profilo del campo di velocita. In regime laminareconsidereremo il classico profilo alla Poiseuille:

ηl(y) = y(1− y),

mentre in regime turbolento avremo

ηt(y) = κ

[1

cos(p)− 1

cos(2py − p)

], p ∈

(0,π

2

),

dove κ = 71.45 e un valore scelto in modo tale che∫ 1

0ηl(y) dy =

∫ 1

0ηt(y) dy.

Cio assicura la conservazione della portata al variare del regime di moto.

6

Tale transizione avviene attraversando il valore critico del numero diReynolds

Rec =Ud

ν≈ 103,

dove ν ≈ 10−1 e il coefficiente di viscosita dell’aria e d una lunghezza carat-teristica. Si noti che, date le grandezze in gioco, il regime turbolento epresente per velocita U dell’ordine di 102. Dunque, il regime risulta di fattosempre laminare.

In particolare, sfrutteremo l’intensita del campo U per controllare latemperatura su Γ3, al fine di raggiungere un valore di temperatura mediadesiderata Td.

2.2 Questioni di esistenza

Consideriamo ora gli aspetti teorici che intervengono nel problema, ripren-dendo cio a cui si e accennato nelle sezioni precedenti. Prima di tutto, no-tiamo che nel sistema (2.1) e presente una condizione di Dirichlet omogeneasu Γ1; inoltre, essendo sia il dominio che il dato di Neumann poco regolari,anche la soluzione, per U fissato, non potra avere un grado di regolaritaelevato. In sintesi avremo:

• U controllo, appartenente al convesso chiuso Uad = R+ = [0,+∞),insieme dei controlli ammissibili;

• T = T (U) funzione di stato, appartenente allo spazio X = H1Γ1

(Ω);

• Td valor medio desiderato della temperatura del chip, appartenentead un certo spazio, detto delle funzioni osservate, che ci riserviamo discegliere in seguito.

Per misurare la “vicinanza” della funzione di stato all’osservata desiderata,consideriamo un funzionale di tipo quadratico F : X × Uad → R definitocome

F (T,U) =12

∫Γ3

(T − Td)2 dΓ +12βU2 , (2.2)

dove il primo termine misura la distanza in norma L2(Γ3) tra T e Td (osser-vazione al bordo), mentre il secondo termine corrisponde ad una penalizza-zione, in cui β ∈ (0,∞) e un parametro arbitrario che rende il problema diottimizzazione ben posto.

Assicuriamoci dunque della buona posizione del problema (2.1); scriv-iamone la formulazione debole e verifichiamo le ipotesi che permettono diapplicare il lemma di Lax-Milgram. Sia v ∈ X e U ∈ Uad fissato; moltiplichi-amo entrambi i membri della (2.1), integriamo su Ω e controintegriamo perparti:

7

0 =∫

Ω(−k∆T + b(U) · ∇T )v

=∫

∂Ω−k∇T · νv +

∫Ωk∇T∇v +

∫Ω

b(U) · ∇Tv

=∫

Γ3

−qv +∫

Ωk∇T∇v +

∫Ω

b(U) · ∇Tv.

Definendo:

a(T, v) =∫

Ω(k∇T∇v + b(U) · ∇Tv) dx,

〈F , v〉∗ =∫

Γ3

qv ,

il problema (2.1) diventa:

trovare T tale che a(T, v) = 〈F , v〉∗ , ∀v ∈ X.

Dobbiamo verificare continuita e coercivita della forma bilineare a(w, v) econtinuita del funzionale F . Scegliamo di utilizzare come norma su X lanorma del gradiente (‖ · ‖X = ‖∇ · ‖L2(Ω)) e verifichiamo la continuita dellaforma bilineare. Dalla seguente catena di disuguaglianze:

|a(w, v)| ≤ k‖∇w‖L2(Ω)‖∇v‖L2(Ω) + ‖b(U)‖L∞(Ω)‖∇w‖L2(Ω)‖v‖L2(Ω)

≤ k‖∇w‖L2(Ω)‖∇v‖L2(Ω) + ‖b(U)‖L∞(Ω)‖∇w‖L2(Ω)CP ‖∇v‖L2(Ω)

otteniamo che a(w, v) e continua, con costante di continuita M = (k +‖b(U)‖L∞(Ω)CP ).

Per quanto riguarda la coercivita, il termine∫

Ωk∇v∇v non da problemi:∫

Ωk∇v∇v ≥ k‖v‖2

L2(Ω) ,

mentre occorre riarrangiare il secondo addendo:

∫Ω

b(U) · ∇vv =12

∫Ω

b(U) · ∇(v2) =12

∫∂Ω

b(U) · ν(v2)−∫

Ω∇ · [b(U)]v2

Ora, nel nostro caso ∇ · [b(U)] = 0, quindi il secondo integrale e nullo;ragionando inoltre sulle direzioni di b(U) e ν osserviamo che:∫

∂Ωb(U) · ν v2 =

∫Γ2

η(y)U v2 ≥ 0 ,

8

da cui possiamo concludere che la forma bilineare a(w, v) e anche coerciva,con costante di coercivita α = k.

Per concludere, esaminiamo la continuita del funzionale F ; sfruttandola disuguaglianza di traccia possiamo subito osservare che

| 〈F , v〉∗ | ≤ ‖q‖L2(Γ3)‖v‖L2(Γ3) ≤ CT ‖q‖L2(Γ3)‖v‖X ,

quindi F e continuo con costante di continuita N = CT (1 + CP )‖q‖L2(Γ3).Di conseguenza possiamo applicare il lemma di Lax-Milgram ed affer-

mare che, per ogni valore del controllo U fissato, esiste un’unica soluzioneT del problema di stato, per la quale vale la stima:

‖T‖X ≤ 1α‖F‖X∗ ≤

N

α

Si noti che N/α non dipende dal controllo U ; questo tornera utile piu avanti,quando mostreremo l’esistenza di un minimo per il funzionale F .

La strategia che adottiamo infatti e quella di considerare un problema diminimo per il funzionale F , dove il vincolo G : X × Uad → Y e il problemadifferenziale (2.1). In formule:

F (T,U) → minsubG(T,U) = 0 .

(2.3)

Mostriamo dunque che e possibile trovare almeno una coppia (T,U) soluzio-ne di (2.3). Per fare cio, ci ricondurremo al seguente teorema, che riportiamosenza dimostrazione:

Teorema 2.1. Siano X,Y,U spazi di Banach riflessivi e Uad ⊆ U unconvesso chiuso. Siano inoltre

F : X × Uad → R e G : X × Uad → Y

e supponiamo che F (x, u) = P (x) + N(u), dove P e un funzionale su X eN un funzionale su Uad. Assumiamo che:

1. infx∈X

P = p0 > −∞ ed esiste (x, u) tale che G(x, u) = 0;

2. N(u) ≥ β‖u‖γU , con β, γ > 0 per ogni u ∈ U ;

3. se uk u in Uad e xk x in X, dove (xk, uk) ∈ X × Uad, alloraG(xk, uk) G(x, u) in Y ;

4. F e debolemente semicontinuo inferiormente in X × Uad;

5. se (xk, uk) ∈ X × Uad e tale che |P (xk)| ≤ M e G(xk, uk) = 0, allora‖xk‖X ≤M0.

9

Allora esiste una soluzione (x, u) ∈ X × Uad del problema (2.3).

E chiaro che nel nostro caso abbiamo:

x = T u = U G(T,U) = ∇ · (−k∇T + b(U)T )

P (T ) =12

∫Γ3

(T − Td)2 dΓ N(U) =12βU2 .

Inoltre, essendo T ∈ H1Γ1

(Ω), poniamo Y = H−1(Ω).In riferimento al teorema 2.1, la prima parte dell’ipotesi 1 e l’ipotesi 3

sono banali da verificare. Per quanto riguarda la seconda parte dell’ipotesi1, poniamo U = 0 in (2.1). Il sistema si riduce cosı al seguente problemamisto:

∆T = 0 in ΩT = 0 su Γ1

∇T · ν = 0 su Γ2

∇T · ν = qk su Γ3 ,

(2.4)

la cui formulazione debole e:

trovare T ∈ H1Γ1

(Ω) tale che :

a(T, v) = Fv, ∀v ∈ H1Γ1

(Ω) .

Abbiamo

a(T, v) =∫

Ω∇T∇v dx

e

Fv =q

k

∫Γ3

v dΓ .

Essendo la forma bilineare a : X×X → R continua e coerciva ed il funzionaleF : X → R lineare e continuo, il lemma di Lax-Milgram garantisce esistenza(e unicita) della soluzione T , e percio l’esistenza di una coppia (T,U) taleche G(T,U) = 0.

Per quanto riguardo il punto 3, e sufficiente applicare la definizione diconvergenza debole. Siano

Tj T in X e Uj U in Uad .

Per dimostrare la convergenza debole di G(Tj , Uj) in Y = H−1(Ω), molti-plichiamo l’equazione per una funzione v ∈ X e integriamo su Ω:

10

∫Ω(−k∆Tj + b(Uj)∇Tj)v dx =

=∫

Ω

[k∇Tj∇v + b(Uj)∇Tjv

]dx−

∫Γ3

qv dΓj→∞−→∫

Ω

[k∇T∇v + b(U)∇Tv

]dx−

∫Γ3

qv dΓ .

Dunque il problema debole converge in H−1(Ω).Per il punto 4, sia Uj U in Uad e Tj T in X. Indicando con 〈·, ·〉 il

prodotto scalare in L2(Γ3), abbiamo

0 ≤ 12〈Tj − T, Tj − T 〉+

12β(U − Uj)2 =

=12〈(Tj − Td)− (T − Td), (Tj − Td)− (T − Td)〉+

12β(U − Uj)2 =

=12〈Tj − Td, Tj − Td〉 − 〈Tj − Td, T − Td〉+

12〈T − Td, T − Td〉+

+12U2 − βUUj +

12βU2

j .

Prendendo il lim inf di entrambi i membri e sfruttando la convergenza debolesi ricava

F (T,U) ≤ lim infj→∞

F (Tj , Uj) .

Veniamo ora all’ultima ipotesi. Sia (Tj , Uj) una successione minimizzanteper F tale che G(Tj , Uj) = 0 e |P (Tj)| ≤M . Quest’ultima ipotesi garantisce‖Tj‖L2(Γ3) ≤ M2. Dalle ipotesi 1 e 3 sappiamo che |Uj | ≤ M1. Allora, dalproblema in forma debole, per v = T si ha

k‖∇Tj‖L2(Ω) ≤∫

Ω(k∇Tj∇Tj + b(Uj) · ∇Tj Tj) dx =

=∫

Γ3

qTj ≤ q‖Tj‖L2(Γ3) ≤ qM2 ,

dunque ‖Tj‖X ≤M0.Dimostrata l’esistenza di una soluzione per il problema di minimo, il

prossimo obiettivo consiste nel ricavare le condizioni di ottimalita che uncontrollo ottimo deve soddisfare.

2.3 Metodo dei moltiplicatori di Lagrange

Il metodo dei moltiplicatori di Lagrange permette di riformulare un proble-ma di ottimizzazione vincolata in un corrispondente problema di ottimiz-zazione libera e di ricavare le equazioni che andremo poi a simulare nu-mericamente: l’equazione di stato, l’equazione aggiunta ed il principio diminimo.

11

Introduciamo il Lagrangiano

L(T,U ; p) = F (T,U) + 〈p,G(T,U)〉∗ , (2.5)

dove 〈·, ·〉∗ indica la dualita tra Y e Y ∗, p ∈ Y ∗. Esplicitando la (2.5)abbiamo

L(T,U ; p) =12

∫Γ3

(T − Td)2 dΓ +12βU2

+∫

Γ3

qp dΓ−∫

Ω(k∇T∇p+ b(U) · ∇Tp) dx

(2.6)

Anche in questo caso enunciamo senza dimostrare il teorema che poi ap-plicheremo al nostro caso specifico:

Teorema 2.2. Supponiamo che (T , U) sia una soluzione del problema (2.3)e che

1. F sia differenziabile con continuita secondo Frechet in T , per ogniU ∈ Uad;

2. G sia differenziabile con continuita secondo Frechet rispetto a T , in(T , U) e inoltre

GT (T , U) : X → Y

e suriettiva;

3. per ogni T , ogni coppia U, V ∈ Uad e ogni α ∈ [0, 1], esiste Uα tale che

G(T,Uα) = (1− α)G(T,U) + αG(T, V )

eF (T,Uα) ≤ (1− α)F (T,U) + αF (T, V ) .

Allora, esiste p ∈ Y ∗ tale che (T , U) e p sono soluzioni del seguente sistema:LT (T , U ; p)ϕ = FT (T , U)ϕ+⟨p, GT (T , U)ϕ

⟩∗

∀ϕ ∈ X

minU∈Uad

L(T , U ; p) = L(T , U ; p)(2.7)

Osserviamo che esistono le derivate Frechet

FT (T , U)ϕ =∫

Γ3

(T − Td)ϕdΓ

eGT (T , U)ϕ = −k∆ϕ+ b(U)∇ϕ .

Inoltre, GT (T , U) : X → Y e suriettiva: cio e assicurato dal lemma di Lax-Milgram, che garantisce esistenza e unicita della soluzione T per ogni valoredi U ∈ Uad fissato.

12

Riguardo alle condizioni di convessita, siano T ∈ X, U, V ∈ Uad e α ∈[0, 1]. Abbiamo:

(1− α)G(T,U) + αG(T, V ) == (1− α)(−k∆T + b(U)∇T ) + α(−k∆T + b(V )∇T ) == − k∆T + ((1− α)b(U) + αb(V ))∇T == − k∆T + [(1− α)U + αV︸ ︷︷ ︸

]η(y) · i∇T =

= − k∆T + b(Uα)∇T = G(T,Uα)

e

(1− α)F (T,U) + αF (T, V ) =

= (1− α)P (T ) +12β(1− α)U2 + αP (T ) +

12βαV 2 =

=P (T ) +12β[(1− α)U2 + αV 2︸ ︷︷ ︸

U2α

] =

=P (T ) +12βU2

α = F (T,Uα) .

Applichiamo dunque il teorema 2.2 e ricaviamo le condizioni di ottimalitaper il controllo ottimo. Alla fine, avremo un sistema del tipo

eq. stato (T,U),eq. aggiunta (p, T ),principio di minimo (p, U) .

2.3.1 Il problema di stato

Il problema di stato puo essere anche definito come

Lp(T , U ; p)ϕ = 0, ∀ϕ ∈ X. (2.8)

Poniamo allora

a(T, v) =∫

Ω(k∇T∇v + b(U) · ∇Tv) dx

e〈F , v〉∗ =

∫Γ3

qv dΓ.

Applicando la (2.8), recuperiamo la formulazione debole del problema distato:

trovare T ∈ X tale che∫Γ3

qϕ dΓ− a(T, ϕ) = 0, ∀ϕ ∈ X. (PS)

Come gia fatto notare in precedenza, tale problema ammette un’unica solu-zione T , per ogni U ∈ Uad fissato.

13

2.3.2 Il problema aggiunto

Il problema aggiunto e definito come:

LT (T , U ; p)ϕ = 0, ∀ϕ ∈ X, (2.9)

che equivale a:

FT (T , U)ϕ+Y ∗

⟨p, GT (T , U)ϕ

⟩Y

= 0.

Esplicitiamo quindi il problema aggiunto derivando l’espressione della la-grangiana in forma debole (2.6):

FT (T , U)ϕ− a(ϕ, p) = 0 , ∀ϕ ∈ X.

Integrando una volta per parti si risale all’equazione aggiunta in forma forte:

0 =∫

Γ3

(T − Td)ϕdΓ−∫

∂Ωk∇p · nϕdΓ +

∫Ωk∆pϕ dx

−∫

∂Ωϕpb(U) · ν dΓ +

∫Ω

b(U) · ∇pϕ dx

=∫

Γ3

(T − Td)ϕ dΓ−∫

∂Ω[k∇p+ pb(U)]ϕ · ν dΓ

+∫

Ω[k∆p+ b(U) · ∇p]ϕdx.

Ora, scegliendo in particolare ϕ ∈ C∞0 (Ω), otteniamo che all’interno deldominio vale:

k∆p+ b(U) · ∇p = 0. (2.10)

Di conseguenza possiamo scrivere anche che:∫Γ3

(T − Td)ϕ dΓ−∫

∂Ω[k∇p+ pb(U)]ϕ · ν dΓ = 0,

da cui, sfruttando il fatto che ϕ ∈ X, si ricava:∫Γ2

[k∇p+ pb(U)]ϕ · ν dΓ = 0, ∀ϕ ∈ X,∫Γ3

(T − Td)ϕdΓ−∫

Γ3

[k∇p+ pb(U)]ϕ · ν dΓ = 0, ∀ϕ ∈ X.

Riassumendo, il problema aggiunto e:k∆p+ b(U) · ∇p = 0 in Ω,p = 0 su Γ1,

[k∇p+ pb(U)] · ν = 0 su Γ2,

[k∇p+ pb(U)] · ν = T − Td su Γ3, ,

che, in forma debole, diventa:

14

trovare p ∈ X tale che∫Γ3

(T − Td)ϕdΓ− a(ϕ, p) = 0, ∀ϕ ∈ X. (PA)

2.3.3 Il principio di minimo

Nel nostro caso, la variabile U e una semplice variabile scalare, U ≥ 0, quindiil principio di minimo si puo esplicitare in modo semplice, senza utilizzarestrumenti di analisi funzionale: basta imporre che

d

dU[L(T,U ; p)] ≥ 0,

cioe

0 ≤ d

dU

[12βU2 −

∫Ω

b(U) · ∇Tp]βU − d

dU

∫ΩUη(y)Txp =

= βU − d

dUU

∫Ωη(y)Txp = βU −

∫Ωη(y)Txp.

Quindi, in conclusione, il principio di minimo e:

βU −∫

Ωη(y)Txp ≥ 0 . (PM)

15

Capitolo 3

Formulazione variazionalenello spazio di Galerkin

In questo capitolo analizzeremo due approcci per la risoluzione numericadel problema di controllo. A causa degli effetti del trasporto (dominante)presente sia nell’equazione di stato che nell’equazione aggiunta, il proble-ma risulta instabile dal punto di vista dell’approssimazione ad elementifiniti. Si presenta dunque un problema di stabilizzazione, che e possibilerisolvere attraverso due approcci differenti: l’approccio “ottimizzare-poi-stabilizzare” e l’approccio “stabilizzare-poi-ottimizzare”. In entrambi i casi,la stabilizzazione avverra secondo il metodo GaLS.

In tutto il capitolo, sarebbe corretto esprimere ogni variabile del pro-blema con il pedice h, che sottolinea l’approssimazione in uno spazio aglielementi finiti della variabile stessa. Per non appesantire ulteriormente lanotazione, il pedice sara sottointeso. Chiameremo invece sempre Xh ⊂ X lospazio finito-dimensionale di approssimazione agli elementi finiti.

Per quanto riguarda il metodo GaLS, dobbiamo aggiungere al problemadi Galerkin un termine Eh(T, f ;φ) tale che

Eh(T, f ;φ) = 0, ∀φ ∈ Xh .

Il termine Eh(T, f ;φ) dipende in particolare dall’approccio che consideriamo,per cui lo specificheremo piu avanti caso per caso. Si tratta sostanzialmentedi aggiungere un residuo dipendente dall’operatore differenziale in formaforte, che dunque varia se ad essere stabilizzato e il problema di stato, ilproblema aggiunto o la lagrangiana.

3.1 L’approccio “ottimizzare-poi-stabilizzare”

In questa sezione discutiamo il processo di stabilizzazione che si ottiene apartire dalla forma debole dei problemi primale e aggiunto. La ricerca delvalore ottimale della velocita del fluido U potrebbe generare un problema

16

a trasporto dominante, per il fatto che il campo di trasporto e linearmenteproporzionale all’intensita della velocita del fluido di raffreddamento. Siail problema primale che il problema aggiunto risultano percio instabili dalpunto di vista dell’approssimazione numerica. A partire dunque dalle con-dizioni di ottimo ricavate nella sezione precedente, stabilizziamo le equazionicome se trattassimo due problemi non comunicanti tra loro.

Oltre ai problemi peculiari che e possibile riscontrare nelle singola pro-cedura GaLS, questo approccio comporta alcune incongruenze dal punto divista algoritmico. La ricerca del minimo si basa infatti su uno schema ditipo “gradiente”, dunque uno schema di discesa a seconda del segno delladerivata del funzionale (il principio di minimo). Il problema e di minimovincolato, ed il vincolo e proprio fornito dal problema primale. La modificadel problema primale per mezzo della stabilizzazione comporta un errore sulcalcolo del gradiente della lagrangiana, proporzionale ad h. Il valore del-la lagrangiana da minimizzare risulta dunque influenzato significativamentedalla stabilizzazione. In altre parole, il valore minimo della lagrangiana noncorrisponde al punto in cui essa ha derivata nulla (cfr. [3]).

In questo caso, valgono le stime classiche delle stabilizzazioni, che cigarantiscono convergenza della soluzione approssimata alla soluzione esatta,all’aumentare dell’infittimento della griglia. Di conseguenza, una mesh piufitta riduce (tuttavia non in modo del tutto soddisfacente) le incongruen-ze tra il principio di minimo (che non subisce alcun effetto da parte dellastabilizzazione) e i problemi differenziali associati.

3.1.1 Stabilizzazione GaLS

Nel metodo GaLS, la forma della stabilizzazione cambia a seconda del prob-lema considerato, in quanto dipende dalla forma forte del problema stesso.Per il problema di stato, il termine di stabilizzazione sara:

Esh(T,U, ϕ) =

∑K∈Th

∫K

δhK

|b(U)|(−k∆T + b(U) · ∇T )(−k∆ϕ+ b(U) · ∇ϕ),

mentre per il problema aggiunto avremo:

Eadh (p, U, ϕ) =

∑K∈Th

∫K

δhK

|b(U)|(k∆p+ b(U) · ∇p)(k∆ϕ+ b(U) · ∇ϕ).

Allora, il problema primale stabilizzato diventa

trovare T ∈ Xh tale che∫Γ3

qϕ dΓ− a(T, ϕ)− Esh(T,U, ϕ) = 0, ∀ϕ ∈ Xh,

e il problema aggiunto e

17

trovare p ∈ Xh tale che∫Γ3

(T − Td)ϕ dΓ− a(ϕ, p)− Eadh (p, U, ϕ) = 0, ∀ϕ ∈ Xh.

Ricordiamo che, definita la “norma GaLS” come

||v||GaLS =

K||∇v||2L2(Ω) +∑

K∈Th

δhk

|b|(Lvh, Lvh)

12

,

si hanno le seguenti stime di stabilita ed errore:

||Th(u)||GaLS ≤ C1||f ||L2(Ω),

||T (u)− Th(u)||GaLS ≤ C2hr+1/2|u|Hr+1(Ω).

3.2 L’approccio “stabilizzare-poi-ottimizzare”

Se nella sezione precedente avevamo ricavato l’equazione di stato, l’equazioneaggiunta e il principio di minimo e solo in seguito avevamo stabilizzato levarie equazioni, in questa parte lavoriamo esattamente nella maniera spe-culare. Partendo dalla lagrangiana approssimata nello spazio ad elementifiniti

L(T,U ; p) = F (T,U) + 〈F , p〉∗ − a(T, p) ,

aggiungiamo il termine di stabilizzazione per il problema di Galerkin. Soloin seguito, si opereranno le derivate di Frechet per ricavare l’equazione distato, l’equazione aggiunta e il principio di minimo. Si noti che, in questomodo, la stabilizzazione influenza anche il principio di minimo.

In questo modo di lavorare, il vincolo discreto risulta perfettamenterispettato dalla soluzione approssimata. Per quanto riguarda una stima apriori per l’approssimazione di Galerkin, abbiamo il seguente risultato (cfr.[2])

Proposizione 3.1. Per l’approssimazione di Galerkin in Xh×Uh ⊂ X×U ,vale la stima

‖T − Th‖+ ‖p− ph‖+ ‖U − Uh‖

≤ c

infvh∈Xh

‖T − vh‖+ infwh∈Xh

‖p− wh‖+ infrh∈Uh

‖U − rh‖.

La bonta dell’approssimazione dipende sostanzialmente dal grado di ele-menti finiti che sceglieremo. E chiaro che U ∈ R+ implica che l’ultimo ter-mine della stima sia identicamente nullo. Per semplicita di programmazionedel codice, considereremo solo un’approssimazione di grado 1; dunque, pergli altri termine varra la classica stima di interpolazione lineare.

18

3.2.1 Stabilizzazione GaLS

Il termine corretto da aggiungere nella lagrangiana e sostanzialmente ilprodotto dei residui del problema di stato e del problema aggiunto:

Eh(T, f ; p) =∑

K∈Th

∫K

δhK

|b(U)|(−k∆T + b(U) · ∇T )(k∆p+ b(U) · ∇p) dx.

Si noti la differenza con il paradigma “ottimizzare-poi-stabilizzare”. Inquesto caso l’equazione di stato e l’equazione aggiunta risulteranno signi-ficativamente diverse. Procedendo come nei casi precedenti, ricaviamo lecondizioni di minimo azzerando il gradiente della lagrangiana. Poniamo

ah(T, p) = a(T, p) + Eh(T, f ; p) .

Avremo

Lp[ϕ] =∫

Γ3

qϕ dΓ− ah(T, ϕ) = 0, ∀ϕ ∈ Xh,

LT [ϕ] =∫

Γ3

(T − Td)ϕdΓ− ah(ϕ, p) = 0, ∀ϕ ∈ Xh,

LU = βU −∫

Ω

[η(y)Txp+ δ

( hk

|b(U)|(η(y)Tx)(k∆p+ b(U) · ∇p)

+hk

|b(U)|(η(y)px)(−k∆T + b(U) · ∇T )

− hk

U2η(y)(−k∆T + b(U) · ∇T )(k∆p+ b(U) · ∇p)

)]dx ≥ 0 .

E possibile dunque variare il parametro δ in modo che la stabilizzazionerisulti preponderante, senza pero agire sull’infittimento della griglia. Inquesto modo, la soluzione non presenta alcuna oscillazione.

3.3 La scelta di δ

Il parametro δ della stabilizzazione GaLS deve essere tarato in modo op-portuno, per garantire l’assenza di oscillazioni numeriche nella soluzione;per semplicita, decidiamo di calcolare un δ unico per tutti gli elementi dellamesh.

Procediamo nel modo seguente: gli elementi in cui serve aggiungere unastabilizzazione sono tutti quelli in cui PeK > 1, cioe:

|b|htr

2k> 1 ⇒ Uηhtr

2k> 1

da cui possiamo dedurre che in tali elementi vale che η >2kUhtr

= ηmin.

19

In ciascuno di questi elementi dobbiamo aggiungere viscosita numericakh (che dipende da δ) tale da imporre che

Pe∗K =|b|ηhtr

2(k + kh)< 1

Poiche vogliamo utilizzare un unico δ per tutta la griglia, calcoliamo unastima per eccesso dei Pe∗K , Pe∗M , e calcoliamo δ tale che Pe∗M < 1. Dallaforma della stabilizzazione segue kh = δUhtrη, ed inoltre per entrambi iprofili di velocita vale η < 1

4 . Se indichiamo con hmax e hmin i valori massimoe minimo di htr, abbiamo quindi che

Pe∗M =Uhmax/4

2(k + δUηminhmin)

Imponendo Pe∗M < 1 otteniamo la condizione desiderata per δ:

δ >U

16kh2

max

hmin− hmax

2hmin⇒ δ =

U

16kh2

max

hmin(3.1)

Poniamo ora 1

Pe =Uhmax/4

2k.

Con questa definizione possiamo riscrivere kh come kh = kPe, in modo chelimh→0 kh = 0 e Pe∗M = Pe

1+Pe< 1, espressioni che evidenziano che la stima

di δ che forniamo e in linea con i risultati teorici (cfr. [5], [6]).

1se ipotizziamo che l’elemento con htr = hmax sia al centro della griglia, dove quindianche η e massimo, Pe non e altro che il valore di Pe in tale elemento, e in tal caso e ancheil massimo Pe del dominio.

20

Capitolo 4

Discretizzazione numerica

In questo capitolo, presentiamo in dettaglio l’aspetto computazionale diquesto progetto. Nella prima sezione presenteremo l’algoritmo di risoluzionedel problema di controllo. Poi, ricaveremo la formulazione algebrica deiproblemi di stato e aggiunto. Infine, illustreremo gli aspetti implementativiaffrontati, in linguaggio C++, con l’aiuto di alcuni estratti di codice.

4.1 Un algoritmo iterativo

Analizzate le proprieta matematiche del problema, passiamo all’implemen-tazione di un algoritmo risolutivo, in linguaggio di programmazione C++.L’idea e quella di inserire un solutore FEM per i problemi di stato e aggiuntoall’interno di un metodo iterativo che calcoli il valore di U che minimizza lalagrangiana L, dal momento che il minimo di L e caratterizzato dal sistema:

Lp = 0 ⇒ problema di stato,LT = 0 ⇒ problema aggiunto,LU = 0 ⇒ principio di minimo.

(4.1)

Il metodo iterativo e cosı strutturato:

1. scelta di un valore di U iniziale;

2. dato U , risoluzione del problema di stato (metodo FEM) e calcolo diT ;

3. dato T , risoluzione del problema aggiunto (metodo FEM) e calcolo dip;

4. dati U, T, p, calcolo del valore del funzionale lagrangiano L e della suaderivata LU , tramite il principio di minimo;

21

5. se il valore di L e LU soddisfano opportuni criteri di arresto, il ciclosi arresta, altrimenti si aggiorna il valore di U e si esegue un’altraiterazione.

Dalla definizione di L, abbiamo F = L, a patto di risolvere esattamente ilproblema di stato. In tal caso infatti a(T, v) = 〈F , v〉∗ , ∀v ∈ X, e quindi inparticolare 〈F , p〉∗−a(T, p) = 0. Nel ciclo iterativo si puo dunque utilizzareindifferentemente F o L.

Il metodo iterativo utilizzato e una forma di discesa del gradiente. Perdefinizione: T

pU

k+1

=

TpU

k

− α∇L.

Dal momento che le variabili non sono indipendenti tra loro, l’algoritmoprevede un aggiornamento dei vettori in funzione di un unico grado di liberta,la velocita del fluido U .

Scelto un passo di avanzamento α costante, avremo:

Uk+1 = Uk − αLU

Il criterio di arresto e funzione dei seguenti parametri:

• il modulo di ∇L, che deve essere prossimo a zero in corrspondenza delminimo;

• |Uk+1−Uk|: il passo di avanzamento deve essere maggiore di una certasoglia minima;

• un numero massimo di iterazioni, arbitrario.

Il metodo del gradiente formulato in questa maniera ha un limite: sebbene ladirezione scelta sia sicuramente di discesa, non ci sono garanzie che il passo αimplichi una riduzione effettiva del valore della funzione obiettivo. Potrebbeinfatti essere troppo piccolo, e quindi due passi successivi darebbero soluzionisenza miglioramenti significativi, oppure essere troppo grande, e dunquetrovare al nuovo passo una soluzione peggiore della precedente. La cosa piufacile che si puo fare per ovviare almeno in parte questo problema, e scegliereun passo α inizialmente “grande” e ad ogni iterazione tenere in memoria iprecedenti valori del funzionale, del controllo Uk e dell’ampiezza del passo.Se il nuovo valore Uk+1 fornisce una soluzione peggiore della precedente, siritorna al valore Uk e si ricalcola Uk+1 con un passo ridotto, ad esempio

Uk+1 = Uk +α

2LU .

22

4.2 Il metodo FEM

I problemi di stato e aggiunto verranno risolti implementando un solutoreagli elementi finiti. La teoria generale di questo metodo e ben nota, e dunqueci limitiamo a mostrare come si specifica il metodo applicato al nostro pro-blema particolare. Scegliamo di usare funzioni di base lineari (elementi finitiP1), su una griglia Th di elementi triangolari, quindi

T (x) =∑i∈Th

Tiϕi(x), p(x) =∑i∈Th

piϕi(x),

dove Ti, pi ∈ R e le ϕi(x) sono le classiche funzioni a capanna, centrate neinodi i che formano la base di Xh .

4.2.1 Il problema di stato

Il metodo FEM si basa sulla risoluzione di un sistema algebrico, dove lai-esima riga corrisponde all’equazione lineare∑

j

Tja(ϕj(x), ϕi(x)) = 〈F , ϕi(x)〉∗ (4.2)

nei coefficienti Tj . E dunque naturale esprimere (4.2) come un sistemalineare del tipo AsT = b, dove

[As]ij = a(ϕj(x), ϕi(x))

=∫

Ωk∇ϕj(x) · ∇ϕi(x) + U

∫Ωη(y)∂xϕj(x)ϕi(x)

= [Ad]ij + U [At]ij

(4.3)

ebi = 〈F , ϕi(x)〉∗ =

∫Γ3

qϕi(x)dΓ.

Con Ad e At indichiamo rispettivamente le componenti di diffusione e tra-sporto della matrice del problema si stato As. Tali matrici sono costantidurante l’esecuzione dell’algoritmo risolutivo e possono dunque essere calco-late una sola volta. Al momento di risolvere il sistema lineare, verranno poilegate attraverso la relazione (4.3).

In fase di assemblaggio bisognera anche imporre le condizioni di Dirichlet:poiche i nodi di Dirichlet sono pochi rispetto al totale della mesh, utilizze-remo un metodo di penalizzazione. Se all’indice k corrisponde un nodo diDirichlet, porremo

Akk = M e bk = gkM,

con M sufficientemente grande (M = 1030).

23

4.2.2 Il problema aggiunto

Dall’espressione di (PA), ricaviamo la formulazione algebrica seguente:

[Aa]ij =∫

Ωk∇ϕj(x) · ∇ϕi(x) + U

∫Ωη(y)ϕj(x)∂xϕi(x) = [Ad]ij + U [At]ij

ebi =

∫Γ3

(T − Td)ϕi(x)dΓ.

Pertanto, la formulazione algebrica del problema aggiunto si ricava facil-mente da quella del problema di stato, in quanto

Aa = ATs = Ad + UAT

t .

L’ imposizione delle condizioni al contorno segue direttamente dalla penaliz-zazione imposta per le matrici del problema di stato (gli elementi penalizzatisono sulla diagonale e i nodi su cui imporre le condizioni di Dirichlet sonogli stessi).

4.2.3 Tecniche di stabilizzazione

Nel caso di elementi finiti lineari, tra gli approcci “ottimizzare-poi-stabilizza-re” e “stabilizzare-poi-ottimizzare” non ci sono differenze sostanziali, inquanto non si “vedono” i cambiamenti di segno nei termini che coinvolgonoderivate di ordine superiore al primo.

Sia hK il diametro del K-esimo elemento della mesh Th. Il terminecorretto da aggiungere alla forma debole di (PA) e

Eh(T, f, v;u) =∑

K∈Th

δhk

∫KUη(x)∂xT∂xv dx.

In entrambi i casi, il problema di stato stabilizzato diventa:

trovare T ∈ Xh : a(T, ϕ;U) + Eh(T, f, ϕ;U) = (f, ϕ),∀ϕ ∈ Xh

e analogamente per il problema aggiunto.Nel problema discretizzato, la stabilizzazione si traduce in un ulteriore

contributo alle matrici di stato e aggiunto. Per lo stato

As = Ad + UAt + UAst,

e per la simmetria di Eh(T, f, v;u), per l’aggiunto avremo

Aa = Ad + UATt + UAst.

In entrambi i casi

[Ast]ij = δ

∫Ωhtr(x)η(x)∂xϕj(x)∂xϕi(x) dx.

La funzione costante a tratti htr(x) associa ad ogni elemento K ∈ Th ilproprio diametro hK .

24

4.3 Dettagli implementativi

In questa sezione, diamo una panoramica sulla struttura che abbiamo da-to al codice e sulle scelte di programmazione che abbiamo seguito, senzaaddentrarci eccessivamente nei dettagli, per i quali rimandiamo alla docu-mentazione Doxygen del codice ed eventualmente ai commenti all’interno dellistato.

Deliniamo dunque l’elenco delle operazioni che il codice che deve eseguireper poter risolvere il problema:

• raccolta iniziale dei parametri del problema (valore iniziale U0, passodi griglia N , numero max di iterazioni...);

• creazione della griglia di calcolo;

• assemblaggio delle matrici e dei termini noti dei sistemi lineari associatiai problemi stato e aggiunto;

• ciclo iterativo;

• post-processing e visualizzazione risultati.

Le fasi principali di programmazione saranno percio:

• creare la griglia di calcolo Th e memorizzarla in una struttura datiopportuna;

• creare un integratore (sia monodimensionale che bidimensionale), percalcolare gli elementi della matrice A e dei termini noti, la Lagrangianae la sua derivata;

• progettare in modo semplice la scelta del metodo di stabilizzazione;

• assemblare le matrici e i termini noti dei problemi;

• risolvere in maniera efficiente i sistemi lineari dei problemi discretiz-zati;

• creare una struttura dati per i dati U,L, etc. . . , adatta al metodoiterativo e alla visualizzazione dei risultati.

Per memorizzare matrici e vettori decidiamo di usare la libreria uBLAS ap-partenente alle Boost C++ Libraries, che fornisce gia implementate fun-zionalita di algebra lineare per vettori e matrici, incluse varie modalita dimemorizzazione sparsa per matrici; per alcune funzionalita useremo i con-tenitori map e set della Standard Template Library. I sistemi lineariverranno risolti tramite la liberia UMFPACK (versione 4.4), che implemen-ta un metodo di risoluzione diretto molto efficace nel caso di sistemi lineari

25

con matrici sparse. In questo modo, inoltre, la scelta di inserire le con-dizioni al bordo di Dirichlet con il metodo di penalizzazione non infuenzaparticolarmente la velocita di risoluzione del sistema lineare.

4.3.1 La griglia

Scegliamo di utilizzare FreeFem++ come generatore di griglie. Bisogneraquindi fare in modo che il programma C++ lanci uno script FreeFem++(tramite il comando system() incluso nella libreria cstdlib) che generiuna griglia e la salvi su file (.msh); a sua volta il file verra letto dal pro-gramma (librerie fstream e string) in modo da memorizzare la griglia inuna struttura dati adeguata.

Un file .msh e organizzato in questo modo:

• una prima riga che contiene il numero di vertici, il numero di elementie il numero di lati;

• una riga per ogni nodo (nella riga i sono memorizzate le informazionisul nodo i), con le coordinate e un’etichetta che indica il gruppo diappartenenza del nodo: 0 per i nodi interni, 1 per il pezzo di bordonominato 1 etc;

• una riga per ogni elemento, con gli identificativi dei 3 nodi che locostituiscono e un’etichetta;

• una riga per ogni lato di bordo, con gli identificativi dei 2 nodi chelo costituiscono e un’etichetta che indica a quale parte del bordoappartenga.

Organizziamo la struttura dati che gestisce la mesh con cinque classi:

1. class Punto ;

2. class Forma ;

3. class Elemento ;

4. class Lato ;

5. class Mesh .

Classe Punto

class Punto

private:int id;int bordo;

26

bvett_2 coord;Real * stato;Real * aggiunto;...

Un oggetto di classe Punto contiene le coordinate del nodo della mesh cherappresenta, il rispettivo numero d’ordine identificativo e un parametro(bordo) che memorizza a quale parte del bordo del dominio il punto ap-partiene.

Inoltre si osservi che, una volta create la mesh e la struttura dati cherisolve il problema, avremo memorizzati un vettore di nodi e un vettore diincognite. Nella posizione i del vettore delle incognite sara memorizzatoil valore del grado di liberta associato all’ i -esimo nodo del vettore deinodi. Dato un nodo, e utile riuscire a risalire facilmente al valore del gradodi liberta associato, ad esempio quando si devono calcolare gli integrali sulbordo Γ3. Per fare questo dotiamo quindi la classe Punto di due puntatori(stato e aggiunto), che puntano all’area di memoria che verra occupatadai gradi di liberta associati al nodo (che e sempre la stessa perche comevedremo il costruttore della struttura dati che risolve i problemi alloca subitoil vettore della dimensione corretta).

Classe Forma

class Forma

protected:...vector<Punto*> vertici;bvett_2 c;bmatr B;...

Gli elementi della mesh, cioe lati ed elementi, hanno una struttura con-cettualmente simile, quindi implementiamo una classe Forma da cui eredite-ranno le classi Lato e Elemento. Una generica Forma contiene:

• un vettore di puntatori ad oggetti Punto (e non di oggetti Punto . Dalmomento che la struttura dati della mesh conterra tutti i nodi in unvettore, sarebbe inutile memorizzarli una seconda volta);

• una matrice B ∈ R2×2 e un vettore c ∈ R2, che definiscono la mappalineare affine

x = Bx + c (4.4)

fra l’oggetto elemento/lato instanziato e l’elemento/lato di riferimento.

27

Classe Elemento

class Elemento : public Forma

private:Real ht;...

La classe Elemento possiede un membro aggiuntivo rispetto a Forma , chee la misura del proprio diametro ht. Questa viene calcolata dal costruttore,che inoltre specifica i coefficienti di B e c, in modo che l’elemento vengamappato nel triangolo di riferimento, i cui vertici sono (0, 0), (1, 0), (0, 1).Indicando con x le coordinate del nodo sulla griglia e con x le coordinatedel punto corrispondente nell’elemento di riferimento, possiamo calcolareesplicitamente tali coefficienti risolvendo il sistema lineare di 6 equazioninelle 6 incognite bij , cj(

xy

)=

[b11 b12b21 b22

](xy

)+

(c1c2

),

considerando un generico elemento (x1, y1), (x2, y2), (x3, y3) ed imponendoche tali punti vengano mappati rispettivamente in (0, 0), (1, 0), (0, 1) (dovre-mo tenere conto di questa convenzione quando implementeremo l’integra-tore). Il sistema si risolve banalmente 1 e porta a:

B =[x2 − x1 x3 − x1

y2 − y1 y3 − y1

], c =

(x1

y1

). (4.5)

Classe Lato

class Lato : public Forma

private:int bordo;Real l;...

Serve a memorizzare i lati del bordo. l e la lunghezza del lato e la map-pa riporta sul segmento di riferimento (0, 1) tramite una rotazione, unatraslazione e una dilatazione.

1B e invertibile se

0 6= (x2 − x1)(y3 − y1)− (y2 − y1)(x3 − x1).

Cio esprime il fatto geometricamente intuitivo che i tre punti non devono appartenere allastessa retta, cioe che il triangolo non deve essere degenere.

28

Classe Mesh

class Meshprivate:

...vector <Punto> v_nodi;vector <Lato> v_lati;vector <Elemento> v_elementi;vector<int> nodi_d;

vector<int> lati_n;...

Un oggetto di classe Mesh deve memorizzare (ricevendoli in ingresso dafile) un vettore contenente tutti i nodi (v_nodi), uno con tutti gli elementi(v_elementi) ed uno con tutti i lati (v_lati; ricordiamo che Elemento eLato non memorizzano i propri punti, ma solo puntatori a Punto ). Inol-tre dotiamo la classe Mesh di altri due vettori di interi, nodi_d e lati_l .Il primo memorizza le posizioni dei nodi di Dirichlet nel vettore v_nodi etornera utile al momento di imporre le penalizzazioni alle matrici dei sistemirisolventi; il secondo analogamente memorizza le posizioni dei lati del bordoΓ3 su cui va imposta la condizione di Neumann non omegenea, che costitui-sce il termine noto del sistema. Questi vettori vengono aggiornati durantela lettura del file di mesh, quindi in modo abbastanza efficiente, sfruttandole informazioni che il file .msh fornisce. Ad esempio, per i nodi di Dirichlet:

std::ifstream infile("mesh.msh");...

for (int i=0; i<n_nodi; ++i)

infile >> X >> Y >> tipo;v_nodi[i] = Punto(i+1,tipo,X,Y);if (tipo==1) // nodo di Dirichlet,

aggiorno nodi_d

nodi_d.resize(j+1);nodi_d[j]=i;++j;

e analogamente per i lati di Γ3.

4.3.2 Integratore numerico bidimensionale

In questo progetto non implementiamo degli integratori generali, ma sfrut-tiamo la caratteristiche del problema in questione, cercando di garantire lostesso la modularita del codice, in modo che esso sia facilmente estendibile.

29

Servono due tipi di integratore: uno bidimensionale per le forme bilineari(problemi, stabilizzazioni, L e dL) e uno monodimensionale per i contribu-ti di bordo. In entrambi i casi useremo formule di quadratura gaussiana,e il modo di strutturare le classi sara simile ma con una differenza fonda-mentale fra i due integratori: per quello bidimensionale riporteremo tutti icalcoli sull’elemento di riferimento, esplicitando il cambio variabili x → x(ed e per questo motivo che abbiamo dotato gli oggetti Elemento con lemappe locali), mentre per quello monodimensionale faremo il contrario, cioericalcoleremo ogni volta i nodi e i pesi sull’intervallo reale di integrazione.

Considerando la struttura del problema, si nota che gli integrali bidi-mensionali da calcolare sono solo tre: i termini di diffusione e trasportodella forma bilineare e il contributo delle stabilizzazioni. Inoltre, osservi-amo che l’integratore serve in due diverse fasi del programma: per il calcolodegli elementi della matrice, dove si devono valutare espressioni del tipoa(ϕj(x), ϕi(x)) (quindi integrande a supporto locale, su un singolo elemen-to della griglia), e per la valutazione di L e dL, dove compaiono espressionicome a(T, p), quindi integrazioni globali sul dominio. In realta, basta imple-mentare l’integratore locale, perche una volta costruita A e risolti i problemistato e aggiunto, l’integrale globale a(T, p) si puo valutare semplicementecome a(T, p) = pTAT .

In virtu del fatto che le integrande sono solo tre, scegliamo di scrivere levalutazioni degli integrali locali direttamente come metodi dell’integratore,che riceverranno in ingresso l’elemento su cui eseguire il calcolo e le duefunzioni ϕi(x) e ϕj(x) che compongono l’integranda (oltre alla funzione chedefinisce il profilo del campo di trasporto η). La chiamata sara quindi deltipo:

Elemento E;Integratore I;real I.valuta_diffusione(E, phi_i, phi_j)

Il calcolo verra eseguito sull’elemento di riferimento, quindi le integrandedei tre metodi andranno riscritte esplicitando gli Jacobiani che seguono dalcambio variabili:

x = Bx + c ⇒ ∇xϕi(Bx + c) = (B−1)T∇xφi(x),

dove φi(x) = ϕi(Bx + c). Sull’elemento di riferimento le funzioni di basedei P1 si scrivono come:

• φ(0,0)(x) = φ0(x) = 1− x− y ⇒ ∇xφi(x) = (−1,−1)T ;

• φ(1,0)(x) = φ1(x) = x ⇒ ∇xφi(x) = (1, 0)T ;

• φ(0,1)(x) = φ2(x) = y ⇒ ∇xφi(x) = (0, 1)T .

30

Ad esempio, se il nodo i e memorizzato come secondo nel vettore dei no-di dell’elemento allora verra mappato in (1, 0) (vedi Class Elemento ), equindi la forma di φi(x) sara proprio la funzione di base centrata in (1, 0).I tre contributi da integrare diventano:

[Ad]ij =∫

Ωk(∇T

xφj(x)B−1)((B−1)T∇xφi(x))|B|dx

[At]ij =∫

Ωη(b21x+ b22y + c2)(∇T

xφj(x)B−1 · i)φi(x)|B|dx

[Ast]ij = δ

∫Ωhtrη(b21x+ b22y + c2)∇T

xφj(x)B−1B−T∇xφi(x)|B|dx

Per implementare l’integratore saranno pertanto necessarie tre classi:

1. Class FunzBase ;

2. Class Integratore ;

3. un insieme di classi di ugual tipo, Regola_grado_1, Regola_grado_2,Regola_grado_3 . . .

Classe FunzBase

class FunzBase

private:int ID;vector<Real> f;bvett_2 Gradf;...

Le formule di quadratura prevedono di approssimare∫f '

∑i αif(xi).

Serve allora avere a disposizione il campionamento delle funzioni di base cheformano le integrande nei punti di integrazione. Ciascuna delle tre funzionidi base sull’elemento di riferimento e memorizzata con un oggetto di classeFunzBase ed e identificata dall’etichetta ID, secondo la solita convenzione. Ilcostruttore della classe FunzBase prende in ingresso un vettore che contienei nodi di integrazione e memorizza φID(x) nel vettore f. Per memorizzareil gradiente basta un vettore di R2, visto che e un valore costante.

Classe Integratore

class Integratore

protected:int grado;int dimensione;

31

vector<Real> vett_pesi;vector<Punto> vett_punti;bounded_vector<FunzBase,3> vett_base;

public:...Real valuta_diff(Elemento const & E,

const int ID1,const int ID2);Real valuta_trasp(Elemento const & E, int const ID1,

int const ID2, funzione profilo );Real valuta_stab(Elemento const & E, int const ID1,

int const ID2, funzione profilo);...

La classe Integratore contiene l’interfaccia comune alle regole di inte-grazione che verranno in seguito specificate tramite ereditarieta pubblicada Integratore . Un oggetto Integratore contiene un vettore di pesi, unvettore di punti e contiene tre oggetti FunzBase (relazione has-a). I metodidi integrazione non fanno altro che scorrere la lista dei nodi e per ognunocalcolare il contributo αif(xi), dove f indica il contributo [Ad]ij etc. . . ; lefunzioni che compongono l’integranda vengono indicate al metodo tramitela loro etichetta identificativa: ID1=i⇒ φi(x), ID2=j⇒ φj(x).

Classe Regola grado 1, Regola grado 2, Regola grado 3

class Regola_grado_1 : public Integratoreclass Regola_grado_2 : public Integratoreclass Regola_grado_3 : public Integratore

Queste classi ereditano da Integratore : non aggiungono ne metodi, nemembri, ma specificano la posizione dei nodi di integrazione e i valori deipesi (gia moltiplicati per l’area del triangolo di riferimento, pari ad 1/2).Ad esempio, per class Regola_grado_1:

vett_pesi(0)=1.0/6.0;vett_pesi(1)=1.0/6.0;vett_pesi(2)=1.0/6.0;

vett_punti(0)=Punto(0.0,0.0);vett_punti(1)=Punto(1.0,0.0);vett_punti(2)=Punto(0.0,1.0);

vett_base(0)=FunzBase(0,vett_punti);vett_base(1)=FunzBase(1,vett_punti);vett_base(2)=FunzBase(2,vett_punti);

32

4.3.3 Integratore numerico monodimensionale

I termini monodimensionali da integrare sono:

1.∫

Γ3

qv1;

2.∫

Γ3

(T − Td)vi;

3.∫

Γ3

(T − Td)2;

dove le vi sono le restrizioni al bordo delle funzioni di base centrate nei nodidi Γ3. Ad esempio, dati due lati [a, b] e [b, c], la restrizione al bordo di ϕb,vb e :

vb = ϕb|Γ3=

x− a

b− ase a ≤ x ≤ b

b− x

c− bse b ≤ x ≤ c

Gli integrali dei termini noti sono pertanto integrali su supporti locali equindi la cosa piu efficiente e creare un integratore locale che riceva in in-gresso il lato su cui integrare; per semplicita e analogia con quanto fattoprima, implementeremo questi integratori locali come metodi di una classe,con chiamate del tipo:

lato L;integratore_1D R;R.valuta_b_stato(L);

Prima di scrivere questi metodi, semplifichiamo le scritture degli integrali,sfruttando la forma di vi e il fatto che T =

∑Tiϕi(x).

1. se [a, i] ∪ [i, b] = spt(vi)

∫Lqvi =

0 se L 6= [a, i], L 6= [i, b]

q12(i− a) se L = [a, i]

q12(b− i) se L = [i, b]

33

2. se L = [i, j]

∫L(T − Td)vk =

0 se k 6= i, k 6= j

∫ j

i(Tivi + Tjvj − Td)vi

=∫ j

i(Ti

j − x

j − i+ Tj

x− i

j − i− Td)

j − x

j − ise k = i

∫ j

i(Tivi + Tjvj − Td)vi

=∫ j

i(Ti

j − x

j − i+ Tj

x− i

j − i− Td)

x− i

j − ise k = j

3. se L = [i, j]∫L(T − Td)2 =

∫ j

i(Tivi + Tjvj − Td)2 =

∫ j

i(Ti

j − x

j − i+ Tj

x− i

j − i− Td)2

E sufficiente allora implementare una formula di quadratura di grado 2 percalcolare esattamente tutti i contributi. La regola gaussiana di grado 2 edefinita sull’intervallo [−1, 1]; come gia scritto, per l’integratore monodi-mensionale al posto di riportare gli integrali su tale intervallo, ricalcoliamo inodi sull’intervallo attuale di integrazione, tramite la mappa [−1, 1] → [i, j]:

x =i+ j

2+j − i

2x

Bisogna ricordarsi di modificare anche i pesi di integrazione:∫ 1

−1f dx '

∫ 1

−1

∑k

fkψ(x)k dx =∑

k

fk

∫ 1

−1ψ(x)k dx =

∑k

fkαk

dove le ψ sono opportune funzioni di base dell’intervallo [−1, 1], quindi∫ j

if dx =

∫ j

i

∑k

fkψ(x)k dx =∑

k

fk

∫ j

iψ(x)k dx

=∑

k

fk

∫ 1

−1ψ(x)k

j − i

2dx =

∑k

fkj − i

2

∫ 1

−1ψ(x)k dx

=∑

k

fkj − i

2αk =

∑k

fkαk

Implementeremo anche l’integratore monodimensionale con una strutturaereditaria, in modo identico a quanto fatto per l’integratore bidemnsionale.

34

4.3.4 La struttura dati per i problemi

Gli integratori e la struttura Mesh sono le basi su cui progettare la strutturadati dei problemi. Le funzionalita che deve avere questa struttura sonoprincipalmente:

• assemblare matrici e termini noti;

• risolvere il sistema;

• consentire l’impiego di una stabilizzazione.

Poiche queste sono in comune ad entrambi i problemi, e vogliamo che essiabbiano una interfaccia comune, creeremo una classe virtuale Problema cheracchiudera le funzionalita comuni, e due classi pb stato e pb aggiuntoche ereditano da Problema e ne specificano i metodi.

In particolare entrambi i problemi dovranno memorizzare una Ad, unaAt, una Ast, un termine noto, un vettore di incognite (che verra legato alvettore v_nodi di Mesh ), le costanti del problema, il profilo del flusso e unmodo per gestire la stabilizzazione.

Abbiamo gia sottolineato i legami fra le matrici dei problemi stato eaggiunto, quindi gli assemblatori delle matrici di pb stato e pb aggiuntosaranno diversi fra di loro (sostanzialmente pb aggiunto si limitera a co-piare le matrici di pb stato ). Una volta assemblate le matrici pero la lorocombinazione e uguale (As = Ad + UAt + UAst, e analogo per Aa) e anchela soluzione del sistema lineare, quindi queste due funzioni possono essereimplementate gia nella classe Problema . La gestione della stabilizzazioneavviene tramite una classe esterna, indirizzata da un puntatore.

class problema

protected:

vector<Real> x;Real U;Real const k;Real const q;funzione profilo;

smatr A;smatr A_diff;smatr A_trasp;

vector<Real> b;Mesh & M;

stabilizzazione * S;Regola_grado_3 R;

35

Regola_grado_2_1D Q;...

public:

virtual void assembla_diff()=0;virtual void assembla_trasp()=0;void assembla_A();virtual void assembla_b()=0;void solve();...

class pb_stato : public problema

public:

pb_stato(Real const u0, Real const diff,Real const cal, Mesh & m);

virtual void assembla_diff();virtual void assembla_trasp();virtual void assembla_b();

;

class pb_aggiunto : public problema

private:

Real Td;pb_stato& P;

public:

pb_aggiunto(pb_stato& p, Mesh & m, Real const temp);virtual void assembla_diff();virtual void assembla_trasp();virtual void assembla_b();

inline Real get_Td() return Td;;

Stabilizzazioni

class stabilizzazione

private:

36

Real const k;Real delta;funzione profilo;Mesh const& M;Regola_grado_3 R;smatr A;...

public:

void assembla_stab();smatr const & get_A () const return A;...

La classe stabilizzazione contiene essenzialmente una matrice Ast e i parame-tri del problema (δ, k...); Ast verra assemblata in modo identico alle Ad, At

(vedi sez. seguenti). Decidiamo di implementare la stabilizzazione conuna classe separata dalla classe problema, perche cosı otteniamo un codicemodulare e piu flessibile, in cui e facile attivare/disattivare la stabilizzazione.In Problema inseriamo la stabilizzazione con: stabilizzazione * S (mo-dificabile con il metodo void set_stab (stabilizzazione const &s)) equindi per utilizzare Ast basta S->get_A().

La classe necessita anche di un metodo che verifichi che la condizione(3.1) su δ per ottenere Pe < 1 sia rispettata.

Ovviamente δ non puo variare ad ogni iterazione, altrimenti non si hapiu convergenza del ciclo iterativo (visto che δ entra nel calcolo della la-grangiana): bisogna trovare un valore costante che sia valido per tutte leiterazioni, o comunque minimizzare il numero degli aggiornamenti. Per farequesto utilizziamo il parametro Us: Us e una stima fornita dall’utente delmassimo valore che U assumera durante il ciclo iterativo, e su questa stimaviene tarato delta.

Se durante il ciclo questa stima non viene rispettata, delta viene riag-giornato solo temporaneamente, nel modo seguente. L’insieme U > 0 deivalori possibili di U viene diviso in intervalli di lunghezza Us: 0-Us, Us-2 Use cosı via, e ad ogni intervallo viene assegnato il delta corrispondente allaU massima dell’intervallo: 0 < U < Us⇒ δ(Us), Us < U < 2Us⇒ δ(2Us). Ad ogni iterazione si guarda in quale intervallo si trova U , e si assegna adelta il valore dell’intervallo corrispondente. Facendo cosı, se la stima Us ebuona, delta varra sempre δ(Us), tranne in qualche episodio di sforamentoin cui varra δ(2Us).

In questo modo si garantisce sempre la stabilizzazione del problema, esi riducono gli aggiornamenti di delta, per non compromettere la conver-genza. Se la convergenza non si verifica, bastera alzare la soglia Us in modo

37

opportuno. Ovviamente la scelta di Us va fatta con attenzione: Us bassa faperdere la convergenza, Us alta introduce una viscosita numerica eccessiva.

Assemblaggio della matrici

Il calcolo dei singoli [Ak]ij necessita di alcune attenzioni: calcolarli uno allavolta e molto svantaggioso computazionalmente, perche e costoso rintrac-ciare tutti gli elementi finiti che costituiscono il dominio di integrazione dia(ϕj(x), ϕi(x)). E molto piu efficiente eseguire un ciclo su tutti gli elementidella griglia, e per ciascuno calcolare tutti i contributi che esso fornisce allamatrice A; ad esempio, l’elemento con vertici i nodi i = 2, 5, 9 aggiornera glielementi [Ak]22, [Ak]25, [Ak]29, [Ak]52, [Ak]55, [Ak]59, [Ak]92, [Ak]95, [Ak]99, chesi calcolano con i metodi valuta_diff, valuta_trasp, valuta_stab dellaclasse Integratore . Quanto appena detto corrisponde al codice:

...Regola_grado_3 Q;Mesh M;...

void pb_stato::assembla_diff()

int elem( M.get_n_elementi() );

Real a(0);int I(0);int J(0);

for(int K=0; K<elem; K++)for(int i=0; i<3; i++)I=(M.get_v_elementi()[K]).get_vertici()[i]->get_id()-1;for (int j=0; j<3; j++)a=R.valuta_diff(M.get_v_elementi()[K],i,j);J=(M.get_v_elementi()[K]).get_vertici()[j]->get_id()-1;A_diff(I,J)+=a;

A_diff*=k;

Inoltre, poiche sommeremo le tre matrici, dobbiamo imporre le condizionial bordo sui tre pezzi separatamente, quindi:

for (unigned int i=0; i<quali_righe.size(); i++)I=quali_righe[i]; // seleziono la riga di DirichletA_diff(I,I)*=pow(10,30);

38

Analogamente per la At, avremo void pb_stato::assembla_diff(). Peril problema aggiunto invece sara semplicemente:

pb_stato P;...void pb_aggiunto::assembla_diff()

...A_diff= P.get_diff();...

void pb_aggiunto::assembla_diff()

...A_trasp=trans(P.get_trasp());...

Il calcolo delle componenti del termine noto bi = 〈F , ϕi(x)〉∗ =∫Γ3qϕi(x)dΓ

e ancora analogo: si scorrono tutti i lati (i, j) etichettati come Γ3, e suciascuno si calcolano i due contributi dovuti a ϕi(x) e ϕj(x).

Risoluzione del sistema lineare

UMFPACK risolve un sistema lineare utilizzando 5 routines in cascata:

• umfpack_*_symbolic effettua un riordino delle colonne della matrice;

• umfpack_*_numeric calcola la fattorizzazione LU;

• umfpack_*_solve risolve il sistema con un metodo diretto (migliora-mento iterativo opzionale);

• umfpack_*_free_symbolic e umfpack_*_free_numeric dealloca-no gli oggetti temporanei utilizzati dalle routines precedenti.

Il formato richiesto da queste routines e il formato CSC (Compressed SparseColumn), che e implementato anche in uBLAS,

compressed_matrix<double,column_major>.

Tale formato potrebbe essere scomodo da utilizzare per costruire la matrice,e in effetti UMFPACK e dotato anche di una routine che converte una matricein formato COO (Coordinates), piu maneggevole di una matrice CSC. D’altraparte il formato COO in ingresso a tale funzione e quello tradizionale contre vettori, mentre uBLAS lo implementa con un array associativo, quindiservirebbe una ulteriore conversione preliminare prima di risolvere il sistema.

Di fatto l’inserimento di elementi in una matrice CSC di uBLAS e moltopiu efficiente dell’inserimento in una matrice COO 2, quindi decidiamo di

2con un semplice programma test che valuta l’inserimento sia in ordine sequenziale chein accesso casuale.

39

utilizzare questo tipo di formato. La dichiarazione che assicura compatibilitacon UMFPACK e

compressed_matrix <double,column_major,0,unbounded_array<int> >.

I tre vettori si recuperano come:

unbounded_array<int> & Ap=A.index1_data();unbounded_array<int> & Ai=A.index2_data();unbounded_array<double> & Ax=A.value_data();

Poiche UMFPACK riceve in ingresso dei puntatori a vettori nativi, per usare ivettori contenuti in CSM, bisogna chiamare le routines come:

(void) umfpack_di_solve (UMFPACK_A,&Ap[0], &Ai[0], &Ax[0], &x[0], &b[0], Numeric, null, null) ;

4.3.5 Struttura dati per il ciclo iterativo

Lo pseudo-codice del ciclo iterativo e:

while (dL > err && it<it_max && |U_(k+1) - U_k| > err )

risolvi stato;risolvi aggiunto;

calcola F;calcola dL;

if F<F_opt

sol_opt=sol_curr;

while ( U_(k+1)<0 )calcola U_(k+1); //avanza da U_k a U_(k+1)

else

while ( U_(k+1) <0 )aggiorna U_(k+1);//se F>F_opt il passo e stato eccessivoe bisogna ricalibrarlo

Per implementare questo ciclo utilizziamo due classi:

• una classe Iterata che si occupa delle operazioni di avanzamento delciclo: calcola F , dL, Uk+1, e salva i valori di T e p per la visualiz-zazione;

40

• una classe Funzionale che memorizza il campionamento di F e dLnei punti Uk visitati dal ciclo, e li prepara per la visualizzazione.

Alla fine il ciclo sara:

pb_stato T(u0,k,q,M);pb_aggiunto p(T,M,Td);

stabilizzazione S(u0,k,M,delta);T.set_stab(S);p.set_stab(S);

Iterata curr(T,p,dim,alfa,beta,toll_passo_u);Iterata best(T,p,dim,alfa,beta,toll_passo_u);Funzionale F(itermax);

while (err>toll_gradiente && curr.get_iterazione()<itermax &&curr.get_stop()==false)

curr.aumenta_iter();

T.solve();p.assembla_b();

/* il termine noto dell’aggiunto dipende dallatemperatura appena calcolata */

p.solve();

curr.calcola_F(M);curr.calcola_dL(T,p,S);err=fabs(curr.get_dL());

F.memorizza_punto(curr);

if (curr.get_F() < best.get_F())//avanzo e tengo memoria del nuovo ottimo

cout<<" sto migliorando, proseguo \n";best=curr;best.set_T( T.get_x() );best.set_p( p.get_x() );curr.avanza_U();

else

cout<<" ho peggiorato, torno indietro \n";curr.ricalcola_U(best.get_U());

// se troppo piccolo stop=true

T.set_U( curr.get_U() );p.set_U( curr.get_U() );

41

F.salva_funzionale(curr);/* in curr che ho memorizzato il numero di iterazioni

giusto per ridimensionare i vettori F,U,dL */F.plot();

best.salva_iter(M);/* M serve per trovare i nodi e i valori di T su Gamma_3

per il plot (la mesh vera e propria viene recuperatadal file mesh.msh) */

best.plot();

Classe Funzionale

class Funzionale

private:...vector<Real> F;vector<Real> dL;vector<Real> U;

map<double,double> F_plot;map<double,double> dL_plot;

public:

...void memorizza_punto(Iterata const& it);

void salva_funzionale(Iterata const& it);

void salva_UF(char* nomefile);void salva_UdL(char* nomefile);

void plot();;

Ad ogni iterazione, l’oggetto Funzionale salva le coppie (U,F ) e (U, dL)con il metodo memorizza_punto, che riceve in ingresso l’oggetto Iteratacurr.

Per la memorizzazione utilizziamo i contenitori map della STL, con chia-ve Uk e valore Fk (dLk): questo e appropriato sia dal punto concettuale(perche e “traduzione informatica” delle funzioni) che algoritmico. Infatti,usando una map l’inserimento di una nuova coppia avviene in modo ordi-nato, mentre usando una struttura piu semplice (ad esempio due vettori)saremmo costretti a ricorrere a metodi sort prima della visualizzazione, che

42

andrebbero scritti con cautela perche bisognerebbe ordinare rispetto ad Uconservando la corrispondenza fra coppie (U,F ) ((U, dL)). Per visualizzarei risultati, l’oggetto Funzionale :

• scrive su file .dat le map, tramite il metodo salva_funzionale(...)che a sua volta richiama salva_UF(...) e salva_UdL(...);

• richiama tramite plot() uno script di GnuPlot che traccia i grafici eli salva in formato .eps.

Classe Iterata

class Iterata

protected:

vector<Real> T;vector<Real> p;

Real U;Real F;Real dL;

int iterazione;bool stop;

Regola_grado_3 R;Regola_grado_2_1D Q;

...

public:

void calcola_F(Mesh const& M);void calcola_dL(pb_stato const& S, pb_aggiunto const& A,

stabilizzazione const& SS);

void avanza_U();void ricalcola_U(Real const u_old);

void aumenta_iter();

void operator= (const Iterata& it);

void salva_Tp(char* nomefile);void salva_T_Gamma_3(char* nomefile, Mesh const& M);void salva_iter(Mesh const& M);...

;

43

class Iterata_stab_ott : public Iterata

public:...void calcola_dL(pb_stato const& P, pb_aggiunto const& D,

stabilizzazione const& S);;

La classe Iterata si occupa di:

• calcolre F e dL (la classe Iterata_stab_ott ridefinisce il calcolo di Lper il caso dell’approccio “stabilizza-poi-ottimizza”);

• salvare e visualizzare i campi T e p calcolati;

• calcolare Uk+1;

• garantire assegnamenti del tipo:

Iterata curr(...);Iterata best(...);

best=curr;

Per il calcolo di F il metodo calcola_F(Mesh const & M) risale ai lati diΓ3 tramite Mesh ::get_lati_n(), li scorre tutti e per ciascuno calcola ilcontributo tramite il metodo Integratore 1d ::calcola_F() dell’oggettointegratore di cui la classe Iterata e dotata.

Nel caso del calcolo di dL invece usiamo l’equivalenza fra la formulazionevariazionale e quella algebrica:

dL = βU − pTAtT

nel caso non stabilizzato e nel caso dell’approccio “ottimizza-poi-stabilizza”,mentre nel caso “stabilizza-poi-ottimizza”

dL = βU − pTAtT − pTAstT.

I metodi per calcolare Uk+1 sono due: avanza_U() e ricalcola_U(...).Il primo va usato quando l’iterazione attuale ha trovato un nuovo minimotemporaneo e si deve proseguire verso l’ottimo; il secondo invece quandol’iterazione attuale e peggiore dell’ultimo minimo temporaneo trovato (adesempio Uk∗), e si deve scegliere una nuova Uk+1 intermedia fra Uk e Uk∗ .In entrambi i casi si controlla che la Uk+1 prodotta sia non negativa.

L’assegnamento best=curr si ottiene con un overload dell’operatore =;per dettagli, consultare la documentazione Doxygen .

44

Il metodo che visualizza i risultati (campi T e p, T |Γ3) procede al-lo stesso modo del corrispondente della classe Funzionale : il metodosalva_iter chiama salva_Tp e salva_T_Gamma_3, che salvano i dati su file.dat; in questo caso pero per creare i grafici usiamo uno script di FreeFem++(Tplot.edp).

Merita un commento il metodo salva_T_Gamma_3(...). Quello che ilmetodo deve fare e scrivere su file una coppia (xk, Tk) per ogni nodo k dei latidi Γ3; i valori che servono si raggiungono con i metodi della struttura datiMesh, Mesh::get_lati_n(), Mesh::get_v_lati(), Lato::get_vertici()Punto::get_x(), Punto ::get_stato().

Occorre pero fare attenzione: se scorriamo semplicemente i lati di Neu-mann, per ciascun lato risaliamo ai vertici e per ogni vertice memorizziamola coppia (xk, Tk) contiamo ogni punto due volte; occorre un passaggio in-termedio, che consiste nell’inserire i nodi (o meglio, le posizioni dei nodi diNeumann nel vettore Mesh ::v_nodi) in un set della STL, che non ammetteripetizioni. Fatto questo, con i nodi del set si crea facilmente una map, e poisi procede come nel caso dei metodi della classe Funzionale .

4.3.6 L’eseguibile

Forniamo tre eseguibili: uno per il caso dove non serve la stabilizzazione,uno per l’approccio stab-ott e uno per l’approccio ott-stab.

Ognuno di questi e sostanzialmente costituito dal ciclo iterativo; l’unicaaccortezza e quella di dichiarare la funzione main come

int main(int argc, char* argv[])

in modo da passare tutti i parametri del problema al lancio dell’eseguibile,senza dover ricompilare tutto ogni volta. La chiamata sara:

• senza stabilizzazione:

./controllo_nostab N k visc u0 q Td alfa beta toll_passo_uitermax toll_gradiente

• con stabilizzazione:

./controllo N k visc u0 q Td delta Us alfa beta toll_passo_uitermax toll_gradiente

dove:

• N e la fittezza della griglia (puo assumere valori fra 1 e 9);

• k e il coefficiente di diffusione del mezzo (ad esempio aria);

• visc e il coefficiente di viscosita del mezzo;

45

• u0 e la velocita di partenza per il ciclo;

• Td e la temperatura desiderata sulla superficie del chip;

• delta e la quantita di stabilizzazione desiderata;

• Us e la stima necessaria per la taratura di delta;

• alfa e il coefficiente di avanzamento su U del ciclo;

• beta e il coefficiente di coercivita del funzionale F ;

• toll_passo_u e l’avanzamento minimo fra Uk e Uk+1 per continuarecon il ciclo iterativo;

• itermax e il numero massimo di iterazioni consentite;

• toll_gradiente e il criterio per individuare il punto di minimo.

4.4 Cenni sulla stabilizzazione streamline-upwind

In questo progetto ci siamo concentrati sul metodo di stabilizzazione GaLS.Se si volesse utilizzare il metodo di stabilizzazione streamline-upwind sareb-bero necessarie alcune accortezze, sia dal punto di vista della trattazioneteorica che nell’implementazione.

Per quanto riguarda gli aspetti teorici i problemi sorgono dal fatto chele condizioni al bordo del nostro modello non sono di Dirichlet omogeneo.Questo implica che non e sufficiente aggiungere alla formulazione debole delproblema il termine

∫∇T∇v, ma occorre tenere conto anche dei contributi

sul bordo. Allo stesso modo non e immediato stabilire quali siano i contributida aggiungere alla Lagrangiana nell’approccio “stabilizza-ottimizza” in mo-do da ottenere tramite derivazione i problemi di stato e aggiunto che sianocorrettamente stabilizzati (una veloce prova con FreeFem ha evidenziatoinoltre inconstistenze fra lagrangiana e derivata).

Dal punto di vista dell’implementazione si dovrebbe complicare legger-mente la struttura delle stabilizzazioni: dal momento che upwind prevedecorrezioni anche ai termini noti, e che non si possa modificare il parametro δ,si dovrebbe prevedere una generica classe stabilizzazione, in cui definiredei metodi virtuali check_delta, assembla_stab e assembla_b, da speci-ficare nelle classi ereditarie Gals e upw, sfruttando nella classe problema enel main il polimorfismo per utilizzare l’una o l’altra stabilizzazione. An-drebbero aggiunti anche i metodi opportuni alle classi intrif e int1d, per ilcalcolo dei nuovi integrali. Cambierebbe infine anche il calcolo della derivatadella lagrangiana rispetto ad U , dL, per via dei termini al bordo aggiuntiviche comprenderebbero anche U .

46

Capitolo 5

Risultati numerici

In questo capitolo, mostriamo alcuni dei risultati numerici ottenuti eseguen-do il codice da noi scritto. Oltre alla visualizzazione di alcuni risultati al vari-are dei parametri significativi (fittezza della griglia, parametro di coercivitadel funzionale), illustreremo alcuni confronti tra i gli approcci “ottimizzare-poi-stabilizzare” e “stabilizzare-poi-ottimizzare”. Si noti (figure 5.1 e 5.2)che al diminuire del parametro di coercivita β, diminuisce la convessita delfunzionale.

36

38

40

42

44

46

48

50

52

54

56

14 16 18 20 22 24 26 28 6

8

10

12

14

16

18

20

22

18 20 22 24 26 28 30 32 34 36 38

Figura 5.1: Il funzionale F al variare di U , per β = 5 e β = 0.

-8

-7

-6

-5

-4

-3

-2

-1

0

1

2

3

14 16 18 20 22 24 26 28-4

-3.5

-3

-2.5

-2

-1.5

-1

-0.5

0

0.5

18 20 22 24 26 28 30 32 34 36 38

Figura 5.2: Derivata del funzionale lagrangiano LU al variare di U , per β = 5 e β = 0.

47

5.1 Il caso non stabilizzato

Imporre

Pe =|b|htr

2k< 1, ∀K ∈ Th,

equivale a risolvere un problema in cui non e necessario utilizzare alcunastabilizzazione. Questo si traduce in un vincolo sui valori di U possibili.Fissiamo k = 1; poiche |b| = Uη < U , imporremo:

Uhtr,max

2k< 1 ⇒ U <

2htr,max

dove htr,max e il diametro del triangolo con diametro maggiore. Impostandoil parametro di fittezza N = 2 si ottiene htr,max ' 0.08 ⇒ U < 25, mentrese N = 3 allora htr,max ' 0.053 ⇒ U < 40, e infine N = 4 ⇒ U < 50.Impostiamo anche ν = 1 di modo che la transizione a moto turbolentoavvenga a U = 1000, cioe lontano dalla zona di lavoro del ciclo iterativo, eβ = 5.

Risolviamo in successione per N = 2, 3, 4 (attraverso le impostazioniNO_STAB, NO_STAB_2, NO_STAB_3 nel target vai di Makefile): il vincolo suU e rispettato, e otteniamo che U converge a 8.49.

Il passo successivo e verificare cosa succede al diminuire del valore di β.Risolvendo per β = 5, 1, 0.1, 0.01, 0.001, 0 e evidente la funzione del terminecoercivizzante: man mano che il valore di β diminuisce e sempre piu difficiletrovare il minimo, perche il funzionale assume una forma sempre piu appiat-tita: a destra del minimo la crescita di F e molto lenta, mentre a sinistra delminimo c’e prima un intorno a crescita lenta, che diventa improvvisamenteripida, come e ben evidenziato nei grafici di F e dL in funzione di U ; si notiche anche per β = 0 si arriva a convergenza (cosa che non era garantita dallateoria).

Ovviamente, man mano che si diminuisce β, la temperatura sulla super-ficie di controllo e sempre piu vicina a quella desiderata, come era da aspet-tarsi, visto che il raffreddamento si ottiene aumentando il campo di trasportoe questo aumento e poco penalizzato con un β piccolo; tuttavia anche conβ = 0 (e quindi con assoluta liberta sulla scelta del campo di trasporto) nonsi ottiene una temperatura uniforme sulla superficie: di questo si dovrebbetenere conto in fase di progettazione del sistema di raffreddamento.

48

IsoValue-0.8866023.103116.6495210.195913.742317.288720.835124.381627.92831.474435 0208

IsoValue-0.32571.139952.442753.745555.048356.351157.653958.9567510.259611.562412 8651

Figura 5.3: Grafici di T e p per il valore ottimo U = 8.49, β = 5 e N = 2.

49

10

15

20

25

30

35

40

45

0.8 1 1.2 1.4 1.6 1.8 2

temperatura ottenuta

temperatura desiderata

10

12

14

16

18

20

22

24

26

28

0.8 1 1.2 1.4 1.6 1.8 2

temperatura ottenuta

temperatura desiderata

0

5

10

15

20

25

0.8 1 1.2 1.4 1.6 1.8 2

temperatura ottenuta

temperatura desiderata

Figura 5.4: Grafici della temperatura sul bordo Γ3, rispettivamente per β = 5, β = 0.1e β = 0

50

358

360

362

364

366

368

370

372

374

376

7.5 8 8.5 9 9.5 10

36

38

40

42

44

46

48

50

52

54

56

14 16 18 20 22 24 26 28 30

6

8

10

12

14

16

18

20

22

18 20 22 24 26 28 30 32 34 36 38

Figura 5.5: Grafici del funzionale F rispetto a U , rispettivamente per β = 5, β = 0.1 eβ = 0

51

-15

-10

-5

0

5

10

15

20

25

7.5 8 8.5 9 9.5 10

-8

-7

-6

-5

-4

-3

-2

-1

0

1

2

3

14 16 18 20 22 24 26 28 30

-4

-3.5

-3

-2.5

-2

-1.5

-1

-0.5

0

0.5

18 20 22 24 26 28 30 32 34 36 38

Figura 5.6: Grafici di LU rispetto a U , rispettivamente per β = 5, β = 0.1 e β = 0

52

5.2 Il caso stabilizzato: confronto tra gli approccidi risoluzione

I comandi da utilizzare sono: make vai_stabott per l’approccio “stabilizza-poi-ottimizza” e make vai_ottstab per “ottimizza-poi-stabilizza”. In unasituazione con Pe piccolo, utilizzando come set sia GALS_conf (Pe = 2.15nel minimo di ottstab), avremo:

stab-ott :

U= 13.9985, dove F= 1428.13, dL= 8.72585e-06

mentre ott-stab:

U= 13.9559, dove F= 1428.14, dL= 0.901044.

La situazione ovviamente peggiora man mano che il problema diventa atrasporto dominante. Lanciando GALS_conf_h (Pemax ' 769) otteniamo

stab-ott :

U= 42.9564, dove F= 8925.03, dL= -2.15862e-05

mentre ott-stab:

U= 42.2446,dove F= 8929.96, dL= 208.202 !!

E anche possibile confrontare i due approcci in un caso dove la stabiliz-zazione non e necessaria, ovvero se Pe < 1. Tuttavia, anche in questo casol’approccio ott-stab presenta alcune incongruenze sul valori di LU al minimo(vedi gals_conf_l, dove nell’ottimo Pe = 2/5 e δ e tarato su Pe = 4/5). Alcontrario, l’approccio stab-ott converge allo stesso valore della simulazionecorripondente non stabilizzata.

Cambiando la soglia Us (e quindi δ), il minimo corrisponde ad un valoredi U differente (confronto tra gals_delta con gals_conf_h): in particolareaumentando δ si introduce piu viscosita; pertanto, il calore disperso perdiffusione e maggiore e dunque risulta necessario un valore di U minore.Dalla definizione di lagrangiana:

L = F − a(T, p)− δEh(T,U, p),

e immediato notare che un’aumento di δ comporta una diminuzione di L.

53

IsoValue-1.486425.2024611.148117.093823.039528.985134.930840.876446.822152.767858 7134

IsoValue-1.28374.492959.6277514.762519.897325.032130.166935.301740.436545.571450 7062

Figura 5.7: Grafici di T e p all’ottimo, β = 5 e N = 2. L’appiattimento della sciadiffusiva e dovuto all’aumento del valore di U .

IsoValue-3.481477.6756917.593227.510637.428147.345657.263167.180677.09887.015596 933

IsoValue-6.3352114.473232.969551.465869.962288.4585106.955125.451143.948162.444180 94

Figura 5.8: Grafici di T e p all’ottimo, β = 5 e N = 2. L’appiattimento della sciadiffusiva e dovuto ad un ulteriore aumento del valore di U .

54

Le differenze tra le figure non sono dovute alla differenze tra gli approcciutilizzati per la stabilizzazione, ma soltanto a causa dei diversi valori deiparametri. Come fatto notare in precedenza, l’approccio stab-ott risulta piurobusto dal punto di vista algoritmico.

Passiamo alla viscosita tipica dell’aria (k = 2, 6 · 10−4): anche per valoridi β elevati (che dovrebbero garantire piu facilmente convergenza), l’ottimonon viene raggiunto in modo soddisfacente. Cio e dovuto sostanzialmenteall’impossibilita di infittire la griglia a piacere:

stab-ott :

U=53.7318, dove F= 13642.7, dL= -2.43734e-05.

Infine, sempre per valori reali dei parametri, il comportamento della tem-peratura sul chip (su Γ3) non varia sensibilmente rispetto alla diminuzionedi β. La coda del grafico risulta piu accentuata, a causa della maggiore ve-locita necessaria per raggiungere la condizione di ottimalita. In alcuni casiinoltre, il valore di T a destra e minore di Td: cio e causato dalla diffusivitamaggiora introdotta con la stabilizzazione.

0

5

10

15

20

25

0.8 1 1.2 1.4 1.6 1.8 2

temperatura ottenuta

temperatura desiderata

0

5

10

15

20

25

0.8 1 1.2 1.4 1.6 1.8 2

temperatura ottenuta

temperatura desiderata

Figura 5.9: Temperatura sul pezzo di bordo Γ3, rispetto alla temperatura desiderata (inverde), per β = 0. Il comportamento non varia sensibilmente all’aumentare del numero diPeclet.

55

Bibliografia

[1] R. Becker, Mesh adaptation for stationary flow control, J. Math. FluidMech. 3 (2001), 317–341.

[2] R. Becker, H. Kapp, R. Rannacher, Adaptive finite element methods foroptimal control of partial differential equations: basic concepts, SIAM,J. Control Opt. 39 (2000), 113–132.

[3] M.D. Gunzburger, Perspectives in flow control and optimization, SIAM,Philadelphia, 2003.

[4] A. Quarteroni, R. Sacco, F. Saleri, Numerical Mathematics, Springer,New York, 2000.

[5] A. Quarteroni, Modellistica numerica per problemi differenziali, Sprin-ger, Milano, 2000.

[6] A. Quarteroni, A. Valli, Numerical approximation of partial differentialequations, Springer-Verlag, Heidelberg, 1997.

[7] S. Salsa, Controllo per PDE, Dispensa del corso di PDE2, Milano, 2007.

[8] S. Salsa, Equazioni a derivate parziali, Springer, Milano, 2004.

[9] D. Yang, C++ and Object Oriented Numeric Computing for Scientistsand Engineers, Springer-Verlag, New York, 2001.

[10] boost.org, Web Page, http://www.boost.org.

[11] C++.com, Web Page, http://www.cplusplus.com.

[12] freeFEM++.org, Web Page, http://www.freefem.org.

56