从 Modelica 模型中提取具有 start 属性的变量列表
Posted
技术标签:
【中文标题】从 Modelica 模型中提取具有 start 属性的变量列表【英文标题】:Extract list of variables with start attribute from Modelica model 【发布时间】:2020-08-08 21:26:18 【问题描述】:有没有一种简单的方法可以从 Modelica 模型中提取具有 start 属性的所有变量的列表?最终目标是运行模拟直到达到稳态,然后运行一个 python 脚本,将 start 属性的值与稳态值进行比较,以便我可以识别选择错误的起始值。
在 Dymola Python 界面中,我找不到这样的功能。另一种方法可能是生成 modelDescription.xml 并对其进行解析,我假设信息在其中的某处可用,但对于这种方法,我也觉得我需要帮助才能开始。
【问题讨论】:
每次模拟后,dsin.txt 中有一个迭代变量列表,因此可能更容易提取 txt 文件的信息。 我想避免解析txt文件。 related:***.com/questions/49065763/…,除了解析XML或者fmu的方法,还有一些针对Modelica的python解析器。 使用 alist.exe 将 dsin.txt 和 dsfinal.txt 转换为 mat 文件 - 更容易加载到 python 中,无需解析 txt 文件。 【参考方案1】:类似于this 答案,您可以使用 FMPy 从 FMU 中的 modelDescription.xml 轻松提取该信息。
这是一个可运行的小例子:
from fmpy import read_model_description
from fmpy.util import download_test_file
from pprint import pprint
fmu_filename = 'CoupledClutches.fmu'
download_test_file('2.0', 'CoSimulation', 'MapleSim', '2016.2', 'CoupledClutches', fmu_filename)
model_description = read_model_description(fmu_filename)
start_vars = [v for v in model_description.modelVariables if v.start and v.causality == 'local']
pprint(start_vars)
【讨论】:
【参考方案2】:经过反复试验,我想出了这个 python 代码 sn-p 从modelDescription.xml
获取信息:
import xml.etree.ElementTree as ET
root = ET.parse('modelDescription.xml').getroot()
for ScalarVariable in root.findall('ModelVariables/ScalarVariable'):
varStart = ScalarVariable.find('*[@start]')
if varStart is not None:
name = ScalarVariable.get('name')
value = varStart.get('start')
print(f"name = value;")
要生成 modelDescription.xml 文件,请使用标志运行 Dymola 翻译Advanced.FMI.GenerateModelDescriptionInterface2 = true;
Python 标准库有几个用于处理 XML 的模块:https://docs.python.org/3/library/xml.html 这个 sn-p 使用 ElementTree。
这只是第一步,不确定我是否错过了一些基本的东西。
【讨论】:
【参考方案3】:文件 dsin.txt 和 dsfinal.txt 可能会帮助您解决这个问题。它们具有相同的结构,在模拟的开始和结束时都有值;通过将 dsfinal.txt 重命名为 dsin.txt,您可以从您在先前运行中计算的(例如稳态)值开始您的模拟。
如果您已经考虑使用这些值来运行其他模拟,则可能值得使用这两个文件。 它们为您提供有关求解器/模拟设置的信息,而您在 .mat 结果文件中找不到这些信息(如果它们对您的案例感兴趣)但是,如果只是比较结果文件中存在的变量的起始值和最终值,更好的选择可能是使用 python 和库来读取 result.mat 文件(dymat、modelicares、等等)。然后就是比较感兴趣信号的起始值。
【讨论】:
谢谢。我可以以某种方式过滤它以仅显示具有 start 属性的变量吗? 有点。如果您滚动到 dsin.txt/dsfinal.txt 的末尾,则有一个解释初始值计算的文档,您似乎可以推断出哪些变量已用起始值定义。但话又说回来,它需要你解析一个 txt 文件,我知道你不喜欢这样做以上是关于从 Modelica 模型中提取具有 start 属性的变量列表的主要内容,如果未能解决你的问题,请参考以下文章
在没有 Modelica CombiTable1D 实例的情况下,无法使用自定义 CombiTable1D 初始化模型
如何在使用 Open Modelica 编译器进行展平步骤后停止编译过程?