/
test_output_grid.py
93 lines (68 loc) · 3.64 KB
/
test_output_grid.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import unittest
import numpy as np
import sys
import os
from fmpy import simulate_fmu
from fmpy.util import download_test_file, download_file
class OutputGridTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("Python:", sys.version)
def test_step_size_cs(self):
url = 'https://github.com/modelica/fmi-cross-check/raw/master/fmus/2.0/cs/win64/Test-FMUs/0.0.2/Dahlquist/Dahlquist.fmu'
sha256 = '6df6ab64705615dfa1217123a103c23384a081763a6f71726ba7943503da8fc0'
download_file(url, checksum=sha256)
h = 0.02
result = simulate_fmu(os.path.basename(url), output_interval=h, stop_time=10)
time = result['time']
grid = np.array(range(501)) * h
self.assertTrue(np.all(time == grid))
def test_step_size_me(self):
# download the FMU and input file
for filename in ['CoupledClutches.fmu', 'CoupledClutches_in.csv']:
download_test_file('2.0', 'me', 'MapleSim', '2016.2', 'CoupledClutches', filename)
# load the input
input = np.genfromtxt('CoupledClutches_in.csv', delimiter=',', names=True)
self.assertTrue(np.sum(input['time'] == 0.9) > 1, msg="Input event expected at t=0.9")
start_time = 0.0
stop_time = 1.5
step_size = 1e-2
output_interval = 2e-2
T2 = 0.5
# common arguments
kwargs = {
'filename': 'CoupledClutches.fmu',
'start_time': start_time,
'stop_time': stop_time,
'fmi_type': 'ModelExchange',
'step_size': step_size,
'output_interval': output_interval,
'input': input,
'start_values': {'CoupledClutches1_T2': T2}
}
# fixed step w/o events
result = simulate_fmu(solver='Euler', record_events=False, **kwargs)
time = result['time']
self.assertAlmostEqual(time[0], start_time, msg="First sample time must be equal to start_time")
self.assertAlmostEqual(time[-1], stop_time, msg="Last sample time must be equal to stop_time")
self.assertTrue(np.all(np.isclose(np.diff(time), output_interval)), msg="Output intervals must be regular")
# fixed step w/ events
result = simulate_fmu(solver='Euler', record_events=True, **kwargs)
time = result['time']
self.assertAlmostEqual(time[0], start_time, msg="First sample time must be equal to start_time")
self.assertAlmostEqual(time[-1], stop_time, msg="Last sample time must be equal to stop_time")
# variable step w/o events
result = simulate_fmu(solver='CVode', record_events=False, **kwargs)
time = result['time']
self.assertAlmostEqual(time[0], start_time, msg="First sample time must be equal to start_time")
self.assertAlmostEqual(time[-1], stop_time, msg="Last sample time must be equal to stop_time")
steps = np.diff(time)
steps = steps[steps > 1e-13] # remove events
self.assertTrue(np.all(np.isclose(steps, output_interval)), msg="Output intervals must be regular")
# variable step w/ events
result = simulate_fmu(solver='CVode', record_events=True, **kwargs)
time = result['time']
self.assertAlmostEqual(time[0], start_time, msg="First sample time must be equal to start_time")
self.assertAlmostEqual(time[-1], stop_time, msg="Last sample time must be equal to stop_time")
self.assertTrue(np.sum(time == 0.9) > 1, msg="Input event expected at t=0.9")
self.assertTrue(np.sum(np.isclose(time, T2)) > 1, msg="Time event expected at t=T2")