Решить систему уравнений только один раз при инициализации - PullRequest
1 голос
/ 19 марта 2020

Мне нужна modelica для решения системы уравнений для переменной только один раз при инициализации. После этого переменная «превращается» в параметр и больше не меняется. Есть ли способ сделать это?

В качестве справочной информации: я реализовал модель modelica для простого насоса, который имеет входные параметры максимального объемного расхода, потери давления в системе при максимальном расходе, общую длину трубы и шероховатость поверхности. Теперь мне нужно рассчитать соответствующий (средний) гидравлический c диаметр труб, чтобы я мог оценить потерю давления при переменном объемном расходе во время обычного моделирования. Я использую Colebrook-White-Approach , поэтому мне нужно решить систему уравнений.

Код выглядит следующим образом. Префикс var_ указывает на переменную, param_ указывает на известный параметр. Мне нужно 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 ]

6 голосов
/ 19 марта 2020

Если вы хотите вычислить параметр на основе значений в начале, а затем заморозить его, вы можете использовать исходное уравнение.

Например, если вы хотите вычислить param_p_loss и param_k на основе последних двух уравнений, которые вы делаете:

  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
   ...

Фиксированный = false означает, что параметр должен быть решен изначально.

2 голосов
/ 19 марта 2020

Фактически вы можете определить значение параметра во время инициализации. Подсказка лежит в модификаторе fixed=false.

Ниже приведен простой пример падения давления, когда вы выбираете гидравлический диаметр c во время инициализации для получения желаемого номинального массового расхода.

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;

Если диаметр является параметром внутри класса (модель трубы), вы можете применить fixed=false при создании экземпляра модели, то есть

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

С уважением,

Рене Джаст Нильсен

...