@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,198 @@
1
+ import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { JetFireCalculation } from "../../src/calculations/jetFire";
3
+ import { DistancesAndEllipsesToRadiationLevelsCalculation } from "../../src/calculations/radiation";
4
+ import { Bund, DischargeParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, Resolution, ResultCode, TimeVaryingOption, VesselShape } 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 67 - Distances and Ellipses to Radiation Levels Scenario", () => {
16
+ test("should run vessel state, leak, jet fire, and distances/ellipses calculations with regression checks", async () => {
17
+ // Define case properties
18
+ const materialName = "ETHANE_METHANE_HYDROGEN";
19
+ const stateTemperature = 360.0;
20
+ const statePressure = 3.0e6;
21
+ const vesselShape = VesselShape.VESSEL_SPHERE;
22
+ const vesselDiameter = 3.0;
23
+ const leakHoleDiameter = 0.1;
24
+ const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
25
+ const leakHoleHeightFraction = 0.3;
26
+ const liquidFillFractionByVolume = 0.4;
27
+ const windSpeed = 2.0;
28
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
29
+ const timeOfInterest = 2600.0;
30
+ const radiationResolution = Resolution.EXTREME;
31
+
32
+ // Define material and state
33
+ const material = new Material({
34
+ name: materialName,
35
+ components: [
36
+ new MaterialComponent({ name: "ETHANE", moleFraction: 0.5 }),
37
+ new MaterialComponent({ name: "METHANE", moleFraction: 0.3 }),
38
+ new MaterialComponent({ name: "HYDROGEN", moleFraction: 0.2 }),
39
+ ],
40
+ componentCount: 3,
41
+ });
42
+
43
+ const state = new State({
44
+ temperature: stateTemperature,
45
+ pressure: statePressure,
46
+ liquidFraction: 0.0,
47
+ });
48
+
49
+ // Vessel state calculation
50
+ const vesselStateCalc = new VesselStateCalculation(material, state);
51
+
52
+ console.log("Running vessel_state_calculation...");
53
+ const vesselStateResult = await vesselStateCalc.run();
54
+
55
+ if (vesselStateCalc.messages.length > 0) {
56
+ console.log("Messages:");
57
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
58
+ }
59
+
60
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
61
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
62
+
63
+ // Define vessel
64
+ const vessel = new Vessel({
65
+ state: vesselStateCalc.outputState!,
66
+ material: vesselStateCalc.material,
67
+ vesselConditions: vesselStateCalc.vesselConditions,
68
+ location: new LocalPosition({ x: 0, y: 0, z: 0 }),
69
+ diameter: vesselDiameter,
70
+ shape: vesselShape,
71
+ liquidFillFractionByVolume: liquidFillFractionByVolume,
72
+ });
73
+
74
+ // Define leak
75
+ const leak = new Leak({
76
+ holeDiameter: leakHoleDiameter,
77
+ holeHeightFraction: leakHoleHeightFraction,
78
+ timeVaryingOption: timeVaryingOption,
79
+ });
80
+
81
+ // Vessel leak calculation
82
+ const dischargeParams = new DischargeParameters();
83
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
84
+
85
+ console.log("Running vessel_leak_calculation...");
86
+ const leakResult = await vesselLeakCalc.run();
87
+
88
+ if (vesselLeakCalc.messages.length > 0) {
89
+ console.log("Messages:");
90
+ vesselLeakCalc.messages.forEach((msg) => console.log(msg));
91
+ }
92
+
93
+ expect(leakResult).toBe(ResultCode.SUCCESS);
94
+ console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
95
+
96
+ // Set up entities for jet fire calculation
97
+ const weather = new Weather({
98
+ windSpeed: windSpeed,
99
+ stabilityClass: stabilityClass,
100
+ });
101
+
102
+ const substrate = new Substrate({
103
+ bund: new Bund({ specifyBund: false }),
104
+ });
105
+
106
+ const flammableParams = new FlammableParameters({
107
+ timeOfInterest: timeOfInterest,
108
+ });
109
+
110
+ // Jet fire calculation
111
+ const jetFireCalc = new JetFireCalculation(
112
+ vesselLeakCalc.exitMaterial!,
113
+ vesselLeakCalc.dischargeRecords!,
114
+ vesselLeakCalc.dischargeRecords!.length,
115
+ vesselLeakCalc.dischargeResult!,
116
+ weather,
117
+ substrate,
118
+ flammableParams
119
+ );
120
+
121
+ console.log("Running jet_fire_calculation...");
122
+ const jetFireResult = await jetFireCalc.run();
123
+
124
+ if (jetFireCalc.messages.length > 0) {
125
+ console.log("Messages:");
126
+ jetFireCalc.messages.forEach((msg) => console.log(msg));
127
+ }
128
+
129
+ expect(jetFireResult).toBe(ResultCode.SUCCESS);
130
+ console.log(`SUCCESS: jet_fire_calculation (${jetFireCalc.calculationElapsedTime}ms)`);
131
+
132
+ // Flammable output configurations
133
+ const flammableOutputConfigs = [
134
+ new FlammableOutputConfig({
135
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 2.0 }),
136
+ transect: new Transect({
137
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
138
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
139
+ }),
140
+ radiationResolution: radiationResolution,
141
+ }),
142
+ new FlammableOutputConfig({
143
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 2.0 }),
144
+ transect: new Transect({
145
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
146
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
147
+ }),
148
+ radiationResolution: radiationResolution,
149
+ }),
150
+ new FlammableOutputConfig({
151
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 2.0 }),
152
+ transect: new Transect({
153
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
154
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
155
+ }),
156
+ radiationResolution: radiationResolution,
157
+ }),
158
+ ];
159
+
160
+ // Distances and ellipses to radiation levels calculation
161
+ const distancesEllipsesCalc = new DistancesAndEllipsesToRadiationLevelsCalculation(
162
+ jetFireCalc.flameResult!,
163
+ jetFireCalc.flameRecords!,
164
+ jetFireCalc.flameRecords!.length,
165
+ weather,
166
+ jetFireCalc.flammableParameters!,
167
+ flammableOutputConfigs,
168
+ flammableOutputConfigs.length
169
+ );
170
+
171
+ console.log("Running distances_and_ellipses_to_radiation_levels_calculation...");
172
+ const distancesEllipsesResult = await distancesEllipsesCalc.run();
173
+
174
+ if (distancesEllipsesCalc.messages.length > 0) {
175
+ console.log("Messages:");
176
+ distancesEllipsesCalc.messages.forEach((msg) => console.log(msg));
177
+ }
178
+
179
+ expect(distancesEllipsesResult).toBe(ResultCode.SUCCESS);
180
+
181
+ // Regression checks
182
+ expect(distancesEllipsesCalc.contourPoints!.length).toBe(150);
183
+
184
+ if (distancesEllipsesCalc.contourPoints!.length > 0) {
185
+ const contourPointError = Math.abs(
186
+ (distancesEllipsesCalc.contourPoints![distancesEllipsesCalc.contourPoints!.length - 1].x - 96.74496662598202) / 96.74496662598202
187
+ );
188
+ expect(contourPointError).toBeLessThan(1e-3);
189
+ }
190
+
191
+ const areaError = Math.abs(
192
+ (distancesEllipsesCalc.areas![0] - 11027.574303452657) / 11027.574303452657
193
+ );
194
+ expect(areaError).toBeLessThan(1e-3);
195
+
196
+ console.log(`SUCCESS: distances_and_ellipses_to_radiation_levels_calculation (${distancesEllipsesCalc.calculationElapsedTime}ms)`);
197
+ });
198
+ });
@@ -0,0 +1,178 @@
1
+ import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { JetFireCalculation } from "../../src/calculations/jetFire";
3
+ import { DistancesAndEllipsesToRadiationLevelsCalculation } from "../../src/calculations/radiation";
4
+ import { DischargeParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, Resolution, ResultCode, TimeVaryingOption, VesselShape } 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 68 - Distances and Ellipses to Radiation Levels Scenario", () => {
16
+ test("should run vessel state, leak, jet fire, and distances/ellipses calculations with regression checks", async () => {
17
+ // Define case properties
18
+ const materialName = "N-BUTANE";
19
+ const stateTemperature = 360.0;
20
+ const statePressure = 3.0e6;
21
+ const vesselShape = VesselShape.VESSEL_SPHERE;
22
+ const vesselDiameter = 3.0;
23
+ const leakHoleDiameter = 0.1;
24
+ const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
25
+ const leakHoleHeightFraction = 0.3;
26
+ const liquidFillFractionByVolume = 0.4;
27
+ const windSpeed = 2.0;
28
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
29
+ const timeOfInterest = 2600.0;
30
+ const radiationResolution = Resolution.EXTREME;
31
+
32
+ // Define material and state
33
+ const material = new Material({
34
+ name: materialName,
35
+ components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
36
+ componentCount: 1,
37
+ });
38
+
39
+ const state = new State({
40
+ temperature: stateTemperature,
41
+ pressure: statePressure,
42
+ liquidFraction: 0.0,
43
+ });
44
+
45
+ // Vessel state calculation
46
+ const vesselStateCalc = new VesselStateCalculation(material, state);
47
+
48
+ console.log("Running vessel_state_calculation...");
49
+ const vesselStateResult = await vesselStateCalc.run();
50
+
51
+ if (vesselStateCalc.messages.length > 0) {
52
+ console.log("Messages:");
53
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
54
+ }
55
+
56
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
57
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
58
+
59
+ // Define vessel
60
+ const vessel = new Vessel({
61
+ state: vesselStateCalc.outputState!,
62
+ material: vesselStateCalc.material,
63
+ vesselConditions: vesselStateCalc.vesselConditions,
64
+ location: new LocalPosition({ x: 0, y: 0, z: 0 }),
65
+ diameter: vesselDiameter,
66
+ shape: vesselShape,
67
+ liquidFillFractionByVolume: liquidFillFractionByVolume,
68
+ });
69
+
70
+ // Define leak
71
+ const leak = new Leak({
72
+ holeDiameter: leakHoleDiameter,
73
+ holeHeightFraction: leakHoleHeightFraction,
74
+ timeVaryingOption: timeVaryingOption,
75
+ });
76
+
77
+ // Vessel leak calculation
78
+ const dischargeParams = new DischargeParameters();
79
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
80
+
81
+ console.log("Running vessel_leak_calculation...");
82
+ const leakResult = await vesselLeakCalc.run();
83
+
84
+ if (vesselLeakCalc.messages.length > 0) {
85
+ console.log("Messages:");
86
+ vesselLeakCalc.messages.forEach((msg) => console.log(msg));
87
+ }
88
+
89
+ expect(leakResult).toBe(ResultCode.SUCCESS);
90
+ console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
91
+
92
+ // Set up entities for jet fire calculation
93
+ const weather = new Weather({
94
+ windSpeed: windSpeed,
95
+ stabilityClass: stabilityClass,
96
+ });
97
+
98
+ const substrate = new Substrate({
99
+ bund: undefined, // Substrate in Python test uses default bund (equivalent to unspecified in TS)
100
+ });
101
+
102
+ const flammableParams = new FlammableParameters({
103
+ timeOfInterest: timeOfInterest,
104
+ });
105
+
106
+ // Jet fire calculation
107
+ const jetFireCalc = new JetFireCalculation(
108
+ vesselLeakCalc.exitMaterial!,
109
+ vesselLeakCalc.dischargeRecords!,
110
+ vesselLeakCalc.dischargeRecords!.length,
111
+ vesselLeakCalc.dischargeResult!,
112
+ weather,
113
+ substrate,
114
+ flammableParams
115
+ );
116
+
117
+ console.log("Running jet_fire_calculation...");
118
+ const jetFireResult = await jetFireCalc.run();
119
+
120
+ if (jetFireCalc.messages.length > 0) {
121
+ console.log("Messages:");
122
+ jetFireCalc.messages.forEach((msg) => console.log(msg));
123
+ }
124
+
125
+ expect(jetFireResult).toBe(ResultCode.SUCCESS);
126
+ console.log(`SUCCESS: jet_fire_calculation (${jetFireCalc.calculationElapsedTime}ms)`);
127
+
128
+ // Flammable output configurations
129
+ const flammableOutputConfigs = [
130
+ new FlammableOutputConfig({
131
+ position: new LocalPosition({ x: 5.0, y: 0.0, z: 0.0 }),
132
+ transect: new Transect({
133
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
134
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
135
+ }),
136
+ radiationResolution: radiationResolution,
137
+ }),
138
+ ];
139
+
140
+ // Distances and ellipses to radiation levels calculation
141
+ const distancesEllipsesCalc = new DistancesAndEllipsesToRadiationLevelsCalculation(
142
+ jetFireCalc.flameResult!,
143
+ jetFireCalc.flameRecords!,
144
+ jetFireCalc.flameRecords!.length,
145
+ weather,
146
+ jetFireCalc.flammableParameters!,
147
+ flammableOutputConfigs,
148
+ flammableOutputConfigs.length
149
+ );
150
+
151
+ console.log("Running distances_and_ellipses_to_radiation_levels_calculation...");
152
+ const distancesEllipsesResult = await distancesEllipsesCalc.run();
153
+
154
+ if (distancesEllipsesCalc.messages.length > 0) {
155
+ console.log("Messages:");
156
+ distancesEllipsesCalc.messages.forEach((msg) => console.log(msg));
157
+ }
158
+
159
+ expect(distancesEllipsesResult).toBe(ResultCode.SUCCESS);
160
+
161
+ // Regression checks
162
+ expect(distancesEllipsesCalc.contourPoints!.length).toBe(50);
163
+
164
+ if (distancesEllipsesCalc.contourPoints!.length > 0) {
165
+ const contourPointError = Math.abs(
166
+ (distancesEllipsesCalc.contourPoints![distancesEllipsesCalc.contourPoints!.length - 1].x - 296.1082631873717) / 296.1082631873717
167
+ );
168
+ expect(contourPointError).toBeLessThan(1e-3);
169
+ }
170
+
171
+ const areaError = Math.abs(
172
+ (distancesEllipsesCalc.areas![0] - 114055.56705017174) / 114055.56705017174
173
+ );
174
+ expect(areaError).toBeLessThan(1e-3);
175
+
176
+ console.log(`SUCCESS: distances_and_ellipses_to_radiation_levels_calculation (${distancesEllipsesCalc.calculationElapsedTime}ms)`);
177
+ });
178
+ });
@@ -0,0 +1,158 @@
1
+ import { VesselCatastrophicRuptureCalculation, 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, 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 31a - Distances and Footprints to Concentration Levels Scenario", () => {
16
+ test("should run vessel, rupture, dispersion, and distances/footprints 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 and footprints to concentration levels calculation
117
+ const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0 })];
118
+
119
+ const distancesFootprintsCalc = new DistancesAndFootprintsToConcentrationLevelsCalculation(
120
+ dispersionCalc.scalarUdmOutputs!,
121
+ weather,
122
+ dispersionCalc.dispersionRecords!,
123
+ dispersionCalc.dispersionRecords!.length,
124
+ substrate,
125
+ dispersionOutputConfigs,
126
+ dispersionOutputConfigs.length,
127
+ dispersionParams,
128
+ vesselRuptureCalc.exitMaterial!,
129
+ );
130
+
131
+ console.log("Running distances_and_footprints_to_concentration_levels_calculation...");
132
+ const distancesFootprintsResult = await distancesFootprintsCalc.run();
133
+
134
+ if (distancesFootprintsCalc.messages.length > 0) {
135
+ console.log("Messages:");
136
+ distancesFootprintsCalc.messages.forEach((msg) => console.log(msg));
137
+ }
138
+
139
+ expect(distancesFootprintsResult).toBe(ResultCode.SUCCESS);
140
+
141
+ // Regression checks
142
+ expect(distancesFootprintsCalc.contourPoints!.length).toBe(723);
143
+
144
+ if (distancesFootprintsCalc.contourPoints!.length > 0) {
145
+ const contourPointError = Math.abs(
146
+ (distancesFootprintsCalc.contourPoints![distancesFootprintsCalc.contourPoints!.length - 3].x - (-7.7737846974650235)) / (-7.7737846974650235)
147
+ );
148
+ expect(contourPointError).toBeLessThan(1e-3);
149
+ }
150
+
151
+ const distanceError = Math.abs(
152
+ (distancesFootprintsCalc.distancesConcentration![0] - 33.477492122323696) / 33.477492122323696
153
+ );
154
+ expect(distanceError).toBeLessThan(1e-3);
155
+
156
+ console.log(`SUCCESS: distances_and_footprints_to_concentration_levels_calculation (${distancesFootprintsCalc.calculationElapsedTime}ms)`);
157
+ });
158
+ });
@@ -0,0 +1,156 @@
1
+ import { VesselCatastrophicRuptureCalculation, 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, 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 32a - Distances and Footprints to Concentration Levels Scenario", () => {
16
+ test("should run vessel, rupture, dispersion, and distances/footprints calculations with regression checks", async () => {
17
+ // Define material and state
18
+ const material = new Material({
19
+ name: "HEXANE",
20
+ components: [
21
+ new MaterialComponent({ name: "N-HEXANE", moleFraction: 1.0 }),
22
+ ],
23
+ componentCount: 1,
24
+ });
25
+
26
+ const state = new State({
27
+ temperature: 280.0,
28
+ pressure: 2.0e5,
29
+ liquidFraction: 0.8,
30
+ });
31
+
32
+ // Vessel state calculation
33
+ const vesselStateCalc = new VesselStateCalculation(material, state);
34
+
35
+ console.log("Running vessel_state_calculation...");
36
+ const vesselStateResult = await vesselStateCalc.run();
37
+
38
+ if (vesselStateCalc.messages.length > 0) {
39
+ console.log("Messages:");
40
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
41
+ }
42
+
43
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
44
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
45
+
46
+ // Define vessel
47
+ const vessel = new Vessel({
48
+ state,
49
+ material,
50
+ liquidFillFractionByVolume: 0.8,
51
+ shape: VesselShape.VERTICAL_CYLINDER,
52
+ vesselConditions: vesselStateCalc.vesselConditions,
53
+ });
54
+
55
+ // Vessel catastrophic rupture calculation
56
+ const dischargeParams = new DischargeParameters();
57
+ const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
58
+
59
+ console.log("Running vessel_catastrophic_rupture_calculation...");
60
+ const ruptureResult = await vesselRuptureCalc.run();
61
+
62
+ if (vesselRuptureCalc.messages.length > 0) {
63
+ console.log("Messages:");
64
+ vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
65
+ }
66
+
67
+ expect(ruptureResult).toBe(ResultCode.SUCCESS);
68
+ console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
69
+
70
+ // Set up entities for dispersion calculation
71
+ const bund = new Bund({
72
+ specifyBund: true,
73
+ bundHeight: 1.0,
74
+ bundDiameter: 8.0,
75
+ });
76
+
77
+ const substrate = new Substrate({
78
+ bund,
79
+ surfaceType: SurfaceType.WATER,
80
+ surfaceRoughness: 0.05,
81
+ });
82
+
83
+ const weather = new Weather({
84
+ windSpeed: 2.0,
85
+ stabilityClass: AtmosphericStabilityClass.STABILITY_F,
86
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
87
+ });
88
+
89
+ const dispersionParams = new DispersionParameters();
90
+
91
+ // Dispersion calculation
92
+ const dispersionCalc = new DispersionCalculation(
93
+ vesselRuptureCalc.exitMaterial!,
94
+ substrate,
95
+ vesselRuptureCalc.dischargeResult!,
96
+ vesselRuptureCalc.dischargeRecords!,
97
+ vesselRuptureCalc.dischargeRecords!.length,
98
+ weather,
99
+ dispersionParams,
100
+ 0.0 // endPointConcentration
101
+ );
102
+
103
+ console.log("Running dispersion_calculation...");
104
+ const dispersionResult = await dispersionCalc.run();
105
+
106
+ if (dispersionCalc.messages.length > 0) {
107
+ console.log("Messages:");
108
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
109
+ }
110
+
111
+ expect(dispersionResult).toBe(ResultCode.SUCCESS);
112
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
113
+
114
+ // Distances and footprints to concentration levels calculation
115
+ const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0 })];
116
+
117
+ const distancesFootprintsCalc = new DistancesAndFootprintsToConcentrationLevelsCalculation(
118
+ dispersionCalc.scalarUdmOutputs!,
119
+ weather,
120
+ dispersionCalc.dispersionRecords!,
121
+ dispersionCalc.dispersionRecords!.length,
122
+ substrate,
123
+ dispersionOutputConfigs,
124
+ dispersionOutputConfigs.length,
125
+ dispersionParams,
126
+ vesselRuptureCalc.exitMaterial!
127
+ );
128
+
129
+ console.log("Running distances_and_footprints_to_concentration_levels_calculation...");
130
+ const distancesFootprintsResult = await distancesFootprintsCalc.run();
131
+
132
+ if (distancesFootprintsCalc.messages.length > 0) {
133
+ console.log("Messages:");
134
+ distancesFootprintsCalc.messages.forEach((msg) => console.log(msg));
135
+ }
136
+
137
+ expect(distancesFootprintsResult).toBe(ResultCode.SUCCESS);
138
+
139
+ // Regression checks
140
+ expect(distancesFootprintsCalc.contourPoints!.length).toBe(569);
141
+
142
+ if (distancesFootprintsCalc.contourPoints!.length > 0) {
143
+ const contourPointError = Math.abs(
144
+ (distancesFootprintsCalc.contourPoints![distancesFootprintsCalc.contourPoints!.length - 3].x - (-5.466432738453024)) / (-5.466432738453024)
145
+ );
146
+ expect(contourPointError).toBeLessThan(1e-3);
147
+ }
148
+
149
+ const distanceError = Math.abs(
150
+ (distancesFootprintsCalc.distancesConcentration![0] - 14.139820655455761) / 14.139820655455761
151
+ );
152
+ expect(distanceError).toBeLessThan(1e-3);
153
+
154
+ console.log(`SUCCESS: distances_and_footprints_to_concentration_levels_calculation (${distancesFootprintsCalc.calculationElapsedTime}ms)`);
155
+ });
156
+ });