Modelica - отображение немодельной функции на модель

Если у меня есть немодельная функция, у которой нет ввода и вывода, например

void foo(void)
{
  variable1;
  variable2;
  for loop
   {
     if conditions
   }
  variable2=foobar(); // another function call, foobar() is not modelica function

}

тогда я могу смоделировать это, как показано ниже, в modelica?

model foo
 variable1;
 variable2;

algorithm
for loop
   {
     if conditions
   }
 variable2 :=foobar(); //foobar here is modelica function
end foo;

person shilu    schedule 20.11.2013    source источник


Ответы (2)


Вообще-то ваше описание немного тревожит. Если у вашей функции нет входов и выходов, какой смысл ее вызывать?

Я предполагаю, что ваша функция имеет побочные эффекты. Но если вы вызываете функции с побочными эффектами из Modelica, вам нужно быть предельно осторожным, потому что, вообще говоря, вы не можете контролировать, когда они вызываются. Например, они будут вызываться для так называемых «возможных решений», а также для фактических шагов моделирования.

Поэтому было бы лучше, если бы вы немного подробнее рассказали о том, что делает эта функция. Это не только поможет решить, как вы могли бы выразить это в Modelica, но также может продемонстрировать, что вашу функцию лучше оставить как код C и вместо этого вызывать через интерфейс внешней функции в Modelica.

person Michael Tiller    schedule 21.11.2013
comment
да. функция имеет побочные эффекты, поскольку она изменяет значение глобальной переменной. Мне было интересно, как лучше всего смоделировать такую ​​функцию. Передать его как параметр функции? - person shilu; 22.11.2013
comment
Если функция имеет побочные эффекты, вы должны указать ее ключевым словом impure, чтобы решатели Modelica знали, что она имеет побочные эффекты. - person Michael Tiller; 24.11.2013

Возможно, вы захотите быстро взглянуть на красивую шпаргалку http://modref.xogeny.com/, чтобы узнайте, как делать циклы for. Также, когда вы находитесь внутри разделов алгоритма, вы должны использовать присваивания вместо уравнений:

algorithm
...
variable2 := foobar(); //foobar here is modelica function
person Dietmar Winkler    schedule 20.11.2013