@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.
- package/index.ts +2 -2
- package/jest.config.js +5 -0
- package/package.json +6 -6
- package/src/calculations/applicationTools.ts +2 -2
- package/src/calculations/discharge.ts +2 -2
- package/src/calculations/dispersion.ts +2 -2
- package/src/calculations/dispersionView.ts +2 -2
- package/src/calculations/fireball.ts +2 -2
- package/src/calculations/jetFire.ts +2 -2
- package/src/calculations/lateExplosion.ts +2 -2
- package/src/calculations/linkedRunners.ts +2 -2
- package/src/calculations/poolFire.ts +2 -2
- package/src/calculations/properties.ts +2 -2
- package/src/calculations/radiation.ts +2 -2
- package/src/calculations/standalones.ts +2 -2
- package/src/calculations/toxics.ts +2 -2
- package/src/calculations/utilities.ts +2 -2
- package/src/constants.ts +2 -2
- package/src/entities.ts +2 -2
- package/src/entity-schemas.ts +2 -2
- package/src/enums.ts +2 -2
- package/src/materials.ts +14 -14
- package/src/utilities.ts +2 -2
- package/tests/concentration-at-point-calculation/testCase116.test.ts +146 -0
- package/tests/concentration-at-point-calculation/testCase117.test.ts +142 -0
- package/tests/concentration-at-point-calculation/testCase118.test.ts +143 -0
- package/tests/concentration-at-point-calculation/testCase119.test.ts +149 -0
- package/tests/concentration-at-point-calculation/testCase120.test.ts +155 -0
- package/tests/constants/testConstants.test.ts +23 -0
- package/tests/convert-comp-mass-to-mole-calculation/testCase129.test.ts +74 -0
- package/tests/convert-comp-mass-to-mole-calculation/testCase130.test.ts +73 -0
- package/tests/convert-comp-mass-to-mole-calculation/testCase131.test.ts +73 -0
- package/tests/convert-comp-mass-to-mole-calculation/testCase132.test.ts +73 -0
- package/tests/convert-comp-mass-to-mole-calculation/testCase133.test.ts +73 -0
- package/tests/convert-comp-mole-to-mass-calculation/testCase134.test.ts +72 -0
- package/tests/convert-comp-mole-to-mass-calculation/testCase135.test.ts +72 -0
- package/tests/convert-comp-mole-to-mass-calculation/testCase136.test.ts +72 -0
- package/tests/convert-comp-mole-to-mass-calculation/testCase137.test.ts +72 -0
- package/tests/convert-comp-mole-to-mass-calculation/testCase138.test.ts +72 -0
- package/tests/distances-and-ellipses-to-radiation-levels-calculation/testCase64.test.ts +194 -0
- package/tests/distances-and-ellipses-to-radiation-levels-calculation/testCase65.test.ts +197 -0
- package/tests/distances-and-ellipses-to-radiation-levels-calculation/testCase66.test.ts +194 -0
- package/tests/distances-and-ellipses-to-radiation-levels-calculation/testCase67.test.ts +198 -0
- package/tests/distances-and-ellipses-to-radiation-levels-calculation/testCase68.test.ts +178 -0
- package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase31a.test.ts +158 -0
- package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase32a.test.ts +156 -0
- package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase33a.test.ts +158 -0
- package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase34a.test.ts +165 -0
- package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase35a.test.ts +188 -0
- package/tests/distances-to-conc-levels-calculation/testCase121.test.ts +149 -0
- package/tests/distances-to-conc-levels-calculation/testCase122.test.ts +145 -0
- package/tests/distances-to-conc-levels-calculation/testCase123.test.ts +150 -0
- package/tests/distances-to-conc-levels-calculation/testCase124.test.ts +154 -0
- package/tests/distances-to-conc-levels-calculation/testCase125.test.ts +157 -0
- package/tests/entities/testVessel.test.ts +49 -0
- package/tests/fireball-calculation/testCase89.test.ts +151 -0
- package/tests/fireball-calculation/testCase90.test.ts +153 -0
- package/tests/fireball-calculation/testCase91.test.ts +152 -0
- package/tests/fireball-calculation/testCse92.test.ts +150 -0
- package/tests/flash-calculation/testCase26.test.ts +71 -0
- package/tests/flash-calculation/testCase27.test.ts +69 -0
- package/tests/flash-calculation/testCase28.test.ts +69 -0
- package/tests/flash-calculation/testCase29.test.ts +67 -0
- package/tests/flash-calculation/testCase30.test.ts +70 -0
- package/tests/general/operation-id-demo.test.ts +64 -0
- package/tests/get-component-by-id/get-component-by-id-METHANE.test.ts +35 -0
- package/tests/get-mass-from-vessel-calculation/testCase139.test.ts +65 -0
- package/tests/jet-fire-calculation/testCase36.test.ts +141 -0
- package/tests/jet-fire-calculation/testCase37.test.ts +148 -0
- package/tests/jet-fire-calculation/testCase38.test.ts +147 -0
- package/tests/jet-fire-calculation/testCase39.test.ts +146 -0
- package/tests/jet-fire-calculation/testCase40.test.ts +152 -0
- package/tests/late-explosion-calculation/testCase46.test.ts +157 -0
- package/tests/late-explosion-calculation/testCase47.test.ts +149 -0
- package/tests/late-explosion-calculation/testCase48.test.ts +176 -0
- package/tests/late-explosion-calculation/testCase49.test.ts +178 -0
- package/tests/late-explosion-calculation/testCase50.test.ts +176 -0
- package/tests/late-explosion-calculation/testCase74.test.ts +166 -0
- package/tests/late-explosion-calculation/testCase75.test.ts +163 -0
- package/tests/late-explosion-calculation/testCase76.test.ts +174 -0
- package/tests/late-explosion-calculation/testCase77.test.ts +175 -0
- package/tests/late-explosion-calculation/testCase78.test.ts +175 -0
- package/tests/lethality-distance-calculation/testCase60.test.ts +142 -0
- package/tests/linked-runners/user-defined-source-linked-run/test-uds-153.test.ts +121 -0
- package/tests/linked-runners/user-defined-source-linked-run/test-uds-154.test.ts +167 -0
- package/tests/linked-runners/user-defined-source-linked-run/test-uds-155.test.ts +202 -0
- package/tests/linked-runners/user-defined-source-linked-run/test-uds-156.test.ts +201 -0
- package/tests/linked-runners/vessel-leak-linked-run/test-vl-157.test.ts +182 -0
- package/tests/linked-runners/vessel-leak-linked-run/test-vl-158.test.ts +200 -0
- package/tests/linked-runners/vessel-leak-linked-run/test-vl-159.test.ts +158 -0
- package/tests/linked-runners/vessel-leak-linked-run/test-vl-160.test.ts +165 -0
- package/tests/linked-runners/vessel-line-rupture-linked-run/test-vlr-161.test.ts +161 -0
- package/tests/linked-runners/vessel-line-rupture-linked-run/test-vlr-162.test.ts +167 -0
- package/tests/linked-runners/vessel-line-rupture-linked-run/test-vlr-163.test.ts +177 -0
- package/tests/linked-runners/vessel-line-rupture-linked-run/test-vlr-164.test.ts +165 -0
- package/tests/linked-runners/vessel-relief-valve-linked-run/test-vrv-165.test.ts +166 -0
- package/tests/linked-runners/vessel-relief-valve-linked-run/test-vrv-166.test.ts +154 -0
- package/tests/linked-runners/vessel-relief-valve-linked-run/test-vrv-167.test.ts +157 -0
- package/tests/linked-runners/vessel-relief-valve-linked-run/test-vrv-168.test.ts +168 -0
- package/tests/load-mass-inventory-vessel-for-line-rupture-scenario-calculation/testCase126.test.ts +72 -0
- package/tests/load-mass-inventory-vessel-for-line-rupture-scenario-calculation/testCase127.test.ts +73 -0
- package/tests/load-mass-inventory-vessel-for-line-rupture-scenario-calculation/testCase128.test.ts +72 -0
- package/tests/load-mass-inventory-vessel-for-relief-valve-scenario-calculation/testCase103.test.ts +74 -0
- package/tests/load-mass-inventory-vessel-for-relief-valve-scenario-calculation/testCase104.test.ts +75 -0
- package/tests/load-mass-inventory-vessel-for-relief-valve-scenario-calculation/testCase105.test.ts +74 -0
- package/tests/long-pipe-calculation/testCase55.test.ts +88 -0
- package/tests/long-pipe-calculation/testCase56.test.ts +90 -0
- package/tests/long-pipe-calculation/testCase57.test.ts +88 -0
- package/tests/long-pipe-calculation/testCase58.test.ts +88 -0
- package/tests/long-pipe-calculation/testCase59.test.ts +88 -0
- package/tests/materials/test-get-component-by-cas-id-1-2-PROPYLENE-OXIDE.test.ts +23 -0
- package/tests/materials/test-get-component-by-cas-id-CARBON-MONOXIDE.test.ts +25 -0
- package/tests/materials/test-get-component-by-cas-id-METHANE.test.ts +22 -0
- package/tests/materials/test-get-component-by-id-1-2-PROPYLENE-OXIDE.test.ts +23 -0
- package/tests/materials/test-get-component-by-id-CARBON-MONOXIDE.test.ts +22 -0
- package/tests/materials/test-get-component-by-id-METHANE.test.ts +22 -0
- package/tests/materials/test-get-component-by-name-1-2-PROPYLENE-OXIDE.test.ts +24 -0
- package/tests/materials/test-get-component-by-name-CARBON-MONOXIDE.test.ts +23 -0
- package/tests/materials/test-get-component-by-name-METHANE.test.ts +25 -0
- package/tests/materials/test-get-components.test.ts +47 -0
- package/tests/materials/test-get-dippr-components.test.ts +28 -0
- package/tests/materials/test-get-dnv-components.test.ts +28 -0
- package/tests/materials/test-get-material-by-cas-id-1-2-PROPYLENE-OXIDE.test.ts +29 -0
- package/tests/materials/test-get-material-by-cas-id-CARBON-MONOXIDE.test.ts +31 -0
- package/tests/materials/test-get-material-by-cas-id-METHANE.test.ts +30 -0
- package/tests/materials/test-get-material-by-cas-id-ZERO.test.ts +31 -0
- package/tests/materials/test-get-material-by-id-1-2-PROPYLENE-OXIDE.test.ts +30 -0
- package/tests/materials/test-get-material-by-id-CARBON-MONOXIDE.test.ts +29 -0
- package/tests/materials/test-get-material-by-id-METHANE.test.ts +29 -0
- package/tests/materials/test-get-material-by-name-1-2-PROPYLENE-OXIDE.test.ts +29 -0
- package/tests/materials/test-get-material-by-name-CARBON-MONOXIDE.test.ts +29 -0
- package/tests/materials/test-get-material-by-name-METHANE.test.ts +29 -0
- package/tests/materials/test-get-materials.test.ts +32 -0
- package/tests/max-conc-distance-calculation/testCase106.test.ts +146 -0
- package/tests/max-conc-distance-calculation/testCase107.test.ts +148 -0
- package/tests/max-conc-distance-calculation/testCase108.test.ts +172 -0
- package/tests/max-conc-distance-calculation/testCase109.test.ts +146 -0
- package/tests/max-conc-distance-calculation/testCase110.test.ts +146 -0
- package/tests/max-conc-footprint-calculation/testCase31.test.ts +169 -0
- package/tests/max-conc-footprint-calculation/testCase32.test.ts +183 -0
- package/tests/max-conc-footprint-calculation/testCase33.test.ts +161 -0
- package/tests/max-conc-footprint-calculation/testCase34.test.ts +172 -0
- package/tests/max-conc-footprint-calculation/testCase35.test.ts +188 -0
- package/tests/max-distance-to-conc-calculation/testCase111.test.ts +138 -0
- package/tests/max-distance-to-conc-calculation/testCase112.test.ts +174 -0
- package/tests/max-distance-to-conc-calculation/testCase113.test.ts +153 -0
- package/tests/max-distance-to-conc-calculation/testCase114.test.ts +162 -0
- package/tests/max-distance-to-conc-calculation/testCase115.test.ts +167 -0
- package/tests/mixture-constant-properties-calculation/testCase97.test.ts +83 -0
- package/tests/mixture-constant-properties-calculation/testCase98.test.ts +90 -0
- package/tests/mixture-constant-properties-calculation/testCase99.test.ts +87 -0
- package/tests/pool-fire-calculation/testCase41.test.ts +153 -0
- package/tests/pool-fire-calculation/testCase41a.test.ts +141 -0
- package/tests/pool-fire-calculation/testCase42.test.ts +169 -0
- package/tests/pool-fire-calculation/testCase42a.test.ts +175 -0
- package/tests/pool-fire-calculation/testCase43.test.ts +161 -0
- package/tests/pool-fire-calculation/testCase43a.test.ts +157 -0
- package/tests/pool-fire-calculation/testCase44.test.ts +147 -0
- package/tests/pool-fire-calculation/testCase44a.test.ts +152 -0
- package/tests/pool-fire-calculation/testCase45.test.ts +176 -0
- package/tests/pool-fire-calculation/testCase45a.test.ts +182 -0
- package/tests/radiation-at-ponts/testCase69.test.ts +167 -0
- package/tests/radiation-at-ponts/testCase70.test.ts +179 -0
- package/tests/radiation-at-ponts/testCase71.test.ts +150 -0
- package/tests/radiation-at-ponts/testCase72.test.ts +166 -0
- package/tests/radiation-at-ponts/testCase73.test.ts +169 -0
- package/tests/radiation-contour-calculation/testCase51.test.ts +127 -0
- package/tests/radiation-contour-calculation/testCase52.test.ts +126 -0
- package/tests/radiation-contour-calculation/testCase53.test.ts +126 -0
- package/tests/radiation-contour-calculation/testCase54.test.ts +131 -0
- package/tests/relief-valve-min-temperature-calculation/testCase140.test.ts +49 -0
- package/tests/set-mixing-layer-height/testCase100.test.ts +36 -0
- package/tests/set-mixing-layer-height/testCase101.test.ts +36 -0
- package/tests/set-mixing-layer-height/testCase102.test.ts +36 -0
- package/tests/set-phase-to-be-released-for-leak-calculation/testCase150.test.ts +67 -0
- package/tests/set-phase-to-be-released-for-line-rupture-calculation/testCase151.test.ts +67 -0
- package/tests/set-phase-to-be-released-for-relief-valve-calculation/TestCase152.test.ts +61 -0
- package/tests/sideview/testCase31b.test.ts +150 -0
- package/tests/sideview/testCase32b.test.ts +145 -0
- package/tests/sideview/testCase33b.test.ts +130 -0
- package/tests/sideview/testCase34b.test.ts +153 -0
- package/tests/sideview/testCase35b.test.ts +140 -0
- package/tests/tank-fire-calculation/testCase79.test.ts +61 -0
- package/tests/tank-fire-calculation/testCase80.test.ts +67 -0
- package/tests/tank-fire-calculation/testCase81.test.ts +68 -0
- package/tests/tank-fire-calculation/testCase82.test.ts +68 -0
- package/tests/tank-fire-calculation/testCase83.test.ts +73 -0
- package/tests/utilities/convert-camel-case-to-snake-case.test.ts +7 -0
- package/tests/utilities/convert-snake-case-to-camel-case.test.ts +7 -0
- package/tests/vessel-catastrophic-rupture-calculation/testCase1.test.ts +83 -0
- package/tests/vessel-catastrophic-rupture-calculation/testCase2.test.ts +82 -0
- package/tests/vessel-catastrophic-rupture-calculation/testCase3.test.ts +91 -0
- package/tests/vessel-catastrophic-rupture-calculation/testCase4.test.ts +85 -0
- package/tests/vessel-catastrophic-rupture-calculation/testCase5.test.ts +84 -0
- package/tests/vessel-leak-calculation/testCase10.test.ts +108 -0
- package/tests/vessel-leak-calculation/testCase6.test.ts +113 -0
- package/tests/vessel-leak-calculation/testCase7.test.ts +123 -0
- package/tests/vessel-leak-calculation/testCase8.test.ts +102 -0
- package/tests/vessel-leak-calculation/testCase9.test.ts +106 -0
- package/tests/vessel-line-rupture-calculation/vlr-ammonia.test.ts +84 -0
- package/tests/vessel-line-rupture-calculation/vlr-ethaneMethane.test.ts +82 -0
- package/tests/vessel-line-rupture-calculation/vlr-nDecane.test.ts +79 -0
- package/tests/vessel-line-rupture-calculation/vlr-oxygen.test.ts +77 -0
- package/tests/vessel-line-rupture-calculation/vlr-propane.test.ts +77 -0
- package/tests/vessel-relief-valve-calculation/vrv-chlorine.test.ts +99 -0
- package/tests/vessel-relief-valve-calculation/vrv-hydrogen.test.ts +96 -0
- package/tests/vessel-relief-valve-calculation/vrv-methane.test.ts +80 -0
- package/tests/vessel-relief-valve-calculation/vrv-methaneH2s.test.ts +86 -0
- package/tests/vessel-relief-valve-calculation/vrv-nitrogen.test.ts +80 -0
- package/tests/vessel-state-calculation/vs-ammonia.test.ts +56 -0
- package/tests/vessel-state-calculation/vs-butane.test.ts +57 -0
- package/tests/vessel-state-calculation/vs-chlorine.test.ts +56 -0
- package/tests/vessel-state-calculation/vs-methane.test.ts +57 -0
- package/tests/vessel-state-calculation/vs-naturalGas.test.ts +59 -0
- package/tests/vessel-state-calculation/vs-nitrogenPentane.test.ts +58 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { VesselCatastrophicRuptureCalculation, 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 { Material, MaterialComponent, State, Vessel, Weather, Substrate, DischargeParameters, DispersionParameters, FlammableParameters, FlammableOutputConfig, LocalPosition } from "../../src/entities";
|
|
6
|
+
import { AtmosphericStabilityClass, PoolFireType, ResultCode, 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 Catastrophic Rupture Integration - Test Case 41", () => {
|
|
17
|
+
test("should perform full integration including pool fire radiation output", async () => {
|
|
18
|
+
|
|
19
|
+
// Define the material and its state
|
|
20
|
+
const material = new Material({
|
|
21
|
+
name: "N-HEXANE",
|
|
22
|
+
components: [new MaterialComponent({ name: "N-HEXANE", moleFraction: 1.0 })],
|
|
23
|
+
componentCount: 1,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const state = new State({
|
|
27
|
+
temperature: 280.0,
|
|
28
|
+
pressure: 2.0e5,
|
|
29
|
+
liquidFraction: 0.8,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
33
|
+
let resultCode = await vesselStateCalc.run();
|
|
34
|
+
|
|
35
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
36
|
+
console.log("Messages:");
|
|
37
|
+
vesselStateCalc.messages.forEach((m) => console.log(m));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
41
|
+
|
|
42
|
+
const vessel = new Vessel({
|
|
43
|
+
state: state,
|
|
44
|
+
material: material,
|
|
45
|
+
liquidFillFractionByVolume: 0.8,
|
|
46
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const dischargeParams = new DischargeParameters();
|
|
50
|
+
|
|
51
|
+
const ruptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
|
|
52
|
+
resultCode = await ruptureCalc.run();
|
|
53
|
+
|
|
54
|
+
if (ruptureCalc.messages.length > 0) {
|
|
55
|
+
console.log("Messages:");
|
|
56
|
+
ruptureCalc.messages.forEach((m) => console.log(m));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
60
|
+
|
|
61
|
+
const weather = new Weather({
|
|
62
|
+
windSpeed: 1.5,
|
|
63
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_F,
|
|
64
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const substrate = new Substrate();
|
|
68
|
+
|
|
69
|
+
const dispersionCalc = new DispersionCalculation(
|
|
70
|
+
ruptureCalc.exitMaterial!,
|
|
71
|
+
substrate,
|
|
72
|
+
ruptureCalc.dischargeResult!,
|
|
73
|
+
ruptureCalc.dischargeRecords!,
|
|
74
|
+
1,
|
|
75
|
+
weather,
|
|
76
|
+
new DispersionParameters(),
|
|
77
|
+
0.0
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
resultCode = await dispersionCalc.run();
|
|
81
|
+
|
|
82
|
+
if (dispersionCalc.messages.length > 0) {
|
|
83
|
+
console.log("Messages:");
|
|
84
|
+
dispersionCalc.messages.forEach((m) => console.log(m));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
88
|
+
|
|
89
|
+
const flammableParams = new FlammableParameters({
|
|
90
|
+
poolFireType: PoolFireType.LATE,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const poolFireCalc = new PoolFireCalculation(
|
|
94
|
+
ruptureCalc.exitMaterial!,
|
|
95
|
+
dispersionCalc.poolRecords!,
|
|
96
|
+
dispersionCalc.poolRecords!.length,
|
|
97
|
+
weather,
|
|
98
|
+
substrate,
|
|
99
|
+
flammableParams
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
resultCode = await poolFireCalc.run();
|
|
103
|
+
|
|
104
|
+
if (poolFireCalc.messages.length > 0) {
|
|
105
|
+
console.log("Messages:");
|
|
106
|
+
poolFireCalc.messages.forEach((m) => console.log(m));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
110
|
+
|
|
111
|
+
const flammableOutputConfigs = [
|
|
112
|
+
{ x: 0.0, y: 0.0, z: 0.0 },
|
|
113
|
+
{ x: 0.0, y: 0.0, z: 1.0 },
|
|
114
|
+
{ x: 0.0, y: 0.0, z: 2.0 },
|
|
115
|
+
].map(({ x, y, z }) => {
|
|
116
|
+
return new FlammableOutputConfig({
|
|
117
|
+
position: new LocalPosition({ x, y, z })
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const radiationCalc = new DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation(
|
|
122
|
+
poolFireCalc.poolFireFlameResult!,
|
|
123
|
+
poolFireCalc.flameRecords!,
|
|
124
|
+
poolFireCalc.flameRecords!.length,
|
|
125
|
+
weather,
|
|
126
|
+
flammableParams,
|
|
127
|
+
flammableOutputConfigs,
|
|
128
|
+
flammableOutputConfigs.length
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
resultCode = await radiationCalc.run();
|
|
132
|
+
|
|
133
|
+
if (radiationCalc.messages.length > 0) {
|
|
134
|
+
console.log("Messages:");
|
|
135
|
+
radiationCalc.messages.forEach((m) => console.log(m));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
139
|
+
|
|
140
|
+
// Regression checks
|
|
141
|
+
expect(radiationCalc.contourPoints!.length).toBe(150);
|
|
142
|
+
const lastX = radiationCalc.contourPoints![radiationCalc.contourPoints!.length - 1].x!;
|
|
143
|
+
const expectedX = 76.36825073266586;
|
|
144
|
+
const relErrorX = Math.abs((lastX - expectedX) / expectedX);
|
|
145
|
+
expect(relErrorX).toBeLessThan(1e-3);
|
|
146
|
+
|
|
147
|
+
const flameDiameter = radiationCalc.poolFireFlameResult.flameDiameter!;
|
|
148
|
+
const expectedDiameter = 50.3738899230957;
|
|
149
|
+
const relErrorDiameter = Math.abs((flameDiameter - expectedDiameter) / expectedDiameter);
|
|
150
|
+
expect(relErrorDiameter).toBeLessThan(1e-3);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { PoolFireCalculation } from "../../src/calculations/poolFire";
|
|
4
|
+
import { RadiationAtPointsForPoolFiresCalculation } from "../../src/calculations/radiation";
|
|
5
|
+
import { Bund, Material, MaterialComponent, State, Vessel, Weather, Substrate, DischargeParameters, DispersionParameters, FlammableParameters, FlammableOutputConfig, LocalPosition } from "../../src/entities";
|
|
6
|
+
import { AtmosphericStabilityClass, PoolFireType, ResultCode, 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 Catastrophic Rupture Integration - Test Case 41a", () => {
|
|
17
|
+
test("should match radiation and flame diameter regression values", async () => {
|
|
18
|
+
const material = new Material(
|
|
19
|
+
{
|
|
20
|
+
name: "N-HEXANE",
|
|
21
|
+
components:[ new MaterialComponent({name: "N-HEXANE", moleFraction: 1.0})]
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const state = new State({
|
|
25
|
+
temperature: 280.0,
|
|
26
|
+
pressure: 2.0e5,
|
|
27
|
+
liquidFraction: 0.8,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
31
|
+
let resultCode = await vesselStateCalculation.run();
|
|
32
|
+
|
|
33
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
34
|
+
console.log("Messages:");
|
|
35
|
+
vesselStateCalculation.messages.forEach((msg) => console.log(msg));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
39
|
+
|
|
40
|
+
const vessel = new Vessel({
|
|
41
|
+
state,
|
|
42
|
+
material,
|
|
43
|
+
liquidFillFractionByVolume: 0.8,
|
|
44
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const dischargeParams = new DischargeParameters();
|
|
48
|
+
const ruptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
|
|
49
|
+
|
|
50
|
+
resultCode = await ruptureCalc.run();
|
|
51
|
+
|
|
52
|
+
if (ruptureCalc.messages.length > 0) {
|
|
53
|
+
console.log("Messages:");
|
|
54
|
+
ruptureCalc.messages.forEach((msg) => console.log(msg));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
58
|
+
|
|
59
|
+
const weather = new Weather({
|
|
60
|
+
windSpeed: 1.5,
|
|
61
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_F,
|
|
62
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const substrate = new Substrate({ bund: new Bund() });
|
|
66
|
+
|
|
67
|
+
const dispersionCalc = new DispersionCalculation(
|
|
68
|
+
ruptureCalc.exitMaterial!,
|
|
69
|
+
substrate,
|
|
70
|
+
ruptureCalc.dischargeResult!,
|
|
71
|
+
ruptureCalc.dischargeRecords!,
|
|
72
|
+
ruptureCalc.dischargeRecords!.length,
|
|
73
|
+
weather,
|
|
74
|
+
new DispersionParameters(),
|
|
75
|
+
0.0
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
resultCode = await dispersionCalc.run();
|
|
79
|
+
|
|
80
|
+
if (dispersionCalc.messages.length > 0) {
|
|
81
|
+
console.log("Messages:");
|
|
82
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
86
|
+
|
|
87
|
+
const flammableParams = new FlammableParameters({
|
|
88
|
+
poolFireType: PoolFireType.LATE,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const poolFireCalc = new PoolFireCalculation(
|
|
92
|
+
ruptureCalc.exitMaterial!,
|
|
93
|
+
dispersionCalc.poolRecords!,
|
|
94
|
+
dispersionCalc.poolRecords!.length,
|
|
95
|
+
weather,
|
|
96
|
+
substrate,
|
|
97
|
+
flammableParams
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
resultCode = await poolFireCalc.run();
|
|
101
|
+
|
|
102
|
+
if (poolFireCalc.messages.length > 0) {
|
|
103
|
+
console.log("Messages:");
|
|
104
|
+
poolFireCalc.messages.forEach((msg) => console.log(msg));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
108
|
+
|
|
109
|
+
const flammableOutputConfigs = [
|
|
110
|
+
new FlammableOutputConfig({ position: new LocalPosition({ x: 50.0, y: 0.0, z: 0.0 }) }),
|
|
111
|
+
new FlammableOutputConfig({ position: new LocalPosition({ x: 50.0, y: 0.0, z: 1.0 }) }),
|
|
112
|
+
new FlammableOutputConfig({ position: new LocalPosition({ x: 50.0, y: 3.0, z: 2.0 }) }),
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
const radiationCalc = new RadiationAtPointsForPoolFiresCalculation(
|
|
116
|
+
poolFireCalc.poolFireFlameResult!,
|
|
117
|
+
poolFireCalc.flameRecords!,
|
|
118
|
+
poolFireCalc.flameRecords!.length,
|
|
119
|
+
weather,
|
|
120
|
+
flammableParams,
|
|
121
|
+
flammableOutputConfigs,
|
|
122
|
+
flammableOutputConfigs.length
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
resultCode = await radiationCalc.run();
|
|
126
|
+
|
|
127
|
+
if (radiationCalc.messages.length > 0) {
|
|
128
|
+
console.log("Messages:");
|
|
129
|
+
radiationCalc.messages.forEach((msg) => console.log(msg));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
133
|
+
|
|
134
|
+
const expectedRadiation = 11159.009681754622;
|
|
135
|
+
const expectedDiameter = 50.3738899230957;
|
|
136
|
+
|
|
137
|
+
expect(Math.abs((radiationCalc.radiation![0] - expectedRadiation) / expectedRadiation)).toBeLessThan(1e-3);
|
|
138
|
+
expect(Math.abs((radiationCalc.poolFireFlameResult.flameDiameter! - expectedDiameter) / expectedDiameter)).toBeLessThan(1e-3);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
@@ -0,0 +1,169 @@
|
|
|
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 Integration - Test Case 42", () => {
|
|
17
|
+
test("should produce correct radiation results for pool fire", async () => {
|
|
18
|
+
// Define the test case properties
|
|
19
|
+
const stateTemperature = 250.0;
|
|
20
|
+
const statePressure = 5.00e5;
|
|
21
|
+
const vesselShape = VesselShape.VERTICAL_CYLINDER;
|
|
22
|
+
const vesselHeight = 3.0;
|
|
23
|
+
const vesselDiameter = 1.5;
|
|
24
|
+
const leakHoleDiameter = 0.1;
|
|
25
|
+
const timeVaryingOption = TimeVaryingOption.TIME_VARYING_RATE;
|
|
26
|
+
const leakHoleHeightFraction = 0.0;
|
|
27
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
28
|
+
|
|
29
|
+
// Create state and material
|
|
30
|
+
const state = new State({
|
|
31
|
+
temperature: stateTemperature,
|
|
32
|
+
pressure: statePressure,
|
|
33
|
+
liquidFraction: 0.0,
|
|
34
|
+
});
|
|
35
|
+
const material = new Material({name: 'N-OCTANE+N-HEPTANE',
|
|
36
|
+
components:
|
|
37
|
+
[
|
|
38
|
+
new MaterialComponent({name: 'N-OCTANE', moleFraction: 0.5}),
|
|
39
|
+
new MaterialComponent({name: 'N-HEPTANE', moleFraction: 0.5}),
|
|
40
|
+
],
|
|
41
|
+
componentCount: 2
|
|
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
|
+
height: vesselHeight,
|
|
62
|
+
shape: vesselShape,
|
|
63
|
+
liquidFillFractionByVolume: 0.8,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const leak = new Leak({
|
|
67
|
+
holeDiameter: leakHoleDiameter,
|
|
68
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
69
|
+
timeVaryingOption: timeVaryingOption,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const 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: 2.0,
|
|
88
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_E,
|
|
89
|
+
windProfileFlag: windProfileFlag
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const substrate = new Substrate();
|
|
93
|
+
|
|
94
|
+
// Run dispersion calculation
|
|
95
|
+
const dispersionCalc = new DispersionCalculation(
|
|
96
|
+
vesselLeakCalc.exitMaterial!,
|
|
97
|
+
substrate,
|
|
98
|
+
vesselLeakCalc.dischargeResult!,
|
|
99
|
+
vesselLeakCalc.dischargeRecords!,
|
|
100
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
101
|
+
weather,
|
|
102
|
+
new DispersionParameters(),
|
|
103
|
+
0.0
|
|
104
|
+
);
|
|
105
|
+
resultCode = await dispersionCalc.run();
|
|
106
|
+
|
|
107
|
+
if (dispersionCalc.messages.length > 0) {
|
|
108
|
+
console.log("Messages:");
|
|
109
|
+
dispersionCalc.messages.forEach((message) => console.log(message));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
113
|
+
|
|
114
|
+
// Define flammable parameters
|
|
115
|
+
const flammableParams = new FlammableParameters({
|
|
116
|
+
poolFireType: PoolFireType.LATE,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// Run pool fire calculation
|
|
120
|
+
const poolFireCalc = new PoolFireCalculation(
|
|
121
|
+
vesselLeakCalc.exitMaterial!,
|
|
122
|
+
dispersionCalc.poolRecords!,
|
|
123
|
+
dispersionCalc.poolRecords!.length,
|
|
124
|
+
weather,
|
|
125
|
+
substrate,
|
|
126
|
+
flammableParams
|
|
127
|
+
);
|
|
128
|
+
resultCode = await poolFireCalc.run();
|
|
129
|
+
|
|
130
|
+
if (poolFireCalc.messages.length > 0) {
|
|
131
|
+
console.log("Messages:");
|
|
132
|
+
poolFireCalc.messages.forEach((message) => console.log(message));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
136
|
+
|
|
137
|
+
// Define flammable output config
|
|
138
|
+
const flammableOutputConfigs = [0.0, 1.0, 2.0].map((z) => {
|
|
139
|
+
return new FlammableOutputConfig({
|
|
140
|
+
position: new LocalPosition({ x: 0.0, y: 0.0, z }),
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// Run distances and ellipses to radiation levels for pool fires calculation
|
|
145
|
+
const radiationCalc = new DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation(
|
|
146
|
+
poolFireCalc.poolFireFlameResult!,
|
|
147
|
+
poolFireCalc.flameRecords!,
|
|
148
|
+
poolFireCalc.flameRecords!.length,
|
|
149
|
+
weather,
|
|
150
|
+
flammableParams,
|
|
151
|
+
flammableOutputConfigs,
|
|
152
|
+
flammableOutputConfigs.length
|
|
153
|
+
);
|
|
154
|
+
resultCode = await radiationCalc.run();
|
|
155
|
+
|
|
156
|
+
if (radiationCalc.messages.length > 0) {
|
|
157
|
+
console.log("Messages:");
|
|
158
|
+
radiationCalc.messages.forEach((message) => console.log(message));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
162
|
+
|
|
163
|
+
// Assertions for regression results
|
|
164
|
+
expect(radiationCalc.contourPoints!.length!).toBe(150);
|
|
165
|
+
expect(Math.abs((radiationCalc.contourPoints![radiationCalc.contourPoints!.length - 1].x - 57.57741153697067) / 57.57741153697067)).toBeLessThan(1e-3);
|
|
166
|
+
expect(Math.abs((radiationCalc.poolFireFlameResult.flameDiameter! - 36.82126235961914) / 36.82126235961914)).toBeLessThan(1e-3);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { PoolFireCalculation } from "../../src/calculations/poolFire";
|
|
4
|
+
import { 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 - Case 42A", () => {
|
|
17
|
+
test("should complete all calculation steps and validate results", async () => {
|
|
18
|
+
const stateTemperature = 250.0;
|
|
19
|
+
const statePressure = 5.0e5;
|
|
20
|
+
const vesselShape = VesselShape.VERTICAL_CYLINDER;
|
|
21
|
+
const vesselHeight = 3.0;
|
|
22
|
+
const vesselDiameter = 1.5;
|
|
23
|
+
const leakHoleDiameter = 0.1;
|
|
24
|
+
const timeVaryingOption = TimeVaryingOption.TIME_VARYING_RATE;
|
|
25
|
+
const leakHoleHeightFraction = 0.0;
|
|
26
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
27
|
+
|
|
28
|
+
const state = new State({
|
|
29
|
+
temperature: stateTemperature,
|
|
30
|
+
pressure: statePressure,
|
|
31
|
+
liquidFraction: 0.0,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const material = new Material({
|
|
35
|
+
name: "N-OCTANE+N-HEPTANE",
|
|
36
|
+
components: [
|
|
37
|
+
new MaterialComponent({ name: "N-OCTANE", moleFraction: 0.5 }),
|
|
38
|
+
new MaterialComponent({ name: "N-HEPTANE", moleFraction: 0.5 }),
|
|
39
|
+
],
|
|
40
|
+
componentCount: 2,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
44
|
+
let resultCode = await vesselStateCalc.run();
|
|
45
|
+
|
|
46
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
47
|
+
console.log("Messages:");
|
|
48
|
+
vesselStateCalc.messages.forEach((m) => console.log(m));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
52
|
+
|
|
53
|
+
const vessel = new Vessel({
|
|
54
|
+
state: vesselStateCalc.outputState,
|
|
55
|
+
material: vesselStateCalc.material,
|
|
56
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
57
|
+
diameter: vesselDiameter,
|
|
58
|
+
height: vesselHeight,
|
|
59
|
+
shape: vesselShape,
|
|
60
|
+
liquidFillFractionByVolume: 0.8,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const leak = new Leak({
|
|
64
|
+
holeDiameter: leakHoleDiameter,
|
|
65
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
66
|
+
timeVaryingOption,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const dischargeParams = new DischargeParameters();
|
|
70
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
71
|
+
resultCode = await vesselLeakCalc.run();
|
|
72
|
+
|
|
73
|
+
if (vesselLeakCalc.messages.length > 0) {
|
|
74
|
+
console.log("Messages:");
|
|
75
|
+
vesselLeakCalc.messages.forEach((m) => console.log(m));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
79
|
+
|
|
80
|
+
const weather = new Weather({
|
|
81
|
+
windSpeed: 2.0,
|
|
82
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_E,
|
|
83
|
+
windProfileFlag: windProfileFlag
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const substrate = new Substrate();
|
|
87
|
+
|
|
88
|
+
const dispersionCalc = new DispersionCalculation(
|
|
89
|
+
vesselLeakCalc.exitMaterial!,
|
|
90
|
+
substrate,
|
|
91
|
+
vesselLeakCalc.dischargeResult!,
|
|
92
|
+
vesselLeakCalc.dischargeRecords!,
|
|
93
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
94
|
+
weather,
|
|
95
|
+
new DispersionParameters(),
|
|
96
|
+
0.0
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
resultCode = await dispersionCalc.run();
|
|
100
|
+
|
|
101
|
+
if (dispersionCalc.messages.length > 0) {
|
|
102
|
+
console.log("Messages:");
|
|
103
|
+
dispersionCalc.messages.forEach((m) => console.log(m));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
107
|
+
|
|
108
|
+
const flammableParams = new FlammableParameters({
|
|
109
|
+
poolFireType: PoolFireType.LATE,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const poolFireCalc = new PoolFireCalculation(
|
|
113
|
+
vesselLeakCalc.exitMaterial!,
|
|
114
|
+
dispersionCalc.poolRecords!,
|
|
115
|
+
dispersionCalc.poolRecords!.length,
|
|
116
|
+
weather,
|
|
117
|
+
substrate,
|
|
118
|
+
flammableParams
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
resultCode = await poolFireCalc.run();
|
|
122
|
+
|
|
123
|
+
if (poolFireCalc.messages.length > 0) {
|
|
124
|
+
console.log("Messages:");
|
|
125
|
+
poolFireCalc.messages.forEach((m) => console.log(m));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
129
|
+
|
|
130
|
+
const flammableOutputConfigs = [
|
|
131
|
+
{ x: 0.0, y: 0.0, z: 0.0 },
|
|
132
|
+
{ x: 0.0, y: 0.0, z: 1.0 },
|
|
133
|
+
{ x: 0.0, y: 0.0, z: 2.0 },
|
|
134
|
+
].map(({ x, y, z }) => {
|
|
135
|
+
return new FlammableOutputConfig({
|
|
136
|
+
position: new LocalPosition({ x, y, z })
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const radiationCalc = new RadiationAtPointsForPoolFiresCalculation(
|
|
141
|
+
poolFireCalc.poolFireFlameResult!,
|
|
142
|
+
poolFireCalc.flameRecords!,
|
|
143
|
+
poolFireCalc.flameRecords!.length,
|
|
144
|
+
weather,
|
|
145
|
+
flammableParams,
|
|
146
|
+
flammableOutputConfigs,
|
|
147
|
+
flammableOutputConfigs.length
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
resultCode = await radiationCalc.run();
|
|
151
|
+
|
|
152
|
+
if (radiationCalc.messages.length > 0) {
|
|
153
|
+
console.log("Messages:");
|
|
154
|
+
radiationCalc.messages.forEach((m) => console.log(m));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
158
|
+
|
|
159
|
+
// Regression assertions
|
|
160
|
+
const expectedRadiation = 138315.75;
|
|
161
|
+
const actualRadiation = radiationCalc.radiation![0];
|
|
162
|
+
|
|
163
|
+
expect(
|
|
164
|
+
Math.abs((actualRadiation - expectedRadiation) / expectedRadiation)
|
|
165
|
+
).toBeLessThan(1e-3);
|
|
166
|
+
|
|
167
|
+
const expectedFlameDiameter = 36.82126235961914;
|
|
168
|
+
const actualFlameDiameter = radiationCalc.poolFireFlameResult.flameDiameter!;
|
|
169
|
+
|
|
170
|
+
expect(
|
|
171
|
+
Math.abs((actualFlameDiameter - expectedFlameDiameter) / expectedFlameDiameter)
|
|
172
|
+
).toBeLessThan(1e-3);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|