@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,198 @@
|
|
|
1
|
+
import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { JetFireCalculation } from "../../src/calculations/jetFire";
|
|
3
|
+
import { DistancesAndEllipsesToRadiationLevelsCalculation } from "../../src/calculations/radiation";
|
|
4
|
+
import { Bund, DischargeParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, Resolution, ResultCode, TimeVaryingOption, VesselShape } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Test Case 67 - Distances and Ellipses to Radiation Levels Scenario", () => {
|
|
16
|
+
test("should run vessel state, leak, jet fire, and distances/ellipses calculations with regression checks", async () => {
|
|
17
|
+
// Define case properties
|
|
18
|
+
const materialName = "ETHANE_METHANE_HYDROGEN";
|
|
19
|
+
const stateTemperature = 360.0;
|
|
20
|
+
const statePressure = 3.0e6;
|
|
21
|
+
const vesselShape = VesselShape.VESSEL_SPHERE;
|
|
22
|
+
const vesselDiameter = 3.0;
|
|
23
|
+
const leakHoleDiameter = 0.1;
|
|
24
|
+
const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
|
|
25
|
+
const leakHoleHeightFraction = 0.3;
|
|
26
|
+
const liquidFillFractionByVolume = 0.4;
|
|
27
|
+
const windSpeed = 2.0;
|
|
28
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
|
|
29
|
+
const timeOfInterest = 2600.0;
|
|
30
|
+
const radiationResolution = Resolution.EXTREME;
|
|
31
|
+
|
|
32
|
+
// Define material and state
|
|
33
|
+
const material = new Material({
|
|
34
|
+
name: materialName,
|
|
35
|
+
components: [
|
|
36
|
+
new MaterialComponent({ name: "ETHANE", moleFraction: 0.5 }),
|
|
37
|
+
new MaterialComponent({ name: "METHANE", moleFraction: 0.3 }),
|
|
38
|
+
new MaterialComponent({ name: "HYDROGEN", moleFraction: 0.2 }),
|
|
39
|
+
],
|
|
40
|
+
componentCount: 3,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const state = new State({
|
|
44
|
+
temperature: stateTemperature,
|
|
45
|
+
pressure: statePressure,
|
|
46
|
+
liquidFraction: 0.0,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Vessel state calculation
|
|
50
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
51
|
+
|
|
52
|
+
console.log("Running vessel_state_calculation...");
|
|
53
|
+
const vesselStateResult = await vesselStateCalc.run();
|
|
54
|
+
|
|
55
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
56
|
+
console.log("Messages:");
|
|
57
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
expect(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
61
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
62
|
+
|
|
63
|
+
// Define vessel
|
|
64
|
+
const vessel = new Vessel({
|
|
65
|
+
state: vesselStateCalc.outputState!,
|
|
66
|
+
material: vesselStateCalc.material,
|
|
67
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
68
|
+
location: new LocalPosition({ x: 0, y: 0, z: 0 }),
|
|
69
|
+
diameter: vesselDiameter,
|
|
70
|
+
shape: vesselShape,
|
|
71
|
+
liquidFillFractionByVolume: liquidFillFractionByVolume,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Define leak
|
|
75
|
+
const leak = new Leak({
|
|
76
|
+
holeDiameter: leakHoleDiameter,
|
|
77
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
78
|
+
timeVaryingOption: timeVaryingOption,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Vessel leak calculation
|
|
82
|
+
const dischargeParams = new DischargeParameters();
|
|
83
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
84
|
+
|
|
85
|
+
console.log("Running vessel_leak_calculation...");
|
|
86
|
+
const leakResult = await vesselLeakCalc.run();
|
|
87
|
+
|
|
88
|
+
if (vesselLeakCalc.messages.length > 0) {
|
|
89
|
+
console.log("Messages:");
|
|
90
|
+
vesselLeakCalc.messages.forEach((msg) => console.log(msg));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
expect(leakResult).toBe(ResultCode.SUCCESS);
|
|
94
|
+
console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
|
|
95
|
+
|
|
96
|
+
// Set up entities for jet fire calculation
|
|
97
|
+
const weather = new Weather({
|
|
98
|
+
windSpeed: windSpeed,
|
|
99
|
+
stabilityClass: stabilityClass,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const substrate = new Substrate({
|
|
103
|
+
bund: new Bund({ specifyBund: false }),
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const flammableParams = new FlammableParameters({
|
|
107
|
+
timeOfInterest: timeOfInterest,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// Jet fire calculation
|
|
111
|
+
const jetFireCalc = new JetFireCalculation(
|
|
112
|
+
vesselLeakCalc.exitMaterial!,
|
|
113
|
+
vesselLeakCalc.dischargeRecords!,
|
|
114
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
115
|
+
vesselLeakCalc.dischargeResult!,
|
|
116
|
+
weather,
|
|
117
|
+
substrate,
|
|
118
|
+
flammableParams
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
console.log("Running jet_fire_calculation...");
|
|
122
|
+
const jetFireResult = await jetFireCalc.run();
|
|
123
|
+
|
|
124
|
+
if (jetFireCalc.messages.length > 0) {
|
|
125
|
+
console.log("Messages:");
|
|
126
|
+
jetFireCalc.messages.forEach((msg) => console.log(msg));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
expect(jetFireResult).toBe(ResultCode.SUCCESS);
|
|
130
|
+
console.log(`SUCCESS: jet_fire_calculation (${jetFireCalc.calculationElapsedTime}ms)`);
|
|
131
|
+
|
|
132
|
+
// Flammable output configurations
|
|
133
|
+
const flammableOutputConfigs = [
|
|
134
|
+
new FlammableOutputConfig({
|
|
135
|
+
position: new LocalPosition({ x: 0.0, y: 0.0, z: 2.0 }),
|
|
136
|
+
transect: new Transect({
|
|
137
|
+
transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
|
|
138
|
+
transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
|
|
139
|
+
}),
|
|
140
|
+
radiationResolution: radiationResolution,
|
|
141
|
+
}),
|
|
142
|
+
new FlammableOutputConfig({
|
|
143
|
+
position: new LocalPosition({ x: 0.0, y: 0.0, z: 2.0 }),
|
|
144
|
+
transect: new Transect({
|
|
145
|
+
transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
|
|
146
|
+
transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
|
|
147
|
+
}),
|
|
148
|
+
radiationResolution: radiationResolution,
|
|
149
|
+
}),
|
|
150
|
+
new FlammableOutputConfig({
|
|
151
|
+
position: new LocalPosition({ x: 0.0, y: 0.0, z: 2.0 }),
|
|
152
|
+
transect: new Transect({
|
|
153
|
+
transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
|
|
154
|
+
transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
|
|
155
|
+
}),
|
|
156
|
+
radiationResolution: radiationResolution,
|
|
157
|
+
}),
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
// Distances and ellipses to radiation levels calculation
|
|
161
|
+
const distancesEllipsesCalc = new DistancesAndEllipsesToRadiationLevelsCalculation(
|
|
162
|
+
jetFireCalc.flameResult!,
|
|
163
|
+
jetFireCalc.flameRecords!,
|
|
164
|
+
jetFireCalc.flameRecords!.length,
|
|
165
|
+
weather,
|
|
166
|
+
jetFireCalc.flammableParameters!,
|
|
167
|
+
flammableOutputConfigs,
|
|
168
|
+
flammableOutputConfigs.length
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
console.log("Running distances_and_ellipses_to_radiation_levels_calculation...");
|
|
172
|
+
const distancesEllipsesResult = await distancesEllipsesCalc.run();
|
|
173
|
+
|
|
174
|
+
if (distancesEllipsesCalc.messages.length > 0) {
|
|
175
|
+
console.log("Messages:");
|
|
176
|
+
distancesEllipsesCalc.messages.forEach((msg) => console.log(msg));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
expect(distancesEllipsesResult).toBe(ResultCode.SUCCESS);
|
|
180
|
+
|
|
181
|
+
// Regression checks
|
|
182
|
+
expect(distancesEllipsesCalc.contourPoints!.length).toBe(150);
|
|
183
|
+
|
|
184
|
+
if (distancesEllipsesCalc.contourPoints!.length > 0) {
|
|
185
|
+
const contourPointError = Math.abs(
|
|
186
|
+
(distancesEllipsesCalc.contourPoints![distancesEllipsesCalc.contourPoints!.length - 1].x - 96.74496662598202) / 96.74496662598202
|
|
187
|
+
);
|
|
188
|
+
expect(contourPointError).toBeLessThan(1e-3);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const areaError = Math.abs(
|
|
192
|
+
(distancesEllipsesCalc.areas![0] - 11027.574303452657) / 11027.574303452657
|
|
193
|
+
);
|
|
194
|
+
expect(areaError).toBeLessThan(1e-3);
|
|
195
|
+
|
|
196
|
+
console.log(`SUCCESS: distances_and_ellipses_to_radiation_levels_calculation (${distancesEllipsesCalc.calculationElapsedTime}ms)`);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { JetFireCalculation } from "../../src/calculations/jetFire";
|
|
3
|
+
import { DistancesAndEllipsesToRadiationLevelsCalculation } from "../../src/calculations/radiation";
|
|
4
|
+
import { DischargeParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, Resolution, ResultCode, TimeVaryingOption, VesselShape } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Test Case 68 - Distances and Ellipses to Radiation Levels Scenario", () => {
|
|
16
|
+
test("should run vessel state, leak, jet fire, and distances/ellipses calculations with regression checks", async () => {
|
|
17
|
+
// Define case properties
|
|
18
|
+
const materialName = "N-BUTANE";
|
|
19
|
+
const stateTemperature = 360.0;
|
|
20
|
+
const statePressure = 3.0e6;
|
|
21
|
+
const vesselShape = VesselShape.VESSEL_SPHERE;
|
|
22
|
+
const vesselDiameter = 3.0;
|
|
23
|
+
const leakHoleDiameter = 0.1;
|
|
24
|
+
const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
|
|
25
|
+
const leakHoleHeightFraction = 0.3;
|
|
26
|
+
const liquidFillFractionByVolume = 0.4;
|
|
27
|
+
const windSpeed = 2.0;
|
|
28
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
|
|
29
|
+
const timeOfInterest = 2600.0;
|
|
30
|
+
const radiationResolution = Resolution.EXTREME;
|
|
31
|
+
|
|
32
|
+
// Define material and state
|
|
33
|
+
const material = new Material({
|
|
34
|
+
name: materialName,
|
|
35
|
+
components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
|
|
36
|
+
componentCount: 1,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const state = new State({
|
|
40
|
+
temperature: stateTemperature,
|
|
41
|
+
pressure: statePressure,
|
|
42
|
+
liquidFraction: 0.0,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Vessel state calculation
|
|
46
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
47
|
+
|
|
48
|
+
console.log("Running vessel_state_calculation...");
|
|
49
|
+
const vesselStateResult = await vesselStateCalc.run();
|
|
50
|
+
|
|
51
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
52
|
+
console.log("Messages:");
|
|
53
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
expect(vesselStateResult).toBe(ResultCode.SUCCESS);
|
|
57
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalc.calculationElapsedTime}ms)`);
|
|
58
|
+
|
|
59
|
+
// Define vessel
|
|
60
|
+
const vessel = new Vessel({
|
|
61
|
+
state: vesselStateCalc.outputState!,
|
|
62
|
+
material: vesselStateCalc.material,
|
|
63
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
64
|
+
location: new LocalPosition({ x: 0, y: 0, z: 0 }),
|
|
65
|
+
diameter: vesselDiameter,
|
|
66
|
+
shape: vesselShape,
|
|
67
|
+
liquidFillFractionByVolume: liquidFillFractionByVolume,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Define leak
|
|
71
|
+
const leak = new Leak({
|
|
72
|
+
holeDiameter: leakHoleDiameter,
|
|
73
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
74
|
+
timeVaryingOption: timeVaryingOption,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Vessel leak calculation
|
|
78
|
+
const dischargeParams = new DischargeParameters();
|
|
79
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
80
|
+
|
|
81
|
+
console.log("Running vessel_leak_calculation...");
|
|
82
|
+
const leakResult = await vesselLeakCalc.run();
|
|
83
|
+
|
|
84
|
+
if (vesselLeakCalc.messages.length > 0) {
|
|
85
|
+
console.log("Messages:");
|
|
86
|
+
vesselLeakCalc.messages.forEach((msg) => console.log(msg));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
expect(leakResult).toBe(ResultCode.SUCCESS);
|
|
90
|
+
console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalc.calculationElapsedTime}ms)`);
|
|
91
|
+
|
|
92
|
+
// Set up entities for jet fire calculation
|
|
93
|
+
const weather = new Weather({
|
|
94
|
+
windSpeed: windSpeed,
|
|
95
|
+
stabilityClass: stabilityClass,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const substrate = new Substrate({
|
|
99
|
+
bund: undefined, // Substrate in Python test uses default bund (equivalent to unspecified in TS)
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const flammableParams = new FlammableParameters({
|
|
103
|
+
timeOfInterest: timeOfInterest,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Jet fire calculation
|
|
107
|
+
const jetFireCalc = new JetFireCalculation(
|
|
108
|
+
vesselLeakCalc.exitMaterial!,
|
|
109
|
+
vesselLeakCalc.dischargeRecords!,
|
|
110
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
111
|
+
vesselLeakCalc.dischargeResult!,
|
|
112
|
+
weather,
|
|
113
|
+
substrate,
|
|
114
|
+
flammableParams
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
console.log("Running jet_fire_calculation...");
|
|
118
|
+
const jetFireResult = await jetFireCalc.run();
|
|
119
|
+
|
|
120
|
+
if (jetFireCalc.messages.length > 0) {
|
|
121
|
+
console.log("Messages:");
|
|
122
|
+
jetFireCalc.messages.forEach((msg) => console.log(msg));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
expect(jetFireResult).toBe(ResultCode.SUCCESS);
|
|
126
|
+
console.log(`SUCCESS: jet_fire_calculation (${jetFireCalc.calculationElapsedTime}ms)`);
|
|
127
|
+
|
|
128
|
+
// Flammable output configurations
|
|
129
|
+
const flammableOutputConfigs = [
|
|
130
|
+
new FlammableOutputConfig({
|
|
131
|
+
position: new LocalPosition({ x: 5.0, y: 0.0, z: 0.0 }),
|
|
132
|
+
transect: new Transect({
|
|
133
|
+
transectStartPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
|
|
134
|
+
transectEndPoint: new LocalPosition({ x: 0.0, y: 0.0, z: 0.0 }),
|
|
135
|
+
}),
|
|
136
|
+
radiationResolution: radiationResolution,
|
|
137
|
+
}),
|
|
138
|
+
];
|
|
139
|
+
|
|
140
|
+
// Distances and ellipses to radiation levels calculation
|
|
141
|
+
const distancesEllipsesCalc = new DistancesAndEllipsesToRadiationLevelsCalculation(
|
|
142
|
+
jetFireCalc.flameResult!,
|
|
143
|
+
jetFireCalc.flameRecords!,
|
|
144
|
+
jetFireCalc.flameRecords!.length,
|
|
145
|
+
weather,
|
|
146
|
+
jetFireCalc.flammableParameters!,
|
|
147
|
+
flammableOutputConfigs,
|
|
148
|
+
flammableOutputConfigs.length
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
console.log("Running distances_and_ellipses_to_radiation_levels_calculation...");
|
|
152
|
+
const distancesEllipsesResult = await distancesEllipsesCalc.run();
|
|
153
|
+
|
|
154
|
+
if (distancesEllipsesCalc.messages.length > 0) {
|
|
155
|
+
console.log("Messages:");
|
|
156
|
+
distancesEllipsesCalc.messages.forEach((msg) => console.log(msg));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
expect(distancesEllipsesResult).toBe(ResultCode.SUCCESS);
|
|
160
|
+
|
|
161
|
+
// Regression checks
|
|
162
|
+
expect(distancesEllipsesCalc.contourPoints!.length).toBe(50);
|
|
163
|
+
|
|
164
|
+
if (distancesEllipsesCalc.contourPoints!.length > 0) {
|
|
165
|
+
const contourPointError = Math.abs(
|
|
166
|
+
(distancesEllipsesCalc.contourPoints![distancesEllipsesCalc.contourPoints!.length - 1].x - 296.1082631873717) / 296.1082631873717
|
|
167
|
+
);
|
|
168
|
+
expect(contourPointError).toBeLessThan(1e-3);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const areaError = Math.abs(
|
|
172
|
+
(distancesEllipsesCalc.areas![0] - 114055.56705017174) / 114055.56705017174
|
|
173
|
+
);
|
|
174
|
+
expect(areaError).toBeLessThan(1e-3);
|
|
175
|
+
|
|
176
|
+
console.log(`SUCCESS: distances_and_ellipses_to_radiation_levels_calculation (${distancesEllipsesCalc.calculationElapsedTime}ms)`);
|
|
177
|
+
});
|
|
178
|
+
});
|
package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase31a.test.ts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { VesselCatastrophicRuptureCalculation, 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, 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 31a - Distances and Footprints to Concentration Levels Scenario", () => {
|
|
16
|
+
test("should run vessel, rupture, dispersion, and distances/footprints 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 and footprints to concentration levels calculation
|
|
117
|
+
const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0 })];
|
|
118
|
+
|
|
119
|
+
const distancesFootprintsCalc = new DistancesAndFootprintsToConcentrationLevelsCalculation(
|
|
120
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
121
|
+
weather,
|
|
122
|
+
dispersionCalc.dispersionRecords!,
|
|
123
|
+
dispersionCalc.dispersionRecords!.length,
|
|
124
|
+
substrate,
|
|
125
|
+
dispersionOutputConfigs,
|
|
126
|
+
dispersionOutputConfigs.length,
|
|
127
|
+
dispersionParams,
|
|
128
|
+
vesselRuptureCalc.exitMaterial!,
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
console.log("Running distances_and_footprints_to_concentration_levels_calculation...");
|
|
132
|
+
const distancesFootprintsResult = await distancesFootprintsCalc.run();
|
|
133
|
+
|
|
134
|
+
if (distancesFootprintsCalc.messages.length > 0) {
|
|
135
|
+
console.log("Messages:");
|
|
136
|
+
distancesFootprintsCalc.messages.forEach((msg) => console.log(msg));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
expect(distancesFootprintsResult).toBe(ResultCode.SUCCESS);
|
|
140
|
+
|
|
141
|
+
// Regression checks
|
|
142
|
+
expect(distancesFootprintsCalc.contourPoints!.length).toBe(723);
|
|
143
|
+
|
|
144
|
+
if (distancesFootprintsCalc.contourPoints!.length > 0) {
|
|
145
|
+
const contourPointError = Math.abs(
|
|
146
|
+
(distancesFootprintsCalc.contourPoints![distancesFootprintsCalc.contourPoints!.length - 3].x - (-7.7737846974650235)) / (-7.7737846974650235)
|
|
147
|
+
);
|
|
148
|
+
expect(contourPointError).toBeLessThan(1e-3);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const distanceError = Math.abs(
|
|
152
|
+
(distancesFootprintsCalc.distancesConcentration![0] - 33.477492122323696) / 33.477492122323696
|
|
153
|
+
);
|
|
154
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
155
|
+
|
|
156
|
+
console.log(`SUCCESS: distances_and_footprints_to_concentration_levels_calculation (${distancesFootprintsCalc.calculationElapsedTime}ms)`);
|
|
157
|
+
});
|
|
158
|
+
});
|
package/tests/distances-and-footprints-to-concentration-levels-calculation/testCase32a.test.ts
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { VesselCatastrophicRuptureCalculation, 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, 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 32a - Distances and Footprints to Concentration Levels Scenario", () => {
|
|
16
|
+
test("should run vessel, rupture, dispersion, and distances/footprints calculations with regression checks", async () => {
|
|
17
|
+
// Define material and state
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: "HEXANE",
|
|
20
|
+
components: [
|
|
21
|
+
new MaterialComponent({ name: "N-HEXANE", moleFraction: 1.0 }),
|
|
22
|
+
],
|
|
23
|
+
componentCount: 1,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const state = new State({
|
|
27
|
+
temperature: 280.0,
|
|
28
|
+
pressure: 2.0e5,
|
|
29
|
+
liquidFraction: 0.8,
|
|
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.8,
|
|
51
|
+
shape: VesselShape.VERTICAL_CYLINDER,
|
|
52
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Vessel catastrophic rupture calculation
|
|
56
|
+
const dischargeParams = new DischargeParameters();
|
|
57
|
+
const vesselRuptureCalc = new VesselCatastrophicRuptureCalculation(vessel, dischargeParams);
|
|
58
|
+
|
|
59
|
+
console.log("Running vessel_catastrophic_rupture_calculation...");
|
|
60
|
+
const ruptureResult = await vesselRuptureCalc.run();
|
|
61
|
+
|
|
62
|
+
if (vesselRuptureCalc.messages.length > 0) {
|
|
63
|
+
console.log("Messages:");
|
|
64
|
+
vesselRuptureCalc.messages.forEach((msg) => console.log(msg));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
expect(ruptureResult).toBe(ResultCode.SUCCESS);
|
|
68
|
+
console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselRuptureCalc.calculationElapsedTime}ms)`);
|
|
69
|
+
|
|
70
|
+
// Set up entities for dispersion calculation
|
|
71
|
+
const bund = new Bund({
|
|
72
|
+
specifyBund: true,
|
|
73
|
+
bundHeight: 1.0,
|
|
74
|
+
bundDiameter: 8.0,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const substrate = new Substrate({
|
|
78
|
+
bund,
|
|
79
|
+
surfaceType: SurfaceType.WATER,
|
|
80
|
+
surfaceRoughness: 0.05,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const weather = new Weather({
|
|
84
|
+
windSpeed: 2.0,
|
|
85
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_F,
|
|
86
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const dispersionParams = new DispersionParameters();
|
|
90
|
+
|
|
91
|
+
// Dispersion calculation
|
|
92
|
+
const dispersionCalc = new DispersionCalculation(
|
|
93
|
+
vesselRuptureCalc.exitMaterial!,
|
|
94
|
+
substrate,
|
|
95
|
+
vesselRuptureCalc.dischargeResult!,
|
|
96
|
+
vesselRuptureCalc.dischargeRecords!,
|
|
97
|
+
vesselRuptureCalc.dischargeRecords!.length,
|
|
98
|
+
weather,
|
|
99
|
+
dispersionParams,
|
|
100
|
+
0.0 // endPointConcentration
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
console.log("Running dispersion_calculation...");
|
|
104
|
+
const dispersionResult = await dispersionCalc.run();
|
|
105
|
+
|
|
106
|
+
if (dispersionCalc.messages.length > 0) {
|
|
107
|
+
console.log("Messages:");
|
|
108
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
112
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalc.calculationElapsedTime}ms)`);
|
|
113
|
+
|
|
114
|
+
// Distances and footprints to concentration levels calculation
|
|
115
|
+
const dispersionOutputConfigs = [new DispersionOutputConfig({ concentration: 0.0 })];
|
|
116
|
+
|
|
117
|
+
const distancesFootprintsCalc = new DistancesAndFootprintsToConcentrationLevelsCalculation(
|
|
118
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
119
|
+
weather,
|
|
120
|
+
dispersionCalc.dispersionRecords!,
|
|
121
|
+
dispersionCalc.dispersionRecords!.length,
|
|
122
|
+
substrate,
|
|
123
|
+
dispersionOutputConfigs,
|
|
124
|
+
dispersionOutputConfigs.length,
|
|
125
|
+
dispersionParams,
|
|
126
|
+
vesselRuptureCalc.exitMaterial!
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
console.log("Running distances_and_footprints_to_concentration_levels_calculation...");
|
|
130
|
+
const distancesFootprintsResult = await distancesFootprintsCalc.run();
|
|
131
|
+
|
|
132
|
+
if (distancesFootprintsCalc.messages.length > 0) {
|
|
133
|
+
console.log("Messages:");
|
|
134
|
+
distancesFootprintsCalc.messages.forEach((msg) => console.log(msg));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
expect(distancesFootprintsResult).toBe(ResultCode.SUCCESS);
|
|
138
|
+
|
|
139
|
+
// Regression checks
|
|
140
|
+
expect(distancesFootprintsCalc.contourPoints!.length).toBe(569);
|
|
141
|
+
|
|
142
|
+
if (distancesFootprintsCalc.contourPoints!.length > 0) {
|
|
143
|
+
const contourPointError = Math.abs(
|
|
144
|
+
(distancesFootprintsCalc.contourPoints![distancesFootprintsCalc.contourPoints!.length - 3].x - (-5.466432738453024)) / (-5.466432738453024)
|
|
145
|
+
);
|
|
146
|
+
expect(contourPointError).toBeLessThan(1e-3);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const distanceError = Math.abs(
|
|
150
|
+
(distancesFootprintsCalc.distancesConcentration![0] - 14.139820655455761) / 14.139820655455761
|
|
151
|
+
);
|
|
152
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
153
|
+
|
|
154
|
+
console.log(`SUCCESS: distances_and_footprints_to_concentration_levels_calculation (${distancesFootprintsCalc.calculationElapsedTime}ms)`);
|
|
155
|
+
});
|
|
156
|
+
});
|