パターン内のどこにあるかによって変化するパラメータ (長さなど) を持つコンポーネント (動的パイプなど) の繰り返しパターンがあるとします。対象のパラメーターの前にある「each」プレフィックスを省略することで可能になる可能性があると提案しました。
例えば。パイプを取得して、次の方法でモデルに追加します。
parameter Integer n;
Modelica.Fluid.Pipes.DynamicPipe[n] pipe;
非常に単純な例として、パターンの 1 番目のパイプの長さをある程度の長さ (length_1) にし、その他すべての長さを length_n にするように指定します。私の考えでは、パラメータを次のように定義するときに if ステートメントを配置して、length_1 を n=1 パイプ コンポーネントに割り当て、その他すべてに length_n を割り当てることができるのではないかと考えています。
parameter Integer n;
Modelica.Fluid.Pipes.DynamicPipe[n] pipe(
length=if n<2 then length_1 else cat(1,length_1,fill(length_n,n-1)));
上記のフレームワークの単純なモデルを以下に示します。
model Test
parameter Integer n(min=1);
parameter Modelica.SIunits.Length length_1 = 0.1;
parameter Modelica.SIunits.Length length_n = 0.2;
Modelica.Fluid.Pipes.DynamicPipe[n] pipe(
redeclare each package Medium = Modelica.Media.Water.StandardWater,
each modelStructure=Modelica.Fluid.Types.ModelStructure.av_b,
each diameter=1,
length=if n==1 then length_1 else cat(1,length_1,fill(length_n,n-1)));
Modelica.Fluid.Sources.Boundary_pT boundary(
nPorts=1,
redeclare package Medium = Modelica.Media.Water.StandardWater,
p=100000,
T=293.15);
Modelica.Fluid.Sources.MassFlowSource_T boundary1(
nPorts=1,
redeclare package Medium = Modelica.Media.Water.StandardWater,
m_flow=1,
T=293.15);
inner Modelica.Fluid.System system(m_flow_start=1, T_start=293.15);
equation
if n == 1 then
connect(boundary1.ports[1], pipe[1].port_a);
connect(boundary.ports[1], pipe[1].port_b);
else
connect(boundary1.ports[1], pipe[1].port_a);
for i in 1:n-1 loop
connect(pipe[i].port_b, pipe[i+1].port_a);
end for;
connect(boundary.ports[1], pipe[n].port_b);
end if;
end Test;
このままでは、モデルは機能しません。if ステートメントの作成方法が間違っているのか、それとも単純に許容できないのか ("each" プレフィックスの解釈が間違っている場合に該当する可能性があります) はわかりません。
何かご意見は?