• Aucun résultat trouvé

Code Matlab du modèle semi-analytique de panneau radiant pour tubes en serpentin

% Cette fonction permet de trouver la température d'un panneau radiant % hydronique dont le conduit est en serpentin. Elle renvoie la distribution % de température sur tout le panneau, ainsi que les Matp de

% coordonnées associées à ces valeurs de T. Les entrées peuvent être % adimensionnalisées par mCp et W.

g.

% Le programme réalise les étapes suivantes:

% 1- Trouver la distribution de Tf le long du tuyau en discrétisant par % petits intervalles en modélisant le panneau comme une ailette dont le % bout est adiabatique (au centre entre 2 tuyaux)

% 2- Trouver le profil de température partout sur le panneau

% 3- Trouver le déplacement "delta" de la frontière adiabatique entre 2 % tuyaux à l'aide d'un modèle ailette avec T imposée aux 2 bouts. % 4- Revenir à l'étape 1 en incorporant le décalage de la frontière % adiabatique "delta".

% 5- Itérer jusqu'à stabilisation de la solution.

Q

"0

% Structure des entrées et sorties:

g. o % [M_Tp,Tf,Q,U,Delta,V_Y,V_X]= ModeleDelta(Carac_Serp,Options,DeItaO) g. o % Inputs : o. "o

% Carac_Serp: structure contenant tous les paramètres géométriques et % les caractéristiques de l'ailette. Cette structure est composée de la % manière suivante:

% Carac_Serp.Do > Diamètre extérieur des tubes

% Carac_Serp.Ly > Longueur du panneau en y (perp. aux tubes) % Carac_Serp.Lx > Longueur du panneau en x (parallèle aux tubes) % Carac_Serp.e > Épaisseur du panneau

% Carac_Serp.Nrows > Nombre de rangées de tuyaux (passes) % Carac_Serp.Rconv_int > Résistance/unit longueur de convection % fluide-tuyau % Carac_Serp.Rcond_tube > Résistance/unit longueur de conduction dans % le tube

% Carac_Serp.Rcontact > Résistance/unit longueur de contact entre % le tube et le panneau

% Carac_Serp.ky > Conductivité thermique du panneau % Carac_Serp.Mcp > Débit capacitif en W/K

% Carac_Serp.Tfi > Température d'entrée du fluide (1 si % adimensionnel).

Carac_Serp.Ta > Température ambiante (0 si adimensionnel). Carac_Serp.U > Conductance équivalente entre le panneau et

1'environnement.

Carac_Serp.Nx > Nombre d'intervalles de discrétisation

la

longitudinalement (sens des tuyaux,x).

Carac_Serp.Nytot > Nombre d'intervalles de discrétisation en y Carac_Serp.Surface > Chaîne de caractère. Indique si la surface est

au mur, au plancher, ou au plafond; 3 choix - 'mur'

- 'plancher' - 'plafond'

Options: Structure contenant les options de résolution. Elle comprend les entrées suivantes

Options.Rayon > binaire: Tenir compte du diamètre du tuyau(l) ou non(O)

Options.Bouts > binaire: Tenir compte des bouts hémisphériques (1) ou non (0)

Options.IterU > binaire: Faire des itérations pour trouver U(l) ou non (0)

Options.IterMaxD > Nonbre d'itérations maximal pour la boucle des Deltas

Options.IterMaxU > Nombre d'itérations maximal pour la boucle des U (si IterU==0, entrer n'importe quelle valeur) DeltaO: (Optionnel). Matrice donnant les valeurs intiales de delta,

par exemple provenant d'une simulation précédente. La taille de matrice doit être [Nx N+l]. La valeur par défaut (si l'entrée est absente) est de 0 partout.

% Outputs:

g, o

% M_Tp: Matrice finale de températures du panneau

Q, O

% Tf: Matrice finale de température du fluide

g.

% Q: Taux de tranfert de chaleur total du panneau

% Delta: Double Cell Array - Matrice des deltas pour chaque itération % de Delta et U

Q. 'O

% V_Y: Vecteur des positions en y des noeuds de températures sur le % panneau

o

% V_X: Vecteur des positions en x des noeuds de températures sur le % panneau

function [M_Tp,Tf,Q,U,Delta,delta,TfPar,QPar,Chi,V_Y,V_X]= ModeleDelta(Carac_Serp,Options,DeltaO)

tic%% Assignation des variables de la structure Carac_Serp CCarac=struct2cell(Carac_Serp); %#ok<NASGU>

NCarac=fieldnames(Carac_Serp);

COptions=struct2cell(Options); %#ok<NASGU> NOptions=fieldnames(Options);

for i=l: length(NCarac)

evalc([NCaracfi} ' = CCarac{i}']); end

for i=l: length(NOptions)

evalc([N0ptions{i} '= COptions{i)']); end

N=N_ou_Rho;

%% T r a i t e m e n t des o p t i o n s i f Rayon

R=Do/2; % en supposant que la température sous le tuyau est uniforme Tb else

R=0; % en supposant seulement Tb au contact du tuyau sur le panneau end

if -IterU

IterMaxU=l; end

if nargin>2 % Valeur initiale de Delta Siz=size(DeltaO);

if Siz(l)==Nx && Siz(2)==N+l delta=DeltaO;

skipinit=l; else

%disp('La taille de la matrice DeltaO fournie n'est pas compatible') %disp('avec la géométrie du problème: Delta est initialise à 0') delta=zeros(Nx,N+l); skipinit=0; end else delta=zeros(Nx,N+l); skipinit=0; end

%% Initialisation des vecteurs, matrices des quantités d'intérêt%%%% tic

[Ny,Nytot,dy] = Remesh(Nytot,Ly,N); %#ok<NODEF> Dx=Lx/Nx;

Ap=Lx*Ly; %aire du panneau

W=Ny*dy; % Longueur entre 2 tubes V_y=linspace(dy/2,W-dy/2, Ny);

V_X=linspace(Dx/2,Lx-Dx/2,Nx);

Nyl=floor((Nytot-Ny*(N-l))12); %Nombre de cellules à gauche du premier tube Nyr=ceil((Nytot-Ny*(N-l))12); %Nombre de cellules à droite du dernier tube

I=Nx+l; %nombre d'incréments i (en x) par passe de tube

Nel_R=round(Ny*R/W); %Nombre de cellules occupées par un demi-tube ww=W-2*R; %2xomega (longueur d'ailette entre deux tubes)

w=ww/2; % demi-longueur d'ailette (coord Xi)

V_Xil=linspace(w-dy/2,dy/2,Nyl-Nel_R); %Vecteur des positions Xi extrême gauche

V_Xi=linspace(dy/2,ww-dy/2,Ny-2*Nel_R); %Vecteurs des positions Xi

V_Xir=linspace(dy/2,w-dy/2,Nyr-Nel_R); %Vecteur des positions Xi extrême droite

deltaprev=delta; deltanew=delta;

V_Y=NaN(1,Nytot); %Vecteur des positions Y sur tout le panneau (pour output) M_Tp=NaN(Nx,Nytot);

Tp=NaN(Nx,Ny-2 *Nel_R) Tpl=NaN(Nx,Nyl-Nel_R) Tpr=NaN(Nx,Nyr-Nel_R)

%Matrice des températures sur une rangée

%Matrice des températures sur la rangée gauche %Matrice des températures sur la rangée droite Rtot=Rconv_int+Rcond_tube+Rcontact; %Résistance thermique linéique totale last=[Nx*rem(N,2)+1 N]; % Cellule de l'outlet

[dChi,bid]=dx_dChi(Dx,Nx,Ny,N,0); %Appel à la fonction dx_dChi caractérise %longueurs d'éléments longitudinaux (pour le traitement des extrémités hémicirculaires)

Carac_fin.P=l; Carac_fin.Ac=e; Carac_fin.k=k; unsurMcp=l/Mcp;

%% Initialisation avec modèle parallèle

[TfPar,QPar,UO,Chi,TbO]=ModeleParallel(Carac_Serp,Options); TbO=TbO-Ta; U=U0; if -skipinit Carac_fin.L=ww; mO=sqrt(UO/(k*e) ) ; mLO=mO*Carac_fin.L; phiO=TbO(:,2:N)./TbO(:,1:N-1); deltanew(:,2:N)=log(sqrt(-(phiO-exp(-mLO)).*(phiO-exp(mLO)))./(phiO-... exp(-mLO)))/mO-w; delta=delta+0.2*(deltanew-delta); end

%% Boucle sur le coefficient de transfert U errU=l;

Unew=U; %#ok<NODEF> ItU=l;

while errU>0.01 && ItU<=IterMaxU; U=Unew;

m=sqrt(U/(k*e)); Carac_fin.L=ww; mL=m*Carac_fin.L; %Boucle sur Delta errD=l;

ItD=l;

while errD>0.01 && ItD<=IterMaxD Tf=NaN(I,N);

Tb=NaN(Nx,N);

x=0; %position en x i=l; %index en x n=l; %rangée de tube

swi=l; %switch pour la direction aval du fluide swil=0; %switch pour les index

Eff_right=tanh(m*(w+delta))./(m*(w+delta)); %Efficacité ailette parties droites

Eff_left=tanh(m*(w-delta))./(m*(w-delta)); %Efficacité ailette parties gauches

qbout=m*(1.2*cosh(mL)-1)/(sinh(mL));

F=Rtot*U*(Eff_left(:,1:(end-1)).*max((w-delta(:,1:(end-1))),0)+... %facteur eff. global non-dim.

Eff_right(:,2:end).*min((w+delta(:,2:end)),2*w)+2*R); %% Boucle sur les passes de tubes

Tf (1,l)=Tfi-Ta;

while n<=N %calcul de Tf ET Tb le long du tuyau avec le modèle à IT q=Tf(i,n)/(Rtot*(1/F(i-swil,n)+1)); dTf_dChi=-q*unsurMcp; Tf(i+swi,n)=Tf(i,n)+dTf_dChi*dChi(i-swil,n); Tb(i-swil,n)=-q*Rtot+Tf(i,n); x=x+Dx; i=i+swi;

if x>=Lx && n<N || i==l && n<N|| i==I && n<N Tf(i,n+l)=Tf(i,n);

x=0; s w i l = s w i l + s w i ; swi=-swi; e l s e i f x>=Lx I| i==l | | i==I n=n+l; end end p h i = T b ( : , 2 : N ) . / T b ( : , 1 : N - l ) ;

deltanew(:,2:N)=log(sqrt(-(phi-exp(-mL)) .*(phi-exp(mL))) ./ (phi-... exp(-mL)))/m-w;

delta=delta+min((0.2*(l+ItD/20)),1)*(deltanew-delta); %mise à jour avec RelaxFactor errD=max(max(abs((delta-deltaprev)./delta))); deltaprev=delta; Tf=Tf+Ta; Tfo=Tf(last(1),last (2)); DeltafltU}{ItD}=delta;%#ok<AGROW> ItD=ItD+l; end

%% Mise à jour du coefficient de transfert de chaleur U if IterU [Unew,errU] = CoeffU(Tfi,Tfo,Ap,Mcp,Ta,U,Surface,M_Tp); end ItU=ItU+l; end Q=(Tfi-Tfo)*Mcp;

%% Calcul des températures du panneau %Partie gauche yy=l; Carac_fin.CL=2; Carac_fin.L=w; for i=l:Nx Tpl (i, :)=FinCalc(V_Xil,Tb(i,1),U,Carac_fin); end Tpl_all=[Tpl repmat(Tb(:,l),l,Nel_R)]; M_Tp(:,yy:(yy+Nyl-1))=Tpl_all; V_Y(yy:(yy+Nyl-1))=linspace(dy/2,W/2-dy/2,Nyl); yy=yy+Nyl; y=W/2; %parties centrales Carac_fin.CL=3; Carac_fin.L=ww; for n=l:(N-l) for i=l:Nx Tp(i,:)=FinCalc(V_Xi,Tb(i,n),U,Carac_fin,Tb(i,n+1)); end Tp_all=[repmat(Tb(:,n),l,Nel_R) Tp repmat(Tb(:,n+1),1,Nel_R)]; M_Tp(:,yy:(yy+Ny-1))=Tp_all; V_Y(yy:(yy+Ny-1))=y+V_y; yy=yy+Ny; y=y+W; end %partie droite Carac_fin.CL=2; Carac_fin.L=w; for i=l:Nx Tpr(i, :)=FinCalc(V_Xir,Tb(i,N),U,Carac_fin); end

Tpr_all=[repmat(Tb(:,N),l,Nel_R) Tpr]; M_Tp(:,yy:(yy+Nyr-1))=Tpr_all; V_Y(yy:(yy+Nyr-1))=y+linspace(dy/2,W/2-dy/2,Nyr); M_Tp=M_Tp+Ta; %% Warning de delta Warn=max(max(delta>w))||min(min(delta<-w)); if Warn

disp('Delta a dépassé sa valeur limite, utiliser plutôt ModeleDeltaTimpos')

end toc

Documents relatifs