@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,145 @@
|
|
|
1
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { DistancesToConcLevelsCalculation } from "../../src/calculations/dispersionView";
|
|
4
|
+
import { Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, ResultCode, SurfaceType, 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("Test Case 122 - Distances to Concentration Levels Scenario", () => {
|
|
16
|
+
test("should run vessel, rupture, dispersion, and distances calculations with regression checks", async () => {
|
|
17
|
+
// Define material and state
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: "HEXANE",
|
|
20
|
+
components: [new MaterialComponent({ name: "N-HEXANE", 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
|
+
shape: VesselShape.VERTICAL_CYLINDER,
|
|
50
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Vessel catastrophic rupture calculation
|
|
54
|
+
const dischargeParams = new DischargeParameters();
|
|
55
|
+
const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
|
|
56
|
+
|
|
57
|
+
console.log("Running vessel_catastrophic_rupture_calculation...");
|
|
58
|
+
const ruptureResult = await vesselRuptureCalc.run();
|
|
59
|
+
|
|
60
|
+
if (vesselRuptureCalc.messages.length > 0) {
|
|
61
|
+
console.log("Messages:");
|
|
62
|
+
vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
expect(ruptureResult).toBe(ResultCode.SUCCESS);
|
|
66
|
+
console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
|
|
67
|
+
|
|
68
|
+
// Set up entities for dispersion calculation
|
|
69
|
+
const bund = new Bund({
|
|
70
|
+
specifyBund: true,
|
|
71
|
+
bundHeight: 1.0,
|
|
72
|
+
bundDiameter: 8.0,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const substrate = new Substrate({
|
|
76
|
+
bund,
|
|
77
|
+
surfaceType: SurfaceType.WATER,
|
|
78
|
+
surfaceRoughness: 0.05,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const weather = new Weather({
|
|
82
|
+
windSpeed: 2.0,
|
|
83
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_F,
|
|
84
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const dispersionParams = new DispersionParameters();
|
|
88
|
+
|
|
89
|
+
// Dispersion calculation
|
|
90
|
+
const dispersionCalc = new DispersionCalculation(
|
|
91
|
+
vesselRuptureCalc.exitMaterial!,
|
|
92
|
+
substrate,
|
|
93
|
+
vesselRuptureCalc.dischargeResult!,
|
|
94
|
+
vesselRuptureCalc.dischargeRecords!,
|
|
95
|
+
vesselRuptureCalc.dischargeRecords!.length,
|
|
96
|
+
weather,
|
|
97
|
+
dispersionParams,
|
|
98
|
+
0.0 // endPointConcentration
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
console.log("Running dispersion_calculation...");
|
|
102
|
+
const dispersionResult = 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(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
110
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
111
|
+
|
|
112
|
+
// Distances to concentration levels calculation
|
|
113
|
+
const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0 })];
|
|
114
|
+
|
|
115
|
+
const distancesCalc = new DistancesToConcLevelsCalculation(
|
|
116
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
117
|
+
weather,
|
|
118
|
+
dispersionCalc.dispersionRecords!,
|
|
119
|
+
dispersionCalc.dispersionRecords!.length,
|
|
120
|
+
substrate,
|
|
121
|
+
dispersionOutputConfigs,
|
|
122
|
+
dispersionOutputConfigs.length,
|
|
123
|
+
vesselRuptureCalc.exitMaterial!,
|
|
124
|
+
dispersionParams
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
console.log("Running distances_to_conc_levels_calculation...");
|
|
128
|
+
const distancesResult = await distancesCalc.run();
|
|
129
|
+
|
|
130
|
+
if (distancesCalc.messages.length > 0) {
|
|
131
|
+
console.log("Messages:");
|
|
132
|
+
distancesCalc.messages.forEach((msg) => console.log(msg));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
expect(distancesResult).toBe(ResultCode.SUCCESS);
|
|
136
|
+
|
|
137
|
+
// Regression check
|
|
138
|
+
const distanceError = Math.abs(
|
|
139
|
+
(distancesCalc.distances![0] - 13.21859690146534) / 13.21859690146534
|
|
140
|
+
);
|
|
141
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
142
|
+
|
|
143
|
+
console.log(`SUCCESS: distances_to_conc_levels_calculation (${distancesCalc.calculationElapsedTime}ms)`);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { DistancesToConcLevelsCalculation } from "../../src/calculations/dispersionView";
|
|
4
|
+
import { DischargeParameters, DispersionOutputConfig, DispersionParameters, Leak, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, ResultCode, SurfaceType, TimeVaryingOption, 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("Test Case 123 - Distances to Concentration Levels Scenario", () => {
|
|
16
|
+
test("should run vessel, leak, dispersion, and distances calculations with regression checks", async () => {
|
|
17
|
+
// Define material and state
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: "CARBON DIOXIDE (TOXIC)",
|
|
20
|
+
components: [
|
|
21
|
+
new MaterialComponent({ name: "CARBON DIOXIDE (TOXIC)", moleFraction: 1.0 }),
|
|
22
|
+
],
|
|
23
|
+
componentCount: 1,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const state = new State({
|
|
27
|
+
temperature: 280.0,
|
|
28
|
+
pressure: 8.0e6,
|
|
29
|
+
liquidFraction: 0.0,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Vessel state calculation
|
|
33
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
34
|
+
|
|
35
|
+
console.log("Running vessel_state_calculation...");
|
|
36
|
+
const vesselStateResult = await vesselStateCalc.run();
|
|
37
|
+
|
|
38
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
39
|
+
console.log("Messages:");
|
|
40
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
expect(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
44
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
45
|
+
|
|
46
|
+
// Define vessel
|
|
47
|
+
const vessel = new Vessel({
|
|
48
|
+
state: vesselStateCalc.outputState!,
|
|
49
|
+
material: vesselStateCalc.material,
|
|
50
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
51
|
+
diameter: 5.0,
|
|
52
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
53
|
+
liquidFillFractionByVolume: 0.8,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Define leak
|
|
57
|
+
const leak = new Leak({
|
|
58
|
+
holeDiameter: 0.008,
|
|
59
|
+
holeHeightFraction: 0.5,
|
|
60
|
+
timeVaryingOption: TimeVaryingOption.INITIAL_RATE,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Vessel leak calculation
|
|
64
|
+
const dischargeParams = new DischargeParameters();
|
|
65
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
66
|
+
|
|
67
|
+
console.log("Running vessel_leak_calculation...");
|
|
68
|
+
const leakResult = await vesselLeakCalc.run();
|
|
69
|
+
|
|
70
|
+
if (vesselLeakCalc.messages.length > 0) {
|
|
71
|
+
console.log("Messages:");
|
|
72
|
+
vesselLeakCalc.messages.forEach((msg) => console.log(msg));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
expect(leakResult).toBe(ResultCode.SUCCESS);
|
|
76
|
+
console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
|
|
77
|
+
|
|
78
|
+
// Set up entities for dispersion calculation
|
|
79
|
+
const substrate = new Substrate({
|
|
80
|
+
surfaceType: SurfaceType.WATER,
|
|
81
|
+
surfaceRoughness: 0.01,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const weather = new Weather({
|
|
85
|
+
windSpeed: 4.0,
|
|
86
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_C,
|
|
87
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
const dispersionParams = new DispersionParameters();
|
|
91
|
+
|
|
92
|
+
// Dispersion calculation
|
|
93
|
+
const dispersionCalc = new DispersionCalculation(
|
|
94
|
+
vesselLeakCalc.exitMaterial!,
|
|
95
|
+
substrate,
|
|
96
|
+
vesselLeakCalc.dischargeResult!,
|
|
97
|
+
vesselLeakCalc.dischargeRecords!,
|
|
98
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
99
|
+
weather,
|
|
100
|
+
dispersionParams,
|
|
101
|
+
0.0 // endPointConcentration
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
console.log("Running dispersion_calculation...");
|
|
105
|
+
const dispersionResult = await dispersionCalc.run();
|
|
106
|
+
|
|
107
|
+
if (dispersionCalc.messages.length > 0) {
|
|
108
|
+
console.log("Messages:");
|
|
109
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
113
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
114
|
+
|
|
115
|
+
// Distances to concentration levels calculation
|
|
116
|
+
const dispersionOutputConfigs = [
|
|
117
|
+
new DispersionOutputConfig({ concentration: 0.0, elevation: 2.4 }),
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
const distancesCalc = new DistancesToConcLevelsCalculation(
|
|
121
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
122
|
+
weather,
|
|
123
|
+
dispersionCalc.dispersionRecords!,
|
|
124
|
+
dispersionCalc.dispersionRecords!.length,
|
|
125
|
+
substrate,
|
|
126
|
+
dispersionOutputConfigs,
|
|
127
|
+
dispersionOutputConfigs.length,
|
|
128
|
+
vesselLeakCalc.exitMaterial!,
|
|
129
|
+
dispersionParams
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
console.log("Running distances_to_conc_levels_calculation...");
|
|
133
|
+
const distancesResult = await distancesCalc.run();
|
|
134
|
+
|
|
135
|
+
if (distancesCalc.messages.length > 0) {
|
|
136
|
+
console.log("Messages:");
|
|
137
|
+
distancesCalc.messages.forEach((msg) => console.log(msg));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
expect(distancesResult).toBe(ResultCode.SUCCESS);
|
|
141
|
+
|
|
142
|
+
// Regression check
|
|
143
|
+
const distanceError = Math.abs(
|
|
144
|
+
(distancesCalc.distances![0] - 10.023176380641605) / 10.023176380641605
|
|
145
|
+
);
|
|
146
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
147
|
+
|
|
148
|
+
console.log(`SUCCESS: distances_to_conc_levels_calculation (${distancesCalc.calculationElapsedTime}ms)`);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { VesselLineRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { DistancesToConcLevelsCalculation } from "../../src/calculations/dispersionView";
|
|
4
|
+
import { Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, LineRupture, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, ResultCode, SurfaceType, 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("Test Case 124 - Distances to Concentration Levels Scenario", () => {
|
|
16
|
+
test("should run vessel, line rupture, dispersion, and distances calculations with regression checks", async () => {
|
|
17
|
+
// Define material and state
|
|
18
|
+
const state = new State({
|
|
19
|
+
temperature: 290.0,
|
|
20
|
+
pressure: 7.0e6,
|
|
21
|
+
liquidFraction: 1.0,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const material = new Material({
|
|
25
|
+
name: "AMMONIA",
|
|
26
|
+
components: [new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 })],
|
|
27
|
+
componentCount: 1,
|
|
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
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
49
|
+
liquidFillFractionByVolume: 0.7,
|
|
50
|
+
shape: VesselShape.VESSEL_CUBOID,
|
|
51
|
+
height: 2.0,
|
|
52
|
+
width: 1.0,
|
|
53
|
+
length: 3.0,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Define line rupture
|
|
57
|
+
const lineRupture = new LineRupture({
|
|
58
|
+
pipeDiameter: 0.1,
|
|
59
|
+
pipeLength: 1.0,
|
|
60
|
+
pipeHeightFraction: 0.1,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Vessel line rupture calculation
|
|
64
|
+
const dischargeParams = new DischargeParameters();
|
|
65
|
+
const vesselLineRuptureCalc = new VesselLineRuptureCalculation(vessel, lineRupture, dischargeParams);
|
|
66
|
+
|
|
67
|
+
console.log("Running vessel_line_rupture_calculation...");
|
|
68
|
+
const ruptureResult = await vesselLineRuptureCalc.run();
|
|
69
|
+
|
|
70
|
+
if (vesselLineRuptureCalc.messages.length > 0) {
|
|
71
|
+
console.log("Messages:");
|
|
72
|
+
vesselLineRuptureCalc.messages.forEach((msg) => console.log(msg));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
expect(ruptureResult).toBe(ResultCode.SUCCESS);
|
|
76
|
+
console.log(`SUCCESS: vessel_line_rupture_calculation (${vesselLineRuptureCalc.calculationElapsedTime}ms)`);
|
|
77
|
+
|
|
78
|
+
// Set up entities for dispersion calculation
|
|
79
|
+
const bund = new Bund({
|
|
80
|
+
specifyBund: true,
|
|
81
|
+
bundHeight: 0.5,
|
|
82
|
+
bundDiameter: 5.0,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const substrate = new Substrate({
|
|
86
|
+
bund,
|
|
87
|
+
surfaceType: SurfaceType.LAND,
|
|
88
|
+
surfaceRoughness: 0.183,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const weather = new Weather({
|
|
92
|
+
windSpeed: 1.5,
|
|
93
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_D,
|
|
94
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const dispersionParams = new DispersionParameters();
|
|
98
|
+
|
|
99
|
+
// Dispersion calculation
|
|
100
|
+
const dispersionCalc = new DispersionCalculation(
|
|
101
|
+
vesselLineRuptureCalc.exitMaterial!,
|
|
102
|
+
substrate,
|
|
103
|
+
vesselLineRuptureCalc.dischargeResult!,
|
|
104
|
+
vesselLineRuptureCalc.dischargeRecords!,
|
|
105
|
+
vesselLineRuptureCalc.dischargeRecords!.length,
|
|
106
|
+
weather,
|
|
107
|
+
dispersionParams,
|
|
108
|
+
0.0 // endPointConcentration
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
console.log("Running dispersion_calculation...");
|
|
112
|
+
const dispersionResult = await dispersionCalc.run();
|
|
113
|
+
|
|
114
|
+
if (dispersionCalc.messages.length > 0) {
|
|
115
|
+
console.log("Messages:");
|
|
116
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
120
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
121
|
+
|
|
122
|
+
// Distances to concentration levels calculation
|
|
123
|
+
const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0, elevation: 35.0 })];
|
|
124
|
+
|
|
125
|
+
const distancesCalc = new DistancesToConcLevelsCalculation(
|
|
126
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
127
|
+
weather,
|
|
128
|
+
dispersionCalc.dispersionRecords!,
|
|
129
|
+
dispersionCalc.dispersionRecords!.length,
|
|
130
|
+
substrate,
|
|
131
|
+
dispersionOutputConfigs,
|
|
132
|
+
dispersionOutputConfigs.length,
|
|
133
|
+
vesselLineRuptureCalc.exitMaterial!,
|
|
134
|
+
dispersionParams
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
console.log("Running distances_to_conc_levels_calculation...");
|
|
138
|
+
const distancesResult = await distancesCalc.run();
|
|
139
|
+
|
|
140
|
+
if (distancesCalc.messages.length > 0) {
|
|
141
|
+
console.log("Messages:");
|
|
142
|
+
distancesCalc.messages.forEach((msg) => console.log(msg));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
expect(distancesResult).toBe(ResultCode.SUCCESS);
|
|
146
|
+
|
|
147
|
+
// Regression check
|
|
148
|
+
const distanceError = Math.abs(
|
|
149
|
+
(distancesCalc.distances![0] - 327.4691422670722) / 327.4691422670722);
|
|
150
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
151
|
+
|
|
152
|
+
console.log(`SUCCESS: distances_to_conc_levels_calculation (${distancesCalc.calculationElapsedTime}ms)`);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { VesselStateCalculation, VesselReliefValveCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation} from "../../src/calculations/dispersion";
|
|
3
|
+
import { DistancesToConcLevelsCalculation, } from "../../src/calculations/dispersionView";
|
|
4
|
+
import { Material, MaterialComponent, State, Vessel, ReliefValve, DischargeParameters, Bund, Substrate, Weather, DispersionParameters, DispersionOutputConfig } from "../../src/entities";
|
|
5
|
+
import { VesselShape, ResultCode, SurfaceType, AtmosphericStabilityClass, 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("Test Case 125 - Distances to Concentration Levels Scenario", () => {
|
|
16
|
+
test("should run vessel state, relief valve, dispersion, and distances calculations with regression checks", async () => {
|
|
17
|
+
// Define material and state
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: "CHLORINE",
|
|
20
|
+
components: [
|
|
21
|
+
new MaterialComponent({ name: "CHLORINE", moleFraction: 1.0 }),
|
|
22
|
+
],
|
|
23
|
+
componentCount: 1,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const state = new State({
|
|
27
|
+
temperature: 320.0,
|
|
28
|
+
pressure: 1.0e6,
|
|
29
|
+
liquidFraction: 1.0,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Vessel state calculation
|
|
33
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
34
|
+
|
|
35
|
+
console.log("Running vessel_state_calculation...");
|
|
36
|
+
const vesselStateResult = await vesselStateCalc.run();
|
|
37
|
+
|
|
38
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
39
|
+
console.log("Messages:");
|
|
40
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
expect(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
44
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
45
|
+
|
|
46
|
+
// Define vessel
|
|
47
|
+
const vessel = new Vessel({
|
|
48
|
+
state,
|
|
49
|
+
material,
|
|
50
|
+
liquidFillFractionByVolume: 0.7,
|
|
51
|
+
shape: VesselShape.HORIZONTAL_CYLINDER,
|
|
52
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
53
|
+
diameter: 2.0,
|
|
54
|
+
length: 5.0,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Define relief valve
|
|
58
|
+
const reliefValve = new ReliefValve({
|
|
59
|
+
pipeDiameter: 0.02,
|
|
60
|
+
pipeLength: 10.0,
|
|
61
|
+
pipeHeightFraction: 1,
|
|
62
|
+
reliefValveConstrictionDiameter: 0.02,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// Vessel relief valve calculation
|
|
66
|
+
const dischargeParams = new DischargeParameters();
|
|
67
|
+
const vesselReliefValveCalc = new VesselReliefValveCalculation(vessel, reliefValve, dischargeParams);
|
|
68
|
+
|
|
69
|
+
console.log("Running vessel_relief_valve_calculation...");
|
|
70
|
+
const reliefValveResult = await vesselReliefValveCalc.run();
|
|
71
|
+
|
|
72
|
+
if (vesselReliefValveCalc.messages.length > 0) {
|
|
73
|
+
console.log("Messages:");
|
|
74
|
+
vesselReliefValveCalc.messages.forEach((msg) => console.log(msg));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
expect(reliefValveResult).toBe(ResultCode.SUCCESS);
|
|
78
|
+
console.log(`SUCCESS: vessel_relief_valve_calculation (${vesselReliefValveCalc.calculationElapsedTime}ms)`);
|
|
79
|
+
console.log(`vessel_relief_valve_calculation.dischargeResult.releaseMass: ${vesselReliefValveCalc.dischargeResult?.releaseMass} [kg]`);
|
|
80
|
+
|
|
81
|
+
// Set up entities for dispersion calculation
|
|
82
|
+
const bund = new Bund({
|
|
83
|
+
specifyBund: true,
|
|
84
|
+
bundHeight: 0.5,
|
|
85
|
+
bundDiameter: 5.0,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const substrate = new Substrate({
|
|
89
|
+
bund,
|
|
90
|
+
surfaceType: SurfaceType.LAND,
|
|
91
|
+
surfaceRoughness: 0.183,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const weather = new Weather({
|
|
95
|
+
windSpeed: 1.5,
|
|
96
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_D,
|
|
97
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const dispersionParams = new DispersionParameters();
|
|
101
|
+
|
|
102
|
+
// Dispersion calculation
|
|
103
|
+
const dispersionCalc = new DispersionCalculation(
|
|
104
|
+
vesselReliefValveCalc.exitMaterial!,
|
|
105
|
+
substrate,
|
|
106
|
+
vesselReliefValveCalc.dischargeResult!,
|
|
107
|
+
vesselReliefValveCalc.dischargeRecords!,
|
|
108
|
+
vesselReliefValveCalc.dischargeRecords!.length,
|
|
109
|
+
weather,
|
|
110
|
+
dispersionParams,
|
|
111
|
+
0.0 // endPointConcentration
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
console.log("Running dispersion_calculation...");
|
|
115
|
+
const dispersionResult = await dispersionCalc.run();
|
|
116
|
+
|
|
117
|
+
if (dispersionCalc.messages.length > 0) {
|
|
118
|
+
console.log("Messages:");
|
|
119
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
123
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
124
|
+
|
|
125
|
+
// Distances to concentration levels calculation
|
|
126
|
+
const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0, elevation: 0.0 })];
|
|
127
|
+
|
|
128
|
+
const distancesCalc = new DistancesToConcLevelsCalculation(
|
|
129
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
130
|
+
weather,
|
|
131
|
+
dispersionCalc.dispersionRecords!,
|
|
132
|
+
dispersionCalc.dispersionRecords!.length,
|
|
133
|
+
substrate,
|
|
134
|
+
dispersionOutputConfigs,
|
|
135
|
+
dispersionOutputConfigs.length,
|
|
136
|
+
vesselReliefValveCalc.exitMaterial!,
|
|
137
|
+
dispersionParams
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
console.log("Running distances_to_conc_levels_calculation...");
|
|
141
|
+
const distancesResult = await distancesCalc.run();
|
|
142
|
+
|
|
143
|
+
if (distancesCalc.messages.length > 0) {
|
|
144
|
+
console.log("Messages:");
|
|
145
|
+
distancesCalc.messages.forEach((msg) => console.log(msg));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
expect(distancesResult).toBe(ResultCode.SUCCESS);
|
|
149
|
+
console.log(`distances = ${distancesCalc.distances![0]}`);
|
|
150
|
+
console.log(`SUCCESS: distances_to_conc_levels_calculation (${distancesCalc.calculationElapsedTime}ms)`);
|
|
151
|
+
|
|
152
|
+
// Note: The Python test does not include a regression check for distances, so none is added here.
|
|
153
|
+
// If a specific expected distance value is known, you can add a check like:
|
|
154
|
+
// const distanceError = Math.abs((distancesCalc.distances![0] - EXPECTED_VALUE) / EXPECTED_VALUE);
|
|
155
|
+
// expect(distanceError).toBeLessThan(1e-3);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { LocalPosition, Material, MaterialComponent, State, Vessel } from "../../src/entities";
|
|
2
|
+
import { VesselConditions, VesselShape } from "../../src/enums";
|
|
3
|
+
import { setAccessToken } from "../../src/utilities";
|
|
4
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
5
|
+
|
|
6
|
+
if (!accessToken) {
|
|
7
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
setAccessToken(accessToken);
|
|
11
|
+
|
|
12
|
+
describe("Test Vessel Entity", () => {
|
|
13
|
+
test("should correctly instantiate a Vessel entity with specified attributes", () => {
|
|
14
|
+
// Define material
|
|
15
|
+
const material = new Material({
|
|
16
|
+
name: "AMMONIA",
|
|
17
|
+
components: [new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 })],
|
|
18
|
+
componentCount: 1,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Define state
|
|
22
|
+
const state = new State({
|
|
23
|
+
temperature: 265.0,
|
|
24
|
+
pressure: 5.0e5, // Converted from string '5.0E5' to number notation
|
|
25
|
+
liquidFraction: 0.0,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Define position
|
|
29
|
+
const position = new LocalPosition({
|
|
30
|
+
x: 10.0,
|
|
31
|
+
y: 20.0,
|
|
32
|
+
z: 30.0,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Create vessel
|
|
36
|
+
const vessel = new Vessel({
|
|
37
|
+
state,
|
|
38
|
+
material,
|
|
39
|
+
location: position,
|
|
40
|
+
liquidFillFractionByVolume: 0.5
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Assertions
|
|
44
|
+
expect(vessel.material.name).toBe("AMMONIA");
|
|
45
|
+
expect(vessel.state.temperature).toBe(265.0);
|
|
46
|
+
expect(vessel.state.pressure).toBe(5.0e5);
|
|
47
|
+
expect(vessel.state.liquidFraction).toBe(0.0);
|
|
48
|
+
});
|
|
49
|
+
});
|