【发布时间】:2020-06-06 14:37:43
【问题描述】:
帖子状态:
200313 得到了代码 DEMO_v42 的答案,我接受了赏金!
200310 我对昨天建议的两篇重要论文发表评论。还是不明白如何更新DEMO_v41。
200309 我想强调一下,关键问题是如何在代码DEMO_v41(如果可能的话)中引入流的概念,从而使连接器平衡。作为浓度的变量 c 应该被声明为流,但是应该如何使用 inStream 或 actualStream 更新方程 - 我很高兴看到!
200226 添加了后例 DEMO_v41,它是一个简化的,我希望比第一个 DEMO_v40 更具可读性的代码。
200225 我对给出的答案给出了一些 cmets,并试图让读者将注意力集中在实际问题上,但几乎没有发生什么。
200224 我收到了一些关于帖子的一般性和详细信息。详细的 cmets 价值较低,部分原因是对问题的误解。 Rene 的更一般的回答很好,但过于笼统。在考虑使用 Modelica.Media 等之前,我真的很想通过小例子了解如何使用流的概念。这是一个学习的过程。
我想知道如何正确定义液体的连接器,该液体在溶液中具有多种不同浓度的成分,然后该溶液具有流速。液体中的压力可以忽略不计。 我用了很久的标准连接器是:
connector LiquidCon
nc=5;
Real c[nc] “Component concentrations”;
flow Real F “Flow rate”;
end LiquidCon;
连接器在 JModelica 和 OpenModelica 中运行良好,但我在 OpenModelica 中收到连接器不平衡的警告。在 Modelica 语言规范的第 9.3.1 节中,我看到我的构造实际上是不合法的,请参阅https://www.modelica.org/documents/ModelicaSpec34.pdf。如何制作满足需求的连接器?
我花了一些时间阅读 Fritzons book 2n 版中关于“流”概念的第 5.10 章,但我需要更详细地研究它。
我的简单连接器带来警告的原因是,当您声明一个流变量时,编译器假定另一个变量是该流变量的潜在变量,即至少流和潜在变量的数量必须相同一个连接器。那么当然在我的情况下,成分浓度不是一个潜在的变量,而是编译器无法检测到的。
在第 5.10 章的介绍部分,“流”概念的范围似乎是“......应用具有相关属性的双向物质流......”。在我的应用领域,我怀疑我是否需要考虑双向流。这意味着使用流是一种“矫枉过正”。但这似乎也意味着我也不应该使用“流”的概念,这有点可惜。我们真的要停止使用“流”这个概念吗?流”在这里?
无论如何,我已经尝试整理了一个比 Fritzson 的书中关于该主题的更基本的示例,以了解“流”概念的使用情况以及计算时间等方面的开销.在下面的示例中,我模拟了液体从进料罐到收获罐的流动。流量现在由压力差控制。代码 DEMO_v41 工作并给出连接器不平衡的警告。如果我现在将底物浓度 c 声明为“流”,我现在应该如何使用 inStream 和 actualStream 更新代码以使其以相同的方式工作,但现在使用这个平衡的连接器?
package DEMO_v41
// ---------------------------------------------------------------------------------------------
// Interfaces
// ---------------------------------------------------------------------------------------------
import Modelica.Blocks.Interfaces.RealInput;
import Modelica.Blocks.Interfaces.RealOutput;
// ---------------------------------------------------------------------------------------------
// Equipment
// ---------------------------------------------------------------------------------------------
package EquipmentLib
connector LiquidCon
Real P "Pressure";
flow Real F "Flow rate";
Real c "Substance conc";
end LiquidCon;
model PipeType
LiquidCon inlet, outlet;
parameter Real area = 1;
equation
inlet.F = -outlet.F;
outlet.F = -area^2*(inlet.P - outlet.P); // Linearized Bernoulli equation
outlet.c = inlet.c;
end PipeType;
model FeedtankType
LiquidCon outlet;
parameter Real P = 0.1 "Pressure";
parameter Real V_0 = 100 "Initial feed volume";
parameter Real c_in = 1.0 "Feedtank conc";
Real V(start=V_0, fixed=true) "Feed volume";
equation
outlet.c = c_in;
outlet.P = P;
der(V) = outlet.F;
end FeedtankType;
model HarvesttankType
LiquidCon inlet;
parameter Real P = 0.0 "Pressure";
parameter Real V_0 = 1.0 "Initial harvest liquid volume";
parameter Real m_0 = 0.0 "Initial substance mass";
Real V(start=V_0, fixed=true) "Harvest liquid volume";
Real m(start=m_0, fixed=true) "Substance mass";
Real c "Substance conc";
equation
inlet.P = P;
der(V) = inlet.F;
der(m) = inlet.c*inlet.F;
c = m/V;
end HarvesttankType;
end EquipmentLib;
// ---------------------------------------------------------------------------------------------
// Example of system
// ---------------------------------------------------------------------------------------------
model Test
EquipmentLib.FeedtankType feedtank;
EquipmentLib.HarvesttankType harvesttank;
EquipmentLib.PipeType pipe;
equation
connect(feedtank.outlet, pipe.inlet);
connect(pipe.outlet, harvesttank.inlet);
end Test;
end DEMO_v41;
下面较旧的示例 DEMO_v40 更通用且更难阅读,但自此示例的早期答案以来一直保留以供参考。
我收到的编译 (JModelica 2.14) 错误消息是:“扁平模型中的错误:系统结构单一。以下变量无法与方程式匹配:harvestertank.inlet.c[1]、pipe.outlet.c[1]。 OpenModelica (1.16) 给出了大致相同的信息。这里有什么问题?
package DEMO_v40
// ---------------------------------------------------------------------------------------------
// Interfaces
// ---------------------------------------------------------------------------------------------
import Modelica.Blocks.Interfaces.RealInput;
import Modelica.Blocks.Interfaces.RealOutput;
partial package MediumBase
constant String name "Medium name";
constant Integer nc "Number of substances";
replaceable type Concentration = Real[nc] "Substance conc";
end MediumBase;
package Medium1
extends MediumBase
(name="One component medium",
nc=1);
constant Real[nc] mw = {10} "Substance weight";
constant Integer A = 1 "Substance index";
end Medium1;
record Medium_data
constant String name = Medium1.name;
constant Integer nc = Medium1.nc;
constant Real[nc] mw = Medium1.mw;
constant Integer A = Medium1.A;
end Medium_data;
// ---------------------------------------------------------------------------------------------
// Equipment dependent on the medium
// ---------------------------------------------------------------------------------------------
package EquipmentLib
replaceable package Medium = MediumBase // formal parameter - EquipmentLib
constrainedby MediumBase;
connector LiquidCon
Real P "Pressure";
flow Real F (unit="m3/s") "Flow rate";
stream Medium.Concentration c "Substance conc";
end LiquidCon;
model PipeType
LiquidCon inlet, outlet;
parameter Real area = 1;
equation
inlet.F = -outlet.F;
outlet.F = area^2*(inlet.P - outlet.P); // Linearized Bernoulli equation
for i in 1:Medium.nc loop
outlet.c[i] = inlet.c[i];
end for;
end PipeType;
model FeedtankType
LiquidCon outlet;
parameter Real P = 0.1 "Pressure";
parameter Real V_0 (unit="m3") = 100 "Initial feed volume";
parameter Real[Medium.nc] c_in (each unit="kg/m3")
= {1.0*k for k in 1:Medium.nc} "Feed inlet conc";
Real V(start=V_0, fixed=true, unit="m3") "Feed volume";
equation
for i in 1:Medium.nc loop
outlet.c[i] = c_in[i];
end for;
outlet.P = P;
der(V) = outlet.F;
end FeedtankType;
model HarvesttankType
LiquidCon inlet;
parameter Real P = 0.0 "Pressure";
parameter Real V_0 (unit="m3") = 1.0 "Initial harvest liquid volume";
parameter Real[Medium.nc] m_0
(each unit="kg/m3") = zeros(Medium.nc) "Initial substance mass";
Real[Medium.nc] m
(start=m_0, each fixed=true) "Substance mass";
Real[Medium.nc] c "Substance conc";
Real V(start=V_0, fixed=true, unit="m3") "Harvest liquid volume";
equation
inlet.P = P;
der(V) = inlet.F;
for i in 1:Medium.nc loop
der(m[i]) = inStream(inlet.c[i])*inlet.F;
c[i] = m[i]/V;
end for;
end HarvesttankType;
end EquipmentLib;
// ---------------------------------------------------------------------------------------------
// Adaptation of package Equipment to Medium1
// ---------------------------------------------------------------------------------------------
package Equipment
import DEMO_v40.EquipmentLib;
extends EquipmentLib(redeclare package Medium=Medium1);
end Equipment;
// ---------------------------------------------------------------------------------------------
// Examples of systems
// ---------------------------------------------------------------------------------------------
model Test
Medium_data medium;
Equipment.FeedtankType feedtank;
Equipment.HarvesttankType harvesttank;
Equipment.PipeType pipe;
equation
connect(feedtank.outlet, pipe.inlet);
connect(pipe.outlet, harvesttank.inlet);
end Test;
end DEMO_v40;
【问题讨论】:
-
注意,如果我们采取一种方式,LiquidCon 和 HarvesttankType 中的前缀流不使用 inStream,而是写: der(m[i] = inlet.c[i]*inlet.F then系统工作。所以错误是关于我的使用和缺乏对流和流(或实际流)的理解
-
相关的平衡物理连接器:modelica.org/events/modelica2008/Proceedings/sessions/… 据我了解,流连接器应该只有一个潜在变量和一个流变量,以及任意数量的流变量。
-
相关,流连接器论文:doi.org/10.3384/ecp09430078
-
感谢阅读参考资料,我认为这很重要。实际上,几周前我已经简短地阅读了它们,现在再次阅读。如果我们将焓转换为浓度,则第 3 节中的最后一篇论文“流连接器……”有一个像我这样的连接器。因此,在我的情况下,能量平衡被质量平衡所取代。我的示例是我们在第 3 节中的一个退化版本,类似于图 3。但是,我仍然不清楚如何在代码 DEMO_v41 中以正确的方式使用 inStream()。
标签: modelica openmodelica jmodelica