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
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)
% 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,
• 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;
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.
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.
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));
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,
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;
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;
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;
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);
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.
•
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;
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);
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,
• proprietà del gas in ingresso allo scambiatore; riportate nella variabile
strutturata
flow_inche 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;
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
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;
% 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));