@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
package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase33a.test.ts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { VesselStateCalculation, VesselLeakCalculation } from '../../src/calculations/discharge';
|
|
2
|
+
import { DispersionCalculation } from '../../src/calculations/dispersion';
|
|
3
|
+
import { DistancesAndFootprintsToConcentrationLevelsCalculation } 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 33a - Distances and Footprints to Concentration Levels Scenario', () => {
|
|
16
|
+
test('should run vessel state, leak, dispersion, and distances/footprints calculations with regression checks', async () => {
|
|
17
|
+
// Define material and state
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: 'CARBON DIOXIDE (TOXIC)',
|
|
20
|
+
components: [new MaterialComponent({ name: 'CARBON DIOXIDE (TOXIC)', moleFraction: 1.0 })],
|
|
21
|
+
componentCount: 1,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const state = new State({
|
|
25
|
+
temperature: 280.0,
|
|
26
|
+
pressure: 8.0e6,
|
|
27
|
+
liquidFraction: 0.0,
|
|
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: vesselStateCalc.outputState!,
|
|
47
|
+
material: vesselStateCalc.material,
|
|
48
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
49
|
+
diameter: 5.0,
|
|
50
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
51
|
+
liquidFillFractionByVolume: 0.8,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Define leak
|
|
55
|
+
const leak = new Leak({
|
|
56
|
+
holeDiameter: 0.008,
|
|
57
|
+
holeHeightFraction: 0.5,
|
|
58
|
+
timeVaryingOption: TimeVaryingOption.INITIAL_RATE,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Vessel leak calculation
|
|
62
|
+
const dischargeParams = new DischargeParameters();
|
|
63
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
64
|
+
|
|
65
|
+
console.log('Running vessel_leak_calculation...');
|
|
66
|
+
const leakResult = await vesselLeakCalc.run();
|
|
67
|
+
|
|
68
|
+
if (vesselLeakCalc.messages.length > 0) {
|
|
69
|
+
console.log('Messages:');
|
|
70
|
+
vesselLeakCalc.messages.forEach((msg) => console.log(msg));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
expect(leakResult).toBe(ResultCode.SUCCESS);
|
|
74
|
+
console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
|
|
75
|
+
|
|
76
|
+
// Set up entities for dispersion calculation
|
|
77
|
+
const substrate = new Substrate({
|
|
78
|
+
surfaceType: SurfaceType.WATER,
|
|
79
|
+
surfaceRoughness: 0.01,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
const weather = new Weather({
|
|
83
|
+
windSpeed: 4.0,
|
|
84
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_C,
|
|
85
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const dispersionParams = new DispersionParameters();
|
|
89
|
+
|
|
90
|
+
// Dispersion calculation
|
|
91
|
+
const dispersionCalc = new DispersionCalculation(
|
|
92
|
+
vesselLeakCalc.exitMaterial!,
|
|
93
|
+
substrate,
|
|
94
|
+
vesselLeakCalc.dischargeResult!,
|
|
95
|
+
vesselLeakCalc.dischargeRecords!,
|
|
96
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
97
|
+
weather,
|
|
98
|
+
dispersionParams,
|
|
99
|
+
0.0 // endPointConcentration
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
console.log('Running dispersion_calculation...');
|
|
103
|
+
const dispersionResult = await dispersionCalc.run();
|
|
104
|
+
|
|
105
|
+
if (dispersionCalc.messages.length > 0) {
|
|
106
|
+
console.log('Messages:');
|
|
107
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
111
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
112
|
+
|
|
113
|
+
// Distances and footprints to concentration levels calculation
|
|
114
|
+
const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0, elevation: 2.5 })];
|
|
115
|
+
|
|
116
|
+
const distancesFootprintsCalc = new DistancesAndFootprintsToConcentrationLevelsCalculation(
|
|
117
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
118
|
+
weather,
|
|
119
|
+
dispersionCalc.dispersionRecords!,
|
|
120
|
+
dispersionCalc.dispersionRecords!.length,
|
|
121
|
+
substrate,
|
|
122
|
+
dispersionOutputConfigs,
|
|
123
|
+
dispersionOutputConfigs.length,
|
|
124
|
+
dispersionParams,
|
|
125
|
+
vesselLeakCalc.exitMaterial!
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
console.log('Running distances_and_footprints_to_concentration_levels_calculation...');
|
|
129
|
+
const distancesFootprintsResult = await distancesFootprintsCalc.run();
|
|
130
|
+
|
|
131
|
+
if (distancesFootprintsCalc.messages.length > 0) {
|
|
132
|
+
console.log('Messages:');
|
|
133
|
+
distancesFootprintsCalc.messages.forEach((msg) => console.log(msg));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
expect(distancesFootprintsResult).toBe(ResultCode.SUCCESS);
|
|
137
|
+
|
|
138
|
+
// Regression checks
|
|
139
|
+
expect(distancesFootprintsCalc.contourPoints!.length).toBe(553);
|
|
140
|
+
|
|
141
|
+
if (distancesFootprintsCalc.contourPoints!.length > 0) {
|
|
142
|
+
const contourPointError = Math.abs(
|
|
143
|
+
(distancesFootprintsCalc.contourPoints![distancesFootprintsCalc.contourPoints!.length - 3].x - -0.09459660419095317) /
|
|
144
|
+
-0.09459660419095317
|
|
145
|
+
);
|
|
146
|
+
expect(contourPointError).toBeLessThan(1e-3);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const distanceError = Math.abs(
|
|
150
|
+
(distancesFootprintsCalc.distancesConcentration![0] - 10.10796681882425) / 10.10796681882425
|
|
151
|
+
);
|
|
152
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
153
|
+
|
|
154
|
+
console.log(
|
|
155
|
+
`SUCCESS: distances_and_footprints_to_concentration_levels_calculation (${distancesFootprintsCalc.calculationElapsedTime}ms)`
|
|
156
|
+
);
|
|
157
|
+
});
|
|
158
|
+
});
|
package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase34a.test.ts
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { VesselStateCalculation, VesselLeakCalculation, VesselLineRuptureCalculation } from '../../src/calculations/discharge';
|
|
2
|
+
import { DispersionCalculation } from '../../src/calculations/dispersion';
|
|
3
|
+
import { DistancesAndFootprintsToConcentrationLevelsCalculation } from '../../src/calculations/dispersionView';
|
|
4
|
+
import { Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, Leak, Material, MaterialComponent, State, Substrate, Vessel, Weather, LineRupture } 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 34a - Distances and Footprints to Concentration Levels Scenario", () => {
|
|
16
|
+
test("should run vessel state, line rupture, dispersion, and distances/footprints 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: 290.0,
|
|
26
|
+
pressure: 7.0e6,
|
|
27
|
+
liquidFraction: 1.0,
|
|
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.7,
|
|
49
|
+
shape: VesselShape.VESSEL_CUBOID,
|
|
50
|
+
height: 2.0,
|
|
51
|
+
width: 1.0,
|
|
52
|
+
length: 3.0,
|
|
53
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
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 and footprints to concentration levels calculation
|
|
123
|
+
const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0 })];
|
|
124
|
+
|
|
125
|
+
const distancesFootprintsCalc = new DistancesAndFootprintsToConcentrationLevelsCalculation(
|
|
126
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
127
|
+
weather,
|
|
128
|
+
dispersionCalc.dispersionRecords!,
|
|
129
|
+
dispersionCalc.dispersionRecords!.length,
|
|
130
|
+
substrate,
|
|
131
|
+
dispersionOutputConfigs,
|
|
132
|
+
dispersionOutputConfigs.length,
|
|
133
|
+
dispersionParams,
|
|
134
|
+
vesselLineRuptureCalc.exitMaterial!
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
console.log("Running distances_and_footprints_to_concentration_levels_calculation...");
|
|
138
|
+
const distancesFootprintsResult = await distancesFootprintsCalc.run();
|
|
139
|
+
|
|
140
|
+
if (distancesFootprintsCalc.messages.length > 0) {
|
|
141
|
+
console.log("Messages:");
|
|
142
|
+
distancesFootprintsCalc.messages.forEach((msg) => console.log(msg));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
expect(distancesFootprintsResult).toBe(ResultCode.SUCCESS);
|
|
146
|
+
|
|
147
|
+
// Regression checks
|
|
148
|
+
expect(distancesFootprintsCalc.contourPoints!.length).toBe(587);
|
|
149
|
+
|
|
150
|
+
if (distancesFootprintsCalc.contourPoints!.length > 0) {
|
|
151
|
+
const contourPointError = Math.abs(
|
|
152
|
+
(distancesFootprintsCalc.contourPoints![distancesFootprintsCalc.contourPoints!.length - 3].x - -0.3224436750622628) /
|
|
153
|
+
-0.3224436750622628
|
|
154
|
+
);
|
|
155
|
+
expect(contourPointError).toBeLessThan(1e-3);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const distanceError = Math.abs(
|
|
159
|
+
(distancesFootprintsCalc.distancesConcentration![0] - 248.37370206331042) / 248.37370206331042
|
|
160
|
+
);
|
|
161
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
162
|
+
|
|
163
|
+
console.log(`SUCCESS: distances_and_footprints_to_concentration_levels_calculation (${distancesFootprintsCalc.calculationElapsedTime}ms)`);
|
|
164
|
+
});
|
|
165
|
+
});
|
package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase35a.test.ts
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { VesselReliefValveCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { DistancesAndFootprintsToConcentrationLevelsCalculation } from "../../src/calculations/dispersionView";
|
|
4
|
+
import { Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, Material, MaterialComponent, ReliefValve, 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 35a - Distances and Footprints to Concentration Levels Scenario", () => {
|
|
16
|
+
test("should run vessel, relief valve, dispersion, and distances/footprints calculations with regression checks", async () => {
|
|
17
|
+
// Define constants
|
|
18
|
+
const stateTemperature = 320.0;
|
|
19
|
+
const statePressure = 1.0e6;
|
|
20
|
+
const stateLiquidFraction = 1.0;
|
|
21
|
+
const vesselShape = VesselShape.HORIZONTAL_CYLINDER;
|
|
22
|
+
const vesselDiameter = 2.0;
|
|
23
|
+
const vesselLength = 5.0;
|
|
24
|
+
const liquidFillFractionByVolume = 0.7;
|
|
25
|
+
const reliefValvePipeDiameter = 0.02;
|
|
26
|
+
const reliefValvePipeLength = 10.0;
|
|
27
|
+
const reliefValvePipeHeightFraction = 1;
|
|
28
|
+
const reliefValveConstrictionDiameter = 0.02;
|
|
29
|
+
const surfaceType = SurfaceType.LAND;
|
|
30
|
+
const surfaceRoughness = 0.183;
|
|
31
|
+
const windSpeed = 1.5;
|
|
32
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_D;
|
|
33
|
+
const endPointConcentration = 0.0;
|
|
34
|
+
const specifyBund = true;
|
|
35
|
+
const bundHeight = 0.5;
|
|
36
|
+
const bundDiameter = 5.0;
|
|
37
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
38
|
+
|
|
39
|
+
// Define material and state
|
|
40
|
+
const material = new Material({
|
|
41
|
+
name: "CHLORINE",
|
|
42
|
+
components: [new MaterialComponent({ name: "CHLORINE", moleFraction: 1.0 })],
|
|
43
|
+
componentCount: 1,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const state = new State({
|
|
47
|
+
temperature: stateTemperature,
|
|
48
|
+
pressure: statePressure,
|
|
49
|
+
liquidFraction: stateLiquidFraction,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Vessel state calculation
|
|
53
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
54
|
+
|
|
55
|
+
console.log("Running vessel_state_calculation...");
|
|
56
|
+
const vesselStateResult = await vesselStateCalc.run();
|
|
57
|
+
|
|
58
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
59
|
+
console.log("Messages:");
|
|
60
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
expect(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
64
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
65
|
+
|
|
66
|
+
// Define vessel
|
|
67
|
+
const vessel = new Vessel({
|
|
68
|
+
state,
|
|
69
|
+
material,
|
|
70
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
71
|
+
liquidFillFractionByVolume,
|
|
72
|
+
shape: vesselShape,
|
|
73
|
+
diameter: vesselDiameter,
|
|
74
|
+
length: vesselLength,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Define relief valve
|
|
78
|
+
const reliefValve = new ReliefValve({
|
|
79
|
+
pipeDiameter: reliefValvePipeDiameter,
|
|
80
|
+
pipeLength: reliefValvePipeLength,
|
|
81
|
+
pipeHeightFraction: reliefValvePipeHeightFraction,
|
|
82
|
+
reliefValveConstrictionDiameter: reliefValveConstrictionDiameter,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Vessel relief valve calculation
|
|
86
|
+
const dischargeParams = new DischargeParameters();
|
|
87
|
+
const vesselReliefValveCalc = new VesselReliefValveCalculation(vessel, reliefValve, dischargeParams);
|
|
88
|
+
|
|
89
|
+
console.log("Running vessel_relief_valve_calculation...");
|
|
90
|
+
const reliefValveResult = await vesselReliefValveCalc.run();
|
|
91
|
+
|
|
92
|
+
if (vesselReliefValveCalc.messages.length > 0) {
|
|
93
|
+
console.log("Messages:");
|
|
94
|
+
vesselReliefValveCalc.messages.forEach((msg) => console.log(msg));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
expect(reliefValveResult).toBe(ResultCode.SUCCESS);
|
|
98
|
+
console.log(`SUCCESS: vessel_relief_valve_calculation (${vesselReliefValveCalc.calculationElapsedTime}ms)`);
|
|
99
|
+
console.log(`vessel_relief_valve_calculation.dischargeResult.releaseMass: ${vesselReliefValveCalc.dischargeResult!.releaseMass} [kg]`);
|
|
100
|
+
|
|
101
|
+
// Set up entities for dispersion calculation
|
|
102
|
+
const bund = new Bund({
|
|
103
|
+
specifyBund,
|
|
104
|
+
bundHeight,
|
|
105
|
+
bundDiameter,
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const substrate = new Substrate({
|
|
109
|
+
bund,
|
|
110
|
+
surfaceType,
|
|
111
|
+
surfaceRoughness,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
const weather = new Weather({
|
|
115
|
+
windSpeed,
|
|
116
|
+
stabilityClass,
|
|
117
|
+
windProfileFlag
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
const dispersionParams = new DispersionParameters();
|
|
121
|
+
|
|
122
|
+
// Dispersion calculation
|
|
123
|
+
const dispersionCalc = new DispersionCalculation(
|
|
124
|
+
vesselReliefValveCalc.exitMaterial!,
|
|
125
|
+
substrate,
|
|
126
|
+
vesselReliefValveCalc.dischargeResult!,
|
|
127
|
+
vesselReliefValveCalc.dischargeRecords!,
|
|
128
|
+
vesselReliefValveCalc.dischargeRecords!.length,
|
|
129
|
+
weather,
|
|
130
|
+
dispersionParams,
|
|
131
|
+
endPointConcentration
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
console.log("Running dispersion_calculation...");
|
|
135
|
+
const dispersionResult = await dispersionCalc.run();
|
|
136
|
+
|
|
137
|
+
if (dispersionCalc.messages.length > 0) {
|
|
138
|
+
console.log("Messages:");
|
|
139
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
143
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
144
|
+
|
|
145
|
+
// Distances and footprints to concentration levels calculation
|
|
146
|
+
const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: endPointConcentration })];
|
|
147
|
+
|
|
148
|
+
const distancesFootprintsCalc = new DistancesAndFootprintsToConcentrationLevelsCalculation(
|
|
149
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
150
|
+
weather,
|
|
151
|
+
dispersionCalc.dispersionRecords!,
|
|
152
|
+
dispersionCalc.dispersionRecords!.length,
|
|
153
|
+
substrate,
|
|
154
|
+
dispersionOutputConfigs,
|
|
155
|
+
dispersionOutputConfigs.length,
|
|
156
|
+
dispersionParams,
|
|
157
|
+
vesselReliefValveCalc.exitMaterial!
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
console.log("Running distances_and_footprints_to_concentration_levels_calculation...");
|
|
161
|
+
const distancesFootprintsResult = await distancesFootprintsCalc.run();
|
|
162
|
+
|
|
163
|
+
if (distancesFootprintsCalc.messages.length > 0) {
|
|
164
|
+
console.log("Messages:");
|
|
165
|
+
distancesFootprintsCalc.messages.forEach((msg) => console.log(msg));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
expect(distancesFootprintsResult).toBe(ResultCode.SUCCESS);
|
|
169
|
+
|
|
170
|
+
// Regression checks
|
|
171
|
+
expect(distancesFootprintsCalc.contourPoints!.length).toBe(651);
|
|
172
|
+
|
|
173
|
+
if (distancesFootprintsCalc.contourPoints!.length > 0) {
|
|
174
|
+
const contourPointError = Math.abs(
|
|
175
|
+
(distancesFootprintsCalc.contourPoints![distancesFootprintsCalc.contourPoints!.length - 3].x - 3.5444266994358022) /
|
|
176
|
+
3.5444266994358022
|
|
177
|
+
);
|
|
178
|
+
expect(contourPointError).toBeLessThan(1e-3);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const distanceError = Math.abs(
|
|
182
|
+
(distancesFootprintsCalc.distancesConcentration![0] - 658.8828694811095) / 658.8828694811095
|
|
183
|
+
);
|
|
184
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
185
|
+
|
|
186
|
+
console.log(`SUCCESS: distances_and_footprints_to_concentration_levels_calculation (${distancesFootprintsCalc.calculationElapsedTime}ms)`);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
@@ -0,0 +1,149 @@
|
|
|
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 121 - 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: "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,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Vessel catastrophic rupture calculation
|
|
58
|
+
const dischargeParams = new DischargeParameters();
|
|
59
|
+
const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
|
|
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
|
+
// Set up entities for dispersion calculation
|
|
73
|
+
const bund = new Bund({
|
|
74
|
+
specifyBund: true,
|
|
75
|
+
bundHeight: 1.0,
|
|
76
|
+
bundDiameter: 8.0,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const substrate = new Substrate({
|
|
80
|
+
bund,
|
|
81
|
+
surfaceType: SurfaceType.LAND,
|
|
82
|
+
surfaceRoughness: 0.2,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const weather = new Weather({
|
|
86
|
+
windSpeed: 5.0,
|
|
87
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_A_,
|
|
88
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const dispersionParams = new DispersionParameters();
|
|
92
|
+
|
|
93
|
+
// Dispersion calculation
|
|
94
|
+
const dispersionCalc = new DispersionCalculation(
|
|
95
|
+
vesselRuptureCalc.exitMaterial!,
|
|
96
|
+
substrate,
|
|
97
|
+
vesselRuptureCalc.dischargeResult!,
|
|
98
|
+
vesselRuptureCalc.dischargeRecords!,
|
|
99
|
+
vesselRuptureCalc.dischargeRecords!.length,
|
|
100
|
+
weather,
|
|
101
|
+
dispersionParams,
|
|
102
|
+
0.0 // endPointConcentration
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
console.log("Running dispersion_calculation...");
|
|
106
|
+
const dispersionResult = await dispersionCalc.run();
|
|
107
|
+
|
|
108
|
+
if (dispersionCalc.messages.length > 0) {
|
|
109
|
+
console.log("Messages:");
|
|
110
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
114
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
115
|
+
|
|
116
|
+
// Distances to concentration levels calculation
|
|
117
|
+
const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0 })];
|
|
118
|
+
|
|
119
|
+
const distancesCalc = new DistancesToConcLevelsCalculation(
|
|
120
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
121
|
+
weather,
|
|
122
|
+
dispersionCalc.dispersionRecords!,
|
|
123
|
+
dispersionCalc.dispersionRecords!.length,
|
|
124
|
+
substrate,
|
|
125
|
+
dispersionOutputConfigs,
|
|
126
|
+
dispersionOutputConfigs.length,
|
|
127
|
+
vesselRuptureCalc.exitMaterial!,
|
|
128
|
+
dispersionParams
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
console.log("Running distances_to_conc_levels_calculation...");
|
|
132
|
+
const distancesResult = await distancesCalc.run();
|
|
133
|
+
|
|
134
|
+
if (distancesCalc.messages.length > 0) {
|
|
135
|
+
console.log("Messages:");
|
|
136
|
+
distancesCalc.messages.forEach((msg) => console.log(msg));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
expect(distancesResult).toBe(ResultCode.SUCCESS);
|
|
140
|
+
|
|
141
|
+
// Regression check
|
|
142
|
+
const distanceError = Math.abs(
|
|
143
|
+
(distancesCalc.distances![0] - 33.46354835021753) / 33.46354835021753
|
|
144
|
+
);
|
|
145
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
146
|
+
|
|
147
|
+
console.log(`SUCCESS: distances_to_conc_levels_calculation (${distancesCalc.calculationElapsedTime}ms)`);
|
|
148
|
+
});
|
|
149
|
+
});
|