@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,188 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig, ReliefValve } from "../../src/entities";
|
|
2
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation, VesselReliefValveCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { MaxConcFootprintCalculation } from "../../src/calculations/dispersionView";
|
|
5
|
+
import { ResultCode, SurfaceType, AtmosphericStabilityClass, VesselShape, TimeVaryingOption, WindProfileFlag} from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Max Concentration Footprint Calculation - Test Case 35", () => {
|
|
16
|
+
test("should calculate max concentration footprint correctly for CHLORINE", async () => {
|
|
17
|
+
const material = new Material({
|
|
18
|
+
name: "CHLORINE",
|
|
19
|
+
components: [
|
|
20
|
+
new MaterialComponent({ name: "CHLORINE", moleFraction: 1.0 }),
|
|
21
|
+
],
|
|
22
|
+
componentCount: 1,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const state = new State({
|
|
26
|
+
temperature: 320.0,
|
|
27
|
+
pressure: 1.0e6,
|
|
28
|
+
liquidFraction: 1.0,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
32
|
+
const stateResult = await vesselStateCalculation.run();
|
|
33
|
+
|
|
34
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
35
|
+
console.log("Messages:");
|
|
36
|
+
vesselStateCalculation.messages.forEach((msg) => console.log(msg));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
expect(stateResult).toBe(ResultCode.SUCCESS);
|
|
40
|
+
console.log(
|
|
41
|
+
`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const vessel = new Vessel({
|
|
45
|
+
state,
|
|
46
|
+
material,
|
|
47
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
48
|
+
liquidFillFractionByVolume: 0.7,
|
|
49
|
+
shape: VesselShape.HORIZONTAL_CYLINDER,
|
|
50
|
+
diameter: 2.0,
|
|
51
|
+
length: 5.0,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const reliefValve = new ReliefValve({
|
|
55
|
+
pipeDiameter: 0.02,
|
|
56
|
+
pipeLength: 10.0,
|
|
57
|
+
pipeHeightFraction: 1,
|
|
58
|
+
reliefValveConstrictionDiameter: 0.02,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const vesselReliefValveCalculation = new VesselReliefValveCalculation(
|
|
62
|
+
vessel,
|
|
63
|
+
reliefValve,
|
|
64
|
+
new DischargeParameters()
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const reliefResult = await vesselReliefValveCalculation.run();
|
|
68
|
+
|
|
69
|
+
if (vesselReliefValveCalculation.messages.length > 0) {
|
|
70
|
+
console.log("Messages:");
|
|
71
|
+
vesselReliefValveCalculation.messages.forEach((msg) =>
|
|
72
|
+
console.log(msg)
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
expect(reliefResult).toBe(ResultCode.SUCCESS);
|
|
77
|
+
console.log(
|
|
78
|
+
`SUCCESS: vessel_relief_valve_calculation (${vesselReliefValveCalculation.calculationElapsedTime}ms)`
|
|
79
|
+
);
|
|
80
|
+
console.log(
|
|
81
|
+
`vessel_relief_valve_calculation.discharge_result.release_mass: ${vesselReliefValveCalculation.dischargeResult!.releaseMass} [kg]`
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
const bund = new Bund({
|
|
85
|
+
specifyBund: true,
|
|
86
|
+
bundHeight: 0.5,
|
|
87
|
+
bundDiameter: 5.0,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
const substrate = new Substrate({
|
|
91
|
+
bund,
|
|
92
|
+
surfaceType: SurfaceType.LAND,
|
|
93
|
+
surfaceRoughness: 0.183,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const weather = new Weather({
|
|
97
|
+
windSpeed: 1.5,
|
|
98
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_D,
|
|
99
|
+
windProfileFlag: WindProfileFlag.LOGARITHMIC_PROFILE,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const dispersionParameters = new DispersionParameters();
|
|
103
|
+
|
|
104
|
+
const endPointConcentration = 0.0;
|
|
105
|
+
|
|
106
|
+
const dispersionCalculation = new DispersionCalculation(
|
|
107
|
+
vesselReliefValveCalculation.exitMaterial!,
|
|
108
|
+
substrate,
|
|
109
|
+
vesselReliefValveCalculation.dischargeResult!,
|
|
110
|
+
vesselReliefValveCalculation.dischargeRecords!,
|
|
111
|
+
vesselReliefValveCalculation.dischargeRecords!.length,
|
|
112
|
+
weather,
|
|
113
|
+
dispersionParameters,
|
|
114
|
+
endPointConcentration
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const dispersionResult = await dispersionCalculation.run();
|
|
118
|
+
|
|
119
|
+
if (dispersionCalculation.messages.length > 0) {
|
|
120
|
+
console.log("Messages:");
|
|
121
|
+
dispersionCalculation.messages.forEach((msg) => console.log(msg));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
expect(dispersionResult).toBe(ResultCode.SUCCESS);
|
|
125
|
+
console.log(
|
|
126
|
+
`SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`
|
|
127
|
+
);
|
|
128
|
+
console.log(
|
|
129
|
+
`Length dispersion records = ${dispersionCalculation.dispersionRecords!.length}`
|
|
130
|
+
);
|
|
131
|
+
console.log(
|
|
132
|
+
`Minimum concentration = ${dispersionCalculation.scalarUdmOutputs!.minimumConcentration}`
|
|
133
|
+
);
|
|
134
|
+
console.log(
|
|
135
|
+
`Observer count = ${dispersionCalculation.scalarUdmOutputs!.observerCount}`
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
const lastRecord = dispersionCalculation.dispersionRecords!.at(-1)!;
|
|
139
|
+
console.log(
|
|
140
|
+
`Final centreline concentration = ${lastRecord.centrelineConcentration}`
|
|
141
|
+
);
|
|
142
|
+
console.log(`Final downwind distance = ${lastRecord.downwindDistance}`);
|
|
143
|
+
|
|
144
|
+
const dispersionOutputConfig = new DispersionOutputConfig({
|
|
145
|
+
concentration: endPointConcentration,
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const maxConcFootprintCalculation = new MaxConcFootprintCalculation(
|
|
149
|
+
dispersionCalculation.scalarUdmOutputs!,
|
|
150
|
+
weather,
|
|
151
|
+
dispersionCalculation.dispersionRecords!,
|
|
152
|
+
dispersionCalculation.dispersionRecords!.length,
|
|
153
|
+
substrate,
|
|
154
|
+
dispersionOutputConfig,
|
|
155
|
+
vesselReliefValveCalculation.exitMaterial!,
|
|
156
|
+
dispersionParameters
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const footprintResult = await maxConcFootprintCalculation.run();
|
|
160
|
+
|
|
161
|
+
if (maxConcFootprintCalculation.messages.length > 0) {
|
|
162
|
+
console.log("Messages:");
|
|
163
|
+
maxConcFootprintCalculation.messages.forEach((msg) =>
|
|
164
|
+
console.log(msg)
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
expect(footprintResult).toBe(ResultCode.SUCCESS);
|
|
169
|
+
|
|
170
|
+
const expectedLength = 651;
|
|
171
|
+
const expectedX = 3.5444266994358022;
|
|
172
|
+
const checkPoint =
|
|
173
|
+
maxConcFootprintCalculation.contourPoints![
|
|
174
|
+
maxConcFootprintCalculation.contourPoints!.length - 3
|
|
175
|
+
];
|
|
176
|
+
|
|
177
|
+
expect(maxConcFootprintCalculation.contourPoints!.length).toBe(
|
|
178
|
+
expectedLength
|
|
179
|
+
);
|
|
180
|
+
const xError = Math.abs((checkPoint.x - expectedX) / expectedX);
|
|
181
|
+
expect(xError).toBeLessThan(1e-3);
|
|
182
|
+
|
|
183
|
+
console.log(
|
|
184
|
+
`SUCCESS: max_conc_footprint_calculation (${maxConcFootprintCalculation.calculationElapsedTime}ms)`
|
|
185
|
+
);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig } from "../../src/entities";
|
|
2
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { MaxDistanceToConcCalculation } from "../../src/calculations/dispersionView";
|
|
5
|
+
import { ResultCode, SurfaceType, AtmosphericStabilityClass, VesselShape, WindProfileFlag } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Max Distance to Concentration Calculation - Test Case 111", () => {
|
|
16
|
+
test("should calculate max distance to concentration correctly", async () => {
|
|
17
|
+
// Define the material components
|
|
18
|
+
const material = new Material({
|
|
19
|
+
name: "ETHANE_BUTANE_PROPANE",
|
|
20
|
+
components:
|
|
21
|
+
[
|
|
22
|
+
new MaterialComponent({name: "ETHANE", moleFraction: 0.5}),
|
|
23
|
+
new MaterialComponent({name: "N-BUTANE", moleFraction: 0.3}),
|
|
24
|
+
new MaterialComponent({name: "PROPANE", moleFraction: 0.2}),
|
|
25
|
+
],
|
|
26
|
+
componentCount: 3
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Define the state of the vessel
|
|
30
|
+
const state = new State({ temperature: 265.0, pressure: 5.0e5, liquidFraction: 0.8 });
|
|
31
|
+
|
|
32
|
+
// Define surface type, roughness, and weather conditions
|
|
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
|
+
// Run VesselStateCalculation
|
|
44
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
45
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
46
|
+
|
|
47
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
48
|
+
console.log("Messages:");
|
|
49
|
+
vesselStateCalculation.messages.forEach((message) => console.log(message));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
53
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
54
|
+
|
|
55
|
+
// Set up the vessel
|
|
56
|
+
const vessel = new Vessel({
|
|
57
|
+
state: state,
|
|
58
|
+
material: material,
|
|
59
|
+
liquidFillFractionByVolume: 0.8,
|
|
60
|
+
shape: VesselShape.VERTICAL_CYLINDER,
|
|
61
|
+
vesselConditions: vesselStateCalculation.vesselConditions
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Run VesselCatastrophicRuptureCalculation
|
|
65
|
+
const dischargeParameters = new DischargeParameters();
|
|
66
|
+
const vesselCatastrophicRuptureCalculation = new VesselCatastrophicRuptureCalculation(
|
|
67
|
+
vessel,
|
|
68
|
+
dischargeParameters
|
|
69
|
+
);
|
|
70
|
+
const vesselCatastrophicRuptureResultCode = await vesselCatastrophicRuptureCalculation.run();
|
|
71
|
+
|
|
72
|
+
if (vesselCatastrophicRuptureCalculation.messages.length > 0) {
|
|
73
|
+
console.log("Messages:");
|
|
74
|
+
vesselCatastrophicRuptureCalculation.messages.forEach((message) => console.log(message));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
expect(vesselCatastrophicRuptureResultCode).toBe(ResultCode.SUCCESS);
|
|
78
|
+
console.log(`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselCatastrophicRuptureCalculation.calculationElapsedTime}ms)`);
|
|
79
|
+
|
|
80
|
+
// Set up the entities for DispersionCalculation
|
|
81
|
+
const bund = new Bund({specifyBund: specifyBund, bundHeight: bundHeight, bundDiameter: bundDiameter});
|
|
82
|
+
const substrate = new Substrate({bund, surfaceType, surfaceRoughness});
|
|
83
|
+
const weather = new Weather({ windSpeed: windSpeed, stabilityClass: stabilityClass, windProfileFlag: windProfileFlag });
|
|
84
|
+
const dispersionParameters = new DispersionParameters();
|
|
85
|
+
const dispersionCalculation = new DispersionCalculation(
|
|
86
|
+
vesselCatastrophicRuptureCalculation.exitMaterial!,
|
|
87
|
+
substrate,
|
|
88
|
+
vesselCatastrophicRuptureCalculation.dischargeResult!,
|
|
89
|
+
vesselCatastrophicRuptureCalculation.dischargeRecords!,
|
|
90
|
+
vesselCatastrophicRuptureCalculation.dischargeRecords!.length,
|
|
91
|
+
weather,
|
|
92
|
+
dispersionParameters,
|
|
93
|
+
endPointConcentration
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
const dispersionCalculationResultCode = await dispersionCalculation.run();
|
|
97
|
+
|
|
98
|
+
if (dispersionCalculation.messages.length > 0) {
|
|
99
|
+
console.log("Messages:");
|
|
100
|
+
dispersionCalculation.messages.forEach((message) => console.log(message));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
expect(dispersionCalculationResultCode).toBe(ResultCode.SUCCESS);
|
|
104
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`);
|
|
105
|
+
|
|
106
|
+
// Set up the entities for MaxDistanceToConcCalculation
|
|
107
|
+
const dispersionOutputConfig = new DispersionOutputConfig({concentration: endPointConcentration});
|
|
108
|
+
const maxDistanceToConcCalculation = new MaxDistanceToConcCalculation(
|
|
109
|
+
dispersionCalculation.scalarUdmOutputs!,
|
|
110
|
+
weather,
|
|
111
|
+
dispersionCalculation.dispersionRecords!,
|
|
112
|
+
dispersionCalculation.dispersionRecords!.length,
|
|
113
|
+
substrate,
|
|
114
|
+
dispersionOutputConfig,
|
|
115
|
+
dispersionParameters,
|
|
116
|
+
vesselCatastrophicRuptureCalculation.exitMaterial!
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
const maxDistanceToConcResultCode = await maxDistanceToConcCalculation.run();
|
|
120
|
+
|
|
121
|
+
if (maxDistanceToConcCalculation.messages.length > 0) {
|
|
122
|
+
console.log("Messages:");
|
|
123
|
+
maxDistanceToConcCalculation.messages.forEach((message) => console.log(message));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
expect(maxDistanceToConcResultCode).toBe(ResultCode.SUCCESS);
|
|
127
|
+
|
|
128
|
+
// Check the result for max distance to concentration
|
|
129
|
+
const expectedDistance = 33.46354835021753;
|
|
130
|
+
const distanceError = Math.abs(
|
|
131
|
+
(maxDistanceToConcCalculation.distance! - expectedDistance) / expectedDistance
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
135
|
+
|
|
136
|
+
console.log(`SUCCESS: max_distance_to_conc_calculation (${maxDistanceToConcCalculation.calculationElapsedTime}ms)`);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig } from "../../src/entities";
|
|
2
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { MaxDistanceToConcCalculation } from "../../src/calculations/dispersionView";
|
|
5
|
+
import { ResultCode, SurfaceType, AtmosphericStabilityClass, VesselShape, WindProfileFlag } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Max Distance to Concentration Calculation - Test Case 112", () => {
|
|
16
|
+
test("should calculate max distance to concentration correctly", async () => {
|
|
17
|
+
// Material and components
|
|
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
|
+
// State of the vessel
|
|
27
|
+
const state = new State({
|
|
28
|
+
temperature: 280.0,
|
|
29
|
+
pressure: 2.0e5,
|
|
30
|
+
liquidFraction: 0.8,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Environmental and bund configuration
|
|
34
|
+
const surfaceType = SurfaceType.WATER;
|
|
35
|
+
const surfaceRoughness = 0.05;
|
|
36
|
+
const windSpeed = 2.0;
|
|
37
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
|
|
38
|
+
const endPointConcentration = 0.0;
|
|
39
|
+
const specifyBund = true;
|
|
40
|
+
const bundHeight = 1.0;
|
|
41
|
+
const bundDiameter = 8.0;
|
|
42
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
43
|
+
|
|
44
|
+
// Vessel state calculation
|
|
45
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
46
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
47
|
+
|
|
48
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
49
|
+
console.log("Messages:");
|
|
50
|
+
vesselStateCalculation.messages.forEach((message) =>
|
|
51
|
+
console.log(message)
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
56
|
+
console.log(
|
|
57
|
+
`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// Create the vessel
|
|
61
|
+
const vessel = new Vessel({
|
|
62
|
+
state: state,
|
|
63
|
+
material: material,
|
|
64
|
+
liquidFillFractionByVolume: 0.8,
|
|
65
|
+
shape: VesselShape.VERTICAL_CYLINDER,
|
|
66
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const dischargeParameters = new DischargeParameters();
|
|
70
|
+
const vesselCatastrophicRuptureCalculation =
|
|
71
|
+
new VesselCatastrophicRuptureCalculation(vessel, dischargeParameters);
|
|
72
|
+
|
|
73
|
+
const vesselCatastrophicRuptureResultCode =
|
|
74
|
+
await vesselCatastrophicRuptureCalculation.run();
|
|
75
|
+
|
|
76
|
+
if (vesselCatastrophicRuptureCalculation.messages.length > 0) {
|
|
77
|
+
console.log("Messages:");
|
|
78
|
+
vesselCatastrophicRuptureCalculation.messages.forEach((message) =>
|
|
79
|
+
console.log(message)
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
expect(vesselCatastrophicRuptureResultCode).toBe(ResultCode.SUCCESS);
|
|
84
|
+
console.log(
|
|
85
|
+
`SUCCESS: vessel_catastrophic_rupture_calculation (${vesselCatastrophicRuptureCalculation.calculationElapsedTime}ms)`
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
// Dispersion Calculation
|
|
89
|
+
const bund = new Bund({
|
|
90
|
+
specifyBund: specifyBund,
|
|
91
|
+
bundHeight: bundHeight,
|
|
92
|
+
bundDiameter: bundDiameter,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const substrate = new Substrate({
|
|
96
|
+
bund,
|
|
97
|
+
surfaceType,
|
|
98
|
+
surfaceRoughness,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const weather = new Weather({
|
|
102
|
+
windSpeed: windSpeed,
|
|
103
|
+
stabilityClass: stabilityClass,
|
|
104
|
+
windProfileFlag: windProfileFlag
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const dispersionParameters = new DispersionParameters();
|
|
108
|
+
|
|
109
|
+
const dispersionCalculation = new DispersionCalculation(
|
|
110
|
+
vesselCatastrophicRuptureCalculation.exitMaterial!,
|
|
111
|
+
substrate,
|
|
112
|
+
vesselCatastrophicRuptureCalculation.dischargeResult!,
|
|
113
|
+
vesselCatastrophicRuptureCalculation.dischargeRecords!,
|
|
114
|
+
vesselCatastrophicRuptureCalculation.dischargeRecords!.length,
|
|
115
|
+
weather,
|
|
116
|
+
dispersionParameters,
|
|
117
|
+
endPointConcentration
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const dispersionCalculationResultCode = await dispersionCalculation.run();
|
|
121
|
+
|
|
122
|
+
if (dispersionCalculation.messages.length > 0) {
|
|
123
|
+
console.log("Messages:");
|
|
124
|
+
dispersionCalculation.messages.forEach((message) =>
|
|
125
|
+
console.log(message)
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
expect(dispersionCalculationResultCode).toBe(ResultCode.SUCCESS);
|
|
130
|
+
console.log(
|
|
131
|
+
`SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
// Max Distance to Concentration Calculation
|
|
135
|
+
const dispersionOutputConfig = new DispersionOutputConfig({
|
|
136
|
+
concentration: endPointConcentration,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
const maxDistanceToConcCalculation = new MaxDistanceToConcCalculation(
|
|
140
|
+
dispersionCalculation.scalarUdmOutputs!,
|
|
141
|
+
weather,
|
|
142
|
+
dispersionCalculation.dispersionRecords!,
|
|
143
|
+
dispersionCalculation.dispersionRecords!.length,
|
|
144
|
+
substrate,
|
|
145
|
+
dispersionOutputConfig,
|
|
146
|
+
dispersionParameters,
|
|
147
|
+
vesselCatastrophicRuptureCalculation.exitMaterial!
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
const maxDistanceToConcResultCode = await maxDistanceToConcCalculation.run();
|
|
151
|
+
|
|
152
|
+
if (maxDistanceToConcCalculation.messages.length > 0) {
|
|
153
|
+
console.log("Messages:");
|
|
154
|
+
maxDistanceToConcCalculation.messages.forEach((message) =>
|
|
155
|
+
console.log(message)
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
expect(maxDistanceToConcResultCode).toBe(ResultCode.SUCCESS);
|
|
160
|
+
|
|
161
|
+
// Validate the calculated distance
|
|
162
|
+
const expectedDistance = 13.21859690146534;
|
|
163
|
+
const distanceError = Math.abs(
|
|
164
|
+
(maxDistanceToConcCalculation.distance! - expectedDistance) /
|
|
165
|
+
expectedDistance
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
169
|
+
console.log(
|
|
170
|
+
`SUCCESS: max_distance_to_conc_calculation (${maxDistanceToConcCalculation.calculationElapsedTime}ms)`
|
|
171
|
+
);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { Material, MaterialComponent, State, Vessel, Bund, Substrate, DischargeParameters, Weather, DispersionParameters, DispersionOutputConfig, Leak } from "../../src/entities";
|
|
2
|
+
import { VesselCatastrophicRuptureCalculation, VesselStateCalculation, VesselLeakCalculation } from "../../src/calculations/discharge";
|
|
3
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
4
|
+
import { MaxDistanceToConcCalculation } from "../../src/calculations/dispersionView";
|
|
5
|
+
import { ResultCode, SurfaceType, AtmosphericStabilityClass, VesselShape, TimeVaryingOption, WindProfileFlag } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("Max Distance to Concentration Calculation - Test Case 113", () => {
|
|
16
|
+
test("should calculate max distance to concentration correctly", async () => {
|
|
17
|
+
// Case properties
|
|
18
|
+
const materialName = "CARBON DIOXIDE (TOXIC)";
|
|
19
|
+
const stateTemperature = 280.0;
|
|
20
|
+
const statePressure = 8.0e6;
|
|
21
|
+
const vesselShape = VesselShape.VESSEL_SPHERE;
|
|
22
|
+
const vesselDiameter = 5.0;
|
|
23
|
+
const leakHoleDiameter = 0.008;
|
|
24
|
+
const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
|
|
25
|
+
const leakHoleHeightFraction = 0.5;
|
|
26
|
+
const surfaceType = SurfaceType.WATER;
|
|
27
|
+
const surfaceRoughness = 0.01;
|
|
28
|
+
const windSpeed = 4.0;
|
|
29
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_C;
|
|
30
|
+
const endPointConcentration = 0.0;
|
|
31
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
32
|
+
|
|
33
|
+
// Initial state and material setup
|
|
34
|
+
const state = new State({
|
|
35
|
+
temperature: stateTemperature,
|
|
36
|
+
pressure: statePressure,
|
|
37
|
+
liquidFraction: 0.0,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const material = new Material({
|
|
41
|
+
name: materialName,
|
|
42
|
+
components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
|
|
43
|
+
componentCount: 1,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
47
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
48
|
+
|
|
49
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
50
|
+
console.log("Messages:");
|
|
51
|
+
vesselStateCalculation.messages.forEach((message) => console.log(message));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
55
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
56
|
+
|
|
57
|
+
const vessel = new Vessel({
|
|
58
|
+
state: vesselStateCalculation.outputState!,
|
|
59
|
+
material: vesselStateCalculation.material!,
|
|
60
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
61
|
+
diameter: vesselDiameter,
|
|
62
|
+
shape: vesselShape,
|
|
63
|
+
liquidFillFractionByVolume: 0.8,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const leak = new Leak({
|
|
67
|
+
holeDiameter: leakHoleDiameter,
|
|
68
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
69
|
+
timeVaryingOption: timeVaryingOption,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const dischargeParameters = new DischargeParameters();
|
|
73
|
+
|
|
74
|
+
const vesselLeakCalculation = new VesselLeakCalculation(vessel, leak, dischargeParameters);
|
|
75
|
+
const vesselLeakResultCode = await vesselLeakCalculation.run();
|
|
76
|
+
|
|
77
|
+
if (vesselLeakCalculation.messages.length > 0) {
|
|
78
|
+
console.log("Messages:");
|
|
79
|
+
vesselLeakCalculation.messages.forEach((message) => console.log(message));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
expect(vesselLeakResultCode).toBe(ResultCode.SUCCESS);
|
|
83
|
+
console.log(`SUCCESS: vessel_leak_calculation (${vesselLeakCalculation.calculationElapsedTime}ms)`);
|
|
84
|
+
|
|
85
|
+
const substrate = new Substrate({
|
|
86
|
+
surfaceType,
|
|
87
|
+
surfaceRoughness,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
const weather = new Weather({
|
|
91
|
+
windSpeed: windSpeed,
|
|
92
|
+
stabilityClass: stabilityClass,
|
|
93
|
+
windProfileFlag: windProfileFlag
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const dispersionParameters = new DispersionParameters();
|
|
97
|
+
|
|
98
|
+
const dispersionCalculation = new DispersionCalculation(
|
|
99
|
+
vesselLeakCalculation.exitMaterial!,
|
|
100
|
+
substrate,
|
|
101
|
+
vesselLeakCalculation.dischargeResult!,
|
|
102
|
+
vesselLeakCalculation.dischargeRecords!,
|
|
103
|
+
vesselLeakCalculation.dischargeRecords!.length,
|
|
104
|
+
weather,
|
|
105
|
+
dispersionParameters,
|
|
106
|
+
endPointConcentration
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const dispersionResultCode = await dispersionCalculation.run();
|
|
110
|
+
|
|
111
|
+
if (dispersionCalculation.messages.length > 0) {
|
|
112
|
+
console.log("Messages:");
|
|
113
|
+
dispersionCalculation.messages.forEach((message) => console.log(message));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
expect(dispersionResultCode).toBe(ResultCode.SUCCESS);
|
|
117
|
+
console.log(`SUCCESS: dispersion_calculation (${dispersionCalculation.calculationElapsedTime}ms)`);
|
|
118
|
+
|
|
119
|
+
const dispersionOutputConfig = new DispersionOutputConfig({
|
|
120
|
+
concentration: endPointConcentration,
|
|
121
|
+
elevation: 2.5,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
const maxDistanceToConcCalculation = new MaxDistanceToConcCalculation(
|
|
125
|
+
dispersionCalculation.scalarUdmOutputs!,
|
|
126
|
+
weather,
|
|
127
|
+
dispersionCalculation.dispersionRecords!,
|
|
128
|
+
dispersionCalculation.dispersionRecords!.length,
|
|
129
|
+
substrate,
|
|
130
|
+
dispersionOutputConfig,
|
|
131
|
+
dispersionParameters,
|
|
132
|
+
vesselLeakCalculation.exitMaterial!
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
const maxDistanceResultCode = await maxDistanceToConcCalculation.run();
|
|
136
|
+
|
|
137
|
+
if (maxDistanceToConcCalculation.messages.length > 0) {
|
|
138
|
+
console.log("Messages:");
|
|
139
|
+
maxDistanceToConcCalculation.messages.forEach((message) => console.log(message));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
expect(maxDistanceResultCode).toBe(ResultCode.SUCCESS);
|
|
143
|
+
|
|
144
|
+
const expectedDistance = 10.10724753690727;
|
|
145
|
+
const distanceError = Math.abs(
|
|
146
|
+
(maxDistanceToConcCalculation.distance! - expectedDistance) / expectedDistance
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
expect(distanceError).toBeLessThan(1e-3);
|
|
150
|
+
console.log(`SUCCESS: max_distance_to_conc_calculation (${maxDistanceToConcCalculation.calculationElapsedTime}ms)`);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|