Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions src/fmpy/model_description.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ class SimpleType:
quantity: str | None = field(default=None, repr=False)
unit: str | None = None
displayUnit: str | None = field(default=None, repr=False)
relativeQuantity: str | None = field(default=None, repr=False)
relativeQuantity: bool = field(default=False, repr=False)
min: str | None = field(default=None, repr=False)
max: str | None = field(default=None, repr=False)
nominal: str | None = field(default=None, repr=False)
Expand Down Expand Up @@ -253,7 +253,7 @@ class ModelVariable:
displayUnit: str | None = field(default=None, repr=False)
"Default display unit"

relativeQuantity: bool = field(default=False, repr=False)
relativeQuantity: bool | None = field(default=None, repr=False)
"Relative quantity"

min: str | None = field(default=None, repr=False)
Expand Down Expand Up @@ -738,10 +738,14 @@ def get_fmu_state_attributes(element, object):

first = t[0] # first element

attrib = dict(first.attrib)

attrib["relativeQuantity"] = attrib.get("relativeQuantity") in {"true", "1"}

simple_type = SimpleType(
name=t.get('name'),
type=first.tag[:-len('Type')] if is_fmi1 else first.tag,
**dict(first.attrib)
**attrib
)

# add enumeration items
Expand All @@ -762,7 +766,11 @@ def get_fmu_state_attributes(element, object):
'EnumerationType'}:
continue

simple_type = SimpleType(type=t.tag[:-4], **dict(t.attrib))
attrib = dict(t.attrib)

attrib["relativeQuantity"] = attrib.get("relativeQuantity") in {"true", "1"}

simple_type = SimpleType(type=t.tag[:-4], **attrib)

# add enumeration items
for item in t.findall('Item'):
Expand Down Expand Up @@ -850,7 +858,8 @@ def get_fmu_state_attributes(element, object):
if sv.type in ['Real', 'Float32', 'Float64']:
sv.unit = value.get('unit')
sv.displayUnit = value.get('displayUnit')
sv.relativeQuantity = value.get('relativeQuantity') in {'true', '1'}
if "relativeQuantity" in value:
sv.relativeQuantity = value.get('relativeQuantity') in {'true', '1'}
sv.derivative = value.get('derivative')
sv.nominal = value.get('nominal')
sv.unbounded = value.get('unbounded') in {'true', '1'}
Expand Down Expand Up @@ -1147,7 +1156,7 @@ def set_attributes(element, object, attributes):
("quantity", None),
("unit", None),
("displayUnit", None),
("relativeQuantity", None),
("relativeQuantity", False),
("min", None),
("max", None),
("nominal", None),
Expand Down Expand Up @@ -1208,7 +1217,7 @@ def set_attributes(element, object, attributes):
("quantity", None),
("unit", None),
("displayUnit", None),
("relativeQuantity", False),
("relativeQuantity", None),
("min", None),
("max", None),
("nominal", None),
Expand Down Expand Up @@ -1387,7 +1396,7 @@ def set_attributes(element, object, attributes):
("quantity", None),
("unit", None),
("displayUnit", None),
("relativeQuantity", None),
("relativeQuantity", False),
("min", None),
("max", None),
("nominal", None),
Expand Down
21 changes: 16 additions & 5 deletions src/fmpy/simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -500,9 +500,9 @@ def apply_start_values(fmu, model_description, start_values, settable=None):
unit = None

if unit is None or unit == variable.unit:
pass
...
elif variable.declaredType is not None and unit == variable.declaredType.unit:
pass
...
else:
if variable.unit is not None:
base_unit = variable.unit
Expand All @@ -516,7 +516,18 @@ def apply_start_values(fmu, model_description, start_values, settable=None):
raise Exception(f'The unit "{unit}" of the start value for variable {variable.name} is not defined.')

display_unit = unit_definitions[base_unit][unit]
value = (value - display_unit.offset) / display_unit.factor

is_relative_quantity = False

if variable.relativeQuantity is not None:
is_relative_quantity = variable.relativeQuantity
elif variable.declaredType and variable.declaredType.relativeQuantity is not None:
is_relative_quantity = True

if is_relative_quantity:
value = value / display_unit.factor
else:
value = (value - display_unit.offset) / display_unit.factor

vr = variable.valueReference

Expand Down Expand Up @@ -544,8 +555,8 @@ def apply_start_values(fmu, model_description, start_values, settable=None):
value = value.split()
value = list(map(lambda e: variable._python_type(e), value))
if len(value) != np.prod(variable.shape):
raise ArgumentError(f'The start value for variable "{variable.name}" must have'
f' {np.prod(variable.shape)} elements but has {len(value)}.')
raise Exception(f'The start value for variable "{variable.name}" must have'
f' {np.prod(variable.shape)} elements but has {len(value)}.')
else:
value = [variable._python_type(value)]

Expand Down
Loading