Skip to content

Commit aad6885

Browse files
committed
Set Float32 inputs in FMI3GetInitial*()
1 parent c7793e2 commit aad6885

File tree

5 files changed

+44
-28
lines changed

5 files changed

+44
-28
lines changed

FMI/FMI3/Functions/FMI3GetInitialFloat32.mo

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ impure function FMI3GetInitialFloat32
99

1010
input Real _time;
1111

12+
input FMI3ValueReference float32InputValueReferences[:] = fill(0, 0);
13+
input FMI3Float32 float32InputValues[:] = fill(0.0, 0);
14+
1215
input FMI3ValueReference float64InputValueReferences[:] = fill(0, 0);
1316
input FMI3Float64 float64InputValues[:] = fill(0.0, 0);
1417

@@ -24,6 +27,7 @@ impure function FMI3GetInitialFloat32
2427

2528
algorithm
2629

30+
FMI3SetFloat32(instance, float32InputValueReferences, float32InputValues);
2731
FMI3SetFloat64(instance, float64InputValueReferences, float64InputValues);
2832
FMI3SetInt32(instance, int32InputValueReferences, int32InputValues);
2933
FMI3SetBoolean(instance, booleanInputValueReferences, booleanInputValues);

FMI/FMI3/Functions/FMI3GetInitialFloat64.mo

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ impure function FMI3GetInitialFloat64
99

1010
input Real _time;
1111

12+
input FMI3ValueReference float32InputValueReferences[:] = fill(0, 0);
13+
input FMI3Float32 float32InputValues[:] = fill(0.0, 0);
14+
1215
input FMI3ValueReference float64InputValueReferences[:] = fill(0, 0);
1316
input FMI3Float64 float64InputValues[:] = fill(0.0, 0);
1417

@@ -24,6 +27,7 @@ impure function FMI3GetInitialFloat64
2427

2528
algorithm
2629

30+
FMI3SetFloat32(instance, float32InputValueReferences, float32InputValues);
2731
FMI3SetFloat64(instance, float64InputValueReferences, float64InputValues);
2832
FMI3SetInt32(instance, int32InputValueReferences, int32InputValues);
2933
FMI3SetBoolean(instance, booleanInputValueReferences, booleanInputValues);

modelica_fmi/src/modelica_fmi/import_fmu_to_modelica.py

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from typing import Literal
2+
3+
14
def import_fmu_to_modelica(fmu_path, model_path, interface_type='CoSimulation', variables=None):
25

36
from os import makedirs
@@ -6,6 +9,7 @@ def import_fmu_to_modelica(fmu_path, model_path, interface_type='CoSimulation',
69

710
import jinja2
811
from fmpy import extract, read_model_description
12+
from fmpy.model_description import ScalarVariable
913
from fmpy.util import sha256_checksum
1014

1115
fmu_path = Path(fmu_path)
@@ -273,40 +277,44 @@ def shape(variable):
273277
s.append(int(dimension.start if dimension.start else variables[dimension.valueReference].start))
274278
return tuple(s)
275279

276-
def dependencies3(variable, type):
280+
def dependencies3(variable: ScalarVariable, types: list[str]):
277281

278-
unknowns = list(filter(lambda u: u.variable.name == variable.name, model_description.initialUnknowns))
282+
arguments = []
279283

280-
if not unknowns:
281-
return ''
284+
for type in types:
282285

283-
unknown = unknowns[0]
286+
unknowns = list(filter(lambda u: u.variable.name == variable.name, model_description.initialUnknowns))
284287

285-
vrs = []
286-
values = []
288+
if not unknowns:
289+
continue
287290

288-
for dependency in unknown.dependencies:
291+
unknown = unknowns[0]
289292

290-
if dependency.type != type or dependency.causality != 'input':
291-
continue
293+
vrs = []
294+
values = []
292295

293-
vrs.append(str(dependency.valueReference))
294-
s = shape(dependency)
296+
for dependency in unknown.dependencies:
295297

296-
if not s:
297-
values.append(name(dependency))
298-
elif len(s) == 1:
299-
for i in range(1, numel(dependency) + 1):
300-
values.append(f'{name(dependency)}[{i}]')
301-
elif len(s) == 2:
302-
for i in range(1, s[0] + 1):
303-
for j in range(1, s[1] + 1):
304-
values.append(f'{name(dependency)}[{i},{j}]')
298+
if dependency.type != type or dependency.causality != 'input':
299+
continue
305300

306-
if not vrs:
307-
return ''
301+
vrs.append(str(dependency.valueReference))
302+
s = shape(dependency)
303+
304+
if not s:
305+
values.append(name(dependency))
306+
elif len(s) == 1:
307+
for i in range(1, numel(dependency) + 1):
308+
values.append(f'{name(dependency)}[{i}]')
309+
elif len(s) == 2:
310+
for i in range(1, s[0] + 1):
311+
for j in range(1, s[1] + 1):
312+
values.append(f'{name(dependency)}[{i},{j}]')
313+
314+
if vrs:
315+
arguments.append(f'{type.lower()}InputValueReferences' + '={' + ', '.join(vrs) + '}, ' + f'{type.lower()}InputValues=' + '{' + ', '.join(values) + '}, ')
308316

309-
return f'{type.lower()}InputValueReferences' + '={' + ', '.join(vrs) + '}, ' + f'{type.lower()}InputValues=' + '{' + ', '.join(values) + '}, '
317+
return ''.join(arguments)
310318

311319
template.globals.update({
312320
'as_array': as_array,

modelica_fmi/src/modelica_fmi/templates/FMI2_CS.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ equation
9393
@@ for variable in continuousOutputs @@
9494

9595
if initial() then
96-
@=name(variable)=@ = FMI2GetInitialReal(instance, startTime, @=dependencies3(variable, 'Real')=@@=dependencies3(variable, 'Integer')=@@=dependencies3(variable, 'Boolean')=@valueReference=@=variable.valueReference=@);
96+
@=name(variable)=@ = FMI2GetInitialReal(instance, startTime, @=dependencies3(variable, ['Real', 'Integer', 'Boolean'])=@valueReference=@=variable.valueReference=@);
9797
else
9898
@=name(variable)=@ = outputVariables.@=name(variable)=@;
9999
end if;

modelica_fmi/src/modelica_fmi/templates/FMI3_CS.mo

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,11 @@ equation
116116

117117
if initial() then
118118
@@ if not variable.dimensions @@
119-
@=name(variable)=@ = scalar(FMI3GetInitial@=fmi_type(variable)=@(instance, startTime, @=dependencies3(variable, 'Float64')=@@=dependencies3(variable, 'Int32')=@@=dependencies3(variable, 'Boolean')=@valueReference=@=variable.valueReference=@, nValues=1));
119+
@=name(variable)=@ = scalar(FMI3GetInitial@=fmi_type(variable)=@(instance, startTime, @=dependencies3(variable, ['Float32', 'Float64', 'Int32', 'Boolean'])=@valueReference=@=variable.valueReference=@, nValues=1));
120120
@@ elif variable.dimensions|length == 1 @@
121-
@=name(variable)=@ = FMI3GetInitial@=fmi_type(variable)=@(instance, startTime, @=dependencies3(variable, 'Float64')=@@=dependencies3(variable, 'Int32')=@@=dependencies3(variable, 'Boolean')=@valueReference=@=variable.valueReference=@, nValues=size(@=name(variable)=@, 1));
121+
@=name(variable)=@ = FMI3GetInitial@=fmi_type(variable)=@(instance, startTime, @=dependencies3(variable, ['Float32', 'Float64', 'Int32', 'Boolean'])=@valueReference=@=variable.valueReference=@, nValues=size(@=name(variable)=@, 1));
122122
@@ else @@
123-
@=name(variable)=@ = FMI3GetInitial@=fmi_type(variable)=@Matrix(instance, startTime, @=dependencies3(variable, 'Float64')=@@=dependencies3(variable, 'Int32')=@@=dependencies3(variable, 'Boolean')=@valueReference=@=variable.valueReference=@, m=size(@=name(variable)=@, 1), n=size(@=name(variable)=@, 2), nValues=product(size(@=name(variable)=@)));
123+
@=name(variable)=@ = FMI3GetInitial@=fmi_type(variable)=@Matrix(instance, startTime, @=dependencies3(variable, ['Float32', 'Float64', 'Int32', 'Boolean'])=@valueReference=@=variable.valueReference=@, m=size(@=name(variable)=@, 1), n=size(@=name(variable)=@, 2), nValues=product(size(@=name(variable)=@)));
124124
@@ endif @@
125125
else
126126
@=name(variable)=@ = outputVariables.@=name(variable)=@;

0 commit comments

Comments
 (0)