• Non ci sono risultati.

LISTATI DEI PRINCIPALI PROGRAMMI MATLAB

N/A
N/A
Protected

Academic year: 2021

Condividi "LISTATI DEI PRINCIPALI PROGRAMMI MATLAB"

Copied!
20
0
0

Testo completo

(1)

LISTATI DEI PRINCIPALI PROGRAMMI MATLAB

C.1 Introduzione

In questa appendice sono riportati i listati dei principali programmi Matlab

®

utilizzati nel corso della tesi.

C.2 La routine

approx_diffuser.m

Questo programma, implementato come m-file di Matlab

®

risolve, in modo

approssimato, il flusso supersonico, non viscoso e assialsimmetrico all’interno di

un diffusore conico convergente-divergente. La teoria alla base del calcolo è

esposta nei paragrafi 4.3 e 4.4

clear all close all clc global g

% Costanti fisiche:

g=1.4; % rapporto dei calori specifici

R=288; % [J/kg/K] costante dei gas per l'aria

% Parametri flusso in ingresso:

tot_pres_in=0.6e+6; % [Pa] Pressione totale

tot_temp_in=1650; % [K] Temperatura totale

R_in=0.04; % [m] Raggio

A_in=pi*R_in^2; % [m^2] Area sezione

M1=7; % Numero di Mach

pres_in=tot_pres_in/(1+0.5*(g-1)*M^2)^(g/(g-1)); % [Pa] Pressione

temp_in=tot_temp_in/(1+0.5*(g-1)*M^2); % [K] Temperatura

dens_in=pres_in/R/temp_in; % [kg/m^3] Densità

m_in=dens_in*A_in*M1*sqrt(temp_in*g*R); % [kg/s] Portata

(2)

theta=9*pi/180; % [rad] Angolo di semiapertura del convergente

theta_div=3*pi/180; % [rad] Angolo di semiapertura del divergente

M_exit=0.1; % Mach in uscita dal diffusore

k=2; % numero di riflessioni dell'urto alla parete

f=1.05; % rapporto tra il Mach dell'urto normale e quello nella gola

% Inizializzazioni parametri dipendenti:

L_R1=0; R_rat=1; dens_rat=1; tot_pres_rat=1; pres_rat=1; temp_rat=1; rad(1)=1;

% Ciclo di calcolo del convergente:

for i=1:k conv_seg=axsym_conv(M1,theta); L_R1=L_R1+conv_seg(2)*rad(i); rad(i+1)=rad(i)*conv_seg(3); R_rat=R_rat*conv_seg(3); dens_rat=dens_rat*conv_seg(4); tot_pres_rat=tot_pres_rat*conv_seg(6); pres_rat=pres_rat*conv_seg(5); temp_rat=temp_rat*conv_seg(7); M1=conv_seg(1); end

% Valori dei parametri del flusso nella gola:

M_throat=M1; dens_throat=dens_rat*dens_in; pres_throat=pres_rat*pres_in; tot_pres_throat=tot_pres_rat*tot_pres_in; R_throat=R_rat*R_in; A_throat=pi*R_throat^2; L_conv=L_R1*R_in; temp_throat=temp_rat*temp_in;

% Visualizzazione dei risultati:

disp('---')

fprintf('Dati relativi a un diffusore con k=%.0f e theta=%.0f... deg\n',k,theta*180/pi)

disp('---') fprintf('Numero di Mach nella gola: %-.2f\n',M_throat) fprintf('Pressione nella gola [Pa]: %-.2f\n',pres_throat) fprintf('Densità nella gola [kg/m^3]: %-.3f\n',dens_throat) fprintf('Temperatura nella gola [K]: %-.2f\n',temp_throat) fprintf('Pressione totale nella gola [Pa]: %-.2f\n',tot_pres_throat) fprintf('Raggio di gola [m]: %-.2e\n',R_throat)

fprintf('Sezione di gola [m^2]: %-.2e\n',A_throat) fprintf('Lunghezza del tratto convergente [m]: %-.2f\n',L_conv)

(3)

% Calcolo del tratto divergente:

M_shock=f*M_throat;

div=axsym_div(M_throat,M_shock,M_exit,g);

% Valori dei parametri del flusso all'uscita:

A_exit=A_throat*div(1); R_exit=sqrt(A_exit/pi); L_div=(R_exit-R_throat)/tan(theta_div); dens_exit=div(2)*dens_throat; pres_exit=div(3)*pres_throat; temp_exit=div(5)*temp_throat; tot_pres_rat=div(4)*tot_pres_throat;

% Visualizzazione dei risultati:

fprintf('Numero di Mach dell''urto normale : %-.2f\n',M_shock) fprintf('Numero di Mach all''uscita : %-.2f\n',M_exit) fprintf('Pressione all''uscita [Pa]: %-.2f\n',pres_exit) fprintf('Densità all''uscita [kg/m^3]: %-.3f\n',dens_exit) fprintf('Temperatura all''uscita [K]: %-.2f\n',temp_exit) fprintf('Pressione totale all''uscita [Pa]: %-.2f\n',tot_pres_rat) fprintf('Area di uscita del divergente [m^2]: %-.2e\n',A_exit) fprintf('Raggio di uscita del divergente [m]: %-.2e\n',R_exit) fprintf('Lunghezza del divergente [m]: %-.2f\n',L_div) disp('---') disp(' ')

La routine approx_diffuser si avvale di due funzioni:

axsym_conv che risolve la zona di flusso compresa tra due urti come descritto

nel paragrafo 4.4,

axsym_div che risolve il tratto divergente in base alla classica teoria

unidimensionale isoentropica.

C.2.1 La function axsym_conv

Di seguito viene riportato il listato della funzione axsym_conv, essa richiede,

nell’ordine, i seguenti parametri in input:

• numero di Mach in ingresso,

• angolo di semiapertura del cono,

e fornisce i seguenti valori in output:

• numero di Mach in uscita,

(4)

• lunghezza e raggio finale del tratto di condotto adimensionalizzati con il raggio

iniziale.

• densità, pressione, pressione totale e temperatura finali del gas

adimensionalizzate con i rispettivi valori iniziali.

function v=axsym_conv(M1,theta) global g

% M1 è il numero di Mach in ingresso

flag=0; cont=0; null=0;

res1=obli_shock(M1,theta);

M2=res1(1); % M2 è il numero di Mach in uscita dal primo urto

beta1=res1(7);

beta1=beta1(1); % Angolo di inclinazione del primo urto

if ~isnan(beta1)

M3=M2; % M3 è il numero di Mach in ingresso del secondo urto

while flag==0 cont=cont+1;

res2=obli_shock(M3,theta); beta2=res2(7);

beta2=beta2(1); % Angolo di inclinazione del secondo urto

if isnan(beta2) flag=1; null=1; else

M4=res2(1); % M4 è il numero di Mach in uscita dal secondo

urto

% Risoluzione delle relazioni geometriche

A=[tan(theta),1;1,-cot(beta2-theta)]; B=[1,cot(beta1)]; x=inv(A)*B'; res3=isentropic_flow2(M2,x(2)); if max(isnan(res3))==1 null=1; end

% Verifica della condizione di uscita

if abs(M3-res3(1))<0.001 flag=1; else M3=res3(1); end if cont>10 flag=1;

(5)

disp('convergenza non raggiunta nel ciclo interno') end end end else null=1; end if null==1 tot_pres_rat=NaN; pres_rat=NaN; dens_rat=NaN; temp_rat=NaN; M4=NaN; R_rat=NaN; L_R=NaN; else pres_rat=res2(2)*res1(2)*res3(2); tot_pres_rat=res2(5)*res1(5); dens_rat=res2(4)*res1(4)*res3(4); temp_rat=res2(3)*res1(3)*res3(3); L_R=x(1); R_rat=x(2); end

% Vettore dei risultati

v=[M4,L_R,R_rat,dens_rat,pres_rat,tot_pres_rat,temp_rat];

Nel listato della funzione axsym_conv vengono chiamate le ulteriori funzioni:

obli_shock e isentropic_flow2. Queste due funzioni non fanno altro che

implementare le relazioni dell’urto obliquo e del flusso isoentropico

unidimensionale e pertanto non vengono riportate.

C.2.2 La function axsym_div

Di seguito viene riportato il listato della funzione axsym_div, essa richiede,

nell’ordine, i seguenti parametri in input:

• numero di Mach nella gola,

• numero di Mach dell’urto normale,

• numero di Mach in uscita,

e fornisce i seguenti valori in output:

• rapporto delle aree del divergente,

• densità, pressione, pressione totale e temperatura del gas all’uscita

adimensionalizzate con i rispettivi valori nella gola.

(6)

function v=axsym_div(Mt,Mshock,Me) global g

error=0;

% Verifica sulla coerenza dei dati inseriti

if Mshock<Mt v=NaN;

disp('errore nell''inserimento dei dati') error=1;

end if Me>1 v=NaN;

disp('errore nell''inserimento dei dati') error=1;

end

if error==0

% Flusso isoentropico compreso tra la gola e l'urto normale

res1=isentropic_flow(Mt,Mshock);

% Urto normale

res2=norm_shock(Mshock);

% Flusso isoentropico compreso tra l'urto normale e l'uscita

res3=isentropic_flow(res2(1),Me); pres_rat=res1(2)*res2(3)*res3(2); dens_rat=res1(4)*res2(5)*res3(4); temp_rat=res1(3)*res2(4)*res3(3); tot_pres_rat=res2(6); area_rat=res1(1)*res3(1); v=[area_rat,dens_rat,pres_rat,tot_pres_rat,temp_rat]; end

Per le funzioni norm_shock e isentropic_flow vale quanto detto per obli_shock e

isentropic_flow2 nel paragrafo precedente.

(7)

C.3 La function

flow1D

La funzione flow1D implementa il modello unidimensionale di Appendice A. I

parametri richiesti in ingresso sono, nell’ordine:

• il numero di Mach all’uscita del tratto di condotto conico considerato,

• il numero di Mach all’ingresso del tratto di condotto conico considerato,

• l’angolo (espresso in gradi) di semiapertura del condotto conico considerato,

• il coefficiente di attrito medio sul tratto di condotto conico considerato,

• il numero di Stanton medio sul tratto di condotto conico considerato,

• il rapporto (supposto costante) tra la temperatura alla parete e la temperatura

totale del flusso sul tratto di condotto conico considerato.

La funzione fornisce, in uscita, una variabile struttura di Matlab

®

con i

seguenti campi:

• rapporto tra la velocità di uscita e quella di ingresso,

• rapporto tra la pressione di uscita e quella di ingresso,

• rapporto tra la densità di uscita e di quella ingresso,

• rapporto tra la temperatura di uscita e quella di ingresso,

• rapporto tra la temperatura totale di uscita e quella di ingresso,

• rapporto tra la pressione totale di uscita e quella di ingresso,

• rapporto tra l’area di uscita e quella di ingresso,

function ratio=flow1D(M2,M1,theta,Cf,Ch,Tw_T0) g=1.4; R=288; dD_dx=2*tan(deg2rad(theta)); Kf=Cf; Kh=-Ch*(1-Tw_T0); % Denominatore m=2; n=g-1; p=Kh-dD_dx; q=(Kh+Kf)*g; % Numeratore a=[0,-g*(g-1)*(Kh+Kf),0,-g*(g-1)*(Kh+Kf),0,0]; b=[(g-1)*Kh+g*Kf,(g-1)*dD_dx-(g+1)*Kh,-((g-1)*Kh+g*Kf-dD_dx),g*(dD_dx-2*Kh-Kf),... -dD_dx,-1]; c=[2*Kh-dD_dx,2*Kh,-2*Kh,0,dD_dx,1]; u2_u1=fun_1D(M2,M1,n,m,p,q,a(1),b(1),c(1));

(8)

T2_T1=fun_1D(M2,M1,n,m,p,q,a(2),b(2),c(2)); ro2_ro1=fun_1D(M2,M1,n,m,p,q,a(3),b(3),c(3)); p2_p1=fun_1D(M2,M1,n,m,p,q,a(4),b(4),c(4)); A2_A1=fun_1D(M2,M1,n,m,p,q,a(5),b(5),c(5)); p02_p01=p2_p1.*((1+0.5*(g-1)*M2.^2)/(1+0.5*(g-1)*M1^2)).^(g/(g-1)); T02_T01=T2_T1.*((1+0.5*(g-1)*M2.^2)/(1+0.5*(g-1)*M1^2)); n=length(M2); ratio=struct('V',mat2cell(u2_u1,1,ones(1,n)),... 'P',mat2cell(p2_p1,1,ones(1,n)),... 'D',mat2cell(ro2_ro1,1,ones(1,n)),... 'T',mat2cell(T2_T1,1,ones(1,n)),... 'P0',mat2cell(p02_p01,1,ones(1,n)),... 'T0',mat2cell(T02_T01,1,ones(1,n)),... 'A',mat2cell(A2_A1,1,ones(1,n))); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function Xrat=fun_1D(M2,M1,n,m,p,q,a,b,c) K1=c/(m*p); K2=(-m*a+n*b-n^2*c/m)/(n*p-m*q); K3=(p*a-q*b+q^2*c/p)/(n*p-m*q); if q~=0 Xrat=(M2.^2/M1^2).^K1.*((m+n*M2.^2)/(m+n*M1^2)).^(K2/n).*((p+q*M2.^2)/(p+q*M1^2)).^(K3/ q); else Xrat=(M2.^2/M1^2).^K1.*((m+n*M2.^2)/(m+n*M1^2)).^(K2/n); end Xrat(find(imag(Xrat)))=NaN; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

La funzione flow1D si avvale della sottofunzione fun_1D che implementa la

relazione (A.10) di Appendice A.

C.4 La function

cooled_diffuser

La funzione cooled_diffuser implementa il calcolo del diffusore raffreddato

mediante avvolgimento elicoidale in base al modello descritto nel paragrafo 6.4. I

parametri di input alla funzione sono forniti mediante un apposito m-file

denominato data, un esempio di tale file è riportato nel paragrafo C.7.

Le variabili di output prodotte dalla funzione sono:

• tre strutture relative a tratto divergente, convergente e gola (

div,conv,gola

),

che riportano i valori di: numero di Mach, temperatura statica e totale,

(9)

pressione statica e totale, densità e velocità per ogni elemento che compone il

tratto considerato,

• la temperatura del fluido refrigerante (

Tw

) su ogni spira dell’avvolgimento

elicoidale

1

,

• la temperatura delle pareti solide (

Twall

),

• una struttura che riporta la potenza termica scambiata nei tratti: convergente,

divergente e gola (

Q

).

• una struttura che riporta la resistenza idraulica dell’avvolgimento elicoidale

nei tratti: convergente, divergente e gola (

Rh

).

function [div,gola,conv,Tw,Twall,Q,Rh]=cooled_diffuser() data

% valore di primo tentativo per Tw_T0

Tw_T0.conv=Tw_T01; Tw_T0.gola=Tw_T01*ones(1,Ng); Tw_T0.div=Tw_T01*ones(1,Nd); esc=0; cont=0; while (esc==0)&(cont<10) cont=cont+1;

% CICLO DI CALCOLO DEL TRATTO CONVERGENTE

% Soluzione del tratto convergente mediante relazioni empiriche % determinate numericamente. M_th=0.0473-1.33*Tw_T0.conv+0.0355*theta_conv+6.8054*Dth_Din; p0rat=0.158-0.195*Tw_T0.conv-35.83*theta_conv^(-4.17)+0.17*Dth_Din; T0rat=0.8767+0.0824*Tw_T0.conv+0.0063*theta_conv-0.784e-3*Dth_Din^(-3); T0med.conv=T0inf*(1+T0rat)/2; Q.conv=m_gas*Cp*T0inf*(1-T0rat); conv=struct('V',M_th*sqrt(g*R*(T0inf*T0rat/(1+0.5*(g-1)*M_th^2)))... ,'P',p0inf*p0rat/(1+0.5*(g-1)*M_th^2)^(g/(g-1))... ,'D',p0inf/R/T0inf*p0rat/T0rat/(1+0.5*(g-1)*M_th^2)^(1/(g-1))... ,'T',T0inf*T0rat/(1+0.5*(g-1)*M_th^2)... ,'P0',p0inf*p0rat... ,'T0',T0inf*T0rat... ,'M',M_th); x=L_conv;

% CICLO DI CALCOLO DELLA GOLA DEL DIFFUSORE

% Parametri iniziali del gas

gola.M(1)=conv.M; gola.T0(1)=conv.T0; gola.P0(1)=conv.P0;

(10)

gola.T(1)=conv.T; gola.P(1)=conv.P;

gola.D(1)=conv.D; gola.V(1)=conv.V;

% Soluzione del flusso unidimensionale per ogni tratto

for i=1:Ng x=x+i/2*tubo.Dout; % predittore mi=Sutherland(gola.T(i)); Re_x=gola.D(i)*gola.V(i)*x/mi; w=vis_exp(gola.T(i)-50,gola.T(i)+50); [Cf Ch]=van_driest_mod(gola.M(i),Re_x,Tw_T0.gola(i),w); M2=get_Mach2_g(gola.M(i),Cf,Ch,Tw_T0.gola(i),tubo.Dout/Dth); flow=flow1D(M2,gola.M(i),0,Cf,Ch,Tw_T0.gola(i)); % valori medi D_med=gola.D(i)*(flow.D+1)/2; V_med=gola.V(i)*(flow.V+1)/2; T_med=gola.T(i)*(flow.T+1)/2; M_med=(gola.M(i)+M2)/2; % correttore mi_med=Sutherland(T_med); Re_x=D_med*V_med*x/mi_med; w=vis_exp(T_med-50,T_med+50); [Cf,Ch]=van_driest_mod(M_med,Re_x,Tw_T0.gola(i),w); M2=get_Mach2_g(gola.M(i),Cf,Ch,Tw_T0.gola(i),tubo.Dout/Dth); flow=flow1D(M2,gola.M(i),0,Cf,Ch,Tw_T0.gola(i)); % nuovi valori gola.M(i+1)=M2; gola.T(i+1)=gola.T(i)*flow.T; gola.D(i+1)=gola.D(i)*flow.D; gola.V(i+1)=gola.V(i)*flow.V; gola.P(i+1)=gola.P(i)*flow.P; gola.P0(i+1)=gola.P0(i)*flow.P0; gola.T0(i+1)=gola.T0(i)*flow.T0; end T0med.gola=(gola.T0(1:end-1)+gola.T0(2:end))/2;

% potenza termica scambiata in ogni tratto

Q.gola=m_gas*Cp*(gola.T0(1:end-1)-gola.T0(2:end));

% CICLO DI CALCOLO DEL TRATTO DIVERGENTE

% Numero di Mach al quale avviene l'urto normale.

M_sh=fatt*gola.M(end);

M_sh2=norm_shock(M_sh,'M')*M_sh;

(11)

div.P(1)=gola.P(end); div.T(1)=gola.T(end); div.D(1)=gola.D(end); div.V(1)=gola.V(end); div.P0(1)=gola.P0(end); div.T0(1)=gola.T0(end); supersonic=1;

% Soluzione del flusso unidimensionale per ogni tratto

for i=1:Nd x=x+i/2*tubo.Dout; % predittore mi=Sutherland(div.T(i)); Re_x=div.D(i)*div.V(i)*x/mi; w=vis_exp(div.T(i)-50,div.T(i)+50); [Cf Ch]=van_driest_mod(div.M(i),Re_x,Tw_T0.div(i),w); M2=get_Mach2_d(div.M(i),theta_div,Cf,Ch,Tw_T0.div(i),... (D.div(i+1)/D.div(i))^2); flow=flow1D(M2,div.M(i),theta_div,Cf,Ch,Tw_T0.div(i)); % valori medi D_med=div.D(i)*(flow.D+1)/2; V_med=div.V(i)*(flow.V+1)/2; T_med=div.T(i)*(flow.T+1)/2; M_med=(div.M(i)+M2)/2; % correttore mi_med=Sutherland(T_med); Re_x=D_med*V_med*x/mi_med; w=vis_exp(T_med-50,T_med+50); [Cf,Ch]=van_driest_mod(M_med,Re_x,Tw_T0.div(i),w); M2=get_Mach2_d(div.M(i),theta_div,Cf,Ch,Tw_T0.div(i),... (D.div(i+1)/D.div(i))^2); flow=flow1D(M2,div.M(i),theta_div,Cf,Ch,Tw_T0.div(i)); % nuovi valori if (supersonic==1)&(M2>M_sh) urto_n=norm_shock(M_sh); flow1=flow1D(M_sh,div.M(i),theta_div,Cf,Ch,Tw_T0.div(i)); M2=get_Mach2_d(M_sh*urto_n.M,theta_div,Cf,Ch,Tw_T0.div(i),... (D.div(i+1)/D.div(i))^2); flow2=flow1D(M2,M_sh*urto_n.M,theta_div,Cf,Ch,Tw_T0.div(i)); div.M(i+1)=M2; div.T(i+1)=div.T(i)*flow1.T*urto_n.T*flow2.T; div.D(i+1)=div.D(i)*flow1.D*urto_n.D*flow2.D; div.V(i+1)=div.V(i)*flow1.V*urto_n.V*flow2.V; div.P(i+1)=div.P(i)*flow1.P*urto_n.P*flow2.P; div.P0(i+1)=div.P0(i)*flow1.P0*urto_n.P0*flow2.P0; div.T0(i+1)=div.T0(i)*flow1.T0*flow2.T0; supersonic=0; else div.M(i+1)=M2; div.T(i+1)=div.T(i)*flow.T; div.D(i+1)=div.D(i)*flow.D; div.V(i+1)=div.V(i)*flow.V; div.P(i+1)=div.P(i)*flow.P;

(12)

div.P0(i+1)=div.P0(i)*flow.P0; div.T0(i+1)=div.T0(i)*flow.T0; end end T0med.div=(div.T0(1:end-1)+div.T0(2:end))/2;

% potenza termica scambiata in ogni tratto

Q.div=m_gas*Cp*(div.T0(1:end-1)-div.T0(2:end)); [newTw_T0,Tw,Twall,Rh]=heli_coil(Q,T0med,m_wat); scarto1=abs(max((newTw_T0.conv-Tw_T0.conv)./Tw_T0.conv)); scarto2=abs(max((newTw_T0.gola-Tw_T0.gola)./Tw_T0.gola)); scarto3=abs(max((newTw_T0.div-Tw_T0.div)./Tw_T0.div)); scarto=max([scarto1,scarto2,scarto3]); if scarto<0.01 esc=1; else Tw_T0=newTw_T0; end end Qtot=Q.conv+sum(Q.gola)+sum(Q.div); Rh_tot=Rh.conv+Rh.gola+Rh.div; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function M2=get_Mach2_d(M1,theta,Cf,Ch,Tw_T0,A2_A1) if M1>1 mach=linspace(M1+0.3,M1,1000); flow=flow1D(mach,M1,theta,Cf,Ch,Tw_T0); M2=interp1([flow.A],mach,A2_A1); else mach=linspace(M1-0.1,M1,1000); flow=flow1D(mach,M1,theta,Cf,Ch,Tw_T0); M2=interp1([flow.A],mach,A2_A1); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function M2=get_Mach2_g(M1,Cf,Ch,Tw_T0,L_D) mach=linspace(M1-0.2,M1,600); flow=flow1D(mach,M1,0,Cf,Ch,Tw_T0); M2=interp1([flow.L_D],mach,L_D);

(13)

function [Cf,Ch]=van_driest_mod(M,Re_x,Tw_T0,w) g=1.4; Tw_T=Tw_T0*(1+(g-1)/2*M^2); A2=1/Tw_T0-1/Tw_T; B=1/Tw_T0-1; if A2==0 a=0.242; b=0.41+log10(Re_x); Cf=(fzero([num2str(b),'*x+2*log(x)/log(10)*x-',num2str(a)],0.07))^2; else alfa=(2*A2-B)/sqrt(B^2+4*A2); beta=B/sqrt(B^2+4*A2); a=0.242/sqrt(A2)*(asin(alfa)+asin(beta))/sqrt(Tw_T); b=0.41+log10(Re_x/Tw_T^(0.5+w)); Cf=(fzero([num2str(b),'*x+2*log(x)/log(10)*x-',num2str(a)],0.07))^2; end Ch=Cf/2; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function w=vis_exp(T1,T2) mi1=Sutherland(T1); mi2=Sutherland(T2); w=log(mi2/mi1)/log(T2/T1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function mi=Sutherland(T) mi=1.78e-5*(T/288)^1.5*(288+110)/(T+110); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

La funzione cooled_diffuser si avvale delle seguenti sottofunzioni:

get_Mach2_d e get_Mach2_g : determinano il numero di Mach in uscita

rispettivamente per tratto divergente e gola

2

,

van_driest_mod : implementa il modello di van Driest per attrito e scambio

termico,

Sutherland : implementa la legge di Sutherland per la viscosità dell’aria.

(14)

vis_exp: determina l’esponente ω per la legge esponenziale della viscosità, che

meglio approssima la legge di Sutherland nell’intervallo di temperature dato.

heli_coil : descritta nel prossimo paragrafo.

C.5 La function

heli_coil

Questa funzione calcola i parametri del fluido refrigerante all’interno

dell’avvolgimento elicoidale, una volta noti i parametri di input:

• potenza termica scambiata e temperatura totale media per ogni elemento del

diffusore

3

.

Gli altri dati necessari al calcolo sono forniti nel file data.m.

I parametri di output sono:

• il vettore

Tw_T0

, che riporta il rapporto tra la temperatura alla parete e la

temperatura totale media su ogni elemento,

• temperature di fluido e parete, e resistenza idraulica così come descritto nel

paragrafo precedente.

function [Tw_T0,Tw,Twall,R]=heli_coil(Q,T0med) global fatt Nd Dth_Din

data % TRATTO CONVERGENTE Tw.conv=Tw0+Q.conv/Cp_wat/m_wat; Twmed=mean([Tw0,Tw.conv]); Prw=interp1(T_wat,Pr_wat,Twmed); kw=interp1(T_wat,k_wat,Twmed); miw=interp1(T_wat,mi_wat,Twmed); Rew=4/pi*m_wat./(tubo.Din*miw); [Nu,f]=Mori_Nakayama(Rew,tubo.Din/(Dmed.conv+2*t+tubo.Dout),Prw); hw=Nu*kw/tubo.Din; SL=pi^2*tubo.Din*sum(0.5*(D.conv(2:end)+D.conv(1:end-1))+2*t+tubo.Dout); R.conv=8*1000/pi^2/tubo.Din^5*f*pi*(Nc*(2*t+tubo.Dout)+0.5*sum(D.conv(2:end)+... D.conv(1:end-1)));

% Coefficienti per il calcolo della temperatura della parete

A_conv=Twmed*SL*hw; B_conv=SL*hw;

% GOLA

deltaTw=Q.gola/m_wat/Cp_wat; % variazione della temperatura del fluido

Tw.gola(1)=Tw.conv;

(15)

for i=1:length(deltaTw)

Tw.gola(i+1)=Tw.gola(i)+deltaTw(i); end

% temperatura media del fluido su ogni spira

Twmed=0.5*(Tw.gola(1:end-1)+Tw.gola(2:end)); Prw=interp1(T_wat,Pr_wat,Twmed); kw=interp1(T_wat,k_wat,Twmed); miw=interp1(T_wat,mi_wat,Twmed); Rew=4/pi*m_wat./(tubo.Din*miw); for i=1:length(Twmed) [Nu,f]=Mori_Nakayama(Rew(i),tubo.Din/(Dth+2*t+tubo.Dout),Prw(i)); hw(i)=Nu*kw(i)/tubo.Din; fL(i)=f*pi*(Dth+2*t+tubo.Dout); end R.gola=8*1000/pi^2/tubo.Din^5*sum(fL);

% Coefficienti per il calcolo della temperatura della parete

A_gola=sum(hw.*Twmed)*Ng*(pi^2*tubo.Din*(Dth+2*t+tubo.Dout)); B_gola=sum(hw)*Ng*(pi^2*tubo.Din*(Dth+2*t+tubo.Dout));

% TRATTO DIVERGENTE

deltaTw=Q.div/m_wat/Cp_wat; % variazione della temperatura del fluido

Tw.div(1)=Tw.gola(end); for i=1:length(deltaTw)

Tw.div(i+1)=Tw.div(i)+deltaTw(i); end

% temperatura media del fluido su ogni spira

Twmed=0.5*(Tw.div(1:end-1)+Tw.div(2:end)); Prw=interp1(T_wat,Pr_wat,Twmed); kw=interp1(T_wat,k_wat,Twmed); miw=interp1(T_wat,mi_wat,Twmed); Rew=4/pi*m_wat./(tubo.Din*miw); for i=1:length(Twmed) [Nu,f]=Mori_Nakayama(Rew(i),tubo.Din/(Dmed.div(i)+2*t+tubo.Dout),Prw(i)); hw(i)=Nu*kw(i)/tubo.Din; fL(i)=f*pi*(Dmed.div(i)+2*t+tubo.Dout); end R.div=8*1000/pi^2/tubo.Din^5*sum(fL);

% Coefficienti per il calcolo della temperatura della parete

A_div=pi^2*tubo.Din*sum(hw.*Twmed.*(Dmed.div+2*t+tubo.Dout)); B_div=pi^2*tubo.Din*sum(hw.*(Dmed.div+2*t+tubo.Dout));

% Calcolo della temperatura alla parete

Qtot=Q.conv+sum(Q.gola)+sum(Q.div);

Twall=((A_conv+A_gola+A_div)+Qtot)/(B_conv+B_gola+B_div); Tw_T0.conv=Twall./(T0med.conv);

(16)

Tw_T0.gola=Twall./(T0med.gola); Tw_T0.div=Twall./(T0med.div); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [Nu,f]=Mori_Nakayama(Re,r_R,Pr) Re_cr=20000*(r_R)^0.32; if Re<Re_cr De=Re*sqrt(r_R); Kf=(1-3.253/sqrt(De))^-1; z=2/11*(1+sqrt(1+77/4*Pr^(-2))); Knu=(1+37.05/z*(1/40-17/120*z+(0.1/z+13/30)/(10*Pr))/sqrt(De))^-1; f=64/Re*0.108*sqrt(De)*Kf; Nu=48/11*0.198*sqrt(De)*Knu/z; else Re_tr=6.5e5*sqrt(r_R); if Re<Re_tr K=(Re*r_R^2)^0.2; f=0.3*sqrt(r_R)/K*(1+0.112/K); Nu=Pr/26.2/(Pr^(2/3)-0.074)*Re^(4/5)*r_R^0.1*(1+0.098/K); else K=(Re*r_R^2.5)^(1/6); f=0.192*sqrt(r_R)/K*(1+0.068/K); Nu=Pr^0.4/41*Re^(5/6)*r_R^(1/12)*(1+0.061/K); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

La funzione cooled_diffuser si avvale della sottofunzione Mori_Nakayama che

implementa il modello omonimo per attrito e scambio termico per un flusso

incomprimibile nei tubi curvi descritto nel paragrafo 6.4.5.

C.6 La function

heat_exchanger

La funzione heat_exchanger implementa la procedura di calcolo per lo

scambiatore di calore così come descritta nel paragrafo 6.5.

Anche in questo caso la maggioranza dei parametri in ingresso viene inserita

attraverso il file data.m, inoltre è necessario specificare:

• temperatura del gas che si vuole ottenere all’uscita dello scambiatore,

• area del condotto della sezione del condotto che porta il gas allo scambiatore,

(17)

• proprietà del gas in ingresso allo scambiatore; riportate nella variabile

strutturata

flow_in

che ha come campi: temperatura, pressione, velocità e

densità.

In output la funzione restituisce i seguenti valori:

• la variabile strutturata

flow_out

, dello stesso tipo di

flow_in

, che contiene le

proprietà del gas in uscita dallo scambiatore,

• la resistenza idraulica dello scambiatore,

• la lunghezza dei tubi del banco e la superficie di scambio termico,

• la potenza termica sottratta al gas nello scambiatore,

• la portata di massa dell’acqua necessaria,

• il numero complessivo di tubi nel banco.

function [flow_out,R_exg,Ltub,S,q,m_wat,Ntubi]=... heat_exchanger(T_gas_out,flow_in,A_in)

% Caricamento dei dati

data

T_gas_in=flow_in.T; % Temperatura del gas in ingresso

Ntubi=ceil(alfa/(pi*d_tub_i^2/4/A_in)); % Numero complessivo di tubi

Nf_oriz=Ntubi/Nf_vert; % Numero di file orizzontali

G=m_gas/(alfa*A_in); % Flusso di massa de gas per unità di

superficie

gas_cold=airdata(T_gas_out); gas_hot=airdata(T_gas_in);

% Potenza termica da sottrarre al gas

q=m_gas*(gas_hot.Cp*T_gas_in-gas_cold.Cp*T_gas_out);

T_gas_med=0.5*(T_gas_in+T_gas_out); % Temperatura media del gas

m_wat=q/Cp_wat/(T_wat_out-T_wat_in); % Portata di refrigerante richiesta

T_wat_med=0.5*(T_wat_out+T_wat_in); % Temperatura media del refrigerante

% Differenza media logaritmica delle temperature

deltaT_a=T_gas_in-T_wat_out; deltaT_b=T_gas_out-T_wat_in;

MLDT=0.9*(deltaT_a-deltaT_b)/log(deltaT_a/deltaT_b);

% numero di Prandtl, conducibilità termica e viscosità dell'acqua

Pr_w=interp1(T_wat,Pr_wat,T_wat_med); k_w=interp1(T_wat,k_wat,T_wat_med); mi_w=interp1(T_wat,mi_wat,T_wat_med);

% Ciclo di calcolo della superficie di scambio termico

esci=0; cont=0;

(18)

L0=1;

while esci==0

cont=cont+1;

Amin=Nf_vert*(S_v-d_tub_e)*L0; % Minima area di passaggio per l'acqua

Gmax=m_wat/Amin;

Re_max=Gmax*d_tub_e/mi_w;

Colb=1.011*Re_max^(-0.645); % Fattore di Colburn

Attr=1.665*Re_max^(-0.325); % Fattore di Atrrito

mi_rat0=1; esci1=0; cont1=0; while esci1==0 cont1=cont1+1; if Nf_oriz<10 h_w=Cp_wat*Gmax*Pr_w^(2/3)*mi_rat0^0.14*(10/Nf_oriz)^0.18*Colb; else h_w=Cp_wat*Gmax*Pr_w^(2/3)*mi_rat0^0.14*Colb; end T_s=T_wat_med+q/h_w; mi_rat1=interp1(T_wat,mi_wat,T_s)/mi_w; if (abs(mi_rat1-mi_rat0)/mi_rat0<0.01)|(cont1==10) esci1=1; else mi_rat0=mi_rat1; end end

T_gas_film=0.5*(T_gas_med+T_s); % Temperatura di film per il gas

gas_film=airdata(T_gas_film); % Proprietà del gas alla

temperatura di film. h_gas=gas_film.Cp*G*0.023*(gas_film.mi/G/d_tub_i)^0.2*... gas_film.Pr^(-2/3); U=1/(1/h_gas+1/h_w);

S=q/U/MLDT; % Superdicie di scambio termico

L_d=S/4/alfa/A_in;

Ltub=L_d*d_tub_i; % Lunghezza dei tubi

if (abs(Ltub-L0)/L0<0.01)|(cont==10) esci=1; else L0=Ltub; end

(19)

beta=alfa;

f=eval(solve(['x+2*log(x)/log(10)=',num2str(-0.8+2*... log10(G*d_tub_i/gas_film.mi))]))^(-2);

% resistenza idraulica dello scambiatore

R_exg=2*Attr*1000*Nf_oriz/Amin^2*mi_rat0^0.25+8*1000/pi^2*(1+0.5)/(0.03)^4;

f_eff=f*(T_s/T_gas_med)^0.14;

% fattore di perdita per il gas

k_gas=0.9+(alfa^-2)*(0.5+f_eff*Ltub/d_tub_i+T_gas_out/T_gas_in*... (1+0.3*beta^2)); % variabile di uscita flow_out.P=flow_in.P-0.5*flow_in.D*(flow_in.V)^2*k_gas; flow_out.T=T_gas_out; flow_out.D=flow_in.D*(T_gas_in/T_gas_out); flow_out.V=m_gas/flow_out.D/(A_in*alfa/beta);

La funzione airdata, che viene più volte richiamata all’interno del listato,

calcola le proprietà dell’aria (viscosità, conducibilità termica, calori specifici e

numero di Prandtl) al variare della temperatura, basandosi su formule empiriche

disponibili in letteratura.

C.7 Il file

data.m

Di seguito è stato riportato un esempio del file data.m, che contiene numerosi

dati e parametri necessari per il funzionamento delle funzioni dei paragrafi

precedenti.

% File dei dati di progetto

% Costanti fisiche

R=288; g=1.4;

Cp=R*g/(g-1);

% Proprietà del flusso in ingresso

m_gas=2.53e-2; % portata di massa

Din=80/1000; % diametro in ingresso

T0inf=1700; % temperatura totale

p0inf=6e5; % pressione totale

% Proprietà dell'acqua

m_wat=0.3; % Portata di acqua nel circuito

m_coil=0.04; % Portata di acqua nell'avvolgimento elicoidale

Pr_wat=[13.4,9.5,8.1,7.1,5.5,4.3,3.0,2.2,1.8]; T_wat=[0,10,15,20,30,40,60,80,100]+273.15;

mi_wat=[1.787,1.304,1.137,1.002,0.798,0.654,0.467,0.355,0.283]*1e-3; k_wat=[0.56,0.58,0.59,0.59,0.61,0.63,0.65,0.67,0.67];

Cp_wat=4180;

(20)

% Parametri geometrici per il diffusore:

theta_div=2.5; % angolo di semiapertura del divergente

theta_conv=6.5; % angolo di semiapertura del convergente

e=0.9; % rapporto dei diametri per il tubo

tubo.Dout=9/1000; % diametro esterno del tubo

tubo.Din=tubo.Dout*e; % diametro interno del tubo

Dth_Din=0.34; % rapporto dei diametri del convergente

Dth=Din*Dth_Din; % Diametro della gola

L_conv=0.5*Din*(1-Dth_Din)/tan(deg2rad(theta_conv)); % Lunghezza del

convergente

Nc=ceil(L_conv/cos(deg2rad(theta_conv))/tubo.Dout); % Numero di spire nel

convergente

Nd=43; % Numero di spire nel divergente

Ng=6; % Numero di spire nel tratto di gola

t=2e-3; % spessore delle pareti del diffusore

% Parametri fisici per il diffusore:

% rapporto tra il Mach dell'urto e quello in ingresso al divergente

fatt=1.06;

% valore di primo tentativo temperatura adimensionale alla parete

Tw_T01=0.22;

% Parametri geometrici dello scambiatore

d_tub_e=0.01; % diametro esterno dei tubi

d_tub_i=0.009; % diametro interno dei tubi

Nf_vert=6; % numero di file verticali (parallele al flusso)

S_o=1.25*d_tub_e; % passo tra le file orizzontali

S_v=1.25*d_tub_e; % passo tra le file verticali

alfa=1.1; beta=alfa;

% parametri geometrici derivati di ausilio per il calcolo

D.conv=linspace(Din,Dth,Nc+1); Dmed.conv=0.5*(Din+Dth)/cos(deg2rad(theta_conv)); L_div=Nd*tubo.Dout; Dex=Dth+2*L_div*sin(deg2rad(theta_div)); D.div=[Dth:2*tubo.Dout*sin(deg2rad(theta_div)):Dex]; Dmed.div=(D.div(2:end)+D.div(1:end-1))/cos(deg2rad(theta_div));

Riferimenti

Documenti correlati

Facendo luce su un processo che la società giapponese ha elaborato per mediare la transizione delle ragazze nel mondo del lavoro e nell'età adulta, e su come

When the wage of an intermediary is even higher so that he is willing to work with any match except the worst one, there is an equilibrium when good and average matches (HH and HL)

Our study shows that while migrant media follow the general rule that something negative has a higher news value they are also bound up with additional challenges notably that

Il Web 2.0 è la rete come piattaforma, attraverso tutti i dispositivi collegati; le applicazioni del Web 2.0 sono quelle che permettono di ottenere la maggior parte dei

Similarly, German commentators who endorse the concept of “social market economy” don’t refer to it as a constitutional objective, but a “strategy in economic policy” to achieve

I Pt100 hanno un’ottima precisione, possono misurare un range di temperature piuttosto ampio (da −200 °C fino a 850 °C), e sono particolarmente lineari rispetto ad altri tipi

massa in grammi numericamente uguale alla sua massa atomica o molecolare contiene un numero di atomi o.. molecole uguale al numero

Se due oggetti in contatto termico hanno una temperatura diversa, il calore fluisce da quello più caldo a quello più freddo, fino a quando non raggiungono entrambi la