1+ package '10d-Dynamics Analysis' {
2+ import ISQ::*;
3+
4+ package VehicleModel {
5+
6+ part def Vehicle {
7+ attribute mass :> ISQ::mass;
8+ }
9+
10+ }
11+
12+ package DynamicsModel {
13+
14+ calc def Acceleration(p : PowerValue, m : MassValue, v : SpeedValue) : AccelerationValue =
15+ p / (m * v);
16+
17+ calc def Velocity(v0 : SpeedValue, a : AccelerationValue, dt : TimeValue) : SpeedValue =
18+ v0 + a * dt;
19+
20+ calc def Position(x0 : LengthValue, v : SpeedValue, dt : TimeValue) : LengthValue =
21+ x0 + v * dt;
22+
23+ action def StraightLineDynamics {
24+ in power : PowerValue;
25+ in mass : MassValue;
26+ in delta_t : TimeValue;
27+ in x_in : LengthValue;
28+ in v_in : SpeedValue;
29+ out x_out : LengthValue = Position(x_in, v_in, delta_t);
30+ out v_out : SpeedValue = Velocity(v_in, a_out, delta_t);
31+ out a_out : AccelerationValue = Acceleration(power, mass, v_in);
32+ }
33+ }
34+
35+ package AnalysisModel {
36+ import VehicleModel::*;
37+ import DynamicsModel::*;
38+ import SampledFunctions::*;
39+ import ScalarValues::Natural;
40+ import SequenceFunctions::*;
41+
42+ attribute def ScenarioState {
43+ position : LengthValue;
44+ velocity : SpeedValue;
45+ }
46+
47+ attribute def NominalScenario :> SampledFunction {
48+ attribute def TimeStateRecord :> SamplePair {
49+ t : TimeValue :>> domainValue;
50+ s : ScenarioState :>> rangeValue;
51+ }
52+ :>> samples : TimeStateRecord;
53+ n : Natural = size(samples);
54+ }
55+
56+ analysis def DynamicsAnalysis {
57+ subject vehicle : Vehicle;
58+ in attribute powerProfile :> ISQ::power[*];
59+ in attribute initialPosition :> ISQ::length;
60+ in attribute initialSpeed :> ISQ::speed;
61+ in attribute deltaT :> ISQ::time;
62+ return attribute accelerationProfile :> ISQ::acceleration[*] := ();
63+
64+ private attribute position := initialPosition;
65+ private attribute speed := initialSpeed;
66+
67+ for i in 1..powerProfile->size()-1 {
68+ perform action dynamics : StraightLineDynamics {
69+ in power = powerProfile[i];
70+ in mass = vehicle.mass;
71+ in delta_t = deltaT;
72+ in x_in = position;
73+ in v_in = speed;
74+ }
75+ then assign position := dynamics.x_out;
76+ then assign speed := dynamics.v_out;
77+ then assign accelerationProfile := accelerationProfile->including(dynamics.a_out);
78+ }
79+ }
80+ }
81+
82+ }
0 commit comments