是否可以将全局值发送到 OpenModelica 中的另一个模型?

问题描述

我正在尝试在 OpenModelica 中创建一个包含其他几个组件(管道、水库)的模型。目前我正在使用交错网格修改 Modelica.Fluid-library 中的管道,需要确定整个模型中的最小步长 dx。

是否可以执行以下操作?

  1. 计算管道 1 中的 dx_1 和管道 2 中的 dx_2。
  2. 将 dx_1 和 dx_2 发送到全局模型中的数组(类似于 Modelica.Fluid.System)。
  3. 确定最小的 dx = min(dx_1,dx_2) 并将其发送回管道 1 和管道 2。

我计算了管道 1 中的 dx_1 和管道 2 中的 dx_2,并在类似于 Fluid.System 的数据存储模型中创建了一个数组。然而,我正在努力将步长发送到数据存储模型,并在确定最小 dx 后再次发送它们。

这甚至可能吗?怎么会这样呢?

解决方法

是的,有几种可能性。

如您所述,如果在全局模型中将其实例化为 inner 并在每个管道模型中声明为 outer,则管道可以访问数据存储模型中的变量/参数。与引用 Modelica.FluidFluid.System 模型一样,管道可以访问数据存储模型中的 dx_min

这是一个代码示例,大致基于您的问题:

model Pipe
  outer DataStorage dataStorage;

  Real dx_min = dataStorage.dx_min;
  Real dx "calculated in this model";
  ...
end Pipe;

model DataStorage
  parameter Integer nPipes;
  input Real dx_array[nPipes];
  Real dx_min=min(dx_array);
  ...
end DataStorage;

model GlobalModel
  Pipe pipe1;
  Pipe pipe2;
  inner DataStorage dataStorage(nPipes=2,dx_array={pipe1.dx,pipe2.dx});

  ...
end GlobalModel;

您应该注意不同“dx”的可变性,因为您不能将随时间变化的“dx”分配给声明为 parameter 的“dx”。

如果 DataStorage 模型的唯一目的是获取数组中的最小条目,那么您也可以将其三行代码放在 GlobalModel 中,将代码简化为:

model Pipe
  input Real dx_min;
  Real dx "calculated in this model";
  ...
end Pipe;

model GlobalModel
  parameter Integer nPipes=2;
  Real dx_array[nPipes]={pipe1.dx,pipe2.dx};
  Real dx_min=min(dx_array);

  Pipe pipe1(dx_min=dx_min);
  Pipe pipe2(dx_min=dx_min);

  ...
end GlobalModel;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...