Sei sulla pagina 1di 17

DIPARTIMENTO DI INGEGNERIA MECCANICA ED AEROSPAZIALE

Corso di Laurea Magistrale in Ingegneria Meccanica

Tesina Boiler
Gruppo 3

Studenti:
Petricciuolo Ciro Giorgio
Matricola s231930

Riva Gan Giancarlo


Matricola s231467

Anno Accademico 2016-2017


Sommario
Introduzione....................................................................................................................................................... 2
Dominio e Proprietà .......................................................................................................................................... 2
Descrizione del Problema .................................................................................................................................. 3
Soluzione stazionaria ......................................................................................................................................... 3
Precondizionamento .......................................................................................................................................... 5
Transitorio ......................................................................................................................................................... 6
Appendice .......................................................................................................................................................... 8

1
Introduzione
Il problema che ci apprestiamo a risolvere riguarda lo scambio di calore tra due fluidi, gas e acqua
delle utenze, all’interno di una caldaia attraverso una lastra solida. Il modello di questo fenomeno è molto
complesso ma è riconducibile a due equazioni che regolano lo scambio termico del fluido caldo con il fluido
freddo e viceversa:
𝜕𝑇1
𝜌1 𝑐1 ( + 𝛽1 ∙ ∇𝑇1 ) − ∇ ∙ (𝜆1 ∇𝑇1 ) + 𝑘(𝑇1 − 𝑇2 ) = 0
𝜕𝑡
𝜕𝑇2
𝜌2 𝑐2 ( + 𝛽2 ∙ ∇𝑇2 ) − ∇ ∙ (𝜆2 ∇𝑇2 ) + 𝑘(𝑇2 − 𝑇1 ) = 0
𝜕𝑡
in cui si è indicato con il pedice 1 i valori relativi al fluido caldo mentre con il pedice 2 i valori relativi al fluido
freddo. Di seguito si riportano in tabella 1 i parametri dei fluidi in gioco:

Simbolo Fluido caldo Fluido freddo Unità di misura


𝑚
Velocità 𝛽 0.01 0.001
𝑠
𝑊
Conducibilità termica 𝜆 0.026 0.6
𝑚𝐾
𝑘𝑔
Densità 𝜌 0.77 1000
𝑚3
𝐽
Calore Specifico 𝑐 1035 4186
𝑘𝑔𝐾
𝑊
Trasmittanza 𝑘 80 80
𝑚2 𝐾
Tabella 1- Proprietà dei fluidi

L’obiettivo di tale elaborato è quello di analizzare le due diverse equazioni del calore in maniera
congiunta al fine di ottenere il flusso di calore che si instaura tra i due fluidi e valutare l’andamento della
temperatura sia a regime che in transitorio, diagrammandola opportunamente.

Dominio e Proprietà
Per quanto riguarda il dominio, si è scelto di studiare il problema mediante un dominio quadrato di
lato unitario e centrato nell’origine degli assi; per descrivere le proprietà del dominio si è considerato
separatamente il fluido caldo e il fluido freddo. Analizzando un solo flusso alla volta, si è considerata una
condizione di Dirichlet sul bordo in ingresso (nota la temperatura in ingresso del fluido) e una condizione di
Neumann omogenea sugli altri bordi. Le temperature in ingresso considerate per il fluido caldo e per il fluido
freddo sono:

𝑇𝑂ℎ𝑜𝑡 = 500°𝐶
𝑇𝑂𝑐𝑜𝑙𝑑 = 25°𝐶

In figura 1 sono riportati i domini e le rispettive condizioni al bordo per ogni fluido:

2
Figura 1-Domini e Condizioni al bordo

Descrizione del Problema


Sviluppiamo il problema secondo la teoria degli elementi finiti. Gli spazi vettoriali considerati nella
formulazione variazionale discreta del problema riferita ad una triangolazione Ƭ sono i seguenti:

𝑉ℎ (𝑇𝑂ℎ𝑜𝑡 ) = {𝑣ℎ ∈ 𝐶 𝑂 (𝛺): 𝑣ℎ|𝑇 ∈ ℙ1 (𝑇) ∀ 𝑇 ∈ Ƭ , 𝑣ℎ = 𝑇𝑂ℎ𝑜𝑡 ∀ 𝑛𝑜𝑑𝑜 ∈ 𝛤𝐷1 }

𝑉𝑘 (𝑇𝑂𝑐𝑜𝑙𝑑 ) = {𝑣ℎ ∈ 𝐶 𝑂 (𝛺): 𝑣𝑘|𝑇 ∈ ℙ1 (𝑇) ∀ 𝑇 ∈ Ƭ , 𝑣𝑘 = 𝑇𝑂𝑐𝑜𝑙𝑑 ∀ 𝑛𝑜𝑑𝑜 ∈ 𝛤𝐷2 }

Essendo il dominio 𝛺 coincidente per il fluido caldo e fluido freddo, la formulazione variazionale
discreta risulta la seguente:
𝑇1ℎ ∈ 𝑉ℎ (𝑇𝑂ℎ𝑜𝑡 ) 𝑒 𝑠𝑜𝑑𝑑𝑖𝑠𝑓𝑎
𝜕𝑇1ℎ
𝜌1 𝑐1 (∫ 𝑣ℎ 𝑑𝛺 + ∫ 𝛽1 ∙ ∇𝑇1ℎ 𝑣ℎ 𝑑𝛺) + ∫ (𝜆1 ∇𝑇1ℎ · ∇𝑣ℎ )𝑑𝛺 + 𝑘 ∫ 𝑇1ℎ 𝑣ℎ 𝑑𝛺 − 𝑘 ∫ 𝑇2ℎ 𝑣ℎ 𝑑𝛺 = 0
𝛺 𝜕𝑡 𝛺 𝛺 𝛺 𝛺
𝑇2𝑘 ∈ 𝑉𝑘 (𝑇𝑂𝑐𝑜𝑙𝑑 ) 𝑒 𝑠𝑜𝑑𝑑𝑖𝑠𝑓𝑎
𝜕𝑇2𝑘
𝜌2 𝑐2 (∫ 𝑣𝑘 𝑑𝛺 + ∫ 𝛽2 ∙ ∇𝑇2𝑘 𝑣𝑘 𝑑𝛺) + ∫ (𝜆2 ∇𝑇2𝑘 · ∇𝑣𝑘 )𝑑𝛺 + 𝑘 ∫ 𝑇2𝑘 𝑣𝑘 𝑑𝛺 − 𝑘 ∫ 𝑇1𝑘 𝑣𝑘 𝑑𝛺 = 0
{ 𝛺 𝜕𝑡 𝛺 𝛺 𝛺 𝛺

∀ 𝑣ℎ ∈ 𝑉ℎ (0) 𝑒 𝑣𝑘 ∈ 𝑉𝑘 (0)

Soluzione stazionaria
Nel caso di soluzione stazionaria, l’integrale contenente la derivata rispetto al tempo è posto pari a
zero mentre la formulazione variazionale del problema si traduce nel seguente sistema:

𝑪 Ṯ + 𝑫𝟏 Ṯ1 + 𝑹𝒆𝟏 (Ṯ1 − Ṯ2 ) = ḇ1 (1)


{ 𝟏 1
𝑪𝟐 Ṯ2 + 𝑫𝟐 Ṯ2 + 𝑹𝒆𝟐 (Ṯ2 − Ṯ1 ) = ḇ2 (2)
dove si è utilizzato il grassetto per indicare le matrici mentre il sottosegnato per indicare i vettori.

Per ottenere le incognite Ṯ1 e Ṯ2 si è sviluppato il precedente sistema innanzitutto raccogliendo nella


(1) il vettore Ṯ1 e nella (2) il vettore Ṯ2 e successivamente si è scritto nella forma seguente in modo tale da
poterlo sviluppare tramite Matlab:

𝑪 𝑫 + 𝑹𝒆𝟏 −𝑹𝒆𝟏 Ṯ ḇ
[ 𝟏 𝟏 ] · [ 1] = [ 1]
+𝑹𝒆𝟐 𝑪𝟐 𝑫𝟐 + 𝑹𝒆𝟐 Ṯ2 ḇ2
3
dove si è indicato con:
𝑪𝟏,𝟐 = 𝑚𝑎𝑡𝑟𝑖𝑐𝑖 𝑡𝑒𝑟𝑚𝑖𝑛𝑒 𝑐𝑜𝑛𝑣𝑒𝑡𝑡𝑖𝑣𝑜;

𝑫𝟏,𝟐 = 𝑚𝑎𝑡𝑟𝑖𝑐𝑖 𝑡𝑒𝑟𝑚𝑖𝑛𝑒 𝑑𝑖 𝑑𝑖𝑓𝑓𝑢𝑠𝑖𝑜𝑛𝑒;

𝑹𝒆𝟏,𝟐 = 𝑚𝑎𝑡𝑟𝑖𝑐𝑖 𝑡𝑒𝑟𝑚𝑖𝑛𝑒 𝑑𝑖 𝑟𝑒𝑎𝑧𝑖𝑜𝑛𝑒.

Tali matrici sono state calcolate tramite il codice coupledNeumann_BuildStiff.m. Il sistema si


schematizza infine con: 𝑨𝒕𝒐𝒕𝒂𝒍𝒆 Ṯ = ḇ.
Identificando i nodi della mesh sul lato in uscita di ogni fluido, è stato possibile estrarre il profilo di
temperatura in uscita di ogni fluido, di cui si è poi anche fatta la media. La temperatura media del fluido caldo
è 25 °C, mentre del fluido freddo 26°C. In figura 2 si osserva come al calare dell’area massima del triangolo
della mesh, l’area sottesa dal profilo di temperatura si stabilizzi sotto 0.01. In figura 3 si osserva l’andamento
della temperatura nei bordi di uscita di ogni fluido:

Figura 2 Figura 3

in cui si sono valutati come numeri di Peclét rispetto ad un’area di triangolo 5 ∗ 10−4 : 𝑃𝑒1 = 4,79 e 𝑃𝑒2 =
109.01. Si sarebbe potuto abbassare i numeri di Peclet diminuendo ulteriormente l’area massima del triangolo
della mesh, ma non si è ritenuto necessario poiché non si sono evidenziati problemi di instabilità.
In figura 4 si riportano i risultati della soluzione stazionaria:

4
Figura 4

Successivamente si è effettuato lo studio della convergenza della mesh: in figura 5 al variare dell’area
massima del triangolo della mesh si mostra il valore medio della temperatura del fluido freddo in uscita.

Figura 5

Precondizionamento
La soluzione stazionaria è stata calcolata mediante metodo diretto. Per diminuire il costo
computazionale della ricerca della soluzione, si può utilizzare un metodo iterativo basato sul gradiente
biconiugato. Dopo aver calcolato i precondizionatori della matrice 𝑨𝒕𝒐𝒕𝒂𝒍𝒆 , sono note le matrici 𝑳 e 𝑼 e si
risolve il sistema lineare: (𝑳𝑼) ∗ 𝑨𝒕𝒐𝒕𝒂𝒍𝒆 Ṯ = (𝑳𝑼) ∗ ḇ. Il prodotto di L e U stima l’inversa di 𝑨𝒕𝒐𝒕𝒂𝒍𝒆 . Si
calcola il tempo di risoluzione del sistema per un range di tolleranze relativo alla soluzione. Il tempo di
risoluzione, in figura 6, è la somma del tempo necessario all’operazione di precondizionamento indicato con
𝑡𝑖𝑚𝑒𝑖𝑙𝑢 e quello utile alla risoluzione del sistema 𝑡𝑖𝑚𝑒𝑏𝑖𝑐𝑔 . Il risultato dell’analisi è che il minimo costo
computazionale con il metodo iterativo si ha per una tolleranza di 10−2.

5
Figura 6

Transitorio
Se non si trascura il termine integrale riferito alla derivata parziale nel tempo, nella formulazione

variazionale compaiono nuovi termini: Ṯ , ḇ′ e la matrice di massa 𝑴𝒕𝒐𝒕𝒂𝒍𝒆 . Il sistema lineare risultante sarà:

𝑴𝒕𝒐𝒕𝒂𝒍𝒆 Ṯ′ + 𝐀𝐭𝐨𝐭𝐚𝐥𝐞 Ṯ = ḇ + ḇ′
𝑴𝟏 𝟎
Dove 𝑴𝒕𝒐𝒕𝒂𝒍𝒆 = [ ].
𝟎 𝑴𝟐

Il termine ḇ′ rappresenta la variazione del termine noto del sistema causata dalle leggi di evoluzione
della temperatura sui bordi di Dirichlet del dominio. Le leggi sono esponenziali:
𝑡

𝑇𝑐 (𝑡) = 𝑇𝑐,0 + 𝛥𝑇𝑐 (1 − 𝑒 𝜏𝑐 )

𝑡

𝜏𝑓
𝑇𝑓 (𝑡) = 𝑇𝑓,0 + 𝛥𝑇𝑓 (1 − 𝑒 )
{
ipotizzando ΔTc = 50°𝐶, Δ𝑇𝑓 = 25°𝐶, 𝜏𝑐 = 5.11, 𝜏𝑓 = 6.

Per la discretizzazione in tempo del problema si è usato il metodo di Eulero Implicito:

(𝑴𝒕𝒐𝒕𝒂𝒍𝒆 + 𝑑𝑡𝑨𝒕𝒐𝒕𝒂𝒍𝒆 )Ṯk+1 = 𝑴𝒕𝒐𝒕𝒂𝒍𝒆 Ṯk + 𝑑𝑡 (ḇ𝑘+1 + ḇ′(𝑘+1) )


I risultati ottenuti per vari istanti temporali sono rappresentati in figura 7:

6
Figura 7

mentre in figura 8 è rappresentata la temperatura media del profilo del fluido freddo e caldo nel bordo di
Dirichlet nel tempo e infine in figura 9 la temperatura media del profilo del fluido freddo e caldo nel bordo di
uscita:

Figura 8 Figura 9

7
Appendice

Main
%% Boiler
clc; close all; clear;
addpath(genpath('Meshtoolbox'));
% Petricciuolo Ciro Giorgio 231930
% Riva Gan Giancarlo 231467

%% Dominio
R1 = regions.rect; %Rettangolo Fluido Caldo
R2 = regions.rect; %Rettangolo Fluido Freddo

%% BC
T0hot = 1; %Gradi Celsius
T0cold = 1; %Gradi Celsius

R1.Borders(1).Bc(1) = boundaries.dirichlet(T0hot);
R1.Borders(1).Bc(2) = boundaries.neumann(0);
R1.Borders(1).Bc(3) = boundaries.neumann(0);
R1.Borders(1).Bc(4) = boundaries.neumann(0);
R2.Borders(1).Bc(1) = boundaries.neumann(0);
R2.Borders(1).Bc(2) = boundaries.neumann(0);
R2.Borders(1).Bc(3) = boundaries.neumann(0);
R2.Borders(1).Bc(4) = boundaries.dirichlet(T0cold);

figure()
subplot(1,2,1) %Figure affiancate, posto 1
R1.draw('bc') %Condizioni al bordo
title('Fluido Caldo')
subplot (1,2,2) %Figure affiancate, posto 2
R2.draw('bc') %Condizioni al bordo
title('Fluido Freddo')

%% Proprietà
beta1 = [0.01 0]; %Velocità Fluido Caldo
beta2 = [0 0.001]; %Velocità Fluido Freddo

R1 = R1.addProperty('beta',beta1); %Velocità
R1 = R1.addProperty('lambda',0.026); %Conducibilità termica
R1 = R1.addProperty('rho',0.77); %Densità
R1 = R1.addProperty('c',1035); %Calore Specifico
R1 = R1.addProperty('k',80); %Trasmittanza

R2 = R2.addProperty('beta',beta2); %Velocità
R2 = R2.addProperty('lambda',0.6); %Conducibilità termica
R2 = R2.addProperty('rho',1000); %Densità
R2 = R2.addProperty('c',4186); %Calore Specifico
R2 = R2.addProperty('k',80); %Trasmittanza

%% Mesh
AreaT = 0.0005; %Area triangoli Mesh
Me1 = mesh2D(R1,AreaT);
Me2 = mesh2D(R2,AreaT);

%% Calcolo Peclet
Pe1 = Calcolo_Peclet(Me1);
Pe2 = Calcolo_Peclet(Me2);
8
%% Calcolo Matrici Sistema Lineare
[DC1,Re1,b1] = coupledNeumann_BuildStiff_corretta(Me1);
[DC2,Re2,b2] = coupledNeumann_BuildStiff_corretta(Me2);

%% Risoluzione Sistema Lineare


Atotale=[DC1+Re1 -Re1; -Re2 DC2+Re2];
T0hot = 500; %Gradi Celsius
T0cold = 25; %Gradi Celsius
btotale=[T0hot*b1;T0cold*b2];
uu=Atotale\btotale;
uu1=uu(1:end/2);
uu2=uu(end/2+1:end);
figure;
Me1.draw(uu1);
hold on;
Me2.draw(uu2);

%% Grafici Fluidi
figure()
Me1.draw(uu1)
title('Fluido Caldo')
figure()
Me2.draw(uu2)
title('Fluido Freddo')

%% Calcolo Temperatura uscita Fluidi


Tcold_out = uu2(Me2.Nodes.Y==0.5 & Me2.Nodes.X<=0.5 & Me2.Nodes.X>=-0.5);
Tcold_out_media=mean(Tcold_out);

Thot_out = uu1(Me1.Nodes.X==0.5 & Me1.Nodes.Y<=0.5 & Me1.Nodes.Y>=-0.5);


Thot_media=mean(Thot_out);

figure()
yy1=linspace(-0.5,0.5,20)';
xx1=0.5*ones(20,1);
yy2=0.5*ones(20,1);
xx2=linspace(-0.5,0.5,20)';
z1=Me1.interpolate(uu1,[xx1 yy1]);
z2=Me2.interpolate(uu2,[xx2 yy2]);
subplot(2,1,1)
plot(yy1,[z1],'r-')
axis([-0.5 0.5 24 26])
legend('fluido caldo')
grid on
xlabel('metri')
ylabel('Temperatura')
title('Distribuzione di temperatura sul bordo di uscita fluido caldo')
subplot(2,1,2)
plot(yy1,[z2],'b-')
legend('fluido freddo')
title('Distribuzione di temperatura sul bordo di uscita fluido freddo')
grid on
xlabel('metri')
ylabel('Temperatura')

%% Mesh Convergence
mesh_convergence(R1,R2); %Riferito alla T media del fluido freddo in uscita
mesh_convergence_3_profilo_T_freddo_uscita(R1,R2); %Riferito al profilo del
fluido freddo in uscita

9
%% Precondizionamento
Analisi_precondizionamento(Atotale,btotale,Me1,Me2)

%% Transitorio
% Matrice di massa
M_tot=blkdiag(Re1/80*0.77*1035,Re2/80*1000*4186);
% Transitorio
[Tcold_out,Thot_out] = transitorio(Atotale,M_tot,b1,b2,T0hot,T0cold,Me1,Me2);

Calcolo_Peclet
function[Pe] = calcolo_Peclet(Me)
lati_Mesh = Me.Edges; %Vettore che contiene gli indici dei lati dei triangoli
della mesh

%Per ogni lato calcoliamo la lunghezza con un ciclo for


for i = 1:length(lati_Mesh(:,1))
lunghezza_lati =
norm([diff(Me.Nodes.X(lati_Mesh(i,:))),diff(Me.Nodes.Y(lati_Mesh(i,:)))]);
end

%Definisco
Lato_max = max(lunghezza_lati);
beta = Me.evaluateProperty('beta');
lambda = Me.evaluateProperty('lambda');
rho = Me.evaluateProperty('rho');
c = Me.evaluateProperty('c');
nu = lambda(1)/(rho(1)*c(1)); %Calcolo il coefficiente di diffusione termica su
un triangolo generico poiché le proprietà sono uniformi

%Calcolo il numero di Peclet


Pe = norm(beta(1,:))*Lato_max/(2*nu); %Valuto la norma della velocità

end

CoupledNeumann_Buildstiff_corretta
function [DC,R,b] = coupledNeumann_BuildStiff_corretta(Me)
%coupledNeumann_BuildStiff builds the stiffness matrices for a diffusion-
reaction problem
%The corresponding linear system will return the solution for ALL the
%nodes, not only the unknown ones.
%Input:
% Me : mesh2d object
%shape properties:
% c, a
%Output:
% DC :stiffness matrix - diffusion+convection terms
% R :stiffness matrix - reaction terms
% b :constant terms vector
%
%Copyright 2014 Paolo Bardella

%For clarity, I call some variables with shorter names


V=Me.Triangles.Vertices;
Dof=Me.Nodes.Dof;
Nodes=Me.Nodes;
Areas=Me.Triangles.Areas;
%Total number of nodes

10
NumTotalNodes = length(Dof);

%vectors preallocation: instead of allocating the (sparse) diffusion matrix,


%we save the rows, columns and values corresponding to each contribution;
%at the end, we'll call sparse(...) to obtain the diffusion matrix
NumDirichletNodes=size(Me.BC.DirichletNodes,1);
row=zeros(Me.MatrixContributions+NumDirichletNodes,1);
col=zeros(Me.MatrixContributions+NumDirichletNodes,1);
r = zeros(Me.MatrixContributions+NumDirichletNodes,1);
d = zeros(Me.MatrixContributions+NumDirichletNodes,1);
b = zeros(NumTotalNodes,1);
pos=1; %we start from the element in position 1, we'll increase this index
%everytime we add an entry

%evaluate the value of the coefficient in front of the Laplace operator


lambda = Me.evaluateProperty('lambda');
%evaluate the value of the couling coefficient
rho = Me.evaluateProperty('rho');
beta = Me.evaluateProperty('beta');
c = Me.evaluateProperty('c');
k = Me.evaluateProperty('k');
%main loop on each triangle
for e=1:size(V,1)
Dx(1) = Nodes.X(V(e,3)) - Nodes.X(V(e,2));
Dx(2) = Nodes.X(V(e,1)) - Nodes.X(V(e,3));
Dx(3) = Nodes.X(V(e,2)) - Nodes.X(V(e,1));
Dy(1) = Nodes.Y(V(e,3)) - Nodes.Y(V(e,2));
Dy(2) = Nodes.Y(V(e,1)) - Nodes.Y(V(e,3));
Dy(3) = Nodes.Y(V(e,2)) - Nodes.Y(V(e,1));

%for each vertex of this triangle


for ni=1:3
%look at the "unknown" numbering: if the node is positive, it
%corresponds to a degree of freedom of the problem
ii = V(e,ni);
%is it unknown?
if Dof(ii) > 0
%yes it is! second loop on the vertices
for nj=1:3
jj = V(e,nj);
dtmp = lambda(e)*(Dy(ni)*Dy(nj)+Dx(ni)*Dx(nj))/(4.0*Areas(e))...
%Aggiungo la convezione
+ rho(e)*c(e)*(-beta(e,1)*Dy(nj)+beta(e,2)*Dx(nj))*1/6;
rtmp=k(e)*Areas(e)*(1+(ni==nj))/12;
%%is it unknown as well?
if Dof(jj) > 0
row(pos)=ii;
col(pos)=jj;
d(pos)=dtmp;
r(pos)=rtmp;
pos=pos+1;
else
b(ii)=b(ii)-(dtmp+rtmp)*Me.BC.DirichletNodes(-Dof(jj),2);
end

end
end
end
end
11
%Contributions from Dirichlet nodes: 1s on the main diagonal of D or R (here I
choose D)
for k=1:NumDirichletNodes
ii=Me.BC.DirichletNodes(k,1);
row(pos)=ii;
col(pos)=ii;
d(pos)=1;
r(pos)=0;
pos=pos+1;
b(ii)=Me.BC.DirichletNodes(k,2);
end

%assemble the stiffness matrix DC and the reaction matrix R


DC=sparse(row, col, d, NumTotalNodes,NumTotalNodes);
R=sparse(row, col, r, NumTotalNodes,NumTotalNodes);

Mesh_Convergence
function [] = mesh_convergence(region1,region2)
Area_max_triangolo_mesh = [logspace(-6,-5,10), logspace(-5,-1,10),
linspace(0.2,10,5)]; %Vettore contenente aree massime per ogni mesh
T_uscita = zeros(length(Area_max_triangolo_mesh),1);
T0hot = 500;
T0cold = 25;
for zz = 1:length(Area_max_triangolo_mesh)

Me1 = mesh2D(region1,Area_max_triangolo_mesh(zz));
Me2 = mesh2D(region2,Area_max_triangolo_mesh(zz));

%Matrici del sistema lineare


[DC1,Re1,b1]=coupledNeumann_BuildStiff_corretta(Me1);
[DC2,Re2,b2]=coupledNeumann_BuildStiff_corretta(Me2);

%% Metodo Diretto
A=[DC1+Re1 -Re1; -Re2 DC2+Re2];
b=[b1*T0hot;b2*T0cold];
T1_T2=A\b;
T2 = T1_T2(end/2+1:end);
T_uscita(zz) = mean(T2(Me1.Nodes.Y == 0.5));

end
figure()
semilogx(Area_max_triangolo_mesh,T_uscita,'r-*'); %Metto in evidenza punti e
retta
title('Mesh convergence')
xlabel('Area massima del triangolo della mesh');
ylabel('T uscita');
grid on
end

Mesh_Convergence_3_profilo_T_freddo_uscita
function mesh_convergence_3_profilo_T_freddo_uscita(region1,region2)
Area_max_triangolo_mesh = [logspace(-4,-3,2),logspace(-2,-1,2),
linspace(0.2,10,2)]; %Vettore contenente aree massime per ogni mesh
T_uscita = zeros(length(Area_max_triangolo_mesh),1);
12
T0hot = 500;
T0cold = 25;
f1 = figure(); %Figura in cui considero i vari profili di temperatura
f2=figure(); % aree triangoli - aree sottese dal profilo
iterazione = 0;

for zz = 1:length(Area_max_triangolo_mesh)
Area_max_triangolo_mesh(zz);
iterazione=iterazione+1;
Me1 = mesh2D(region1,Area_max_triangolo_mesh(zz));
Me2 = mesh2D(region2,Area_max_triangolo_mesh(zz));

% Matrici del sistema lineare


[DC1,Re1,b1]=coupledNeumann_BuildStiff_corretta(Me1);
% Matrici del sistema lineare
[DC2,Re2,b2]=coupledNeumann_BuildStiff_corretta(Me2);

%% Metodo Diretto
A=[DC1+Re1 -Re1; -Re2 DC2+Re2];
b=[b1*T0hot;b2*T0cold];
T1_T2=A\b;
T2 = T1_T2(end/2+1:end);
T_uscita(zz) = mean(T2(Me1.Nodes.Y == 0.5));

% Evidenzio il profilo di temperatura in uscita attraverso il metodo


dell'interporlazione
figure(f1)
NN=20;
ptx=linspace(-0.5,0.5,NN).';
pty=0.5*ones(NN,1);
z=Me2.interpolate(T2,[ptx,pty]);
hold on
plot(ptx,z,'.-','linewidth',2,'MarkerSize',25);
title('Distribuzione di temperatura all uscita Fluido Freddo')
grid on
xlabel('metri')
ylabel('Temperatura')
legendInfo{zz} = ['Area_T = ' num2str(Area_max_triangolo_mesh(zz))];
legend(legendInfo)

profili_T(1:length(z),zz)=z;
[numero_elementi, colonne]=size(profili_T);
area_sottesa_profilo_T(1,zz)=trapz(z)/(numero_elementi-1); % integro con metodo
trapezi
zz
end
size(Area_max_triangolo_mesh)
size(area_sottesa_profilo_T)

figure(f2);
hold on
plot(log10(Area_max_triangolo_mesh),
area_sottesa_profilo_T/max(area_sottesa_profilo_T),'r*-')
grid on
title('Convergenza area al crescere del grado di dettaglio della mesh')
xlabel('Area triangoli_{log10}')
legend('Area sottesa dal profilo di T in uscita del fluido
freddo','position','best')

figure()
semilogx(Area_max_triangolo_mesh,T_uscita,'.-');
13
title('Mesh convergence')
xlabel('Area massimo del triangolo della mesh [m^2]');
ylabel('T_{acqua} uscita [K]');
grid on
print(f1, 'convergenza_mesh_profilo_T_freddo','-dpng')

end

Analisi_Precondizionamento
function [] = Analisi_precondizionamento(A,b,Me1,Me2)

% Convergenza di bicg per una matrice anti-simmetrica definita positiva con


% precondizionamento dato dalla fattorizzazione L-U incompleta: studio del
% numero di iterazioni al variare di droptol. Simile a quello mostrato a
% lezione

droptols = 10.^(-1:-1:-8); %voglio studiare a tolleranza variabile per


precondizionatore
opts.type='ilutp';
%preallocazione della memoria
time_ilu = zeros(size(droptols)); %tempo di calcolo del precondizionatore
time_bicg = zeros(size(droptols)); %tempo di calcolo della soluzione

for k = 1:length(droptols)
opts.droptol=droptols(k); %fisso la tolleranza per il calcolo del
precondizionatore
tic
[L,U]=ilu(A,opts); %calcolo i precondizionatori
time_ilu(k) = toc; % salvo il tempo che ci ha messo a calcolare
tic
tol = 1e-6; % tolleranza per il calcolo della soluzione
[~,flag,relres,iter]=bicg(A,b,tol,1000,L,U);
time_bicg(k) = toc; %salvo il tempo che bicg ha impiegato a darmi la soluzione
if flag
warning(['bicg non e` arrivata a convergenza per tol = ',num2str(tol)]);
end
iterazioni(k) = iter; %si è usato per controllare il funzionamento
%corretto del bicg
end

%% Grafico
figure() %diagrammo i tempi di risoluzione parziali e totali
loglog(droptols,time_ilu,droptols,time_bicg,droptols,time_ilu+time_bicg);
legend('time_{ilu}','time_{bicg}','time_{tot}');
xlabel('Tolleranze');
ylabel('Tempo [s]')
grid on
title('Tempo di risoluzione del sistema')

Transitorio
function [Tcold_out,Thot_out] =
transitorio(Atotale,M_tot,b1,b2,T0hot,T0cold,Me1,Me2)
tempo_finale_transitorio=30; % secondi - quello a cui arrivo a regime
dt=0.5;
nn=60;

14
% Definisco il vettore tempo
tempo=linspace(0,tempo_finale_transitorio,ceil(tempo_finale_transitorio/dt)+1);

% Definisco le leggi evolutive dei fluidi (bordo di Dirichlet)


T_caldo=@(t) T0hot+50*(1-exp(-t/(5.11)));
T_freddo=@(t) T0cold+25*(1-exp(-t/6));

% Soluzione tempo t = 0 -> la inizializzo io


T1_T2 = [T0hot*ones(length(b1),1); T0cold*ones(length(b2),1)];
T1_t0=T1_T2(1:end/2);
T2_t0=T1_T2(end/2+1:end);
% pre allocazione dei vettori che descrivono il valore medio
% della temperatura sul bordo in uscita del dominio per ogni
% fluido.
T_medio_uscita_1=zeros(length(tempo),1); % 1 = caldo
T_medio_uscita_2=zeros(length(tempo),1); % 2 = freddo
%inizializzo il valore al tempo iniziale t=0 [s]
posizione_t0=1; % t=0 secondi: ho la soluzione dello stazionario
T_medio_uscita_1(posizione_t0)= mean(T1_t0(Me1.Nodes.X == 0.5));
T_medio_uscita_2(posizione_t0)= mean(T2_t0(Me2.Nodes.Y == 0.5));

tracciatemp=figure();

for k=1:nn
% Traccia delle T calcolate
TTcaldo(k,1)=T_caldo(k*dt);
TTfreddo(k,1)=T_freddo(k*dt);

% Grafico temperature medie in ingresso


figure(tracciatemp)
subplot(2,1,1)
plot([1:k],TTfreddo,'b-','linewidth',2)
title('Media T fluido freddo in ingresso')
grid on
xlabel('tempo [ s ] ')
ylabel('Temperatura [ °C ]')

subplot(2,1,2)
plot([1:k],TTcaldo,'r-','linewidth',2)
title('Media T fluido caldo in ingresso')
grid on
xlabel('tempo [ s ] ')
ylabel('Temperatura [ °C ]')
print(tracciatemp,'z1','-dpng')
%% modifica : assegno al termine noto le T di dirichlet nel tempo

b1_ev =b1*TTcaldo(k,1);
b2_ev =b2*TTfreddo(k,1);

% combino i termini noti


b = [b1_ev;b2_ev];

% Metodo risolutivo: Eulero implicito


% Risolviamo C*soluzione=M_tot*soluzione+dt*termine_noto
C=M_tot+dt*Atotale;
b_noto = M_tot * T1_T2 + dt * b;
% Risolviamo e troviamo la soluzione per il tempo k*dt all'iterazione k
T1_T2 = C\b_noto;
15
T1 = T1_T2(1:end/2); % Soluzione T caldo
T2 = T1_T2(end/2+1:end); % Soluzione T freddo

T_medio_uscita_1(k+1)= mean(T1(Me1.Nodes.X == 0.5));


T_medio_uscita_2(k+1)= mean(T2(Me2.Nodes.Y == 0.5));

grid on

% Plotto le soluzioni (f(x,y))


soluzione=figure;
figure(soluzione)
Me1.draw(T1);
hold on
Me2.draw(T2);
hold off
axis([-0.5 0.5 -0.5 0.5 0 600])
title(['t = ',num2str(dt*k),' [ s ]'])
pause(0.1)
if (k==1||k==20||k==40||k==60)
print(soluzione,['transitorio',num2str(k)],'-dpng')
end
if (k*dt)<30
close(soluzione)
end
%% Calcolo Temperatura media uscita Fluido Freddo
Tcold_out(k,1) =mean( T2(Me2.Nodes.Y==0.5 & Me2.Nodes.X<=0.5 & Me2.Nodes.X>=-
0.5));
Thot_out(k,1) =mean( T2(Me1.Nodes.X==0.5 & Me1.Nodes.Y<=0.5 & Me1.Nodes.Y>=-
0.5));

end % fine ciclo for su k


% Grafico temperature medie in uscita
traccia2=figure;
figure(traccia2)
subplot(2,1,1)
plot([1:tempo_finale_transitorio/dt],Tcold_out,'b-','linewidth',2)
title('Media T fluido freddo in uscita')
grid on
xlabel('tempo [ s ] ')
ylabel('Temperatura [ °C ]')

subplot(2,1,2)
plot([1:tempo_finale_transitorio/dt],Thot_out,'r-','linewidth',2)
title('Media T fluido caldo in uscita')
grid on
xlabel('tempo [ s ] ')
ylabel('Temperatura [ °C ]')
print(traccia2,'z2','-dpng')
end % fine della funzione

16