@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,176 @@
1
+ import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { PoolFireCalculation } from "../../src/calculations/poolFire";
4
+ import { DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation } from "../../src/calculations/radiation";
5
+ import { Bund, DischargeParameters, DispersionParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
6
+ import { AtmosphericStabilityClass, PoolFireType, ResultCode, TimeVaryingOption, VesselShape, WindProfileFlag } from "../../src/enums";
7
+ import { setAccessToken } from "../../src/utilities";
8
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
9
+
10
+ if (!accessToken) {
11
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
12
+ }
13
+
14
+ setAccessToken(accessToken);
15
+
16
+ describe("Vessel Leak Calculation Test Case 45", () => {
17
+ test("should produce correct radiation results for pool fire", async () => {
18
+ // Define the test case properties
19
+ const materialName = 'TOLUENE';
20
+ const stateTemperature = 280.0;
21
+ const statePressure = 1.50e5;
22
+ const vesselShape = VesselShape.HORIZONTAL_CYLINDER;
23
+ const vesselLength = 5.0;
24
+ const vesselDiameter = 2.0;
25
+ const leakHoleDiameter = 0.05;
26
+ const timeVaryingOption = TimeVaryingOption.TIME_VARYING_RATE;
27
+ const leakHoleHeightFraction = 0.0;
28
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
29
+
30
+ // Create state and material
31
+ const state = new State({
32
+ temperature: stateTemperature,
33
+ pressure: statePressure,
34
+ liquidFraction: 0.0,
35
+ });
36
+ const material = new Material({
37
+ name: materialName,
38
+ components: [
39
+ new MaterialComponent({ name: materialName, moleFraction: 1.0 }),
40
+ ],
41
+ componentCount: 1,
42
+ });
43
+
44
+ // Run vessel state calculation
45
+ const vesselStateCalc = new VesselStateCalculation(material, state);
46
+ let resultCode = await vesselStateCalc.run();
47
+
48
+ if (vesselStateCalc.messages.length > 0) {
49
+ console.log("Messages:");
50
+ vesselStateCalc.messages.forEach((message) => console.log(message));
51
+ }
52
+
53
+ expect(resultCode).toBe(ResultCode.SUCCESS);
54
+
55
+ // Create vessel and leak
56
+ const vessel = new Vessel({
57
+ state: vesselStateCalc.outputState,
58
+ material: vesselStateCalc.material,
59
+ vesselConditions: vesselStateCalc.vesselConditions,
60
+ diameter: vesselDiameter,
61
+ length: vesselLength,
62
+ shape: vesselShape,
63
+ liquidFillFractionByVolume: 0.5,
64
+ });
65
+
66
+ const leak = new Leak({
67
+ holeDiameter: leakHoleDiameter,
68
+ holeHeightFraction: leakHoleHeightFraction,
69
+ timeVaryingOption: timeVaryingOption,
70
+ });
71
+
72
+ const dischargeParams = new DischargeParameters();
73
+
74
+ // Run vessel leak calculation
75
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
76
+ resultCode = await vesselLeakCalc.run();
77
+
78
+ if (vesselLeakCalc.messages.length > 0) {
79
+ console.log("Messages:");
80
+ vesselLeakCalc.messages.forEach((message) => console.log(message));
81
+ }
82
+
83
+ expect(resultCode).toBe(ResultCode.SUCCESS);
84
+
85
+ // Define weather and substrate
86
+ const weather = new Weather({
87
+ windSpeed: 1.0,
88
+ stabilityClass: AtmosphericStabilityClass.STABILITY_C,
89
+ windProfileFlag: windProfileFlag
90
+ });
91
+ const substrate = new Substrate();
92
+
93
+ // Run dispersion calculation
94
+ const dispersionCalc = new DispersionCalculation(
95
+ vesselLeakCalc.exitMaterial!,
96
+ substrate,
97
+ vesselLeakCalc.dischargeResult!,
98
+ vesselLeakCalc.dischargeRecords!,
99
+ vesselLeakCalc.dischargeRecords!.length,
100
+ weather,
101
+ new DispersionParameters(),
102
+ 0.0
103
+ );
104
+ resultCode = await dispersionCalc.run();
105
+
106
+ if (dispersionCalc.messages.length > 0) {
107
+ console.log("Messages:");
108
+ dispersionCalc.messages.forEach((message) => console.log(message));
109
+ }
110
+
111
+ expect(resultCode).toBe(ResultCode.SUCCESS);
112
+
113
+ // Define flammable parameters
114
+ const flammableParams = new FlammableParameters({
115
+ poolFireType: PoolFireType.LATE,
116
+ });
117
+
118
+ // Run pool fire calculation
119
+ const poolFireCalc = new PoolFireCalculation(
120
+ vesselLeakCalc.exitMaterial!,
121
+ dispersionCalc.poolRecords!,
122
+ dispersionCalc.poolRecords!.length,
123
+ weather,
124
+ substrate,
125
+ flammableParams
126
+ );
127
+ resultCode = await poolFireCalc.run();
128
+
129
+ if (poolFireCalc.messages.length > 0) {
130
+ console.log("Messages:");
131
+ poolFireCalc.messages.forEach((message) => console.log(message));
132
+ }
133
+
134
+ expect(resultCode).toBe(ResultCode.SUCCESS);
135
+
136
+ // Define flammable output config
137
+ const flammableOutputConfigs = [
138
+ { x: 0.0, y: 0.0, z: 0.0 },
139
+ { x: 0.0, y: 0.0, z: 1.0 },
140
+ { x: 0.0, y: 0.0, z: 2.0 },
141
+ ].map(({ x, y, z }) => {
142
+ return new FlammableOutputConfig({
143
+ position: new LocalPosition({ x, y, z })
144
+ });
145
+ });
146
+
147
+ // Run distances and ellipses to radiation levels for pool fires calculation
148
+ const radiationCalc = new DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation(
149
+ poolFireCalc.poolFireFlameResult!,
150
+ poolFireCalc.flameRecords!,
151
+ poolFireCalc.flameRecords!.length,
152
+ weather,
153
+ flammableParams,
154
+ flammableOutputConfigs,
155
+ flammableOutputConfigs.length
156
+ );
157
+ resultCode = await radiationCalc.run();
158
+
159
+ if (radiationCalc.messages.length > 0) {
160
+ console.log("Messages:");
161
+ radiationCalc.messages.forEach((message) => console.log(message));
162
+ }
163
+
164
+ expect(resultCode).toBe(ResultCode.SUCCESS);
165
+
166
+ // Assertions for regression results
167
+ expect(radiationCalc.contourPoints!.length).toBe(150);
168
+ expect(
169
+ Math.abs(
170
+ (radiationCalc.contourPoints![radiationCalc.contourPoints!.length - 1].x - 63.6457305261025) / 63.6457305261025
171
+ )
172
+ ).toBeLessThan(1e-3);
173
+ expect(
174
+ Math.abs((radiationCalc.poolFireFlameResult.flameDiameter! - 49.78919982910156) /49.78919982910156)).toBeLessThan(1e-3);
175
+ });
176
+ });
@@ -0,0 +1,182 @@
1
+ import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { DispersionCalculation } from "../../src/calculations/dispersion";
3
+ import { PoolFireCalculation } from "../../src/calculations/poolFire";
4
+ import { DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation, RadiationAtPointsForPoolFiresCalculation } from "../../src/calculations/radiation";
5
+ import { Bund, DischargeParameters, DispersionParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
6
+ import { AtmosphericStabilityClass, PoolFireType, ResultCode, TimeVaryingOption, VesselShape, WindProfileFlag } from "../../src/enums";
7
+ import { setAccessToken } from "../../src/utilities";
8
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
9
+
10
+ if (!accessToken) {
11
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
12
+ }
13
+
14
+ setAccessToken(accessToken);
15
+
16
+ describe("Vessel Leak Calculation Integration - Test Case 45a", () => {
17
+ test("should produce correct radiation results for pool fire", async () => {
18
+ // Set the case properties.
19
+ const materialName = 'TOLUENE';
20
+ const stateTemperature = 280.0;
21
+ const statePressure = 1.50e5;
22
+ const vesselShape = VesselShape.HORIZONTAL_CYLINDER;
23
+ const vesselLength = 5.0;
24
+ const vesselDiameter = 2.0;
25
+ const leakHoleDiameter = 0.05;
26
+ const timeVaryingOption = TimeVaryingOption.TIME_VARYING_RATE;
27
+ const leakHoleHeightFraction = 0.0;
28
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE
29
+
30
+ // Define the initial state of the vessel.
31
+ const state = new State({
32
+ temperature: stateTemperature,
33
+ pressure: statePressure,
34
+ liquidFraction: 0.0,
35
+ });
36
+
37
+ // Define the material contained by the vessel.
38
+ const material = new Material({
39
+ name: materialName,
40
+ components: [
41
+ new MaterialComponent({ name: materialName, moleFraction: 1.0 })
42
+ ],
43
+ componentCount: 1,
44
+ });
45
+
46
+ // Create a vessel state calculation using the material and state.
47
+ const vesselStateCalc = new VesselStateCalculation(material, state);
48
+ let resultCode = await vesselStateCalc.run();
49
+
50
+ // Print any messages.
51
+ if (vesselStateCalc.messages.length > 0) {
52
+ console.log("Messages:");
53
+ vesselStateCalc.messages.forEach((message) => console.log(message));
54
+ }
55
+
56
+ expect(resultCode).toBe(ResultCode.SUCCESS);
57
+
58
+ // Create a vessel to use in the leak calculation using the previously defined entities.
59
+ const vessel = new Vessel({
60
+ state: vesselStateCalc.outputState,
61
+ material: vesselStateCalc.material,
62
+ vesselConditions: vesselStateCalc.vesselConditions,
63
+ diameter: vesselDiameter,
64
+ length: vesselLength,
65
+ shape: vesselShape,
66
+ liquidFillFractionByVolume: 0.5,
67
+ });
68
+
69
+ // Create a leak to use in the vessel leak calculation.
70
+ const leak = new Leak({
71
+ holeDiameter: leakHoleDiameter,
72
+ holeHeightFraction: leakHoleHeightFraction,
73
+ timeVaryingOption: timeVaryingOption,
74
+ });
75
+
76
+ // Create discharge parameters to use in the vessel leak calculation taking all the default values.
77
+ const dischargeParams = new DischargeParameters();
78
+
79
+ // Create a vessel leak calculation using the vessel, leak, and discharge parameters.
80
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
81
+ resultCode = await vesselLeakCalc.run();
82
+
83
+ // Print any messages.
84
+ if (vesselLeakCalc.messages.length > 0) {
85
+ console.log("Messages:");
86
+ vesselLeakCalc.messages.forEach((message) => console.log(message));
87
+ }
88
+
89
+ expect(resultCode).toBe(ResultCode.SUCCESS);
90
+
91
+ // Define the weather.
92
+ const weather = new Weather({
93
+ windSpeed: 1.0,
94
+ stabilityClass: AtmosphericStabilityClass.STABILITY_C,
95
+ windProfileFlag: windProfileFlag,
96
+ });
97
+
98
+ // Define the substrate.
99
+ const substrate = new Substrate();
100
+
101
+ // Create a dispersion calculation based on the vessel leak calculation, weather, substrate, and dispersion parameters.
102
+ const dispersionCalc = new DispersionCalculation(
103
+ vesselLeakCalc.exitMaterial!,
104
+ substrate,
105
+ vesselLeakCalc.dischargeResult!,
106
+ vesselLeakCalc.dischargeRecords!,
107
+ vesselLeakCalc.dischargeRecords!.length,
108
+ weather,
109
+ new DispersionParameters(),
110
+ 0.0,
111
+ );
112
+
113
+ resultCode = await dispersionCalc.run();
114
+
115
+ // Print any messages.
116
+ if (dispersionCalc.messages.length > 0) {
117
+ console.log("Messages:");
118
+ dispersionCalc.messages.forEach((message) => console.log(message));
119
+ }
120
+
121
+ expect(resultCode).toBe(ResultCode.SUCCESS);
122
+
123
+ // Define flammable parameters.
124
+ const flammableParams = new FlammableParameters({
125
+ poolFireType: PoolFireType.LATE,
126
+ });
127
+
128
+ // Create a pool fire calculation based on the dispersion calculation, weather, substrate, and flammable parameters.
129
+ const poolFireCalc = new PoolFireCalculation(
130
+ vesselLeakCalc.exitMaterial!,
131
+ dispersionCalc.poolRecords!,
132
+ dispersionCalc.poolRecords!.length,
133
+ weather,
134
+ substrate,
135
+ flammableParams
136
+ );
137
+ resultCode = await poolFireCalc.run();
138
+
139
+ // Print any messages.
140
+ if (poolFireCalc.messages.length > 0) {
141
+ console.log("Messages:");
142
+ poolFireCalc.messages.forEach((message) => console.log(message));
143
+ }
144
+
145
+ expect(resultCode).toBe(ResultCode.SUCCESS);
146
+
147
+ // Define a flammable output config.
148
+ const flammableOutputConfigs = [
149
+ { x: 0.0, y: 0.0, z: 0.0 },
150
+ { x: 0.0, y: 0.0, z: 1.0 },
151
+ { x: 0.0, y: 0.0, z: 2.0 },
152
+ ].map(({ x, y, z }) => {
153
+ return new FlammableOutputConfig({
154
+ position: new LocalPosition({ x, y, z })
155
+ });
156
+ });
157
+
158
+ // Create a radiation points calculation based on the pool fire calculation, weather, substrate, and flammable output config.
159
+ const radiationCalc = new RadiationAtPointsForPoolFiresCalculation(
160
+ poolFireCalc.poolFireFlameResult!,
161
+ poolFireCalc.flameRecords!,
162
+ poolFireCalc.flameRecords!.length,
163
+ weather,
164
+ flammableParams,
165
+ flammableOutputConfigs,
166
+ flammableOutputConfigs.length
167
+ );
168
+ resultCode = await radiationCalc.run();
169
+
170
+ // Print any messages.
171
+ if (radiationCalc.messages.length > 0) {
172
+ console.log("Messages:");
173
+ radiationCalc.messages.forEach((message) => console.log(message));
174
+ }
175
+
176
+ expect(resultCode).toBe(ResultCode.SUCCESS);
177
+
178
+ // Assertions for regression results
179
+ expect(Math.abs((radiationCalc.radiation![0] - 139644.9375) / 139644.9375)).toBeLessThan(1e-3);
180
+ expect(Math.abs((radiationCalc.poolFireFlameResult.flameDiameter! - 49.78919982910156) / 49.78919982910156)).toBeLessThan(1e-3);
181
+ });
182
+ });
@@ -0,0 +1,167 @@
1
+ import { VesselStateCalculation, VesselLeakCalculation } from "../../src/calculations/discharge";
2
+ import { JetFireCalculation } from "../../src/calculations/jetFire";
3
+ import { RadiationAtPointsCalculation } from "../../src/calculations/radiation";
4
+ import { State, Material, MaterialComponent, Vessel, Leak, DischargeParameters, Weather, Substrate, FlammableParameters, FlammableOutputConfig, Transect, LocalPosition } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, ResultCode, Resolution, 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("RadiationAtPointsCalculation Integration - Test Case 69", () => {
16
+ test("should produce correct radiation results for METHANE", async () => {
17
+ const materialName = "METHANE";
18
+ const stateTemperature = 280.0;
19
+ const statePressure = 1.0e6;
20
+ const vesselShape = VesselShape.VESSEL_SPHERE;
21
+ const vesselDiameter = 3.0;
22
+ const leakHoleDiameter = 0.1;
23
+ const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
24
+ const leakHoleHeightFraction = 0.5;
25
+ const liquidFillFraction = 0.0;
26
+ const windSpeed = 2.0;
27
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
28
+ const timeOfInterest = 3600.0;
29
+ const radiationResolution = Resolution.MEDIUM;
30
+ const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
31
+
32
+ // Define the initial state of the vessel
33
+ const state = new State({
34
+ temperature: stateTemperature,
35
+ pressure: statePressure,
36
+ liquidFraction: 0.0,
37
+ });
38
+
39
+ // Define the material contained by the vessel
40
+ const material = new Material({
41
+ name: materialName,
42
+ components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
43
+ });
44
+
45
+ // Create a vessel state calculation using the material and state
46
+ const vesselStateCalc = new VesselStateCalculation(material, state);
47
+ let resultCode = await vesselStateCalc.run();
48
+
49
+ // Check if there are any messages
50
+ if (vesselStateCalc.messages.length > 0) {
51
+ vesselStateCalc.messages.forEach((message) => console.log(message));
52
+ }
53
+
54
+ // Validate the result of the vessel state calculation
55
+ expect(resultCode).toBe(ResultCode.SUCCESS);
56
+
57
+ // Create a vessel to use in the leak calculation using the previously defined entities
58
+ const vessel = new Vessel({
59
+ state: vesselStateCalc.outputState,
60
+ material: vesselStateCalc.material,
61
+ vesselConditions: vesselStateCalc.vesselConditions,
62
+ location: new LocalPosition(),
63
+ diameter: vesselDiameter,
64
+ shape: vesselShape,
65
+ liquidFillFractionByVolume: liquidFillFraction,
66
+ });
67
+
68
+ // Create a leak to use in the vessel leak calculation
69
+ const leak = new Leak({
70
+ holeDiameter: leakHoleDiameter,
71
+ holeHeightFraction: leakHoleHeightFraction,
72
+ timeVaryingOption: timeVaryingOption,
73
+ });
74
+
75
+ // Create discharge parameters for the vessel leak calculation
76
+ const dischargeParams = new DischargeParameters();
77
+
78
+ // Create a vessel leak calculation using the vessel, leak, and discharge parameters
79
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
80
+ resultCode = await vesselLeakCalc.run();
81
+
82
+ // Check if there are any messages
83
+ if (vesselLeakCalc.messages.length > 0) {
84
+ vesselLeakCalc.messages.forEach((message) => console.log(message));
85
+ }
86
+
87
+ // Validate the result of the vessel leak calculation
88
+ expect(resultCode).toBe(ResultCode.SUCCESS);
89
+
90
+ // Instantiate the data required by the jet fire calculation
91
+ const weather = new Weather({
92
+ windSpeed: windSpeed,
93
+ stabilityClass: stabilityClass,
94
+ windProfileFlag: windProfileFlag,
95
+ });
96
+
97
+ const substrate = new Substrate();
98
+ const flammableParams = new FlammableParameters({ timeOfInterest });
99
+
100
+ // Create a jet fire calculation using the required input data
101
+ const jetFireCalc = new JetFireCalculation(
102
+ vesselLeakCalc.exitMaterial!,
103
+ vesselLeakCalc.dischargeRecords!,
104
+ vesselLeakCalc.dischargeRecords!.length,
105
+ vesselLeakCalc.dischargeResult!,
106
+ weather,
107
+ substrate,
108
+ flammableParams
109
+ );
110
+ resultCode = await jetFireCalc.run();
111
+
112
+ // Check if there are any messages
113
+ if (jetFireCalc.messages.length > 0) {
114
+ jetFireCalc.messages.forEach((message) => console.log(message));
115
+ }
116
+
117
+ // Validate the result of the jet fire calculation
118
+ expect(resultCode).toBe(ResultCode.SUCCESS);
119
+
120
+ // Create flammable output configurations
121
+ const flammableOutputConfigs = [
122
+ { x: 10.0, y: 0.0, z: 0.0 },
123
+ { x: 15.0, y: 0.0, z: 1.0 },
124
+ { x: 20.0, y: 0.0, z: 2.0 },
125
+ ].map(({ x, y, z }) => {
126
+ return new FlammableOutputConfig({
127
+ position: new LocalPosition({ x, y, z }),
128
+ transect: new Transect({
129
+ transectStartPoint: new LocalPosition(),
130
+ transectEndPoint: new LocalPosition(),
131
+ }),
132
+ radiationResolution: radiationResolution,
133
+ });
134
+ });
135
+
136
+ // Create a radiation at points calculation using the flame result, flame records, weather, flammable parameters, and flammable output configurations
137
+ const radiationAtPointsCalc = new RadiationAtPointsCalculation(
138
+ jetFireCalc.flameResult!,
139
+ jetFireCalc.flameRecords!,
140
+ jetFireCalc.flameRecords!.length,
141
+ weather,
142
+ jetFireCalc.flammableParameters,
143
+ flammableOutputConfigs,
144
+ flammableOutputConfigs.length
145
+ );
146
+
147
+ // Run the radiation at points calculation
148
+ resultCode = await radiationAtPointsCalc.run();
149
+
150
+ // Check if there are any messages
151
+ if (radiationAtPointsCalc.messages.length > 0) {
152
+ radiationAtPointsCalc.messages.forEach((message) => console.log(message));
153
+ }
154
+
155
+ // Validate the result of the radiation at points calculation
156
+ expect(resultCode).toBe(ResultCode.SUCCESS);
157
+
158
+ const radiationResult = radiationAtPointsCalc.radiation![0];
159
+ const expectedRadiation = 24404.931814667765;
160
+ const radiationTolerance = 1e-3;
161
+ expect(Math.abs((radiationResult - expectedRadiation) / expectedRadiation)).toBeLessThan(radiationTolerance);
162
+
163
+ const flameLength = radiationAtPointsCalc.flameResult.flameLength!;
164
+ const expectedFlameLength = 33.750426875730376;
165
+ expect(Math.abs((flameLength - expectedFlameLength) / expectedFlameLength)).toBeLessThan(radiationTolerance);
166
+ });
167
+ });