@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,153 @@
1
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { PoolFireCalculation } from "../../src/calculations/poolFire";
4
+ import { DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation } from "../../src/calculations/radiation";
5
+ import { Material, MaterialComponent, State, Vessel, Weather, Substrate, DischargeParameters, DispersionParameters, FlammableParameters, FlammableOutputConfig, LocalPosition } from "../../src/entities";
6
+ import { AtmosphericStabilityClass, PoolFireType, ResultCode, VesselShape, WindProfileFlag } from "../../src/enums";
7
+ import { setAccessToken } from "../../src/utilities";
8
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
9
+
10
+ if (!accessToken) {
11
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
12
+ }
13
+
14
+ setAccessToken(accessToken);
15
+
16
+ describe("Vessel Catastrophic Rupture Integration - Test Case 41", () => {
17
+ test("should perform full integration including pool fire radiation output", async () => {
18
+
19
+ // Define the material and its state
20
+ const material = new Material({
21
+ name: "N-HEXANE",
22
+ components: [new MaterialComponent({ name: "N-HEXANE", moleFraction: 1.0 })],
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
+ const vesselStateCalc = new VesselStateCalculation(material, state);
33
+ let resultCode = await vesselStateCalc.run();
34
+
35
+ if (vesselStateCalc.messages.length > 0) {
36
+ console.log("Messages:");
37
+ vesselStateCalc.messages.forEach((m) => console.log(m));
38
+ }
39
+
40
+ expect(resultCode).toBe(ResultCode.SUCCESS);
41
+
42
+ const vessel = new Vessel({
43
+ state: state,
44
+ material: 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
+ resultCode = await ruptureCalc.run();
53
+
54
+ if (ruptureCalc.messages.length > 0) {
55
+ console.log("Messages:");
56
+ ruptureCalc.messages.forEach((m) => console.log(m));
57
+ }
58
+
59
+ expect(resultCode).toBe(ResultCode.SUCCESS);
60
+
61
+ const weather = new Weather({
62
+ windSpeed: 1.5,
63
+ stabilityClass: AtmosphericStabilityClass.STABILITY_F,
64
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
65
+ });
66
+
67
+ const substrate = new Substrate();
68
+
69
+ const dispersionCalc = new DispersionCalculation(
70
+ ruptureCalc.exitMaterial!,
71
+ substrate,
72
+ ruptureCalc.dischargeResult!,
73
+ ruptureCalc.dischargeRecords!,
74
+ 1,
75
+ weather,
76
+ new DispersionParameters(),
77
+ 0.0
78
+ );
79
+
80
+ resultCode = await dispersionCalc.run();
81
+
82
+ if (dispersionCalc.messages.length > 0) {
83
+ console.log("Messages:");
84
+ dispersionCalc.messages.forEach((m) => console.log(m));
85
+ }
86
+
87
+ expect(resultCode).toBe(ResultCode.SUCCESS);
88
+
89
+ const flammableParams = new FlammableParameters({
90
+ poolFireType: PoolFireType.LATE,
91
+ });
92
+
93
+ const poolFireCalc = new PoolFireCalculation(
94
+ ruptureCalc.exitMaterial!,
95
+ dispersionCalc.poolRecords!,
96
+ dispersionCalc.poolRecords!.length,
97
+ weather,
98
+ substrate,
99
+ flammableParams
100
+ );
101
+
102
+ resultCode = await poolFireCalc.run();
103
+
104
+ if (poolFireCalc.messages.length > 0) {
105
+ console.log("Messages:");
106
+ poolFireCalc.messages.forEach((m) => console.log(m));
107
+ }
108
+
109
+ expect(resultCode).toBe(ResultCode.SUCCESS);
110
+
111
+ const flammableOutputConfigs = [
112
+ { x: 0.0, y: 0.0, z: 0.0 },
113
+ { x: 0.0, y: 0.0, z: 1.0 },
114
+ { x: 0.0, y: 0.0, z: 2.0 },
115
+ ].map(({ x, y, z }) => {
116
+ return new FlammableOutputConfig({
117
+ position: new LocalPosition({ x, y, z })
118
+ });
119
+ });
120
+
121
+ const radiationCalc = new DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation(
122
+ poolFireCalc.poolFireFlameResult!,
123
+ poolFireCalc.flameRecords!,
124
+ poolFireCalc.flameRecords!.length,
125
+ weather,
126
+ flammableParams,
127
+ flammableOutputConfigs,
128
+ flammableOutputConfigs.length
129
+ );
130
+
131
+ resultCode = await radiationCalc.run();
132
+
133
+ if (radiationCalc.messages.length > 0) {
134
+ console.log("Messages:");
135
+ radiationCalc.messages.forEach((m) => console.log(m));
136
+ }
137
+
138
+ expect(resultCode).toBe(ResultCode.SUCCESS);
139
+
140
+ // Regression checks
141
+ expect(radiationCalc.contourPoints!.length).toBe(150);
142
+ const lastX = radiationCalc.contourPoints![radiationCalc.contourPoints!.length - 1].x!;
143
+ const expectedX = 76.36825073266586;
144
+ const relErrorX = Math.abs((lastX - expectedX) / expectedX);
145
+ expect(relErrorX).toBeLessThan(1e-3);
146
+
147
+ const flameDiameter = radiationCalc.poolFireFlameResult.flameDiameter!;
148
+ const expectedDiameter = 50.3738899230957;
149
+ const relErrorDiameter = Math.abs((flameDiameter - expectedDiameter) / expectedDiameter);
150
+ expect(relErrorDiameter).toBeLessThan(1e-3);
151
+ });
152
+ });
153
+
@@ -0,0 +1,141 @@
1
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { PoolFireCalculation } from "../../src/calculations/poolFire";
4
+ import { RadiationAtPointsForPoolFiresCalculation } from "../../src/calculations/radiation";
5
+ import { Bund, Material, MaterialComponent, State, Vessel, Weather, Substrate, DischargeParameters, DispersionParameters, FlammableParameters, FlammableOutputConfig, LocalPosition } from "../../src/entities";
6
+ import { AtmosphericStabilityClass, PoolFireType, ResultCode, VesselShape, WindProfileFlag } from "../../src/enums";
7
+ import { setAccessToken } from "../../src/utilities";
8
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
9
+
10
+ if (!accessToken) {
11
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
12
+ }
13
+
14
+ setAccessToken(accessToken);
15
+
16
+ describe("Vessel Catastrophic Rupture Integration - Test Case 41a", () => {
17
+ test("should match radiation and flame diameter regression values", async () => {
18
+ const material = new Material(
19
+ {
20
+ name: "N-HEXANE",
21
+ components:[ new MaterialComponent({name: "N-HEXANE", moleFraction: 1.0})]
22
+ });
23
+
24
+ const state = new State({
25
+ temperature: 280.0,
26
+ pressure: 2.0e5,
27
+ liquidFraction: 0.8,
28
+ });
29
+
30
+ const vesselStateCalculation = new VesselStateCalculation(material, state);
31
+ let resultCode = await vesselStateCalculation.run();
32
+
33
+ if (vesselStateCalculation.messages.length > 0) {
34
+ console.log("Messages:");
35
+ vesselStateCalculation.messages.forEach((msg) => console.log(msg));
36
+ }
37
+
38
+ expect(resultCode).toBe(ResultCode.SUCCESS);
39
+
40
+ const vessel = new Vessel({
41
+ state,
42
+ material,
43
+ liquidFillFractionByVolume: 0.8,
44
+ vesselConditions: vesselStateCalculation.vesselConditions,
45
+ });
46
+
47
+ const dischargeParams = new DischargeParameters();
48
+ const ruptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
49
+
50
+ resultCode = await ruptureCalc.run();
51
+
52
+ if (ruptureCalc.messages.length > 0) {
53
+ console.log("Messages:");
54
+ ruptureCalc.messages.forEach((msg) => console.log(msg));
55
+ }
56
+
57
+ expect(resultCode).toBe(ResultCode.SUCCESS);
58
+
59
+ const weather = new Weather({
60
+ windSpeed: 1.5,
61
+ stabilityClass: AtmosphericStabilityClass.STABILITY_F,
62
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
63
+ });
64
+
65
+ const substrate = new Substrate({ bund: new Bund() });
66
+
67
+ const dispersionCalc = new DispersionCalculation(
68
+ ruptureCalc.exitMaterial!,
69
+ substrate,
70
+ ruptureCalc.dischargeResult!,
71
+ ruptureCalc.dischargeRecords!,
72
+ ruptureCalc.dischargeRecords!.length,
73
+ weather,
74
+ new DispersionParameters(),
75
+ 0.0
76
+ );
77
+
78
+ resultCode = await dispersionCalc.run();
79
+
80
+ if (dispersionCalc.messages.length > 0) {
81
+ console.log("Messages:");
82
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
83
+ }
84
+
85
+ expect(resultCode).toBe(ResultCode.SUCCESS);
86
+
87
+ const flammableParams = new FlammableParameters({
88
+ poolFireType: PoolFireType.LATE,
89
+ });
90
+
91
+ const poolFireCalc = new PoolFireCalculation(
92
+ ruptureCalc.exitMaterial!,
93
+ dispersionCalc.poolRecords!,
94
+ dispersionCalc.poolRecords!.length,
95
+ weather,
96
+ substrate,
97
+ flammableParams
98
+ );
99
+
100
+ resultCode = await poolFireCalc.run();
101
+
102
+ if (poolFireCalc.messages.length > 0) {
103
+ console.log("Messages:");
104
+ poolFireCalc.messages.forEach((msg) => console.log(msg));
105
+ }
106
+
107
+ expect(resultCode).toBe(ResultCode.SUCCESS);
108
+
109
+ const flammableOutputConfigs = [
110
+ new FlammableOutputConfig({ position: new LocalPosition({ x: 50.0, y: 0.0, z: 0.0 }) }),
111
+ new FlammableOutputConfig({ position: new LocalPosition({ x: 50.0, y: 0.0, z: 1.0 }) }),
112
+ new FlammableOutputConfig({ position: new LocalPosition({ x: 50.0, y: 3.0, z: 2.0 }) }),
113
+ ];
114
+
115
+ const radiationCalc = new RadiationAtPointsForPoolFiresCalculation(
116
+ poolFireCalc.poolFireFlameResult!,
117
+ poolFireCalc.flameRecords!,
118
+ poolFireCalc.flameRecords!.length,
119
+ weather,
120
+ flammableParams,
121
+ flammableOutputConfigs,
122
+ flammableOutputConfigs.length
123
+ );
124
+
125
+ resultCode = 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(resultCode).toBe(ResultCode.SUCCESS);
133
+
134
+ const expectedRadiation = 11159.009681754622;
135
+ const expectedDiameter = 50.3738899230957;
136
+
137
+ expect(Math.abs((radiationCalc.radiation![0] - expectedRadiation) / expectedRadiation)).toBeLessThan(1e-3);
138
+ expect(Math.abs((radiationCalc.poolFireFlameResult.flameDiameter! - expectedDiameter) / expectedDiameter)).toBeLessThan(1e-3);
139
+ });
140
+ });
141
+
@@ -0,0 +1,169 @@
1
+ import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { PoolFireCalculation } from "../../src/calculations/poolFire"
4
+ import { DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation } from "../../src/calculations/radiation";
5
+ import {Bund, DischargeParameters, DispersionParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
6
+ import { AtmosphericStabilityClass, PoolFireType, ResultCode, TimeVaryingOption, VesselShape, WindProfileFlag } from "../../src/enums";
7
+ import { setAccessToken } from "../../src/utilities";
8
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
9
+
10
+ if (!accessToken) {
11
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
12
+ }
13
+
14
+ setAccessToken(accessToken);
15
+
16
+ describe("Vessel Leak Calculation Integration - Test Case 42", () => {
17
+ test("should produce correct radiation results for pool fire", async () => {
18
+ // Define the test case properties
19
+ const stateTemperature = 250.0;
20
+ const statePressure = 5.00e5;
21
+ const vesselShape = VesselShape.VERTICAL_CYLINDER;
22
+ const vesselHeight = 3.0;
23
+ const vesselDiameter = 1.5;
24
+ const leakHoleDiameter = 0.1;
25
+ const timeVaryingOption = TimeVaryingOption.TIME_VARYING_RATE;
26
+ const leakHoleHeightFraction = 0.0;
27
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
28
+
29
+ // Create state and material
30
+ const state = new State({
31
+ temperature: stateTemperature,
32
+ pressure: statePressure,
33
+ liquidFraction: 0.0,
34
+ });
35
+ const material = new Material({name: 'N-OCTANE+N-HEPTANE',
36
+ components:
37
+ [
38
+ new MaterialComponent({name: 'N-OCTANE', moleFraction: 0.5}),
39
+ new MaterialComponent({name: 'N-HEPTANE', moleFraction: 0.5}),
40
+ ],
41
+ componentCount: 2
42
+ });
43
+
44
+ // Run vessel state calculation
45
+ const vesselStateCalc = new VesselStateCalculation(material, state);
46
+ let resultCode = await vesselStateCalc.run();
47
+
48
+ if (vesselStateCalc.messages.length > 0) {
49
+ console.log("Messages:");
50
+ vesselStateCalc.messages.forEach((message) => console.log(message));
51
+ }
52
+
53
+ expect(resultCode).toBe(ResultCode.SUCCESS);
54
+
55
+ // Create vessel and leak
56
+ const vessel = new Vessel({
57
+ state: vesselStateCalc.outputState,
58
+ material: vesselStateCalc.material,
59
+ vesselConditions: vesselStateCalc.vesselConditions,
60
+ diameter: vesselDiameter,
61
+ height: vesselHeight,
62
+ shape: vesselShape,
63
+ liquidFillFractionByVolume: 0.8,
64
+ });
65
+
66
+ const leak = new Leak({
67
+ holeDiameter: leakHoleDiameter,
68
+ holeHeightFraction: leakHoleHeightFraction,
69
+ timeVaryingOption: timeVaryingOption,
70
+ });
71
+
72
+ const dischargeParams = new DischargeParameters();
73
+
74
+ // Run vessel leak calculation
75
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
76
+ resultCode = await vesselLeakCalc.run();
77
+
78
+ if (vesselLeakCalc.messages.length > 0) {
79
+ console.log("Messages:");
80
+ vesselLeakCalc.messages.forEach((message) => console.log(message));
81
+ }
82
+
83
+ expect(resultCode).toBe(ResultCode.SUCCESS);
84
+
85
+ // Define weather and substrate
86
+ const weather = new Weather({
87
+ windSpeed: 2.0,
88
+ stabilityClass: AtmosphericStabilityClass.STABILITY_E,
89
+ windProfileFlag: windProfileFlag
90
+ });
91
+
92
+ const substrate = new Substrate();
93
+
94
+ // Run dispersion calculation
95
+ const dispersionCalc = new DispersionCalculation(
96
+ vesselLeakCalc.exitMaterial!,
97
+ substrate,
98
+ vesselLeakCalc.dischargeResult!,
99
+ vesselLeakCalc.dischargeRecords!,
100
+ vesselLeakCalc.dischargeRecords!.length,
101
+ weather,
102
+ new DispersionParameters(),
103
+ 0.0
104
+ );
105
+ resultCode = await dispersionCalc.run();
106
+
107
+ if (dispersionCalc.messages.length > 0) {
108
+ console.log("Messages:");
109
+ dispersionCalc.messages.forEach((message) => console.log(message));
110
+ }
111
+
112
+ expect(resultCode).toBe(ResultCode.SUCCESS);
113
+
114
+ // Define flammable parameters
115
+ const flammableParams = new FlammableParameters({
116
+ poolFireType: PoolFireType.LATE,
117
+ });
118
+
119
+ // Run pool fire calculation
120
+ const poolFireCalc = new PoolFireCalculation(
121
+ vesselLeakCalc.exitMaterial!,
122
+ dispersionCalc.poolRecords!,
123
+ dispersionCalc.poolRecords!.length,
124
+ weather,
125
+ substrate,
126
+ flammableParams
127
+ );
128
+ resultCode = await poolFireCalc.run();
129
+
130
+ if (poolFireCalc.messages.length > 0) {
131
+ console.log("Messages:");
132
+ poolFireCalc.messages.forEach((message) => console.log(message));
133
+ }
134
+
135
+ expect(resultCode).toBe(ResultCode.SUCCESS);
136
+
137
+ // Define flammable output config
138
+ const flammableOutputConfigs = [0.0, 1.0, 2.0].map((z) => {
139
+ return new FlammableOutputConfig({
140
+ position: new LocalPosition({ x: 0.0, y: 0.0, z }),
141
+ });
142
+ });
143
+
144
+ // Run distances and ellipses to radiation levels for pool fires calculation
145
+ const radiationCalc = new DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation(
146
+ poolFireCalc.poolFireFlameResult!,
147
+ poolFireCalc.flameRecords!,
148
+ poolFireCalc.flameRecords!.length,
149
+ weather,
150
+ flammableParams,
151
+ flammableOutputConfigs,
152
+ flammableOutputConfigs.length
153
+ );
154
+ resultCode = await radiationCalc.run();
155
+
156
+ if (radiationCalc.messages.length > 0) {
157
+ console.log("Messages:");
158
+ radiationCalc.messages.forEach((message) => console.log(message));
159
+ }
160
+
161
+ expect(resultCode).toBe(ResultCode.SUCCESS);
162
+
163
+ // Assertions for regression results
164
+ expect(radiationCalc.contourPoints!.length!).toBe(150);
165
+ expect(Math.abs((radiationCalc.contourPoints![radiationCalc.contourPoints!.length - 1].x - 57.57741153697067) / 57.57741153697067)).toBeLessThan(1e-3);
166
+ expect(Math.abs((radiationCalc.poolFireFlameResult.flameDiameter! - 36.82126235961914) / 36.82126235961914)).toBeLessThan(1e-3);
167
+ });
168
+ });
169
+
@@ -0,0 +1,175 @@
1
+ import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { PoolFireCalculation } from "../../src/calculations/poolFire";
4
+ import { RadiationAtPointsForPoolFiresCalculation } from "../../src/calculations/radiation";
5
+ import {Bund, DischargeParameters, DispersionParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather} from "../../src/entities";
6
+ import { AtmosphericStabilityClass, PoolFireType, ResultCode, TimeVaryingOption, VesselShape, WindProfileFlag } from "../../src/enums";
7
+ import { setAccessToken } from "../../src/utilities";
8
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
9
+
10
+ if (!accessToken) {
11
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
12
+ }
13
+
14
+ setAccessToken(accessToken);
15
+
16
+ describe("Vessel Leak Calculation Integration - Case 42A", () => {
17
+ test("should complete all calculation steps and validate results", async () => {
18
+ const stateTemperature = 250.0;
19
+ const statePressure = 5.0e5;
20
+ const vesselShape = VesselShape.VERTICAL_CYLINDER;
21
+ const vesselHeight = 3.0;
22
+ const vesselDiameter = 1.5;
23
+ const leakHoleDiameter = 0.1;
24
+ const timeVaryingOption = TimeVaryingOption.TIME_VARYING_RATE;
25
+ const leakHoleHeightFraction = 0.0;
26
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
27
+
28
+ const state = new State({
29
+ temperature: stateTemperature,
30
+ pressure: statePressure,
31
+ liquidFraction: 0.0,
32
+ });
33
+
34
+ const material = new Material({
35
+ name: "N-OCTANE+N-HEPTANE",
36
+ components: [
37
+ new MaterialComponent({ name: "N-OCTANE", moleFraction: 0.5 }),
38
+ new MaterialComponent({ name: "N-HEPTANE", moleFraction: 0.5 }),
39
+ ],
40
+ componentCount: 2,
41
+ });
42
+
43
+ const vesselStateCalc = new VesselStateCalculation(material, state);
44
+ let resultCode = await vesselStateCalc.run();
45
+
46
+ if (vesselStateCalc.messages.length > 0) {
47
+ console.log("Messages:");
48
+ vesselStateCalc.messages.forEach((m) => console.log(m));
49
+ }
50
+
51
+ expect(resultCode).toBe(ResultCode.SUCCESS);
52
+
53
+ const vessel = new Vessel({
54
+ state: vesselStateCalc.outputState,
55
+ material: vesselStateCalc.material,
56
+ vesselConditions: vesselStateCalc.vesselConditions,
57
+ diameter: vesselDiameter,
58
+ height: vesselHeight,
59
+ shape: vesselShape,
60
+ liquidFillFractionByVolume: 0.8,
61
+ });
62
+
63
+ const leak = new Leak({
64
+ holeDiameter: leakHoleDiameter,
65
+ holeHeightFraction: leakHoleHeightFraction,
66
+ timeVaryingOption,
67
+ });
68
+
69
+ const dischargeParams = new DischargeParameters();
70
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
71
+ resultCode = await vesselLeakCalc.run();
72
+
73
+ if (vesselLeakCalc.messages.length > 0) {
74
+ console.log("Messages:");
75
+ vesselLeakCalc.messages.forEach((m) => console.log(m));
76
+ }
77
+
78
+ expect(resultCode).toBe(ResultCode.SUCCESS);
79
+
80
+ const weather = new Weather({
81
+ windSpeed: 2.0,
82
+ stabilityClass: AtmosphericStabilityClass.STABILITY_E,
83
+ windProfileFlag: windProfileFlag
84
+ });
85
+
86
+ const substrate = new Substrate();
87
+
88
+ const dispersionCalc = new DispersionCalculation(
89
+ vesselLeakCalc.exitMaterial!,
90
+ substrate,
91
+ vesselLeakCalc.dischargeResult!,
92
+ vesselLeakCalc.dischargeRecords!,
93
+ vesselLeakCalc.dischargeRecords!.length,
94
+ weather,
95
+ new DispersionParameters(),
96
+ 0.0
97
+ );
98
+
99
+ resultCode = await dispersionCalc.run();
100
+
101
+ if (dispersionCalc.messages.length > 0) {
102
+ console.log("Messages:");
103
+ dispersionCalc.messages.forEach((m) => console.log(m));
104
+ }
105
+
106
+ expect(resultCode).toBe(ResultCode.SUCCESS);
107
+
108
+ const flammableParams = new FlammableParameters({
109
+ poolFireType: PoolFireType.LATE,
110
+ });
111
+
112
+ const poolFireCalc = new PoolFireCalculation(
113
+ vesselLeakCalc.exitMaterial!,
114
+ dispersionCalc.poolRecords!,
115
+ dispersionCalc.poolRecords!.length,
116
+ weather,
117
+ substrate,
118
+ flammableParams
119
+ );
120
+
121
+ resultCode = await poolFireCalc.run();
122
+
123
+ if (poolFireCalc.messages.length > 0) {
124
+ console.log("Messages:");
125
+ poolFireCalc.messages.forEach((m) => console.log(m));
126
+ }
127
+
128
+ expect(resultCode).toBe(ResultCode.SUCCESS);
129
+
130
+ const flammableOutputConfigs = [
131
+ { x: 0.0, y: 0.0, z: 0.0 },
132
+ { x: 0.0, y: 0.0, z: 1.0 },
133
+ { x: 0.0, y: 0.0, z: 2.0 },
134
+ ].map(({ x, y, z }) => {
135
+ return new FlammableOutputConfig({
136
+ position: new LocalPosition({ x, y, z })
137
+ });
138
+ });
139
+
140
+ const radiationCalc = new RadiationAtPointsForPoolFiresCalculation(
141
+ poolFireCalc.poolFireFlameResult!,
142
+ poolFireCalc.flameRecords!,
143
+ poolFireCalc.flameRecords!.length,
144
+ weather,
145
+ flammableParams,
146
+ flammableOutputConfigs,
147
+ flammableOutputConfigs.length
148
+ );
149
+
150
+ resultCode = await radiationCalc.run();
151
+
152
+ if (radiationCalc.messages.length > 0) {
153
+ console.log("Messages:");
154
+ radiationCalc.messages.forEach((m) => console.log(m));
155
+ }
156
+
157
+ expect(resultCode).toBe(ResultCode.SUCCESS);
158
+
159
+ // Regression assertions
160
+ const expectedRadiation = 138315.75;
161
+ const actualRadiation = radiationCalc.radiation![0];
162
+
163
+ expect(
164
+ Math.abs((actualRadiation - expectedRadiation) / expectedRadiation)
165
+ ).toBeLessThan(1e-3);
166
+
167
+ const expectedFlameDiameter = 36.82126235961914;
168
+ const actualFlameDiameter = radiationCalc.poolFireFlameResult.flameDiameter!;
169
+
170
+ expect(
171
+ Math.abs((actualFlameDiameter - expectedFlameDiameter) / expectedFlameDiameter)
172
+ ).toBeLessThan(1e-3);
173
+ });
174
+ });
175
+