@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,157 @@
1
+ import { Material, MaterialComponent, State, Vessel, Weather, Substrate, DischargeParameters, DispersionParameters, DispersionOutputConfig, ExplosionParameters, ExplosionOutputConfig, ExplosionConfinedVolume } from "../../src/entities";
2
+ import { VesselStateCalculation, VesselCatastrophicRuptureCalculation } from "../../src/calculations/discharge";
3
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
4
+ import { LateExplosionToOPLevelsCalculation } from "../../src/calculations/lateExplosion";
5
+ import { ResultCode, AtmosphericStabilityClass, SpecialConcentration, 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("Integrated Explosion Scenario - Test Case 46", () => {
16
+ test("should run the full explosion scenario and perform regression check", async () => {
17
+ // Define material
18
+ const material = new Material(
19
+ {
20
+ name: "N-HEXANE",
21
+ components: [
22
+ new MaterialComponent({ name: "N-HEXANE", moleFraction: 1.0 }),
23
+ ]
24
+ });
25
+
26
+ const state = new State({
27
+ temperature: 280.0,
28
+ pressure: 2.0e5,
29
+ liquidFraction: 0.8,
30
+ });
31
+
32
+ const vesselStateCalc = new VesselStateCalculation(material, state);
33
+
34
+ console.log("Running vesselStateCalculation...");
35
+ let resultCode = await vesselStateCalc.run();
36
+
37
+ if (vesselStateCalc.messages.length > 0) {
38
+ console.log("Messages:");
39
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
40
+ }
41
+
42
+ expect(resultCode).toBe(ResultCode.SUCCESS);
43
+ console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
44
+
45
+ const vessel = new Vessel({
46
+ state,
47
+ material,
48
+ liquidFillFractionByVolume: 0.8,
49
+ vesselConditions: vesselStateCalc.vesselConditions,
50
+ });
51
+
52
+ const dischargeParams = new DischargeParameters();
53
+
54
+ const ruptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
55
+
56
+ console.log("Running vesselCatastrophicRuptureCalculation...");
57
+ resultCode = await ruptureCalc.run();
58
+
59
+ if (ruptureCalc.messages.length > 0) {
60
+ console.log("Messages:");
61
+ ruptureCalc.messages.forEach((msg) => console.log(msg));
62
+ }
63
+
64
+ expect(resultCode).toBe(ResultCode.SUCCESS);
65
+ console.log(`SUCCESS: vesselCatastrophicRuptureCalculation (${ruptureCalc.calculationElapsedTime}ms)`);
66
+
67
+ const exitMaterial = ruptureCalc.exitMaterial!;
68
+ const weather = new Weather({
69
+ windSpeed: 1.5,
70
+ stabilityClass: AtmosphericStabilityClass.STABILITY_F,
71
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE,
72
+ });
73
+
74
+ const substrate = new Substrate();
75
+
76
+ const dispersionCalc = new DispersionCalculation(
77
+ exitMaterial,
78
+ substrate,
79
+ ruptureCalc.dischargeResult!,
80
+ ruptureCalc.dischargeRecords!,
81
+ 1,
82
+ weather,
83
+ new DispersionParameters(),
84
+ 0.0,
85
+ );
86
+
87
+ console.log("Running dispersionCalculation...");
88
+ resultCode = await dispersionCalc.run();
89
+
90
+ if (dispersionCalc.messages.length > 0) {
91
+ console.log("Messages:");
92
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
93
+ }
94
+
95
+ expect(resultCode).toBe(ResultCode.SUCCESS);
96
+ console.log(`SUCCESS: dispersionCalculation (${dispersionCalc.calculationElapsedTime}ms)`);
97
+
98
+ const explosionParams = new ExplosionParameters({ explosionUniformStrength: 7.0 });
99
+
100
+ const explosionOutputConfigs = [
101
+ new ExplosionOutputConfig({ overpressureLevel: 1034 }),
102
+ new ExplosionOutputConfig({ overpressureLevel: 2068 }),
103
+ ];
104
+
105
+ const explosionConfinedVolumes = [
106
+ new ExplosionConfinedVolume(),
107
+ new ExplosionConfinedVolume(),
108
+ ];
109
+
110
+ const explosionOutputConfig = new DispersionOutputConfig({
111
+ concentration: 0.0,
112
+ specialConcentration: SpecialConcentration.MIN,
113
+ });
114
+
115
+ const explosionCalc = new LateExplosionToOPLevelsCalculation(
116
+ exitMaterial,
117
+ dispersionCalc.scalarUdmOutputs!,
118
+ weather,
119
+ dispersionCalc.dispersionRecords!,
120
+ dispersionCalc.dispersionRecords!.length,
121
+ substrate,
122
+ explosionOutputConfig,
123
+ explosionOutputConfigs,
124
+ explosionOutputConfigs.length,
125
+ explosionParams,
126
+ explosionConfinedVolumes,
127
+ explosionConfinedVolumes.length,
128
+ new DispersionParameters(),
129
+ );
130
+
131
+ console.log("Running lateExplosionToOPLevelsCalculation...");
132
+ resultCode = await explosionCalc.run();
133
+
134
+ if (explosionCalc.messages.length > 0) {
135
+ console.log("Messages:");
136
+ explosionCalc.messages.forEach((msg) => console.log(msg));
137
+ }
138
+
139
+ expect(resultCode).toBe(ResultCode.SUCCESS);
140
+
141
+ const result = explosionCalc.explosionUnifConfOverpressureResults![0];
142
+ const expectedMass = 11.67432824752745;
143
+ const expectedTime = 1.743456345845083;
144
+ const expectedDistance = 193.98838586988907;
145
+
146
+ const massError = Math.abs((result.explodedMass! - expectedMass) / expectedMass);
147
+ const timeError = Math.abs((result.ignitionTime! - expectedTime) / expectedTime);
148
+ const distanceError = Math.abs((result.maximumDistance! - expectedDistance) / expectedDistance);
149
+
150
+ expect(massError).toBeLessThan(1e-3);
151
+ expect(timeError).toBeLessThan(1e-3);
152
+ expect(distanceError).toBeLessThan(1e-3);
153
+
154
+ console.log(`SUCCESS: lateExplosionToOPLevelsCalculation (${explosionCalc.calculationElapsedTime}ms)`);
155
+ });
156
+ });
157
+
@@ -0,0 +1,149 @@
1
+ import { Material, MaterialComponent, State, Vessel, Weather, Substrate, DischargeParameters, DispersionParameters, DispersionOutputConfig, ExplosionParameters, ExplosionOutputConfig, ExplosionConfinedVolume } from "../../src/entities";
2
+ import { VesselStateCalculation, VesselCatastrophicRuptureCalculation } from "../../src/calculations/discharge";
3
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
4
+ import { LateExplosionToOPLevelsCalculation } from "../../src/calculations/lateExplosion";
5
+ import { ResultCode, AtmosphericStabilityClass, SpecialConcentration, 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("Integrated Explosion Scenario - Test Case 47", () => {
16
+ test("should run the full explosion scenario and perform regression check", async () => {
17
+ // Define material
18
+ const material = new Material({
19
+ name: "AMMONIA",
20
+ components: [new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 })],
21
+ });
22
+
23
+ const state = new State({
24
+ temperature: 265.0,
25
+ pressure: 5.0e5,
26
+ liquidFraction: 0.8,
27
+ });
28
+
29
+ // Create vessel state calculation
30
+ const vesselStateCalc = new VesselStateCalculation(material, state);
31
+ console.log("Running vesselStateCalculation...");
32
+ let resultCode = await vesselStateCalc.run();
33
+
34
+ if (vesselStateCalc.messages.length > 0) {
35
+ console.log("Messages:");
36
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
37
+ }
38
+
39
+ expect(resultCode).toBe(ResultCode.SUCCESS);
40
+ console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
41
+
42
+ const vessel = new Vessel({
43
+ state,
44
+ material,
45
+ liquidFillFractionByVolume: 0.8,
46
+ vesselConditions: vesselStateCalc.vesselConditions,
47
+ });
48
+
49
+ const dischargeParams = new DischargeParameters();
50
+
51
+ const ruptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
52
+ console.log("Running vesselCatastrophicRuptureCalculation...");
53
+ resultCode = await ruptureCalc.run();
54
+
55
+ if (ruptureCalc.messages.length > 0) {
56
+ console.log("Messages:");
57
+ ruptureCalc.messages.forEach((msg) => console.log(msg));
58
+ }
59
+
60
+ expect(resultCode).toBe(ResultCode.SUCCESS);
61
+ console.log(`SUCCESS: vesselCatastrophicRuptureCalculation (${ruptureCalc.calculationElapsedTime}ms)`);
62
+
63
+ const exitMaterial = ruptureCalc.exitMaterial!;
64
+ const weather = new Weather({
65
+ windSpeed: 10.0,
66
+ stabilityClass: AtmosphericStabilityClass.STABILITY_A_,
67
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
68
+ });
69
+
70
+ const substrate = new Substrate();
71
+
72
+ // Create a dispersion calculation
73
+ const dispersionCalc = new DispersionCalculation(
74
+ exitMaterial,
75
+ substrate,
76
+ ruptureCalc.dischargeResult!,
77
+ ruptureCalc.dischargeRecords!,
78
+ ruptureCalc.dischargeRecords!.length,
79
+ weather,
80
+ new DispersionParameters(),
81
+ 0.0
82
+ );
83
+
84
+ console.log("Running dispersionCalculation...");
85
+ resultCode = await dispersionCalc.run();
86
+
87
+ if (dispersionCalc.messages.length > 0) {
88
+ console.log("Messages:");
89
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
90
+ }
91
+
92
+ expect(resultCode).toBe(ResultCode.SUCCESS);
93
+ console.log(`SUCCESS: dispersionCalculation (${dispersionCalc.calculationElapsedTime}ms)`);
94
+
95
+ // Define the explosion parameters and configurations
96
+ const explosionParams = new ExplosionParameters({ explosionUniformStrength: 7.0 });
97
+ const explosionOutputConfigs = [
98
+ new ExplosionOutputConfig({ overpressureLevel: 1034 }),
99
+ new ExplosionOutputConfig({ overpressureLevel: 2068 }),
100
+ ];
101
+ const explosionConfinedVolumes = [new ExplosionConfinedVolume(), new ExplosionConfinedVolume()];
102
+ const dispersionOutputConfig = new DispersionOutputConfig({
103
+ concentration: 0.0,
104
+ specialConcentration: SpecialConcentration.MIN,
105
+ });
106
+
107
+ // Create explosion calculation
108
+ const explosionCalc = new LateExplosionToOPLevelsCalculation(
109
+ exitMaterial,
110
+ dispersionCalc.scalarUdmOutputs!,
111
+ weather,
112
+ dispersionCalc.dispersionRecords!,
113
+ dispersionCalc.dispersionRecords!.length,
114
+ substrate,
115
+ dispersionOutputConfig,
116
+ explosionOutputConfigs,
117
+ explosionOutputConfigs.length,
118
+ explosionParams,
119
+ explosionConfinedVolumes,
120
+ explosionConfinedVolumes.length,
121
+ new DispersionParameters()
122
+ );
123
+
124
+ console.log("Running lateExplosionToOPLevelsCalculation...");
125
+ resultCode = await explosionCalc.run();
126
+
127
+ if (explosionCalc.messages.length > 0) {
128
+ console.log("Messages:");
129
+ explosionCalc.messages.forEach((msg) => console.log(msg));
130
+ }
131
+
132
+ expect(resultCode).toBe(ResultCode.SUCCESS);
133
+
134
+ const result = explosionCalc.explosionUnifConfOverpressureResults![0];
135
+ const expectedMass = 1005.575405356289;
136
+ const expectedTime = 0.5886114409418679;
137
+ const expectedDistance = 626.5034456922325;
138
+
139
+ const massError = Math.abs((result.explodedMass! - expectedMass) / expectedMass);
140
+ const timeError = Math.abs((result.ignitionTime! - expectedTime) / expectedTime);
141
+ const distanceError = Math.abs((result.maximumDistance! - expectedDistance) / expectedDistance);
142
+
143
+ expect(massError).toBeLessThan(1e-3);
144
+ expect(timeError).toBeLessThan(1e-3);
145
+ expect(distanceError).toBeLessThan(1e-3);
146
+
147
+ console.log(`SUCCESS: lateExplosionToOPLevelsCalculation (${explosionCalc.calculationElapsedTime}ms)`);
148
+ });
149
+ });
@@ -0,0 +1,176 @@
1
+ import { Material, MaterialComponent, State, ReliefValve, Vessel, Weather, Substrate, DischargeParameters, DispersionParameters, DispersionOutputConfig, ExplosionParameters, ExplosionOutputConfig, ExplosionConfinedVolume } from "../../src/entities";
2
+ import { VesselStateCalculation, VesselReliefValveCalculation } from "../../src/calculations/discharge";
3
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
4
+ import { LateExplosionToOPLevelsCalculation } from "../../src/calculations/lateExplosion";
5
+ import { ResultCode, AtmosphericStabilityClass, SpecialConcentration, 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("Integrated Explosion Scenario - Test Case 48", () => {
16
+ test("should run the full explosion scenario and perform regression check", async () => {
17
+ // Define the initial state of the vessel
18
+ const state = new State({
19
+ temperature: 270.0,
20
+ pressure: 8e6,
21
+ liquidFraction: 1.0
22
+ });
23
+
24
+ // Define the material contained by the vessel
25
+ const material = new Material({
26
+ name: "HYDROGEN",
27
+ components: [new MaterialComponent({ name: "HYDROGEN", moleFraction: 1.0 })]
28
+ });
29
+
30
+ // Create and run vessel state calculation
31
+ const vesselStateCalc = new VesselStateCalculation(material, state);
32
+
33
+ console.log("Running vesselStateCalculation...");
34
+ let resultCode = 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(resultCode).toBe(ResultCode.SUCCESS);
42
+ console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
43
+
44
+ // Create vessel (sphere with 5m diameter)
45
+ const vessel = new Vessel({
46
+ state,
47
+ material,
48
+ vesselConditions: vesselStateCalc.vesselConditions,
49
+ liquidFillFractionByVolume: 0.7,
50
+ shape: VesselShape.VESSEL_SPHERE,
51
+ diameter: 5
52
+ });
53
+
54
+ // Create relief valve
55
+ const reliefValve = new ReliefValve({
56
+ pipeDiameter: 0.5,
57
+ pipeLength: 1.0,
58
+ pipeHeightFraction: 1,
59
+ reliefValveConstrictionDiameter: 0.25
60
+ });
61
+
62
+ // Create and run vessel relief valve calculation
63
+ const reliefValveCalc = new VesselReliefValveCalculation(vessel, reliefValve, new DischargeParameters());
64
+
65
+ console.log("Running vesselReliefValveCalculation...");
66
+ resultCode = await reliefValveCalc.run();
67
+
68
+ if (reliefValveCalc.messages.length > 0) {
69
+ console.log("Messages:");
70
+ reliefValveCalc.messages.forEach((msg) => console.log(msg));
71
+ }
72
+
73
+ expect(resultCode).toBe(ResultCode.SUCCESS);
74
+ console.log(`SUCCESS: vesselReliefValveCalculation (${reliefValveCalc.calculationElapsedTime}ms)`);
75
+ console.log(`vesselReliefValveCalculation.dischargeResult.releaseMass: ${reliefValveCalc.dischargeResult!.releaseMass} [kg]`);
76
+
77
+ const exitMaterial = reliefValveCalc.exitMaterial!;
78
+
79
+ // Define weather
80
+ const weather = new Weather({
81
+ windSpeed: 1.5,
82
+ stabilityClass: AtmosphericStabilityClass.STABILITY_F,
83
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
84
+ });
85
+
86
+ // Define substrate
87
+ const substrate = new Substrate();
88
+
89
+ // Create and run dispersion calculation
90
+ const dispersionCalc = new DispersionCalculation(
91
+ exitMaterial,
92
+ substrate,
93
+ reliefValveCalc.dischargeResult!,
94
+ reliefValveCalc.dischargeRecords!,
95
+ reliefValveCalc.dischargeRecords!.length,
96
+ weather,
97
+ new DispersionParameters(),
98
+ 0.0
99
+ );
100
+
101
+ console.log("Running dispersionCalculation...");
102
+ resultCode = await dispersionCalc.run();
103
+
104
+ if (dispersionCalc.messages.length > 0) {
105
+ console.log("Messages:");
106
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
107
+ }
108
+
109
+ expect(resultCode).toBe(ResultCode.SUCCESS);
110
+ console.log(`SUCCESS: dispersionCalculation (${dispersionCalc.calculationElapsedTime}ms)`);
111
+
112
+ // Define explosion configurations
113
+ const dispersionOutputConfig = new DispersionOutputConfig({
114
+ concentration: 0.0,
115
+ specialConcentration: SpecialConcentration.MIN
116
+ });
117
+
118
+ const explosionParams = new ExplosionParameters({
119
+ explosionUniformStrength: 10.0
120
+ });
121
+
122
+ const explosionOutputConfigs = [
123
+ new ExplosionOutputConfig({ overpressureLevel: 1034 }),
124
+ new ExplosionOutputConfig({ overpressureLevel: 2068 }),
125
+ new ExplosionOutputConfig({ overpressureLevel: 4136 })
126
+ ];
127
+
128
+ const explosionConfinedVolumes = [
129
+ new ExplosionConfinedVolume(),
130
+ new ExplosionConfinedVolume()
131
+ ];
132
+
133
+ // Create and run explosion calculation
134
+ const explosionCalc = new LateExplosionToOPLevelsCalculation(
135
+ exitMaterial,
136
+ dispersionCalc.scalarUdmOutputs!,
137
+ weather,
138
+ dispersionCalc.dispersionRecords!,
139
+ dispersionCalc.dispersionRecords!.length,
140
+ substrate,
141
+ dispersionOutputConfig,
142
+ explosionOutputConfigs,
143
+ explosionOutputConfigs.length,
144
+ explosionParams,
145
+ explosionConfinedVolumes,
146
+ explosionConfinedVolumes.length,
147
+ new DispersionParameters()
148
+ );
149
+
150
+ console.log("Running lateExplosionToOPLevelsCalculation...");
151
+ resultCode = await explosionCalc.run();
152
+
153
+ if (explosionCalc.messages.length > 0) {
154
+ console.log("Messages:");
155
+ explosionCalc.messages.forEach((msg) => console.log(msg));
156
+ }
157
+
158
+ expect(resultCode).toBe(ResultCode.SUCCESS);
159
+
160
+ // Regression checks
161
+ const result = explosionCalc.explosionUnifConfOverpressureResults![0];
162
+ const expectedMass = 364.4122308301167;
163
+ const expectedTime = 4.444690161422924;
164
+ const expectedDistance = 1024.8207387858251;
165
+
166
+ const massError = Math.abs((result.explodedMass! - expectedMass) / expectedMass);
167
+ const timeError = Math.abs((result.ignitionTime! - expectedTime) / expectedTime);
168
+ const distanceError = Math.abs((result.maximumDistance! - expectedDistance) / expectedDistance);
169
+
170
+ expect(massError).toBeLessThan(1e-3);
171
+ expect(timeError).toBeLessThan(1e-3);
172
+ expect(distanceError).toBeLessThan(1e-3);
173
+
174
+ console.log(`SUCCESS: lateExplosionToOPLevelsCalculation (${explosionCalc.calculationElapsedTime}ms)`);
175
+ });
176
+ });
@@ -0,0 +1,178 @@
1
+ import { Material, MaterialComponent, State, Vessel, LineRupture, Weather, Substrate, DischargeParameters, DispersionParameters, DispersionOutputConfig, ExplosionParameters, ExplosionOutputConfig, ExplosionConfinedVolume } from "../../src/entities";
2
+ import { VesselStateCalculation, VesselLineRuptureCalculation } from "../../src/calculations/discharge";
3
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
4
+ import { LateExplosionToOPLevelsCalculation } from "../../src/calculations/lateExplosion";
5
+ import { ResultCode, AtmosphericStabilityClass, SpecialConcentration, 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("Integrated Explosion Scenario - Test Case 49", () => {
16
+ test("should run the full explosion scenario and perform regression check", async () => {
17
+ // Define the initial state of the vessel
18
+ const state = new State({
19
+ temperature: 260.0,
20
+ pressure: 5e5,
21
+ liquidFraction: 1.0
22
+ });
23
+
24
+ // Define the material contained by the vessel
25
+ const material = new Material({
26
+ name: "ETHANE_METHANE_HY",
27
+ components: [
28
+ new MaterialComponent({ name: "ETHANE", moleFraction: 0.15 }),
29
+ new MaterialComponent({ name: "METHANE", moleFraction: 0.8 }),
30
+ new MaterialComponent({ name: "HYDROGEN", moleFraction: 0.05 })
31
+ ],
32
+ componentCount: 3
33
+ });
34
+
35
+ // Create and run vessel state calculation
36
+ const vesselStateCalc = new VesselStateCalculation(material, state);
37
+
38
+ console.log("Running vesselStateCalculation...");
39
+ let resultCode = await vesselStateCalc.run();
40
+
41
+ if (vesselStateCalc.messages.length > 0) {
42
+ console.log("Messages:");
43
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
44
+ }
45
+
46
+ expect(resultCode).toBe(ResultCode.SUCCESS);
47
+ console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
48
+
49
+ // Create vessel (sphere with 3m diameter)
50
+ const vessel = new Vessel({
51
+ state,
52
+ material,
53
+ vesselConditions: vesselStateCalc.vesselConditions,
54
+ liquidFillFractionByVolume: 0.7,
55
+ shape: VesselShape.VESSEL_SPHERE,
56
+ diameter: 3
57
+ });
58
+
59
+ // Create line rupture
60
+ const lineRupture = new LineRupture({
61
+ pipeDiameter: 0.5,
62
+ pipeLength: 1.0,
63
+ pipeHeightFraction: 0.5
64
+ });
65
+
66
+ // Create and run vessel line rupture calculation
67
+ const lineRuptureCalc = new VesselLineRuptureCalculation(vessel, lineRupture, new DischargeParameters());
68
+
69
+ console.log("Running vesselLineRuptureCalculation...");
70
+ resultCode = await lineRuptureCalc.run();
71
+
72
+ if (lineRuptureCalc.messages.length > 0) {
73
+ console.log("Messages:");
74
+ lineRuptureCalc.messages.forEach((msg) => console.log(msg));
75
+ }
76
+
77
+ expect(resultCode).toBe(ResultCode.SUCCESS);
78
+ console.log(`SUCCESS: vesselLineRuptureCalculation (${lineRuptureCalc.calculationElapsedTime}ms)`);
79
+ console.log(`vesselLineRuptureCalculation.dischargeResult.releaseMass: ${lineRuptureCalc.dischargeResult!.releaseMass} [kg]`);
80
+
81
+ const exitMaterial = lineRuptureCalc.exitMaterial!;
82
+
83
+ // Define weather
84
+ const weather = new Weather({
85
+ windSpeed: 1.5,
86
+ stabilityClass: AtmosphericStabilityClass.STABILITY_F,
87
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
88
+ });
89
+
90
+ // Define substrate
91
+ const substrate = new Substrate();
92
+
93
+ // Create and run dispersion calculation
94
+ const dispersionCalc = new DispersionCalculation(
95
+ exitMaterial,
96
+ substrate,
97
+ lineRuptureCalc.dischargeResult!,
98
+ lineRuptureCalc.dischargeRecords!,
99
+ lineRuptureCalc.dischargeRecords!.length,
100
+ weather,
101
+ new DispersionParameters(),
102
+ 0.0
103
+ );
104
+
105
+ console.log("Running dispersionCalculation...");
106
+ resultCode = 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(resultCode).toBe(ResultCode.SUCCESS);
114
+ console.log(`SUCCESS: dispersionCalculation (${dispersionCalc.calculationElapsedTime}ms)`);
115
+
116
+ // Define explosion configurations
117
+ const dispersionOutputConfig = new DispersionOutputConfig({
118
+ concentration: 0.0,
119
+ specialConcentration: SpecialConcentration.MIN
120
+ });
121
+
122
+ const explosionParams = new ExplosionParameters({
123
+ explosionUniformStrength: 8.0
124
+ });
125
+
126
+ const explosionOutputConfigs = [
127
+ new ExplosionOutputConfig({ overpressureLevel: 20680 })
128
+ ];
129
+
130
+ const explosionConfinedVolumes = [
131
+ new ExplosionConfinedVolume(),
132
+ new ExplosionConfinedVolume()
133
+ ];
134
+
135
+ // Create and run explosion calculation
136
+ const explosionCalc = new LateExplosionToOPLevelsCalculation(
137
+ exitMaterial,
138
+ dispersionCalc.scalarUdmOutputs!,
139
+ weather,
140
+ dispersionCalc.dispersionRecords!,
141
+ dispersionCalc.dispersionRecords!.length,
142
+ substrate,
143
+ dispersionOutputConfig,
144
+ explosionOutputConfigs,
145
+ explosionOutputConfigs.length,
146
+ explosionParams,
147
+ explosionConfinedVolumes,
148
+ explosionConfinedVolumes.length,
149
+ new DispersionParameters()
150
+ );
151
+
152
+ console.log("Running lateExplosionToOPLevelsCalculation...");
153
+ resultCode = await explosionCalc.run();
154
+
155
+ if (explosionCalc.messages.length > 0) {
156
+ console.log("Messages:");
157
+ explosionCalc.messages.forEach((msg) => console.log(msg));
158
+ }
159
+
160
+ expect(resultCode).toBe(ResultCode.SUCCESS);
161
+
162
+ // Regression checks
163
+ const result = explosionCalc.explosionUnifConfOverpressureResults![0];
164
+ const expectedMass = 31.04536142489174;
165
+ const expectedTime = 1.1859455812737545;
166
+ const expectedDistance = 70.52548140876165;
167
+
168
+ const massError = Math.abs((result.explodedMass! - expectedMass) / expectedMass);
169
+ const timeError = Math.abs((result.ignitionTime! - expectedTime) / expectedTime);
170
+ const distanceError = Math.abs((result.maximumDistance! - expectedDistance) / expectedDistance);
171
+
172
+ expect(massError).toBeLessThan(1e-3);
173
+ expect(timeError).toBeLessThan(1e-3);
174
+ expect(distanceError).toBeLessThan(1e-3);
175
+
176
+ console.log(`SUCCESS: lateExplosionToOPLevelsCalculation (${explosionCalc.calculationElapsedTime}ms)`);
177
+ });
178
+ });