@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,169 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig } from "../../src/entities";
|
|
2
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { MaxConcFootprintCalculation } from "../../src/calculations/dispersionView";
|
|
5
|
+
import { ResultCode, SurfaceType, AtmosphericStabilityClass, 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("Max Concentration Footprint Calculation - Test Case 31", () => {
|
|
16
|
+
test("should calculate max concentration footprint correctly", async () => {
|
|
17
|
+
const material = new Material({
|
|
18
|
+
name: "ETHANE_BUTANE_PROPANE",
|
|
19
|
+
components: [
|
|
20
|
+
new MaterialComponent({ name: "ETHANE", moleFraction: 0.5 }),
|
|
21
|
+
new MaterialComponent({ name: "N-BUTANE", moleFraction: 0.3 }),
|
|
22
|
+
new MaterialComponent({ name: "PROPANE", moleFraction: 0.2 }),
|
|
23
|
+
],
|
|
24
|
+
componentCount: 3,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const state = new State({
|
|
28
|
+
temperature: 265.0,
|
|
29
|
+
pressure: 5.0e5,
|
|
30
|
+
liquidFraction: 0.8,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const surfaceType = SurfaceType.LAND;
|
|
34
|
+
const surfaceRoughness = 0.2;
|
|
35
|
+
const windSpeed = 5.0;
|
|
36
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_A_;
|
|
37
|
+
const endPointConcentration = 0.0;
|
|
38
|
+
const specifyBund = true;
|
|
39
|
+
const bundHeight = 1.0;
|
|
40
|
+
const bundDiameter = 8.0;
|
|
41
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
42
|
+
|
|
43
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
44
|
+
const vesselStateResult = await vesselStateCalculation.run();
|
|
45
|
+
|
|
46
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
47
|
+
console.log("Messages:");
|
|
48
|
+
vesselStateCalculation.messages.forEach((msg) => console.log(msg));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
expect(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
52
|
+
console.log(
|
|
53
|
+
`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const vessel = new Vessel({
|
|
57
|
+
state,
|
|
58
|
+
material,
|
|
59
|
+
liquidFillFractionByVolume: 0.8,
|
|
60
|
+
shape: VesselShape.VERTICAL_CYLINDER,
|
|
61
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const dischargeParameters = new DischargeParameters();
|
|
65
|
+
const vesselCatastrophicRuptureCalculation =
|
|
66
|
+
new VesselCatastrophicRuptureCalculation(vessel, dischargeParameters);
|
|
67
|
+
const ruptureResult = await vesselCatastrophicRuptureCalculation.run();
|
|
68
|
+
|
|
69
|
+
if (vesselCatastrophicRuptureCalculation.messages.length > 0) {
|
|
70
|
+
console.log("Messages:");
|
|
71
|
+
vesselCatastrophicRuptureCalculation.messages.forEach((msg) =>
|
|
72
|
+
console.log(msg)
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
expect(ruptureResult).toBe(ResultCode.SUCCESS);
|
|
77
|
+
console.log(
|
|
78
|
+
`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselCatastrophicRuptureCalculation.calculationElapsedTime}ms)`
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const bund = new Bund({
|
|
82
|
+
specifyBund,
|
|
83
|
+
bundHeight,
|
|
84
|
+
bundDiameter,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const substrate = new Substrate({
|
|
88
|
+
bund,
|
|
89
|
+
surfaceType,
|
|
90
|
+
surfaceRoughness,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const weather = new Weather({
|
|
94
|
+
windSpeed: windSpeed,
|
|
95
|
+
stabilityClass: stabilityClass,
|
|
96
|
+
windProfileFlag: windProfileFlag
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const dispersionParameters = new DispersionParameters();
|
|
100
|
+
|
|
101
|
+
const dispersionCalculation = new DispersionCalculation(
|
|
102
|
+
vesselCatastrophicRuptureCalculation.exitMaterial!,
|
|
103
|
+
substrate,
|
|
104
|
+
vesselCatastrophicRuptureCalculation.dischargeResult!,
|
|
105
|
+
vesselCatastrophicRuptureCalculation.dischargeRecords!,
|
|
106
|
+
vesselCatastrophicRuptureCalculation.dischargeRecords!.length,
|
|
107
|
+
weather,
|
|
108
|
+
dispersionParameters,
|
|
109
|
+
endPointConcentration
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
const dispersionResult = await dispersionCalculation.run();
|
|
113
|
+
|
|
114
|
+
if (dispersionCalculation.messages.length > 0) {
|
|
115
|
+
console.log("Messages:");
|
|
116
|
+
dispersionCalculation.messages.forEach((msg) => console.log(msg));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
120
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`);
|
|
121
|
+
console.log(`Length dispersion records = ${dispersionCalculation.dispersionRecords!.length}`);
|
|
122
|
+
console.log(`Minimum concentration = ${dispersionCalculation.scalarUdmOutputs!.minimumConcentration}`);
|
|
123
|
+
console.log(`Observer count = ${dispersionCalculation.scalarUdmOutputs!.observerCount}`);
|
|
124
|
+
const lastRecord = dispersionCalculation.dispersionRecords!.at(-1)!;
|
|
125
|
+
console.log(`Final centreline concentration = ${lastRecord.centrelineConcentration}`);
|
|
126
|
+
console.log(`Final downwind distance = ${lastRecord.downwindDistance}`);
|
|
127
|
+
|
|
128
|
+
const dispersionOutputConfig = new DispersionOutputConfig({
|
|
129
|
+
concentration: endPointConcentration,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
const maxConcFootprintCalculation = new MaxConcFootprintCalculation(
|
|
133
|
+
dispersionCalculation.scalarUdmOutputs!,
|
|
134
|
+
weather,
|
|
135
|
+
dispersionCalculation.dispersionRecords!,
|
|
136
|
+
dispersionCalculation.dispersionRecords!.length,
|
|
137
|
+
substrate,
|
|
138
|
+
dispersionOutputConfig,
|
|
139
|
+
vesselCatastrophicRuptureCalculation.exitMaterial!,
|
|
140
|
+
dispersionParameters
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
const footprintResult = await maxConcFootprintCalculation.run();
|
|
144
|
+
|
|
145
|
+
if (maxConcFootprintCalculation.messages.length > 0) {
|
|
146
|
+
console.log("Messages:");
|
|
147
|
+
maxConcFootprintCalculation.messages.forEach((msg) => console.log(msg));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
expect(footprintResult).toBe(ResultCode.SUCCESS);
|
|
151
|
+
|
|
152
|
+
// Regression check
|
|
153
|
+
const expectedLength = 723;
|
|
154
|
+
const expectedX = -7.7737846974650235;
|
|
155
|
+
const checkPoint =
|
|
156
|
+
maxConcFootprintCalculation.contourPoints![
|
|
157
|
+
maxConcFootprintCalculation.contourPoints!.length - 3
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
expect(maxConcFootprintCalculation.contourPoints!.length).toBe(expectedLength);
|
|
161
|
+
const xError = Math.abs((checkPoint.x - expectedX) / expectedX);
|
|
162
|
+
expect(xError).toBeLessThan(1e-3);
|
|
163
|
+
|
|
164
|
+
console.log(
|
|
165
|
+
`SUCCESS: max_conc_footprint_calculation (${maxConcFootprintCalculation.calculationElapsedTime}ms)`
|
|
166
|
+
);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig } from "../../src/entities";
|
|
2
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { MaxConcFootprintCalculation } from "../../src/calculations/dispersionView";
|
|
5
|
+
import { ResultCode, SurfaceType, AtmosphericStabilityClass, 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("Max Concentration Footprint Calculation - Test Case 32", () => {
|
|
16
|
+
test("should calculate max concentration footprint correctly for HEXANE", async () => {
|
|
17
|
+
const material = new Material({
|
|
18
|
+
name: "HEXANE",
|
|
19
|
+
components: [
|
|
20
|
+
new MaterialComponent({ name: "N-HEXANE", moleFraction: 1.0 }),
|
|
21
|
+
],
|
|
22
|
+
componentCount: 1,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const state = new State({
|
|
26
|
+
temperature: 280.0,
|
|
27
|
+
pressure: 2.0e5,
|
|
28
|
+
liquidFraction: 0.8,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const surfaceType = SurfaceType.WATER;
|
|
32
|
+
const surfaceRoughness = 0.05;
|
|
33
|
+
const windSpeed = 2.0;
|
|
34
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
|
|
35
|
+
const endPointConcentration = 0.0;
|
|
36
|
+
const specifyBund = true;
|
|
37
|
+
const bundHeight = 1.0;
|
|
38
|
+
const bundDiameter = 8.0;
|
|
39
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
40
|
+
|
|
41
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
42
|
+
const vesselStateResult = await vesselStateCalculation.run();
|
|
43
|
+
|
|
44
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
45
|
+
console.log("Messages:");
|
|
46
|
+
vesselStateCalculation.messages.forEach((msg) => console.log(msg));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
expect(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
50
|
+
console.log(
|
|
51
|
+
`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const vessel = new Vessel({
|
|
55
|
+
state,
|
|
56
|
+
material,
|
|
57
|
+
liquidFillFractionByVolume: 0.8,
|
|
58
|
+
shape: VesselShape.VERTICAL_CYLINDER,
|
|
59
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const dischargeParameters = new DischargeParameters();
|
|
63
|
+
const vesselCatastrophicRuptureCalculation =
|
|
64
|
+
new VesselCatastrophicRuptureCalculation(vessel, dischargeParameters);
|
|
65
|
+
const ruptureResult = await vesselCatastrophicRuptureCalculation.run();
|
|
66
|
+
|
|
67
|
+
if (vesselCatastrophicRuptureCalculation.messages.length > 0) {
|
|
68
|
+
console.log("Messages:");
|
|
69
|
+
vesselCatastrophicRuptureCalculation.messages.forEach((msg) =>
|
|
70
|
+
console.log(msg)
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
expect(ruptureResult).toBe(ResultCode.SUCCESS);
|
|
75
|
+
console.log(
|
|
76
|
+
`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselCatastrophicRuptureCalculation.calculationElapsedTime}ms)`
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
const bund = new Bund({
|
|
80
|
+
specifyBund,
|
|
81
|
+
bundHeight,
|
|
82
|
+
bundDiameter,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const substrate = new Substrate({
|
|
86
|
+
bund,
|
|
87
|
+
surfaceType,
|
|
88
|
+
surfaceRoughness,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const weather = new Weather({
|
|
92
|
+
windSpeed: windSpeed,
|
|
93
|
+
stabilityClass: stabilityClass,
|
|
94
|
+
windProfileFlag: windProfileFlag
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const dispersionParameters = new DispersionParameters();
|
|
98
|
+
const dispersionCalculation = new DispersionCalculation(
|
|
99
|
+
vesselCatastrophicRuptureCalculation.exitMaterial!,
|
|
100
|
+
substrate,
|
|
101
|
+
vesselCatastrophicRuptureCalculation.dischargeResult!,
|
|
102
|
+
vesselCatastrophicRuptureCalculation.dischargeRecords!,
|
|
103
|
+
vesselCatastrophicRuptureCalculation.dischargeRecords!.length,
|
|
104
|
+
weather,
|
|
105
|
+
dispersionParameters,
|
|
106
|
+
endPointConcentration
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const dispersionResult = await dispersionCalculation.run();
|
|
110
|
+
|
|
111
|
+
if (dispersionCalculation.messages.length > 0) {
|
|
112
|
+
console.log("Messages:");
|
|
113
|
+
dispersionCalculation.messages.forEach((msg) => console.log(msg));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
117
|
+
console.log(
|
|
118
|
+
`SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`
|
|
119
|
+
);
|
|
120
|
+
console.log(
|
|
121
|
+
`length dispersion records = ${dispersionCalculation.dispersionRecords!.length}`
|
|
122
|
+
);
|
|
123
|
+
console.log(
|
|
124
|
+
`minimum concentration = ${dispersionCalculation.scalarUdmOutputs!.minimumConcentration}`
|
|
125
|
+
);
|
|
126
|
+
console.log(
|
|
127
|
+
`observer count = ${dispersionCalculation.scalarUdmOutputs!.observerCount}`
|
|
128
|
+
);
|
|
129
|
+
console.log(
|
|
130
|
+
`final centreline concentration = ${
|
|
131
|
+
dispersionCalculation.dispersionRecords!.at(-1)!.centrelineConcentration
|
|
132
|
+
}`
|
|
133
|
+
);
|
|
134
|
+
console.log(
|
|
135
|
+
`final downwind distance = ${
|
|
136
|
+
dispersionCalculation.dispersionRecords!.at(-1)!.downwindDistance
|
|
137
|
+
}`
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
const dispersionOutputConfig = new DispersionOutputConfig({
|
|
141
|
+
concentration: endPointConcentration,
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const maxConcFootprintCalculation = new MaxConcFootprintCalculation(
|
|
145
|
+
dispersionCalculation.scalarUdmOutputs!,
|
|
146
|
+
weather,
|
|
147
|
+
dispersionCalculation.dispersionRecords!,
|
|
148
|
+
dispersionCalculation.dispersionRecords!.length,
|
|
149
|
+
substrate,
|
|
150
|
+
dispersionOutputConfig,
|
|
151
|
+
vesselCatastrophicRuptureCalculation.exitMaterial!,
|
|
152
|
+
dispersionParameters
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const footprintResult = await maxConcFootprintCalculation.run();
|
|
156
|
+
|
|
157
|
+
if (maxConcFootprintCalculation.messages.length > 0) {
|
|
158
|
+
console.log("Messages:");
|
|
159
|
+
maxConcFootprintCalculation.messages.forEach((msg) => console.log(msg));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
expect(footprintResult).toBe(ResultCode.SUCCESS);
|
|
163
|
+
|
|
164
|
+
// Regression check
|
|
165
|
+
const expectedLength = 569;
|
|
166
|
+
const expectedX = -5.466432738453024;
|
|
167
|
+
const checkPoint =
|
|
168
|
+
maxConcFootprintCalculation.contourPoints![
|
|
169
|
+
maxConcFootprintCalculation.contourPoints!.length - 3
|
|
170
|
+
];
|
|
171
|
+
|
|
172
|
+
expect(maxConcFootprintCalculation.contourPoints!.length).toBe(
|
|
173
|
+
expectedLength
|
|
174
|
+
);
|
|
175
|
+
const xError = Math.abs((checkPoint.x - expectedX) / expectedX);
|
|
176
|
+
expect(xError).toBeLessThan(1e-3);
|
|
177
|
+
|
|
178
|
+
console.log(
|
|
179
|
+
`SUCCESS: max_conc_footprint_calculation (${maxConcFootprintCalculation.calculationElapsedTime}ms)`
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig, Leak } from "../../src/entities";
|
|
2
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation, VesselLeakCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { MaxConcFootprintCalculation } from "../../src/calculations/dispersionView";
|
|
5
|
+
import { ResultCode, SurfaceType, AtmosphericStabilityClass, VesselShape, TimeVaryingOption, 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("Max Concentration Footprint Calculation - Test Case 33", () => {
|
|
16
|
+
test("should correctly calculate maximum concentration footprint", async () => {
|
|
17
|
+
const materialName = "CARBON DIOXIDE (TOXIC)";
|
|
18
|
+
const stateTemperature = 280.0;
|
|
19
|
+
const statePressure = 8.0e6;
|
|
20
|
+
const vesselShape = VesselShape.VESSEL_SPHERE;
|
|
21
|
+
const vesselDiameter = 5.0;
|
|
22
|
+
const leakHoleDiameter = 0.008;
|
|
23
|
+
const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
|
|
24
|
+
const leakHoleHeightFraction = 0.5;
|
|
25
|
+
const surfaceType = SurfaceType.WATER;
|
|
26
|
+
const surfaceRoughness = 0.01;
|
|
27
|
+
const windSpeed = 4.0;
|
|
28
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_C;
|
|
29
|
+
const endPointConcentration = 0.0;
|
|
30
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
31
|
+
|
|
32
|
+
const state = new State({
|
|
33
|
+
temperature: stateTemperature,
|
|
34
|
+
pressure: statePressure,
|
|
35
|
+
liquidFraction: 0.0,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const material = new Material({
|
|
39
|
+
name: materialName,
|
|
40
|
+
components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
|
|
41
|
+
componentCount: 1,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
45
|
+
const vesselStateResult = await vesselStateCalculation.run();
|
|
46
|
+
|
|
47
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
48
|
+
console.log("Messages:");
|
|
49
|
+
vesselStateCalculation.messages.forEach((msg) => console.log(msg));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
expect(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
53
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
54
|
+
|
|
55
|
+
const vessel = new Vessel({
|
|
56
|
+
state: vesselStateCalculation.outputState!,
|
|
57
|
+
material: vesselStateCalculation.material,
|
|
58
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
59
|
+
diameter: vesselDiameter,
|
|
60
|
+
shape: vesselShape,
|
|
61
|
+
liquidFillFractionByVolume: 0.8,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const leak = new Leak({
|
|
65
|
+
holeDiameter: leakHoleDiameter,
|
|
66
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
67
|
+
timeVaryingOption,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const dischargeParameters = new DischargeParameters();
|
|
71
|
+
const vesselLeakCalculation = new VesselLeakCalculation(vessel, leak, dischargeParameters);
|
|
72
|
+
const leakResult = await vesselLeakCalculation.run();
|
|
73
|
+
|
|
74
|
+
if (vesselLeakCalculation.messages.length > 0) {
|
|
75
|
+
console.log("Messages:");
|
|
76
|
+
vesselLeakCalculation.messages.forEach((msg) => console.log(msg));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
expect(leakResult).toBe(ResultCode.SUCCESS);
|
|
80
|
+
console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalculation.calculationElapsedTime}ms)`);
|
|
81
|
+
|
|
82
|
+
const substrate = new Substrate({
|
|
83
|
+
surfaceType,
|
|
84
|
+
surfaceRoughness,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const weather = new Weather({
|
|
88
|
+
windSpeed: windSpeed,
|
|
89
|
+
stabilityClass: stabilityClass,
|
|
90
|
+
windProfileFlag: windProfileFlag
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const dispersionParameters = new DispersionParameters();
|
|
94
|
+
|
|
95
|
+
const dispersionCalculation = new DispersionCalculation(
|
|
96
|
+
vesselLeakCalculation.exitMaterial!,
|
|
97
|
+
substrate,
|
|
98
|
+
vesselLeakCalculation.dischargeResult!,
|
|
99
|
+
vesselLeakCalculation.dischargeRecords!,
|
|
100
|
+
vesselLeakCalculation.dischargeRecords!.length,
|
|
101
|
+
weather,
|
|
102
|
+
dispersionParameters,
|
|
103
|
+
endPointConcentration
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const dispersionResult = await dispersionCalculation.run();
|
|
107
|
+
|
|
108
|
+
if (dispersionCalculation.messages.length > 0) {
|
|
109
|
+
console.log("Messages:");
|
|
110
|
+
dispersionCalculation.messages.forEach((msg) => console.log(msg));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
114
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`);
|
|
115
|
+
console.log(`Length dispersion records = ${dispersionCalculation.dispersionRecords!.length}`);
|
|
116
|
+
console.log(`Minimum concentration = ${dispersionCalculation.scalarUdmOutputs!.minimumConcentration}`);
|
|
117
|
+
console.log(`Observer count = ${dispersionCalculation.scalarUdmOutputs!.observerCount}`);
|
|
118
|
+
const lastRecord = dispersionCalculation.dispersionRecords!.at(-1)!;
|
|
119
|
+
console.log(`Final centreline concentration = ${lastRecord.centrelineConcentration}`);
|
|
120
|
+
console.log(`Final downwind distance = ${lastRecord.downwindDistance}`);
|
|
121
|
+
|
|
122
|
+
const dispersionOutputConfig = new DispersionOutputConfig({
|
|
123
|
+
concentration: endPointConcentration,
|
|
124
|
+
elevation: 2.5,
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
const maxConcFootprintCalculation = new MaxConcFootprintCalculation(
|
|
128
|
+
dispersionCalculation.scalarUdmOutputs!,
|
|
129
|
+
weather,
|
|
130
|
+
dispersionCalculation.dispersionRecords!,
|
|
131
|
+
dispersionCalculation.dispersionRecords!.length,
|
|
132
|
+
substrate,
|
|
133
|
+
dispersionOutputConfig,
|
|
134
|
+
vesselLeakCalculation.exitMaterial!,
|
|
135
|
+
dispersionParameters
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
const footprintResult = await maxConcFootprintCalculation.run();
|
|
139
|
+
|
|
140
|
+
if (maxConcFootprintCalculation.messages.length > 0) {
|
|
141
|
+
console.log("Messages:");
|
|
142
|
+
maxConcFootprintCalculation.messages.forEach((msg) => console.log(msg));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
expect(footprintResult).toBe(ResultCode.SUCCESS);
|
|
146
|
+
|
|
147
|
+
const expectedLength = 553;
|
|
148
|
+
const expectedX = -0.09459660419095317;
|
|
149
|
+
const checkPoint =
|
|
150
|
+
maxConcFootprintCalculation.contourPoints![
|
|
151
|
+
maxConcFootprintCalculation.contourPoints!.length - 3
|
|
152
|
+
];
|
|
153
|
+
|
|
154
|
+
expect(maxConcFootprintCalculation.contourPoints!.length).toBe(expectedLength);
|
|
155
|
+
const xError = Math.abs((checkPoint.x - expectedX) / expectedX);
|
|
156
|
+
expect(xError).toBeLessThan(1e-3);
|
|
157
|
+
|
|
158
|
+
console.log(`SUCCESS: max_conc_footprint_calculation (${maxConcFootprintCalculation.calculationElapsedTime}ms)`);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig, LineRupture } from "../../src/entities";
|
|
2
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation, VesselLeakCalculation, VesselLineRuptureCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { MaxConcFootprintCalculation } from "../../src/calculations/dispersionView";
|
|
5
|
+
import { ResultCode, SurfaceType, AtmosphericStabilityClass, VesselShape, TimeVaryingOption, 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("Max Concentration Footprint Calculation - Test Case 34", () => {
|
|
16
|
+
test("should calculate max concentration footprint correctly", async () => {
|
|
17
|
+
const material = new Material(
|
|
18
|
+
{
|
|
19
|
+
name: "AMMONIA",
|
|
20
|
+
components:
|
|
21
|
+
[
|
|
22
|
+
new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 }),
|
|
23
|
+
]
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const state = new State({
|
|
27
|
+
temperature: 290.0,
|
|
28
|
+
pressure: 7.0e6,
|
|
29
|
+
liquidFraction: 1.0,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const surfaceType = SurfaceType.LAND;
|
|
33
|
+
const surfaceRoughness = 0.183;
|
|
34
|
+
const windSpeed = 1.5;
|
|
35
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_D;
|
|
36
|
+
const endPointConcentration = 0.0;
|
|
37
|
+
const specifyBund = true;
|
|
38
|
+
const bundHeight = 0.5;
|
|
39
|
+
const bundDiameter = 5.0;
|
|
40
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
41
|
+
|
|
42
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
43
|
+
const vesselStateResult = await vesselStateCalculation.run();
|
|
44
|
+
|
|
45
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
46
|
+
console.log("Messages:");
|
|
47
|
+
vesselStateCalculation.messages.forEach((msg) => console.log(msg));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
expect(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
51
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
52
|
+
|
|
53
|
+
const vessel = new Vessel({
|
|
54
|
+
state,
|
|
55
|
+
material,
|
|
56
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
57
|
+
liquidFillFractionByVolume: 0.7,
|
|
58
|
+
shape: VesselShape.VESSEL_CUBOID,
|
|
59
|
+
height: 2.0,
|
|
60
|
+
width: 1.0,
|
|
61
|
+
length: 3.0,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const lineRupture = new LineRupture({
|
|
65
|
+
pipeDiameter: 0.1,
|
|
66
|
+
pipeLength: 1.0,
|
|
67
|
+
pipeHeightFraction: 0.1,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const vesselLineRuptureCalculation = new VesselLineRuptureCalculation(
|
|
71
|
+
vessel,
|
|
72
|
+
lineRupture,
|
|
73
|
+
new DischargeParameters()
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const ruptureResult = await vesselLineRuptureCalculation.run();
|
|
77
|
+
|
|
78
|
+
if (vesselLineRuptureCalculation.messages.length > 0) {
|
|
79
|
+
console.log("Messages:");
|
|
80
|
+
vesselLineRuptureCalculation.messages.forEach((msg) => console.log(msg));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
expect(ruptureResult).toBe(ResultCode.SUCCESS);
|
|
84
|
+
console.log(`SUCCESS: vessel_line_rupture_calculation (${vesselLineRuptureCalculation.calculationElapsedTime}ms)`);
|
|
85
|
+
|
|
86
|
+
const bund = new Bund({
|
|
87
|
+
specifyBund,
|
|
88
|
+
bundHeight,
|
|
89
|
+
bundDiameter,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const substrate = new Substrate({
|
|
93
|
+
bund,
|
|
94
|
+
surfaceType,
|
|
95
|
+
surfaceRoughness,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const weather = new Weather({
|
|
99
|
+
windSpeed: windSpeed,
|
|
100
|
+
stabilityClass: stabilityClass,
|
|
101
|
+
windProfileFlag: windProfileFlag,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const dispersionParameters = new DispersionParameters();
|
|
105
|
+
|
|
106
|
+
const dispersionCalculation = new DispersionCalculation(
|
|
107
|
+
vesselLineRuptureCalculation.exitMaterial!,
|
|
108
|
+
substrate,
|
|
109
|
+
vesselLineRuptureCalculation.dischargeResult!,
|
|
110
|
+
vesselLineRuptureCalculation.dischargeRecords!,
|
|
111
|
+
vesselLineRuptureCalculation.dischargeRecords!.length,
|
|
112
|
+
weather,
|
|
113
|
+
dispersionParameters,
|
|
114
|
+
endPointConcentration
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const dispersionResult = await dispersionCalculation.run();
|
|
118
|
+
|
|
119
|
+
if (dispersionCalculation.messages.length > 0) {
|
|
120
|
+
console.log("Messages:");
|
|
121
|
+
dispersionCalculation.messages.forEach((msg) => console.log(msg));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
125
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`);
|
|
126
|
+
console.log(`Length dispersion records = ${dispersionCalculation.dispersionRecords!.length}`);
|
|
127
|
+
console.log(`Minimum concentration = ${dispersionCalculation.scalarUdmOutputs!.minimumConcentration}`);
|
|
128
|
+
console.log(`Observer count = ${dispersionCalculation.scalarUdmOutputs!.observerCount}`);
|
|
129
|
+
const lastRecord = dispersionCalculation.dispersionRecords!.at(-1)!;
|
|
130
|
+
console.log(`Final centreline concentration = ${lastRecord.centrelineConcentration}`);
|
|
131
|
+
console.log(`Final downwind distance = ${lastRecord.downwindDistance}`);
|
|
132
|
+
|
|
133
|
+
const dispersionOutputConfig = new DispersionOutputConfig({
|
|
134
|
+
concentration: endPointConcentration,
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
const maxConcFootprintCalculation = new MaxConcFootprintCalculation(
|
|
138
|
+
dispersionCalculation.scalarUdmOutputs!,
|
|
139
|
+
weather,
|
|
140
|
+
dispersionCalculation.dispersionRecords!,
|
|
141
|
+
dispersionCalculation.dispersionRecords!.length,
|
|
142
|
+
substrate,
|
|
143
|
+
dispersionOutputConfig,
|
|
144
|
+
vesselLineRuptureCalculation.exitMaterial!,
|
|
145
|
+
dispersionParameters
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
const footprintResult = await maxConcFootprintCalculation.run();
|
|
149
|
+
|
|
150
|
+
if (maxConcFootprintCalculation.messages.length > 0) {
|
|
151
|
+
console.log("Messages:");
|
|
152
|
+
maxConcFootprintCalculation.messages.forEach((msg) => console.log(msg));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
expect(footprintResult).toBe(ResultCode.SUCCESS);
|
|
156
|
+
|
|
157
|
+
// Regression Check
|
|
158
|
+
const expectedLength = 587;
|
|
159
|
+
const expectedX = -0.3224436750622628;
|
|
160
|
+
const checkPoint =
|
|
161
|
+
maxConcFootprintCalculation.contourPoints![
|
|
162
|
+
maxConcFootprintCalculation.contourPoints!.length - 3
|
|
163
|
+
];
|
|
164
|
+
|
|
165
|
+
expect(maxConcFootprintCalculation.contourPoints!.length).toBe(expectedLength);
|
|
166
|
+
const xError = Math.abs((checkPoint.x - expectedX) / expectedX);
|
|
167
|
+
expect(xError).toBeLessThan(1e-3);
|
|
168
|
+
|
|
169
|
+
console.log(`SUCCESS: max_conc_footprint_calculation (${maxConcFootprintCalculation.calculationElapsedTime}ms)`);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|