@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,67 @@
|
|
|
1
|
+
import { SetPhaseToReleaseForLeakScenarioCalculation } from "../../src/calculations/utilities";
|
|
2
|
+
import { Material, MaterialComponent, State, Vessel } from "../../src/entities";
|
|
3
|
+
import { Phase, ResultCode, VesselConditions, VesselShape } from "../../src/enums";
|
|
4
|
+
import { setAccessToken } from "../../src/utilities";
|
|
5
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
6
|
+
|
|
7
|
+
if (!accessToken) {
|
|
8
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
setAccessToken(accessToken);
|
|
12
|
+
|
|
13
|
+
describe("SetPhaseToReleaseForLeakScenarioCalculation", () => {
|
|
14
|
+
test("should set correct phase to release for leak scenario", async () => {
|
|
15
|
+
const material = new Material({
|
|
16
|
+
name: "N-PENTANE+METHANE",
|
|
17
|
+
components: [
|
|
18
|
+
new MaterialComponent({ name: "N-PENTANE", moleFraction: 0.5 }),
|
|
19
|
+
new MaterialComponent({ name: "METHANE", moleFraction: 0.5 }),
|
|
20
|
+
],
|
|
21
|
+
componentCount: 2,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const state = new State({
|
|
25
|
+
temperature: 280.0,
|
|
26
|
+
pressure: 8.0e6,
|
|
27
|
+
liquidFraction: 0.8,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const vessel = new Vessel({
|
|
31
|
+
state,
|
|
32
|
+
material,
|
|
33
|
+
diameter: 5.0,
|
|
34
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
35
|
+
vesselConditions: VesselConditions.STRATIFIED_TWO_PHASE_VESSEL,
|
|
36
|
+
liquidFillFractionByVolume: 0.6,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const calc = new SetPhaseToReleaseForLeakScenarioCalculation(
|
|
40
|
+
Phase.LIQUID,
|
|
41
|
+
1.0,
|
|
42
|
+
vessel
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
console.log("Running set_phase_to_be_released_for_leak_scenario_calculation...");
|
|
46
|
+
const resultCode = await calc.run();
|
|
47
|
+
calc.messages.forEach((msg) => console.log(msg));
|
|
48
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
49
|
+
|
|
50
|
+
// Validation
|
|
51
|
+
const expectedPhaseToRelease = 3; // Phase.LIQUID
|
|
52
|
+
const actualPhaseToRelease = calc.phaseToRelease;
|
|
53
|
+
expect(actualPhaseToRelease).toBe(expectedPhaseToRelease);
|
|
54
|
+
|
|
55
|
+
const expectedHoleHeightFraction = 0.5668689228522562;
|
|
56
|
+
const actualHoleHeightFraction = calc.holeHeightFractionUpdated!;
|
|
57
|
+
const relError = Math.abs(
|
|
58
|
+
(actualHoleHeightFraction - expectedHoleHeightFraction) /
|
|
59
|
+
expectedHoleHeightFraction
|
|
60
|
+
);
|
|
61
|
+
expect(relError).toBeLessThan(1e-3);
|
|
62
|
+
|
|
63
|
+
console.log(
|
|
64
|
+
`SUCCESS: set_phase_to_be_released_for_leak_scenario_calculation (${calc.calculationElapsedTime}ms)`
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { SetPhaseToReleaseForLineRuptureScenarioCalculation } from "../../src/calculations/utilities";
|
|
2
|
+
import { Material, MaterialComponent, State, Vessel } from "../../src/entities";
|
|
3
|
+
import { Phase, ResultCode, VesselConditions, VesselShape } from "../../src/enums";
|
|
4
|
+
import { setAccessToken } from "../../src/utilities";
|
|
5
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
6
|
+
|
|
7
|
+
if (!accessToken) {
|
|
8
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
setAccessToken(accessToken);
|
|
12
|
+
|
|
13
|
+
describe("SetPhaseToReleaseForLineRuptureScenarioCalculation", () => {
|
|
14
|
+
test("should set correct phase to release for line rupture scenario", async () => {
|
|
15
|
+
const material = new Material({
|
|
16
|
+
name: "N-PENTANE+METHANE",
|
|
17
|
+
components: [
|
|
18
|
+
new MaterialComponent({ name: "N-PENTANE", moleFraction: 0.5 }),
|
|
19
|
+
new MaterialComponent({ name: "METHANE", moleFraction: 0.5 }),
|
|
20
|
+
],
|
|
21
|
+
componentCount: 2,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const state = new State({
|
|
25
|
+
temperature: 280.0,
|
|
26
|
+
pressure: 8.0e6,
|
|
27
|
+
liquidFraction: 0.8,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const vessel = new Vessel({
|
|
31
|
+
state,
|
|
32
|
+
material,
|
|
33
|
+
diameter: 5.0,
|
|
34
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
35
|
+
vesselConditions: VesselConditions.STRATIFIED_TWO_PHASE_VESSEL,
|
|
36
|
+
liquidFillFractionByVolume: 0.6,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const calc = new SetPhaseToReleaseForLineRuptureScenarioCalculation(
|
|
40
|
+
Phase.LIQUID,
|
|
41
|
+
1.0,
|
|
42
|
+
vessel
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
console.log("Running set_phase_to_be_released_for_line_rupture_scenario_calculation...");
|
|
46
|
+
const resultCode = await calc.run();
|
|
47
|
+
calc.messages.forEach((msg) => console.log(msg));
|
|
48
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
49
|
+
|
|
50
|
+
// Validation
|
|
51
|
+
const expectedPhaseToRelease = 3; // Phase.LIQUID
|
|
52
|
+
const actualPhaseToRelease = calc.phaseToRelease;
|
|
53
|
+
expect(actualPhaseToRelease).toBe(expectedPhaseToRelease);
|
|
54
|
+
|
|
55
|
+
const expectedPipeHeightFraction = 0.5668689228522562;
|
|
56
|
+
const actualPipeHeightFraction = calc.pipeHeightFractionUpdated!;
|
|
57
|
+
const relError = Math.abs(
|
|
58
|
+
(actualPipeHeightFraction - expectedPipeHeightFraction) /
|
|
59
|
+
expectedPipeHeightFraction
|
|
60
|
+
);
|
|
61
|
+
expect(relError).toBeLessThan(1e-3);
|
|
62
|
+
|
|
63
|
+
console.log(
|
|
64
|
+
`SUCCESS: set_phase_to_be_released_for_line_rupture_scenario_calculation (${calc.calculationElapsedTime}ms)`
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import {SetPhaseToReleaseForReliefValveScenarioCalculation} from "../../src/calculations/utilities";
|
|
2
|
+
import {Material,MaterialComponent,State,Vessel} from "../../src/entities";
|
|
3
|
+
import {Phase,ResultCode,VesselConditions,VesselShape} from "../../src/enums";
|
|
4
|
+
import { setAccessToken } from "../../src/utilities";
|
|
5
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
6
|
+
|
|
7
|
+
if (!accessToken) {
|
|
8
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
setAccessToken(accessToken);
|
|
12
|
+
|
|
13
|
+
describe("SetPhaseToReleaseForReliefValveScenarioCalculation", () => {
|
|
14
|
+
test("should set correct phase to release for relief valve scenario", async () => {
|
|
15
|
+
const material = new Material({
|
|
16
|
+
name: "N-PENTANE+METHANE",
|
|
17
|
+
components: [
|
|
18
|
+
new MaterialComponent({ name: "N-PENTANE", moleFraction: 0.5 }),
|
|
19
|
+
new MaterialComponent({ name: "METHANE", moleFraction: 0.5 }),
|
|
20
|
+
],
|
|
21
|
+
componentCount: 2,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const state = new State({
|
|
25
|
+
temperature: 280.0,
|
|
26
|
+
pressure: 8.0e6,
|
|
27
|
+
liquidFraction: 0.8,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const vessel = new Vessel({
|
|
31
|
+
state,
|
|
32
|
+
material,
|
|
33
|
+
diameter: 5.0,
|
|
34
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
35
|
+
vesselConditions: VesselConditions.STRATIFIED_TWO_PHASE_VESSEL,
|
|
36
|
+
liquidFillFractionByVolume: 0.6,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const calc = new SetPhaseToReleaseForReliefValveScenarioCalculation(Phase.VAPOUR, 1.0, vessel);
|
|
40
|
+
|
|
41
|
+
console.log("Running set_phase_to_be_released_for_relief_valve_scenario_calculation...");
|
|
42
|
+
const resultCode = await calc.run();
|
|
43
|
+
calc.messages.forEach((msg) => console.log(msg));
|
|
44
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
45
|
+
|
|
46
|
+
// Validation
|
|
47
|
+
const expectedPhaseToRelease = 1.0;
|
|
48
|
+
const actualPhaseToRelease = calc.phaseToRelease;
|
|
49
|
+
expect(actualPhaseToRelease).toBeCloseTo(expectedPhaseToRelease, 6);
|
|
50
|
+
|
|
51
|
+
const expectedPipeHeightFraction = 1.0;
|
|
52
|
+
const actualPipeHeightFraction = calc.pipeHeightFractionUpdated!;
|
|
53
|
+
const relError = Math.abs((actualPipeHeightFraction - expectedPipeHeightFraction) / expectedPipeHeightFraction);
|
|
54
|
+
expect(relError).toBeLessThan(1e-3);
|
|
55
|
+
|
|
56
|
+
console.log(
|
|
57
|
+
`SUCCESS: set_phase_to_be_released_for_relief_valve_scenario_calculation (${calc.calculationElapsedTime}ms)`
|
|
58
|
+
);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import {VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { SideviewAtTimeCalculation} from "../../src/calculations/dispersionView";
|
|
4
|
+
import {Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, LocalPosition, 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("SideviewAtTimeCalculation", () => {
|
|
16
|
+
test("should calculate correct sideview dispersion for ETHANE_BUTANE_PROPANE", async () => {
|
|
17
|
+
const material = new Material({
|
|
18
|
+
name: "ETHANE_BUTANE_PROPANE",
|
|
19
|
+
components: [
|
|
20
|
+
new MaterialComponent({ name: "ETHANE", moleFraction: 0.5 }),
|
|
21
|
+
new MaterialComponent({ name: "N-BUTANE", moleFraction: 0.3 }),
|
|
22
|
+
new MaterialComponent({ name: "PROPANE", moleFraction: 0.2 }),
|
|
23
|
+
],
|
|
24
|
+
componentCount: 3,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const state = new State({
|
|
28
|
+
temperature: 265.0,
|
|
29
|
+
pressure: 5.0e5,
|
|
30
|
+
liquidFraction: 0.8,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const surfaceType = SurfaceType.LAND;
|
|
34
|
+
const surfaceRoughness = 0.2;
|
|
35
|
+
const windSpeed = 5.0;
|
|
36
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_A_;
|
|
37
|
+
const endPointConcentration = 0.0;
|
|
38
|
+
const specifyBund = true;
|
|
39
|
+
const bundHeight = 1.0;
|
|
40
|
+
const bundDiameter = 8.0;
|
|
41
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
42
|
+
|
|
43
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
44
|
+
|
|
45
|
+
console.log("Running vessel_state_calculation...");
|
|
46
|
+
let resultCode = await vesselStateCalc.run();
|
|
47
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
48
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
49
|
+
|
|
50
|
+
const vessel = new Vessel({
|
|
51
|
+
state,
|
|
52
|
+
material,
|
|
53
|
+
liquidFillFractionByVolume: 0.8,
|
|
54
|
+
shape: VesselShape.VERTICAL_CYLINDER,
|
|
55
|
+
vesselConditions: vesselStateCalc.vesselConditions!,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const dischargeParams = new DischargeParameters();
|
|
59
|
+
const ruptureCalc = new VesselCatastrophicRuptureCalculation(
|
|
60
|
+
vessel,
|
|
61
|
+
dischargeParams
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
console.log("Running vessel_catastrophic_rupture_calculation...");
|
|
65
|
+
resultCode = await ruptureCalc.run();
|
|
66
|
+
ruptureCalc.messages.forEach((msg) => console.log(msg));
|
|
67
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
68
|
+
|
|
69
|
+
const bund = new Bund({
|
|
70
|
+
specifyBund,
|
|
71
|
+
bundHeight,
|
|
72
|
+
bundDiameter,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const substrate = new Substrate({
|
|
76
|
+
bund,
|
|
77
|
+
surfaceType,
|
|
78
|
+
surfaceRoughness,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const weather = new Weather({
|
|
82
|
+
windSpeed: windSpeed,
|
|
83
|
+
stabilityClass: stabilityClass,
|
|
84
|
+
windProfileFlag: windProfileFlag
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const dispersionParams = new DispersionParameters();
|
|
88
|
+
const dispersionCalc = new DispersionCalculation(
|
|
89
|
+
ruptureCalc.exitMaterial!,
|
|
90
|
+
substrate,
|
|
91
|
+
ruptureCalc.dischargeResult!,
|
|
92
|
+
ruptureCalc.dischargeRecords!,
|
|
93
|
+
ruptureCalc.dischargeRecords!.length,
|
|
94
|
+
weather,
|
|
95
|
+
dispersionParams,
|
|
96
|
+
endPointConcentration
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
console.log("Running dispersion_calculation...");
|
|
100
|
+
resultCode = await dispersionCalc.run();
|
|
101
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
102
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
103
|
+
|
|
104
|
+
const outputConfig = new DispersionOutputConfig({
|
|
105
|
+
concentration: endPointConcentration,
|
|
106
|
+
time: 0,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
const sideviewCalc = new SideviewAtTimeCalculation(
|
|
110
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
111
|
+
weather,
|
|
112
|
+
dispersionCalc.dispersionRecords!,
|
|
113
|
+
dispersionCalc.dispersionRecords!.length,
|
|
114
|
+
substrate,
|
|
115
|
+
outputConfig,
|
|
116
|
+
ruptureCalc.exitMaterial!,
|
|
117
|
+
dispersionParams,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
console.log("Running sideview_at_time_calculation...");
|
|
121
|
+
resultCode = await sideviewCalc.run();
|
|
122
|
+
sideviewCalc.messages.forEach((msg) => console.log(msg));
|
|
123
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
124
|
+
|
|
125
|
+
const contourPoints = sideviewCalc.contourPoints!;
|
|
126
|
+
const dispersionRecords = sideviewCalc.dispersionRecords!;
|
|
127
|
+
|
|
128
|
+
// Check number of contour points
|
|
129
|
+
expect(contourPoints.length).toBe(190);
|
|
130
|
+
|
|
131
|
+
// Check one of the final contour point's x-values
|
|
132
|
+
const targetContourPoint = contourPoints[contourPoints.length - 3];
|
|
133
|
+
const expectedX = 2.8916389790099224;
|
|
134
|
+
const xError = Math.abs((targetContourPoint.x - expectedX) / expectedX);
|
|
135
|
+
expect(xError).toBeLessThan(1e-3);
|
|
136
|
+
|
|
137
|
+
// Check final dispersion record's centreline concentration
|
|
138
|
+
const lastDispersion = dispersionRecords[dispersionRecords.length - 1];
|
|
139
|
+
const expectedConc = 0.004768006933732604;
|
|
140
|
+
const concError = Math.abs(
|
|
141
|
+
(lastDispersion.centrelineConcentration! - expectedConc) / expectedConc
|
|
142
|
+
);
|
|
143
|
+
expect(concError).toBeLessThan(1e-3);
|
|
144
|
+
|
|
145
|
+
console.log(
|
|
146
|
+
`SUCCESS: sideview_at_time_calculation (${sideviewCalc.calculationElapsedTime}ms)`
|
|
147
|
+
);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import {VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { SideviewAtTimeCalculation} from "../../src/calculations/dispersionView";
|
|
4
|
+
import {Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, LocalPosition, 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("SideviewAtTimeCalculation", () => {
|
|
16
|
+
test("should calculate correct sideview dispersion for HEXANE", async () => {
|
|
17
|
+
const material = new Material({
|
|
18
|
+
name: "HEXANE",
|
|
19
|
+
components: [new MaterialComponent({ name: "N-HEXANE", moleFraction: 1.0 })],
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const state = new State({
|
|
23
|
+
temperature: 280.0,
|
|
24
|
+
pressure: 2.0e5,
|
|
25
|
+
liquidFraction: 0.8,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const surfaceType = SurfaceType.WATER;
|
|
29
|
+
const surfaceRoughness = 0.05;
|
|
30
|
+
const windSpeed = 2.0;
|
|
31
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
|
|
32
|
+
const endPointConcentration = 0.0;
|
|
33
|
+
const specifyBund = true;
|
|
34
|
+
const bundHeight = 1.0;
|
|
35
|
+
const bundDiameter = 8.0;
|
|
36
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
37
|
+
|
|
38
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
39
|
+
|
|
40
|
+
console.log("Running vessel_state_calculation...");
|
|
41
|
+
let resultCode = await vesselStateCalc.run();
|
|
42
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
43
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
44
|
+
|
|
45
|
+
const vessel = new Vessel({
|
|
46
|
+
state,
|
|
47
|
+
material,
|
|
48
|
+
liquidFillFractionByVolume: 0.8,
|
|
49
|
+
shape: VesselShape.VERTICAL_CYLINDER,
|
|
50
|
+
vesselConditions: vesselStateCalc.vesselConditions!,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const ruptureCalc = new VesselCatastrophicRuptureCalculation(
|
|
54
|
+
vessel,
|
|
55
|
+
new DischargeParameters()
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
console.log("Running vessel_catastrophic_rupture_calculation...");
|
|
59
|
+
resultCode = await ruptureCalc.run();
|
|
60
|
+
ruptureCalc.messages.forEach((msg) => console.log(msg));
|
|
61
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
62
|
+
|
|
63
|
+
const bund = new Bund({
|
|
64
|
+
specifyBund,
|
|
65
|
+
bundHeight,
|
|
66
|
+
bundDiameter,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const substrate = new Substrate({
|
|
70
|
+
bund,
|
|
71
|
+
surfaceType,
|
|
72
|
+
surfaceRoughness,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const weather = new Weather({
|
|
76
|
+
windSpeed: windSpeed,
|
|
77
|
+
stabilityClass: stabilityClass,
|
|
78
|
+
windProfileFlag: windProfileFlag,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const dispersionParams = new DispersionParameters();
|
|
82
|
+
|
|
83
|
+
const dispersionCalc = new DispersionCalculation(
|
|
84
|
+
ruptureCalc.exitMaterial!,
|
|
85
|
+
substrate,
|
|
86
|
+
ruptureCalc.dischargeResult!,
|
|
87
|
+
ruptureCalc.dischargeRecords!,
|
|
88
|
+
ruptureCalc.dischargeRecords!.length,
|
|
89
|
+
weather,
|
|
90
|
+
dispersionParams,
|
|
91
|
+
endPointConcentration
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
console.log("Running dispersion_calculation...");
|
|
95
|
+
resultCode = await dispersionCalc.run();
|
|
96
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
97
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
98
|
+
|
|
99
|
+
const outputConfig = new DispersionOutputConfig({
|
|
100
|
+
concentration: endPointConcentration,
|
|
101
|
+
time: 0.5,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const sideviewCalc = new SideviewAtTimeCalculation(
|
|
105
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
106
|
+
weather,
|
|
107
|
+
dispersionCalc.dispersionRecords!,
|
|
108
|
+
dispersionCalc.dispersionRecords!.length,
|
|
109
|
+
substrate,
|
|
110
|
+
outputConfig,
|
|
111
|
+
ruptureCalc.exitMaterial!,
|
|
112
|
+
dispersionParams
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
console.log("Running sideview_at_time_calculation...");
|
|
116
|
+
resultCode = await sideviewCalc.run();
|
|
117
|
+
sideviewCalc.messages.forEach((msg) => console.log(msg));
|
|
118
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
119
|
+
|
|
120
|
+
const contourPoints = sideviewCalc.contourPoints!;
|
|
121
|
+
const dispersionRecords = sideviewCalc.dispersionRecords!;
|
|
122
|
+
|
|
123
|
+
// Check number of contour points
|
|
124
|
+
expect(contourPoints.length).toBe(279);
|
|
125
|
+
|
|
126
|
+
// Check x-value of the third-from-last contour point
|
|
127
|
+
const targetContourPoint = contourPoints[contourPoints.length - 3];
|
|
128
|
+
const expectedX = 3.8448647902534274;
|
|
129
|
+
const xError = Math.abs((targetContourPoint.x - expectedX) / expectedX);
|
|
130
|
+
expect(xError).toBeLessThan(1e-3);
|
|
131
|
+
|
|
132
|
+
// Check centreline concentration of the last dispersion record
|
|
133
|
+
const lastDispersion = dispersionRecords[dispersionRecords.length - 1];
|
|
134
|
+
const expectedConc = 0.0033212173007439575;
|
|
135
|
+
const concError = Math.abs(
|
|
136
|
+
(lastDispersion.centrelineConcentration! - expectedConc) / expectedConc
|
|
137
|
+
);
|
|
138
|
+
expect(concError).toBeLessThan(1e-3);
|
|
139
|
+
|
|
140
|
+
console.log(
|
|
141
|
+
`SUCCESS: sideview_at_time_calculation (${sideviewCalc.calculationElapsedTime}ms)`
|
|
142
|
+
);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import {VesselStateCalculation, VesselLeakCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { SideviewAtTimeCalculation} from "../../src/calculations/dispersionView";
|
|
4
|
+
import {Bund, DischargeParameters, DispersionOutputConfig, DispersionParameters, LocalPosition, Leak, Material, MaterialComponent, State, Substrate, Vessel, Weather } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, ResultCode, SurfaceType, VesselShape, TimeVaryingOption, WindProfileFlag } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("SideviewAtTimeCalculation", () => {
|
|
16
|
+
test("should calculate correct sideview dispersion for CARBON DIOXIDE (TOXIC)", async () => {
|
|
17
|
+
const material = new Material({
|
|
18
|
+
name: "CARBON DIOXIDE (TOXIC)",
|
|
19
|
+
components: [new MaterialComponent({ name: "CARBON DIOXIDE (TOXIC)", moleFraction: 1.0 })],
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const state = new State({
|
|
23
|
+
temperature: 280.0,
|
|
24
|
+
pressure: 8.0e6,
|
|
25
|
+
liquidFraction: 0.0,
|
|
26
|
+
});
|
|
27
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
28
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
29
|
+
|
|
30
|
+
console.log("Running vessel_state_calculation...");
|
|
31
|
+
let resultCode = await vesselStateCalc.run();
|
|
32
|
+
vesselStateCalc.messages.forEach((msg) => console.log(msg));
|
|
33
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
34
|
+
|
|
35
|
+
const vessel = new Vessel({
|
|
36
|
+
state: vesselStateCalc.outputState!,
|
|
37
|
+
material: vesselStateCalc.material!,
|
|
38
|
+
vesselConditions: vesselStateCalc.vesselConditions!,
|
|
39
|
+
diameter: 5.0,
|
|
40
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
41
|
+
liquidFillFractionByVolume: 0.8,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const leak = new Leak({
|
|
45
|
+
holeDiameter: 0.008,
|
|
46
|
+
holeHeightFraction: 0.5,
|
|
47
|
+
timeVaryingOption: TimeVaryingOption.INITIAL_RATE,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const dischargeParams = new DischargeParameters();
|
|
51
|
+
|
|
52
|
+
const leakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
53
|
+
|
|
54
|
+
console.log("Running vessel_leak_calculation...");
|
|
55
|
+
resultCode = await leakCalc.run();
|
|
56
|
+
leakCalc.messages.forEach((msg) => console.log(msg));
|
|
57
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
58
|
+
|
|
59
|
+
const substrate = new Substrate({
|
|
60
|
+
surfaceType: SurfaceType.WATER,
|
|
61
|
+
surfaceRoughness: 0.01,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const weather = new Weather({
|
|
65
|
+
windSpeed: 4.0,
|
|
66
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_C,
|
|
67
|
+
windProfileFlag: windProfileFlag
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const dispersionParams = new DispersionParameters();
|
|
71
|
+
|
|
72
|
+
const dispersionCalc = new DispersionCalculation(
|
|
73
|
+
leakCalc.exitMaterial!,
|
|
74
|
+
substrate,
|
|
75
|
+
leakCalc.dischargeResult!,
|
|
76
|
+
leakCalc.dischargeRecords!,
|
|
77
|
+
leakCalc.dischargeRecords!.length,
|
|
78
|
+
weather,
|
|
79
|
+
dispersionParams,
|
|
80
|
+
0.0
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
console.log("Running dispersion_calculation...");
|
|
84
|
+
resultCode = await dispersionCalc.run();
|
|
85
|
+
dispersionCalc.messages.forEach((msg) => console.log(msg));
|
|
86
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
87
|
+
|
|
88
|
+
const outputConfig = new DispersionOutputConfig({
|
|
89
|
+
concentration: 0.0,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const sideviewCalc = new SideviewAtTimeCalculation(
|
|
93
|
+
dispersionCalc.scalarUdmOutputs!,
|
|
94
|
+
weather,
|
|
95
|
+
dispersionCalc.dispersionRecords!,
|
|
96
|
+
dispersionCalc.dispersionRecords!.length,
|
|
97
|
+
substrate,
|
|
98
|
+
outputConfig,
|
|
99
|
+
leakCalc.exitMaterial!,
|
|
100
|
+
dispersionParams
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
console.log("Running sideview_at_time_calculation...");
|
|
104
|
+
resultCode = await sideviewCalc.run();
|
|
105
|
+
sideviewCalc.messages.forEach((msg) => console.log(msg));
|
|
106
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
107
|
+
|
|
108
|
+
const contourPoints = sideviewCalc.contourPoints!;
|
|
109
|
+
const dispersionRecords = sideviewCalc.dispersionRecords!;
|
|
110
|
+
|
|
111
|
+
expect(contourPoints.length).toBe(171);
|
|
112
|
+
|
|
113
|
+
const targetContourPoint = contourPoints[contourPoints.length - 3];
|
|
114
|
+
const expectedX = 6.9777184369577;
|
|
115
|
+
const xError = Math.abs((targetContourPoint.x - expectedX) / expectedX);
|
|
116
|
+
expect(xError).toBeLessThan(1e-3);
|
|
117
|
+
|
|
118
|
+
const lastDispersion = dispersionRecords[dispersionRecords.length - 1];
|
|
119
|
+
const expectedConc = 0.03998493262289725;
|
|
120
|
+
const concError = Math.abs(
|
|
121
|
+
(lastDispersion.centrelineConcentration! - expectedConc) / expectedConc
|
|
122
|
+
);
|
|
123
|
+
expect(concError).toBeLessThan(1e-3);
|
|
124
|
+
|
|
125
|
+
console.log(
|
|
126
|
+
`SUCCESS: sideview_at_time_calculation (${sideviewCalc.calculationElapsedTime}ms)`
|
|
127
|
+
);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|