Ошибка производных по направлениям (FMU для обмена моделями)

Я использую FMU, сгенерированные OpenModelica из FMPy и PyFMI.

Когда я пытаюсь получить направленные производные из FMU, возникают сбои (с обеими библиотеками).

FMU генерируются из консоли:

c:\openmodelica1.13.0-dev-64bit\bin\omc -n=1 -d=-disableDirectionalDerivatives --postOptModules+=wrapFunctionCalls fmu.mos > error_fmu.txt 2>&1

Я что-то делаю не так или это ошибка в коде FMU?

fmu.mos

loadModel(Modelica);
loadFile("E10_linear.mo");
translateModelFMU(E10_linear,version="2",fmuType="me", platforms={"static"}); 
getErrorString();

E10_linear.mo

model E10_linear
  // Parameters
  parameter Real a = 10.0;
  // Variables
  Real x(start = 1.0, fixed = true);

equation

  der(x) = a;

annotation(
    experiment(StartTime = 0, StopTime = 2, Tolerance = 1e-06, Interval = 1));
end E10_linear;

pyfmi_test_script.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*-

import os as O

import matplotlib
import matplotlib.pyplot as plt

import numpy as N

from pyfmi import load_fmu

curr_dir = O.path.dirname(O.path.abspath(__file__));
path_to_fmus = O.path.join(curr_dir, 'FMUs') # The FMU must be in this folder!!!!!!


def run_fmu_native(filename, list_seed_vector, with_plots=True):
    """E10_linear (native) 

    Based on https://jmodelica.org/pyfmi/_modules/pyfmi/examples/fmi_bouncing_ball_native.html#run_demo

    """
    fmu_name = O.path.join(path_to_fmus, filename)
    model = load_fmu(fmu_name)

    Tstart = 0.0 #The start time.
    Tend   = 2.0 #The final simulation time.

    model.time = Tstart #Set the start time before the initialization.

    #Initialize the model. Also sets all the start attributes defined in the 
    # XML file.
    model.initialize() 

    #Get Continuous States
    x = model.continuous_states
    #Get the Nominal Values
    x_nominal = model.nominal_continuous_states
    #Get the Event Indicators
    event_ind = model.get_event_indicators()

    # Snippet from https://jmodelica.org/pyfmi/pyfmi.html#pyfmi.fmi.FMUModelBase2.get_directional_derivative
    assert model.get_capability_flags()["providesDirectionalDerivatives"]==True #Assert directional derivatives are provided

    states = model.get_states_list()
    states_references = [s.value_reference for s in states.values()]
    derivatives = model.get_derivatives_list()
    derivatives_references = [d.value_reference for d in derivatives.values()]

    print('state_references: {}'.format(states_references))
    print('derivatives_references: {}'.format(derivatives_references))
    print('seed vector: {}'.format(list_seed_vector))

    dd = model.get_directional_derivative(states_references, derivatives_references, list_seed_vector)

    #print('dd: {}'.format(dd))

if __name__ == "__main__":

    run_fmu_native('E10_linear.fmu', [1], with_plots=True)

Спасибо!!!


person Neotake    schedule 05.06.2018    source источник
comment
Скрипт pyfmi_test_script.py работает правильно, если FMU сгенерирован из другого программного обеспечения. Итак, я думаю, что это ошибка в коде FMU. Спасибо!!   -  person Neotake    schedule 12.06.2018


Ответы (2)


В OpenModelica была исправлена ​​ошибка. В следующем выпуске 1.13 производные по направлению снова должны работать правильно.

person Willi    schedule 05.07.2018

Я думаю, что реализация направленных производных для экспорта FMU не очень хорошо протестирована на большинстве платформ. JModelica в последнее время добилась в этом большого прогресса. Вы можете попытаться сгенерировать FMU с помощью JModelica, который их предоставляет (для этого есть флаг компилятора). Мы тестируем это, и это работает для большинства наших тестов.

person Hubertus    schedule 06.06.2018
comment
Спасибо, @Hubertus !!, я не пробовал, потому что читал о поддержке направленных производных, но, как известно, в некоторых случаях в Руководстве пользователя Jmodelica.org есть ограничения. Приятно знать :) Я хочу сгенерировать FMU крупномасштабных моделей жидкости. У вас есть приблизительная оценка ограничения компилятора JModelica FMU? - person Neotake; 07.06.2018
comment
Я не могу найти флаг для включения направленных производных в FMU JModelica. Пожалуйста, не могли бы вы дать мне указание? - person Neotake; 12.06.2018