前回までに作ったモデルにThermal→FluidHeatFlow→ComponentsのIsolatedPipeを入れてみました。
IsolatedPipeの設定項目は下図の通りですが、Simple Frictionの項目がよくわからない・・・
層流の体積流量と圧力損失の組み合わせと、乱流を想定した定格の体積流量と圧力損失を入力して、体積流量から圧力損失を算出するのだろうと考えて、上図の適当な設定でコンパイル、実行すると実行時にエラーが。
assert | error | SimpleFriction: dpNominal has to be > dpLaminar/V_flowLaminar*V_flowNominal!
定格の体積流量を流した時の圧力損失が制約を満足していないらしい。
詳細を確認するため、IsolatedPipeを以下の図のようにView textで見てみると・・・
model IsolatedPipe "Pipe without heat exchange"
extends Interfaces.Partials.TwoPort(final tapT=1);
extends Interfaces.Partials.SimpleFriction;
parameter Modelica.SIunits.Length h_g(start=0)
"Geodetic height (height difference from flowPort_a to flowPort_b)";
equation
// coupling with FrictionModel
volumeFlow = V_flow;
dp = pressureDrop + medium.rhoModelica.Constants.g_nh_g;
// no energy exchange with medium
Q_flow = Q_friction;
と、コメントにcoupling with FrictionModelとあるように、圧力損失計算はSimpleFrictionで行われていることがわかりました。
そこで、SimpleFrictionを探して、View textをしてみると、
partial model SimpleFriction "Simple friction model"
-前略-
protected
parameter Modelica.SIunits.Pressure dpNomMin=dpLaminar/V_flowLaminarV_flowNominal;
parameter Real k(final unit="Pa.s2/m6", fixed=false);
initial algorithm
assert(V_flowNominal>V_flowLaminar,
"SimpleFriction: V_flowNominal has to be > V_flowLaminar!");
assert(dpNominal>=dpNomMin,
"SimpleFriction: dpNominal has to be > dpLaminar/V_flowLaminarV_flowNominal!");
k:=(dpNominal - dpNomMin)/(V_flowNominal - V_flowLaminar)^2;
equation
if volumeFlow > +V_flowLaminar then
pressureDrop = +dpLaminar/V_flowLaminarvolumeFlow + k(volumeFlow - V_flowLaminar)^2;
elseif volumeFlow < -V_flowLaminar then
pressureDrop = +dpLaminar/V_flowLaminarvolumeFlow - k(volumeFlow + V_flowLaminar)^2;
else
pressureDrop = dpLaminar/V_flowLaminarvolumeFlow;
end if;
Q_friction = frictionLossvolumeFlow*pressureDrop;
-後略-
と、元の式が見えます。
15年くらいいろんな流路の圧力損失を計算してきた私ですが、この式は使ったことない・・・
なんだろな?と思っていたところ、SimpleFrictionをダイアグラムビューにすると、ナイスな図が出現。
圧力損失は層流域では体積流量に比例、乱流域では体積流量の2乗に比例するとして、算出していることが絵的にわかります。
と、わかったのは良いのですが、この算出方法に疑問が残ったところで、今回は終了です。