是否可以将全局值发送到 OpenModelica 中的另一个模型?
Is it possible to send global values to another model in OpenModelica?
我正在尝试在 OpenModelica 中创建一个模型,其中包含几个其他组件(管道、水库)。目前我正在使用交错网格修改 Modelica.Fluid-library 中的管道,并且需要确定整个模型中的最小步长 dx。
是否可以进行以下操作?
- 在管道 1 中计算 dx_1,在管道 2 中计算 dx_2。
- 将dx_1和dx_2发送到全局模型中的数组(类似于Modelica.Fluid.System)。
- 确定最小的dx = min(dx_1,dx_2)并同时传回管道1和管道2
我计算了管道1中的dx_1和管道2中的dx_2,并在类似于Fluid.System的数据存储模型中创建了一个数组。然而,我正在努力将步长发送到数据存储模型,并在确定最小 dx 后再次将它们发送回来。
这可能吗?怎么会这样做呢?
是的,有几种可能性。
正如您提到的,如果在您的全局模型中实例化为 inner
并在每个管道模型中声明为 outer
,则管道可以访问数据存储模型中的 variables/parameters。与引用 Fluid.System
的 Modelica.Fluid
模型一样,管道可以访问数据存储模型中的 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;
我正在尝试在 OpenModelica 中创建一个模型,其中包含几个其他组件(管道、水库)。目前我正在使用交错网格修改 Modelica.Fluid-library 中的管道,并且需要确定整个模型中的最小步长 dx。
是否可以进行以下操作?
- 在管道 1 中计算 dx_1,在管道 2 中计算 dx_2。
- 将dx_1和dx_2发送到全局模型中的数组(类似于Modelica.Fluid.System)。
- 确定最小的dx = min(dx_1,dx_2)并同时传回管道1和管道2
我计算了管道1中的dx_1和管道2中的dx_2,并在类似于Fluid.System的数据存储模型中创建了一个数组。然而,我正在努力将步长发送到数据存储模型,并在确定最小 dx 后再次将它们发送回来。
这可能吗?怎么会这样做呢?
是的,有几种可能性。
正如您提到的,如果在您的全局模型中实例化为 inner
并在每个管道模型中声明为 outer
,则管道可以访问数据存储模型中的 variables/parameters。与引用 Fluid.System
的 Modelica.Fluid
模型一样,管道可以访问数据存储模型中的 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
.
如果 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;