@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,145 @@
1
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { DistancesToConcLevelsCalculation } from "../../src/calculations/dispersionView";
4
+ import { Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, ResultCode, SurfaceType, VesselShape, WindProfileFlag } from "../../src/enums";
6
+ import { setAccessToken } from "../../src/utilities";
7
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
8
+
9
+ if (!accessToken) {
10
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
11
+ }
12
+
13
+ setAccessToken(accessToken);
14
+
15
+ describe("Test Case 122 - Distances to Concentration Levels Scenario", () => {
16
+ test("should run vessel, rupture, dispersion, and distances calculations with regression checks", async () => {
17
+ // Define material and state
18
+ const material = new Material({
19
+ name: "HEXANE",
20
+ components: [new MaterialComponent({ name: "N-HEXANE", 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
+ shape: VesselShape.VERTICAL_CYLINDER,
50
+ vesselConditions: vesselStateCalc.vesselConditions,
51
+ });
52
+
53
+ // Vessel catastrophic rupture calculation
54
+ const dischargeParams = new DischargeParameters();
55
+ const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
56
+
57
+ console.log("Running vessel_catastrophic_rupture_calculation...");
58
+ const ruptureResult = await vesselRuptureCalc.run();
59
+
60
+ if (vesselRuptureCalc.messages.length > 0) {
61
+ console.log("Messages:");
62
+ vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
63
+ }
64
+
65
+ expect(ruptureResult).toBe(ResultCode.SUCCESS);
66
+ console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
67
+
68
+ // Set up entities for dispersion calculation
69
+ const bund = new Bund({
70
+ specifyBund: true,
71
+ bundHeight: 1.0,
72
+ bundDiameter: 8.0,
73
+ });
74
+
75
+ const substrate = new Substrate({
76
+ bund,
77
+ surfaceType: SurfaceType.WATER,
78
+ surfaceRoughness: 0.05,
79
+ });
80
+
81
+ const weather = new Weather({
82
+ windSpeed: 2.0,
83
+ stabilityClass: AtmosphericStabilityClass.STABILITY_F,
84
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
85
+ });
86
+
87
+ const dispersionParams = new DispersionParameters();
88
+
89
+ // Dispersion calculation
90
+ const dispersionCalc = new DispersionCalculation(
91
+ vesselRuptureCalc.exitMaterial!,
92
+ substrate,
93
+ vesselRuptureCalc.dischargeResult!,
94
+ vesselRuptureCalc.dischargeRecords!,
95
+ vesselRuptureCalc.dischargeRecords!.length,
96
+ weather,
97
+ dispersionParams,
98
+ 0.0 // endPointConcentration
99
+ );
100
+
101
+ console.log("Running dispersion_calculation...");
102
+ const dispersionResult = await dispersionCalc.run();
103
+
104
+ if (dispersionCalc.messages.length > 0) {
105
+ console.log("Messages:");
106
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
107
+ }
108
+
109
+ expect(dispersionResult).toBe(ResultCode.SUCCESS);
110
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
111
+
112
+ // Distances to concentration levels calculation
113
+ const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0 })];
114
+
115
+ const distancesCalc = new DistancesToConcLevelsCalculation(
116
+ dispersionCalc.scalarUdmOutputs!,
117
+ weather,
118
+ dispersionCalc.dispersionRecords!,
119
+ dispersionCalc.dispersionRecords!.length,
120
+ substrate,
121
+ dispersionOutputConfigs,
122
+ dispersionOutputConfigs.length,
123
+ vesselRuptureCalc.exitMaterial!,
124
+ dispersionParams
125
+ );
126
+
127
+ console.log("Running distances_to_conc_levels_calculation...");
128
+ const distancesResult = await distancesCalc.run();
129
+
130
+ if (distancesCalc.messages.length > 0) {
131
+ console.log("Messages:");
132
+ distancesCalc.messages.forEach((msg) => console.log(msg));
133
+ }
134
+
135
+ expect(distancesResult).toBe(ResultCode.SUCCESS);
136
+
137
+ // Regression check
138
+ const distanceError = Math.abs(
139
+ (distancesCalc.distances![0] - 13.21859690146534) / 13.21859690146534
140
+ );
141
+ expect(distanceError).toBeLessThan(1e-3);
142
+
143
+ console.log(`SUCCESS: distances_to_conc_levels_calculation (${distancesCalc.calculationElapsedTime}ms)`);
144
+ });
145
+ });
@@ -0,0 +1,150 @@
1
+ import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { DistancesToConcLevelsCalculation } from "../../src/calculations/dispersionView";
4
+ import { DischargeParameters, DispersionOutputConfig, DispersionParameters, Leak, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, ResultCode, SurfaceType, TimeVaryingOption, VesselShape, WindProfileFlag } from "../../src/enums";
6
+ import { setAccessToken } from "../../src/utilities";
7
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
8
+
9
+ if (!accessToken) {
10
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
11
+ }
12
+
13
+ setAccessToken(accessToken);
14
+
15
+ describe("Test Case 123 - Distances to Concentration Levels Scenario", () => {
16
+ test("should run vessel, leak, dispersion, and distances calculations with regression checks", async () => {
17
+ // Define material and state
18
+ const material = new Material({
19
+ name: "CARBON DIOXIDE (TOXIC)",
20
+ components: [
21
+ new MaterialComponent({ name: "CARBON DIOXIDE (TOXIC)", moleFraction: 1.0 }),
22
+ ],
23
+ componentCount: 1,
24
+ });
25
+
26
+ const state = new State({
27
+ temperature: 280.0,
28
+ pressure: 8.0e6,
29
+ liquidFraction: 0.0,
30
+ });
31
+
32
+ // Vessel state calculation
33
+ const vesselStateCalc = new VesselStateCalculation(material, state);
34
+
35
+ console.log("Running vessel_state_calculation...");
36
+ const vesselStateResult = await vesselStateCalc.run();
37
+
38
+ if (vesselStateCalc.messages.length > 0) {
39
+ console.log("Messages:");
40
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
41
+ }
42
+
43
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
44
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
45
+
46
+ // Define vessel
47
+ const vessel = new Vessel({
48
+ state: vesselStateCalc.outputState!,
49
+ material: vesselStateCalc.material,
50
+ vesselConditions: vesselStateCalc.vesselConditions,
51
+ diameter: 5.0,
52
+ shape: VesselShape.VESSEL_SPHERE,
53
+ liquidFillFractionByVolume: 0.8,
54
+ });
55
+
56
+ // Define leak
57
+ const leak = new Leak({
58
+ holeDiameter: 0.008,
59
+ holeHeightFraction: 0.5,
60
+ timeVaryingOption: TimeVaryingOption.INITIAL_RATE,
61
+ });
62
+
63
+ // Vessel leak calculation
64
+ const dischargeParams = new DischargeParameters();
65
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
66
+
67
+ console.log("Running vessel_leak_calculation...");
68
+ const leakResult = await vesselLeakCalc.run();
69
+
70
+ if (vesselLeakCalc.messages.length > 0) {
71
+ console.log("Messages:");
72
+ vesselLeakCalc.messages.forEach((msg) => console.log(msg));
73
+ }
74
+
75
+ expect(leakResult).toBe(ResultCode.SUCCESS);
76
+ console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
77
+
78
+ // Set up entities for dispersion calculation
79
+ const substrate = new Substrate({
80
+ surfaceType: SurfaceType.WATER,
81
+ surfaceRoughness: 0.01,
82
+ });
83
+
84
+ const weather = new Weather({
85
+ windSpeed: 4.0,
86
+ stabilityClass: AtmosphericStabilityClass.STABILITY_C,
87
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
88
+ });
89
+
90
+ const dispersionParams = new DispersionParameters();
91
+
92
+ // Dispersion calculation
93
+ const dispersionCalc = new DispersionCalculation(
94
+ vesselLeakCalc.exitMaterial!,
95
+ substrate,
96
+ vesselLeakCalc.dischargeResult!,
97
+ vesselLeakCalc.dischargeRecords!,
98
+ vesselLeakCalc.dischargeRecords!.length,
99
+ weather,
100
+ dispersionParams,
101
+ 0.0 // endPointConcentration
102
+ );
103
+
104
+ console.log("Running dispersion_calculation...");
105
+ const dispersionResult = await dispersionCalc.run();
106
+
107
+ if (dispersionCalc.messages.length > 0) {
108
+ console.log("Messages:");
109
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
110
+ }
111
+
112
+ expect(dispersionResult).toBe(ResultCode.SUCCESS);
113
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
114
+
115
+ // Distances to concentration levels calculation
116
+ const dispersionOutputConfigs = [
117
+ new DispersionOutputConfig({ concentration: 0.0, elevation: 2.4 }),
118
+ ];
119
+
120
+ const distancesCalc = new DistancesToConcLevelsCalculation(
121
+ dispersionCalc.scalarUdmOutputs!,
122
+ weather,
123
+ dispersionCalc.dispersionRecords!,
124
+ dispersionCalc.dispersionRecords!.length,
125
+ substrate,
126
+ dispersionOutputConfigs,
127
+ dispersionOutputConfigs.length,
128
+ vesselLeakCalc.exitMaterial!,
129
+ dispersionParams
130
+ );
131
+
132
+ console.log("Running distances_to_conc_levels_calculation...");
133
+ const distancesResult = await distancesCalc.run();
134
+
135
+ if (distancesCalc.messages.length > 0) {
136
+ console.log("Messages:");
137
+ distancesCalc.messages.forEach((msg) => console.log(msg));
138
+ }
139
+
140
+ expect(distancesResult).toBe(ResultCode.SUCCESS);
141
+
142
+ // Regression check
143
+ const distanceError = Math.abs(
144
+ (distancesCalc.distances![0] - 10.023176380641605) / 10.023176380641605
145
+ );
146
+ expect(distanceError).toBeLessThan(1e-3);
147
+
148
+ console.log(`SUCCESS: distances_to_conc_levels_calculation (${distancesCalc.calculationElapsedTime}ms)`);
149
+ });
150
+ });
@@ -0,0 +1,154 @@
1
+ import { VesselLineRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { DistancesToConcLevelsCalculation } from "../../src/calculations/dispersionView";
4
+ import { Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, LineRupture, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, ResultCode, SurfaceType, VesselShape, WindProfileFlag } from "../../src/enums";
6
+ import { setAccessToken } from "../../src/utilities";
7
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
8
+
9
+ if (!accessToken) {
10
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
11
+ }
12
+
13
+ setAccessToken(accessToken);
14
+
15
+ describe("Test Case 124 - Distances to Concentration Levels Scenario", () => {
16
+ test("should run vessel, line rupture, dispersion, and distances calculations with regression checks", async () => {
17
+ // Define material and state
18
+ const state = new State({
19
+ temperature: 290.0,
20
+ pressure: 7.0e6,
21
+ liquidFraction: 1.0,
22
+ });
23
+
24
+ const material = new Material({
25
+ name: "AMMONIA",
26
+ components: [new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 })],
27
+ componentCount: 1,
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
+ vesselConditions: vesselStateCalc.vesselConditions,
49
+ liquidFillFractionByVolume: 0.7,
50
+ shape: VesselShape.VESSEL_CUBOID,
51
+ height: 2.0,
52
+ width: 1.0,
53
+ length: 3.0,
54
+ });
55
+
56
+ // Define line rupture
57
+ const lineRupture = new LineRupture({
58
+ pipeDiameter: 0.1,
59
+ pipeLength: 1.0,
60
+ pipeHeightFraction: 0.1,
61
+ });
62
+
63
+ // Vessel line rupture calculation
64
+ const dischargeParams = new DischargeParameters();
65
+ const vesselLineRuptureCalc = new VesselLineRuptureCalculation(vessel, lineRupture, dischargeParams);
66
+
67
+ console.log("Running vessel_line_rupture_calculation...");
68
+ const ruptureResult = await vesselLineRuptureCalc.run();
69
+
70
+ if (vesselLineRuptureCalc.messages.length > 0) {
71
+ console.log("Messages:");
72
+ vesselLineRuptureCalc.messages.forEach((msg) => console.log(msg));
73
+ }
74
+
75
+ expect(ruptureResult).toBe(ResultCode.SUCCESS);
76
+ console.log(`SUCCESS: vessel_line_rupture_calculation (${vesselLineRuptureCalc.calculationElapsedTime}ms)`);
77
+
78
+ // Set up entities for dispersion calculation
79
+ const bund = new Bund({
80
+ specifyBund: true,
81
+ bundHeight: 0.5,
82
+ bundDiameter: 5.0,
83
+ });
84
+
85
+ const substrate = new Substrate({
86
+ bund,
87
+ surfaceType: SurfaceType.LAND,
88
+ surfaceRoughness: 0.183,
89
+ });
90
+
91
+ const weather = new Weather({
92
+ windSpeed: 1.5,
93
+ stabilityClass: AtmosphericStabilityClass.STABILITY_D,
94
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE,
95
+ });
96
+
97
+ const dispersionParams = new DispersionParameters();
98
+
99
+ // Dispersion calculation
100
+ const dispersionCalc = new DispersionCalculation(
101
+ vesselLineRuptureCalc.exitMaterial!,
102
+ substrate,
103
+ vesselLineRuptureCalc.dischargeResult!,
104
+ vesselLineRuptureCalc.dischargeRecords!,
105
+ vesselLineRuptureCalc.dischargeRecords!.length,
106
+ weather,
107
+ dispersionParams,
108
+ 0.0 // endPointConcentration
109
+ );
110
+
111
+ console.log("Running dispersion_calculation...");
112
+ const dispersionResult = await dispersionCalc.run();
113
+
114
+ if (dispersionCalc.messages.length > 0) {
115
+ console.log("Messages:");
116
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
117
+ }
118
+
119
+ expect(dispersionResult).toBe(ResultCode.SUCCESS);
120
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
121
+
122
+ // Distances to concentration levels calculation
123
+ const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0, elevation: 35.0 })];
124
+
125
+ const distancesCalc = new DistancesToConcLevelsCalculation(
126
+ dispersionCalc.scalarUdmOutputs!,
127
+ weather,
128
+ dispersionCalc.dispersionRecords!,
129
+ dispersionCalc.dispersionRecords!.length,
130
+ substrate,
131
+ dispersionOutputConfigs,
132
+ dispersionOutputConfigs.length,
133
+ vesselLineRuptureCalc.exitMaterial!,
134
+ dispersionParams
135
+ );
136
+
137
+ console.log("Running distances_to_conc_levels_calculation...");
138
+ const distancesResult = await distancesCalc.run();
139
+
140
+ if (distancesCalc.messages.length > 0) {
141
+ console.log("Messages:");
142
+ distancesCalc.messages.forEach((msg) => console.log(msg));
143
+ }
144
+
145
+ expect(distancesResult).toBe(ResultCode.SUCCESS);
146
+
147
+ // Regression check
148
+ const distanceError = Math.abs(
149
+ (distancesCalc.distances![0] - 327.4691422670722) / 327.4691422670722);
150
+ expect(distanceError).toBeLessThan(1e-3);
151
+
152
+ console.log(`SUCCESS: distances_to_conc_levels_calculation (${distancesCalc.calculationElapsedTime}ms)`);
153
+ });
154
+ });
@@ -0,0 +1,157 @@
1
+ import { VesselStateCalculation, VesselReliefValveCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation} from "../../src/calculations/dispersion";
3
+ import { DistancesToConcLevelsCalculation, } from "../../src/calculations/dispersionView";
4
+ import { Material, MaterialComponent, State, Vessel, ReliefValve, DischargeParameters, Bund, Substrate, Weather, DispersionParameters, DispersionOutputConfig } from "../../src/entities";
5
+ import { VesselShape, ResultCode, SurfaceType, AtmosphericStabilityClass, WindProfileFlag } from "../../src/enums";
6
+ import { setAccessToken } from "../../src/utilities";
7
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
8
+
9
+ if (!accessToken) {
10
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
11
+ }
12
+
13
+ setAccessToken(accessToken);
14
+
15
+ describe("Test Case 125 - Distances to Concentration Levels Scenario", () => {
16
+ test("should run vessel state, relief valve, dispersion, and distances calculations with regression checks", async () => {
17
+ // Define material and state
18
+ const material = new Material({
19
+ name: "CHLORINE",
20
+ components: [
21
+ new MaterialComponent({ name: "CHLORINE", moleFraction: 1.0 }),
22
+ ],
23
+ componentCount: 1,
24
+ });
25
+
26
+ const state = new State({
27
+ temperature: 320.0,
28
+ pressure: 1.0e6,
29
+ liquidFraction: 1.0,
30
+ });
31
+
32
+ // Vessel state calculation
33
+ const vesselStateCalc = new VesselStateCalculation(material, state);
34
+
35
+ console.log("Running vessel_state_calculation...");
36
+ const vesselStateResult = await vesselStateCalc.run();
37
+
38
+ if (vesselStateCalc.messages.length > 0) {
39
+ console.log("Messages:");
40
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
41
+ }
42
+
43
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
44
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
45
+
46
+ // Define vessel
47
+ const vessel = new Vessel({
48
+ state,
49
+ material,
50
+ liquidFillFractionByVolume: 0.7,
51
+ shape: VesselShape.HORIZONTAL_CYLINDER,
52
+ vesselConditions: vesselStateCalc.vesselConditions,
53
+ diameter: 2.0,
54
+ length: 5.0,
55
+ });
56
+
57
+ // Define relief valve
58
+ const reliefValve = new ReliefValve({
59
+ pipeDiameter: 0.02,
60
+ pipeLength: 10.0,
61
+ pipeHeightFraction: 1,
62
+ reliefValveConstrictionDiameter: 0.02,
63
+ });
64
+
65
+ // Vessel relief valve calculation
66
+ const dischargeParams = new DischargeParameters();
67
+ const vesselReliefValveCalc = new VesselReliefValveCalculation(vessel, reliefValve, dischargeParams);
68
+
69
+ console.log("Running vessel_relief_valve_calculation...");
70
+ const reliefValveResult = await vesselReliefValveCalc.run();
71
+
72
+ if (vesselReliefValveCalc.messages.length > 0) {
73
+ console.log("Messages:");
74
+ vesselReliefValveCalc.messages.forEach((msg) => console.log(msg));
75
+ }
76
+
77
+ expect(reliefValveResult).toBe(ResultCode.SUCCESS);
78
+ console.log(`SUCCESS: vessel_relief_valve_calculation (${vesselReliefValveCalc.calculationElapsedTime}ms)`);
79
+ console.log(`vessel_relief_valve_calculation.dischargeResult.releaseMass: ${vesselReliefValveCalc.dischargeResult?.releaseMass} [kg]`);
80
+
81
+ // Set up entities for dispersion calculation
82
+ const bund = new Bund({
83
+ specifyBund: true,
84
+ bundHeight: 0.5,
85
+ bundDiameter: 5.0,
86
+ });
87
+
88
+ const substrate = new Substrate({
89
+ bund,
90
+ surfaceType: SurfaceType.LAND,
91
+ surfaceRoughness: 0.183,
92
+ });
93
+
94
+ const weather = new Weather({
95
+ windSpeed: 1.5,
96
+ stabilityClass: AtmosphericStabilityClass.STABILITY_D,
97
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE,
98
+ });
99
+
100
+ const dispersionParams = new DispersionParameters();
101
+
102
+ // Dispersion calculation
103
+ const dispersionCalc = new DispersionCalculation(
104
+ vesselReliefValveCalc.exitMaterial!,
105
+ substrate,
106
+ vesselReliefValveCalc.dischargeResult!,
107
+ vesselReliefValveCalc.dischargeRecords!,
108
+ vesselReliefValveCalc.dischargeRecords!.length,
109
+ weather,
110
+ dispersionParams,
111
+ 0.0 // endPointConcentration
112
+ );
113
+
114
+ console.log("Running dispersion_calculation...");
115
+ const dispersionResult = await dispersionCalc.run();
116
+
117
+ if (dispersionCalc.messages.length > 0) {
118
+ console.log("Messages:");
119
+ dispersionCalc.messages.forEach((msg) => console.log(msg));
120
+ }
121
+
122
+ expect(dispersionResult).toBe(ResultCode.SUCCESS);
123
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
124
+
125
+ // Distances to concentration levels calculation
126
+ const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0, elevation: 0.0 })];
127
+
128
+ const distancesCalc = new DistancesToConcLevelsCalculation(
129
+ dispersionCalc.scalarUdmOutputs!,
130
+ weather,
131
+ dispersionCalc.dispersionRecords!,
132
+ dispersionCalc.dispersionRecords!.length,
133
+ substrate,
134
+ dispersionOutputConfigs,
135
+ dispersionOutputConfigs.length,
136
+ vesselReliefValveCalc.exitMaterial!,
137
+ dispersionParams
138
+ );
139
+
140
+ console.log("Running distances_to_conc_levels_calculation...");
141
+ const distancesResult = await distancesCalc.run();
142
+
143
+ if (distancesCalc.messages.length > 0) {
144
+ console.log("Messages:");
145
+ distancesCalc.messages.forEach((msg) => console.log(msg));
146
+ }
147
+
148
+ expect(distancesResult).toBe(ResultCode.SUCCESS);
149
+ console.log(`distances = ${distancesCalc.distances![0]}`);
150
+ console.log(`SUCCESS: distances_to_conc_levels_calculation (${distancesCalc.calculationElapsedTime}ms)`);
151
+
152
+ // Note: The Python test does not include a regression check for distances, so none is added here.
153
+ // If a specific expected distance value is known, you can add a check like:
154
+ // const distanceError = Math.abs((distancesCalc.distances![0] - EXPECTED_VALUE) / EXPECTED_VALUE);
155
+ // expect(distanceError).toBeLessThan(1e-3);
156
+ });
157
+ });
@@ -0,0 +1,49 @@
1
+ import { LocalPosition, Material, MaterialComponent, State, Vessel } from "../../src/entities";
2
+ import { VesselConditions, VesselShape } from "../../src/enums";
3
+ import { setAccessToken } from "../../src/utilities";
4
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
5
+
6
+ if (!accessToken) {
7
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
8
+ }
9
+
10
+ setAccessToken(accessToken);
11
+
12
+ describe("Test Vessel Entity", () => {
13
+ test("should correctly instantiate a Vessel entity with specified attributes", () => {
14
+ // Define material
15
+ const material = new Material({
16
+ name: "AMMONIA",
17
+ components: [new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 })],
18
+ componentCount: 1,
19
+ });
20
+
21
+ // Define state
22
+ const state = new State({
23
+ temperature: 265.0,
24
+ pressure: 5.0e5, // Converted from string '5.0E5' to number notation
25
+ liquidFraction: 0.0,
26
+ });
27
+
28
+ // Define position
29
+ const position = new LocalPosition({
30
+ x: 10.0,
31
+ y: 20.0,
32
+ z: 30.0,
33
+ });
34
+
35
+ // Create vessel
36
+ const vessel = new Vessel({
37
+ state,
38
+ material,
39
+ location: position,
40
+ liquidFillFractionByVolume: 0.5
41
+ });
42
+
43
+ // Assertions
44
+ expect(vessel.material.name).toBe("AMMONIA");
45
+ expect(vessel.state.temperature).toBe(265.0);
46
+ expect(vessel.state.pressure).toBe(5.0e5);
47
+ expect(vessel.state.liquidFraction).toBe(0.0);
48
+ });
49
+ });