@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,194 @@
1
+ import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { JetFireCalculation } from "../../src/calculations/jetFire";
3
+ import { DistancesAndEllipsesToRadiationLevelsCalculation} from "../../src/calculations/radiation";
4
+ import { Bund, DischargeParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, Resolution, ResultCode, TimeVaryingOption, VesselShape } 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 64 - Distances and Ellipses to Radiation Levels Scenario", () => {
16
+ test("should run vessel state, leak, jet fire, and distances/ellipses calculations with regression checks", async () => {
17
+ // Define case properties
18
+ const materialName = "METHANE";
19
+ const stateTemperature = 280.0;
20
+ const statePressure = 1.0e6;
21
+ const vesselShape = VesselShape.VESSEL_SPHERE;
22
+ const vesselDiameter = 3.0;
23
+ const leakHoleDiameter = 0.1;
24
+ const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
25
+ const leakHoleHeightFraction = 0.5;
26
+ const liquidFillFractionByVolume = 0.0;
27
+ const windSpeed = 2.0;
28
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
29
+ const timeOfInterest = 3600.0;
30
+ const radiationResolution = Resolution.MEDIUM;
31
+
32
+ // Define material and state
33
+ const material = new Material({
34
+ name: materialName,
35
+ components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
36
+ componentCount: 1,
37
+ });
38
+
39
+ const state = new State({
40
+ temperature: stateTemperature,
41
+ pressure: statePressure,
42
+ liquidFraction: 0.0,
43
+ });
44
+
45
+ // Vessel state calculation
46
+ const vesselStateCalc = new VesselStateCalculation(material, state);
47
+
48
+ console.log("Running vessel_state_calculation...");
49
+ const vesselStateResult = await vesselStateCalc.run();
50
+
51
+ if (vesselStateCalc.messages.length > 0) {
52
+ console.log("Messages:");
53
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
54
+ }
55
+
56
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
57
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
58
+
59
+ // Define vessel
60
+ const vessel = new Vessel({
61
+ state: vesselStateCalc.outputState!,
62
+ material: vesselStateCalc.material,
63
+ vesselConditions: vesselStateCalc.vesselConditions,
64
+ location: new LocalPosition({ x: 0, y: 0, z: 0 }),
65
+ diameter: vesselDiameter,
66
+ shape: vesselShape,
67
+ liquidFillFractionByVolume: liquidFillFractionByVolume,
68
+ });
69
+
70
+ // Define leak
71
+ const leak = new Leak({
72
+ holeDiameter: leakHoleDiameter,
73
+ holeHeightFraction: leakHoleHeightFraction,
74
+ timeVaryingOption: timeVaryingOption,
75
+ });
76
+
77
+ // Vessel leak calculation
78
+ const dischargeParams = new DischargeParameters();
79
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
80
+
81
+ console.log("Running vessel_leak_calculation...");
82
+ const leakResult = await vesselLeakCalc.run();
83
+
84
+ if (vesselLeakCalc.messages.length > 0) {
85
+ console.log("Messages:");
86
+ vesselLeakCalc.messages.forEach((msg) => console.log(msg));
87
+ }
88
+
89
+ expect(leakResult).toBe(ResultCode.SUCCESS);
90
+ console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
91
+
92
+ // Set up entities for jet fire calculation
93
+ const weather = new Weather({
94
+ windSpeed: windSpeed,
95
+ stabilityClass: stabilityClass,
96
+ });
97
+
98
+ const substrate = new Substrate({
99
+ bund: new Bund({ specifyBund: false }),
100
+ });
101
+
102
+ const flammableParams = new FlammableParameters({
103
+ timeOfInterest: timeOfInterest,
104
+ });
105
+
106
+ // Jet fire calculation
107
+ const jetFireCalc = new JetFireCalculation(
108
+ vesselLeakCalc.exitMaterial!,
109
+ vesselLeakCalc.dischargeRecords!,
110
+ vesselLeakCalc.dischargeRecords!.length,
111
+ vesselLeakCalc.dischargeResult!,
112
+ weather,
113
+ substrate,
114
+ flammableParams
115
+ );
116
+
117
+ console.log("Running jet_fire_calculation...");
118
+ const jetFireResult = await jetFireCalc.run();
119
+
120
+ if (jetFireCalc.messages.length > 0) {
121
+ console.log("Messages:");
122
+ jetFireCalc.messages.forEach((msg) => console.log(msg));
123
+ }
124
+
125
+ expect(jetFireResult).toBe(ResultCode.SUCCESS);
126
+ console.log(`SUCCESS: jet_fire_calculation (${jetFireCalc.calculationElapsedTime}ms)`);
127
+
128
+ // Flammable output configurations
129
+ const flammableOutputConfigs = [
130
+ new FlammableOutputConfig({
131
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
132
+ transect: new Transect({
133
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
134
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
135
+ }),
136
+ radiationResolution: radiationResolution,
137
+ }),
138
+ new FlammableOutputConfig({
139
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 1.0 }),
140
+ transect: new Transect({
141
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
142
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
143
+ }),
144
+ radiationResolution: radiationResolution,
145
+ }),
146
+ new FlammableOutputConfig({
147
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 2.0 }),
148
+ transect: new Transect({
149
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
150
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
151
+ }),
152
+ radiationResolution: radiationResolution,
153
+ }),
154
+ ];
155
+
156
+ // Distances and ellipses to radiation levels calculation
157
+ const distancesEllipsesCalc = new DistancesAndEllipsesToRadiationLevelsCalculation(
158
+ jetFireCalc.flameResult!,
159
+ jetFireCalc.flameRecords!,
160
+ jetFireCalc.flameRecords!.length,
161
+ weather,
162
+ jetFireCalc.flammableParameters!,
163
+ flammableOutputConfigs,
164
+ flammableOutputConfigs.length
165
+ );
166
+
167
+ console.log("Running distances_and_ellipses_to_radiation_levels_calculation...");
168
+ const distancesEllipsesResult = await distancesEllipsesCalc.run();
169
+
170
+ if (distancesEllipsesCalc.messages.length > 0) {
171
+ console.log("Messages:");
172
+ distancesEllipsesCalc.messages.forEach((msg) => console.log(msg));
173
+ }
174
+
175
+ expect(distancesEllipsesResult).toBe(ResultCode.SUCCESS);
176
+
177
+ // Regression checks
178
+ expect(distancesEllipsesCalc.contourPoints!.length).toBe(150);
179
+
180
+ if (distancesEllipsesCalc.contourPoints!.length > 0) {
181
+ const contourPointError = Math.abs(
182
+ (distancesEllipsesCalc.contourPoints![distancesEllipsesCalc.contourPoints!.length - 1].x - 58.40830479872616) / 58.40830479872616
183
+ );
184
+ expect(contourPointError).toBeLessThan(1e-3);
185
+ }
186
+
187
+ const areaError = Math.abs(
188
+ (distancesEllipsesCalc.areas![0] - 3563.332415345197) / 3563.332415345197
189
+ );
190
+ expect(areaError).toBeLessThan(1e-3);
191
+
192
+ console.log(`SUCCESS: distances_and_ellipses_to_radiation_levels_calculation (${distancesEllipsesCalc.calculationElapsedTime}ms)`);
193
+ });
194
+ });
@@ -0,0 +1,197 @@
1
+ import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { JetFireCalculation } from "../../src/calculations/jetFire";
3
+ import { DistancesAndEllipsesToRadiationLevelsCalculation } from "../../src/calculations/radiation";
4
+ import { Bund, DischargeParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, Resolution, ResultCode, TimeVaryingOption, VesselShape } 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 65 - Distances and Ellipses to Radiation Levels Scenario", () => {
16
+ test("should run vessel state, leak, jet fire, and distances/ellipses calculations with regression checks", async () => {
17
+ // Define case properties
18
+ const materialName = "N-BUTANE";
19
+ const stateTemperature = 220.0;
20
+ const statePressure = 1.0e6;
21
+ const vesselShape = VesselShape.VESSEL_SPHERE;
22
+ const vesselDiameter = 3.0;
23
+ const leakHoleDiameter = 0.1;
24
+ const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
25
+ const leakHoleHeightFraction = 0.5;
26
+ const liquidFillFractionByVolume = 0.5;
27
+ const windSpeed = 2.0;
28
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
29
+ const timeOfInterest = 2600.0;
30
+ const radiationResolution = Resolution.HIGH;
31
+
32
+ // Define material and state
33
+ const material = new Material({
34
+ name: materialName,
35
+ components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
36
+ componentCount: 1,
37
+ });
38
+
39
+ const state = new State({
40
+ temperature: stateTemperature,
41
+ pressure: statePressure,
42
+ liquidFraction: 0.0,
43
+ });
44
+
45
+ // Vessel state calculation
46
+ const vesselStateCalc = new VesselStateCalculation(material, state);
47
+
48
+ console.log("Running vessel_state_calculation...");
49
+ const vesselStateResult = await vesselStateCalc.run();
50
+
51
+ if (vesselStateCalc.messages.length > 0) {
52
+ console.log("Messages:");
53
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
54
+ }
55
+
56
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
57
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
58
+
59
+ // Define vessel
60
+ const vessel = new Vessel({
61
+ state: vesselStateCalc.outputState!,
62
+ material: vesselStateCalc.material,
63
+ vesselConditions: vesselStateCalc.vesselConditions,
64
+ location: new LocalPosition({ x: 0, y: 0, z: 0 }),
65
+ diameter: vesselDiameter,
66
+ shape: vesselShape,
67
+ liquidFillFractionByVolume: liquidFillFractionByVolume,
68
+ });
69
+
70
+ // Define leak
71
+ const leak = new Leak({
72
+ holeDiameter: leakHoleDiameter,
73
+ holeHeightFraction: leakHoleHeightFraction,
74
+ timeVaryingOption: timeVaryingOption,
75
+ });
76
+
77
+ // Vessel leak calculation
78
+ const dischargeParams = new DischargeParameters();
79
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
80
+
81
+ console.log("Running vessel_leak_calculation...");
82
+ const leakResult = await vesselLeakCalc.run();
83
+
84
+ if (vesselLeakCalc.messages.length > 0) {
85
+ console.log("Messages:");
86
+ vesselLeakCalc.messages.forEach((msg) => console.log(msg));
87
+ }
88
+
89
+ expect(leakResult).toBe(ResultCode.SUCCESS);
90
+ console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
91
+
92
+ // Set up entities for jet fire calculation
93
+ const weather = new Weather({
94
+ windSpeed: windSpeed,
95
+ stabilityClass: stabilityClass,
96
+ });
97
+
98
+ const substrate = new Substrate({
99
+ bund: new Bund({ specifyBund: false }),
100
+ });
101
+
102
+ const flammableParams = new FlammableParameters({
103
+ timeOfInterest: timeOfInterest,
104
+ });
105
+
106
+ // Jet fire calculation
107
+ const jetFireCalc = new JetFireCalculation(
108
+ vesselLeakCalc.exitMaterial!,
109
+ vesselLeakCalc.dischargeRecords!,
110
+ vesselLeakCalc.dischargeRecords!.length,
111
+ vesselLeakCalc.dischargeResult!,
112
+ weather,
113
+ substrate,
114
+ flammableParams
115
+ );
116
+
117
+ console.log("Running jet_fire_calculation...");
118
+ const jetFireResult = await jetFireCalc.run();
119
+
120
+ if (jetFireCalc.messages.length > 0) {
121
+ console.log("Messages:");
122
+ jetFireCalc.messages.forEach((msg) => console.log(msg));
123
+ }
124
+
125
+ expect(jetFireResult).toBe(ResultCode.SUCCESS);
126
+ console.log(`SUCCESS: jet_fire_calculation (${jetFireCalc.calculationElapsedTime}ms)`);
127
+
128
+ // Flammable output configurations
129
+ const flammableOutputConfigs = [
130
+ new FlammableOutputConfig({
131
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 2.0 }),
132
+ transect: new Transect({
133
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
134
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
135
+ }),
136
+ radiationResolution: radiationResolution,
137
+ }),
138
+ new FlammableOutputConfig({
139
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 4.0 }),
140
+ transect: new Transect({
141
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
142
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
143
+ }),
144
+ radiationResolution: radiationResolution,
145
+ }),
146
+ new FlammableOutputConfig({
147
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 5.0 }),
148
+ transect: new Transect({
149
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
150
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
151
+ }),
152
+ radiationResolution: radiationResolution,
153
+ }),
154
+ ];
155
+
156
+ // Distances and ellipses to radiation levels calculation
157
+ const distancesEllipsesCalc = new DistancesAndEllipsesToRadiationLevelsCalculation(
158
+ jetFireCalc.flameResult!,
159
+ jetFireCalc.flameRecords!,
160
+ jetFireCalc.flameRecords!.length,
161
+ weather,
162
+ jetFireCalc.flammableParameters!,
163
+ flammableOutputConfigs,
164
+ flammableOutputConfigs.length
165
+ );
166
+
167
+ console.log("Running distances_and_ellipses_to_radiation_levels_calculation...");
168
+ const distancesEllipsesResult = await distancesEllipsesCalc.run();
169
+
170
+ if (distancesEllipsesCalc.messages.length > 0) {
171
+ console.log("Messages:");
172
+ distancesEllipsesCalc.messages.forEach((msg) => console.log(msg));
173
+ }
174
+
175
+ expect(distancesEllipsesResult).toBe(ResultCode.SUCCESS);
176
+
177
+ // Regression checks
178
+ expect(distancesEllipsesCalc.contourPoints!.length).toBe(150);
179
+
180
+ if (distancesEllipsesCalc.contourPoints!.length > 0) {
181
+ const contourPointError = Math.abs(
182
+ (distancesEllipsesCalc.contourPoints![distancesEllipsesCalc.contourPoints!.length - 1].x - 302.89074103021574) /
183
+ 302.89074103021574
184
+ );
185
+ expect(contourPointError).toBeLessThan(1e-3);
186
+ }
187
+
188
+ const areaError = Math.abs(
189
+ (distancesEllipsesCalc.areas![0] - 118325.3837897791) / 118325.3837897791
190
+ );
191
+ expect(areaError).toBeLessThan(1e-3);
192
+
193
+ console.log(
194
+ `SUCCESS: distances_and_ellipses_to_radiation_levels_calculation (${distancesEllipsesCalc.calculationElapsedTime}ms)`
195
+ );
196
+ });
197
+ });
@@ -0,0 +1,194 @@
1
+ import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
2
+ import { JetFireCalculation } from "../../src/calculations/jetFire";
3
+ import { DistancesAndEllipsesToRadiationLevelsCalculation } from "../../src/calculations/radiation";
4
+ import { Bund, DischargeParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
5
+ import { AtmosphericStabilityClass, Resolution, ResultCode, TimeVaryingOption, VesselShape } 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 66 - Distances and Ellipses to Radiation Levels Scenario", () => {
16
+ test("should run vessel state, leak, jet fire, and distances/ellipses calculations with regression checks", async () => {
17
+ // Define case properties
18
+ const materialName = "PROPANE";
19
+ const stateTemperature = 290.0;
20
+ const statePressure = 5.0e5;
21
+ const vesselShape = VesselShape.VESSEL_SPHERE;
22
+ const vesselDiameter = 3.0;
23
+ const leakHoleDiameter = 0.1;
24
+ const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
25
+ const leakHoleHeightFraction = 0.3;
26
+ const liquidFillFractionByVolume = 0.4;
27
+ const windSpeed = 2.0;
28
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
29
+ const timeOfInterest = 2600.0;
30
+ const radiationResolution = Resolution.LOW;
31
+
32
+ // Define material and state
33
+ const material = new Material({
34
+ name: materialName,
35
+ components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
36
+ componentCount: 1,
37
+ });
38
+
39
+ const state = new State({
40
+ temperature: stateTemperature,
41
+ pressure: statePressure,
42
+ liquidFraction: 0.0,
43
+ });
44
+
45
+ // Vessel state calculation
46
+ const vesselStateCalc = new VesselStateCalculation(material, state);
47
+
48
+ console.log("Running vessel_state_calculation...");
49
+ const vesselStateResult = await vesselStateCalc.run();
50
+
51
+ if (vesselStateCalc.messages.length > 0) {
52
+ console.log("Messages:");
53
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
54
+ }
55
+
56
+ expect(vesselStateResult).toBe(ResultCode.SUCCESS);
57
+ console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
58
+
59
+ // Define vessel
60
+ const vessel = new Vessel({
61
+ state: vesselStateCalc.outputState!,
62
+ material: vesselStateCalc.material,
63
+ vesselConditions: vesselStateCalc.vesselConditions,
64
+ location: new LocalPosition({ x: 0, y: 0, z: 0 }),
65
+ diameter: vesselDiameter,
66
+ shape: vesselShape,
67
+ liquidFillFractionByVolume: liquidFillFractionByVolume,
68
+ });
69
+
70
+ // Define leak
71
+ const leak = new Leak({
72
+ holeDiameter: leakHoleDiameter,
73
+ holeHeightFraction: leakHoleHeightFraction,
74
+ timeVaryingOption: timeVaryingOption,
75
+ });
76
+
77
+ // Vessel leak calculation
78
+ const dischargeParams = new DischargeParameters();
79
+ const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
80
+
81
+ console.log("Running vessel_leak_calculation...");
82
+ const leakResult = await vesselLeakCalc.run();
83
+
84
+ if (vesselLeakCalc.messages.length > 0) {
85
+ console.log("Messages:");
86
+ vesselLeakCalc.messages.forEach((msg) => console.log(msg));
87
+ }
88
+
89
+ expect(leakResult).toBe(ResultCode.SUCCESS);
90
+ console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
91
+
92
+ // Set up entities for jet fire calculation
93
+ const weather = new Weather({
94
+ windSpeed: windSpeed,
95
+ stabilityClass: stabilityClass,
96
+ });
97
+
98
+ const substrate = new Substrate({
99
+ bund: new Bund({ specifyBund: false }),
100
+ });
101
+
102
+ const flammableParams = new FlammableParameters({
103
+ timeOfInterest: timeOfInterest,
104
+ });
105
+
106
+ // Jet fire calculation
107
+ const jetFireCalc = new JetFireCalculation(
108
+ vesselLeakCalc.exitMaterial!,
109
+ vesselLeakCalc.dischargeRecords!,
110
+ vesselLeakCalc.dischargeRecords!.length,
111
+ vesselLeakCalc.dischargeResult!,
112
+ weather,
113
+ substrate,
114
+ flammableParams
115
+ );
116
+
117
+ console.log("Running jet_fire_calculation...");
118
+ const jetFireResult = await jetFireCalc.run();
119
+
120
+ if (jetFireCalc.messages.length > 0) {
121
+ console.log("Messages:");
122
+ jetFireCalc.messages.forEach((msg) => console.log(msg));
123
+ }
124
+
125
+ expect(jetFireResult).toBe(ResultCode.SUCCESS);
126
+ console.log(`SUCCESS: jet_fire_calculation (${jetFireCalc.calculationElapsedTime}ms)`);
127
+
128
+ // Flammable output configurations
129
+ const flammableOutputConfigs = [
130
+ new FlammableOutputConfig({
131
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 2.0 }),
132
+ transect: new Transect({
133
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
134
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
135
+ }),
136
+ radiationResolution: radiationResolution,
137
+ }),
138
+ new FlammableOutputConfig({
139
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 3.0 }),
140
+ transect: new Transect({
141
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
142
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
143
+ }),
144
+ radiationResolution: radiationResolution,
145
+ }),
146
+ new FlammableOutputConfig({
147
+ position: new LocalPosition({ x: 0.0, y: 0.0, z: 6.0 }),
148
+ transect: new Transect({
149
+ transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
150
+ transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
151
+ }),
152
+ radiationResolution: radiationResolution,
153
+ }),
154
+ ];
155
+
156
+ // Distances and ellipses to radiation levels calculation
157
+ const distancesEllipsesCalc = new DistancesAndEllipsesToRadiationLevelsCalculation(
158
+ jetFireCalc.flameResult!,
159
+ jetFireCalc.flameRecords!,
160
+ jetFireCalc.flameRecords!.length,
161
+ weather,
162
+ jetFireCalc.flammableParameters!,
163
+ flammableOutputConfigs,
164
+ flammableOutputConfigs.length
165
+ );
166
+
167
+ console.log("Running distances_and_ellipses_to_radiation_levels_calculation...");
168
+ const distancesEllipsesResult = await distancesEllipsesCalc.run();
169
+
170
+ if (distancesEllipsesCalc.messages.length > 0) {
171
+ console.log("Messages:");
172
+ distancesEllipsesCalc.messages.forEach((msg) => console.log(msg));
173
+ }
174
+
175
+ expect(distancesEllipsesResult).toBe(ResultCode.SUCCESS);
176
+
177
+ // Regression checks
178
+ expect(distancesEllipsesCalc.contourPoints!.length).toBe(150);
179
+
180
+ if (distancesEllipsesCalc.contourPoints!.length > 0) {
181
+ const contourPointError = Math.abs(
182
+ (distancesEllipsesCalc.contourPoints![distancesEllipsesCalc.contourPoints!.length - 1].x - 54.11820446994824) / 54.11820446994824
183
+ );
184
+ expect(contourPointError).toBeLessThan(1e-3);
185
+ }
186
+
187
+ const areaError = Math.abs(
188
+ (distancesEllipsesCalc.areas![0] - 3641.2004589975213) / 3641.2004589975213
189
+ );
190
+ expect(areaError).toBeLessThan(1e-3);
191
+
192
+ console.log(`SUCCESS: distances_and_ellipses_to_radiation_levels_calculation (${distancesEllipsesCalc.calculationElapsedTime}ms)`);
193
+ });
194
+ });