如何在 Modelica 中构建液体平衡连接器?

2024-02-03

帖子状态:

200313 得到了代码 DEMO_v42 的答案,我接受了赏金!

200310 我评论了昨天建议的两篇关键论文。还是不明白如何更新DEMO_v41。

200309 我想强调的是,关键问题是如何在代码DEMO_v41(如果可能的话)中引入流的概念,并以此方式使连接器平衡。作为浓度的变量 c 应该声明为流,但是应该如何使用 inStream 或actualStream 更新方程 - 我很高兴看到!

200226 添加了帖子示例 DEMO_v41,它是一个简化版本,我希望比第一个 DEMO_v40 更具可读性。

200225 我对给出的答案提出了一些评论,并试图让读者将注意力集中在实际问题上,但收效甚微。

200224 我在这篇文章中得到了一些一般和详细的意见。详细的评论价值较低,部分原因是对问题的误解。雷内(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 https://www.modelica.org/documents/ModelicaSpec34.pdf。如何制作出满足要求的连接器?

我花了一些时间阅读 Fritzons 书籍第 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)错误消息是:“扁平化模型中的错误:系统在结构上是单一的。以下变量无法与方程匹配:harvestank.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;

就我个人而言,我会“一路走下去”并使用流连接器,原因如下:

  1. 在过去 15-20 年中,人们进行了许多尝试,以在 Modelica 中创建良好的热液压连接器。这一努力的结果是stream2008 年推出的连接器,目前是 Modelica 中最先进的连接器。它允许您用一种方法传输特定的焓和物质分数(或物质浓度)flow变量,它可以实现流动逆转。使用stream连接器是not矫枉过正。
  2. 遵守例如Modelica.Fluid.Interfaces.FluidPort,您的工作将与许多现有的库和模型兼容,并且您不需要自己制作泵、管道、阀门、水箱模型等。

不过,您将面临一些挑战:

  1. 您需要学习语法和工作原理stream连接器。您可以在以下位置找到灵感https://github.com/justnielsen/ModelicaTutorials https://github.com/justnielsen/ModelicaTutorials
  2. 您必须实现一个基于的中等模型Modelica.Media用于您将在流连接器中输送的流体。例如,如果您可以假设恒定的密度和/或比热容,则介质模型不必非常复杂。如果介质模型很简单,则在指定边界条件(源/汇)时,在计算上很容易在体积/质量流量之间切换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Modelica 中构建液体平衡连接器? 的相关文章

  • 在 Dymola 中编译大型数组

    请考虑以下小型 Modelica 模型和功能 model VectorizeDemo parameter Integer na 5 final parameter Integer nb 2 na final parameter Real a
  • 从平面 Modelica 代码中提取类型/类名

    我想知道是否已经存在从平面 Modelica 代码中提取所有变量及其相应类型 分别为类名 的可能性 例如 给定扁平 Modelica 模型的摘录 constant Integer nSurfaces 8 constant Integer c
  • 具有不同采样范围的采样函数的替代方案

    有没有替代方案样本函数在 Openmodelica 中 它接受不属于的参数type parameter 也就是说 替代方案应该允许在模拟期间对可变范围的值进行采样 最终目标是创建一个类 我可以用它来测量模拟过程中真实信号的 RMS 值 RM
  • Modelica 类图

    我正在寻找一种可以 自动 从 Modelica 代码创建类图的工具 https trac modelica org Modelica attachment ticket 85 classDiagramModelicaMedia png我需要
  • 如何在 Dymola (Modelica) 中使用 /bigobj 进行编译

    我正在将一个相对较小的有限元 FE 模型集成到 Modelica 中 为此 我创建了一个模型 Modelica 类 它可以读取 Matlab 二进制文件格式的质量 M 和刚度 K 矩阵 我将 FE 模型与 Modelica 标准库 Mode
  • 非线性代数方程的初步猜测

    我有一个非线性代数方程组需要求解 如何使用计算值 具有连续时间变化 作为解变量的初始猜测 而不是使用参数作为起始值 初始方程部分可以用于此目的吗 我创建了一个测试模型来解释这个问题 model Teststartvalue Real val
  • 何时在 Modelica 语言中使用 noEvent 运算符?

    Modelica 中的 noEvent 运算符不使用迭代来查找触发事件的精确时刻 看来这会导致计算错误 这是我在以下网站上找到的示例https mbe modelica university behavior discrete decay
  • Ubuntu 18.04 中 Python 3 环境中的 PyFMI

    我的目标是能够在 Ubuntu 18 04 中运行 OpenModelica 生成的 FMU 然后在 Python 3 环境中使用 PyFMI 运行它们 我按照此处的 PyFMI 安装大纲进行操作https jmodelica org py
  • Modelica 仿真和方程初始化总时间计算

    我想测量 DAE 系统的总模拟和初始化时间 我对挂钟时间感兴趣 就像 Matlab 中函数 tic toc 给出的时间 我注意到在 Modelica 中 模拟时间有不同的标志 但实际上 与我按下模拟按钮到模拟结束所经过的时间 大约用手机时钟
  • 使用 python 进行 Modelica 参数研究

    我想使用 python 在不同的 modelica 建筑库 建筑物 IDEAS 中运行参数研究 例如 更改渗透率 我尝试过 simulateModel和simulateExtendedModel zone n50 value 我的问题 为什
  • Modelica - Dymola Python 界面:将输出格式设置为文本

    我通过 Dymola Python 界面使用 Dymola 运行 Modelica 模拟 我的目标是将结果文件写入文本输出 即写入 txt文件 即使我的模型包含注释 Dymola experimentSetupOutput textual
  • 仿真期间的 Modelica 输出文件

    我进行了很长时间的模拟 并且需要在模拟继续时检查输出 另一个原因是我正在进行实时模拟 所以我也想实时查看输出 如果 OpenModelica 在模拟过程中创建一个输出文件 以便我可以使用第 3 方工具 也许是 Python 读取并绘制它 那
  • 如何在 modelica 中进行局部敏感性分析

    我想在 Dymola 中进行局部敏感性分析 以评估影响建筑物 多户住宅 能耗的不同参数 谁能给我一些建议 如何在 Dymola Modelica 软件中做到这一点 您可以将模型导出为 FMU 然后按照多种不同路径之一使用 FMU 进行敏感性
  • 如何在 Dymola 中隐藏模拟变量

    模拟模型后是否可以隐藏对象或输出 我有很多东西 我觉得我在浪费时间筛选它们试图找到我的正确答案 如果没有 有没有办法组织我的输出在模拟选项卡中的显示方式 Thanks Dymola 的主要可能性是 使组件受到保护 默认情况下 受保护的组件不
  • 单元测试 Modelica 组件库?

    我正在 Modelica 中创建一个组件库 并且希望获得一些有关对包进行单元测试的技术的意见 到目前为止 我有一个测试包 由一组模型组成 每个组件一个模型 每个测试模型都会实例化一个组件 并将其连接到一些非常简单的帮助器类 这些类提供必要的
  • 不同 Modelica 仿真环境之间有什么区别?

    有不同的 Modelica 仿真环境 包括 Dymola Wolfram SystemModeler OpenModelica 和 Jmodelica 所以 我尝试加载热流体库 ThermoSysProhttps github com Dw
  • 在 Modelica 模拟中包含因果关系会导致模型扁平化时出现平移错误

    我想模拟基于能量工作的质量弹簧模型的控制器 model model parameters parameter Real m 1 parameter Real k 1 parameter Real Fmax 3 parameter Real
  • 如何将一个向量的参数插入另一个向量?

    我有一个大小为 5 的 重心 向量 parameter Length barycenters 5 1 2 3 4 5 我想将此向量的参数添加到另一个大小为 7 的向量 b prime 中 这意味着打算让 b prime 0 1 2 3 4
  • Ubuntu 18.04 上的 JModelica

    你好 JModelica 社区 我已经成功在 CentOS 上编译 JModelica 但在 Ubuntu 18 04 上仍然失败 编译本身是成功的 但是运行 from pyjmi examples import cstr casadi c
  • 使用 pyFMI 进行模拟时出现 CVodeError

    我尝试在 Anaconda Python 3 6 8 上设置 pyFMI 安装 pyFMI 站点上列出的所有必需软件包 fmu 加载没有问题 但当我尝试模拟 fmu 时 出现错误 Could not find cannot import n

随机推荐

  • R 列数

    我想使用ave在数据框上的许多列 数十列 上运行的函数 ave df the cols df c site month FUN mean 问题是ave运行mean作用于所有the cols列在一起 有什么方法可以为每个运行它the cols
  • Maven 编译器插件配置了 Java 7 但仍然编译 Java 8 代码

    在我的项目中 我们将使用 Java 7maven compiler plugin并且我们假设在 Maven 编译后 所有使用 Java 8 的代码都不应编译成功 但是 就我而言 有一个文件使用Arrays stream T array 它可
  • 在 C# 中使用 Microsoft Office Interop Word 的文档中的不同首页

    如何使用 Microsoft office interop word 在文档中创建不同的首页页眉和页脚 我尝试过以下代码 但仅在第一页中出现页眉和页脚 我想要以另一种方式 首页不应该有页眉和页脚 谁能帮帮我吗 我尝试了很多 Microsof
  • AntiForgeryToken 过期空白页

    我将 IdentityServer4 与 ASP NET Core 2 2 一起使用 在 登录后 方法中 我应用了 ValidateAntiForgeryToken 通常 在登录页面停留 20 分钟到 2 小时后尝试登录 会出现一个空白页面
  • 如何编写递归函数来反转链表?

    我想用 Python 来做这件事 我不想只是反向打印它 而是实际上反转给定的节点 我见过其他语言的实现 但在 Python 中找不到示例 我试图在一个函数中完成它 但如果需要辅助函数 那就这样吧 def reverse item tail
  • 更新嵌套对象 firebase

    来自 Firebase 注释 给定一个单一的关键路径 例如alanisawesome updateChildren 仅更新第一个子级别的数据 并且超出第一个子级别传入的任何数据都将被视为setValue 手术 多路径行为允许更长的路径 例如
  • 如何在Flutter中获取当前时区区域(tz数据库名称)

    我是 flutter 新手 我的其余 api 将当前时区设置为欧洲 伦敦 我不知道如何在颤振中获取当前时区 stackoverflow 上有一个关于这个主题的问题 但没有用户给出答案 Flutter 时区 作为 ZoneId https s
  • Foundation 5 网格推拉

    我正在使用 Foundation 5 并尝试在移动屏幕上实现以下 DIV 布局 A B C D E 我希望在桌面屏幕上显示如下
  • 使用 AndroidPlot 自定义图表上的点

    任何使用过 AndroidPlot 库的人都会告诉我如何在图表上绘制自定义点 到目前为止 我正在使用 LineAndPointRenderer 类并将线条设置为透明 我想至少改变点的大小 但如果可能的话有一个自定义图像 P S 拥有 150
  • JavaScript - 测试整数

    我有一个文本字段 允许用户输入他们的年龄 我正在尝试使用 JavaScript 对此字段进行一些客户端验证 我已经有了服务器端验证 但是 我似乎无法验证用户是否输入了实际的整数 我目前正在尝试以下代码 function IsValidAge
  • 编辑单元格时刷新行

    我对这个 JTable 有问题 我像这样编辑一个单元格 然后我按 Enter 键提交更改 在这里 我希望表 GUI 能够刷新新值 但它们没有显示 只有当我像这样更改选择时才会显示 fireTableCellUpdated inRow inC
  • 用于运行任务名称中包含连字符的 Ant 任务的命令行

    任务名称以连字符 开头
  • 如何在同一个按钮上使用反应路由器和反应滚动?

    我想在同一个导航链接上使用反应路由器和反应滚动 如果我在主页上 我希望按钮具有反应滚动行为 如果我在不同的页面上 按钮需要返回主页 然后滚动到首选组件 反应滚动行为 这是我的想法 但它不能正常工作 import Link from reac
  • 使用 kubernetes nginx-ingress 反向代理具有 SNI 支持的站点

    我正在使用 kubernetes nginx ingress 设置反向代理 但我不知道如何将 nginx 参数添加到配置中 具体来说 proxy ssl 服务器名称 http nginx org en docs http ngx http
  • 如何在其他代码行同时执行的同时播放声音?

    我希望我的代码能够执行此操作 但要在后台播放音乐 import time while True print ligma time sleep 1 5 我试过这个 import time import winsound while True
  • 为什么我的数组加载后会清空?

    我一定错过了一些基本的东西 但我似乎无法保持我的数组加载 它加载成功 但当它出现在另一个函数中时 它变成空的 我的目标是从位置数组中随机选择一个城市 地图视图加载了我的所有注释 但是当我在注释出现后调用 pickRandomNumber 时
  • 无法连接到 Poloniex

    我正在尝试连接到 Poloniex 为了进行连接 我使用 WynthShop 和以下代码 public class Program public static void Main string args var channelFactory
  • Oracle Database12c ORA 01918 和连接错误

    我已经安装了 Oracle 12c 但在创建和使用第一个数据库时遇到问题 我运行 SQL Developer 并使用 hr 用户 但它一直告诉我该帐户已锁定 我搜索了 stackoverflow 答案和官方文档 并尝试使用以下方法解锁它 A
  • WPF ShowDialog 在第二次调用时立即返回 null

    我认为这是 WPF 框架中的一个错误 没有深入了解我的程序以及为什么我要做我正在做的事情 我编写了一个简单的测试应用程序来证明我的理论 这个问题能否得到证实 在将应用程序放入其运行循环之前执行一系列对话框有哪些可能的解决方法 using S
  • 如何在 Modelica 中构建液体平衡连接器?

    帖子状态 200313 得到了代码 DEMO v42 的答案 我接受了赏金 200310 我评论了昨天建议的两篇关键论文 还是不明白如何更新DEMO v41 200309 我想强调的是 关键问题是如何在代码DEMO v41 如果可能的话 中