Analisi di sensitività dello sforzo a parete in applicazioni emodinamiche

Testo completo

(1)

Scuola di Ingegneria dei Sistemi

Corso di Studi in

INGEGNERIA MATEMATICA

Tesi di Laurea Magistrale

ANALISI DI SENSITIVIT `

A DELLO

SFORZO A PARETE IN

APPLICAZIONI EMODINAMICHE

Relatore: Prof. Fabio Nobile

Correlatore: Prof. Stefano Berrone

Candidato:

Noemi Chiappin

matr. 735212

(2)

Introduzione 1

1 Analisi di sensitivit`a 4

1.1 Approccio con i moltiplicatori di Lagrange . . . 4

1.2 Le equazioni di Navier Stokes stazionarie. . . 6

1.3 Formulazione debole . . . 9

1.3.1 Il problema primale . . . 11

1.3.2 Il problema duale . . . 11

1.4 Risoluzione numerica . . . 12

1.4.1 Il metodo di Newton . . . 13

1.4.2 Discretizzazione agli Elementi Finiti . . . 14

1.5 L’equazione di sensitivit`a . . . 15

1.5.1 Sensitivit`a rispetto al profilo in ingresso . . . 16

1.5.2 Sensitivit`a rispetto alla resistenza a valle . . . 18

2 Implementazione in LifeV 19 2.1 Struttura del codice implementato . . . 20

2.2 SteadyNavierStokesAssembler . . . 20 2.2.1 Il metodo addAdjointConvection . . . 22 2.3 NonLinearRichardson . . . 24 2.4 SteadyNavierStokesJacobian . . . 26 2.4.1 Criteri di arresto . . . 29 2.5 Il file di esempio . . . 31 3 Risultati numerici 32 3.1 Quantit`a di interesse . . . 32 3.2 Profilo di Poiseuille . . . 33 3.2.1 La soluzione numerica . . . 35

3.2.2 Comportamento al variare del passo h . . . 35

3.3 Sensitivit`a rispetto al profilo di inflow . . . 37

3.3.1 Profilo di Womersley . . . 41

3.3.2 Mappa di sensitivit`a . . . 43

3.4 Estensione a geometrie reali . . . 43

(3)

3.4.1 La biforcazione carotidea . . . 45

4 Conclusioni e sviluppi futuri 52

(4)

1.1 Esempio di dominio in applicazioni emodinamiche: geometria di una carotide . . . 7

1.2 Profili di Womersley . . . 7

2.1 Schema delle relazioni tra i file, per la risoluzione del problema primale (non lineare) e duale (lineare) . . . 20

3.1 Geometria cilindrica e sistema di riferimento. . . 33

3.2 Campo di velocit`a per il problema di Poiseuille calcolato con LifeV . . . 35

3.3 Sezione longitudinale del campo di velocit`a per il problema di Poiseuille calcolato con LifeV . . . 36

3.4 Campo di pressione per il problema di Poiseuille calcolato con LifeV . . . 36

3.5 Andamento degli errori della soluzione numerica rispetto a quella esatta per il problema (3.3) . . . 37

3.6 Soluzione aggiunta del sistema (3.2) con J1A . . . 38

3.7 Soluzione aggiunta del sistema (3.2) con J1B . . . 40

3.8 Velocit`a soluzione del sistema primale con profilo di Womer-sley in ingresso . . . 42

3.9 Sensitivit`a rispetto ai gradi di libert`a nella sezione di inflow - h = 0.122804 . . . 44

3.10 Soluzione del sistema primale nella carotdide . . . 47

3.11 Wall Shear Stress sulla parete carotidea . . . 48

3.12 Soluzione aggiunta del sistema duale nella carotdide con J2A . 49

3.13 Soluzione aggiunta del sistema duale nella carotdide con JB 2 . 50

3.14 Sensitivit`a in inflow - componente Z . . . 51

(5)

3.1 Sintesi dei risultati ottenuti con differenti mesh cilindriche: errori rispetto alla soluzione esatta e valore medio dello sforzo a parete . . . 37

3.2 Sintesi dei risultati ottenuti con differenti mesh cilindriche: sensitivit`a di JA

1 rispetto alla velocit`a massima in inflow e

rispetto alla resistenza in outflow . . . 39

3.3 Sintesi dei risultati ottenuti con differenti mesh cilindriche: sensitivit`a di JB

1 rispetto alla velocit`a massima in inflow e

rispetto alla resistenza in outflow . . . 41

3.4 Sensitivit`a di J1B rispetto ai profili di velocit`a in inflow . . . . 43

3.5 Sensitivit`a di J2 rispetto alla velocit`a massima in inflow per

la geometria carotidea . . . 46

(6)

Questa tesi si propone di fornire un inquadramento teorico per un’analisi di sensitivit`a dello sforzo di taglio, in particolare del Wall Shear Stress, per le equazioni di Navier Stokes stazionarie utilizzando tecniche di dualit`a. Vengono forniti gli strumenti teorici e implementativi per il calcolo delle sensitivit`a del WSS a perturbazioni di parametri nelle condizioni al contorno di inflow e di resistenza. I sistemi descritti sono stati risolti attraverso un apposito codice implementato nella libreria a elementi finiti Lif eV . Esso `e stato validato con una geometrica cilindrica ideale ed in seguito applicato ad una geometria reale relativa ad una carotide, ricostruita a partire da immagini acquisite con tomografia assiale computerizzata (TAC).

(7)

La medicina tradizionale consiste in esami diagnostici, ricerca in labora-torio, esperimenti in vivo e in vitro. L’enorme sviluppo in campo informatico avvenuto negli ultimi anni e i potenti strumenti matematici e numerici di questo secolo hanno permesso l’introduzione di esperimenti in silico, ovve-ro al calcolatore, in aggiunta a quelli tradizionali. Si tratta di simulazioni, principalmente di tipo fluidodinamico, effettuate grazie a codici di elevata complessit`a, in grado di descrivere un fenomeno reale quale il moto del flus-so sanguigno all’interno del sistema circolatorio. Le loro applicazioni flus-sono molteplici; vediamone alcuni esempi:

• dimensionamento di dispositivi medici, quali valvole e stent. Scopo della simulazione `e individuare le dimensioni e le propriet`a ottimali del dispositivo in modo da minimizzare il suo impatto sulla fluidodinamica locale.

• comprensione della fisiologia: simulazioni accurate del campo di ve-locit`a all’interno di un vaso sanguigno in presenza di biforcazioni o occlusioni permettono di individuare ad esempio le zone di ricircolo o quelle maggiormente sollecitate.

• cura dei pazienti: spesso a fronte della stessa diagnosi si prospetta-no pi`u cure possibili, non equivalenti, con risposte differenti da sog-getto a sogsog-getto. L’emodinamica computazionale mette a disposizio-ne strumenti in grado di prevedere l’esito di un eventuale intervento, permettendo di effettuare decisioni pi`u consapevoli.

Qualunque sia l’applicazione, `e di fondamentale importanza che i risulta-ti ottenurisulta-ti con le simulazioni siano il pi`u accurati possibile. Inevitabilmente la risoluzione numerica implica l’introduzione di errori di approssimazione, dovuti alla ricostruzione della geometria a partire da dati di risonanza ma-gnetica (RM) o di tomografia assiale computerizzata (TAC), alla stima dei parametri e agli algoritmi di risoluzione. Spesso inoltre non `e possibile con-frontare tali risultati con quelli di esperimenti reali, in quanto essi possono coinvolgere quantit`a di difficile misurazione.

Una possibile tecnica in grado di valutare la bont`a di una simulazione numerica `e l’analisi di sensitivit`a, ovvero la valutazione della sensibilit`a dei

(8)

sensitivit`a

∂J ∂η(δη)

rispetto a un generico parametro η, supponendo perturbazioni del tipo η0+ δη. Per fare ci`o, `e sufficiente risolvere il sistema in questione con η = η0

e utilizzare la sua soluzione per risolvere un opportuno problema aggiunto, pi`u semplice del primo, associato al funzionale J. Attraverso l’analisi di sensitivit`a `e possibile valutare la sensibilit`a a un qualunque parametro del problema in questione: dai coefficienti dell’equazione alle sue condizioni al contorno; dai parametri del modello fisico del fluido considerato alla geo-metria del problema [7]. Il parametro pu`o anche essere la griglia stessa del problema; in tal caso, l’analisi di sensitivit`a si accompagna bene alle tecniche di adattivit`a di griglia [1].

Nel caso l’analisi di sensitivit`a venga svolta per un problema di stato complesso, non lineare, appare evidente un suo grande vantaggio. Essa `e in grado di fornire informazioni per il range di valori del parametro η + δη a partire da un’unica risoluzione del problema primale e dalle soluzioni di diversi problemi aggiunti. Essendo il problema aggiunto pi`u semplice rispetto a quello di partenza, `e computazionalmente pi`u conveniente risolvere l’aggiunto piuttosto che calcolare una nuova soluzione del problema primale. Questa tesi ha l’obiettivo di definire l’inquadramento teorico per l’analisi di sensitivit`a utilizzando un’approccio basato su tecniche di dualit`a. La difficolt`a di un’analisi di sensitivit`a `e dovuta al fatto che il funzionale J pu`o dipendere dal parametro η anche indirettamente, attraverso la soluzione del problema di stato. La sua dipendenza da η non `e a priori definibile. Grazie all’introduzione di un funzionale Lagrangiano sar`a possibile scomporre la dipendenza di J dal parametro e dalla soluzione, introducendo un opportuno problema aggiunto.

Ulteriore obiettivo del lavoro `e stata l’introduzione dei primi elementi di sensitivit`a nella libreria a elementi finiti LifeV [8], un software di calcolo parallelo di utilizzo medico e industriale, sviluppato in collaborazione tra il laboratorio MOX del Dipartimento di Matematica del Politecnico di Milano, l’´Ecole Polytechnique F´ed´erale di Lausanne in Svizzera, l’INRIA in Francia e la Emory University negli U.S.A. Si tratta di un codice scritto in linguag-gio C++, sviluppato secondo moderne tecniche di programmazione parallela e dotato di un sistema di gestione delle versioni attraverso il software Git [6]. Data la complessit`a del codice e delle tecniche di programmazione in esso presenti, in questo lavoro di tesi ci si `e dedicati prevalentemente alla trattazione di problemi stazionari, sebbene poco realistici per problemi emo-dinamici, in quanto primo passo per la successiva trattazione di problemi evolutivi.

(9)

particolare, ci si `e concentrati sulla componente tangenziale dello sforzo a parete, il cosiddetto Wall Shear Stress, la cui misurazione non `e effettuabile a livello sperimentale. La conoscenza di tale quantit`a `e per`o fondamentale per la valutazione di situazioni patologiche dei vasi, come stenosi o aneuri-smi. Si `e valutata la dipendenza del funzionale da parametri presenti nelle condizioni al bordo del sistema, ma il procedimento seguito `e estendibile ad ogni tipo di parametro.

Nel Capitolo 1 verranno introdotti gli strumenti teorici per l’analisi di sensitivit`a, applicandoli al caso delle equazioni di Navier Stokes stazionarie per un fluido a densit`a e viscosit`a costanti. Si ricaveranno i sistemi primale e duale per l’analisi attraverso il metodo dei moltiplicatori di Lagrange, e verr`a spiegato come calcolare la sensitivit`a del funzionale di interesse rispetto ai parametri nelle condizioni al contorno.

Il Capitolo 2 `e dedicato alla descrizione del software implementato. Dopo una breve introduzione alla libreria utilizzata, verranno descritte nel detta-glio le classi implementate per la risoluzione dei sistemi introdotti nel primo capitolo. Il contributo principale di questo lavoro alla libreria Lif eV `e sta-ta l’introduzione di metodi in grado di assemblare un termine convettivo presente nel problema aggiunto, che non compare nella trattazione dei pro-blemi evolutivi considerati nella libreria. Inoltre si `e arricchita la libreria di numerosi metodi di post processing delle soluzioni calcolate.

Nel terzo capitolo saranno riportati i risultati ottenuti con il codice imple-mentato. Dapprima verr`a esposto un caso test accademico su una geometria cilindrica ideale per validare il codice. In seguito si spiegher`a come `e stato possibile estendere l’analisi a geometrie reali pi`u complesse. Per le simula-zioni in questo secondo caso sono state utilizzate delle mesh ricostruite dai dati di una TAC forniti dalla Divisione Cardiologia Vascolare e di Radiologia del Policlinico di Milano, per via di una collaborazione del laboratorio MOX del Politecnico di Milano con la Fondazione IRCCS C`a Granda.

(10)

Analisi di sensitivit`

a

L’analisi di sensitivit`a si inserisce nella teoria del controllo ottimo. Le basi teoriche per i problemi di controllo vennero poste nel 1971 da J.L. Lions [9], il quale ne caratterizz`o la soluzione attraverso un sistema di ottimalit`a costituito dal problema di stato, da un opportuno problema aggiunto e da una condizione di ottimalit`a. A tale approccio `e possibile affiancarne un altro, ad esso complementare, che fa uso della tecnica dei moltiplicatori di Lagrange: il problema di controllo viene riformulato come problema di minimo vincolato e il sistema di ottimalit`a viene ricavato attraverso l’utilizzo di un opportuno funzionale lagrangiano. In questo lavoro di tesi si `e fatto uso di questo secondo approccio.

In questo capitolo verr`a descritto il metodo basato sui moltiplicatori di Lagrange e verr`a applicato alle equazioni di Navier-Stokes stazionarie.

1.1

Approccio con i moltiplicatori di Lagrange

Siano U e V due opportuni spazi funzionali e sia η ∈ U un generico parametro rispetto al quale si vuole calcolare la sensitivit`a. Sia u∈ V una variabile, detta variabile di stato, dipendente dal parametro η attraverso un generico sistema A(η; u), dove A : V → V

. Sia J(η, u) la quantit`a di interesse. L’obiettivo dell’analisi di sensitivit`a `e studiare la dipendenza del funzionale J dal parametro η, ovvero la sensitivit`a di J ad una perturbazione del parametro η + δη. Essa `e rappresentata dalla quantit`a

DηJ(η, u)[δη] (1.1)

sotto il vincolo

A(η; u) = 0 (1.2)

ovvero dalla derivata di Gˆateaux del funzionale J rispetto a η lungo la direzione δη, valutata in η.

(11)

Definizione 1.1 (Derivata di Gˆateaux). Data f : X → R, la derivata di Gˆateaux di f in x lungo la direzione y, valutata in x, `e data da

Dxf [y] = lim ǫ→0

f (x + ǫy)− f(x)

ǫ .

Si suppone che il problema (1.2) sia ben posto ∀η e che quindi sia possibile definire univocamente u = u(η) ∀η. Indichiamo per semplicit`a

˜

J(η) = J(η, u(η)).

La quantit`a (1.1) non `e di immediata computazione in quanto il funziona-le J dipende dal parametro sia direttamente, sia indirettamente, attraverso la variabile u. Per calcolarla, procediamo dunque come in teoria dell’otti-mizzazione e introduciamo il moltiplicatore di Lagrange φ ∈ V. Possiamo ora definire il seguente funzionale Lagrangiano:

L(η, u, φ) = J(η, u) − V < φ, A(η; u) >V′ (1.3)

dove con V < ·, · >V′ si `e indicata la dualit`a tra V e V′. Derivando il

funzionale secondo Gˆateaux otteniamo ∇L(η, u, φ)[y] =    DηL[δη] DuL[δu] DφL[δφ] y=   δη δu δφ  ∈ U × V × V

Osserviamo che uguagliando a 0 la derivata del funzionale rispetto al mol-tiplicatore φ otteniamo nuovamente l’equazione di stato (1.2). La derivata rispetto alla variabile u definisce invece il cosiddetto problema aggiunto

DuL[δu] = 0 ∀δu ∈ V

il quale racchiude le informazioni di dipendenza del funzionale rispetto alla soluzione u. Infine, la derivata rispetto a η rappresenta proprio la sensitivit`a cercata. Risolvere il problema (1.1) `e dunque equivalente a trovare

DηL[δη] (1.4)

sotto i vincoli

DuL[δu] = 0

DφL[δφ] = 0

Si `e quindi esplicitata la dipendenza di J da u(η) attraverso l’introduzione di un nuovo vincolo al problema. Riprendendo l’espressione (1.3) del fun-zionale Lagrangiano, il problema (1.4) diventa

Trovare

J,η(η)(δη) + a,η(η; u)(φ, δη)

sotto i vincoli

a(u)(δφ) = 0 ∀δφ ∈ V a,u(u)(φ, δu) = J,u(η)(δu) ∀δu ∈ V .

(12)

avendo indicato con a(·)(·) la forma semi-lineare dell’operatore A e con ·,η

le derivate parziali rispetto a η. Si osservi che la forma a `e lineare rispetto al secondo argomento, anche qualora l’operatore A sia non lineare rispetto alla variabile di stato. Si osservi inoltre che il funzionale J compare solo nel problema aggiunto e non nel problema primale (l’equazione di stato) e che il problema aggiunto dipende solo dalla soluzione del primale. La stessa soluzione u del problema primale pu`o quindi essere usata per risolvere diversi problemi aggiunti, ognuno associato ad uno specifico funzionale. Infine, una volta calcolata la soluzione dell’aggiunto, `e possibile valutare la sensitivit`a del corrispondente funzionale J al variare di un qualunque parametro η presente nell’operatore A. Ad esempio, η pu`o essere un coefficiente del problema, oppure il valore di una condizione al contorno.

In questa tesi ci concentreremo sul caso di perturbazione di parametri nelle condizioni al contorno delle equazioni di Navier Stokes stazionarie.

1.2

Le equazioni di Navier Stokes stazionarie

Le equazioni di Navier Stokes stazionarie per un fluido incomprimibile a viscosit`a costante in un dominio Ω∈ R3 si scrivono nella seguente forma

 −µ∇ · (∇u + ∇Tu) + ρ(u· ∇)u + ∇P = f in Ω

∇ · u = 0 in Ω (1.5)

dove u e P sono rispettivamente le variabili velocit`a e pressione del fluido in considerazione, µ la viscosit`a dinamica, ρ la densit`a del fluido e f un ter-mine forzante che si suppone appartenere a [L2(Ω)]3. La prima equazione `e

l’equazione di bilancio della quantit`a di moto, mentre la seconda `e l’equa-zione di conserval’equa-zione della massa. Osserviamo la presenza del termine non lineare (u· ∇)u, che descrive il processo di trasporto convettivo.

Il tensore degli sforzi per il modello di fluido Newtoniano incomprimibile a viscosit`a costante assume la forma

σ(u, P ) =−P I + µ(∇u + ∇Tu) =−P I + 2µD(u) dove si `e postoD(u) = 12(∇u + ∇Tu).

Affinch`e il problema (1.5) sia ben posto affianchiamo ad esso delle con-dizioni al contorno. `E nostra intenzione trattare un problema emodinamico, perci`o il dominio Ω di nostro interesse `e un tratto di vaso sanguigno (v. Fi-gura1.1). Quando si vuole effettuare una simulazione all’interno di un vaso sanguigno, non bisogna dimenticare che esso `e parte di un intero circuito, il sistema circolatorio. Perci`o `e opportuno simulare l’andamento del flusso sanguigno come se non fosse in un tratto isolato. `E assai comune in emodi-namica imporre un profilo di velocit`a sulla sezione di inflow, che indicheremo con uIN. Un profilo adeguato per flussi pulsatili `e dato dalla soluzione di

(13)

Figura 1.1: Esempio di dominio in applicazioni emodinamiche: geometria di una carotide

(14)

Poich`e in questa tesi consideriamo solo flussi stazionari (per semplicit`a di trattazione) ci focalizziamo soprattutto su profili di Poiseuille. Inoltre consideriamo un modello di parete rigida per il vaso e imponiamo delle condizioni no slip per modellare l’attrito a parete. Per quanto riguarda la sezione di outflow, invece, risultano utili delle condizioni al contorno in grado di modellare una resistenza di pressione R a valle del condotto:

nTσn =−RQ Q = Z

ΓOUT

u· n dΓ

con n versore normale alla superficie di outflow. Un modello per il coeffi-ciente di resistenza R `e R = s ρβ 2√π 1 A3/4

in cui A rappresenta l’area della sezione di outflow e β `e un coefficiente elastico dipendente dallo spessore h, dal modulo di Young E e dal coefficiente di Poisson ˆν della parete del vaso, e pu`o essere stimato come

β = πhE

(1− ˆν2)A

Si veda [10] per ulteriori dettagli. Per semplicit`a di trattazione poniamo infine a 0 il termine forzante. Il sistema di equazioni che descrivono il flusso considerato risulta dunque

               −2ν∇ · D(u) + (u · ∇)u + ∇p = 0 in Ω ∇ · u = 0 in Ω u= uIN su ΓIN 1 RnTσn =−Q su ΓOUT u· t = 0 su ΓOUT u= 0 su Σ (1.6)

dove con t si sono indicati i versori ortogonali alla normale n, con ν = µρ la viscosit`a cinematica e con p si `e indicata la pressione riscalata per la densit`a p = P/ρ.

Applichiamo ora il framework astratto descritto nel§1.1a un funzionale della forma

J(u, p) = Z

Σ

f (σn)ψ(x) dΣ (1.7)

dove f : R3 → R `e una funzione dello sforzo σn, ψ : R3 → R `e un peso

opportuno e Σ la parete laterale del dominio. Una quantit`a interessante da valutare `e lo sforzo a parete, il cosiddetto Wall Shear Stress, ovvero la componente tangenziale dello sforzo σn

(15)

in quanto `e di fondamentale importanza conoscere tale quantit`a nel caso di vasi in situazioni patologiche. Una scelta possibile per f `e

f (σn) =kW SSk

1.3

Formulazione debole

Ricaviamo ora la formulazione debole del problema (1.6) seguendo il for-malismo di [12]. Moltiplicando la prima equazione in (1.6) per una funzione test v e integrando per parti si ottiene∀v nello spazio funzionale V

Z Ω 2νD(u)·∇v− Z ∂Ω (2νD(u)n)·v+ Z Ω (u·∇)u·v− Z Ω p∇·v+ Z ∂Ω pv·n = 0 (1.8) Introducendo le forme bilineari a : [H1(Ω)]3× [H1(Ω)]3 → R e b : L2(Ω)×

[H1(Ω)]3 → R a(u, v) = Z Ω 2νD(u) · ∇v dΩ = Z Ω ν(∇u + ∇Tu)· ∇v dΩ b(p, u) = Z Ω p∇ · u dΩ e la forma trilineare c : [H1(Ω)]3× [H1(Ω)]3× [H1(Ω)]3 → R c(w, u, v) = Z Ω (w· ∇)u · v dΩ l’equazione (1.8) diventa a(u, v) + b(p, v) + c(u, u, v) + Z ∂Ω (pn− 2ν D(u)n) · v = 0 Scegliendo V ={v ∈ [H1(Ω)]3| v = 0 su ΓIN∪ Σ, v · ˆt su ΓOUT∀ˆt ⊥ n} si ottiene Z ∂Ω (pn− 2ν D(u)n) · v = Z ΓOUT −(σn) · v = Z ΓOUT −(nTσn)n· v − (ˆtTσn)ˆt· v = Z ΓOUT R u· n Z ΓOUT v· n

Introduciamo quindi anche la forma bilineare r : [H1(Ω)]3× [H1(Ω)]3 → R r(u, v) = Z ΓOUT R u· n dΓ Z ΓOUT v· n dΓ (1.9)

(16)

Il sistema (1.6) diventa Trovare u∈ [H1(Ω)]3, p∈ L2(Ω) : (1.10)                 

a(u, v) + b(p, v) + c(u, u, v) + r(u, v) = 0 ∀v ∈ V

b(q, u) = 0 ∀q ∈ L2(Ω)

u= uIN su ΓIN

u= 0 su Σ

u· ˆt = 0 su ΓOUT

La continuit`a delle forme variazionali introdotte `e provata dalla disugua-glianza di H¨older a 2 e a 3 termini

|a(u, v)| ≤ 2νkukH1kvkH1

|b(p, u)| ≤ kpkL2kukH1

|c(z, u, v))| ≤ kzkL4k∇ukL2kvkL4 (1.11)

≤ CS2kzkH1kukH1kvkH1 (1.12)

|r(u, v)| ≤ c(Ω)RkukH1kvkH1

Con il simbolok · kH1 si `e indicata l’usuale norma nello spazio [H1(Ω)]3 [13].

Per passare da (1.11) a (1.12) si `e fatto uso del seguente Teorema 1.3.1 (Immersione di Sobolev).

SiaΩ un aperto limitato di R3 con ∂Ω localmente lipschitziano. Allora vale

la seguente immersione

H1(Ω)⊂ Lq(Ω) ∀q ≤ 6 ekvkLq(Ω)≤ CSkvkH1(Ω)

Si osservi inoltre che la forma a(·, ·) `e coerciva su V × V grazie alla disuguaglianza di Kornk∇vkL2 ≤ KkD(v)kL2 |a(v, v)| ≥ 2ν K2(1 + C2 p)kvk 2 H1

La forma b(·, ·) soddisfa invece la cosiddetta condizione inf-sup inf q∈L2sup v∈V b(q, v) kvkH1kqkL2 ≥ β, β > 0

(17)

1.3.1 Il problema primale

Per il trattamento delle condizioni al contorno di Dirichlet `e utile ap-plicare la tecnica dei moltiplicatori di Lagrange, in quanto ci`o permetter`a di esprimere in maniera pi`u adeguata il funzionale J; inoltre sar`a possi-bile derivare facilmente il funzionale Lagrangiano. Introducendo quindi il moltiplicatore w, il sistema (1.10) diventa

Trovare u∈ [H1(Ω)]3, p∈ L2(Ω), w∈ [H−1/2(ΓIN∪ Σ)]3 : (1.13)                a(u, v) + b(p, v) + c(u, u, v) + Z ΓIN∪Σ w· v dΓ + r(u, v) = 0 ∀v ∈ [H1(Ω)]3 b(q, u) = 0 ∀q ∈ L2(Ω) Z ΓIN (u− uIN)· Λ dΓ + Z Σ u· Λ dΓ = 0 ∀Λ ∈ [H−1/2 IN∪ Σ)]3

Con abuso di notazione abbiamo scritto R w · v dΓ invece della dualit`a

H−1/2 < w, v >H1/2. Il moltiplicatore di Lagrange cos`ı introdotto

assu-me il significato di sforzo fisico w = −σn su ΓIN ∪ Σ (si veda ad

esem-pio [5]). Il funzionale di riferimento (1.7) pu`o quindi essere scritto come J(w) =

Z

Σ

f (−w)ψ(x) dΣ.

Indichiamo con η un generico parametro rispetto a cui si vorr`a calcolare la sensitivit`a. Il funzionale Lagrangiano (1.3) associato al sistema precedente assume la seguente forma:

L(u, p, w; φ, θ, r; η) = J(w) − a(u, φ) − b(p, φ) − c(u, u, φ) − b(θ, u) − Z ΓIN∪Σ w· φ dΓ − r(u, φ) − Z ΓIN (u− uIN)· r dΓ − Z Σ u· r dΓ

La dipendenza del funzionale da η verr`a esplicitata di volta in volta.

1.3.2 Il problema duale

Derivando il funzionale Lagrangiano secondo Gˆateaux rispetto alle va-riabili di stato otteniamo l’equazione aggiunta.

DuL[δu] = −a(δu, φ) − lim ǫ→0

1 ǫ

Z

((u + ǫδu)· ∇) (u + ǫδu) dΩ − Z Ω (u· ∇)u dΩ  − b(θ, δu) − r(δu, φ) − Z ΓIN δu· r dΓ − Z Σ δu· r dΓ DpL[δp] = − Z Ω δp∇ · φ DwL[δw] = ∂J ∂w(δw)− Z ΓIN∪Σ δw· φ dΓ

(18)

Il problema duale cos`ı ottenuto `e il seguente Trovare φ∈ [H1(Ω)]3, θ∈ L2(Ω), r∈ [H−1/2 IN∪ Σ)]3 : (1.14)                 

a(δu, φ) + b(θ, δu) + c(δu, u, φ) + c(u, δu, φ)+ R

ΓIN∪Σδu· r dΓ + r(δu, φ) = 0 ∀δu ∈ [H

1(Ω)]3 b(δp, φ) = 0 ∀δp ∈ L2(Ω) Z ΓIN∪Σ δw· φ dΓ = ∂J ∂w(δw) ∀δw ∈ [H −1/2 (ΓIN∪ Σ)]3

Le condizioni al contorno per il sistema duale sono dunque di resistenza in outflow, e di Dirichlet in inflow e sulla parete laterale. Queste ultime dipendono strettamente dalla scelta del funzionale J. In particolare, per il funzionale (1.7) si ha ∂J ∂w(δw) = Z Σ ψwf δw (1.15)

e la condizione al bordo su Σ per il problema duale diventa Z

Σ

δw· (φ − ψ∇wf ) = 0 ∀δw ⇔ φ= ψ∇wf (1.16)

Definendo c′

(u, z, φ) = c(z, u, φ) + c(u, z, φ), il problema duale (1.14) `e equivalente al seguente Trovare φ∈ [H1(Ω)]3, θ∈ L2(Ω) : (1.17)                 

a(δu, φ) + b(θ, δu) + c′(u, δu, φ) + r(δu, φ) = 0 ∀δu ∈ V

b(δp, φ) = 0 ∀δp ∈ L2(Ω)

φ= 0 su ΓIN

φ· ˆt = 0 su ΓOUT

φ= ψ∇wf su Σ

1.4

Risoluzione numerica

Il problema aggiunto appena ricavato, al contrario del problema origi-nario (1.6), `e lineare. Entrambi verranno risolti attraverso il metodo di Galerkin agli elementi finiti. Prima di introdurre il metodo di Galerkin, per`o, `e necessario spiegare come trattare il termine non lineare c(u, u, v) presente nelle equazioni di Navier-Stokes stazionarie.

(19)

1.4.1 Il metodo di Newton

Un possibile approccio per il trattamento del termine non lineare consiste nell’utilizzo del metodo di Newton che, applicato a un generico operatore N , recita

Dati (uk, pk), D(uk,pk)N (uk, pk)(δu, δp) =−N (uk, pk) (1.18)

dove conD(uk,pk)N (uk, pk)(δu, δp) si `e indicata la derivata di Gˆateaux

del-l’operatoreN nel punto (uk, pk), lungo la direzione (δu, δp). Per il sistema

di Navier-Stokes (1.6), la (1.18) assume la seguente espressione                   

−2ν∇ · D(δu) + ∇δp + (δu · ∇)uk+ (uk· ∇)δu =

= 2ν∇ · D(uk)− (uk· ∇)uk− ∇pk in Ω ∇ · δu = −∇ · uk in Ω δu= 0 su ΓIN 1 RnTδσkn=−R1nTσkn− Q su ΓOUT δu· ˆt = 0 su ΓOUT δu= 0 su Σ (1.19)

o, equivalentemente, scrivendolo nelle incognite uk+1 = uk + δu, pk+1 = pk+ δp,                    −2ν∇ · D(uk+1) +∇pk+1+

+(uk· ∇)uk+1+ (uk+1· ∇)uk = (uk· ∇)uk in Ω

∇ · uk+1= 0 in Ω uk+1 = uIN su ΓIN 1 RnTσk+1n=−Q su ΓOUT uk+1· ˆt = 0 su ΓOUT uk+1 = 0 su Σ

Il problema linearizzato cos`ı ottenuto `e analogo al problema aggiunto (1.17), a parte il termine noto e le condizioni al contorno. La corrispondente formulazione debole, `e infatti

Dati(uk, pk), trovare uk+1∈ [H1(Ω)]3, pk+1∈ L2(Ω) :                 

a(uk+1, v) + b(pk+1, v) + c′(uk+1, uk, v) + r(uk+1, v) = c(uk, uk, v) ∀v ∈ V

b(q, uk+1) = 0 ∀q ∈ L2(Ω)

uk+1= uIN su ΓIN

uk+1· ˆt = 0 su ΓOUT

uk+1= 0 su Σ

(1.20) Il metodo di Newton consiste dunque nei seguenti passi

(20)

2. data la velocit`a ukcalcolata al passo precedente, calcolare (uk+1, pk+1) risolvendo il problema (1.20)

3. calcolare le normekuk+1− ukk

H1 e kpk+1− pkkL2

4. confrontare le norme del punto precedente con un criterio di tolleran-za prestabilito. In caso di non soddisfacimento, passare all’iterazione successiva ripartendo dal punto 2.

Tale algoritmo, se il problema (1.18) `e ben posto, origina una successione che converge localmente e quadraticamente alla soluzione esatta.

`

E possibile ora introdurre la discretizzazione agli Elementi Finiti sul problema Dati z∈ [H1(Ω)]3eF ∈ H−1(Ω), trovare u∈ [H1(Ω)]3, p∈ L2(Ω) : (1.21)         

a(u, v) + b(p, v) + c′(u, z, v) + r(u, v) = F (v) ∀v ∈ V

b(q, u) = 0 ∀q ∈ L2(Ω)

+B.C. su ∂Ω

che comprende sia il problema aggiunto, sia la linearizzazione del problema primale.

1.4.2 Discretizzazione agli Elementi Finiti

Per la risoluzione dei problemi introdotti si utilizzer`a il metodo di Ga-lerkin agli elementi finiti. Siano Vh e Qh approssimazioni rispettivamente

degli spazi [H1(Ω)]3 e L2(Ω)

Vh ⊂ [H1(Ω)]3, dim Vh= Nu ∀h > 0

Qh⊂ L2(Ω), dim Qh = Np ∀h > 0 (1.22)

e siaThuna triangolazione conforme del dominio polinomiale Ω. Si indicher`a

con Ωh= int(

[

K∈Th

K) il dominio discretizzato. Sia inoltre Vh,0 = Vh∩ V

Il problema (1.21) diventa quindi

Dati zh∈ VheF ∈ H−1(Ω), trovare u h∈ Vh, ph∈ Qh: (1.23)          a(uh, vh) + b(vh, ph) + c′(uh, zh, vh) + r(uh, vh) = F (vh) ∀vh ∈ Vh,0 b(uh, qh) = 0 ∀qh∈ L2(Ω) +B.C. su ∂Ω

Tale problema `e ben posto solo se gli spazi Vh e Qh soddisfano la

condi-zione inf-sup discreta inf qh∈Qh sup vh∈Vh b(qh, vh) k∇vhkL2kqhkL2 ≥ βh , ∀h > 0

(21)

Per tale motivo verranno usati gli spazi di elementi finiti di Taylor-Hood P2− P1.

Sia dunque j}Nu

j=1 una base vettoriale dello spazio Vh e sia {ψk}Nk=1p

una base scalare dello spazio Qh. Di conseguenza uh e ph possono essere

espresse in funzione delle rispettive funzioni di base. uh(x) = Nu X j=1 ujϕj(x), ph(x) = Np X k=1 pkψk(x)

Prendendo come funzioni test vh= ϕi e qh= ψl, il sistema (1.23) si scrive                        Nu X j=1 uja(ϕj, ϕi) + Np X k=1 pkb(ϕi, ψk)+ PNu j=1ujc′(ϕj, zh, ϕi) + PNu j=1ujr(ϕj, ϕi) = F (ϕi) i = 1,· · · , Nu Nu X j=1 ujb(ϕj, ψl) = 0 l = 1,· · · , Np Introduciamo le matrici A∈ RNu×Nu A ij = a(ϕj, ϕi) + r(ϕj, ϕi) i, j = 1,· · · , Nu B ∈ RNp×Nu B ij = b(ϕj, ψi) i, j = 1,· · · , Np Czh ∈ RNu×Nu Czh ij = c ′ (ϕj, zh, ϕi) i, j = 1,· · · , Nu (1.24) e i vettori U = [u1,· · · , uNu] T P = [p 1, ..., pNp] T F = [F (ϕ 1),· · · , F (ϕNu)] T

Le condizioni al bordo possono venire imposte in modo forte agendo diretta-mente sui gradi di libert`a corrispondenti ai nodi di bordo. Il sistema infine risulta  ˜ A + ˜Czh ˜ BT ˜ B 0   U P  =  F1 F2  (1.25) in cui le matrici ˜A, ˜B e ˜C sono rispettivamente le matrici A, B e C con le righe corrispondenti ai nodi di bordo opportunamente modificate. Il vetto-re [F1, F2]T `e il termine noto [F, 0]T modificato di conseguenza in caso di

condizioni non omogenee.

1.5

L’equazione di sensitivit`

a

Per ottenere l’equazione di sensitivit`a `e necessario derivare il funzio-nale Lagrangiano rispetto a η. Nei paragrafi seguenti si effettuer`a questa operazione per diverse scelte del parametro η, esplicitando anche i metodi opportuni per calcolare la sensitivit`a vera e propria.

(22)

1.5.1 Sensitivit`a rispetto al profilo in ingresso

Si desidera inizialmente calcolare la sensitivit`a del funzionale rispetto al profilo di velocit`a uIN imposto in ingresso. In questo caso il parametro η

pu`o rappresentare ad esempio la velocit`a massima di tale profilo, oppure la combinazione di pi`u profili o, infine, il profilo stesso, inteso come parametro distribuito.

Parametro scalare

Si consideri un profilo di velocit`a uIN(x) = ηg(x). Il profilo di riferimento

sar`a u0 = g(x) corrispondente a η = 1. Si ricerca questo tipo di sensitivit`a quando si `e a conoscenza dell’andamento del profilo in ingresso ma non si `e in grado di stimarne con precisione l’intensit`a.

L’equazione di sensitivit`a sar`a dunque DηL[δη] = Dη  − Z ΓIN (u− uIN)· r dΓ  = Dη Z ΓIN ηg· r dΓ  = Z ΓIN δηg·r dΓ per cui la sensitivit`a che si vuole calcolare `e

∂J ∂η =

Z

ΓIN

g· r dΓ (1.26)

Si osservi che tale sensitivit`a dipende dallo sforzo duale r proveniente dal sistema aggiunto. Poich`e come si `e visto il sistema aggiunto pu`o essere ri-solto numericamente anche senza calcolare esplicitamente lo sforzo r, `e bene cercare una formulazione alternativa a (1.26), di pi`u semplice risoluzione. Se-guendo il procedimento riportato in [3], `e possibile riformulare l’espressione della sensitivit`a utilizzando il sistema duale.

Sia G∈ [H1(Ω)]3: G = g su Γ

IN, G = 0 su Σ∪ ΓOUT. Allora, indicando

con γ l’operatore di traccia, Z ΓIN g· r dΓ = Z ΓIN∪Σ γG· r dΓ e, sfruttando il problema (1.14), Z ΓIN∪Σ γG· r dΓ = − a(G, φ) − b(θ, G) − c′(G, u, φ)

Per calcolare tale quantit`a `e possibile utilizzare le matrici introdotte in (1.24). Definendo analogamente i vettori dei gradi di libert`a della soluzione del problema aggiunto

Φ = [φ1,· · · , φNu] T Θ = [θ 1, ..., θNp] T e della funzione G G = [g1,· · · , gNu] T

(23)

si ottiene la seguente espressione per la sensitivit`a ∂J ∂η =−Φ TAG− ΦTCu G− ΘTBG =− (Φ Θ)  A + Cu BT B 0   G 0  Parametro vettoriale

Sia ora η ∈ Rn+1. Si immagini di voler imporre in ingresso una

combi-nazione di pi`u profili di velocit`a uIN=Pnj=0ηjgj. Prendendo come profilo

di riferimento u0 = η0u0 si `e interessati a calcolare la sensitivit`a rispetto ai

pesi ηj per valutare i contributi dei diversi profili.

Si derivi dunque il funzionale Lagrangiano rispetto ad ogni parametro scalare ηi, ottenendo DηiL[δηi] = Dηi   Z ΓIN n X j=0 ηjgj· r dΓ  = Z ΓIN δηiui· r dΓ

Analogamente al caso scalare, per ogni ηi si ha

∂J ∂ηi = Z ΓIN ui· r dΓ = Z ΓIN∪Σ γUi· r dΓ =

=−a(Ui, φ)− b(θ, Ui)− c(Ui, u, φ)− c(u, Ui, φ) (1.27)

dove Ui ∈ [H1(Ω)]3: Ui = ui su ΓIN, Ui = 0 su Σ∪ ΓOUT ∀i = 0, · · · , n

Profilo come funzione a elementi finiti

Le analisi proposte finora permettono di valutare la sensitivit`a rispetto a una perturbazione globale del profilo in ingresso. `E possibile effettuare anche un’analisi pi`u dettagliata valutando la sensitivit`a ripetto a perturbazioni puntuali del profilo di velocit`a, ovvero rispetto ai singoli gradi di libert`a sulla superficie di inflow, considerando variazioni indipendenti l’una dall’altra. Si pu`o in questo modo tracciare una mappa di sensitivit`a su tutta la superficie di inflow, per identificare cos`ı le zone in cui `e necessario conoscere i dati con maggiore precisione.

Si prenda un profilo di riferimento u0 = g(x). Siano ϕi le funzioni di base introdotte in §1.4.2. Il profilo pu`o essere scritto come u0 = P η

iϕi.

Derivando il funzionale come fatto in precedenza si ottiene per ogni grado di libert`a la sensitivit`a seguente

∂J ∂ηi = Z ΓIN ϕi· r dΓ (1.28)

Anche per calcolare queste sensitivit`a si pu`o ricorrere al problema duale, ma non `e necessario calcolare alcuna funzione ausiliaria, poich`e tali valori

(24)

sono informazioni di cui si `e gi`a in possesso. Si scriva la prima equazione del problema aggiunto (1.14) prendendo come funzione test proprio la funzione di base ϕi.

a(ϕi, φ) + b(θ, ϕi) + c(ϕi, u, φ) + c(u, ϕi, φ)+ Z

ΓIN∪Σ

ϕi· r dΓ + r(ϕi, φ) = 0

Riprendendo le matrici e i vettori precedentemente introdotti, `e possibile esprimere il vettore R dei residui nel modo seguente

R = −  A + Cu BT B 0   Φ Θ 

Si verifica facilmente che le componenti di R corrispondenti ai gradi di li-bert`a interni al dominio sono identicamente nulli in quanto i vettori Φ, Θ soddisfano (1.25), mentre le componenti corrispondenti ai gradi di libert`a su ΓIN sono proprio le sensitivit`a cercate.

1.5.2 Sensitivit`a rispetto alla resistenza a valle

Si sono introdotte in precedenza le condizioni al contorno di resistenza, giustificandole come una modellazione della resistenza esercitata dal flusso a valle del tratto di vaso considerato. Il valore del coefficiente R, per`o, non `e facile da ricavare sperimentalmente. `E bene dunque valutare quanto la computazione del funzionale di interesse sia sensibile ad una perturbazione del valore del coefficiente.

Si derivi dunque il funzionale Lagrangiano rispetto al parametro R. DRL[δR] = −δR Z ΓOUT u· ˆndΓ Z ΓOUT φ· ˆndΓ Si ha dunque ∂J ∂ηi = Z ΓOUT u· ˆndΓ Z ΓOUT φ· ˆndΓ (1.29) `

E possibile riconoscere la quantit`a precedente come il prodotto dei flussi in uscita della velocit`a primale e di quella duale.

(25)

Implementazione in LifeV

I sistemi precedentemente introdotti sono stati risolti attraverso simu-lazioni numeriche scritte in codice C++ utilizzando LifeV [8], una libre-ria frutto di una collaborazione tra il laboratorio MOX del Dipartimento di Matematica del Politecnico di Milano, l’´Ecole Polytechnique F´ed´erale di Lausanne in Svizzera, l’INRIA in Francia e la Emory University negli U.S.A. Lo sviluppo di LifeV `e iniziato nel 2002 e il codice `e rilasciato sotto licenza LGPL (Lesser General Public License).

LifeV `e una libreria a elementi finiti per la risoluzione di sistemi di equazioni differenziali che descrivono, tra le altre, la fluidodinamica nei vasi sanguigni, prime fra tutte le equazioni di Navier Stokes. Essa sfrutta la parallelizzazione del codice attraverso il protocollo MPI, mentre per l’alge-bra di base si poggia fortemente sui pacchetti della libreria Trilinos [14]. Inizialmente vennero implementate le classi necessarie per gestire vettori e matrici, come wrapper delle classi Trilinos, e in seguito le strutture di base per la risoluzione dei sistemi, ovvero quelle relative alla generazione della mesh, al trattamento delle condizioni al contorno, ai solutori lineari, alla creazione degli spazi a elementi finiti, e alle regole di quadratura, nonch`e le utilities per l’esportazione dei risultati. Successivamente furono imple-mentati solutori specifici per problemi complessi, quali l’equazione di Darcy per i mezzi porosi, e le equazioni di Saint-Venant-Kirchhoff e di Navier-Stokes per i problemi fluido-struttura. Recenti sviluppi stanno muovendo l’attenzione degli sviluppatori verso l’implementazione di classi di un livello gerarchico pi`u basso, che permettono l’assemblaggio delle singole parti di un sistema, piuttosto che l’utilizzo di solutori preconfezionati e poco adattabili. Esse presuppongono una maggior conoscenza del problema da parte dell’u-tente finale ma assicurando una maggior flessibilit`a al codice, ampliandone l’orizzonte di applicabilit`a.

In questo capitolo verranno presentate le nuove parti di codice imple-mentate secondo la nuova flosofia appena accennata, mostrando dapprima la struttura generale, e dettagliando in seguito le singole classi.

(26)

2.1

Struttura del codice implementato

I sistemi che siamo interessati a risolvere sono di due tipi: il sistema primale sono le equazioni di Navier Stokes e consiste in un problema stazio-nario non lineare; il sistema duale e tutti i sistemi coinvolti nel calcolo delle sensitivit`a sono invece lineari. Essendo la libreria Lif eV pensata per risol-vere problemi evolutivi, era sprovvista di solutori stazionari non lineari per le equazioni di Navier Stokes. Il primo compito `e stato dunque implementa-re tale solutoimplementa-re, cimplementa-reando le struttuimplementa-re necessarie ad implementaimplementa-re il termine convettivo duale c(ϕj, β, ϕi) assente nei solutori temporali. Esse si appog-giano al gi`a esistente metodo NonLinearRichardson per l’implementazione del metodo di Newton.

Per quanto riguarda la risoluzione dei problemi lineari, si `e fatto uso dei solutori gi`a presenti nella libreria. Per la struttura propria del problema duale, anche in questo caso si `e reso necessario l’utilizzo dei nuovi metodi per l’implementazione del termine convettivo duale.

In Figura 2.1 `e riportato uno schema chiarificativo delle interazioni tra i diversi file in questione. Passiamo ora a descrivere nel dettaglio le classi implementate.

Figura 2.1: Schema delle relazioni tra i file, per la risoluzione del problema primale (non lineare) e duale (lineare)

2.2

SteadyNavierStokesAssembler

La classe SteadyNavierStokesAssembler eredita dalla gi`a esistente clas-se Oclas-seenAsclas-sembler, la quale viene ridefinita come super tramite typedef.

(27)

In aggiunta a quest’ultima contiene un metodo per l’assemblaggio della

com-ponente convettiva duale, assente nei problemi di Oseen, chiamato addAdjointConvection. Contiene inoltre due metodi riassuntivi per l’assemblaggio della matrice

di Stokes e della matrice del problema aggiunto, i quali richiamano gli opportuni metodi della classe madre OseenAssembler. Il metodo

1 template< class mesh_type , class matrix_type , class vector_type > 2 void

3 SteadyNavier St ok es As se mb l er < mesh_type , matrix_type , vector_type >:: 4 assembleS to k es M a tr i x ( matrix_ptrTyp e matrix ,

5 const Real & viscosity , 6 const DiffusionType 7 diffusionType = ViscousStress ); costruisce la matrice  A BT B 0 

Successive chiamate ai metodi

1 void addConvection ( matrix_ptrTyp e matrix , 2 const vector_type & beta , 3 const UInt & offsetLeft , 4 const UInt offsetUp ); 5

6 void addAdjoint Co n v ec t io n ( matrix_ptrTy pe matrix , 7 const vector_type & beta , 8 const UInt & offsetLeft , 9 const UInt offsetUp );

completeranno la matrice aggiungendo rispettivamente i blocchi C1 e C2 Cij1 = c(β, ϕj, ϕi)

Cij2 = c(ϕj, β, ϕi) (2.1) Cbeta = C1+ C2

Nel caso si abbia gi`a a disposizione il vettore beta, si pu`o chiamare il metodo

1 void assembleAd j oi n t Ma t ri x ( matrix_ptrTy pe matrix , 2 const Real & viscosity , 3 const vector_type & beta , 4 const DiffusionType

5 diffusionType = ViscousStress );

che costruisce la matrice completa 

A + Cbeta BT

B 0



Poich`e i metodi di assemblaggio sono pensati per essere chiamati in sequen-za, essi provvedono ad aggiungere i contributi necessari agli elementi della

(28)

matrice, senza fissarne la struttura. Trattandosi principalmente di matrici sparse, esse sono infatti memorizzate in modo ottimale tenendo in memoria solo gli elementi non nulli. Una volta completata la matrice sar`a quindi necessario chiamare il metodo globalAssemble() per definirne il pattern, associando gli indici agli elementi non nulli.

2.2.1 Il metodo addAdjointConvection

Il metodo caratterizzante la classe SteadyNavierStokesAssembler ri-spetto a OseenAssembler `e

1 template< class mesh_type , class matrix_type , class vector_type > 2 void

3 SteadyNavier St ok es As se mb l er < mesh_type , matrix_type , vector_type >:: 4 addAdjoin tC o nv e c ti o n ( matrix_ptrTyp e matrix ,

5 const vector_type & beta , 6 const UInt & offsetLeft , 7 const UInt offsetUp )

il quale, come anticipato, calcola la seguente matrice Cij2 = c(ϕj, β, ϕi) =

Z

j · ∇)β · ϕidΩ (2.2) Si osservi che la funzione β che compare nella formula precedente appartiene allo stesso spazio a elementi finiti della componente di velocit`a della soluzione delle equazioni di Navier-Stokes. Infatti, nel caso del sistema primale, β sar`a, ad ogni iterazione dell’algoritmo di Newton, la velocit`a uk ottenuta

all’iterazione precedente. Nel caso del sistema aggiunto, invece, β sar`a la velocit`a soluzione del problema primale. Dunque `e possibile esprimere β in funzione delle basi dello spazio

β(x) =

Nu

X

s=1

βsϕs(x)

Per il calcolo dell’integrale (2.2) viene effettuata un’integrazione numerica su ogni elemento della mesh. Chiamando αk i pesi di quadratura riscalati con il determinante dello jacobiano di un’eventuale trasformazione di coordinate rispetto all’elemento di riferimento, il contributo di ogni elemento K ∈ Th

sar`a dunque Z K (ϕj· ∇)β · ϕidΩ nbQuadPt X k=1 αk(ϕkj · ∇)βk· ϕki = = nbQuadPt X k=1 αk 3 X l=1 ϕkjl ∂ ∂xl Nu X s=1 βskϕks ! · ϕki = = nbQuadPt X k=1 αk 3 X l=1 3 X r=1 Nu X s=1 βsk∂ϕ k sr ∂xl ! ϕkjlϕkir (2.3)

(29)

Si riportano ora le operazioni effettuate dal metodo addAdjointConvection. Innanzitutto vengono memorizzate alcune quantit`a necessarie per il calcolo di (2.3), come il numero degli elementi della mesh, la dimensione dello spazio (3 in questo caso), il numero dei gradi di libert`a e il numero dei nodi di quadratura.

1 // Some constants

2 const UInt nbElements ( super :: M_uFESpace - > mesh () - > numElements ()); 3 const UInt fieldDim ( super :: M_uFESpace - > fieldDim ());

4 const UInt nbUTotalDof ( super :: M_uFESpace - > dof (). numTotalDof ()); 5 const UInt nbQuadPt ( super :: M_convectionUCFE - > nbQuadPt ()); 6

7 std :: vector < std :: vector < std :: vector < Real > > >

8 localBetaValu e ( nbQuadPt , std :: vector < std :: vector < Real > > 9 ( nDimensions , std :: vector < Real >( nDimensions ,0.0)));

Il contenitore localBetaValue `e un vector della Standard Library lungo quanto i nodi di quadratura, i cui elementi sono vector di lunghezza 3 (la dimensione del problema nDimensions), ognuno dei quali contiene un ulte-riore vector lungo 3. Questo contenitore servir`a ad immagazzinare i valori delle derivate della funzione β all’interno di ogni elemento su ogni nodo di quadratura localBetaValue[k][l][r] = Nu X s=1 βks∂ϕ k sr ∂xl (2.4) Si effettua dunque un ciclo sugli elementi della mesh e all’interno di ogni ciclo vengono aggiornate le funzioni di base e i coefficienti di quadratura nell’elemento corrente per la velocit`a, e le derivate delle funzioni di base nell’elemento corrente per la funzione β. Viene inoltre azzerata la matrice M_localAdjointConvectionpoich`e riutilizzata in ogni ciclo (con l’aggettivo localsi fa riferimento a oggetti dimensionati per il singolo elemento finito in questione)

1 // Loop over the elements

2 for ( UInt iterElement (0); iterElement < nbElements ; ++ iterElement ) 3 {

4 // Update the convection current FE

5 super :: M_convectionUCFE - > update ( super :: M_uFESpace - > mesh ()

6 -> element ( iterElement ) ,

7 UPDATE_PHI | UPDATE_WDET );

8 super :: M_convectionBetaCFE - > update ( super :: M_uFESpace - > mesh ()

9 -> element ( iterElement ) ,

10 UPDATE_DPHI );

11

12 // Clean the local matrix

13 M_localAdjoint Co nv ec ti on - > zero ();

Sempre all’interno del ciclo, viene poi chiamata la funzione

1 // Interpolate

(30)

3 * super :: M_convectionBetaCFE ,

4 nDimensions ,

5 super :: M_betaFESpace - > dof () ,

6 iterElement ,

7 beta );

che `e l’analogo della funzione template

1 template<typename localVector , typename globalVector > 2 void interpolate ( localVector & localValues ,

3 const CurrentFE & interpCFE , 4 const UInt & spaceDim ,

5 const DOF & betaDof , 6 const UInt & elementID , 7 const globalVector & beta );

presente nel namespace AssemblyElemental per la costruzione della stan-dard convection. `E proprio la funzione adjointInterpolate ad inserire i corretti valori (2.4) in localBetaValue. Il contenitore cos`ı aggiornato viene poi passato alla funzione

1 // Local adjoint convection

2 AssemblyEl em e nt a l :: adjointAdvec t io n (* M_localAdjointC on ve ct io n ,

3 * super :: M_convectionUCFE ,

4 localBetaValue ,

5 fieldDim );

la quale aggiorner`a la matrice M_localAdjointConvection con la quan-tit`a (2.3). Il contributo di ogni elemento verr`a infine inserito nella matrice globale matrix con il seguente metodo

1 // Assembly

2 for ( UInt iFieldDim (0); iFieldDim < nDimensions ; ++ iFieldDim ) 3 {

4 assembleMatr ix (* matrix ,

5 * M_localAdjoint Co nv ec ti on , 6 * super :: M_convectionUCFE , 7 * super :: M_convectionUCFE , 8 super :: M_uFESpace - > dof () , 9 super :: M_uFESpace - > dof () , 10 iFieldDim , iFieldDim ,

11 iFieldDim * nbUTotalDof + offsetUp , 12 iFieldDim * nbUTotalDof + offsetLeft ); 13 }

2.3

NonLinearRichardson

La libreria LifeV `e provvista della seguente funzione template che im-plementa il metodo di Richardson per la risoluzione del sistema

(31)

dove F `e un operatore. Si indichi con ∂F/∂u(u) una linearizzazione dell’o-peratore. L’algoritmo iterativo compie i seguenti passi

• ∀u0 dato iniziale, sia r0= F (u0) il residuo iniziale dell’equazione

• ∀xk≥ 0

1. si risolva il problema incrementale ∂F∂u(uk)(δuk) =−rk

2. si calcoli uk+1 = uk+ δuk

3. si calcoli il nuovo residuo rk+1 = F (uk+1)

finch`e non viene soddisfatto un criterio di arresto scelto.

Il metodo di Newton `e un sottocaso del metodo di Richardson, nel momento in cui la linearizzazione dell’operatore `e il suo Jacobiano esatto.

Riportiamo la firma della funzione che implementa il metodo:

1 template < class Fct >

2 Int NonLinearRi c h ar d so n ( VectorEpetra & sol ,

3 Fct & functional ,

4 Real abstol ,

5 Real reltol ,

6 UInt & maxit ,

7 Real eta_max ,

8 Int NonLinearLineSearch ,

9 std :: ofstream & out_res , 10 const Real & time ,

11 UInt iter = UInt (0) ,

12 bool mytest = false)

Tra i parametri in ingresso vi sono

• sol: un vettore in cui salvare la soluzione

• functional: un oggetto che rappresenta l’operatore che si `e intenzio-nati a risolvere

• abstol, reltol: le tolleranze per il criterio di arresto

• mytest, indicatore del criterio di arresto. Questo parametro `e stato aggiunto alla dichiarazione originaria della funzione per permettere la scelta del criterio di arresto. Maggiori dettagli verranno dati pi`u avanti.

Il fulcro attorno cui ruota NonLinearRichardson `e il funzionale functional. `

E richiesto che tale oggetto contenga i seguenti due metodi per il calcolo rispettivamente della soluzione e del residuo al passo k.

(32)

1 // ! Solves the Jacobian system 2 /* *

3 \ param muk : unknown solution at the k - th nonlinear iteration 4 \ param res : residual vector ( the RHS of the Jacobian system ) 5 \ param linearRelTol : tolerance for the nonlinear solver 6 */

7 void solveJac ( vector_type & muk ,

8 const vector_type & res , 9 const Real linearRelTol ); 10

11 // ! Evaluates the nonlinear residual of the system 12 /* *

13 \ param res : residual vector to be computed 14 \ param disp : current unknown solution

15 \ param iter : nonlinear iteration counter . The part of the rhs 16 related to the time discretizatio n is computed only for iter =0 17 */

18 void evalResidual ( vector_type & res ,

19 const vector_type & disp , 20 const UInt iter );

Questi metodi svolgono operazioni differenti a seconda del problema che si vuole risolvere, perci`o devono essere implementati direttamente dall’utente. Si `e quindi creata una classe apposita, SteadyNavierStokesJacobian, che contenesse il funzionale, ovvero lo jacobiano esatto delle equazioni di Navier-Stokes.

2.4

SteadyNavierStokesJacobian

Per poter contenere i due metodi precedentemente citati, tale classe de-ve necessariamente ade-vere memorizzate una serie di informazioni relatide-ve al problema, quali gli spazi a elementi finiti, le condizioni al contorno, e de-ve essere in grado di assemblare e risolde-vere il problema ad ogni iterazione dell’algoritmo di Newton.

I principali attributi della classe SteadyNavierStokesJacobian sono • FESpace<mesh_Type,MapEpetra>& M_velocityFESpace; `e lo spazio

agli elementi finiti per la velocit`a

FESpace<mesh_Type,MapEpetra>&M_pressureFESpace;`e invece lo spa-zio agli elementi finiti per la pressione

• Real M_pressureOffset; offset per la pressione. In altre parole, `e la dimensione del vettore dei gradi di libert`a globali per la velocit`a • Displayer M_Displayer; MPI communicator, per la parallelizzazione

del codice

• MapEpetra M_solutionMap; `e la mappa della solutione globale (velo-cit`a + pressione)

(33)

• matrixPtr_Type M_baseMatrix; puntatore alla matrice di base, ov-vero la matrice di Stokes. `E la parte fissa della matrice, calcolata una volta per tutte alla costruzione dell’oggetto, e a cui in un secondo momento vengono aggiunte le componenti convettive

matrixPtr_Type M_systemMatrix;la matrice completa, ovvero quella di Stokes pi`u i termini convettivi. Verr`a riaggiornata ad ogni chiamata da NonLinearRichardson

• vector_type M_rhs; vettore per il termine noto

vector_type M_initialSolution;vettore della soluzione globale, che verr`a assegnato alla prima iterazione dell’algoritmo NonLinearRichard-son

vector_type M_currentSolution;vettore della soluzione globale ag-giornato nelle iterazioni successive dell’algoritmo NonLinearRichard-son

• linearSolver_Type M_linearSolver; solutore lineare per la risolu-zione dello jacobiano

• SteadyNavierStokesAssembler<mesh_Type,matrix_type,vector_type> M_assembler;assembler per la costruzione delle matrici del problema • boost::shared_ptr<bcHandler_Type> M_bcHandler; puntatore al-l’oggetto di tipo BCHandler che contiene le condizioni al contorno del problema

Gli attributi vengono settati in parte attraverso il costruttore, in parte con un metodo setUp che riceve in ingresso un datafile.

Il problema da risolvere mediante l’algoritmo di Newton sar`a in realt`a quello scritto in versione incrementale (1.19), avente come incognite gli in-crementi (δuk, δpk) della soluzione. Ricordando la definizione delle matrici A, B, C1, C2, e C = C1+ C2 in (1.24) e (2.1), il problema da risolvere ad

ogni iterazione risulta  A + CUk BT B 0   δUk+1 δPk+1  =  A + C1Uk BT B 0   Uk Pk 

Bisogna per`o fare particolare attenzione alle condizioni al bordo, poich`e per gli incrementi esse sono omogenee. Le condizioni memorizzate nell’attributo M_bcHandler sono invece quelle relative alla soluzione (u, p). Per imporre quindi le condizioni omogenee `e necessario sottrarre a termine noto i valori non nulli delle condizioni in ogni nodo di bordo. Le righe della matrice del sistema vengono invece modificate come di consueto imponendo le condizioni al contorno della soluzione con il metodo bcManage.

Si riporta ora il metodo necessario a NonLinearRichardson adibito alla risoluzione del sistema (1.18).

(34)

1 template<typename MeshType , typename SolverType > 2 void

3 SteadyNavierS to ke sJ ac ob ia n < MeshType , SolverType >:: 4 solveJac ( vector_type & muk ,

5 const vector_type & res , 6 const Real linearRelTol ) 7 {

8 M_linearSolv er . setTolerance ( linearRelTol );

9 M_Displayer . leaderPrint ( " Solving Jacobian system ... " ); 10

11 M_systemMatr ix . reset (new matrix_type ( M_solutionMap )); 12 * M_systemMatr i x += * M_baseMatrix ;

13 M_assembler . addConvection ( M_systemMatrix , M_currentS ol u ti o n ); 14 M_assembler . addAdjoin tC o nv e c ti o n ( M_systemMatrix ,

15 M_currentSo lu t io n ); 16 bcManage (* M_systemMatrix , 17 M_rhs , 18 * M_velocityF E Sp a ce . mesh () , 19 M_velocityF E Sp a ce . dof () , 20 * M_bcHandler ,

21 M_assembler . getUFESpace () - > feBd () ,

22 1.0);

23

24 M_systemMatrix - > globalAssem bl e (); 25

26 M_linearSolv er . setMatrix ( * M_systemMatr ix );

27 M_linearSolv er . solveSystem ( res , muk , M_systemMatr ix );

28 M_Displayer . leaderPrint ( " Solving the Jacobian system done .\ n " ); 29 }

Si pu`o vedere come venga dapprima costruita la matrice del sistema, co-piandola dalla matrice di Stokes precedentemente calcolata (linea 12), e aggiungendo i termini convettivi associati alla soluzione corrente (linee 13-14). Vengono poi imposte le condizioni al contorno sulla matrice (linea 16), che viene in seguito chiusa (linea 24). Si setta il solutore lineare (linea 26) e si risolve il sistema avente come termine noto il vettore del residuo passato al metodo e salvando la soluzione nel vettore muk. Tale residuo `e il vettore proveniente dal metodo evalResidual, ed ha gi`a imposte le condizioni al contorno omogenee, come spiegato in precedenza.

1 template<typename MeshType , typename SolverType > 2 void

3 SteadyNavierS to ke sJ ac ob ia n < MeshType , SolverType >:: 4 evalResidual ( vector_type & res ,

5 const vector_type & disp , 6 const UInt iter )

7 {

8 LifeChrono chrono ;

9 if ( iter == 0) M_initialS ol u ti o n = disp ; 10 M_currentS ol u ti o n = disp ;

11

(35)

13 chrono . start ();

14 M_systemMatr ix . reset (new matrix_type ( M_solutionMap )); 15 * M_systemMatr i x += * M_baseMatrix ;

16 M_assembler . addConvection ( M_systemMatrix , M_currentS ol u ti o n ); 17

18 M_rhs *= 0.; 19

20 // Apply BC

21 M_Displayer . leaderPrint ( " Applying BC ... " ); 22 bcManage (* M_systemMatrix , 23 M_rhs , 24 * M_velocityF E Sp a ce . mesh () , 25 M_velocityF E Sp a ce . dof () , 26 * M_bcHandler , 27 M_velocityF E Sp a ce . feBd () , 28 1.0); 29 30 if ( M_bcHandler - > hasOnlyEssen t ia l () ) 31 {

32 M_Displayer . leaderPrint ( " ... diagonalizin g ... " ); 33 M_systemMatrix - > diagonalize ( M_pressureOffset ,

34 1. , 35 M_rhs , 36 0. ); 37 } 38 39 M_systemMatrix - > globalAssem bl e ();

40 M_Displayer . leaderPrintM ax ( " done in " , chrono . diff () ); 41

42 res = * M_systemMatri x * M_currentS ol ut i on - M_rhs ; 43 }

Alle linee 9 e 10 vengono salvati i vettori contenenti la soluzione iniziale e corrente, necessarie al metodo solveJac. Viene poi costruita la matrice 

A + CUk

1 BT

B 0



contenente solamente un termine convettivo (linee 14-16). Ad essa e al vettore M_rhs vengono applicate le condizioni al contorno non omogenee (linea 22), che verranno rese omogenee nel residuo per diffe-renza alla linea 42. Alle linee 30-37 vi `e inoltre un controllo, nel caso in cui le condizioni al bordo siano tutte di tipo Dirichlet, per modificare la matrice in modo da fissare il valore della pressione in un punto ed evitare cos`ı i modi spuri.

2.4.1 Criteri di arresto

I criteri di arresto per il metodo di Newton in considerazione possono essere di due tipi, riguardanti il residuo F (u) oppure l’incremento δu. La versione del NonLinearRichardson implementata nella libreria faceva uso esclusivamente del primo criterio. Si `e quindi provveduto ad implementa-re il seguente criterio basato sulle norme degli incimplementa-rementi, in quanto pi`u

(36)

pertinente per il problema in esame. kuk+1− ukkH1(Ω) kukkH1(Ω) +kpk+1− pkkL2(Ω) kpkkL2(Ω) ≤ ǫ (2.5)

Il codice corrispondente `e uno dei metodi della classe SteadyNavierStokesJacobian e viene richiamato direttamente all’interno del NonLinearRichardson.

1 template<typename MeshType , typename SolverType > 2 bool

3 SteadyNavierS to ke sJ ac ob ia n < MeshType , SolverType >::

4 evalCriterion ( vector_type & residual0 , vector_type & residual , 5 vector_type & sol0 , vector_type & step ,

6 Real abstol , Real reltol ) 7 {

8 vector_type velocity0 ( M_velocityF E Sp a ce . map () , Repeated ); 9 vector_type velocity ( M_velocityF E Sp ac e . map () , Repeated ); 10 vector_type pressure0 ( M_pressureF E Sp a ce . map () , Repeated ); 11 vector_type pressure ( M_pressureF E Sp ac e . map () , Repeated ); 12

13 velocity0 . subset ( sol0 ); 14 velocity . subset ( step );

15 pressure0 . subset ( sol0 , M_pressureO ff s et ); 16 pressure . subset ( step , M_pressureO ff s et ); 17 18 Real velocityNorm ; 19 Real pressureNorm ; 20 Real velocityTol ; 21 Real pressureTol ; 22

23 velocityNorm = M_velocity FE S pa c e . h1Norm ( velocity ); 24 pressureNorm = M_pressure FE S pa c e . l2Norm ( pressure ); 25

26 velocityTol = abstol + reltol * M_velocity FE S pa c e . h1Norm ( velocity0 ); 27 pressureTol = abstol + reltol * M_pressure FE S pa c e . l2Norm ( pressure0 ); 28

29 M_Displayer . leaderPrint ( " > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > \ n " ); 30 M_Displayer . leaderPrint ( " H1 norm velocity increment : " ,

31 velocityNorm , " \ n " );

32 M_Displayer . leaderPrint ( " L2 norm pressure increment : " , 33 pressureNorm , " \ n " );

34 M_Displayer . leaderPrint ( " velocity tolerance : " , 35 velocityTol , " \ n " ); 36 M_Displayer . leaderPrint ( " pressure tolerance : " , 37 pressureTol , " \ n " );

38 M_Displayer . leaderPrint ( " < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < \ n " ); 39

40 return ( velocityNorm > velocityTol )||( pressureNorm > pressureTol ); 41 }

(37)

2.5

Il file di esempio

Alla luce delle propriet`a dell’analisi di sensitivit`a, che richiede di risolve-re il problema primale un’unica volta per tutte le analisi, si `e deciso di crisolve-rearisolve-re 2 main file separati con diversi compiti. Il primo svolge tutte le operazioni funzionali all’analisi di sensitivit`a, quali la risoluzione del problema di Na-vier Stokes o il calcolo delle normali al dominio, necessarie per l’imposizione delle condizioni al contorno del problema duale. Il secondo utilizza le infor-mazioni provenienti dal primo e risolve il problema aggiunto corrispondente al funzionale scelto, calcolando in seguito tutte le sensitivit`a volute.

Per alcune operazioni di post processing ci si `e avvalsi del sofwtare grafico e di analisi dati Paraview [11].

(38)

Risultati numerici

Riportiamo ora i risultati ottenuti con il codice appena descritto. Poich`e l’obiettivo principale `e stato la validazione del codice implementato, la mag-gior parte delle simulazione sono state effettuate su una geometria cilindrica ideale.

Inizialmente illustreremo la scelta per il funzionale J, che ha portato alla determinazione del problema aggiunto. Passeremo poi alla validazione del codice testandolo sul problema di Poiseuille di cui `e nota la soluzione analitica, riportando i valori di sensitivit`a rispetto al profilo in ingresso. Descriveremo in seguito come si `e potuto estendere il codice implementato ad applicazioni su geometrie reali, riportando i risultati ottenuti con una mesh della biforcazione carotidea proveniente da una risonanza magnetica.

Per le simulazioni sono stati utilizzati i seguenti parametri fisici per il sangue [4]

• densit`a ρ = 1.06 g/cm2

• viscosit`a dinamica µ = 0.035 g/cm s • viscosit`a cinematica ν = µρ = 0.033 cm2/s

3.1

Quantit`

a di interesse

Poich`e siamo interessati a valutare lo sforzo di taglio in una geometrica cilindrica, scegliamo di osservare inizialmente la componente lungo l’asse longitudinale z. Il funzionale (1.7) scelto `e

J1(u, p) =

Z

Σ

(σn)ezψ(x) dΣ (3.1)

dove la funzione ψ : R3 → R identifica la regione in un intorno del punto

(x0, y0, z0) in cui si `e interessati a valutare lo sforzo di taglio

ψ(x) = S[d20−((x−x0)2+(y−y0)2+(z−z0)2)] (x−x0)2+(y−y0)2+(z−z0)2 < d20

(39)

S `e una costante di normalizzazione tale che R Σψ(x) dΣ = 1. La derivata del funzionale (3.1) `e ∂J1 ∂w(δw) =− Z Σ δw· ezψ(x) dΣ

per cui la condizione di Dirichlet per il problema duale (1.14) diventa φ=−ezψ(x) su Σ

Il problema aggiunto che andremo a risolvere sar`a dunque

Trovare φ∈ [H1(Ω)]3, θ∈ L2(Ω) : (3.2)                 

a(δu, φ) + b(θ, δu) + c′(u, δu, φ) + r(δu, φ) = 0 ∀δu ∈ V

b(δp, φ) = 0 ∀δp ∈ L2(Ω)

φ= 0 su ΓIN

φ· t = 0 su ΓOUT

φ=−ezψ(x) su Σ

3.2

Profilo di Poiseuille

Il codice implementato `e stato testato risolvendo il problema di Poi-seuille di cui `e nota la soluzione analitica. L’obiettivo `e di verificare la validit`a dei risultati di sensitivit`a, cuore del lavoro, piuttosto che il solutore di Navier-Stokes, in quanto principalmente basato su algoritmi gi`a esistenti. Il problema di Poiseuille consiste nello studio del campo di velocit`a di un fluido in un cilindro causato da una differenza di pressione ∆p ai capi di esso, assumendo quest’ultima come unica perdita di carico. Siano L la lunghezza del cilindro, γ il raggio di base e l’asse longitudinale sia l’asse z (v. Figura

3.1). Il problema in questione `e dunque il problema (1.6), qui riportato,

(40)

               −2ν∇ · D(u) + (u · ∇)u + ∇p = 0 in Ω ∇ · u = 0 in Ω u= uIN su ΓIN 1 RnTσn =−Q su ΓOUT u· t = 0 su ΓOUT u= 0 su Σ (3.3)

in cui viene imposta come profilo in ingresso la soluzione esatta

u(r) = uIN(r) =   0 0 ∆p 4µL(γ2− r2)   r = p x2+ y2

La velocit`a massima e quella media sono rispettivamente uMAX= ∆p 4µLγ 2e z ¯u= Reµ 2ρ2γez= 1 2uMAX I dati utilizzati per le seguenti simulazioni sono

• raggio γ = 0.3 cm • lunghezza L = 5 cm

• velocit`a massima uMAX= 46 cm/s

• numero di Reynolds Re= ¯ u

ν = 418

• parametri E = 3 · 106, ˆν = 0.49, h = 0.1 per il calcolo del coefficiente

di resistenza R

Il carico di pressione cos`ı imposto risulta essere ∆p = 32Lµ¯u

D2 = 357.8 dyne/cm 2

(3.4) Poich`e il cilindro `e disposto verticalmente, la normale alla parete ha componente z nulla. Lo sforzo (σn)ez per il problema di Poiseuille assume

quindi la seguente espressione (σn)ez = µ ∂uz ∂xnx+ µ ∂uz ∂y ny = µ ∆p 4µL(−2x)nx+ µ ∆p 4µL(−2y)ny =−∆p 2L(xnx+ yny) `

E facile vedere che nx = x/γ e ny = y/γ, per cui xnx+ yny = γ, quindi lo

sforzo ha valore costante su tutta la parete del cilindro (σn)ez =−

γ∆p

(41)

Poich`e il peso ψ integra a 1, il funzionale (3.1) assume lo stesso valore J1(u, p) = (σn)ez Z Σ ψ(x) dΣ =−10.73481 (3.6) 3.2.1 La soluzione numerica

Abbiamo risolto il problema (3.3) con il codice implementato utilizzando elementi finitiP2− P1 su mesh cilindriche da tra 1680 a 36600 tetraedri, che

si traducono in un range di 8487-159075 gradi di libert`a per la velocit`a e di 441-7191 per la pressione.

Riportiamo i risultati per la mesh di riferimento con 17760 tetraedri. Nelle Figure 3.2 e 3.3 `e possibile vedere il campo di velocit`a soluzione del-l’equazione di Navier Stokes. Correttamente, l’unica componente non nulla `e quella assiale e assume valore 0 al bordo e massimo al centro del cilindro.

Figura 3.2: Campo di velocit`a per il problema di Poiseuille calcolato con LifeV

In Figura 3.4`e riportata invece la pressione. Osserviamo una perdita di carico di circa 355 dyne/cm2, coerente con il carico imposto (3.4). Il valore

massimo 19773 corrisponde a circa 14.8 mmHg (1 mmHg = 1333 dyne/cm2).

3.2.2 Comportamento al variare del passo h

Avendo a disposizione la soluzione analitica abbiamo potuto calcolare gli errori delle soluzioni numeriche rispetto ad essa. Nella tabella 3.1 sono riportati gli errorikuex− u

hkL2 e kpex− phkL2 al variare del passo h della

mesh

h = max

(42)

Figura 3.3: Sezione longitudinale del campo di velocit`a per il problema di Poiseuille calcolato con LifeV

Figura 3.4: Campo di pressione per il problema di Poiseuille calcolato con LifeV

figura

Figura 1.1: Esempio di dominio in applicazioni emodinamiche: geometria di una carotide

Figura 1.1:

Esempio di dominio in applicazioni emodinamiche: geometria di una carotide p.13
Figura 1.2: Profili di Womersley

Figura 1.2:

Profili di Womersley p.13
Figura 2.1: Schema delle relazioni tra i file, per la risoluzione del problema primale (non lineare) e duale (lineare)

Figura 2.1:

Schema delle relazioni tra i file, per la risoluzione del problema primale (non lineare) e duale (lineare) p.26
Figura 3.1: Geometria cilindrica e sistema di riferimento

Figura 3.1:

Geometria cilindrica e sistema di riferimento p.39
Figura 3.2: Campo di velocit` a per il problema di Poiseuille calcolato con LifeV

Figura 3.2:

Campo di velocit` a per il problema di Poiseuille calcolato con LifeV p.41
Figura 3.4: Campo di pressione per il problema di Poiseuille calcolato con LifeV

Figura 3.4:

Campo di pressione per il problema di Poiseuille calcolato con LifeV p.42
Figura 3.3: Sezione longitudinale del campo di velocit` a per il problema di Poiseuille calcolato con LifeV

Figura 3.3:

Sezione longitudinale del campo di velocit` a per il problema di Poiseuille calcolato con LifeV p.42
Figura 3.5: Andamento degli errori della soluzione numerica rispetto a quella esatta per il problema (3.3)

Figura 3.5:

Andamento degli errori della soluzione numerica rispetto a quella esatta per il problema (3.3) p.43
Tabella 3.1: Sintesi dei risultati ottenuti con differenti mesh cilindriche:

Tabella 3.1:

Sintesi dei risultati ottenuti con differenti mesh cilindriche: p.43
Figura 3.6: Soluzione aggiunta del sistema (3.2) con J 1 A

Figura 3.6:

Soluzione aggiunta del sistema (3.2) con J 1 A p.44
Figura 3.7: Soluzione aggiunta del sistema (3.2) con J 1 B

Figura 3.7:

Soluzione aggiunta del sistema (3.2) con J 1 B p.46
Tabella 3.3: Sintesi dei risultati ottenuti con differenti mesh cilindriche:

Tabella 3.3:

Sintesi dei risultati ottenuti con differenti mesh cilindriche: p.47
Figura 3.8: Velocit` a soluzione del sistema primale con profilo di Womersley in ingresso

Figura 3.8:

Velocit` a soluzione del sistema primale con profilo di Womersley in ingresso p.48
Tabella 3.4: Sensitivit` a di J 1 B rispetto ai profili di velocit` a in inflow ω j α j ∂J ∂η 1 B j (δη j ) 1 4.13838 -0.152924 2 5.85255 -0.0575839 3 7.17147 0.0323245 3.3.2 Mappa di sensitivit`a

Tabella 3.4:

Sensitivit` a di J 1 B rispetto ai profili di velocit` a in inflow ω j α j ∂J ∂η 1 B j (δη j ) 1 4.13838 -0.152924 2 5.85255 -0.0575839 3 7.17147 0.0323245 3.3.2 Mappa di sensitivit`a p.49
Figura 3.10: Soluzione del sistema primale nella carotdide

Figura 3.10:

Soluzione del sistema primale nella carotdide p.53
Figura 3.11: Wall Shear Stress sulla parete carotidea

Figura 3.11:

Wall Shear Stress sulla parete carotidea p.54
Figura 3.12: Soluzione aggiunta del sistema duale nella carotdide con J 2 A

Figura 3.12:

Soluzione aggiunta del sistema duale nella carotdide con J 2 A p.55
Figura 3.13: Soluzione aggiunta del sistema duale nella carotdide con J 2 B

Figura 3.13:

Soluzione aggiunta del sistema duale nella carotdide con J 2 B p.56
Figura 3.14: Sensitivit` a in inflow - componente Z

Figura 3.14:

Sensitivit` a in inflow - componente Z p.57
Argomenti correlati :