@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,148 @@
1
+ import { Material, MaterialComponent, State, Leak, Vessel, FlammableParameters, Weather, Substrate, DischargeParameters } from "../../src/entities";
2
+ import { VesselStateCalculation, VesselLeakCalculation } from "../../src/calculations/discharge";
3
+ import { JetFireCalculation } from "../../src/calculations/jetFire";
4
+ import { ResultCode, AtmosphericStabilityClass, VesselShape, TimeVaryingOption } from "../../src/enums";
5
+ import { setAccessToken } from "../../src/utilities";
6
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
7
+
8
+ if (!accessToken) {
9
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
10
+ }
11
+
12
+ setAccessToken(accessToken);
13
+
14
+ describe("Integrated Jet Fire Scenario - Test Case 37", () => {
15
+ test("should run the full jet fire scenario and perform regression check", async () => {
16
+ // Set the case properties
17
+ const materialName = "N-BUTANE";
18
+ const stateTemperature = 300.0;
19
+ const statePressure = 3.0e5;
20
+ const vesselShape = VesselShape.VESSEL_CUBOID;
21
+ const vesselHeight = 2.0;
22
+ const vesselWidth = 1.0;
23
+ const vesselLength = 3.0;
24
+ const leakHoleDiameter = 0.05;
25
+ const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
26
+ const leakHoleHeightFraction = 0.2;
27
+ const windSpeed = 2.0;
28
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
29
+ const surfaceRoughness = 0.18;
30
+ const timeOfInterest = 20.0;
31
+ const liquidFillFractionByVolume = 0.5;
32
+
33
+ // Define the initial state of the vessel
34
+ const state = new State({
35
+ temperature: stateTemperature,
36
+ pressure: statePressure,
37
+ liquidFraction: 0.0
38
+ });
39
+
40
+ // Define the material contained by the vessel
41
+ const material = new Material({
42
+ name: materialName,
43
+ components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })]
44
+ });
45
+
46
+ // Create and run vessel state calculation
47
+ const vesselStateCalc = new VesselStateCalculation(material, state);
48
+
49
+ console.log("Running vesselStateCalculation...");
50
+ let resultCode = await vesselStateCalc.run();
51
+
52
+ if (vesselStateCalc.messages.length > 0) {
53
+ console.log("Messages:");
54
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
55
+ }
56
+
57
+ expect(resultCode).toBe(ResultCode.SUCCESS);
58
+ console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
59
+
60
+ // Create vessel
61
+ const vessel = new Vessel({
62
+ state: vesselStateCalc.outputState,
63
+ material: vesselStateCalc.material,
64
+ vesselConditions: vesselStateCalc.vesselConditions,
65
+ length: vesselLength,
66
+ width: vesselWidth,
67
+ height: vesselHeight,
68
+ shape: vesselShape,
69
+ liquidFillFractionByVolume: liquidFillFractionByVolume
70
+ });
71
+
72
+ // Create leak
73
+ const leak = new Leak({
74
+ holeDiameter: leakHoleDiameter,
75
+ holeHeightFraction: leakHoleHeightFraction,
76
+ timeVaryingOption: timeVaryingOption
77
+ });
78
+
79
+ // Create and run vessel leak calculation
80
+ const vesselLeakCalc = new VesselLeakCalculation(
81
+ vessel,
82
+ leak,
83
+ new DischargeParameters()
84
+ );
85
+
86
+ console.log("Running vesselLeakCalculation...");
87
+ resultCode = await vesselLeakCalc.run();
88
+
89
+ if (vesselLeakCalc.messages.length > 0) {
90
+ console.log("Messages:");
91
+ vesselLeakCalc.messages.forEach((msg) => console.log(msg));
92
+ }
93
+
94
+ expect(resultCode).toBe(ResultCode.SUCCESS);
95
+ console.log(`SUCCESS: vesselLeakCalculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
96
+
97
+ // Define weather and substrate
98
+ const weather = new Weather({
99
+ windSpeed: windSpeed,
100
+ stabilityClass: stabilityClass
101
+ });
102
+
103
+ const substrate = new Substrate({
104
+ surfaceRoughness: surfaceRoughness
105
+ });
106
+
107
+ // Create and run jet fire calculation
108
+ const flammableParams = new FlammableParameters({
109
+ timeOfInterest: timeOfInterest,
110
+ jetFireAutoSelect: false,
111
+ timeAveraging: true
112
+ });
113
+
114
+ const jetFireCalc = new JetFireCalculation(
115
+ vesselLeakCalc.exitMaterial!,
116
+ vesselLeakCalc.dischargeRecords!,
117
+ vesselLeakCalc.dischargeRecords!.length,
118
+ vesselLeakCalc.dischargeResult!,
119
+ weather,
120
+ substrate,
121
+ flammableParams
122
+ );
123
+
124
+ console.log("Running jetFireCalculation...");
125
+ resultCode = await jetFireCalc.run();
126
+
127
+ if (jetFireCalc.messages.length > 0) {
128
+ console.log("Messages:");
129
+ jetFireCalc.messages.forEach((msg) => console.log(msg));
130
+ }
131
+
132
+ expect(resultCode).toBe(ResultCode.SUCCESS);
133
+
134
+ // Regression checks
135
+ const flameLengthError = Math.abs(
136
+ (jetFireCalc.flameResult!.flameLength! - 52.735663839470966) / 52.735663839470966
137
+ );
138
+ const surfaceEmissivePowerError = Math.abs(
139
+ (jetFireCalc.flameResult!.surfaceEmissivePower! - 199020.3679914611) / 199020.3679914611
140
+ );
141
+
142
+ expect(flameLengthError).toBeLessThan(1e-3);
143
+ expect(surfaceEmissivePowerError).toBeLessThan(1e-3);
144
+ expect(jetFireCalc.flameRecords!.length).toBe(2);
145
+
146
+ console.log(`SUCCESS: jetFireCalculation (${jetFireCalc.calculationElapsedTime}ms)`);
147
+ });
148
+ });
@@ -0,0 +1,147 @@
1
+ import { Material, MaterialComponent, State, Vessel, LineRupture, FlammableParameters, Weather, Substrate, DischargeParameters } from "../../src/entities";
2
+ import { VesselStateCalculation, VesselLineRuptureCalculation } from "../../src/calculations/discharge";
3
+ import { JetFireCalculation } from "../../src/calculations/jetFire";
4
+ import { ResultCode, AtmosphericStabilityClass, VesselShape } from "../../src/enums";
5
+ import { setAccessToken } from "../../src/utilities";
6
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
7
+
8
+ if (!accessToken) {
9
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
10
+ }
11
+
12
+ setAccessToken(accessToken);
13
+
14
+ describe("Integrated Jet Fire Scenario - Test Case 38", () => {
15
+ test("should run the full jet fire scenario with line rupture and perform regression check", async () => {
16
+ // Set the case properties
17
+ const materialName = "PROPANE";
18
+ const stateTemperature = 250.0;
19
+ const statePressure = 3.0e5;
20
+ const vesselShape = VesselShape.HORIZONTAL_CYLINDER;
21
+ const vesselDiameter = 2.0;
22
+ const liquidFillFractionByVolume = 0.7;
23
+ const pipeDiameter = 0.1;
24
+ const pipeLength = 5.0;
25
+ const pipeHeightFraction = 0.3;
26
+ const windSpeed = 2.0;
27
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
28
+ const surfaceRoughness = 0.18;
29
+ const timeOfInterest = 120.0;
30
+ const jetFireAutoSelect = false;
31
+ const timeAveraging = false;
32
+
33
+ // Define the initial state of the vessel
34
+ const state = new State({
35
+ temperature: stateTemperature,
36
+ pressure: statePressure,
37
+ liquidFraction: 0.0
38
+ });
39
+
40
+ // Define the material contained by the vessel
41
+ const material = new Material({
42
+ name: materialName,
43
+ components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })]
44
+ });
45
+
46
+ // Create and run vessel state calculation
47
+ const vesselStateCalc = new VesselStateCalculation(material, state);
48
+
49
+ console.log("Running vesselStateCalculation...");
50
+ let resultCode = await vesselStateCalc.run();
51
+
52
+ if (vesselStateCalc.messages.length > 0) {
53
+ console.log("Messages:");
54
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
55
+ }
56
+
57
+ expect(resultCode).toBe(ResultCode.SUCCESS);
58
+ console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
59
+
60
+ // Create vessel
61
+ const vessel = new Vessel({
62
+ state: vesselStateCalc.outputState,
63
+ material: vesselStateCalc.material,
64
+ vesselConditions: vesselStateCalc.vesselConditions,
65
+ diameter: vesselDiameter,
66
+ length: 5.0,
67
+ shape: vesselShape,
68
+ liquidFillFractionByVolume: liquidFillFractionByVolume
69
+ });
70
+
71
+ // Create line rupture
72
+ const lineRupture = new LineRupture({
73
+ pipeDiameter: pipeDiameter,
74
+ pipeLength: pipeLength,
75
+ pipeHeightFraction: pipeHeightFraction
76
+ });
77
+
78
+ // Create and run vessel line rupture calculation
79
+ const vesselLineRuptureCalc = new VesselLineRuptureCalculation(
80
+ vessel,
81
+ lineRupture,
82
+ new DischargeParameters()
83
+ );
84
+
85
+ console.log("Running vesselLineRuptureCalculation...");
86
+ resultCode = await vesselLineRuptureCalc.run();
87
+
88
+ if (vesselLineRuptureCalc.messages.length > 0) {
89
+ console.log("Messages:");
90
+ vesselLineRuptureCalc.messages.forEach((msg) => console.log(msg));
91
+ }
92
+
93
+ expect(resultCode).toBe(ResultCode.SUCCESS);
94
+ console.log(`SUCCESS: vesselLineRuptureCalculation (${vesselLineRuptureCalc.calculationElapsedTime}ms)`);
95
+
96
+ // Define weather and substrate
97
+ const weather = new Weather({
98
+ windSpeed: windSpeed,
99
+ stabilityClass: stabilityClass
100
+ });
101
+
102
+ const substrate = new Substrate({
103
+ surfaceRoughness: surfaceRoughness
104
+ });
105
+
106
+ // Create and run jet fire calculation
107
+ const flammableParams = new FlammableParameters({
108
+ timeOfInterest: timeOfInterest,
109
+ jetFireAutoSelect: jetFireAutoSelect,
110
+ timeAveraging: timeAveraging
111
+ });
112
+
113
+ const jetFireCalc = new JetFireCalculation(
114
+ vesselLineRuptureCalc.exitMaterial!,
115
+ vesselLineRuptureCalc.dischargeRecords!,
116
+ vesselLineRuptureCalc.dischargeRecords!.length,
117
+ vesselLineRuptureCalc.dischargeResult!,
118
+ weather,
119
+ substrate,
120
+ flammableParams
121
+ );
122
+
123
+ console.log("Running jetFireCalculation...");
124
+ resultCode = await jetFireCalc.run();
125
+
126
+ if (jetFireCalc.messages.length > 0) {
127
+ console.log("Messages:");
128
+ jetFireCalc.messages.forEach((msg) => console.log(msg));
129
+ }
130
+
131
+ expect(resultCode).toBe(ResultCode.SUCCESS);
132
+
133
+ // Regression checks
134
+ const flameLengthError = Math.abs(
135
+ (jetFireCalc.flameResult!.flameLength! - 98.19868637938056) / 98.19868637938056
136
+ );
137
+ const surfaceEmissivePowerError = Math.abs(
138
+ (jetFireCalc.flameResult!.surfaceEmissivePower! - 175803.22174161073) / 175803.22174161073
139
+ );
140
+
141
+ expect(flameLengthError).toBeLessThan(1e-3);
142
+ expect(surfaceEmissivePowerError).toBeLessThan(1e-3);
143
+ expect(jetFireCalc.flameRecords!.length).toBe(2);
144
+
145
+ console.log(`SUCCESS: jetFireCalculation (${jetFireCalc.calculationElapsedTime}ms)`);
146
+ });
147
+ });
@@ -0,0 +1,146 @@
1
+ import { Material, MaterialComponent, State, Leak, Vessel, FlammableParameters, Weather, Substrate, DischargeParameters } from "../../src/entities";
2
+ import { VesselStateCalculation, VesselLeakCalculation } from "../../src/calculations/discharge";
3
+ import { JetFireCalculation } from "../../src/calculations/jetFire";
4
+ import { ResultCode, AtmosphericStabilityClass, VesselShape, TimeVaryingOption } from "../../src/enums";
5
+ import { setAccessToken } from "../../src/utilities";
6
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
7
+
8
+ if (!accessToken) {
9
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
10
+ }
11
+
12
+ setAccessToken(accessToken);
13
+
14
+ describe("Integrated Jet Fire Scenario - Test Case 39", () => {
15
+ test("should run the full jet fire scenario and perform regression check", async () => {
16
+ // Set the case properties
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 liquidFillFractionByVolume = 0.0;
26
+ const windSpeed = 2.0;
27
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
28
+ const surfaceRoughness = 0.18;
29
+ const timeOfInterest = 3600.0;
30
+ const jetFireAutoSelect = false;
31
+ const timeAveraging = true;
32
+
33
+ // Define the initial state of the vessel
34
+ const state = new State({
35
+ temperature: stateTemperature,
36
+ pressure: statePressure,
37
+ liquidFraction: 0.0
38
+ });
39
+
40
+ // Define the material contained by the vessel
41
+ const material = new Material({
42
+ name: materialName,
43
+ components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })]
44
+ });
45
+
46
+ // Create and run vessel state calculation
47
+ const vesselStateCalc = new VesselStateCalculation(material, state);
48
+
49
+ console.log("Running vesselStateCalculation...");
50
+ let resultCode = await vesselStateCalc.run();
51
+
52
+ if (vesselStateCalc.messages.length > 0) {
53
+ console.log("Messages:");
54
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
55
+ }
56
+
57
+ expect(resultCode).toBe(ResultCode.SUCCESS);
58
+ console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
59
+
60
+ // Create vessel
61
+ const vessel = new Vessel({
62
+ state: vesselStateCalc.outputState,
63
+ material: vesselStateCalc.material,
64
+ vesselConditions: vesselStateCalc.vesselConditions,
65
+ diameter: vesselDiameter,
66
+ shape: vesselShape,
67
+ liquidFillFractionByVolume: liquidFillFractionByVolume
68
+ });
69
+
70
+ // Create leak
71
+ const leak = new Leak({
72
+ holeDiameter: leakHoleDiameter,
73
+ holeHeightFraction: leakHoleHeightFraction,
74
+ timeVaryingOption: timeVaryingOption
75
+ });
76
+
77
+ // Create and run vessel leak calculation
78
+ const vesselLeakCalc = new VesselLeakCalculation(
79
+ vessel,
80
+ leak,
81
+ new DischargeParameters()
82
+ );
83
+
84
+ console.log("Running vesselLeakCalculation...");
85
+ resultCode = await vesselLeakCalc.run();
86
+
87
+ if (vesselLeakCalc.messages.length > 0) {
88
+ console.log("Messages:");
89
+ vesselLeakCalc.messages.forEach((msg) => console.log(msg));
90
+ }
91
+
92
+ expect(resultCode).toBe(ResultCode.SUCCESS);
93
+ console.log(`SUCCESS: vesselLeakCalculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
94
+
95
+ // Define weather and substrate
96
+ const weather = new Weather({
97
+ windSpeed: windSpeed,
98
+ stabilityClass: stabilityClass
99
+ });
100
+
101
+ const substrate = new Substrate({
102
+ surfaceRoughness: surfaceRoughness
103
+ });
104
+
105
+ // Create and run jet fire calculation
106
+ const flammableParams = new FlammableParameters({
107
+ timeOfInterest: timeOfInterest,
108
+ jetFireAutoSelect: jetFireAutoSelect,
109
+ timeAveraging: timeAveraging
110
+ });
111
+
112
+ const jetFireCalc = new JetFireCalculation(
113
+ vesselLeakCalc.exitMaterial!,
114
+ vesselLeakCalc.dischargeRecords!,
115
+ vesselLeakCalc.dischargeRecords!.length,
116
+ vesselLeakCalc.dischargeResult!,
117
+ weather,
118
+ substrate,
119
+ flammableParams
120
+ );
121
+
122
+ console.log("Running jetFireCalculation...");
123
+ resultCode = await jetFireCalc.run();
124
+
125
+ if (jetFireCalc.messages.length > 0) {
126
+ console.log("Messages:");
127
+ jetFireCalc.messages.forEach((msg) => console.log(msg));
128
+ }
129
+
130
+ expect(resultCode).toBe(ResultCode.SUCCESS);
131
+
132
+ // Regression checks
133
+ const flameLengthError = Math.abs(
134
+ (jetFireCalc.flameResult!.flameLength! - 33.750426875730376) / 33.750426875730376
135
+ );
136
+ const surfaceEmissivePowerError = Math.abs(
137
+ (jetFireCalc.flameResult!.surfaceEmissivePower! - 309079.19061404973) / 309079.19061404973
138
+ );
139
+
140
+ expect(flameLengthError).toBeLessThan(1e-3);
141
+ expect(surfaceEmissivePowerError).toBeLessThan(1e-3);
142
+ expect(jetFireCalc.flameRecords!.length).toBe(2);
143
+
144
+ console.log(`SUCCESS: jetFireCalculation (${jetFireCalc.calculationElapsedTime}ms)`);
145
+ });
146
+ });
@@ -0,0 +1,152 @@
1
+ import { Material, MaterialComponent, State, Vessel, LineRupture, Weather, Substrate, DischargeParameters, FlammableParameters } from "../../src/entities";
2
+ import { VesselStateCalculation, VesselLineRuptureCalculation } from "../../src/calculations/discharge";
3
+ import { JetFireCalculation } from "../../src/calculations/jetFire";
4
+ import { ResultCode, AtmosphericStabilityClass, VesselShape } from "../../src/enums";
5
+ import { setAccessToken } from "../../src/utilities";
6
+ const accessToken = process.env.PWS_ACCESS_TOKEN;
7
+
8
+ if (!accessToken) {
9
+ throw new Error("ACCESS_TOKEN environment variable is not set.");
10
+ }
11
+
12
+ setAccessToken(accessToken);
13
+
14
+ describe("Integrated Jet Fire Scenario - Test Case 40", () => {
15
+ test("should run the full jet fire scenario with line rupture and perform regression check", async () => {
16
+ // Set the case properties
17
+ const materialName = "ETHANE_METHANE_HYDROGEN";
18
+ const stateTemperature = 260.0;
19
+ const statePressure = 5.0e5;
20
+ const vesselShape = VesselShape.VESSEL_SPHERE;
21
+ const vesselDiameter = 3.0;
22
+ const liquidFillFractionByVolume = 0.7;
23
+ const pipeDiameter = 0.5;
24
+ const pipeLength = 1.0;
25
+ const pipeHeightFraction = 0.5;
26
+ const windSpeed = 2.0;
27
+ const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
28
+ const surfaceRoughness = 0.18;
29
+ const timeOfInterest = 600.0;
30
+ const jetFireAutoSelect = false;
31
+ const timeAveraging = true;
32
+
33
+ // Define the initial state of the vessel
34
+ const state = new State({
35
+ temperature: stateTemperature,
36
+ pressure: statePressure,
37
+ liquidFraction: 0.0
38
+ });
39
+
40
+ // Define the material contained by the vessel
41
+ const material = new Material({
42
+ name: materialName,
43
+ components: [
44
+ new MaterialComponent({ name: "METHANE", moleFraction: 0.5 }),
45
+ new MaterialComponent({ name: "ETHANE", moleFraction: 0.3 }),
46
+ new MaterialComponent({ name: "HYDROGEN", moleFraction: 0.2 })
47
+ ],
48
+ componentCount: 3
49
+ });
50
+
51
+ // Create and run vessel state calculation
52
+ const vesselStateCalc = new VesselStateCalculation(material, state);
53
+
54
+ console.log("Running vesselStateCalculation...");
55
+ let resultCode = await vesselStateCalc.run();
56
+
57
+ if (vesselStateCalc.messages.length > 0) {
58
+ console.log("Messages:");
59
+ vesselStateCalc.messages.forEach((msg) => console.log(msg));
60
+ }
61
+
62
+ expect(resultCode).toBe(ResultCode.SUCCESS);
63
+ console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
64
+
65
+ // Create vessel
66
+ const vessel = new Vessel({
67
+ state: vesselStateCalc.outputState,
68
+ material: vesselStateCalc.material,
69
+ vesselConditions: vesselStateCalc.vesselConditions,
70
+ diameter: vesselDiameter,
71
+ length: 5.0,
72
+ shape: vesselShape,
73
+ liquidFillFractionByVolume: liquidFillFractionByVolume
74
+ });
75
+
76
+ // Create line rupture
77
+ const lineRupture = new LineRupture({
78
+ pipeDiameter: pipeDiameter,
79
+ pipeLength: pipeLength,
80
+ pipeHeightFraction: pipeHeightFraction
81
+ });
82
+
83
+ // Create and run vessel line rupture calculation
84
+ const vesselLineRuptureCalc = new VesselLineRuptureCalculation(
85
+ vessel,
86
+ lineRupture,
87
+ new DischargeParameters()
88
+ );
89
+
90
+ console.log("Running vesselLineRuptureCalculation...");
91
+ resultCode = await vesselLineRuptureCalc.run();
92
+
93
+ if (vesselLineRuptureCalc.messages.length > 0) {
94
+ console.log("Messages:");
95
+ vesselLineRuptureCalc.messages.forEach((msg) => console.log(msg));
96
+ }
97
+
98
+ expect(resultCode).toBe(ResultCode.SUCCESS);
99
+ console.log(`SUCCESS: vesselLineRuptureCalculation (${vesselLineRuptureCalc.calculationElapsedTime}ms)`);
100
+
101
+ // Define weather and substrate
102
+ const weather = new Weather({
103
+ windSpeed: windSpeed,
104
+ stabilityClass: stabilityClass
105
+ });
106
+
107
+ const substrate = new Substrate({
108
+ surfaceRoughness: surfaceRoughness
109
+ });
110
+
111
+ // Create and run jet fire calculation
112
+ const flammableParams = new FlammableParameters({
113
+ timeOfInterest: timeOfInterest,
114
+ jetFireAutoSelect: jetFireAutoSelect,
115
+ timeAveraging: timeAveraging
116
+ });
117
+
118
+ const jetFireCalc = new JetFireCalculation(
119
+ vesselLineRuptureCalc.exitMaterial!,
120
+ vesselLineRuptureCalc.dischargeRecords!,
121
+ vesselLineRuptureCalc.dischargeRecords!.length,
122
+ vesselLineRuptureCalc.dischargeResult!,
123
+ weather,
124
+ substrate,
125
+ flammableParams
126
+ );
127
+
128
+ console.log("Running jetFireCalculation...");
129
+ resultCode = await jetFireCalc.run();
130
+
131
+ if (jetFireCalc.messages.length > 0) {
132
+ console.log("Messages:");
133
+ jetFireCalc.messages.forEach((msg) => console.log(msg));
134
+ }
135
+
136
+ expect(resultCode).toBe(ResultCode.SUCCESS);
137
+
138
+ // Regression checks
139
+ const flameLengthError = Math.abs(
140
+ (jetFireCalc.flameResult!.flameLength! - 96.77758243403922) / 96.77758243403922
141
+ );
142
+ const surfaceEmissivePowerError = Math.abs(
143
+ (jetFireCalc.flameResult!.surfaceEmissivePower! - 350000.0) / 350000.0
144
+ );
145
+
146
+ expect(flameLengthError).toBeLessThan(1e-3);
147
+ expect(surfaceEmissivePowerError).toBeLessThan(1e-3);
148
+ expect(jetFireCalc.flameRecords!.length).toBe(2);
149
+
150
+ console.log(`SUCCESS: jetFireCalculation (${jetFireCalc.calculationElapsedTime}ms)`);
151
+ });
152
+ });