2 votes

Modélisation d'un tuyau chauffé dans Modelica/Dymola

Je suis actuellement étudiant en génie chimique et pour mon mémoire de licence, je suis censé modéliser un tuyau chauffé qui peut être utilisé dans un surchauffeur en connectant deux tuyaux ensemble via un port de chaleur. Même si j'ai fait de gros efforts pour comprendre comment coder correctement en Modelica, mon code ne fonctionne toujours pas et je commence à désespérer.

Le modèle doit donc être applicable à la fois pour l'eau fluide et la vapeur surchauffée, c'est-à-dire un écoulement monophasé dans des conditions instationnaires. Le transfert de chaleur est censé se produire par convection. De plus, je néglige les pertes de pression dues à la friction dans ce modèle.

Voici mon idée de la façon dont le modèle est censé fonctionner : J'essaie de construire un modèle comme celui du MSL, "Dynamic Pipe", mais de manière plus simple afin que les étudiants qui travaillent sur le même sujet soient capables de comprendre mon code rapidement. J'ai donc divisé le tuyau en un certain nombre de noeuds n, le premier volume étant un état d'entrée, donc en fait cet état n'appartient pas vraiment au tuyau. Après cela, les équations d'équilibre s'appliquent. Je ne suis pas tout à fait sûr des équations de quantité de mouvement, donc toute aide à ce sujet sera très appréciée. Le transfert de chaleur par convection est défini par le modèle "Convection" du MSL, Thermal.HeatTransfer.Components. Lorsque je teste le modèle avec une source de flux, une frontière avec une pression fixe et une température fixe à la paroi, j'obtiens également l'erreur "Failed to reduce the DAE index" et je n'ai absolument aucune idée de ce que cela signifie.

Voici également mon code :

        model Pipe_base3
      //Import

      import Modelica.SIunits.*;
      import Modelica.Constants.pi;
      replaceable package Medium =
          Modelica.Media.Interfaces.PartialTwoPhaseMedium                          annotation (choicesAllMatching = true);

  parameter Integer n=2;
  parameter Integer np=1;

  // Geometry==================================================================//

  parameter Diameter d_pipe = 0.05 "Inner diameter of pipe"
                      annotation (Dialog(tab="Geometry"));
  parameter Length L = 1 "Length of unit"
                   annotation (Dialog(tab="Geometry"));
  parameter Area A_hex = pi * d_pipe * L
    "Shell surface of pipe for heat exchange"                                                 annotation (Dialog(tab="Geometry"));
  parameter Area A_q = (pi/4)*d_pipe^2
                       annotation (Dialog(tab="Geometry"));

  //Initialisation=============================================================//

  parameter Medium.Temperature T_start = 403.15 annotation (Dialog(tab="Initialization"));
  parameter Medium.SpecificEnthalpy h_start = Medium.specificEnthalpy_pT(p_start, T_start) annotation (Dialog(tab="Initialization"));
  parameter AbsolutePressure p_start = Medium.saturationPressure(T_start) annotation (Dialog(tab="Initialization"));
  parameter Medium.MassFlowRate m_flow_start = 0.5 annotation (Dialog(tab="Initialization"));

  //Temperature, pressure, energy==============================================//

  Medium.Temperature T[n+1]( each start=T_start, fixed=false);
  Medium.SpecificEnthalpy h[n+1]( each start=h_start, fixed=false);
  Medium.AbsolutePressure p[n+1](each start=p_start, fixed=false);

  HeatFlowRate Q_flow[n](fixed = false);
  Energy U[n](min=0);
  Energy KE[n]; //Kinetic Energy
  Medium.ThermodynamicState state[n+1];

  // Nondimensional Variables + HeatTransfer===================================//

  Medium.PrandtlNumber Pr[n](fixed=false);
  ReynoldsNumber Re[n](fixed=false);
  Real Xi[n];
  NusseltNumber Nu[n];
  CoefficientOfHeatTransfer alpha[n];

  // Thermodynamic properties==================================================//

  Medium.SpecificInternalEnergy u[n](fixed=false);
  Medium.DynamicViscosity eta[n];
  Density rho[n+1];
  Medium.SpecificHeatCapacity cp[n];
  Medium.ThermalConductivity lambda_fluid[n];

  //Segmental properties

  Mass ms[n]; //Mass per Segment
  MassFlowRate m_flow[n+1]( each start=m_flow_start/np, fixed=false);
  Velocity w[n+1](fixed=false);

  // Momentum

  Force F_p[n];
  Momentum I[n];
  Force Ib_flow[n];

  parameter Boolean init = false;

  Modelica.Fluid.Interfaces.FluidPort_a fluidin( redeclare package Medium = Medium, m_flow(start = m_flow_start, min = 0), p(start = p_start))
    annotation (Placement(transformation(extent={{-90,-100},{-70,-80}}),
        iconTransformation(extent={{-90,-100},{-70,-80}})));
  Modelica.Fluid.Interfaces.FluidPort_b fluidout( redeclare package Medium = Medium, m_flow(start = -m_flow_start, max = 0), p(start = p_start), h_outflow(start=h_start))
    annotation (Placement(transformation(extent={{70,-100},{90,-80}}),
        iconTransformation(extent={{70,-100},{90,-80}})));
  Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a[n] heatport
    annotation (Placement(transformation(extent={{-10,60},{10,80}}),
        iconTransformation(extent={{-10,60},{10,80}})));
  Modelica.Blocks.Interfaces.RealOutput[n] alpha_output annotation (Placement(
        transformation(extent={{-100,38},{-140,78}}), iconTransformation(extent={{-100,
            38},{-140,78}})));

protected 
  parameter Volume vn = (A_q * L) / n; //Volume per segment
  parameter Real x[n] = linspace((L/n), L, n);
  parameter Length length = L/n;

initial equation 

    for i in 1:(n+1) loop
      //h[i] = Medium.specificEnthalpy_pTX(p_start, T_start, {1});
      p[i] = p_start;
    end for;

equation 

  //Port equations=============================================================//

  fluidout.p = p[n];
  //fluidin.p-fluidout.p=p[1]-p[n+1];
  fluidout.h_outflow = h[n];
  fluidout.m_flow = -m_flow[n+1];

  //===========================================================================//

  h[1]=inStream(fluidin.h_outflow);
  p[1]=fluidin.p;
  state[1]=Medium.setState_ph(p[1],h[1]);
  T[1]=Medium.temperature(state[1]);
  rho[1]=Medium.density(state[1]);
  m_flow[1]=fluidin.m_flow/np;
  m_flow[1]=A_q*rho[1]*w[1];

  for i in 1:(n) loop

    // Heatport equations======================================================//

    T[i] = heatport[i].T;
    Q_flow[i] = heatport[i].Q_flow;

    // Momentum Balance =======================================================//

    der(I[i]) = Ib_flow[i] - F_p[i];
    I[i]=m_flow[i]*length;
    Ib_flow[i] = (p[i+1]*w[i+1]*w[i+1] - p[i]*w[i]*w[i])*A_q*np;
    F_p[i] = (A_q*p[i+1]-A_q*p[i]);

    // Energy Balance=========================================================//

    U[i] = ms[i] * u[i];
    KE[i] = 0.5*ms[i]*w[i+1]*w[i+1];

    der(U[i]+KE[i])=m_flow[i]*(h[i]+0.5*w[i]) - m_flow[i+1]*(h[i+1]+0.5*w[i+1]) + Q_flow[i];

    der(rho[i+1])= -((rho[i+1]-rho[i])*w[i+1] + (w[i+1]-w[i])*rho[i+1]); //Konti

     ms[i]=vn*rho[i+1];

     T[i+1]=Medium.temperature(state[i+1]);

     state[i+1] = Medium.setState_ph(p[i+1], h[i+1], 1); //Sets thermodynamic state from which other properties can be determined
     u[i] = Medium.specificInternalEnergy(state[i+1]);
     cp[i] = Medium.specificHeatCapacityCp(state[i+1]);
     rho[i+1] = Medium.density(state[i+1]);
     eta[i] = Medium.dynamicViscosity(state[i+1]);
     lambda_fluid[i] = Medium.thermalConductivity(state[i+1]);

     Re[i] * eta[i] = (rho[i+1] * abs(w[i+1]) * d_pipe);
     Pr[i] *lambda_fluid[i] = (eta[i] * cp[i]);
     Xi[i] = (1.8 * log10(abs(Re[i])+1) - 1.5)^(-2);
     Nu[i] = ((Xi[i]/8)*Re[i]*Pr[i])/(1+12.7*sqrt(Xi[i]/8)*((Pr[i])^(2/3)-1))*(1+(1/3)*(d_pipe/x[i])^(2/3));

     Nu[i] = Modelica.Fluid.Pipes.BaseClasses.CharacteristicNumbers.NusseltNumber(alpha[i], d_pipe, lambda_fluid[i]);

     alpha_output[i] = alpha[i] * (A_hex/n);

     m_flow[i+1] = A_q * w[i+1] * rho[i+1];

    // der(p[i]) = - w[i]*der(w[i]) * rho[i];

    // 0 = m_flow[i-1] - m_flow[i];

    // der(rho[i]) = -((rho[i]-rho[i-1])*w[i] + (v[i]-v[i-1])*rho[i]);

    //m_flow[i] = A_q * w[i] * rho[i]; //Calculation of flow velocity

    //ms[i] = vn * rho[i]; //Mass per segment

    //Calculation of thermodynamic properties for each segment=================//

    //Heat Transfer============================================================//

  end for;

  fluidin.h_outflow = h[1]; //

  annotation (Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},
            {100,100}}), graphics={Line(
          points={{-80,-80},{-80,94},{-80,100},{0,20},{80,100},{80,-80}},
          color={0,0,255},
          smooth=Smooth.None), Line(
          points={{-60,-60},{-60,-48},{-60,0},{60,0},{60,-60},{48,-40},{72,-40},
              {60,-60}},
          color={0,0,255},
          smooth=Smooth.None)}), __Dymola_selections);
end Pipe_base3;

Merci beaucoup d'avance !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X