@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,67 @@
1
+ import { SetPhaseToReleaseForLeakScenarioCalculation } from "../../src/calculations/utilities";
2
+ import { Material, MaterialComponent, State, Vessel } from "../../src/entities";
3
+ import { Phase, ResultCode, VesselConditions, VesselShape } 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("SetPhaseToReleaseForLeakScenarioCalculation", () => {
14
+ test("should set correct phase to release for leak scenario", async () => {
15
+ const material = new Material({
16
+ name: "N-PENTANE+METHANE",
17
+ components: [
18
+ new MaterialComponent({ name: "N-PENTANE", moleFraction: 0.5 }),
19
+ new MaterialComponent({ name: "METHANE", moleFraction: 0.5 }),
20
+ ],
21
+ componentCount: 2,
22
+ });
23
+
24
+ const state = new State({
25
+ temperature: 280.0,
26
+ pressure: 8.0e6,
27
+ liquidFraction: 0.8,
28
+ });
29
+
30
+ const vessel = new Vessel({
31
+ state,
32
+ material,
33
+ diameter: 5.0,
34
+ shape: VesselShape.VESSEL_SPHERE,
35
+ vesselConditions: VesselConditions.STRATIFIED_TWO_PHASE_VESSEL,
36
+ liquidFillFractionByVolume: 0.6,
37
+ });
38
+
39
+ const calc = new SetPhaseToReleaseForLeakScenarioCalculation(
40
+ Phase.LIQUID,
41
+ 1.0,
42
+ vessel
43
+ );
44
+
45
+ console.log("Running set_phase_to_be_released_for_leak_scenario_calculation...");
46
+ const resultCode = await calc.run();
47
+ calc.messages.forEach((msg) => console.log(msg));
48
+ expect(resultCode).toBe(ResultCode.SUCCESS);
49
+
50
+ // Validation
51
+ const expectedPhaseToRelease = 3; // Phase.LIQUID
52
+ const actualPhaseToRelease = calc.phaseToRelease;
53
+ expect(actualPhaseToRelease).toBe(expectedPhaseToRelease);
54
+
55
+ const expectedHoleHeightFraction = 0.5668689228522562;
56
+ const actualHoleHeightFraction = calc.holeHeightFractionUpdated!;
57
+ const relError = Math.abs(
58
+ (actualHoleHeightFraction - expectedHoleHeightFraction) /
59
+ expectedHoleHeightFraction
60
+ );
61
+ expect(relError).toBeLessThan(1e-3);
62
+
63
+ console.log(
64
+ `SUCCESS: set_phase_to_be_released_for_leak_scenario_calculation (${calc.calculationElapsedTime}ms)`
65
+ );
66
+ });
67
+ });
@@ -0,0 +1,67 @@
1
+ import { SetPhaseToReleaseForLineRuptureScenarioCalculation } from "../../src/calculations/utilities";
2
+ import { Material, MaterialComponent, State, Vessel } from "../../src/entities";
3
+ import { Phase, ResultCode, VesselConditions, VesselShape } 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("SetPhaseToReleaseForLineRuptureScenarioCalculation", () => {
14
+ test("should set correct phase to release for line rupture scenario", async () => {
15
+ const material = new Material({
16
+ name: "N-PENTANE+METHANE",
17
+ components: [
18
+ new MaterialComponent({ name: "N-PENTANE", moleFraction: 0.5 }),
19
+ new MaterialComponent({ name: "METHANE", moleFraction: 0.5 }),
20
+ ],
21
+ componentCount: 2,
22
+ });
23
+
24
+ const state = new State({
25
+ temperature: 280.0,
26
+ pressure: 8.0e6,
27
+ liquidFraction: 0.8,
28
+ });
29
+
30
+ const vessel = new Vessel({
31
+ state,
32
+ material,
33
+ diameter: 5.0,
34
+ shape: VesselShape.VESSEL_SPHERE,
35
+ vesselConditions: VesselConditions.STRATIFIED_TWO_PHASE_VESSEL,
36
+ liquidFillFractionByVolume: 0.6,
37
+ });
38
+
39
+ const calc = new SetPhaseToReleaseForLineRuptureScenarioCalculation(
40
+ Phase.LIQUID,
41
+ 1.0,
42
+ vessel
43
+ );
44
+
45
+ console.log("Running set_phase_to_be_released_for_line_rupture_scenario_calculation...");
46
+ const resultCode = await calc.run();
47
+ calc.messages.forEach((msg) => console.log(msg));
48
+ expect(resultCode).toBe(ResultCode.SUCCESS);
49
+
50
+ // Validation
51
+ const expectedPhaseToRelease = 3; // Phase.LIQUID
52
+ const actualPhaseToRelease = calc.phaseToRelease;
53
+ expect(actualPhaseToRelease).toBe(expectedPhaseToRelease);
54
+
55
+ const expectedPipeHeightFraction = 0.5668689228522562;
56
+ const actualPipeHeightFraction = calc.pipeHeightFractionUpdated!;
57
+ const relError = Math.abs(
58
+ (actualPipeHeightFraction - expectedPipeHeightFraction) /
59
+ expectedPipeHeightFraction
60
+ );
61
+ expect(relError).toBeLessThan(1e-3);
62
+
63
+ console.log(
64
+ `SUCCESS: set_phase_to_be_released_for_line_rupture_scenario_calculation (${calc.calculationElapsedTime}ms)`
65
+ );
66
+ });
67
+ });
@@ -0,0 +1,61 @@
1
+ import {SetPhaseToReleaseForReliefValveScenarioCalculation} from "../../src/calculations/utilities";
2
+ import {Material,MaterialComponent,State,Vessel} from "../../src/entities";
3
+ import {Phase,ResultCode,VesselConditions,VesselShape} 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("SetPhaseToReleaseForReliefValveScenarioCalculation", () => {
14
+ test("should set correct phase to release for relief valve scenario", async () => {
15
+ const material = new Material({
16
+ name: "N-PENTANE+METHANE",
17
+ components: [
18
+ new MaterialComponent({ name: "N-PENTANE", moleFraction: 0.5 }),
19
+ new MaterialComponent({ name: "METHANE", moleFraction: 0.5 }),
20
+ ],
21
+ componentCount: 2,
22
+ });
23
+
24
+ const state = new State({
25
+ temperature: 280.0,
26
+ pressure: 8.0e6,
27
+ liquidFraction: 0.8,
28
+ });
29
+
30
+ const vessel = new Vessel({
31
+ state,
32
+ material,
33
+ diameter: 5.0,
34
+ shape: VesselShape.VESSEL_SPHERE,
35
+ vesselConditions: VesselConditions.STRATIFIED_TWO_PHASE_VESSEL,
36
+ liquidFillFractionByVolume: 0.6,
37
+ });
38
+
39
+ const calc = new SetPhaseToReleaseForReliefValveScenarioCalculation(Phase.VAPOUR, 1.0, vessel);
40
+
41
+ console.log("Running set_phase_to_be_released_for_relief_valve_scenario_calculation...");
42
+ const resultCode = await calc.run();
43
+ calc.messages.forEach((msg) => console.log(msg));
44
+ expect(resultCode).toBe(ResultCode.SUCCESS);
45
+
46
+ // Validation
47
+ const expectedPhaseToRelease = 1.0;
48
+ const actualPhaseToRelease = calc.phaseToRelease;
49
+ expect(actualPhaseToRelease).toBeCloseTo(expectedPhaseToRelease, 6);
50
+
51
+ const expectedPipeHeightFraction = 1.0;
52
+ const actualPipeHeightFraction = calc.pipeHeightFractionUpdated!;
53
+ const relError = Math.abs((actualPipeHeightFraction - expectedPipeHeightFraction) / expectedPipeHeightFraction);
54
+ expect(relError).toBeLessThan(1e-3);
55
+
56
+ console.log(
57
+ `SUCCESS: set_phase_to_be_released_for_relief_valve_scenario_calculation (${calc.calculationElapsedTime}ms)`
58
+ );
59
+ });
60
+ });
61
+
@@ -0,0 +1,150 @@
1
+ import {VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { SideviewAtTimeCalculation} from "../../src/calculations/dispersionView";
4
+ import {Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, LocalPosition, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, ResultCode, SurfaceType, VesselShape, WindProfileFlag } from "../../src/enums";
6
+ import { setAccessToken } from "../../src/utilities";
7
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
8
+
9
+ if (!accessToken) {
10
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
11
+ }
12
+
13
+ setAccessToken(accessToken);
14
+
15
+ describe("SideviewAtTimeCalculation", () => {
16
+ test("should calculate correct sideview dispersion for ETHANE_BUTANE_PROPANE", async () => {
17
+ const material = new Material({
18
+ name: "ETHANE_BUTANE_PROPANE",
19
+ components: [
20
+ new MaterialComponent({ name: "ETHANE", moleFraction: 0.5 }),
21
+ new MaterialComponent({ name: "N-BUTANE", moleFraction: 0.3 }),
22
+ new MaterialComponent({ name: "PROPANE", moleFraction: 0.2 }),
23
+ ],
24
+ componentCount: 3,
25
+ });
26
+
27
+ const state = new State({
28
+ temperature: 265.0,
29
+ pressure: 5.0e5,
30
+ liquidFraction: 0.8,
31
+ });
32
+
33
+ const surfaceType = SurfaceType.LAND;
34
+ const surfaceRoughness = 0.2;
35
+ const windSpeed = 5.0;
36
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_A_;
37
+ const endPointConcentration = 0.0;
38
+ const specifyBund = true;
39
+ const bundHeight = 1.0;
40
+ const bundDiameter = 8.0;
41
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
42
+
43
+ const vesselStateCalc = new VesselStateCalculation(material, state);
44
+
45
+ console.log("Running vessel_state_calculation...");
46
+ let resultCode = await vesselStateCalc.run();
47
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
48
+ expect(resultCode).toBe(ResultCode.SUCCESS);
49
+
50
+ const vessel = new Vessel({
51
+ state,
52
+ material,
53
+ liquidFillFractionByVolume: 0.8,
54
+ shape: VesselShape.VERTICAL_CYLINDER,
55
+ vesselConditions: vesselStateCalc.vesselConditions!,
56
+ });
57
+
58
+ const dischargeParams = new DischargeParameters();
59
+ const ruptureCalc = new VesselCatastrophicRuptureCalculation(
60
+ vessel,
61
+ dischargeParams
62
+ );
63
+
64
+ console.log("Running vessel_catastrophic_rupture_calculation...");
65
+ resultCode = await ruptureCalc.run();
66
+ ruptureCalc.messages.forEach((msg) => console.log(msg));
67
+ expect(resultCode).toBe(ResultCode.SUCCESS);
68
+
69
+ const bund = new Bund({
70
+ specifyBund,
71
+ bundHeight,
72
+ bundDiameter,
73
+ });
74
+
75
+ const substrate = new Substrate({
76
+ bund,
77
+ surfaceType,
78
+ surfaceRoughness,
79
+ });
80
+
81
+ const weather = new Weather({
82
+ windSpeed: windSpeed,
83
+ stabilityClass: stabilityClass,
84
+ windProfileFlag: windProfileFlag
85
+ });
86
+
87
+ const dispersionParams = new DispersionParameters();
88
+ const dispersionCalc = new DispersionCalculation(
89
+ ruptureCalc.exitMaterial!,
90
+ substrate,
91
+ ruptureCalc.dischargeResult!,
92
+ ruptureCalc.dischargeRecords!,
93
+ ruptureCalc.dischargeRecords!.length,
94
+ weather,
95
+ dispersionParams,
96
+ endPointConcentration
97
+ );
98
+
99
+ console.log("Running dispersion_calculation...");
100
+ resultCode = await dispersionCalc.run();
101
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
102
+ expect(resultCode).toBe(ResultCode.SUCCESS);
103
+
104
+ const outputConfig = new DispersionOutputConfig({
105
+ concentration: endPointConcentration,
106
+ time: 0,
107
+ });
108
+
109
+ const sideviewCalc = new SideviewAtTimeCalculation(
110
+ dispersionCalc.scalarUdmOutputs!,
111
+ weather,
112
+ dispersionCalc.dispersionRecords!,
113
+ dispersionCalc.dispersionRecords!.length,
114
+ substrate,
115
+ outputConfig,
116
+ ruptureCalc.exitMaterial!,
117
+ dispersionParams,
118
+ );
119
+
120
+ console.log("Running sideview_at_time_calculation...");
121
+ resultCode = await sideviewCalc.run();
122
+ sideviewCalc.messages.forEach((msg) => console.log(msg));
123
+ expect(resultCode).toBe(ResultCode.SUCCESS);
124
+
125
+ const contourPoints = sideviewCalc.contourPoints!;
126
+ const dispersionRecords = sideviewCalc.dispersionRecords!;
127
+
128
+ // Check number of contour points
129
+ expect(contourPoints.length).toBe(190);
130
+
131
+ // Check one of the final contour point's x-values
132
+ const targetContourPoint = contourPoints[contourPoints.length - 3];
133
+ const expectedX = 2.8916389790099224;
134
+ const xError = Math.abs((targetContourPoint.x - expectedX) / expectedX);
135
+ expect(xError).toBeLessThan(1e-3);
136
+
137
+ // Check final dispersion record's centreline concentration
138
+ const lastDispersion = dispersionRecords[dispersionRecords.length - 1];
139
+ const expectedConc = 0.004768006933732604;
140
+ const concError = Math.abs(
141
+ (lastDispersion.centrelineConcentration! - expectedConc) / expectedConc
142
+ );
143
+ expect(concError).toBeLessThan(1e-3);
144
+
145
+ console.log(
146
+ `SUCCESS: sideview_at_time_calculation (${sideviewCalc.calculationElapsedTime}ms)`
147
+ );
148
+ });
149
+ });
150
+
@@ -0,0 +1,145 @@
1
+ import {VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { SideviewAtTimeCalculation} from "../../src/calculations/dispersionView";
4
+ import {Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, LocalPosition, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, ResultCode, SurfaceType, VesselShape, WindProfileFlag } from "../../src/enums";
6
+ import { setAccessToken } from "../../src/utilities";
7
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
8
+
9
+ if (!accessToken) {
10
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
11
+ }
12
+
13
+ setAccessToken(accessToken);
14
+
15
+ describe("SideviewAtTimeCalculation", () => {
16
+ test("should calculate correct sideview dispersion for HEXANE", async () => {
17
+ const material = new Material({
18
+ name: "HEXANE",
19
+ components: [new MaterialComponent({ name: "N-HEXANE", moleFraction: 1.0 })],
20
+ });
21
+
22
+ const state = new State({
23
+ temperature: 280.0,
24
+ pressure: 2.0e5,
25
+ liquidFraction: 0.8,
26
+ });
27
+
28
+ const surfaceType = SurfaceType.WATER;
29
+ const surfaceRoughness = 0.05;
30
+ const windSpeed = 2.0;
31
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
32
+ const endPointConcentration = 0.0;
33
+ const specifyBund = true;
34
+ const bundHeight = 1.0;
35
+ const bundDiameter = 8.0;
36
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
37
+
38
+ const vesselStateCalc = new VesselStateCalculation(material, state);
39
+
40
+ console.log("Running vessel_state_calculation...");
41
+ let resultCode = await vesselStateCalc.run();
42
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
43
+ expect(resultCode).toBe(ResultCode.SUCCESS);
44
+
45
+ const vessel = new Vessel({
46
+ state,
47
+ material,
48
+ liquidFillFractionByVolume: 0.8,
49
+ shape: VesselShape.VERTICAL_CYLINDER,
50
+ vesselConditions: vesselStateCalc.vesselConditions!,
51
+ });
52
+
53
+ const ruptureCalc = new VesselCatastrophicRuptureCalculation(
54
+ vessel,
55
+ new DischargeParameters()
56
+ );
57
+
58
+ console.log("Running vessel_catastrophic_rupture_calculation...");
59
+ resultCode = await ruptureCalc.run();
60
+ ruptureCalc.messages.forEach((msg) => console.log(msg));
61
+ expect(resultCode).toBe(ResultCode.SUCCESS);
62
+
63
+ const bund = new Bund({
64
+ specifyBund,
65
+ bundHeight,
66
+ bundDiameter,
67
+ });
68
+
69
+ const substrate = new Substrate({
70
+ bund,
71
+ surfaceType,
72
+ surfaceRoughness,
73
+ });
74
+
75
+ const weather = new Weather({
76
+ windSpeed: windSpeed,
77
+ stabilityClass: stabilityClass,
78
+ windProfileFlag: windProfileFlag,
79
+ });
80
+
81
+ const dispersionParams = new DispersionParameters();
82
+
83
+ const dispersionCalc = new DispersionCalculation(
84
+ ruptureCalc.exitMaterial!,
85
+ substrate,
86
+ ruptureCalc.dischargeResult!,
87
+ ruptureCalc.dischargeRecords!,
88
+ ruptureCalc.dischargeRecords!.length,
89
+ weather,
90
+ dispersionParams,
91
+ endPointConcentration
92
+ );
93
+
94
+ console.log("Running dispersion_calculation...");
95
+ resultCode = await dispersionCalc.run();
96
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
97
+ expect(resultCode).toBe(ResultCode.SUCCESS);
98
+
99
+ const outputConfig = new DispersionOutputConfig({
100
+ concentration: endPointConcentration,
101
+ time: 0.5,
102
+ });
103
+
104
+ const sideviewCalc = new SideviewAtTimeCalculation(
105
+ dispersionCalc.scalarUdmOutputs!,
106
+ weather,
107
+ dispersionCalc.dispersionRecords!,
108
+ dispersionCalc.dispersionRecords!.length,
109
+ substrate,
110
+ outputConfig,
111
+ ruptureCalc.exitMaterial!,
112
+ dispersionParams
113
+ );
114
+
115
+ console.log("Running sideview_at_time_calculation...");
116
+ resultCode = await sideviewCalc.run();
117
+ sideviewCalc.messages.forEach((msg) => console.log(msg));
118
+ expect(resultCode).toBe(ResultCode.SUCCESS);
119
+
120
+ const contourPoints = sideviewCalc.contourPoints!;
121
+ const dispersionRecords = sideviewCalc.dispersionRecords!;
122
+
123
+ // Check number of contour points
124
+ expect(contourPoints.length).toBe(279);
125
+
126
+ // Check x-value of the third-from-last contour point
127
+ const targetContourPoint = contourPoints[contourPoints.length - 3];
128
+ const expectedX = 3.8448647902534274;
129
+ const xError = Math.abs((targetContourPoint.x - expectedX) / expectedX);
130
+ expect(xError).toBeLessThan(1e-3);
131
+
132
+ // Check centreline concentration of the last dispersion record
133
+ const lastDispersion = dispersionRecords[dispersionRecords.length - 1];
134
+ const expectedConc = 0.0033212173007439575;
135
+ const concError = Math.abs(
136
+ (lastDispersion.centrelineConcentration! - expectedConc) / expectedConc
137
+ );
138
+ expect(concError).toBeLessThan(1e-3);
139
+
140
+ console.log(
141
+ `SUCCESS: sideview_at_time_calculation (${sideviewCalc.calculationElapsedTime}ms)`
142
+ );
143
+ });
144
+ });
145
+
@@ -0,0 +1,130 @@
1
+ import {VesselStateCalculation, VesselLeakCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { SideviewAtTimeCalculation} from "../../src/calculations/dispersionView";
4
+ import {Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, LocalPosition, Leak, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, ResultCode, SurfaceType, VesselShape, TimeVaryingOption, 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("SideviewAtTimeCalculation", () => {
16
+ test("should calculate correct sideview dispersion for CARBON DIOXIDE (TOXIC)", async () => {
17
+ const material = new Material({
18
+ name: "CARBON DIOXIDE (TOXIC)",
19
+ components: [new MaterialComponent({ name: "CARBON DIOXIDE (TOXIC)", moleFraction: 1.0 })],
20
+ });
21
+
22
+ const state = new State({
23
+ temperature: 280.0,
24
+ pressure: 8.0e6,
25
+ liquidFraction: 0.0,
26
+ });
27
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
28
+ const vesselStateCalc = new VesselStateCalculation(material, state);
29
+
30
+ console.log("Running vessel_state_calculation...");
31
+ let resultCode = await vesselStateCalc.run();
32
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
33
+ expect(resultCode).toBe(ResultCode.SUCCESS);
34
+
35
+ const vessel = new Vessel({
36
+ state: vesselStateCalc.outputState!,
37
+ material: vesselStateCalc.material!,
38
+ vesselConditions: vesselStateCalc.vesselConditions!,
39
+ diameter: 5.0,
40
+ shape: VesselShape.VESSEL_SPHERE,
41
+ liquidFillFractionByVolume: 0.8,
42
+ });
43
+
44
+ const leak = new Leak({
45
+ holeDiameter: 0.008,
46
+ holeHeightFraction: 0.5,
47
+ timeVaryingOption: TimeVaryingOption.INITIAL_RATE,
48
+ });
49
+
50
+ const dischargeParams = new DischargeParameters();
51
+
52
+ const leakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
53
+
54
+ console.log("Running vessel_leak_calculation...");
55
+ resultCode = await leakCalc.run();
56
+ leakCalc.messages.forEach((msg) => console.log(msg));
57
+ expect(resultCode).toBe(ResultCode.SUCCESS);
58
+
59
+ const substrate = new Substrate({
60
+ surfaceType: SurfaceType.WATER,
61
+ surfaceRoughness: 0.01,
62
+ });
63
+
64
+ const weather = new Weather({
65
+ windSpeed: 4.0,
66
+ stabilityClass: AtmosphericStabilityClass.STABILITY_C,
67
+ windProfileFlag: windProfileFlag
68
+ });
69
+
70
+ const dispersionParams = new DispersionParameters();
71
+
72
+ const dispersionCalc = new DispersionCalculation(
73
+ leakCalc.exitMaterial!,
74
+ substrate,
75
+ leakCalc.dischargeResult!,
76
+ leakCalc.dischargeRecords!,
77
+ leakCalc.dischargeRecords!.length,
78
+ weather,
79
+ dispersionParams,
80
+ 0.0
81
+ );
82
+
83
+ console.log("Running dispersion_calculation...");
84
+ resultCode = await dispersionCalc.run();
85
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
86
+ expect(resultCode).toBe(ResultCode.SUCCESS);
87
+
88
+ const outputConfig = new DispersionOutputConfig({
89
+ concentration: 0.0,
90
+ });
91
+
92
+ const sideviewCalc = new SideviewAtTimeCalculation(
93
+ dispersionCalc.scalarUdmOutputs!,
94
+ weather,
95
+ dispersionCalc.dispersionRecords!,
96
+ dispersionCalc.dispersionRecords!.length,
97
+ substrate,
98
+ outputConfig,
99
+ leakCalc.exitMaterial!,
100
+ dispersionParams
101
+ );
102
+
103
+ console.log("Running sideview_at_time_calculation...");
104
+ resultCode = await sideviewCalc.run();
105
+ sideviewCalc.messages.forEach((msg) => console.log(msg));
106
+ expect(resultCode).toBe(ResultCode.SUCCESS);
107
+
108
+ const contourPoints = sideviewCalc.contourPoints!;
109
+ const dispersionRecords = sideviewCalc.dispersionRecords!;
110
+
111
+ expect(contourPoints.length).toBe(171);
112
+
113
+ const targetContourPoint = contourPoints[contourPoints.length - 3];
114
+ const expectedX = 6.9777184369577;
115
+ const xError = Math.abs((targetContourPoint.x - expectedX) / expectedX);
116
+ expect(xError).toBeLessThan(1e-3);
117
+
118
+ const lastDispersion = dispersionRecords[dispersionRecords.length - 1];
119
+ const expectedConc = 0.03998493262289725;
120
+ const concError = Math.abs(
121
+ (lastDispersion.centrelineConcentration! - expectedConc) / expectedConc
122
+ );
123
+ expect(concError).toBeLessThan(1e-3);
124
+
125
+ console.log(
126
+ `SUCCESS: sideview_at_time_calculation (${sideviewCalc.calculationElapsedTime}ms)`
127
+ );
128
+ });
129
+ });
130
+