1
1
package fr.sncf.osrd.envelope_sim.etcs
2
2
3
+ /* *
4
+ * Formulas are found in `SUBSET-026-3v400.pdf` from the file at
5
+ * https://www.era.europa.eu/system/files/2023-09/index004_-_SUBSET-026_v400.zip and in
6
+ * `SUBSET-041_v400.pdf` from the file at
7
+ * https://www.era.europa.eu/system/files/2023-09/index014_-_SUBSET-041_v400.pdf
8
+ */
9
+
3
10
/* *
4
11
* National Default Value: permission to inhibit the compensation of the speed measurement accuracy.
5
- * See Subset referenced in ETCSBrakingSimulator : table in Appendix A.3.2.
12
+ * See Subset 026 : table in Appendix A.3.2.
6
13
*/
7
14
const val qNvinhsmicperm = false
8
15
9
16
/* *
10
17
* Estimated acceleration during tBerem, worst case scenario (aEst2 is between 0 and 0.4), expressed
11
- * in m/s². See Subset referenced in ETCSBrakingSimulator : §3.13.9.3.2.9.
18
+ * in m/s². See Subset 026 : §3.13.9.3.2.9.
12
19
*/
13
20
const val aEst2 = 0.4
14
21
15
- /* * See Subset referenced in ETCSBrakingSimulator : table in Appendix A.3.1. */
22
+ /* * See Subset 026 : table in Appendix A.3.1. */
16
23
const val dvEbiMin = 7.5 / 3.6 // m/s
17
24
const val dvEbiMax = 15.0 / 3.6 // m/s
18
25
const val vEbiMin = 110.0 / 3.6 // m/s
@@ -22,23 +29,41 @@ const val tDriver = 4.0 // s
22
29
const val mRotatingMax = 15.0 // %
23
30
const val mRotatingMin = 2.0 // %
24
31
25
- /* * See https://www.era.europa.eu/system/files/2023-09/index014_-_SUBSET-041_v400.pdf: §5.3.1.2. */
32
+ /* * See Subset 041: §5.3.1.2. */
33
+ const val vUraMinLimit = 30 / 3.6 // m/s
34
+ const val vUraMaxLimit = 500 / 3.6 // m/s
35
+ const val vUraMin = 2 / 3.6 // m/s
36
+ const val vUraMax = 12 / 3.6 // m/s
37
+
38
+ /* * See Subset 041: §5.3.1.2. */
26
39
fun vUra (speed : Double ): Double {
27
- return if (speed <= 30 / 3.6 ) 2 / 3.6
28
- // vUra(30km/h) = 2km/h & vUra(500km/h) = 12km/h with a linear interpolation in between
29
- // this gives the following equation : y = (x + 64) / 47, still in km/h
30
- else ((speed + 64 ) / 47 ) / 3.6
40
+ return interpolateLinearSpeed(speed, vUraMinLimit, vUraMaxLimit, vUraMin, vUraMax)
31
41
}
32
42
33
- /* * See Subset referenced in ETCSBrakingSimulator : §3.13.9.3.2.10. */
43
+ /* * See Subset 026 : §3.13.9.3.2.10. */
34
44
fun vDelta0 (speed : Double ): Double {
35
45
return if (! qNvinhsmicperm) vUra(speed) else 0.0
36
46
}
37
47
38
- /* * See Subset referenced in ETCSBrakingSimulator : §3.13.9.2.3. */
48
+ /* * See Subset 026 : §3.13.9.2.3. */
39
49
fun dvEbi (speed : Double ): Double {
40
- return if (speed <= vEbiMin) dvEbiMin
41
- else if (speed < vEbiMax)
42
- (dvEbiMax - dvEbiMin) / (vEbiMax - vEbiMin) * (speed - vEbiMin) + dvEbiMin
43
- else dvEbiMax
50
+ return interpolateLinearSpeed(speed, vEbiMin, vEbiMax, dvEbiMin, dvEbiMax)
51
+ }
52
+
53
+ /* *
54
+ * The linear curve is the following: below minSpeedLimit = minSpeed, above maxSpeedLimit =
55
+ * maxSpeed, in between is a linear curve. This method takes a speed input and converts it
56
+ * accordingly.
57
+ */
58
+ private fun interpolateLinearSpeed (
59
+ speed : Double ,
60
+ minSpeedLimit : Double ,
61
+ maxSpeedLimit : Double ,
62
+ minSpeed : Double ,
63
+ maxSpeed : Double
64
+ ): Double {
65
+ return if (speed <= minSpeedLimit) minSpeed
66
+ else if (speed < maxSpeedLimit)
67
+ (maxSpeed - minSpeed) / (maxSpeedLimit - minSpeedLimit) * (speed - minSpeedLimit) + minSpeed
68
+ else maxSpeed
44
69
}
0 commit comments