1
votes

I need modelica to solve an equation system for a variable only once at initialization. After that the variable 'turns' into a parameter and does not change any more. Is there any way to accomplish this?

As background information: I implemented a modelica model for a simple pump which has the input parameters maximum volume flow rate, pressure loss of the system at maximum flow rate, total pipe length and surface roughness. Now I need to calculate the corresponding (mean) hydraulic diameter of the pipes so that I can estimate the pressure loss at variable volume flow rate during the normal simulation. I'm using the Colebrook-White-Approach so I need to solve an equation system.

The code looks like this. The prefix var_ indicates its a variable, param_indicates it's a known parameter. I need var_d.

// calculation of velocity and reynolds number
var_w_max = param_Q_max/(Pi/4*var_d^2);
var_Re_max = var_w_max*var_d/param_my;

// Colebrook-White approach
1/sqrt(var_lambda_max) = -2*log10(2.51/(var_Re_max*var_lambda_max)+param_k/(3.71*var_d));
param_p_loss = var_lambda_max*param_l/var_d*param_rho_h2o*var_w_max^2/2;
2

2 Answers

6
votes

If you want to compute a parameter based on values at the start and then freeze it you can use an initial equation.

E.g. if you want to compute param_p_loss and param_k based on the last two equations you do:

  parameter Real param_p_loss(fixed=false);
  parameter Real param_k(fixed=false);
initial equation
  1/sqrt(var_lambda_max) = -2*log10(2.51/(var_Re_max*var_lambda_max)+param_k/(3.71*var_d));
   param_p_loss = var_lambda_max*param_l/var_d*param_rho_h2o*var_w_max^2/2;
equation
   ...

The fixed=false mean that the parameter needs to be solved initially.

2
votes

You can in fact solve for a parameter value during initialization. The clue lies in the modifier fixed=false.

Below is a simple example of a pressure drop where you solve for a hydraulic diameter during initialization to obtain a desired nominal mass flow.

model SolveParameter
  parameter Modelica.SIunits.Diameter dh(fixed=false, start=0.1)
    "Hydraulic diameter. Start attribute is guess value";
  parameter Real k=0.06 "Roughness, pipe length etc. combined";
  parameter Modelica.SIunits.MassFlowRate m_flow_nominal=2
    "Nominal mass flow rate";

  parameter Modelica.SIunits.PressureDifference dp=1e5
    "Differential pressure (boundary condition)";
  Modelica.SIunits.MassFlowRate m_flow "Time varying mass flow rate";
initial equation 
  m_flow = m_flow_nominal;
equation 
  m_flow = dh*k*sqrt(dp);
end SolveParameter;

If the diameter is a parameter within an instatiated class (pipe model) you can apply the fixed=false when you instantiate the model, i.e.

Modelica.Fluid.Pipes.DynamicPipe pipe(diameter(fixed=false));

Best regards,

Rene Just Nielsen