@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,188 @@
1
+ import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig, ReliefValve } from "../../src/entities";
2
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation, VesselReliefValveCalculation } from "../../src/calculations/discharge";
3
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
4
+ import { MaxConcFootprintCalculation } from "../../src/calculations/dispersionView";
5
+ import { ResultCode, SurfaceType, AtmosphericStabilityClass, 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("Max Concentration Footprint Calculation - Test Case 35", () => {
16
+ test("should calculate max concentration footprint correctly for CHLORINE", async () => {
17
+ const material = new Material({
18
+ name: "CHLORINE",
19
+ components: [
20
+ new MaterialComponent({ name: "CHLORINE", moleFraction: 1.0 }),
21
+ ],
22
+ componentCount: 1,
23
+ });
24
+
25
+ const state = new State({
26
+ temperature: 320.0,
27
+ pressure: 1.0e6,
28
+ liquidFraction: 1.0,
29
+ });
30
+
31
+ const vesselStateCalculation = new VesselStateCalculation(material, state);
32
+ const stateResult = await vesselStateCalculation.run();
33
+
34
+ if (vesselStateCalculation.messages.length > 0) {
35
+ console.log("Messages:");
36
+ vesselStateCalculation.messages.forEach((msg) => console.log(msg));
37
+ }
38
+
39
+ expect(stateResult).toBe(ResultCode.SUCCESS);
40
+ console.log(
41
+ `SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`
42
+ );
43
+
44
+ const vessel = new Vessel({
45
+ state,
46
+ material,
47
+ vesselConditions: vesselStateCalculation.vesselConditions,
48
+ liquidFillFractionByVolume: 0.7,
49
+ shape: VesselShape.HORIZONTAL_CYLINDER,
50
+ diameter: 2.0,
51
+ length: 5.0,
52
+ });
53
+
54
+ const reliefValve = new ReliefValve({
55
+ pipeDiameter: 0.02,
56
+ pipeLength: 10.0,
57
+ pipeHeightFraction: 1,
58
+ reliefValveConstrictionDiameter: 0.02,
59
+ });
60
+
61
+ const vesselReliefValveCalculation = new VesselReliefValveCalculation(
62
+ vessel,
63
+ reliefValve,
64
+ new DischargeParameters()
65
+ );
66
+
67
+ const reliefResult = await vesselReliefValveCalculation.run();
68
+
69
+ if (vesselReliefValveCalculation.messages.length > 0) {
70
+ console.log("Messages:");
71
+ vesselReliefValveCalculation.messages.forEach((msg) =>
72
+ console.log(msg)
73
+ );
74
+ }
75
+
76
+ expect(reliefResult).toBe(ResultCode.SUCCESS);
77
+ console.log(
78
+ `SUCCESS: vessel_relief_valve_calculation (${vesselReliefValveCalculation.calculationElapsedTime}ms)`
79
+ );
80
+ console.log(
81
+ `vessel_relief_valve_calculation.discharge_result.release_mass: ${vesselReliefValveCalculation.dischargeResult!.releaseMass} [kg]`
82
+ );
83
+
84
+ const bund = new Bund({
85
+ specifyBund: true,
86
+ bundHeight: 0.5,
87
+ bundDiameter: 5.0,
88
+ });
89
+
90
+ const substrate = new Substrate({
91
+ bund,
92
+ surfaceType: SurfaceType.LAND,
93
+ surfaceRoughness: 0.183,
94
+ });
95
+
96
+ const weather = new Weather({
97
+ windSpeed: 1.5,
98
+ stabilityClass: AtmosphericStabilityClass.STABILITY_D,
99
+ windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE,
100
+ });
101
+
102
+ const dispersionParameters = new DispersionParameters();
103
+
104
+ const endPointConcentration = 0.0;
105
+
106
+ const dispersionCalculation = new DispersionCalculation(
107
+ vesselReliefValveCalculation.exitMaterial!,
108
+ substrate,
109
+ vesselReliefValveCalculation.dischargeResult!,
110
+ vesselReliefValveCalculation.dischargeRecords!,
111
+ vesselReliefValveCalculation.dischargeRecords!.length,
112
+ weather,
113
+ dispersionParameters,
114
+ endPointConcentration
115
+ );
116
+
117
+ const dispersionResult = await dispersionCalculation.run();
118
+
119
+ if (dispersionCalculation.messages.length > 0) {
120
+ console.log("Messages:");
121
+ dispersionCalculation.messages.forEach((msg) => console.log(msg));
122
+ }
123
+
124
+ expect(dispersionResult).toBe(ResultCode.SUCCESS);
125
+ console.log(
126
+ `SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`
127
+ );
128
+ console.log(
129
+ `Length dispersion records = ${dispersionCalculation.dispersionRecords!.length}`
130
+ );
131
+ console.log(
132
+ `Minimum concentration = ${dispersionCalculation.scalarUdmOutputs!.minimumConcentration}`
133
+ );
134
+ console.log(
135
+ `Observer count = ${dispersionCalculation.scalarUdmOutputs!.observerCount}`
136
+ );
137
+
138
+ const lastRecord = dispersionCalculation.dispersionRecords!.at(-1)!;
139
+ console.log(
140
+ `Final centreline concentration = ${lastRecord.centrelineConcentration}`
141
+ );
142
+ console.log(`Final downwind distance = ${lastRecord.downwindDistance}`);
143
+
144
+ const dispersionOutputConfig = new DispersionOutputConfig({
145
+ concentration: endPointConcentration,
146
+ });
147
+
148
+ const maxConcFootprintCalculation = new MaxConcFootprintCalculation(
149
+ dispersionCalculation.scalarUdmOutputs!,
150
+ weather,
151
+ dispersionCalculation.dispersionRecords!,
152
+ dispersionCalculation.dispersionRecords!.length,
153
+ substrate,
154
+ dispersionOutputConfig,
155
+ vesselReliefValveCalculation.exitMaterial!,
156
+ dispersionParameters
157
+ );
158
+
159
+ const footprintResult = await maxConcFootprintCalculation.run();
160
+
161
+ if (maxConcFootprintCalculation.messages.length > 0) {
162
+ console.log("Messages:");
163
+ maxConcFootprintCalculation.messages.forEach((msg) =>
164
+ console.log(msg)
165
+ );
166
+ }
167
+
168
+ expect(footprintResult).toBe(ResultCode.SUCCESS);
169
+
170
+ const expectedLength = 651;
171
+ const expectedX = 3.5444266994358022;
172
+ const checkPoint =
173
+ maxConcFootprintCalculation.contourPoints![
174
+ maxConcFootprintCalculation.contourPoints!.length - 3
175
+ ];
176
+
177
+ expect(maxConcFootprintCalculation.contourPoints!.length).toBe(
178
+ expectedLength
179
+ );
180
+ const xError = Math.abs((checkPoint.x - expectedX) / expectedX);
181
+ expect(xError).toBeLessThan(1e-3);
182
+
183
+ console.log(
184
+ `SUCCESS: max_conc_footprint_calculation (${maxConcFootprintCalculation.calculationElapsedTime}ms)`
185
+ );
186
+ });
187
+ });
188
+
@@ -0,0 +1,138 @@
1
+ import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig } from "../../src/entities";
2
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
3
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
4
+ import { MaxDistanceToConcCalculation } from "../../src/calculations/dispersionView";
5
+ import { ResultCode, SurfaceType, AtmosphericStabilityClass, 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("Max Distance to Concentration Calculation - Test Case 111", () => {
16
+ test("should calculate max distance to concentration correctly", async () => {
17
+ // Define the material components
18
+ const material = new Material({
19
+ name: "ETHANE_BUTANE_PROPANE",
20
+ components:
21
+ [
22
+ new MaterialComponent({name: "ETHANE", moleFraction: 0.5}),
23
+ new MaterialComponent({name: "N-BUTANE", moleFraction: 0.3}),
24
+ new MaterialComponent({name: "PROPANE", moleFraction: 0.2}),
25
+ ],
26
+ componentCount: 3
27
+ });
28
+
29
+ // Define the state of the vessel
30
+ const state = new State({ temperature: 265.0, pressure: 5.0e5, liquidFraction: 0.8 });
31
+
32
+ // Define surface type, roughness, and weather conditions
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
+ // Run VesselStateCalculation
44
+ const vesselStateCalculation = new VesselStateCalculation(material, state);
45
+ const vesselStateResultCode = await vesselStateCalculation.run();
46
+
47
+ if (vesselStateCalculation.messages.length > 0) {
48
+ console.log("Messages:");
49
+ vesselStateCalculation.messages.forEach((message) => console.log(message));
50
+ }
51
+
52
+ expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
53
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
54
+
55
+ // Set up the vessel
56
+ const vessel = new Vessel({
57
+ state: state,
58
+ material: material,
59
+ liquidFillFractionByVolume: 0.8,
60
+ shape: VesselShape.VERTICAL_CYLINDER,
61
+ vesselConditions: vesselStateCalculation.vesselConditions
62
+ });
63
+
64
+ // Run VesselCatastrophicRuptureCalculation
65
+ const dischargeParameters = new DischargeParameters();
66
+ const vesselCatastrophicRuptureCalculation = new VesselCatastrophicRuptureCalculation(
67
+ vessel,
68
+ dischargeParameters
69
+ );
70
+ const vesselCatastrophicRuptureResultCode = await vesselCatastrophicRuptureCalculation.run();
71
+
72
+ if (vesselCatastrophicRuptureCalculation.messages.length > 0) {
73
+ console.log("Messages:");
74
+ vesselCatastrophicRuptureCalculation.messages.forEach((message) => console.log(message));
75
+ }
76
+
77
+ expect(vesselCatastrophicRuptureResultCode).toBe(ResultCode.SUCCESS);
78
+ console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselCatastrophicRuptureCalculation.calculationElapsedTime}ms)`);
79
+
80
+ // Set up the entities for DispersionCalculation
81
+ const bund = new Bund({specifyBund: specifyBund, bundHeight: bundHeight, bundDiameter: bundDiameter});
82
+ const substrate = new Substrate({bund, surfaceType, surfaceRoughness});
83
+ const weather = new Weather({ windSpeed: windSpeed, stabilityClass: stabilityClass, windProfileFlag: windProfileFlag });
84
+ const dispersionParameters = new DispersionParameters();
85
+ const dispersionCalculation = new DispersionCalculation(
86
+ vesselCatastrophicRuptureCalculation.exitMaterial!,
87
+ substrate,
88
+ vesselCatastrophicRuptureCalculation.dischargeResult!,
89
+ vesselCatastrophicRuptureCalculation.dischargeRecords!,
90
+ vesselCatastrophicRuptureCalculation.dischargeRecords!.length,
91
+ weather,
92
+ dispersionParameters,
93
+ endPointConcentration
94
+ );
95
+
96
+ const dispersionCalculationResultCode = await dispersionCalculation.run();
97
+
98
+ if (dispersionCalculation.messages.length > 0) {
99
+ console.log("Messages:");
100
+ dispersionCalculation.messages.forEach((message) => console.log(message));
101
+ }
102
+
103
+ expect(dispersionCalculationResultCode).toBe(ResultCode.SUCCESS);
104
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`);
105
+
106
+ // Set up the entities for MaxDistanceToConcCalculation
107
+ const dispersionOutputConfig = new DispersionOutputConfig({concentration: endPointConcentration});
108
+ const maxDistanceToConcCalculation = new MaxDistanceToConcCalculation(
109
+ dispersionCalculation.scalarUdmOutputs!,
110
+ weather,
111
+ dispersionCalculation.dispersionRecords!,
112
+ dispersionCalculation.dispersionRecords!.length,
113
+ substrate,
114
+ dispersionOutputConfig,
115
+ dispersionParameters,
116
+ vesselCatastrophicRuptureCalculation.exitMaterial!
117
+ );
118
+
119
+ const maxDistanceToConcResultCode = await maxDistanceToConcCalculation.run();
120
+
121
+ if (maxDistanceToConcCalculation.messages.length > 0) {
122
+ console.log("Messages:");
123
+ maxDistanceToConcCalculation.messages.forEach((message) => console.log(message));
124
+ }
125
+
126
+ expect(maxDistanceToConcResultCode).toBe(ResultCode.SUCCESS);
127
+
128
+ // Check the result for max distance to concentration
129
+ const expectedDistance = 33.46354835021753;
130
+ const distanceError = Math.abs(
131
+ (maxDistanceToConcCalculation.distance! - expectedDistance) / expectedDistance
132
+ );
133
+
134
+ expect(distanceError).toBeLessThan(1e-3);
135
+
136
+ console.log(`SUCCESS: max_distance_to_conc_calculation (${maxDistanceToConcCalculation.calculationElapsedTime}ms)`);
137
+ });
138
+ });
@@ -0,0 +1,174 @@
1
+ import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig } from "../../src/entities";
2
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
3
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
4
+ import { MaxDistanceToConcCalculation } from "../../src/calculations/dispersionView";
5
+ import { ResultCode, SurfaceType, AtmosphericStabilityClass, 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("Max Distance to Concentration Calculation - Test Case 112", () => {
16
+ test("should calculate max distance to concentration correctly", async () => {
17
+ // Material and components
18
+ const material = new Material({
19
+ name: "HEXANE",
20
+ components: [
21
+ new MaterialComponent({ name: "N-HEXANE", moleFraction: 1.0 }),
22
+ ],
23
+ componentCount: 1,
24
+ });
25
+
26
+ // State of the vessel
27
+ const state = new State({
28
+ temperature: 280.0,
29
+ pressure: 2.0e5,
30
+ liquidFraction: 0.8,
31
+ });
32
+
33
+ // Environmental and bund configuration
34
+ const surfaceType = SurfaceType.WATER;
35
+ const surfaceRoughness = 0.05;
36
+ const windSpeed = 2.0;
37
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
38
+ const endPointConcentration = 0.0;
39
+ const specifyBund = true;
40
+ const bundHeight = 1.0;
41
+ const bundDiameter = 8.0;
42
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
43
+
44
+ // Vessel state calculation
45
+ const vesselStateCalculation = new VesselStateCalculation(material, state);
46
+ const vesselStateResultCode = await vesselStateCalculation.run();
47
+
48
+ if (vesselStateCalculation.messages.length > 0) {
49
+ console.log("Messages:");
50
+ vesselStateCalculation.messages.forEach((message) =>
51
+ console.log(message)
52
+ );
53
+ }
54
+
55
+ expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
56
+ console.log(
57
+ `SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`
58
+ );
59
+
60
+ // Create the vessel
61
+ const vessel = new Vessel({
62
+ state: state,
63
+ material: material,
64
+ liquidFillFractionByVolume: 0.8,
65
+ shape: VesselShape.VERTICAL_CYLINDER,
66
+ vesselConditions: vesselStateCalculation.vesselConditions,
67
+ });
68
+
69
+ const dischargeParameters = new DischargeParameters();
70
+ const vesselCatastrophicRuptureCalculation =
71
+ new VesselCatastrophicRuptureCalculation(vessel, dischargeParameters);
72
+
73
+ const vesselCatastrophicRuptureResultCode =
74
+ await vesselCatastrophicRuptureCalculation.run();
75
+
76
+ if (vesselCatastrophicRuptureCalculation.messages.length > 0) {
77
+ console.log("Messages:");
78
+ vesselCatastrophicRuptureCalculation.messages.forEach((message) =>
79
+ console.log(message)
80
+ );
81
+ }
82
+
83
+ expect(vesselCatastrophicRuptureResultCode).toBe(ResultCode.SUCCESS);
84
+ console.log(
85
+ `SUCCESS: vessel_catastrophic_rupture_calculation (${vesselCatastrophicRuptureCalculation.calculationElapsedTime}ms)`
86
+ );
87
+
88
+ // Dispersion Calculation
89
+ const bund = new Bund({
90
+ specifyBund: specifyBund,
91
+ bundHeight: bundHeight,
92
+ bundDiameter: bundDiameter,
93
+ });
94
+
95
+ const substrate = new Substrate({
96
+ bund,
97
+ surfaceType,
98
+ surfaceRoughness,
99
+ });
100
+
101
+ const weather = new Weather({
102
+ windSpeed: windSpeed,
103
+ stabilityClass: stabilityClass,
104
+ windProfileFlag: windProfileFlag
105
+ });
106
+
107
+ const dispersionParameters = new DispersionParameters();
108
+
109
+ const dispersionCalculation = new DispersionCalculation(
110
+ vesselCatastrophicRuptureCalculation.exitMaterial!,
111
+ substrate,
112
+ vesselCatastrophicRuptureCalculation.dischargeResult!,
113
+ vesselCatastrophicRuptureCalculation.dischargeRecords!,
114
+ vesselCatastrophicRuptureCalculation.dischargeRecords!.length,
115
+ weather,
116
+ dispersionParameters,
117
+ endPointConcentration
118
+ );
119
+
120
+ const dispersionCalculationResultCode = await dispersionCalculation.run();
121
+
122
+ if (dispersionCalculation.messages.length > 0) {
123
+ console.log("Messages:");
124
+ dispersionCalculation.messages.forEach((message) =>
125
+ console.log(message)
126
+ );
127
+ }
128
+
129
+ expect(dispersionCalculationResultCode).toBe(ResultCode.SUCCESS);
130
+ console.log(
131
+ `SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`
132
+ );
133
+
134
+ // Max Distance to Concentration Calculation
135
+ const dispersionOutputConfig = new DispersionOutputConfig({
136
+ concentration: endPointConcentration,
137
+ });
138
+
139
+ const maxDistanceToConcCalculation = new MaxDistanceToConcCalculation(
140
+ dispersionCalculation.scalarUdmOutputs!,
141
+ weather,
142
+ dispersionCalculation.dispersionRecords!,
143
+ dispersionCalculation.dispersionRecords!.length,
144
+ substrate,
145
+ dispersionOutputConfig,
146
+ dispersionParameters,
147
+ vesselCatastrophicRuptureCalculation.exitMaterial!
148
+ );
149
+
150
+ const maxDistanceToConcResultCode = await maxDistanceToConcCalculation.run();
151
+
152
+ if (maxDistanceToConcCalculation.messages.length > 0) {
153
+ console.log("Messages:");
154
+ maxDistanceToConcCalculation.messages.forEach((message) =>
155
+ console.log(message)
156
+ );
157
+ }
158
+
159
+ expect(maxDistanceToConcResultCode).toBe(ResultCode.SUCCESS);
160
+
161
+ // Validate the calculated distance
162
+ const expectedDistance = 13.21859690146534;
163
+ const distanceError = Math.abs(
164
+ (maxDistanceToConcCalculation.distance! - expectedDistance) /
165
+ expectedDistance
166
+ );
167
+
168
+ expect(distanceError).toBeLessThan(1e-3);
169
+ console.log(
170
+ `SUCCESS: max_distance_to_conc_calculation (${maxDistanceToConcCalculation.calculationElapsedTime}ms)`
171
+ );
172
+ });
173
+ });
174
+
@@ -0,0 +1,153 @@
1
+ import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig, Leak } from "../../src/entities";
2
+ import { VesselCatastrophicRuptureCalculation, VesselStateCalculation, VesselLeakCalculation } from "../../src/calculations/discharge";
3
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
4
+ import { MaxDistanceToConcCalculation } from "../../src/calculations/dispersionView";
5
+ import { ResultCode, SurfaceType, AtmosphericStabilityClass, 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("Max Distance to Concentration Calculation - Test Case 113", () => {
16
+ test("should calculate max distance to concentration correctly", async () => {
17
+ // Case properties
18
+ const materialName = "CARBON DIOXIDE (TOXIC)";
19
+ const stateTemperature = 280.0;
20
+ const statePressure = 8.0e6;
21
+ const vesselShape = VesselShape.VESSEL_SPHERE;
22
+ const vesselDiameter = 5.0;
23
+ const leakHoleDiameter = 0.008;
24
+ const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
25
+ const leakHoleHeightFraction = 0.5;
26
+ const surfaceType = SurfaceType.WATER;
27
+ const surfaceRoughness = 0.01;
28
+ const windSpeed = 4.0;
29
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_C;
30
+ const endPointConcentration = 0.0;
31
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
32
+
33
+ // Initial state and material setup
34
+ const state = new State({
35
+ temperature: stateTemperature,
36
+ pressure: statePressure,
37
+ liquidFraction: 0.0,
38
+ });
39
+
40
+ const material = new Material({
41
+ name: materialName,
42
+ components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
43
+ componentCount: 1,
44
+ });
45
+
46
+ const vesselStateCalculation = new VesselStateCalculation(material, state);
47
+ const vesselStateResultCode = await vesselStateCalculation.run();
48
+
49
+ if (vesselStateCalculation.messages.length > 0) {
50
+ console.log("Messages:");
51
+ vesselStateCalculation.messages.forEach((message) => console.log(message));
52
+ }
53
+
54
+ expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
55
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
56
+
57
+ const vessel = new Vessel({
58
+ state: vesselStateCalculation.outputState!,
59
+ material: vesselStateCalculation.material!,
60
+ vesselConditions: vesselStateCalculation.vesselConditions,
61
+ diameter: vesselDiameter,
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 dischargeParameters = new DischargeParameters();
73
+
74
+ const vesselLeakCalculation = new VesselLeakCalculation(vessel, leak, dischargeParameters);
75
+ const vesselLeakResultCode = await vesselLeakCalculation.run();
76
+
77
+ if (vesselLeakCalculation.messages.length > 0) {
78
+ console.log("Messages:");
79
+ vesselLeakCalculation.messages.forEach((message) => console.log(message));
80
+ }
81
+
82
+ expect(vesselLeakResultCode).toBe(ResultCode.SUCCESS);
83
+ console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalculation.calculationElapsedTime}ms)`);
84
+
85
+ const substrate = new Substrate({
86
+ surfaceType,
87
+ surfaceRoughness,
88
+ });
89
+
90
+ const weather = new Weather({
91
+ windSpeed: windSpeed,
92
+ stabilityClass: stabilityClass,
93
+ windProfileFlag: windProfileFlag
94
+ });
95
+
96
+ const dispersionParameters = new DispersionParameters();
97
+
98
+ const dispersionCalculation = new DispersionCalculation(
99
+ vesselLeakCalculation.exitMaterial!,
100
+ substrate,
101
+ vesselLeakCalculation.dischargeResult!,
102
+ vesselLeakCalculation.dischargeRecords!,
103
+ vesselLeakCalculation.dischargeRecords!.length,
104
+ weather,
105
+ dispersionParameters,
106
+ endPointConcentration
107
+ );
108
+
109
+ const dispersionResultCode = await dispersionCalculation.run();
110
+
111
+ if (dispersionCalculation.messages.length > 0) {
112
+ console.log("Messages:");
113
+ dispersionCalculation.messages.forEach((message) => console.log(message));
114
+ }
115
+
116
+ expect(dispersionResultCode).toBe(ResultCode.SUCCESS);
117
+ console.log(`SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`);
118
+
119
+ const dispersionOutputConfig = new DispersionOutputConfig({
120
+ concentration: endPointConcentration,
121
+ elevation: 2.5,
122
+ });
123
+
124
+ const maxDistanceToConcCalculation = new MaxDistanceToConcCalculation(
125
+ dispersionCalculation.scalarUdmOutputs!,
126
+ weather,
127
+ dispersionCalculation.dispersionRecords!,
128
+ dispersionCalculation.dispersionRecords!.length,
129
+ substrate,
130
+ dispersionOutputConfig,
131
+ dispersionParameters,
132
+ vesselLeakCalculation.exitMaterial!
133
+ );
134
+
135
+ const maxDistanceResultCode = await maxDistanceToConcCalculation.run();
136
+
137
+ if (maxDistanceToConcCalculation.messages.length > 0) {
138
+ console.log("Messages:");
139
+ maxDistanceToConcCalculation.messages.forEach((message) => console.log(message));
140
+ }
141
+
142
+ expect(maxDistanceResultCode).toBe(ResultCode.SUCCESS);
143
+
144
+ const expectedDistance = 10.10724753690727;
145
+ const distanceError = Math.abs(
146
+ (maxDistanceToConcCalculation.distance! - expectedDistance) / expectedDistance
147
+ );
148
+
149
+ expect(distanceError).toBeLessThan(1e-3);
150
+ console.log(`SUCCESS: max_distance_to_conc_calculation (${maxDistanceToConcCalculation.calculationElapsedTime}ms)`);
151
+ });
152
+ });
153
+