@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,151 @@
|
|
|
1
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation, } from "../../src/calculations/discharge";
|
|
2
|
+
import { FireballCalculation } from "../../src/calculations/fireball";
|
|
3
|
+
import { RadiationTransectCalculation, } from "../../src/calculations/radiation";
|
|
4
|
+
import { DischargeParameters, FlammableOutputConfig, FlammableParameters, LocalPosition, Material, MaterialComponent, State, Transect, Vessel, Weather } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, Resolution, ResultCode, VesselShape, VesselConditions } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Test Case 89 - Vessel and Fireball Scenario", () => {
|
|
16
|
+
test("should run vessel and fireball calculations with regression checks", async () => {
|
|
17
|
+
// Define material and state
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: "AMMONIA",
|
|
20
|
+
components: [new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 })],
|
|
21
|
+
componentCount: 1,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const state = new State({
|
|
25
|
+
temperature: 250.0,
|
|
26
|
+
pressure: 5.0e6,
|
|
27
|
+
liquidFraction: 0.8,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Vessel state calculation
|
|
31
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
32
|
+
|
|
33
|
+
console.log("Running vessel_state_calculation...");
|
|
34
|
+
const vesselStateResult = 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(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
42
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
43
|
+
|
|
44
|
+
// Define vessel
|
|
45
|
+
const vessel = new Vessel({
|
|
46
|
+
state,
|
|
47
|
+
material,
|
|
48
|
+
liquidFillFractionByVolume: 0.8,
|
|
49
|
+
diameter: 2.0,
|
|
50
|
+
length: 5,
|
|
51
|
+
shape: VesselShape.HORIZONTAL_CYLINDER,
|
|
52
|
+
vesselConditions: vesselStateCalc.vesselConditions as VesselConditions,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Vessel catastrophic rupture calculation
|
|
56
|
+
const dischargeParams = new DischargeParameters();
|
|
57
|
+
const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(
|
|
58
|
+
vessel,
|
|
59
|
+
dischargeParams
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
console.log("Running vessel_catastrophic_rupture_calculation...");
|
|
63
|
+
const ruptureResult = await vesselRuptureCalc.run();
|
|
64
|
+
|
|
65
|
+
if (vesselRuptureCalc.messages.length > 0) {
|
|
66
|
+
console.log("Messages:");
|
|
67
|
+
vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
expect(ruptureResult).toBe(ResultCode.SUCCESS);
|
|
71
|
+
console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
|
|
72
|
+
|
|
73
|
+
const exitMaterial = vesselRuptureCalc.exitMaterial;
|
|
74
|
+
|
|
75
|
+
// Define weather
|
|
76
|
+
const weather = new Weather({
|
|
77
|
+
windSpeed: 1.5,
|
|
78
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_F,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Fireball calculation
|
|
82
|
+
const fireballCalc = new FireballCalculation(
|
|
83
|
+
exitMaterial!,
|
|
84
|
+
state,
|
|
85
|
+
vesselRuptureCalc.dischargeRecords!,
|
|
86
|
+
vesselRuptureCalc.dischargeRecords!.length,
|
|
87
|
+
vesselRuptureCalc.dischargeResult!,
|
|
88
|
+
weather,
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
console.log("Running fireball_calculation...");
|
|
92
|
+
const fireballResult = await fireballCalc.run();
|
|
93
|
+
|
|
94
|
+
if (fireballCalc.messages.length > 0) {
|
|
95
|
+
console.log("Messages:");
|
|
96
|
+
fireballCalc.messages.forEach((msg) => console.log(msg));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
expect(fireballResult).toBe(ResultCode.SUCCESS);
|
|
100
|
+
console.log(`SUCCESS: fireball_calculation (${fireballCalc.calculationElapsedTime}ms)`);
|
|
101
|
+
|
|
102
|
+
// Radiation transect calculation
|
|
103
|
+
const radiationResolution = Resolution.MEDIUM;
|
|
104
|
+
const transect = new Transect({
|
|
105
|
+
transectStartPoint: new LocalPosition({ x: 10.0, y: 0.0, z: 1.0 }),
|
|
106
|
+
transectEndPoint: new LocalPosition({ x: 10.0, y: 0.0, z: 50.0 }),
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
const flammableOutputConfig = new FlammableOutputConfig({
|
|
110
|
+
position: new LocalPosition(),
|
|
111
|
+
transect,
|
|
112
|
+
radiationResolution,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const radiationCalc = new RadiationTransectCalculation(
|
|
116
|
+
fireballCalc.flameResult!,
|
|
117
|
+
fireballCalc.flameRecords!,
|
|
118
|
+
fireballCalc.flameRecords!.length,
|
|
119
|
+
weather,
|
|
120
|
+
new FlammableParameters(),
|
|
121
|
+
flammableOutputConfig,
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
console.log("Running radiation_transect_calculation...");
|
|
125
|
+
const radiationResult = 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(radiationResult).toBe(ResultCode.SUCCESS);
|
|
133
|
+
|
|
134
|
+
// Regression checks
|
|
135
|
+
const flameDiameterError = Math.abs(
|
|
136
|
+
(fireballCalc.flameResult!.flameDiameter! - 56.27145004272461) /
|
|
137
|
+
56.27145004272461
|
|
138
|
+
);
|
|
139
|
+
expect(flameDiameterError).toBeLessThan(1e-3);
|
|
140
|
+
|
|
141
|
+
expect(radiationCalc.radiationRecords!.length).toBe(50);
|
|
142
|
+
|
|
143
|
+
const radiationResultError = Math.abs(
|
|
144
|
+
(radiationCalc.radiationRecords![0].radiationResult! - 27343.376825044117) /
|
|
145
|
+
27343.376825044117
|
|
146
|
+
);
|
|
147
|
+
expect(radiationResultError).toBeLessThan(1e-3);
|
|
148
|
+
|
|
149
|
+
console.log(`SUCCESS: radiation_transect_calculation (${radiationCalc.calculationElapsedTime}ms)`);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { FireballCalculation } from "../../src/calculations/fireball";
|
|
3
|
+
import { RadiationTransectCalculation } from "../../src/calculations/radiation";
|
|
4
|
+
import { DischargeParameters, FlammableOutputConfig, FlammableParameters, LocalPosition, Material, MaterialComponent, State, Transect, Vessel, Weather } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, Resolution, ResultCode, VesselShape, VesselConditions } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Test Case 90 - Vessel and Fireball Scenario", () => {
|
|
16
|
+
test("should run vessel and fireball calculations with regression checks", async () => {
|
|
17
|
+
// Define material and state
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: "ETHANE_BUTANE_PROPANE",
|
|
20
|
+
components: [
|
|
21
|
+
new MaterialComponent({ name: "ETHANE", moleFraction: 0.5 }),
|
|
22
|
+
new MaterialComponent({ name: "N-BUTANE", moleFraction: 0.3 }),
|
|
23
|
+
new MaterialComponent({ name: "PROPANE", moleFraction: 0.2 })
|
|
24
|
+
],
|
|
25
|
+
componentCount: 3,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const state = new State({
|
|
29
|
+
temperature: 265.0,
|
|
30
|
+
pressure: 5.0e5,
|
|
31
|
+
liquidFraction: 0.8,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Vessel state calculation
|
|
35
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
36
|
+
|
|
37
|
+
console.log("Running vessel_state_calculation...");
|
|
38
|
+
const vesselStateResult = await vesselStateCalc.run();
|
|
39
|
+
|
|
40
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
41
|
+
console.log("Messages:");
|
|
42
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
expect(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
46
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
47
|
+
|
|
48
|
+
// Define vessel
|
|
49
|
+
const vessel = new Vessel({
|
|
50
|
+
state,
|
|
51
|
+
material,
|
|
52
|
+
liquidFillFractionByVolume: 0.8,
|
|
53
|
+
shape: VesselShape.VERTICAL_CYLINDER,
|
|
54
|
+
vesselConditions: vesselStateCalc.vesselConditions as VesselConditions,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Vessel catastrophic rupture calculation
|
|
58
|
+
const dischargeParams = new DischargeParameters();
|
|
59
|
+
const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(
|
|
60
|
+
vessel,
|
|
61
|
+
dischargeParams
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
console.log("Running vessel_catastrophic_rupture_calculation...");
|
|
65
|
+
const ruptureResult = await vesselRuptureCalc.run();
|
|
66
|
+
|
|
67
|
+
if (vesselRuptureCalc.messages.length > 0) {
|
|
68
|
+
console.log("Messages:");
|
|
69
|
+
vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
expect(ruptureResult).toBe(ResultCode.SUCCESS);
|
|
73
|
+
console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
|
|
74
|
+
|
|
75
|
+
const exitMaterial = vesselRuptureCalc.exitMaterial;
|
|
76
|
+
|
|
77
|
+
// Define weather
|
|
78
|
+
const weather = new Weather({
|
|
79
|
+
windSpeed: 2.0,
|
|
80
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_E,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// Fireball calculation
|
|
84
|
+
const fireballCalc = new FireballCalculation(
|
|
85
|
+
exitMaterial!,
|
|
86
|
+
state,
|
|
87
|
+
vesselRuptureCalc.dischargeRecords!,
|
|
88
|
+
vesselRuptureCalc.dischargeRecords!.length,
|
|
89
|
+
vesselRuptureCalc.dischargeResult!,
|
|
90
|
+
weather,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
console.log("Running fireball_calculation...");
|
|
94
|
+
const fireballResult = await fireballCalc.run();
|
|
95
|
+
|
|
96
|
+
if (fireballCalc.messages.length > 0) {
|
|
97
|
+
console.log("Messages:");
|
|
98
|
+
fireballCalc.messages.forEach((msg) => console.log(msg));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
expect(fireballResult).toBe(ResultCode.SUCCESS);
|
|
102
|
+
console.log(`SUCCESS: fireball_calculation (${fireballCalc.calculationElapsedTime}ms)`);
|
|
103
|
+
|
|
104
|
+
// Radiation transect calculation
|
|
105
|
+
const radiationResolution = Resolution.MEDIUM;
|
|
106
|
+
const transect = new Transect({
|
|
107
|
+
transectStartPoint: new LocalPosition({ x: 10.0, y: 0.0, z: 5.0 }),
|
|
108
|
+
transectEndPoint: new LocalPosition({ x: 100.0, y: 0.0, z: 5.0 }),
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const flammableOutputConfig = new FlammableOutputConfig({
|
|
112
|
+
position: new LocalPosition(),
|
|
113
|
+
transect,
|
|
114
|
+
radiationResolution,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const radiationCalc = new RadiationTransectCalculation(
|
|
118
|
+
fireballCalc.flameResult!,
|
|
119
|
+
fireballCalc.flameRecords!,
|
|
120
|
+
fireballCalc.flameRecords!.length,
|
|
121
|
+
weather,
|
|
122
|
+
new FlammableParameters(),
|
|
123
|
+
flammableOutputConfig,
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
console.log("Running radiation_transect_calculation...");
|
|
127
|
+
const radiationResult = await radiationCalc.run();
|
|
128
|
+
|
|
129
|
+
if (radiationCalc.messages.length > 0) {
|
|
130
|
+
console.log("Messages:");
|
|
131
|
+
radiationCalc.messages.forEach((msg) => console.log(msg));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
expect(radiationResult).toBe(ResultCode.SUCCESS);
|
|
135
|
+
|
|
136
|
+
// Regression checks
|
|
137
|
+
const flameDiameterError = Math.abs(
|
|
138
|
+
(fireballCalc.flameResult!.flameDiameter! - 31.624965667724611) /
|
|
139
|
+
31.624965667724611
|
|
140
|
+
);
|
|
141
|
+
expect(flameDiameterError).toBeLessThan(1e-3);
|
|
142
|
+
|
|
143
|
+
expect(radiationCalc.radiationRecords!.length).toBe(50);
|
|
144
|
+
|
|
145
|
+
const radiationResultError = Math.abs(
|
|
146
|
+
(radiationCalc.radiationRecords![0].radiationResult! - 36402.50812563037) /
|
|
147
|
+
36402.50812563037
|
|
148
|
+
);
|
|
149
|
+
expect(radiationResultError).toBeLessThan(1e-3);
|
|
150
|
+
|
|
151
|
+
console.log(`SUCCESS: radiation_transect_calculation (${radiationCalc.calculationElapsedTime}ms)`);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { FireballCalculation } from "../../src/calculations/fireball";
|
|
3
|
+
import { RadiationTransectCalculation } from "../../src/calculations/radiation";
|
|
4
|
+
import { DischargeParameters, FlammableOutputConfig, FlammableParameters, LocalPosition, Material, MaterialComponent, State, Transect, Vessel, Weather } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, Resolution, ResultCode, VesselShape } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Test Case 91 - Vessel and Fireball Scenario", () => {
|
|
16
|
+
test("should run vessel and fireball calculations with regression checks", async () => {
|
|
17
|
+
// Define material and state
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: "PROPANE",
|
|
20
|
+
components: [new MaterialComponent({ name: "PROPANE", moleFraction: 1.0 })],
|
|
21
|
+
componentCount: 1,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const state = new State({
|
|
25
|
+
temperature: 280.0,
|
|
26
|
+
pressure: 2.0e5,
|
|
27
|
+
liquidFraction: 0.8,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Vessel state calculation
|
|
31
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
32
|
+
|
|
33
|
+
console.log("Running vessel_state_calculation...");
|
|
34
|
+
const vesselStateResult = 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(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
42
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
43
|
+
|
|
44
|
+
// Define vessel
|
|
45
|
+
const vessel = new Vessel({
|
|
46
|
+
state,
|
|
47
|
+
material,
|
|
48
|
+
liquidFillFractionByVolume: 0.8,
|
|
49
|
+
height: 2.0,
|
|
50
|
+
width: 1.0,
|
|
51
|
+
length: 3.0,
|
|
52
|
+
shape: VesselShape.VESSEL_CUBOID,
|
|
53
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Vessel catastrophic rupture calculation
|
|
57
|
+
const dischargeParams = new DischargeParameters();
|
|
58
|
+
const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(
|
|
59
|
+
vessel,
|
|
60
|
+
dischargeParams
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
console.log("Running vessel_catastrophic_rupture_calculation...");
|
|
64
|
+
const ruptureResult = await vesselRuptureCalc.run();
|
|
65
|
+
|
|
66
|
+
if (vesselRuptureCalc.messages.length > 0) {
|
|
67
|
+
console.log("Messages:");
|
|
68
|
+
vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
expect(ruptureResult).toBe(ResultCode.SUCCESS);
|
|
72
|
+
console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
|
|
73
|
+
|
|
74
|
+
const exitMaterial = vesselRuptureCalc.exitMaterial;
|
|
75
|
+
|
|
76
|
+
// Define weather
|
|
77
|
+
const weather = new Weather({
|
|
78
|
+
windSpeed: 5.0,
|
|
79
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_D,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Fireball calculation
|
|
83
|
+
const fireballCalc = new FireballCalculation(
|
|
84
|
+
exitMaterial!,
|
|
85
|
+
state,
|
|
86
|
+
vesselRuptureCalc.dischargeRecords!,
|
|
87
|
+
vesselRuptureCalc.dischargeRecords!.length,
|
|
88
|
+
vesselRuptureCalc.dischargeResult!,
|
|
89
|
+
weather,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
console.log("Running fireball_calculation...");
|
|
93
|
+
const fireballResult = await fireballCalc.run();
|
|
94
|
+
|
|
95
|
+
if (fireballCalc.messages.length > 0) {
|
|
96
|
+
console.log("Messages:");
|
|
97
|
+
fireballCalc.messages.forEach((msg) => console.log(msg));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
expect(fireballResult).toBe(ResultCode.SUCCESS);
|
|
101
|
+
console.log(`SUCCESS: fireball_calculation (${fireballCalc.calculationElapsedTime}ms)`);
|
|
102
|
+
|
|
103
|
+
// Radiation transect calculation
|
|
104
|
+
const radiationResolution = Resolution.MEDIUM;
|
|
105
|
+
const transect = new Transect({
|
|
106
|
+
transectStartPoint: new LocalPosition({ x: 10.0, y: -20.0, z: 5.0 }),
|
|
107
|
+
transectEndPoint: new LocalPosition({ x: 10.0, y: 20.0, z: 5.0 }),
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const flammableOutputConfig = new FlammableOutputConfig({
|
|
111
|
+
position: new LocalPosition(),
|
|
112
|
+
transect,
|
|
113
|
+
radiationResolution,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const radiationCalc = new RadiationTransectCalculation(
|
|
117
|
+
fireballCalc.flameResult!,
|
|
118
|
+
fireballCalc.flameRecords!,
|
|
119
|
+
fireballCalc.flameRecords!.length,
|
|
120
|
+
weather,
|
|
121
|
+
new FlammableParameters(),
|
|
122
|
+
flammableOutputConfig,
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
console.log("Running radiation_transect_calculation...");
|
|
126
|
+
const radiationResult = await radiationCalc.run();
|
|
127
|
+
|
|
128
|
+
if (radiationCalc.messages.length > 0) {
|
|
129
|
+
console.log("Messages:");
|
|
130
|
+
radiationCalc.messages.forEach((msg) => console.log(msg));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
expect(radiationResult).toBe(ResultCode.SUCCESS);
|
|
134
|
+
|
|
135
|
+
// Regression checks
|
|
136
|
+
const flameDiameterError = Math.abs(
|
|
137
|
+
(fireballCalc.flameResult!.flameDiameter! - 18.108844757080078) /
|
|
138
|
+
18.108844757080078
|
|
139
|
+
);
|
|
140
|
+
expect(flameDiameterError).toBeLessThan(1e-3);
|
|
141
|
+
|
|
142
|
+
expect(radiationCalc.radiationRecords!.length).toBe(50);
|
|
143
|
+
|
|
144
|
+
const radiationResultError = Math.abs(
|
|
145
|
+
(radiationCalc.radiationRecords![0].radiationResult! - 9018.900488875195) /
|
|
146
|
+
9018.900488875195
|
|
147
|
+
);
|
|
148
|
+
expect(radiationResultError).toBeLessThan(1e-3);
|
|
149
|
+
|
|
150
|
+
console.log(`SUCCESS: radiation_transect_calculation (${radiationCalc.calculationElapsedTime}ms)`);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { FireballCalculation } from "../../src/calculations/fireball";
|
|
3
|
+
import { RadiationTransectCalculation } from "../../src/calculations/radiation";
|
|
4
|
+
import { DischargeParameters, FlammableOutputConfig, FlammableParameters, LocalPosition, Material, MaterialComponent, State, Transect, Vessel, Weather } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, Resolution, ResultCode, VesselShape, VesselConditions } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Test Case 92 - Vessel and Fireball Scenario", () => {
|
|
16
|
+
test("should run vessel and fireball calculations with regression checks", async () => {
|
|
17
|
+
// Define material and state
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: "HYDROGEN",
|
|
20
|
+
components: [new MaterialComponent({ name: "HYDROGEN", moleFraction: 1.0 })],
|
|
21
|
+
componentCount: 1,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const state = new State({
|
|
25
|
+
temperature: 270.0,
|
|
26
|
+
pressure: 8.0e6,
|
|
27
|
+
liquidFraction: 0.8,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Vessel state calculation
|
|
31
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
32
|
+
|
|
33
|
+
console.log("Running vessel_state_calculation...");
|
|
34
|
+
const vesselStateResult = 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(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
42
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
43
|
+
|
|
44
|
+
// Define vessel
|
|
45
|
+
const vessel = new Vessel({
|
|
46
|
+
state,
|
|
47
|
+
material,
|
|
48
|
+
liquidFillFractionByVolume: 0.8,
|
|
49
|
+
diameter: 5.0,
|
|
50
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
51
|
+
vesselConditions: vesselStateCalc.vesselConditions as VesselConditions,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Vessel catastrophic rupture calculation
|
|
55
|
+
const dischargeParams = new DischargeParameters();
|
|
56
|
+
const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(
|
|
57
|
+
vessel,
|
|
58
|
+
dischargeParams
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
console.log("Running vessel_catastrophic_rupture_calculation...");
|
|
62
|
+
const ruptureResult = await vesselRuptureCalc.run();
|
|
63
|
+
|
|
64
|
+
if (vesselRuptureCalc.messages.length > 0) {
|
|
65
|
+
console.log("Messages:");
|
|
66
|
+
vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
expect(ruptureResult).toBe(ResultCode.SUCCESS);
|
|
70
|
+
console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
|
|
71
|
+
|
|
72
|
+
const exitMaterial = vesselRuptureCalc.exitMaterial;
|
|
73
|
+
|
|
74
|
+
// Define weather
|
|
75
|
+
const weather = new Weather({
|
|
76
|
+
windSpeed: 1.0,
|
|
77
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_C,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Fireball calculation
|
|
81
|
+
const fireballCalc = new FireballCalculation(
|
|
82
|
+
exitMaterial!,
|
|
83
|
+
state,
|
|
84
|
+
vesselRuptureCalc.dischargeRecords!,
|
|
85
|
+
vesselRuptureCalc.dischargeRecords!.length,
|
|
86
|
+
vesselRuptureCalc.dischargeResult!,
|
|
87
|
+
weather,
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
console.log("Running fireball_calculation...");
|
|
91
|
+
const fireballResult = await fireballCalc.run();
|
|
92
|
+
|
|
93
|
+
if (fireballCalc.messages.length > 0) {
|
|
94
|
+
console.log("Messages:");
|
|
95
|
+
fireballCalc.messages.forEach((msg) => console.log(msg));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
expect(fireballResult).toBe(ResultCode.SUCCESS);
|
|
99
|
+
console.log(`SUCCESS: fireball_calculation (${fireballCalc.calculationElapsedTime}ms)`);
|
|
100
|
+
|
|
101
|
+
// Radiation transect calculation
|
|
102
|
+
const radiationResolution = Resolution.MEDIUM;
|
|
103
|
+
const transect = new Transect({
|
|
104
|
+
transectStartPoint: new LocalPosition({ x: 10.0, y: 0.0, z: 5.0 }),
|
|
105
|
+
transectEndPoint: new LocalPosition({ x: 50.0, y: 0.0, z: 0.0 }),
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const flammableOutputConfig = new FlammableOutputConfig({
|
|
109
|
+
position: new LocalPosition(),
|
|
110
|
+
transect,
|
|
111
|
+
radiationResolution,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
const radiationCalc = new RadiationTransectCalculation(
|
|
115
|
+
fireballCalc.flameResult!,
|
|
116
|
+
fireballCalc.flameRecords!,
|
|
117
|
+
fireballCalc.flameRecords!.length,
|
|
118
|
+
weather,
|
|
119
|
+
new FlammableParameters(),
|
|
120
|
+
flammableOutputConfig,
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
console.log("Running radiation_transect_calculation...");
|
|
124
|
+
const radiationResult = await radiationCalc.run();
|
|
125
|
+
|
|
126
|
+
if (radiationCalc.messages.length > 0) {
|
|
127
|
+
console.log("Messages:");
|
|
128
|
+
radiationCalc.messages.forEach((msg) => console.log(msg));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
expect(radiationResult).toBe(ResultCode.SUCCESS);
|
|
132
|
+
|
|
133
|
+
// Regression checks
|
|
134
|
+
const flameDiameterError = Math.abs(
|
|
135
|
+
(fireballCalc.flameResult!.flameDiameter! - 46.949886322021484) /
|
|
136
|
+
46.949886322021484
|
|
137
|
+
);
|
|
138
|
+
expect(flameDiameterError).toBeLessThan(1e-3);
|
|
139
|
+
|
|
140
|
+
expect(radiationCalc.radiationRecords!.length).toBe(50);
|
|
141
|
+
|
|
142
|
+
const radiationResultError = Math.abs(
|
|
143
|
+
(radiationCalc.radiationRecords![0].radiationResult! - 97828.68190075974) /
|
|
144
|
+
97828.68190075974
|
|
145
|
+
);
|
|
146
|
+
expect(radiationResultError).toBeLessThan(1e-3);
|
|
147
|
+
|
|
148
|
+
console.log(`SUCCESS: radiation_transect_calculation (${radiationCalc.calculationElapsedTime}ms)`);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State } from "../../src/entities";
|
|
2
|
+
import { FlashCalculation } from "../../src/calculations/properties";
|
|
3
|
+
import { ResultCode } from "../../src/enums";
|
|
4
|
+
import { setAccessToken } from "../../src/utilities";
|
|
5
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
6
|
+
|
|
7
|
+
if (!accessToken) {
|
|
8
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
setAccessToken(accessToken);
|
|
12
|
+
|
|
13
|
+
describe("Flash Calculation Scenario - Test Case 26", () => {
|
|
14
|
+
test("should run the flash calculation and perform regression check", async () => {
|
|
15
|
+
// Set the case properties
|
|
16
|
+
const stateTemperature = 270.0;
|
|
17
|
+
const statePressure = 8.0e6;
|
|
18
|
+
const stateLiquidFraction = 0.8;
|
|
19
|
+
|
|
20
|
+
// Define the initial state of the vessel
|
|
21
|
+
const state = new State({
|
|
22
|
+
temperature: stateTemperature,
|
|
23
|
+
pressure: statePressure,
|
|
24
|
+
liquidFraction: stateLiquidFraction
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// Define the material
|
|
28
|
+
const material = new Material({
|
|
29
|
+
name: "Case26_Material",
|
|
30
|
+
components: [
|
|
31
|
+
new MaterialComponent({ name: "METHANE", moleFraction: 0.2 }),
|
|
32
|
+
new MaterialComponent({ name: "ETHANE", moleFraction: 0.2 }),
|
|
33
|
+
new MaterialComponent({ name: "PROPANE", moleFraction: 0.2 }),
|
|
34
|
+
new MaterialComponent({ name: "N-BUTANE", moleFraction: 0.2 }),
|
|
35
|
+
new MaterialComponent({ name: "N-PENTANE", moleFraction: 0.2 })
|
|
36
|
+
],
|
|
37
|
+
componentCount: 5
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Create and run flash calculation
|
|
41
|
+
const flashCalc = new FlashCalculation(material, state);
|
|
42
|
+
|
|
43
|
+
console.log("Running flashCalculation...");
|
|
44
|
+
const resultCode = await flashCalc.run();
|
|
45
|
+
|
|
46
|
+
if (flashCalc.messages.length > 0) {
|
|
47
|
+
console.log("Messages:");
|
|
48
|
+
flashCalc.messages.forEach((msg) => console.log(msg));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
52
|
+
|
|
53
|
+
// Regression checks
|
|
54
|
+
const totalFluidDensityError = Math.abs(
|
|
55
|
+
(flashCalc.flashResult!.totalFluidDensity! - 483.1833445460695) / 483.1833445460695
|
|
56
|
+
);
|
|
57
|
+
const bubblePointTempError = Math.abs(
|
|
58
|
+
(flashCalc.flashResult!.bubblePointTemperature! - 319.5331124566492) / 319.5331124566492
|
|
59
|
+
);
|
|
60
|
+
const bubblePointPressureError = Math.abs(
|
|
61
|
+
(flashCalc.flashResult!.bubblePointPressure! - 4479259.631949412) / 4479259.631949412
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
expect(totalFluidDensityError).toBeLessThan(1e-3);
|
|
65
|
+
expect(flashCalc.flashResult!.fluidPhase).toBe(3);
|
|
66
|
+
expect(bubblePointTempError).toBeLessThan(1e-3);
|
|
67
|
+
expect(bubblePointPressureError).toBeLessThan(1e-3);
|
|
68
|
+
|
|
69
|
+
console.log(`SUCCESS: flashCalculation (${flashCalc.calculationElapsedTime}ms)`);
|
|
70
|
+
});
|
|
71
|
+
});
|