Извлечь список переменных с атрибутом start из модели Modelica - PullRequest
2 голосов
/ 25 апреля 2020

Есть ли простой способ извлечь список всех переменных с атрибутом start из модели Modelica? Конечная цель - запустить симуляцию, пока она не достигнет устойчивого состояния, а затем запустить скрипт python, который сравнивает значения атрибута start со значением стационарного состояния, чтобы я мог определить начальные значения, которые были выбраны неправильно.

В интерфейсе Dymola Python я не смог найти такую ​​функциональность. Другой подход может состоять в том, чтобы сгенерировать modelDescription. xml и проанализировать его, я предполагаю, что информация где-то там есть, но для этого подхода я также чувствую, что мне нужна помощь, чтобы начать работу.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2020

После некоторых проб и ошибок я создал этот фрагмент кода python, чтобы получить эту информацию из 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
В этом фрагменте используется ElementTree.

Это всего лишь первый шаг, но я не уверен, что что-то пропустил. c.

3 голосов
/ 29 апреля 2020

Подобно этому ответу, вы можете легко извлечь эту информацию из описания модели. xml внутри FMU с FMPy.

Вот небольшой исполняемый пример:

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)
3 голосов
/ 27 апреля 2020

Файлы dsin.txt и dsfinal.txt могут помочь вам в этом. Они имеют одинаковую структуру со значениями в начале и в конце моделирования; переименовав dsfinal.txt в dsin.txt, вы можете начать симуляцию с (например, установившегося) значения, которое вы вычислили в предыдущем прогоне.

  • Возможно, стоит поработать с этими двумя файлами, если вы уже имеете в виду использовать такие значения для запуска других симуляций.
  • Они дают вам информацию о решателях / настройках симуляции, что вы не найдете в файлах результатов .mat (если они представляют интерес для вашего случая)

Однако, если это только сравнение между начальными и конечными значениями переменных, которые присутствуют в любом случае, в файлах результатов лучше выбрать python и библиотеку для чтения файла result.mat (dymat, modelicares, et c). Затем необходимо сравнить начальные и конечные значения сигналов, представляющих интерес.

...