@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,157 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, Weather, Substrate, DischargeParameters, DispersionParameters, DispersionOutputConfig, ExplosionParameters, ExplosionOutputConfig, ExplosionConfinedVolume } from "../../src/entities";
|
|
2
|
+
import { VesselStateCalculation, VesselCatastrophicRuptureCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { LateExplosionToOPLevelsCalculation } from "../../src/calculations/lateExplosion";
|
|
5
|
+
import { ResultCode, AtmosphericStabilityClass, SpecialConcentration, WindProfileFlag } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Integrated Explosion Scenario - Test Case 46", () => {
|
|
16
|
+
test("should run the full explosion scenario and perform regression check", async () => {
|
|
17
|
+
// Define material
|
|
18
|
+
const material = new Material(
|
|
19
|
+
{
|
|
20
|
+
name: "N-HEXANE",
|
|
21
|
+
components: [
|
|
22
|
+
new MaterialComponent({ name: "N-HEXANE", moleFraction: 1.0 }),
|
|
23
|
+
]
|
|
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
|
+
|
|
34
|
+
console.log("Running vesselStateCalculation...");
|
|
35
|
+
let resultCode = await vesselStateCalc.run();
|
|
36
|
+
|
|
37
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
38
|
+
console.log("Messages:");
|
|
39
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
43
|
+
console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
44
|
+
|
|
45
|
+
const vessel = new Vessel({
|
|
46
|
+
state,
|
|
47
|
+
material,
|
|
48
|
+
liquidFillFractionByVolume: 0.8,
|
|
49
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const dischargeParams = new DischargeParameters();
|
|
53
|
+
|
|
54
|
+
const ruptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
|
|
55
|
+
|
|
56
|
+
console.log("Running vesselCatastrophicRuptureCalculation...");
|
|
57
|
+
resultCode = await ruptureCalc.run();
|
|
58
|
+
|
|
59
|
+
if (ruptureCalc.messages.length > 0) {
|
|
60
|
+
console.log("Messages:");
|
|
61
|
+
ruptureCalc.messages.forEach((msg) => console.log(msg));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
65
|
+
console.log(`SUCCESS: vesselCatastrophicRuptureCalculation (${ruptureCalc.calculationElapsedTime}ms)`);
|
|
66
|
+
|
|
67
|
+
const exitMaterial = ruptureCalc.exitMaterial!;
|
|
68
|
+
const weather = new Weather({
|
|
69
|
+
windSpeed: 1.5,
|
|
70
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_F,
|
|
71
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const substrate = new Substrate();
|
|
75
|
+
|
|
76
|
+
const dispersionCalc = new DispersionCalculation(
|
|
77
|
+
exitMaterial,
|
|
78
|
+
substrate,
|
|
79
|
+
ruptureCalc.dischargeResult!,
|
|
80
|
+
ruptureCalc.dischargeRecords!,
|
|
81
|
+
1,
|
|
82
|
+
weather,
|
|
83
|
+
new DispersionParameters(),
|
|
84
|
+
0.0,
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
console.log("Running dispersionCalculation...");
|
|
88
|
+
resultCode = await dispersionCalc.run();
|
|
89
|
+
|
|
90
|
+
if (dispersionCalc.messages.length > 0) {
|
|
91
|
+
console.log("Messages:");
|
|
92
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
96
|
+
console.log(`SUCCESS: dispersionCalculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
97
|
+
|
|
98
|
+
const explosionParams = new ExplosionParameters({ explosionUniformStrength: 7.0 });
|
|
99
|
+
|
|
100
|
+
const explosionOutputConfigs = [
|
|
101
|
+
new ExplosionOutputConfig({ overpressureLevel: 1034 }),
|
|
102
|
+
new ExplosionOutputConfig({ overpressureLevel: 2068 }),
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
const explosionConfinedVolumes = [
|
|
106
|
+
new ExplosionConfinedVolume(),
|
|
107
|
+
new ExplosionConfinedVolume(),
|
|
108
|
+
];
|
|
109
|
+
|
|
110
|
+
const explosionOutputConfig = new DispersionOutputConfig({
|
|
111
|
+
concentration: 0.0,
|
|
112
|
+
specialConcentration: SpecialConcentration.MIN,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const explosionCalc = new LateExplosionToOPLevelsCalculation(
|
|
116
|
+
exitMaterial,
|
|
117
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
118
|
+
weather,
|
|
119
|
+
dispersionCalc.dispersionRecords!,
|
|
120
|
+
dispersionCalc.dispersionRecords!.length,
|
|
121
|
+
substrate,
|
|
122
|
+
explosionOutputConfig,
|
|
123
|
+
explosionOutputConfigs,
|
|
124
|
+
explosionOutputConfigs.length,
|
|
125
|
+
explosionParams,
|
|
126
|
+
explosionConfinedVolumes,
|
|
127
|
+
explosionConfinedVolumes.length,
|
|
128
|
+
new DispersionParameters(),
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
console.log("Running lateExplosionToOPLevelsCalculation...");
|
|
132
|
+
resultCode = await explosionCalc.run();
|
|
133
|
+
|
|
134
|
+
if (explosionCalc.messages.length > 0) {
|
|
135
|
+
console.log("Messages:");
|
|
136
|
+
explosionCalc.messages.forEach((msg) => console.log(msg));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
140
|
+
|
|
141
|
+
const result = explosionCalc.explosionUnifConfOverpressureResults![0];
|
|
142
|
+
const expectedMass = 11.67432824752745;
|
|
143
|
+
const expectedTime = 1.743456345845083;
|
|
144
|
+
const expectedDistance = 193.98838586988907;
|
|
145
|
+
|
|
146
|
+
const massError = Math.abs((result.explodedMass! - expectedMass) / expectedMass);
|
|
147
|
+
const timeError = Math.abs((result.ignitionTime! - expectedTime) / expectedTime);
|
|
148
|
+
const distanceError = Math.abs((result.maximumDistance! - expectedDistance) / expectedDistance);
|
|
149
|
+
|
|
150
|
+
expect(massError).toBeLessThan(1e-3);
|
|
151
|
+
expect(timeError).toBeLessThan(1e-3);
|
|
152
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
153
|
+
|
|
154
|
+
console.log(`SUCCESS: lateExplosionToOPLevelsCalculation (${explosionCalc.calculationElapsedTime}ms)`);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, Weather, Substrate, DischargeParameters, DispersionParameters, DispersionOutputConfig, ExplosionParameters, ExplosionOutputConfig, ExplosionConfinedVolume } from "../../src/entities";
|
|
2
|
+
import { VesselStateCalculation, VesselCatastrophicRuptureCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { LateExplosionToOPLevelsCalculation } from "../../src/calculations/lateExplosion";
|
|
5
|
+
import { ResultCode, AtmosphericStabilityClass, SpecialConcentration, WindProfileFlag } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Integrated Explosion Scenario - Test Case 47", () => {
|
|
16
|
+
test("should run the full explosion scenario and perform regression check", async () => {
|
|
17
|
+
// Define material
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: "AMMONIA",
|
|
20
|
+
components: [new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 })],
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const state = new State({
|
|
24
|
+
temperature: 265.0,
|
|
25
|
+
pressure: 5.0e5,
|
|
26
|
+
liquidFraction: 0.8,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Create vessel state calculation
|
|
30
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
31
|
+
console.log("Running vesselStateCalculation...");
|
|
32
|
+
let resultCode = await vesselStateCalc.run();
|
|
33
|
+
|
|
34
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
35
|
+
console.log("Messages:");
|
|
36
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
40
|
+
console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
41
|
+
|
|
42
|
+
const vessel = new Vessel({
|
|
43
|
+
state,
|
|
44
|
+
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
|
+
console.log("Running vesselCatastrophicRuptureCalculation...");
|
|
53
|
+
resultCode = await ruptureCalc.run();
|
|
54
|
+
|
|
55
|
+
if (ruptureCalc.messages.length > 0) {
|
|
56
|
+
console.log("Messages:");
|
|
57
|
+
ruptureCalc.messages.forEach((msg) => console.log(msg));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
61
|
+
console.log(`SUCCESS: vesselCatastrophicRuptureCalculation (${ruptureCalc.calculationElapsedTime}ms)`);
|
|
62
|
+
|
|
63
|
+
const exitMaterial = ruptureCalc.exitMaterial!;
|
|
64
|
+
const weather = new Weather({
|
|
65
|
+
windSpeed: 10.0,
|
|
66
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_A_,
|
|
67
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const substrate = new Substrate();
|
|
71
|
+
|
|
72
|
+
// Create a dispersion calculation
|
|
73
|
+
const dispersionCalc = new DispersionCalculation(
|
|
74
|
+
exitMaterial,
|
|
75
|
+
substrate,
|
|
76
|
+
ruptureCalc.dischargeResult!,
|
|
77
|
+
ruptureCalc.dischargeRecords!,
|
|
78
|
+
ruptureCalc.dischargeRecords!.length,
|
|
79
|
+
weather,
|
|
80
|
+
new DispersionParameters(),
|
|
81
|
+
0.0
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
console.log("Running dispersionCalculation...");
|
|
85
|
+
resultCode = await dispersionCalc.run();
|
|
86
|
+
|
|
87
|
+
if (dispersionCalc.messages.length > 0) {
|
|
88
|
+
console.log("Messages:");
|
|
89
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
93
|
+
console.log(`SUCCESS: dispersionCalculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
94
|
+
|
|
95
|
+
// Define the explosion parameters and configurations
|
|
96
|
+
const explosionParams = new ExplosionParameters({ explosionUniformStrength: 7.0 });
|
|
97
|
+
const explosionOutputConfigs = [
|
|
98
|
+
new ExplosionOutputConfig({ overpressureLevel: 1034 }),
|
|
99
|
+
new ExplosionOutputConfig({ overpressureLevel: 2068 }),
|
|
100
|
+
];
|
|
101
|
+
const explosionConfinedVolumes = [new ExplosionConfinedVolume(), new ExplosionConfinedVolume()];
|
|
102
|
+
const dispersionOutputConfig = new DispersionOutputConfig({
|
|
103
|
+
concentration: 0.0,
|
|
104
|
+
specialConcentration: SpecialConcentration.MIN,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Create explosion calculation
|
|
108
|
+
const explosionCalc = new LateExplosionToOPLevelsCalculation(
|
|
109
|
+
exitMaterial,
|
|
110
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
111
|
+
weather,
|
|
112
|
+
dispersionCalc.dispersionRecords!,
|
|
113
|
+
dispersionCalc.dispersionRecords!.length,
|
|
114
|
+
substrate,
|
|
115
|
+
dispersionOutputConfig,
|
|
116
|
+
explosionOutputConfigs,
|
|
117
|
+
explosionOutputConfigs.length,
|
|
118
|
+
explosionParams,
|
|
119
|
+
explosionConfinedVolumes,
|
|
120
|
+
explosionConfinedVolumes.length,
|
|
121
|
+
new DispersionParameters()
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
console.log("Running lateExplosionToOPLevelsCalculation...");
|
|
125
|
+
resultCode = await explosionCalc.run();
|
|
126
|
+
|
|
127
|
+
if (explosionCalc.messages.length > 0) {
|
|
128
|
+
console.log("Messages:");
|
|
129
|
+
explosionCalc.messages.forEach((msg) => console.log(msg));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
133
|
+
|
|
134
|
+
const result = explosionCalc.explosionUnifConfOverpressureResults![0];
|
|
135
|
+
const expectedMass = 1005.575405356289;
|
|
136
|
+
const expectedTime = 0.5886114409418679;
|
|
137
|
+
const expectedDistance = 626.5034456922325;
|
|
138
|
+
|
|
139
|
+
const massError = Math.abs((result.explodedMass! - expectedMass) / expectedMass);
|
|
140
|
+
const timeError = Math.abs((result.ignitionTime! - expectedTime) / expectedTime);
|
|
141
|
+
const distanceError = Math.abs((result.maximumDistance! - expectedDistance) / expectedDistance);
|
|
142
|
+
|
|
143
|
+
expect(massError).toBeLessThan(1e-3);
|
|
144
|
+
expect(timeError).toBeLessThan(1e-3);
|
|
145
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
146
|
+
|
|
147
|
+
console.log(`SUCCESS: lateExplosionToOPLevelsCalculation (${explosionCalc.calculationElapsedTime}ms)`);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, ReliefValve, Vessel, Weather, Substrate, DischargeParameters, DispersionParameters, DispersionOutputConfig, ExplosionParameters, ExplosionOutputConfig, ExplosionConfinedVolume } from "../../src/entities";
|
|
2
|
+
import { VesselStateCalculation, VesselReliefValveCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { LateExplosionToOPLevelsCalculation } from "../../src/calculations/lateExplosion";
|
|
5
|
+
import { ResultCode, AtmosphericStabilityClass, SpecialConcentration, VesselShape, WindProfileFlag } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Integrated Explosion Scenario - Test Case 48", () => {
|
|
16
|
+
test("should run the full explosion scenario and perform regression check", async () => {
|
|
17
|
+
// Define the initial state of the vessel
|
|
18
|
+
const state = new State({
|
|
19
|
+
temperature: 270.0,
|
|
20
|
+
pressure: 8e6,
|
|
21
|
+
liquidFraction: 1.0
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// Define the material contained by the vessel
|
|
25
|
+
const material = new Material({
|
|
26
|
+
name: "HYDROGEN",
|
|
27
|
+
components: [new MaterialComponent({ name: "HYDROGEN", moleFraction: 1.0 })]
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Create and run vessel state calculation
|
|
31
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
32
|
+
|
|
33
|
+
console.log("Running vesselStateCalculation...");
|
|
34
|
+
let resultCode = await vesselStateCalc.run();
|
|
35
|
+
|
|
36
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
37
|
+
console.log("Messages:");
|
|
38
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
42
|
+
console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
43
|
+
|
|
44
|
+
// Create vessel (sphere with 5m diameter)
|
|
45
|
+
const vessel = new Vessel({
|
|
46
|
+
state,
|
|
47
|
+
material,
|
|
48
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
49
|
+
liquidFillFractionByVolume: 0.7,
|
|
50
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
51
|
+
diameter: 5
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Create relief valve
|
|
55
|
+
const reliefValve = new ReliefValve({
|
|
56
|
+
pipeDiameter: 0.5,
|
|
57
|
+
pipeLength: 1.0,
|
|
58
|
+
pipeHeightFraction: 1,
|
|
59
|
+
reliefValveConstrictionDiameter: 0.25
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Create and run vessel relief valve calculation
|
|
63
|
+
const reliefValveCalc = new VesselReliefValveCalculation(vessel, reliefValve, new DischargeParameters());
|
|
64
|
+
|
|
65
|
+
console.log("Running vesselReliefValveCalculation...");
|
|
66
|
+
resultCode = await reliefValveCalc.run();
|
|
67
|
+
|
|
68
|
+
if (reliefValveCalc.messages.length > 0) {
|
|
69
|
+
console.log("Messages:");
|
|
70
|
+
reliefValveCalc.messages.forEach((msg) => console.log(msg));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
74
|
+
console.log(`SUCCESS: vesselReliefValveCalculation (${reliefValveCalc.calculationElapsedTime}ms)`);
|
|
75
|
+
console.log(`vesselReliefValveCalculation.dischargeResult.releaseMass: ${reliefValveCalc.dischargeResult!.releaseMass} [kg]`);
|
|
76
|
+
|
|
77
|
+
const exitMaterial = reliefValveCalc.exitMaterial!;
|
|
78
|
+
|
|
79
|
+
// Define weather
|
|
80
|
+
const weather = new Weather({
|
|
81
|
+
windSpeed: 1.5,
|
|
82
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_F,
|
|
83
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Define substrate
|
|
87
|
+
const substrate = new Substrate();
|
|
88
|
+
|
|
89
|
+
// Create and run dispersion calculation
|
|
90
|
+
const dispersionCalc = new DispersionCalculation(
|
|
91
|
+
exitMaterial,
|
|
92
|
+
substrate,
|
|
93
|
+
reliefValveCalc.dischargeResult!,
|
|
94
|
+
reliefValveCalc.dischargeRecords!,
|
|
95
|
+
reliefValveCalc.dischargeRecords!.length,
|
|
96
|
+
weather,
|
|
97
|
+
new DispersionParameters(),
|
|
98
|
+
0.0
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
console.log("Running dispersionCalculation...");
|
|
102
|
+
resultCode = await dispersionCalc.run();
|
|
103
|
+
|
|
104
|
+
if (dispersionCalc.messages.length > 0) {
|
|
105
|
+
console.log("Messages:");
|
|
106
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
110
|
+
console.log(`SUCCESS: dispersionCalculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
111
|
+
|
|
112
|
+
// Define explosion configurations
|
|
113
|
+
const dispersionOutputConfig = new DispersionOutputConfig({
|
|
114
|
+
concentration: 0.0,
|
|
115
|
+
specialConcentration: SpecialConcentration.MIN
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const explosionParams = new ExplosionParameters({
|
|
119
|
+
explosionUniformStrength: 10.0
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const explosionOutputConfigs = [
|
|
123
|
+
new ExplosionOutputConfig({ overpressureLevel: 1034 }),
|
|
124
|
+
new ExplosionOutputConfig({ overpressureLevel: 2068 }),
|
|
125
|
+
new ExplosionOutputConfig({ overpressureLevel: 4136 })
|
|
126
|
+
];
|
|
127
|
+
|
|
128
|
+
const explosionConfinedVolumes = [
|
|
129
|
+
new ExplosionConfinedVolume(),
|
|
130
|
+
new ExplosionConfinedVolume()
|
|
131
|
+
];
|
|
132
|
+
|
|
133
|
+
// Create and run explosion calculation
|
|
134
|
+
const explosionCalc = new LateExplosionToOPLevelsCalculation(
|
|
135
|
+
exitMaterial,
|
|
136
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
137
|
+
weather,
|
|
138
|
+
dispersionCalc.dispersionRecords!,
|
|
139
|
+
dispersionCalc.dispersionRecords!.length,
|
|
140
|
+
substrate,
|
|
141
|
+
dispersionOutputConfig,
|
|
142
|
+
explosionOutputConfigs,
|
|
143
|
+
explosionOutputConfigs.length,
|
|
144
|
+
explosionParams,
|
|
145
|
+
explosionConfinedVolumes,
|
|
146
|
+
explosionConfinedVolumes.length,
|
|
147
|
+
new DispersionParameters()
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
console.log("Running lateExplosionToOPLevelsCalculation...");
|
|
151
|
+
resultCode = await explosionCalc.run();
|
|
152
|
+
|
|
153
|
+
if (explosionCalc.messages.length > 0) {
|
|
154
|
+
console.log("Messages:");
|
|
155
|
+
explosionCalc.messages.forEach((msg) => console.log(msg));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
159
|
+
|
|
160
|
+
// Regression checks
|
|
161
|
+
const result = explosionCalc.explosionUnifConfOverpressureResults![0];
|
|
162
|
+
const expectedMass = 364.4122308301167;
|
|
163
|
+
const expectedTime = 4.444690161422924;
|
|
164
|
+
const expectedDistance = 1024.8207387858251;
|
|
165
|
+
|
|
166
|
+
const massError = Math.abs((result.explodedMass! - expectedMass) / expectedMass);
|
|
167
|
+
const timeError = Math.abs((result.ignitionTime! - expectedTime) / expectedTime);
|
|
168
|
+
const distanceError = Math.abs((result.maximumDistance! - expectedDistance) / expectedDistance);
|
|
169
|
+
|
|
170
|
+
expect(massError).toBeLessThan(1e-3);
|
|
171
|
+
expect(timeError).toBeLessThan(1e-3);
|
|
172
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
173
|
+
|
|
174
|
+
console.log(`SUCCESS: lateExplosionToOPLevelsCalculation (${explosionCalc.calculationElapsedTime}ms)`);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, LineRupture, Weather, Substrate, DischargeParameters, DispersionParameters, DispersionOutputConfig, ExplosionParameters, ExplosionOutputConfig, ExplosionConfinedVolume } from "../../src/entities";
|
|
2
|
+
import { VesselStateCalculation, VesselLineRuptureCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { LateExplosionToOPLevelsCalculation } from "../../src/calculations/lateExplosion";
|
|
5
|
+
import { ResultCode, AtmosphericStabilityClass, SpecialConcentration, VesselShape, WindProfileFlag } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Integrated Explosion Scenario - Test Case 49", () => {
|
|
16
|
+
test("should run the full explosion scenario and perform regression check", async () => {
|
|
17
|
+
// Define the initial state of the vessel
|
|
18
|
+
const state = new State({
|
|
19
|
+
temperature: 260.0,
|
|
20
|
+
pressure: 5e5,
|
|
21
|
+
liquidFraction: 1.0
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// Define the material contained by the vessel
|
|
25
|
+
const material = new Material({
|
|
26
|
+
name: "ETHANE_METHANE_HY",
|
|
27
|
+
components: [
|
|
28
|
+
new MaterialComponent({ name: "ETHANE", moleFraction: 0.15 }),
|
|
29
|
+
new MaterialComponent({ name: "METHANE", moleFraction: 0.8 }),
|
|
30
|
+
new MaterialComponent({ name: "HYDROGEN", moleFraction: 0.05 })
|
|
31
|
+
],
|
|
32
|
+
componentCount: 3
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Create and run vessel state calculation
|
|
36
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
37
|
+
|
|
38
|
+
console.log("Running vesselStateCalculation...");
|
|
39
|
+
let resultCode = await vesselStateCalc.run();
|
|
40
|
+
|
|
41
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
42
|
+
console.log("Messages:");
|
|
43
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
47
|
+
console.log(`SUCCESS: vesselStateCalculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
48
|
+
|
|
49
|
+
// Create vessel (sphere with 3m diameter)
|
|
50
|
+
const vessel = new Vessel({
|
|
51
|
+
state,
|
|
52
|
+
material,
|
|
53
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
54
|
+
liquidFillFractionByVolume: 0.7,
|
|
55
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
56
|
+
diameter: 3
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Create line rupture
|
|
60
|
+
const lineRupture = new LineRupture({
|
|
61
|
+
pipeDiameter: 0.5,
|
|
62
|
+
pipeLength: 1.0,
|
|
63
|
+
pipeHeightFraction: 0.5
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Create and run vessel line rupture calculation
|
|
67
|
+
const lineRuptureCalc = new VesselLineRuptureCalculation(vessel, lineRupture, new DischargeParameters());
|
|
68
|
+
|
|
69
|
+
console.log("Running vesselLineRuptureCalculation...");
|
|
70
|
+
resultCode = await lineRuptureCalc.run();
|
|
71
|
+
|
|
72
|
+
if (lineRuptureCalc.messages.length > 0) {
|
|
73
|
+
console.log("Messages:");
|
|
74
|
+
lineRuptureCalc.messages.forEach((msg) => console.log(msg));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
78
|
+
console.log(`SUCCESS: vesselLineRuptureCalculation (${lineRuptureCalc.calculationElapsedTime}ms)`);
|
|
79
|
+
console.log(`vesselLineRuptureCalculation.dischargeResult.releaseMass: ${lineRuptureCalc.dischargeResult!.releaseMass} [kg]`);
|
|
80
|
+
|
|
81
|
+
const exitMaterial = lineRuptureCalc.exitMaterial!;
|
|
82
|
+
|
|
83
|
+
// Define weather
|
|
84
|
+
const weather = new Weather({
|
|
85
|
+
windSpeed: 1.5,
|
|
86
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_F,
|
|
87
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Define substrate
|
|
91
|
+
const substrate = new Substrate();
|
|
92
|
+
|
|
93
|
+
// Create and run dispersion calculation
|
|
94
|
+
const dispersionCalc = new DispersionCalculation(
|
|
95
|
+
exitMaterial,
|
|
96
|
+
substrate,
|
|
97
|
+
lineRuptureCalc.dischargeResult!,
|
|
98
|
+
lineRuptureCalc.dischargeRecords!,
|
|
99
|
+
lineRuptureCalc.dischargeRecords!.length,
|
|
100
|
+
weather,
|
|
101
|
+
new DispersionParameters(),
|
|
102
|
+
0.0
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
console.log("Running dispersionCalculation...");
|
|
106
|
+
resultCode = await dispersionCalc.run();
|
|
107
|
+
|
|
108
|
+
if (dispersionCalc.messages.length > 0) {
|
|
109
|
+
console.log("Messages:");
|
|
110
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
114
|
+
console.log(`SUCCESS: dispersionCalculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
115
|
+
|
|
116
|
+
// Define explosion configurations
|
|
117
|
+
const dispersionOutputConfig = new DispersionOutputConfig({
|
|
118
|
+
concentration: 0.0,
|
|
119
|
+
specialConcentration: SpecialConcentration.MIN
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const explosionParams = new ExplosionParameters({
|
|
123
|
+
explosionUniformStrength: 8.0
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
const explosionOutputConfigs = [
|
|
127
|
+
new ExplosionOutputConfig({ overpressureLevel: 20680 })
|
|
128
|
+
];
|
|
129
|
+
|
|
130
|
+
const explosionConfinedVolumes = [
|
|
131
|
+
new ExplosionConfinedVolume(),
|
|
132
|
+
new ExplosionConfinedVolume()
|
|
133
|
+
];
|
|
134
|
+
|
|
135
|
+
// Create and run explosion calculation
|
|
136
|
+
const explosionCalc = new LateExplosionToOPLevelsCalculation(
|
|
137
|
+
exitMaterial,
|
|
138
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
139
|
+
weather,
|
|
140
|
+
dispersionCalc.dispersionRecords!,
|
|
141
|
+
dispersionCalc.dispersionRecords!.length,
|
|
142
|
+
substrate,
|
|
143
|
+
dispersionOutputConfig,
|
|
144
|
+
explosionOutputConfigs,
|
|
145
|
+
explosionOutputConfigs.length,
|
|
146
|
+
explosionParams,
|
|
147
|
+
explosionConfinedVolumes,
|
|
148
|
+
explosionConfinedVolumes.length,
|
|
149
|
+
new DispersionParameters()
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
console.log("Running lateExplosionToOPLevelsCalculation...");
|
|
153
|
+
resultCode = await explosionCalc.run();
|
|
154
|
+
|
|
155
|
+
if (explosionCalc.messages.length > 0) {
|
|
156
|
+
console.log("Messages:");
|
|
157
|
+
explosionCalc.messages.forEach((msg) => console.log(msg));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
161
|
+
|
|
162
|
+
// Regression checks
|
|
163
|
+
const result = explosionCalc.explosionUnifConfOverpressureResults![0];
|
|
164
|
+
const expectedMass = 31.04536142489174;
|
|
165
|
+
const expectedTime = 1.1859455812737545;
|
|
166
|
+
const expectedDistance = 70.52548140876165;
|
|
167
|
+
|
|
168
|
+
const massError = Math.abs((result.explodedMass! - expectedMass) / expectedMass);
|
|
169
|
+
const timeError = Math.abs((result.ignitionTime! - expectedTime) / expectedTime);
|
|
170
|
+
const distanceError = Math.abs((result.maximumDistance! - expectedDistance) / expectedDistance);
|
|
171
|
+
|
|
172
|
+
expect(massError).toBeLessThan(1e-3);
|
|
173
|
+
expect(timeError).toBeLessThan(1e-3);
|
|
174
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
175
|
+
|
|
176
|
+
console.log(`SUCCESS: lateExplosionToOPLevelsCalculation (${explosionCalc.calculationElapsedTime}ms)`);
|
|
177
|
+
});
|
|
178
|
+
});
|