@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,151 @@
1
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation, } from "../../src/calculations/discharge";
2
+ import { FireballCalculation } from "../../src/calculations/fireball";
3
+ import { RadiationTransectCalculation, } from "../../src/calculations/radiation";
4
+ import { DischargeParameters, FlammableOutputConfig, FlammableParameters, LocalPosition, Material, MaterialComponent, State, Transect, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, Resolution, ResultCode, VesselShape, VesselConditions } 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 89 - Vessel and Fireball Scenario", () => {
16
+ test("should run vessel and fireball 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: 250.0,
26
+ pressure: 5.0e6,
27
+ liquidFraction: 0.8,
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.8,
49
+ diameter: 2.0,
50
+ length: 5,
51
+ shape: VesselShape.HORIZONTAL_CYLINDER,
52
+ vesselConditions: vesselStateCalc.vesselConditions as VesselConditions,
53
+ });
54
+
55
+ // Vessel catastrophic rupture calculation
56
+ const dischargeParams = new DischargeParameters();
57
+ const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(
58
+ vessel,
59
+ dischargeParams
60
+ );
61
+
62
+ console.log("Running vessel_catastrophic_rupture_calculation...");
63
+ const ruptureResult = await vesselRuptureCalc.run();
64
+
65
+ if (vesselRuptureCalc.messages.length > 0) {
66
+ console.log("Messages:");
67
+ vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
68
+ }
69
+
70
+ expect(ruptureResult).toBe(ResultCode.SUCCESS);
71
+ console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
72
+
73
+ const exitMaterial = vesselRuptureCalc.exitMaterial;
74
+
75
+ // Define weather
76
+ const weather = new Weather({
77
+ windSpeed: 1.5,
78
+ stabilityClass: AtmosphericStabilityClass.STABILITY_F,
79
+ });
80
+
81
+ // Fireball calculation
82
+ const fireballCalc = new FireballCalculation(
83
+ exitMaterial!,
84
+ state,
85
+ vesselRuptureCalc.dischargeRecords!,
86
+ vesselRuptureCalc.dischargeRecords!.length,
87
+ vesselRuptureCalc.dischargeResult!,
88
+ weather,
89
+ );
90
+
91
+ console.log("Running fireball_calculation...");
92
+ const fireballResult = await fireballCalc.run();
93
+
94
+ if (fireballCalc.messages.length > 0) {
95
+ console.log("Messages:");
96
+ fireballCalc.messages.forEach((msg) => console.log(msg));
97
+ }
98
+
99
+ expect(fireballResult).toBe(ResultCode.SUCCESS);
100
+ console.log(`SUCCESS: fireball_calculation (${fireballCalc.calculationElapsedTime}ms)`);
101
+
102
+ // Radiation transect calculation
103
+ const radiationResolution = Resolution.MEDIUM;
104
+ const transect = new Transect({
105
+ transectStartPoint: new LocalPosition({ x: 10.0, y: 0.0, z: 1.0 }),
106
+ transectEndPoint: new LocalPosition({ x: 10.0, y: 0.0, z: 50.0 }),
107
+ });
108
+
109
+ const flammableOutputConfig = new FlammableOutputConfig({
110
+ position: new LocalPosition(),
111
+ transect,
112
+ radiationResolution,
113
+ });
114
+
115
+ const radiationCalc = new RadiationTransectCalculation(
116
+ fireballCalc.flameResult!,
117
+ fireballCalc.flameRecords!,
118
+ fireballCalc.flameRecords!.length,
119
+ weather,
120
+ new FlammableParameters(),
121
+ flammableOutputConfig,
122
+ );
123
+
124
+ console.log("Running radiation_transect_calculation...");
125
+ const radiationResult = await radiationCalc.run();
126
+
127
+ if (radiationCalc.messages.length > 0) {
128
+ console.log("Messages:");
129
+ radiationCalc.messages.forEach((msg) => console.log(msg));
130
+ }
131
+
132
+ expect(radiationResult).toBe(ResultCode.SUCCESS);
133
+
134
+ // Regression checks
135
+ const flameDiameterError = Math.abs(
136
+ (fireballCalc.flameResult!.flameDiameter! - 56.27145004272461) /
137
+ 56.27145004272461
138
+ );
139
+ expect(flameDiameterError).toBeLessThan(1e-3);
140
+
141
+ expect(radiationCalc.radiationRecords!.length).toBe(50);
142
+
143
+ const radiationResultError = Math.abs(
144
+ (radiationCalc.radiationRecords![0].radiationResult! - 27343.376825044117) /
145
+ 27343.376825044117
146
+ );
147
+ expect(radiationResultError).toBeLessThan(1e-3);
148
+
149
+ console.log(`SUCCESS: radiation_transect_calculation (${radiationCalc.calculationElapsedTime}ms)`);
150
+ });
151
+ });
@@ -0,0 +1,153 @@
1
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { FireballCalculation } from "../../src/calculations/fireball";
3
+ import { RadiationTransectCalculation } from "../../src/calculations/radiation";
4
+ import { DischargeParameters, FlammableOutputConfig, FlammableParameters, LocalPosition, Material, MaterialComponent, State, Transect, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, Resolution, ResultCode, VesselShape, VesselConditions } 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 90 - Vessel and Fireball Scenario", () => {
16
+ test("should run vessel and fireball 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 as VesselConditions,
55
+ });
56
+
57
+ // Vessel catastrophic rupture calculation
58
+ const dischargeParams = new DischargeParameters();
59
+ const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(
60
+ vessel,
61
+ dischargeParams
62
+ );
63
+
64
+ console.log("Running vessel_catastrophic_rupture_calculation...");
65
+ const ruptureResult = await vesselRuptureCalc.run();
66
+
67
+ if (vesselRuptureCalc.messages.length > 0) {
68
+ console.log("Messages:");
69
+ vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
70
+ }
71
+
72
+ expect(ruptureResult).toBe(ResultCode.SUCCESS);
73
+ console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
74
+
75
+ const exitMaterial = vesselRuptureCalc.exitMaterial;
76
+
77
+ // Define weather
78
+ const weather = new Weather({
79
+ windSpeed: 2.0,
80
+ stabilityClass: AtmosphericStabilityClass.STABILITY_E,
81
+ });
82
+
83
+ // Fireball calculation
84
+ const fireballCalc = new FireballCalculation(
85
+ exitMaterial!,
86
+ state,
87
+ vesselRuptureCalc.dischargeRecords!,
88
+ vesselRuptureCalc.dischargeRecords!.length,
89
+ vesselRuptureCalc.dischargeResult!,
90
+ weather,
91
+ );
92
+
93
+ console.log("Running fireball_calculation...");
94
+ const fireballResult = await fireballCalc.run();
95
+
96
+ if (fireballCalc.messages.length > 0) {
97
+ console.log("Messages:");
98
+ fireballCalc.messages.forEach((msg) => console.log(msg));
99
+ }
100
+
101
+ expect(fireballResult).toBe(ResultCode.SUCCESS);
102
+ console.log(`SUCCESS: fireball_calculation (${fireballCalc.calculationElapsedTime}ms)`);
103
+
104
+ // Radiation transect calculation
105
+ const radiationResolution = Resolution.MEDIUM;
106
+ const transect = new Transect({
107
+ transectStartPoint: new LocalPosition({ x: 10.0, y: 0.0, z: 5.0 }),
108
+ transectEndPoint: new LocalPosition({ x: 100.0, y: 0.0, z: 5.0 }),
109
+ });
110
+
111
+ const flammableOutputConfig = new FlammableOutputConfig({
112
+ position: new LocalPosition(),
113
+ transect,
114
+ radiationResolution,
115
+ });
116
+
117
+ const radiationCalc = new RadiationTransectCalculation(
118
+ fireballCalc.flameResult!,
119
+ fireballCalc.flameRecords!,
120
+ fireballCalc.flameRecords!.length,
121
+ weather,
122
+ new FlammableParameters(),
123
+ flammableOutputConfig,
124
+ );
125
+
126
+ console.log("Running radiation_transect_calculation...");
127
+ const radiationResult = await radiationCalc.run();
128
+
129
+ if (radiationCalc.messages.length > 0) {
130
+ console.log("Messages:");
131
+ radiationCalc.messages.forEach((msg) => console.log(msg));
132
+ }
133
+
134
+ expect(radiationResult).toBe(ResultCode.SUCCESS);
135
+
136
+ // Regression checks
137
+ const flameDiameterError = Math.abs(
138
+ (fireballCalc.flameResult!.flameDiameter! - 31.624965667724611) /
139
+ 31.624965667724611
140
+ );
141
+ expect(flameDiameterError).toBeLessThan(1e-3);
142
+
143
+ expect(radiationCalc.radiationRecords!.length).toBe(50);
144
+
145
+ const radiationResultError = Math.abs(
146
+ (radiationCalc.radiationRecords![0].radiationResult! - 36402.50812563037) /
147
+ 36402.50812563037
148
+ );
149
+ expect(radiationResultError).toBeLessThan(1e-3);
150
+
151
+ console.log(`SUCCESS: radiation_transect_calculation (${radiationCalc.calculationElapsedTime}ms)`);
152
+ });
153
+ });
@@ -0,0 +1,152 @@
1
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { FireballCalculation } from "../../src/calculations/fireball";
3
+ import { RadiationTransectCalculation } from "../../src/calculations/radiation";
4
+ import { DischargeParameters, FlammableOutputConfig, FlammableParameters, LocalPosition, Material, MaterialComponent, State, Transect, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, Resolution, ResultCode, 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 91 - Vessel and Fireball Scenario", () => {
16
+ test("should run vessel and fireball calculations with regression checks", async () => {
17
+ // Define material and state
18
+ const material = new Material({
19
+ name: "PROPANE",
20
+ components: [new MaterialComponent({ name: "PROPANE", moleFraction: 1.0 })],
21
+ componentCount: 1,
22
+ });
23
+
24
+ const state = new State({
25
+ temperature: 280.0,
26
+ pressure: 2.0e5,
27
+ liquidFraction: 0.8,
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.8,
49
+ height: 2.0,
50
+ width: 1.0,
51
+ length: 3.0,
52
+ shape: VesselShape.VESSEL_CUBOID,
53
+ vesselConditions: vesselStateCalc.vesselConditions,
54
+ });
55
+
56
+ // Vessel catastrophic rupture calculation
57
+ const dischargeParams = new DischargeParameters();
58
+ const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(
59
+ vessel,
60
+ dischargeParams
61
+ );
62
+
63
+ console.log("Running vessel_catastrophic_rupture_calculation...");
64
+ const ruptureResult = await vesselRuptureCalc.run();
65
+
66
+ if (vesselRuptureCalc.messages.length > 0) {
67
+ console.log("Messages:");
68
+ vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
69
+ }
70
+
71
+ expect(ruptureResult).toBe(ResultCode.SUCCESS);
72
+ console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
73
+
74
+ const exitMaterial = vesselRuptureCalc.exitMaterial;
75
+
76
+ // Define weather
77
+ const weather = new Weather({
78
+ windSpeed: 5.0,
79
+ stabilityClass: AtmosphericStabilityClass.STABILITY_D,
80
+ });
81
+
82
+ // Fireball calculation
83
+ const fireballCalc = new FireballCalculation(
84
+ exitMaterial!,
85
+ state,
86
+ vesselRuptureCalc.dischargeRecords!,
87
+ vesselRuptureCalc.dischargeRecords!.length,
88
+ vesselRuptureCalc.dischargeResult!,
89
+ weather,
90
+ );
91
+
92
+ console.log("Running fireball_calculation...");
93
+ const fireballResult = await fireballCalc.run();
94
+
95
+ if (fireballCalc.messages.length > 0) {
96
+ console.log("Messages:");
97
+ fireballCalc.messages.forEach((msg) => console.log(msg));
98
+ }
99
+
100
+ expect(fireballResult).toBe(ResultCode.SUCCESS);
101
+ console.log(`SUCCESS: fireball_calculation (${fireballCalc.calculationElapsedTime}ms)`);
102
+
103
+ // Radiation transect calculation
104
+ const radiationResolution = Resolution.MEDIUM;
105
+ const transect = new Transect({
106
+ transectStartPoint: new LocalPosition({ x: 10.0, y: -20.0, z: 5.0 }),
107
+ transectEndPoint: new LocalPosition({ x: 10.0, y: 20.0, z: 5.0 }),
108
+ });
109
+
110
+ const flammableOutputConfig = new FlammableOutputConfig({
111
+ position: new LocalPosition(),
112
+ transect,
113
+ radiationResolution,
114
+ });
115
+
116
+ const radiationCalc = new RadiationTransectCalculation(
117
+ fireballCalc.flameResult!,
118
+ fireballCalc.flameRecords!,
119
+ fireballCalc.flameRecords!.length,
120
+ weather,
121
+ new FlammableParameters(),
122
+ flammableOutputConfig,
123
+ );
124
+
125
+ console.log("Running radiation_transect_calculation...");
126
+ const radiationResult = await radiationCalc.run();
127
+
128
+ if (radiationCalc.messages.length > 0) {
129
+ console.log("Messages:");
130
+ radiationCalc.messages.forEach((msg) => console.log(msg));
131
+ }
132
+
133
+ expect(radiationResult).toBe(ResultCode.SUCCESS);
134
+
135
+ // Regression checks
136
+ const flameDiameterError = Math.abs(
137
+ (fireballCalc.flameResult!.flameDiameter! - 18.108844757080078) /
138
+ 18.108844757080078
139
+ );
140
+ expect(flameDiameterError).toBeLessThan(1e-3);
141
+
142
+ expect(radiationCalc.radiationRecords!.length).toBe(50);
143
+
144
+ const radiationResultError = Math.abs(
145
+ (radiationCalc.radiationRecords![0].radiationResult! - 9018.900488875195) /
146
+ 9018.900488875195
147
+ );
148
+ expect(radiationResultError).toBeLessThan(1e-3);
149
+
150
+ console.log(`SUCCESS: radiation_transect_calculation (${radiationCalc.calculationElapsedTime}ms)`);
151
+ });
152
+ });
@@ -0,0 +1,150 @@
1
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { FireballCalculation } from "../../src/calculations/fireball";
3
+ import { RadiationTransectCalculation } from "../../src/calculations/radiation";
4
+ import { DischargeParameters, FlammableOutputConfig, FlammableParameters, LocalPosition, Material, MaterialComponent, State, Transect, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, Resolution, ResultCode, VesselShape, VesselConditions } 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 92 - Vessel and Fireball Scenario", () => {
16
+ test("should run vessel and fireball calculations with regression checks", async () => {
17
+ // Define material and state
18
+ const material = new Material({
19
+ name: "HYDROGEN",
20
+ components: [new MaterialComponent({ name: "HYDROGEN", moleFraction: 1.0 })],
21
+ componentCount: 1,
22
+ });
23
+
24
+ const state = new State({
25
+ temperature: 270.0,
26
+ pressure: 8.0e6,
27
+ liquidFraction: 0.8,
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.8,
49
+ diameter: 5.0,
50
+ shape: VesselShape.VESSEL_SPHERE,
51
+ vesselConditions: vesselStateCalc.vesselConditions as VesselConditions,
52
+ });
53
+
54
+ // Vessel catastrophic rupture calculation
55
+ const dischargeParams = new DischargeParameters();
56
+ const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(
57
+ vessel,
58
+ dischargeParams
59
+ );
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
+ const exitMaterial = vesselRuptureCalc.exitMaterial;
73
+
74
+ // Define weather
75
+ const weather = new Weather({
76
+ windSpeed: 1.0,
77
+ stabilityClass: AtmosphericStabilityClass.STABILITY_C,
78
+ });
79
+
80
+ // Fireball calculation
81
+ const fireballCalc = new FireballCalculation(
82
+ exitMaterial!,
83
+ state,
84
+ vesselRuptureCalc.dischargeRecords!,
85
+ vesselRuptureCalc.dischargeRecords!.length,
86
+ vesselRuptureCalc.dischargeResult!,
87
+ weather,
88
+ );
89
+
90
+ console.log("Running fireball_calculation...");
91
+ const fireballResult = await fireballCalc.run();
92
+
93
+ if (fireballCalc.messages.length > 0) {
94
+ console.log("Messages:");
95
+ fireballCalc.messages.forEach((msg) => console.log(msg));
96
+ }
97
+
98
+ expect(fireballResult).toBe(ResultCode.SUCCESS);
99
+ console.log(`SUCCESS: fireball_calculation (${fireballCalc.calculationElapsedTime}ms)`);
100
+
101
+ // Radiation transect calculation
102
+ const radiationResolution = Resolution.MEDIUM;
103
+ const transect = new Transect({
104
+ transectStartPoint: new LocalPosition({ x: 10.0, y: 0.0, z: 5.0 }),
105
+ transectEndPoint: new LocalPosition({ x: 50.0, y: 0.0, z: 0.0 }),
106
+ });
107
+
108
+ const flammableOutputConfig = new FlammableOutputConfig({
109
+ position: new LocalPosition(),
110
+ transect,
111
+ radiationResolution,
112
+ });
113
+
114
+ const radiationCalc = new RadiationTransectCalculation(
115
+ fireballCalc.flameResult!,
116
+ fireballCalc.flameRecords!,
117
+ fireballCalc.flameRecords!.length,
118
+ weather,
119
+ new FlammableParameters(),
120
+ flammableOutputConfig,
121
+ );
122
+
123
+ console.log("Running radiation_transect_calculation...");
124
+ const radiationResult = await radiationCalc.run();
125
+
126
+ if (radiationCalc.messages.length > 0) {
127
+ console.log("Messages:");
128
+ radiationCalc.messages.forEach((msg) => console.log(msg));
129
+ }
130
+
131
+ expect(radiationResult).toBe(ResultCode.SUCCESS);
132
+
133
+ // Regression checks
134
+ const flameDiameterError = Math.abs(
135
+ (fireballCalc.flameResult!.flameDiameter! - 46.949886322021484) /
136
+ 46.949886322021484
137
+ );
138
+ expect(flameDiameterError).toBeLessThan(1e-3);
139
+
140
+ expect(radiationCalc.radiationRecords!.length).toBe(50);
141
+
142
+ const radiationResultError = Math.abs(
143
+ (radiationCalc.radiationRecords![0].radiationResult! - 97828.68190075974) /
144
+ 97828.68190075974
145
+ );
146
+ expect(radiationResultError).toBeLessThan(1e-3);
147
+
148
+ console.log(`SUCCESS: radiation_transect_calculation (${radiationCalc.calculationElapsedTime}ms)`);
149
+ });
150
+ });
@@ -0,0 +1,71 @@
1
+ import { Material, MaterialComponent, State } from "../../src/entities";
2
+ import { FlashCalculation } from "../../src/calculations/properties";
3
+ import { ResultCode } from "../../src/enums";
4
+ import { setAccessToken } from "../../src/utilities";
5
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
6
+
7
+ if (!accessToken) {
8
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
9
+ }
10
+
11
+ setAccessToken(accessToken);
12
+
13
+ describe("Flash Calculation Scenario - Test Case 26", () => {
14
+ test("should run the flash calculation and perform regression check", async () => {
15
+ // Set the case properties
16
+ const stateTemperature = 270.0;
17
+ const statePressure = 8.0e6;
18
+ const stateLiquidFraction = 0.8;
19
+
20
+ // Define the initial state of the vessel
21
+ const state = new State({
22
+ temperature: stateTemperature,
23
+ pressure: statePressure,
24
+ liquidFraction: stateLiquidFraction
25
+ });
26
+
27
+ // Define the material
28
+ const material = new Material({
29
+ name: "Case26_Material",
30
+ components: [
31
+ new MaterialComponent({ name: "METHANE", moleFraction: 0.2 }),
32
+ new MaterialComponent({ name: "ETHANE", moleFraction: 0.2 }),
33
+ new MaterialComponent({ name: "PROPANE", moleFraction: 0.2 }),
34
+ new MaterialComponent({ name: "N-BUTANE", moleFraction: 0.2 }),
35
+ new MaterialComponent({ name: "N-PENTANE", moleFraction: 0.2 })
36
+ ],
37
+ componentCount: 5
38
+ });
39
+
40
+ // Create and run flash calculation
41
+ const flashCalc = new FlashCalculation(material, state);
42
+
43
+ console.log("Running flashCalculation...");
44
+ const resultCode = await flashCalc.run();
45
+
46
+ if (flashCalc.messages.length > 0) {
47
+ console.log("Messages:");
48
+ flashCalc.messages.forEach((msg) => console.log(msg));
49
+ }
50
+
51
+ expect(resultCode).toBe(ResultCode.SUCCESS);
52
+
53
+ // Regression checks
54
+ const totalFluidDensityError = Math.abs(
55
+ (flashCalc.flashResult!.totalFluidDensity! - 483.1833445460695) / 483.1833445460695
56
+ );
57
+ const bubblePointTempError = Math.abs(
58
+ (flashCalc.flashResult!.bubblePointTemperature! - 319.5331124566492) / 319.5331124566492
59
+ );
60
+ const bubblePointPressureError = Math.abs(
61
+ (flashCalc.flashResult!.bubblePointPressure! - 4479259.631949412) / 4479259.631949412
62
+ );
63
+
64
+ expect(totalFluidDensityError).toBeLessThan(1e-3);
65
+ expect(flashCalc.flashResult!.fluidPhase).toBe(3);
66
+ expect(bubblePointTempError).toBeLessThan(1e-3);
67
+ expect(bubblePointPressureError).toBeLessThan(1e-3);
68
+
69
+ console.log(`SUCCESS: flashCalculation (${flashCalc.calculationElapsedTime}ms)`);
70
+ });
71
+ });