@dnv-plant/typescriptpws 1.0.70 → 1.0.73-alpha.1902013

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/index.ts +2 -2
  2. package/jest.config.js +5 -0
  3. package/package.json +6 -6
  4. package/src/calculations/applicationTools.ts +2 -2
  5. package/src/calculations/discharge.ts +2 -2
  6. package/src/calculations/dispersion.ts +2 -2
  7. package/src/calculations/dispersionView.ts +2 -2
  8. package/src/calculations/fireball.ts +2 -2
  9. package/src/calculations/jetFire.ts +2 -2
  10. package/src/calculations/lateExplosion.ts +2 -2
  11. package/src/calculations/linkedRunners.ts +2 -2
  12. package/src/calculations/poolFire.ts +2 -2
  13. package/src/calculations/properties.ts +2 -2
  14. package/src/calculations/radiation.ts +2 -2
  15. package/src/calculations/standalones.ts +2 -2
  16. package/src/calculations/toxics.ts +2 -2
  17. package/src/calculations/utilities.ts +2 -2
  18. package/src/constants.ts +2 -2
  19. package/src/entities.ts +2 -2
  20. package/src/entity-schemas.ts +2 -2
  21. package/src/enums.ts +2 -2
  22. package/src/materials.ts +14 -14
  23. package/src/utilities.ts +2 -2
  24. package/tests/concentration-at-point-calculation/testCase116.test.ts +146 -0
  25. package/tests/concentration-at-point-calculation/testCase117.test.ts +142 -0
  26. package/tests/concentration-at-point-calculation/testCase118.test.ts +143 -0
  27. package/tests/concentration-at-point-calculation/testCase119.test.ts +149 -0
  28. package/tests/concentration-at-point-calculation/testCase120.test.ts +155 -0
  29. package/tests/constants/testConstants.test.ts +23 -0
  30. package/tests/convert-comp-mass-to-mole-calculation/testCase129.test.ts +74 -0
  31. package/tests/convert-comp-mass-to-mole-calculation/testCase130.test.ts +73 -0
  32. package/tests/convert-comp-mass-to-mole-calculation/testCase131.test.ts +73 -0
  33. package/tests/convert-comp-mass-to-mole-calculation/testCase132.test.ts +73 -0
  34. package/tests/convert-comp-mass-to-mole-calculation/testCase133.test.ts +73 -0
  35. package/tests/convert-comp-mole-to-mass-calculation/testCase134.test.ts +72 -0
  36. package/tests/convert-comp-mole-to-mass-calculation/testCase135.test.ts +72 -0
  37. package/tests/convert-comp-mole-to-mass-calculation/testCase136.test.ts +72 -0
  38. package/tests/convert-comp-mole-to-mass-calculation/testCase137.test.ts +72 -0
  39. package/tests/convert-comp-mole-to-mass-calculation/testCase138.test.ts +72 -0
  40. package/tests/distances-and-ellipses-to-radiation-levels-calculation/testCase64.test.ts +194 -0
  41. package/tests/distances-and-ellipses-to-radiation-levels-calculation/testCase65.test.ts +197 -0
  42. package/tests/distances-and-ellipses-to-radiation-levels-calculation/testCase66.test.ts +194 -0
  43. package/tests/distances-and-ellipses-to-radiation-levels-calculation/testCase67.test.ts +198 -0
  44. package/tests/distances-and-ellipses-to-radiation-levels-calculation/testCase68.test.ts +178 -0
  45. package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase31a.test.ts +158 -0
  46. package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase32a.test.ts +156 -0
  47. package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase33a.test.ts +158 -0
  48. package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase34a.test.ts +165 -0
  49. package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase35a.test.ts +188 -0
  50. package/tests/distances-to-conc-levels-calculation/testCase121.test.ts +149 -0
  51. package/tests/distances-to-conc-levels-calculation/testCase122.test.ts +145 -0
  52. package/tests/distances-to-conc-levels-calculation/testCase123.test.ts +150 -0
  53. package/tests/distances-to-conc-levels-calculation/testCase124.test.ts +154 -0
  54. package/tests/distances-to-conc-levels-calculation/testCase125.test.ts +157 -0
  55. package/tests/entities/testVessel.test.ts +49 -0
  56. package/tests/fireball-calculation/testCase89.test.ts +151 -0
  57. package/tests/fireball-calculation/testCase90.test.ts +153 -0
  58. package/tests/fireball-calculation/testCase91.test.ts +152 -0
  59. package/tests/fireball-calculation/testCse92.test.ts +150 -0
  60. package/tests/flash-calculation/testCase26.test.ts +71 -0
  61. package/tests/flash-calculation/testCase27.test.ts +69 -0
  62. package/tests/flash-calculation/testCase28.test.ts +69 -0
  63. package/tests/flash-calculation/testCase29.test.ts +67 -0
  64. package/tests/flash-calculation/testCase30.test.ts +70 -0
  65. package/tests/general/operation-id-demo.test.ts +64 -0
  66. package/tests/get-component-by-id/get-component-by-id-METHANE.test.ts +35 -0
  67. package/tests/get-mass-from-vessel-calculation/testCase139.test.ts +65 -0
  68. package/tests/jet-fire-calculation/testCase36.test.ts +141 -0
  69. package/tests/jet-fire-calculation/testCase37.test.ts +148 -0
  70. package/tests/jet-fire-calculation/testCase38.test.ts +147 -0
  71. package/tests/jet-fire-calculation/testCase39.test.ts +146 -0
  72. package/tests/jet-fire-calculation/testCase40.test.ts +152 -0
  73. package/tests/late-explosion-calculation/testCase46.test.ts +157 -0
  74. package/tests/late-explosion-calculation/testCase47.test.ts +149 -0
  75. package/tests/late-explosion-calculation/testCase48.test.ts +176 -0
  76. package/tests/late-explosion-calculation/testCase49.test.ts +178 -0
  77. package/tests/late-explosion-calculation/testCase50.test.ts +176 -0
  78. package/tests/late-explosion-calculation/testCase74.test.ts +166 -0
  79. package/tests/late-explosion-calculation/testCase75.test.ts +163 -0
  80. package/tests/late-explosion-calculation/testCase76.test.ts +174 -0
  81. package/tests/late-explosion-calculation/testCase77.test.ts +175 -0
  82. package/tests/late-explosion-calculation/testCase78.test.ts +175 -0
  83. package/tests/lethality-distance-calculation/testCase60.test.ts +142 -0
  84. package/tests/linked-runners/user-defined-source-linked-run/test-uds-153.test.ts +121 -0
  85. package/tests/linked-runners/user-defined-source-linked-run/test-uds-154.test.ts +167 -0
  86. package/tests/linked-runners/user-defined-source-linked-run/test-uds-155.test.ts +202 -0
  87. package/tests/linked-runners/user-defined-source-linked-run/test-uds-156.test.ts +201 -0
  88. package/tests/linked-runners/vessel-leak-linked-run/test-vl-157.test.ts +182 -0
  89. package/tests/linked-runners/vessel-leak-linked-run/test-vl-158.test.ts +200 -0
  90. package/tests/linked-runners/vessel-leak-linked-run/test-vl-159.test.ts +158 -0
  91. package/tests/linked-runners/vessel-leak-linked-run/test-vl-160.test.ts +165 -0
  92. package/tests/linked-runners/vessel-line-rupture-linked-run/test-vlr-161.test.ts +161 -0
  93. package/tests/linked-runners/vessel-line-rupture-linked-run/test-vlr-162.test.ts +167 -0
  94. package/tests/linked-runners/vessel-line-rupture-linked-run/test-vlr-163.test.ts +177 -0
  95. package/tests/linked-runners/vessel-line-rupture-linked-run/test-vlr-164.test.ts +165 -0
  96. package/tests/linked-runners/vessel-relief-valve-linked-run/test-vrv-165.test.ts +166 -0
  97. package/tests/linked-runners/vessel-relief-valve-linked-run/test-vrv-166.test.ts +154 -0
  98. package/tests/linked-runners/vessel-relief-valve-linked-run/test-vrv-167.test.ts +157 -0
  99. package/tests/linked-runners/vessel-relief-valve-linked-run/test-vrv-168.test.ts +168 -0
  100. package/tests/load-mass-inventory-vessel-for-line-rupture-scenario-calculation/testCase126.test.ts +72 -0
  101. package/tests/load-mass-inventory-vessel-for-line-rupture-scenario-calculation/testCase127.test.ts +73 -0
  102. package/tests/load-mass-inventory-vessel-for-line-rupture-scenario-calculation/testCase128.test.ts +72 -0
  103. package/tests/load-mass-inventory-vessel-for-relief-valve-scenario-calculation/testCase103.test.ts +74 -0
  104. package/tests/load-mass-inventory-vessel-for-relief-valve-scenario-calculation/testCase104.test.ts +75 -0
  105. package/tests/load-mass-inventory-vessel-for-relief-valve-scenario-calculation/testCase105.test.ts +74 -0
  106. package/tests/long-pipe-calculation/testCase55.test.ts +88 -0
  107. package/tests/long-pipe-calculation/testCase56.test.ts +90 -0
  108. package/tests/long-pipe-calculation/testCase57.test.ts +88 -0
  109. package/tests/long-pipe-calculation/testCase58.test.ts +88 -0
  110. package/tests/long-pipe-calculation/testCase59.test.ts +88 -0
  111. package/tests/materials/test-get-component-by-cas-id-1-2-PROPYLENE-OXIDE.test.ts +23 -0
  112. package/tests/materials/test-get-component-by-cas-id-CARBON-MONOXIDE.test.ts +25 -0
  113. package/tests/materials/test-get-component-by-cas-id-METHANE.test.ts +22 -0
  114. package/tests/materials/test-get-component-by-id-1-2-PROPYLENE-OXIDE.test.ts +23 -0
  115. package/tests/materials/test-get-component-by-id-CARBON-MONOXIDE.test.ts +22 -0
  116. package/tests/materials/test-get-component-by-id-METHANE.test.ts +22 -0
  117. package/tests/materials/test-get-component-by-name-1-2-PROPYLENE-OXIDE.test.ts +24 -0
  118. package/tests/materials/test-get-component-by-name-CARBON-MONOXIDE.test.ts +23 -0
  119. package/tests/materials/test-get-component-by-name-METHANE.test.ts +25 -0
  120. package/tests/materials/test-get-components.test.ts +47 -0
  121. package/tests/materials/test-get-dippr-components.test.ts +28 -0
  122. package/tests/materials/test-get-dnv-components.test.ts +28 -0
  123. package/tests/materials/test-get-material-by-cas-id-1-2-PROPYLENE-OXIDE.test.ts +29 -0
  124. package/tests/materials/test-get-material-by-cas-id-CARBON-MONOXIDE.test.ts +31 -0
  125. package/tests/materials/test-get-material-by-cas-id-METHANE.test.ts +30 -0
  126. package/tests/materials/test-get-material-by-cas-id-ZERO.test.ts +31 -0
  127. package/tests/materials/test-get-material-by-id-1-2-PROPYLENE-OXIDE.test.ts +30 -0
  128. package/tests/materials/test-get-material-by-id-CARBON-MONOXIDE.test.ts +29 -0
  129. package/tests/materials/test-get-material-by-id-METHANE.test.ts +29 -0
  130. package/tests/materials/test-get-material-by-name-1-2-PROPYLENE-OXIDE.test.ts +29 -0
  131. package/tests/materials/test-get-material-by-name-CARBON-MONOXIDE.test.ts +29 -0
  132. package/tests/materials/test-get-material-by-name-METHANE.test.ts +29 -0
  133. package/tests/materials/test-get-materials.test.ts +32 -0
  134. package/tests/max-conc-distance-calculation/testCase106.test.ts +146 -0
  135. package/tests/max-conc-distance-calculation/testCase107.test.ts +148 -0
  136. package/tests/max-conc-distance-calculation/testCase108.test.ts +172 -0
  137. package/tests/max-conc-distance-calculation/testCase109.test.ts +146 -0
  138. package/tests/max-conc-distance-calculation/testCase110.test.ts +146 -0
  139. package/tests/max-conc-footprint-calculation/testCase31.test.ts +169 -0
  140. package/tests/max-conc-footprint-calculation/testCase32.test.ts +183 -0
  141. package/tests/max-conc-footprint-calculation/testCase33.test.ts +161 -0
  142. package/tests/max-conc-footprint-calculation/testCase34.test.ts +172 -0
  143. package/tests/max-conc-footprint-calculation/testCase35.test.ts +188 -0
  144. package/tests/max-distance-to-conc-calculation/testCase111.test.ts +138 -0
  145. package/tests/max-distance-to-conc-calculation/testCase112.test.ts +174 -0
  146. package/tests/max-distance-to-conc-calculation/testCase113.test.ts +153 -0
  147. package/tests/max-distance-to-conc-calculation/testCase114.test.ts +162 -0
  148. package/tests/max-distance-to-conc-calculation/testCase115.test.ts +167 -0
  149. package/tests/mixture-constant-properties-calculation/testCase97.test.ts +83 -0
  150. package/tests/mixture-constant-properties-calculation/testCase98.test.ts +90 -0
  151. package/tests/mixture-constant-properties-calculation/testCase99.test.ts +87 -0
  152. package/tests/pool-fire-calculation/testCase41.test.ts +153 -0
  153. package/tests/pool-fire-calculation/testCase41a.test.ts +141 -0
  154. package/tests/pool-fire-calculation/testCase42.test.ts +169 -0
  155. package/tests/pool-fire-calculation/testCase42a.test.ts +175 -0
  156. package/tests/pool-fire-calculation/testCase43.test.ts +161 -0
  157. package/tests/pool-fire-calculation/testCase43a.test.ts +157 -0
  158. package/tests/pool-fire-calculation/testCase44.test.ts +147 -0
  159. package/tests/pool-fire-calculation/testCase44a.test.ts +152 -0
  160. package/tests/pool-fire-calculation/testCase45.test.ts +176 -0
  161. package/tests/pool-fire-calculation/testCase45a.test.ts +182 -0
  162. package/tests/radiation-at-ponts/testCase69.test.ts +167 -0
  163. package/tests/radiation-at-ponts/testCase70.test.ts +179 -0
  164. package/tests/radiation-at-ponts/testCase71.test.ts +150 -0
  165. package/tests/radiation-at-ponts/testCase72.test.ts +166 -0
  166. package/tests/radiation-at-ponts/testCase73.test.ts +169 -0
  167. package/tests/radiation-contour-calculation/testCase51.test.ts +127 -0
  168. package/tests/radiation-contour-calculation/testCase52.test.ts +126 -0
  169. package/tests/radiation-contour-calculation/testCase53.test.ts +126 -0
  170. package/tests/radiation-contour-calculation/testCase54.test.ts +131 -0
  171. package/tests/relief-valve-min-temperature-calculation/testCase140.test.ts +49 -0
  172. package/tests/set-mixing-layer-height/testCase100.test.ts +36 -0
  173. package/tests/set-mixing-layer-height/testCase101.test.ts +36 -0
  174. package/tests/set-mixing-layer-height/testCase102.test.ts +36 -0
  175. package/tests/set-phase-to-be-released-for-leak-calculation/testCase150.test.ts +67 -0
  176. package/tests/set-phase-to-be-released-for-line-rupture-calculation/testCase151.test.ts +67 -0
  177. package/tests/set-phase-to-be-released-for-relief-valve-calculation/TestCase152.test.ts +61 -0
  178. package/tests/sideview/testCase31b.test.ts +150 -0
  179. package/tests/sideview/testCase32b.test.ts +145 -0
  180. package/tests/sideview/testCase33b.test.ts +130 -0
  181. package/tests/sideview/testCase34b.test.ts +153 -0
  182. package/tests/sideview/testCase35b.test.ts +140 -0
  183. package/tests/tank-fire-calculation/testCase79.test.ts +61 -0
  184. package/tests/tank-fire-calculation/testCase80.test.ts +67 -0
  185. package/tests/tank-fire-calculation/testCase81.test.ts +68 -0
  186. package/tests/tank-fire-calculation/testCase82.test.ts +68 -0
  187. package/tests/tank-fire-calculation/testCase83.test.ts +73 -0
  188. package/tests/utilities/convert-camel-case-to-snake-case.test.ts +7 -0
  189. package/tests/utilities/convert-snake-case-to-camel-case.test.ts +7 -0
  190. package/tests/vessel-catastrophic-rupture-calculation/testCase1.test.ts +83 -0
  191. package/tests/vessel-catastrophic-rupture-calculation/testCase2.test.ts +82 -0
  192. package/tests/vessel-catastrophic-rupture-calculation/testCase3.test.ts +91 -0
  193. package/tests/vessel-catastrophic-rupture-calculation/testCase4.test.ts +85 -0
  194. package/tests/vessel-catastrophic-rupture-calculation/testCase5.test.ts +84 -0
  195. package/tests/vessel-leak-calculation/testCase10.test.ts +108 -0
  196. package/tests/vessel-leak-calculation/testCase6.test.ts +113 -0
  197. package/tests/vessel-leak-calculation/testCase7.test.ts +123 -0
  198. package/tests/vessel-leak-calculation/testCase8.test.ts +102 -0
  199. package/tests/vessel-leak-calculation/testCase9.test.ts +106 -0
  200. package/tests/vessel-line-rupture-calculation/vlr-ammonia.test.ts +84 -0
  201. package/tests/vessel-line-rupture-calculation/vlr-ethaneMethane.test.ts +82 -0
  202. package/tests/vessel-line-rupture-calculation/vlr-nDecane.test.ts +79 -0
  203. package/tests/vessel-line-rupture-calculation/vlr-oxygen.test.ts +77 -0
  204. package/tests/vessel-line-rupture-calculation/vlr-propane.test.ts +77 -0
  205. package/tests/vessel-relief-valve-calculation/vrv-chlorine.test.ts +99 -0
  206. package/tests/vessel-relief-valve-calculation/vrv-hydrogen.test.ts +96 -0
  207. package/tests/vessel-relief-valve-calculation/vrv-methane.test.ts +80 -0
  208. package/tests/vessel-relief-valve-calculation/vrv-methaneH2s.test.ts +86 -0
  209. package/tests/vessel-relief-valve-calculation/vrv-nitrogen.test.ts +80 -0
  210. package/tests/vessel-state-calculation/vs-ammonia.test.ts +56 -0
  211. package/tests/vessel-state-calculation/vs-butane.test.ts +57 -0
  212. package/tests/vessel-state-calculation/vs-chlorine.test.ts +56 -0
  213. package/tests/vessel-state-calculation/vs-methane.test.ts +57 -0
  214. package/tests/vessel-state-calculation/vs-naturalGas.test.ts +59 -0
  215. package/tests/vessel-state-calculation/vs-nitrogenPentane.test.ts +58 -0
@@ -0,0 +1,158 @@
1
+ import { VesselStateCalculation, VesselLeakCalculation } from '../../src/calculations/discharge';
2
+ import { DispersionCalculation } from '../../src/calculations/dispersion';
3
+ import { DistancesAndFootprintsToConcentrationLevelsCalculation } from '../../src/calculations/dispersionView';
4
+ import { DischargeParameters, DispersionOutputConfig, DispersionParameters, Leak, Material, MaterialComponent, State, Substrate, Vessel, Weather } from '../../src/entities';
5
+ import { AtmosphericStabilityClass, ResultCode, SurfaceType, TimeVaryingOption, VesselShape, WindProfileFlag } from '../../src/enums';
6
+ import { setAccessToken } from "../../src/utilities";
7
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
8
+
9
+ if (!accessToken) {
10
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
11
+ }
12
+
13
+ setAccessToken(accessToken);
14
+
15
+ describe('Test Case 33a - Distances and Footprints to Concentration Levels Scenario', () => {
16
+ test('should run vessel state, leak, dispersion, and distances/footprints calculations with regression checks', async () => {
17
+ // Define material and state
18
+ const material = new Material({
19
+ name: 'CARBON DIOXIDE (TOXIC)',
20
+ components: [new MaterialComponent({ name: 'CARBON DIOXIDE (TOXIC)', moleFraction: 1.0 })],
21
+ componentCount: 1,
22
+ });
23
+
24
+ const state = new State({
25
+ temperature: 280.0,
26
+ pressure: 8.0e6,
27
+ liquidFraction: 0.0,
28
+ });
29
+
30
+ // Vessel state calculation
31
+ const vesselStateCalc = new VesselStateCalculation(material, state);
32
+
33
+ console.log('Running vessel_state_calculation...');
34
+ const vesselStateResult = await vesselStateCalc.run();
35
+
36
+ if (vesselStateCalc.messages.length > 0) {
37
+ console.log('Messages:');
38
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
39
+ }
40
+
41
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
42
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
43
+
44
+ // Define vessel
45
+ const vessel = new Vessel({
46
+ state: vesselStateCalc.outputState!,
47
+ material: vesselStateCalc.material,
48
+ vesselConditions: vesselStateCalc.vesselConditions,
49
+ diameter: 5.0,
50
+ shape: VesselShape.VESSEL_SPHERE,
51
+ liquidFillFractionByVolume: 0.8,
52
+ });
53
+
54
+ // Define leak
55
+ const leak = new Leak({
56
+ holeDiameter: 0.008,
57
+ holeHeightFraction: 0.5,
58
+ timeVaryingOption: TimeVaryingOption.INITIAL_RATE,
59
+ });
60
+
61
+ // Vessel leak calculation
62
+ const dischargeParams = new DischargeParameters();
63
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
64
+
65
+ console.log('Running vessel_leak_calculation...');
66
+ const leakResult = await vesselLeakCalc.run();
67
+
68
+ if (vesselLeakCalc.messages.length > 0) {
69
+ console.log('Messages:');
70
+ vesselLeakCalc.messages.forEach((msg) => console.log(msg));
71
+ }
72
+
73
+ expect(leakResult).toBe(ResultCode.SUCCESS);
74
+ console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
75
+
76
+ // Set up entities for dispersion calculation
77
+ const substrate = new Substrate({
78
+ surfaceType: SurfaceType.WATER,
79
+ surfaceRoughness: 0.01,
80
+ });
81
+
82
+ const weather = new Weather({
83
+ windSpeed: 4.0,
84
+ stabilityClass: AtmosphericStabilityClass.STABILITY_C,
85
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
86
+ });
87
+
88
+ const dispersionParams = new DispersionParameters();
89
+
90
+ // Dispersion calculation
91
+ const dispersionCalc = new DispersionCalculation(
92
+ vesselLeakCalc.exitMaterial!,
93
+ substrate,
94
+ vesselLeakCalc.dischargeResult!,
95
+ vesselLeakCalc.dischargeRecords!,
96
+ vesselLeakCalc.dischargeRecords!.length,
97
+ weather,
98
+ dispersionParams,
99
+ 0.0 // endPointConcentration
100
+ );
101
+
102
+ console.log('Running dispersion_calculation...');
103
+ const dispersionResult = await dispersionCalc.run();
104
+
105
+ if (dispersionCalc.messages.length > 0) {
106
+ console.log('Messages:');
107
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
108
+ }
109
+
110
+ expect(dispersionResult).toBe(ResultCode.SUCCESS);
111
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
112
+
113
+ // Distances and footprints to concentration levels calculation
114
+ const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0, elevation: 2.5 })];
115
+
116
+ const distancesFootprintsCalc = new DistancesAndFootprintsToConcentrationLevelsCalculation(
117
+ dispersionCalc.scalarUdmOutputs!,
118
+ weather,
119
+ dispersionCalc.dispersionRecords!,
120
+ dispersionCalc.dispersionRecords!.length,
121
+ substrate,
122
+ dispersionOutputConfigs,
123
+ dispersionOutputConfigs.length,
124
+ dispersionParams,
125
+ vesselLeakCalc.exitMaterial!
126
+ );
127
+
128
+ console.log('Running distances_and_footprints_to_concentration_levels_calculation...');
129
+ const distancesFootprintsResult = await distancesFootprintsCalc.run();
130
+
131
+ if (distancesFootprintsCalc.messages.length > 0) {
132
+ console.log('Messages:');
133
+ distancesFootprintsCalc.messages.forEach((msg) => console.log(msg));
134
+ }
135
+
136
+ expect(distancesFootprintsResult).toBe(ResultCode.SUCCESS);
137
+
138
+ // Regression checks
139
+ expect(distancesFootprintsCalc.contourPoints!.length).toBe(553);
140
+
141
+ if (distancesFootprintsCalc.contourPoints!.length > 0) {
142
+ const contourPointError = Math.abs(
143
+ (distancesFootprintsCalc.contourPoints![distancesFootprintsCalc.contourPoints!.length - 3].x - -0.09459660419095317) /
144
+ -0.09459660419095317
145
+ );
146
+ expect(contourPointError).toBeLessThan(1e-3);
147
+ }
148
+
149
+ const distanceError = Math.abs(
150
+ (distancesFootprintsCalc.distancesConcentration![0] - 10.10796681882425) / 10.10796681882425
151
+ );
152
+ expect(distanceError).toBeLessThan(1e-3);
153
+
154
+ console.log(
155
+ `SUCCESS: distances_and_footprints_to_concentration_levels_calculation (${distancesFootprintsCalc.calculationElapsedTime}ms)`
156
+ );
157
+ });
158
+ });
@@ -0,0 +1,165 @@
1
+ import { VesselStateCalculation, VesselLeakCalculation, VesselLineRuptureCalculation } from '../../src/calculations/discharge';
2
+ import { DispersionCalculation } from '../../src/calculations/dispersion';
3
+ import { DistancesAndFootprintsToConcentrationLevelsCalculation } from '../../src/calculations/dispersionView';
4
+ import { Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, Leak, Material, MaterialComponent, State, Substrate, Vessel, Weather, LineRupture } from '../../src/entities';
5
+ import { AtmosphericStabilityClass, ResultCode, SurfaceType, TimeVaryingOption, VesselShape, WindProfileFlag } from '../../src/enums';
6
+ import { setAccessToken } from "../../src/utilities";
7
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
8
+
9
+ if (!accessToken) {
10
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
11
+ }
12
+
13
+ setAccessToken(accessToken);
14
+
15
+ describe("Test Case 34a - Distances and Footprints to Concentration Levels Scenario", () => {
16
+ test("should run vessel state, line rupture, dispersion, and distances/footprints calculations with regression checks", async () => {
17
+ // Define material and state
18
+ const material = new Material({
19
+ name: "AMMONIA",
20
+ components: [new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 })],
21
+ componentCount: 1,
22
+ });
23
+
24
+ const state = new State({
25
+ temperature: 290.0,
26
+ pressure: 7.0e6,
27
+ liquidFraction: 1.0,
28
+ });
29
+
30
+ // Vessel state calculation
31
+ const vesselStateCalc = new VesselStateCalculation(material, state);
32
+
33
+ console.log("Running vessel_state_calculation...");
34
+ const vesselStateResult = await vesselStateCalc.run();
35
+
36
+ if (vesselStateCalc.messages.length > 0) {
37
+ console.log("Messages:");
38
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
39
+ }
40
+
41
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
42
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
43
+
44
+ // Define vessel
45
+ const vessel = new Vessel({
46
+ state,
47
+ material,
48
+ liquidFillFractionByVolume: 0.7,
49
+ shape: VesselShape.VESSEL_CUBOID,
50
+ height: 2.0,
51
+ width: 1.0,
52
+ length: 3.0,
53
+ vesselConditions: vesselStateCalc.vesselConditions,
54
+ });
55
+
56
+ // Define line rupture
57
+ const lineRupture = new LineRupture({
58
+ pipeDiameter: 0.1,
59
+ pipeLength: 1.0,
60
+ pipeHeightFraction: 0.1,
61
+ });
62
+
63
+ // Vessel line rupture calculation
64
+ const dischargeParams = new DischargeParameters();
65
+ const vesselLineRuptureCalc = new VesselLineRuptureCalculation(vessel, lineRupture, dischargeParams);
66
+
67
+ console.log("Running vessel_line_rupture_calculation...");
68
+ const ruptureResult = await vesselLineRuptureCalc.run();
69
+
70
+ if (vesselLineRuptureCalc.messages.length > 0) {
71
+ console.log("Messages:");
72
+ vesselLineRuptureCalc.messages.forEach((msg) => console.log(msg));
73
+ }
74
+
75
+ expect(ruptureResult).toBe(ResultCode.SUCCESS);
76
+ console.log(`SUCCESS: vessel_line_rupture_calculation (${vesselLineRuptureCalc.calculationElapsedTime}ms)`);
77
+
78
+ // Set up entities for dispersion calculation
79
+ const bund = new Bund({
80
+ specifyBund: true,
81
+ bundHeight: 0.5,
82
+ bundDiameter: 5.0,
83
+ });
84
+
85
+ const substrate = new Substrate({
86
+ bund,
87
+ surfaceType: SurfaceType.LAND,
88
+ surfaceRoughness: 0.183,
89
+ });
90
+
91
+ const weather = new Weather({
92
+ windSpeed: 1.5,
93
+ stabilityClass: AtmosphericStabilityClass.STABILITY_D,
94
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
95
+ });
96
+
97
+ const dispersionParams = new DispersionParameters();
98
+
99
+ // Dispersion calculation
100
+ const dispersionCalc = new DispersionCalculation(
101
+ vesselLineRuptureCalc.exitMaterial!,
102
+ substrate,
103
+ vesselLineRuptureCalc.dischargeResult!,
104
+ vesselLineRuptureCalc.dischargeRecords!,
105
+ vesselLineRuptureCalc.dischargeRecords!.length,
106
+ weather,
107
+ dispersionParams,
108
+ 0.0 // endPointConcentration
109
+ );
110
+
111
+ console.log("Running dispersion_calculation...");
112
+ const dispersionResult = await dispersionCalc.run();
113
+
114
+ if (dispersionCalc.messages.length > 0) {
115
+ console.log("Messages:");
116
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
117
+ }
118
+
119
+ expect(dispersionResult).toBe(ResultCode.SUCCESS);
120
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
121
+
122
+ // Distances and footprints to concentration levels calculation
123
+ const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0 })];
124
+
125
+ const distancesFootprintsCalc = new DistancesAndFootprintsToConcentrationLevelsCalculation(
126
+ dispersionCalc.scalarUdmOutputs!,
127
+ weather,
128
+ dispersionCalc.dispersionRecords!,
129
+ dispersionCalc.dispersionRecords!.length,
130
+ substrate,
131
+ dispersionOutputConfigs,
132
+ dispersionOutputConfigs.length,
133
+ dispersionParams,
134
+ vesselLineRuptureCalc.exitMaterial!
135
+ );
136
+
137
+ console.log("Running distances_and_footprints_to_concentration_levels_calculation...");
138
+ const distancesFootprintsResult = await distancesFootprintsCalc.run();
139
+
140
+ if (distancesFootprintsCalc.messages.length > 0) {
141
+ console.log("Messages:");
142
+ distancesFootprintsCalc.messages.forEach((msg) => console.log(msg));
143
+ }
144
+
145
+ expect(distancesFootprintsResult).toBe(ResultCode.SUCCESS);
146
+
147
+ // Regression checks
148
+ expect(distancesFootprintsCalc.contourPoints!.length).toBe(587);
149
+
150
+ if (distancesFootprintsCalc.contourPoints!.length > 0) {
151
+ const contourPointError = Math.abs(
152
+ (distancesFootprintsCalc.contourPoints![distancesFootprintsCalc.contourPoints!.length - 3].x - -0.3224436750622628) /
153
+ -0.3224436750622628
154
+ );
155
+ expect(contourPointError).toBeLessThan(1e-3);
156
+ }
157
+
158
+ const distanceError = Math.abs(
159
+ (distancesFootprintsCalc.distancesConcentration![0] - 248.37370206331042) / 248.37370206331042
160
+ );
161
+ expect(distanceError).toBeLessThan(1e-3);
162
+
163
+ console.log(`SUCCESS: distances_and_footprints_to_concentration_levels_calculation (${distancesFootprintsCalc.calculationElapsedTime}ms)`);
164
+ });
165
+ });
@@ -0,0 +1,188 @@
1
+ import { VesselReliefValveCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { DistancesAndFootprintsToConcentrationLevelsCalculation } from "../../src/calculations/dispersionView";
4
+ import { Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, Material, MaterialComponent, ReliefValve, State, Substrate, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, ResultCode, SurfaceType, VesselShape, WindProfileFlag } from "../../src/enums";
6
+ import { setAccessToken } from "../../src/utilities";
7
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
8
+
9
+ if (!accessToken) {
10
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
11
+ }
12
+
13
+ setAccessToken(accessToken);
14
+
15
+ describe("Test Case 35a - Distances and Footprints to Concentration Levels Scenario", () => {
16
+ test("should run vessel, relief valve, dispersion, and distances/footprints calculations with regression checks", async () => {
17
+ // Define constants
18
+ const stateTemperature = 320.0;
19
+ const statePressure = 1.0e6;
20
+ const stateLiquidFraction = 1.0;
21
+ const vesselShape = VesselShape.HORIZONTAL_CYLINDER;
22
+ const vesselDiameter = 2.0;
23
+ const vesselLength = 5.0;
24
+ const liquidFillFractionByVolume = 0.7;
25
+ const reliefValvePipeDiameter = 0.02;
26
+ const reliefValvePipeLength = 10.0;
27
+ const reliefValvePipeHeightFraction = 1;
28
+ const reliefValveConstrictionDiameter = 0.02;
29
+ const surfaceType = SurfaceType.LAND;
30
+ const surfaceRoughness = 0.183;
31
+ const windSpeed = 1.5;
32
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_D;
33
+ const endPointConcentration = 0.0;
34
+ const specifyBund = true;
35
+ const bundHeight = 0.5;
36
+ const bundDiameter = 5.0;
37
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
38
+
39
+ // Define material and state
40
+ const material = new Material({
41
+ name: "CHLORINE",
42
+ components: [new MaterialComponent({ name: "CHLORINE", moleFraction: 1.0 })],
43
+ componentCount: 1,
44
+ });
45
+
46
+ const state = new State({
47
+ temperature: stateTemperature,
48
+ pressure: statePressure,
49
+ liquidFraction: stateLiquidFraction,
50
+ });
51
+
52
+ // Vessel state calculation
53
+ const vesselStateCalc = new VesselStateCalculation(material, state);
54
+
55
+ console.log("Running vessel_state_calculation...");
56
+ const vesselStateResult = await vesselStateCalc.run();
57
+
58
+ if (vesselStateCalc.messages.length > 0) {
59
+ console.log("Messages:");
60
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
61
+ }
62
+
63
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
64
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
65
+
66
+ // Define vessel
67
+ const vessel = new Vessel({
68
+ state,
69
+ material,
70
+ vesselConditions: vesselStateCalc.vesselConditions,
71
+ liquidFillFractionByVolume,
72
+ shape: vesselShape,
73
+ diameter: vesselDiameter,
74
+ length: vesselLength,
75
+ });
76
+
77
+ // Define relief valve
78
+ const reliefValve = new ReliefValve({
79
+ pipeDiameter: reliefValvePipeDiameter,
80
+ pipeLength: reliefValvePipeLength,
81
+ pipeHeightFraction: reliefValvePipeHeightFraction,
82
+ reliefValveConstrictionDiameter: reliefValveConstrictionDiameter,
83
+ });
84
+
85
+ // Vessel relief valve calculation
86
+ const dischargeParams = new DischargeParameters();
87
+ const vesselReliefValveCalc = new VesselReliefValveCalculation(vessel, reliefValve, dischargeParams);
88
+
89
+ console.log("Running vessel_relief_valve_calculation...");
90
+ const reliefValveResult = await vesselReliefValveCalc.run();
91
+
92
+ if (vesselReliefValveCalc.messages.length > 0) {
93
+ console.log("Messages:");
94
+ vesselReliefValveCalc.messages.forEach((msg) => console.log(msg));
95
+ }
96
+
97
+ expect(reliefValveResult).toBe(ResultCode.SUCCESS);
98
+ console.log(`SUCCESS: vessel_relief_valve_calculation (${vesselReliefValveCalc.calculationElapsedTime}ms)`);
99
+ console.log(`vessel_relief_valve_calculation.dischargeResult.releaseMass: ${vesselReliefValveCalc.dischargeResult!.releaseMass} [kg]`);
100
+
101
+ // Set up entities for dispersion calculation
102
+ const bund = new Bund({
103
+ specifyBund,
104
+ bundHeight,
105
+ bundDiameter,
106
+ });
107
+
108
+ const substrate = new Substrate({
109
+ bund,
110
+ surfaceType,
111
+ surfaceRoughness,
112
+ });
113
+
114
+ const weather = new Weather({
115
+ windSpeed,
116
+ stabilityClass,
117
+ windProfileFlag
118
+ });
119
+
120
+ const dispersionParams = new DispersionParameters();
121
+
122
+ // Dispersion calculation
123
+ const dispersionCalc = new DispersionCalculation(
124
+ vesselReliefValveCalc.exitMaterial!,
125
+ substrate,
126
+ vesselReliefValveCalc.dischargeResult!,
127
+ vesselReliefValveCalc.dischargeRecords!,
128
+ vesselReliefValveCalc.dischargeRecords!.length,
129
+ weather,
130
+ dispersionParams,
131
+ endPointConcentration
132
+ );
133
+
134
+ console.log("Running dispersion_calculation...");
135
+ const dispersionResult = await dispersionCalc.run();
136
+
137
+ if (dispersionCalc.messages.length > 0) {
138
+ console.log("Messages:");
139
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
140
+ }
141
+
142
+ expect(dispersionResult).toBe(ResultCode.SUCCESS);
143
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
144
+
145
+ // Distances and footprints to concentration levels calculation
146
+ const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: endPointConcentration })];
147
+
148
+ const distancesFootprintsCalc = new DistancesAndFootprintsToConcentrationLevelsCalculation(
149
+ dispersionCalc.scalarUdmOutputs!,
150
+ weather,
151
+ dispersionCalc.dispersionRecords!,
152
+ dispersionCalc.dispersionRecords!.length,
153
+ substrate,
154
+ dispersionOutputConfigs,
155
+ dispersionOutputConfigs.length,
156
+ dispersionParams,
157
+ vesselReliefValveCalc.exitMaterial!
158
+ );
159
+
160
+ console.log("Running distances_and_footprints_to_concentration_levels_calculation...");
161
+ const distancesFootprintsResult = await distancesFootprintsCalc.run();
162
+
163
+ if (distancesFootprintsCalc.messages.length > 0) {
164
+ console.log("Messages:");
165
+ distancesFootprintsCalc.messages.forEach((msg) => console.log(msg));
166
+ }
167
+
168
+ expect(distancesFootprintsResult).toBe(ResultCode.SUCCESS);
169
+
170
+ // Regression checks
171
+ expect(distancesFootprintsCalc.contourPoints!.length).toBe(651);
172
+
173
+ if (distancesFootprintsCalc.contourPoints!.length > 0) {
174
+ const contourPointError = Math.abs(
175
+ (distancesFootprintsCalc.contourPoints![distancesFootprintsCalc.contourPoints!.length - 3].x - 3.5444266994358022) /
176
+ 3.5444266994358022
177
+ );
178
+ expect(contourPointError).toBeLessThan(1e-3);
179
+ }
180
+
181
+ const distanceError = Math.abs(
182
+ (distancesFootprintsCalc.distancesConcentration![0] - 658.8828694811095) / 658.8828694811095
183
+ );
184
+ expect(distanceError).toBeLessThan(1e-3);
185
+
186
+ console.log(`SUCCESS: distances_and_footprints_to_concentration_levels_calculation (${distancesFootprintsCalc.calculationElapsedTime}ms)`);
187
+ });
188
+ });
@@ -0,0 +1,149 @@
1
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { DistancesToConcLevelsCalculation } from "../../src/calculations/dispersionView";
4
+ import { Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, ResultCode, SurfaceType, VesselShape, WindProfileFlag } from "../../src/enums";
6
+ import { setAccessToken } from "../../src/utilities";
7
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
8
+
9
+ if (!accessToken) {
10
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
11
+ }
12
+
13
+ setAccessToken(accessToken);
14
+
15
+ describe("Test Case 121 - Distances to Concentration Levels Scenario", () => {
16
+ test("should run vessel, rupture, dispersion, and distances calculations with regression checks", async () => {
17
+ // Define material and state
18
+ const material = new Material({
19
+ name: "ETHANE_BUTANE_PROPANE",
20
+ components: [
21
+ new MaterialComponent({ name: "ETHANE", moleFraction: 0.5 }),
22
+ new MaterialComponent({ name: "N-BUTANE", moleFraction: 0.3 }),
23
+ new MaterialComponent({ name: "PROPANE", moleFraction: 0.2 }),
24
+ ],
25
+ componentCount: 3,
26
+ });
27
+
28
+ const state = new State({
29
+ temperature: 265.0,
30
+ pressure: 5.0e5,
31
+ liquidFraction: 0.8,
32
+ });
33
+
34
+ // Vessel state calculation
35
+ const vesselStateCalc = new VesselStateCalculation(material, state);
36
+
37
+ console.log("Running vessel_state_calculation...");
38
+ const vesselStateResult = await vesselStateCalc.run();
39
+
40
+ if (vesselStateCalc.messages.length > 0) {
41
+ console.log("Messages:");
42
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
43
+ }
44
+
45
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
46
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
47
+
48
+ // Define vessel
49
+ const vessel = new Vessel({
50
+ state,
51
+ material,
52
+ liquidFillFractionByVolume: 0.8,
53
+ shape: VesselShape.VERTICAL_CYLINDER,
54
+ vesselConditions: vesselStateCalc.vesselConditions,
55
+ });
56
+
57
+ // Vessel catastrophic rupture calculation
58
+ const dischargeParams = new DischargeParameters();
59
+ const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
60
+
61
+ console.log("Running vessel_catastrophic_rupture_calculation...");
62
+ const ruptureResult = await vesselRuptureCalc.run();
63
+
64
+ if (vesselRuptureCalc.messages.length > 0) {
65
+ console.log("Messages:");
66
+ vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
67
+ }
68
+
69
+ expect(ruptureResult).toBe(ResultCode.SUCCESS);
70
+ console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
71
+
72
+ // Set up entities for dispersion calculation
73
+ const bund = new Bund({
74
+ specifyBund: true,
75
+ bundHeight: 1.0,
76
+ bundDiameter: 8.0,
77
+ });
78
+
79
+ const substrate = new Substrate({
80
+ bund,
81
+ surfaceType: SurfaceType.LAND,
82
+ surfaceRoughness: 0.2,
83
+ });
84
+
85
+ const weather = new Weather({
86
+ windSpeed: 5.0,
87
+ stabilityClass: AtmosphericStabilityClass.STABILITY_A_,
88
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE,
89
+ });
90
+
91
+ const dispersionParams = new DispersionParameters();
92
+
93
+ // Dispersion calculation
94
+ const dispersionCalc = new DispersionCalculation(
95
+ vesselRuptureCalc.exitMaterial!,
96
+ substrate,
97
+ vesselRuptureCalc.dischargeResult!,
98
+ vesselRuptureCalc.dischargeRecords!,
99
+ vesselRuptureCalc.dischargeRecords!.length,
100
+ weather,
101
+ dispersionParams,
102
+ 0.0 // endPointConcentration
103
+ );
104
+
105
+ console.log("Running dispersion_calculation...");
106
+ const dispersionResult = await dispersionCalc.run();
107
+
108
+ if (dispersionCalc.messages.length > 0) {
109
+ console.log("Messages:");
110
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
111
+ }
112
+
113
+ expect(dispersionResult).toBe(ResultCode.SUCCESS);
114
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
115
+
116
+ // Distances to concentration levels calculation
117
+ const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0 })];
118
+
119
+ const distancesCalc = new DistancesToConcLevelsCalculation(
120
+ dispersionCalc.scalarUdmOutputs!,
121
+ weather,
122
+ dispersionCalc.dispersionRecords!,
123
+ dispersionCalc.dispersionRecords!.length,
124
+ substrate,
125
+ dispersionOutputConfigs,
126
+ dispersionOutputConfigs.length,
127
+ vesselRuptureCalc.exitMaterial!,
128
+ dispersionParams
129
+ );
130
+
131
+ console.log("Running distances_to_conc_levels_calculation...");
132
+ const distancesResult = await distancesCalc.run();
133
+
134
+ if (distancesCalc.messages.length > 0) {
135
+ console.log("Messages:");
136
+ distancesCalc.messages.forEach((msg) => console.log(msg));
137
+ }
138
+
139
+ expect(distancesResult).toBe(ResultCode.SUCCESS);
140
+
141
+ // Regression check
142
+ const distanceError = Math.abs(
143
+ (distancesCalc.distances![0] - 33.46354835021753) / 33.46354835021753
144
+ );
145
+ expect(distanceError).toBeLessThan(1e-3);
146
+
147
+ console.log(`SUCCESS: distances_to_conc_levels_calculation (${distancesCalc.calculationElapsedTime}ms)`);
148
+ });
149
+ });