@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,176 @@
|
|
|
1
|
+
import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { PoolFireCalculation } from "../../src/calculations/poolFire";
|
|
4
|
+
import { DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation } from "../../src/calculations/radiation";
|
|
5
|
+
import { Bund, DischargeParameters, DispersionParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
|
|
6
|
+
import { AtmosphericStabilityClass, PoolFireType, ResultCode, TimeVaryingOption, VesselShape, WindProfileFlag } from "../../src/enums";
|
|
7
|
+
import { setAccessToken } from "../../src/utilities";
|
|
8
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
9
|
+
|
|
10
|
+
if (!accessToken) {
|
|
11
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
setAccessToken(accessToken);
|
|
15
|
+
|
|
16
|
+
describe("Vessel Leak Calculation Test Case 45", () => {
|
|
17
|
+
test("should produce correct radiation results for pool fire", async () => {
|
|
18
|
+
// Define the test case properties
|
|
19
|
+
const materialName = 'TOLUENE';
|
|
20
|
+
const stateTemperature = 280.0;
|
|
21
|
+
const statePressure = 1.50e5;
|
|
22
|
+
const vesselShape = VesselShape.HORIZONTAL_CYLINDER;
|
|
23
|
+
const vesselLength = 5.0;
|
|
24
|
+
const vesselDiameter = 2.0;
|
|
25
|
+
const leakHoleDiameter = 0.05;
|
|
26
|
+
const timeVaryingOption = TimeVaryingOption.TIME_VARYING_RATE;
|
|
27
|
+
const leakHoleHeightFraction = 0.0;
|
|
28
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
29
|
+
|
|
30
|
+
// Create state and material
|
|
31
|
+
const state = new State({
|
|
32
|
+
temperature: stateTemperature,
|
|
33
|
+
pressure: statePressure,
|
|
34
|
+
liquidFraction: 0.0,
|
|
35
|
+
});
|
|
36
|
+
const material = new Material({
|
|
37
|
+
name: materialName,
|
|
38
|
+
components: [
|
|
39
|
+
new MaterialComponent({ name: materialName, moleFraction: 1.0 }),
|
|
40
|
+
],
|
|
41
|
+
componentCount: 1,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Run vessel state calculation
|
|
45
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
46
|
+
let resultCode = await vesselStateCalc.run();
|
|
47
|
+
|
|
48
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
49
|
+
console.log("Messages:");
|
|
50
|
+
vesselStateCalc.messages.forEach((message) => console.log(message));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
54
|
+
|
|
55
|
+
// Create vessel and leak
|
|
56
|
+
const vessel = new Vessel({
|
|
57
|
+
state: vesselStateCalc.outputState,
|
|
58
|
+
material: vesselStateCalc.material,
|
|
59
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
60
|
+
diameter: vesselDiameter,
|
|
61
|
+
length: vesselLength,
|
|
62
|
+
shape: vesselShape,
|
|
63
|
+
liquidFillFractionByVolume: 0.5,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const leak = new Leak({
|
|
67
|
+
holeDiameter: leakHoleDiameter,
|
|
68
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
69
|
+
timeVaryingOption: timeVaryingOption,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const dischargeParams = new DischargeParameters();
|
|
73
|
+
|
|
74
|
+
// Run vessel leak calculation
|
|
75
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
76
|
+
resultCode = await vesselLeakCalc.run();
|
|
77
|
+
|
|
78
|
+
if (vesselLeakCalc.messages.length > 0) {
|
|
79
|
+
console.log("Messages:");
|
|
80
|
+
vesselLeakCalc.messages.forEach((message) => console.log(message));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
84
|
+
|
|
85
|
+
// Define weather and substrate
|
|
86
|
+
const weather = new Weather({
|
|
87
|
+
windSpeed: 1.0,
|
|
88
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_C,
|
|
89
|
+
windProfileFlag: windProfileFlag
|
|
90
|
+
});
|
|
91
|
+
const substrate = new Substrate();
|
|
92
|
+
|
|
93
|
+
// Run dispersion calculation
|
|
94
|
+
const dispersionCalc = new DispersionCalculation(
|
|
95
|
+
vesselLeakCalc.exitMaterial!,
|
|
96
|
+
substrate,
|
|
97
|
+
vesselLeakCalc.dischargeResult!,
|
|
98
|
+
vesselLeakCalc.dischargeRecords!,
|
|
99
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
100
|
+
weather,
|
|
101
|
+
new DispersionParameters(),
|
|
102
|
+
0.0
|
|
103
|
+
);
|
|
104
|
+
resultCode = await dispersionCalc.run();
|
|
105
|
+
|
|
106
|
+
if (dispersionCalc.messages.length > 0) {
|
|
107
|
+
console.log("Messages:");
|
|
108
|
+
dispersionCalc.messages.forEach((message) => console.log(message));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
112
|
+
|
|
113
|
+
// Define flammable parameters
|
|
114
|
+
const flammableParams = new FlammableParameters({
|
|
115
|
+
poolFireType: PoolFireType.LATE,
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Run pool fire calculation
|
|
119
|
+
const poolFireCalc = new PoolFireCalculation(
|
|
120
|
+
vesselLeakCalc.exitMaterial!,
|
|
121
|
+
dispersionCalc.poolRecords!,
|
|
122
|
+
dispersionCalc.poolRecords!.length,
|
|
123
|
+
weather,
|
|
124
|
+
substrate,
|
|
125
|
+
flammableParams
|
|
126
|
+
);
|
|
127
|
+
resultCode = await poolFireCalc.run();
|
|
128
|
+
|
|
129
|
+
if (poolFireCalc.messages.length > 0) {
|
|
130
|
+
console.log("Messages:");
|
|
131
|
+
poolFireCalc.messages.forEach((message) => console.log(message));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
135
|
+
|
|
136
|
+
// Define flammable output config
|
|
137
|
+
const flammableOutputConfigs = [
|
|
138
|
+
{ x: 0.0, y: 0.0, z: 0.0 },
|
|
139
|
+
{ x: 0.0, y: 0.0, z: 1.0 },
|
|
140
|
+
{ x: 0.0, y: 0.0, z: 2.0 },
|
|
141
|
+
].map(({ x, y, z }) => {
|
|
142
|
+
return new FlammableOutputConfig({
|
|
143
|
+
position: new LocalPosition({ x, y, z })
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Run distances and ellipses to radiation levels for pool fires calculation
|
|
148
|
+
const radiationCalc = new DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation(
|
|
149
|
+
poolFireCalc.poolFireFlameResult!,
|
|
150
|
+
poolFireCalc.flameRecords!,
|
|
151
|
+
poolFireCalc.flameRecords!.length,
|
|
152
|
+
weather,
|
|
153
|
+
flammableParams,
|
|
154
|
+
flammableOutputConfigs,
|
|
155
|
+
flammableOutputConfigs.length
|
|
156
|
+
);
|
|
157
|
+
resultCode = await radiationCalc.run();
|
|
158
|
+
|
|
159
|
+
if (radiationCalc.messages.length > 0) {
|
|
160
|
+
console.log("Messages:");
|
|
161
|
+
radiationCalc.messages.forEach((message) => console.log(message));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
165
|
+
|
|
166
|
+
// Assertions for regression results
|
|
167
|
+
expect(radiationCalc.contourPoints!.length).toBe(150);
|
|
168
|
+
expect(
|
|
169
|
+
Math.abs(
|
|
170
|
+
(radiationCalc.contourPoints![radiationCalc.contourPoints!.length - 1].x - 63.6457305261025) / 63.6457305261025
|
|
171
|
+
)
|
|
172
|
+
).toBeLessThan(1e-3);
|
|
173
|
+
expect(
|
|
174
|
+
Math.abs((radiationCalc.poolFireFlameResult.flameDiameter! - 49.78919982910156) /49.78919982910156)).toBeLessThan(1e-3);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DispersionCalculation } from "../../src/calculations/dispersion";
|
|
3
|
+
import { PoolFireCalculation } from "../../src/calculations/poolFire";
|
|
4
|
+
import { DistancesAndEllipsesToRadiationLevelsForPoolFiresCalculation, RadiationAtPointsForPoolFiresCalculation } from "../../src/calculations/radiation";
|
|
5
|
+
import { Bund, DischargeParameters, DispersionParameters, FlammableOutputConfig, FlammableParameters, Leak, LocalPosition, Material, MaterialComponent, State, Substrate, Transect, Vessel, Weather } from "../../src/entities";
|
|
6
|
+
import { AtmosphericStabilityClass, PoolFireType, ResultCode, TimeVaryingOption, VesselShape, WindProfileFlag } from "../../src/enums";
|
|
7
|
+
import { setAccessToken } from "../../src/utilities";
|
|
8
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
9
|
+
|
|
10
|
+
if (!accessToken) {
|
|
11
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
setAccessToken(accessToken);
|
|
15
|
+
|
|
16
|
+
describe("Vessel Leak Calculation Integration - Test Case 45a", () => {
|
|
17
|
+
test("should produce correct radiation results for pool fire", async () => {
|
|
18
|
+
// Set the case properties.
|
|
19
|
+
const materialName = 'TOLUENE';
|
|
20
|
+
const stateTemperature = 280.0;
|
|
21
|
+
const statePressure = 1.50e5;
|
|
22
|
+
const vesselShape = VesselShape.HORIZONTAL_CYLINDER;
|
|
23
|
+
const vesselLength = 5.0;
|
|
24
|
+
const vesselDiameter = 2.0;
|
|
25
|
+
const leakHoleDiameter = 0.05;
|
|
26
|
+
const timeVaryingOption = TimeVaryingOption.TIME_VARYING_RATE;
|
|
27
|
+
const leakHoleHeightFraction = 0.0;
|
|
28
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE
|
|
29
|
+
|
|
30
|
+
// Define the initial state of the vessel.
|
|
31
|
+
const state = new State({
|
|
32
|
+
temperature: stateTemperature,
|
|
33
|
+
pressure: statePressure,
|
|
34
|
+
liquidFraction: 0.0,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Define the material contained by the vessel.
|
|
38
|
+
const material = new Material({
|
|
39
|
+
name: materialName,
|
|
40
|
+
components: [
|
|
41
|
+
new MaterialComponent({ name: materialName, moleFraction: 1.0 })
|
|
42
|
+
],
|
|
43
|
+
componentCount: 1,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Create a vessel state calculation using the material and state.
|
|
47
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
48
|
+
let resultCode = await vesselStateCalc.run();
|
|
49
|
+
|
|
50
|
+
// Print any messages.
|
|
51
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
52
|
+
console.log("Messages:");
|
|
53
|
+
vesselStateCalc.messages.forEach((message) => console.log(message));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
57
|
+
|
|
58
|
+
// Create a vessel to use in the leak calculation using the previously defined entities.
|
|
59
|
+
const vessel = new Vessel({
|
|
60
|
+
state: vesselStateCalc.outputState,
|
|
61
|
+
material: vesselStateCalc.material,
|
|
62
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
63
|
+
diameter: vesselDiameter,
|
|
64
|
+
length: vesselLength,
|
|
65
|
+
shape: vesselShape,
|
|
66
|
+
liquidFillFractionByVolume: 0.5,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Create a leak to use in the vessel leak calculation.
|
|
70
|
+
const leak = new Leak({
|
|
71
|
+
holeDiameter: leakHoleDiameter,
|
|
72
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
73
|
+
timeVaryingOption: timeVaryingOption,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Create discharge parameters to use in the vessel leak calculation taking all the default values.
|
|
77
|
+
const dischargeParams = new DischargeParameters();
|
|
78
|
+
|
|
79
|
+
// Create a vessel leak calculation using the vessel, leak, and discharge parameters.
|
|
80
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
81
|
+
resultCode = await vesselLeakCalc.run();
|
|
82
|
+
|
|
83
|
+
// Print any messages.
|
|
84
|
+
if (vesselLeakCalc.messages.length > 0) {
|
|
85
|
+
console.log("Messages:");
|
|
86
|
+
vesselLeakCalc.messages.forEach((message) => console.log(message));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
90
|
+
|
|
91
|
+
// Define the weather.
|
|
92
|
+
const weather = new Weather({
|
|
93
|
+
windSpeed: 1.0,
|
|
94
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_C,
|
|
95
|
+
windProfileFlag: windProfileFlag,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// Define the substrate.
|
|
99
|
+
const substrate = new Substrate();
|
|
100
|
+
|
|
101
|
+
// Create a dispersion calculation based on the vessel leak calculation, weather, substrate, and dispersion parameters.
|
|
102
|
+
const dispersionCalc = new DispersionCalculation(
|
|
103
|
+
vesselLeakCalc.exitMaterial!,
|
|
104
|
+
substrate,
|
|
105
|
+
vesselLeakCalc.dischargeResult!,
|
|
106
|
+
vesselLeakCalc.dischargeRecords!,
|
|
107
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
108
|
+
weather,
|
|
109
|
+
new DispersionParameters(),
|
|
110
|
+
0.0,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
resultCode = await dispersionCalc.run();
|
|
114
|
+
|
|
115
|
+
// Print any messages.
|
|
116
|
+
if (dispersionCalc.messages.length > 0) {
|
|
117
|
+
console.log("Messages:");
|
|
118
|
+
dispersionCalc.messages.forEach((message) => console.log(message));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
122
|
+
|
|
123
|
+
// Define flammable parameters.
|
|
124
|
+
const flammableParams = new FlammableParameters({
|
|
125
|
+
poolFireType: PoolFireType.LATE,
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// Create a pool fire calculation based on the dispersion calculation, weather, substrate, and flammable parameters.
|
|
129
|
+
const poolFireCalc = new PoolFireCalculation(
|
|
130
|
+
vesselLeakCalc.exitMaterial!,
|
|
131
|
+
dispersionCalc.poolRecords!,
|
|
132
|
+
dispersionCalc.poolRecords!.length,
|
|
133
|
+
weather,
|
|
134
|
+
substrate,
|
|
135
|
+
flammableParams
|
|
136
|
+
);
|
|
137
|
+
resultCode = await poolFireCalc.run();
|
|
138
|
+
|
|
139
|
+
// Print any messages.
|
|
140
|
+
if (poolFireCalc.messages.length > 0) {
|
|
141
|
+
console.log("Messages:");
|
|
142
|
+
poolFireCalc.messages.forEach((message) => console.log(message));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
146
|
+
|
|
147
|
+
// Define a flammable output config.
|
|
148
|
+
const flammableOutputConfigs = [
|
|
149
|
+
{ x: 0.0, y: 0.0, z: 0.0 },
|
|
150
|
+
{ x: 0.0, y: 0.0, z: 1.0 },
|
|
151
|
+
{ x: 0.0, y: 0.0, z: 2.0 },
|
|
152
|
+
].map(({ x, y, z }) => {
|
|
153
|
+
return new FlammableOutputConfig({
|
|
154
|
+
position: new LocalPosition({ x, y, z })
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// Create a radiation points calculation based on the pool fire calculation, weather, substrate, and flammable output config.
|
|
159
|
+
const radiationCalc = new RadiationAtPointsForPoolFiresCalculation(
|
|
160
|
+
poolFireCalc.poolFireFlameResult!,
|
|
161
|
+
poolFireCalc.flameRecords!,
|
|
162
|
+
poolFireCalc.flameRecords!.length,
|
|
163
|
+
weather,
|
|
164
|
+
flammableParams,
|
|
165
|
+
flammableOutputConfigs,
|
|
166
|
+
flammableOutputConfigs.length
|
|
167
|
+
);
|
|
168
|
+
resultCode = await radiationCalc.run();
|
|
169
|
+
|
|
170
|
+
// Print any messages.
|
|
171
|
+
if (radiationCalc.messages.length > 0) {
|
|
172
|
+
console.log("Messages:");
|
|
173
|
+
radiationCalc.messages.forEach((message) => console.log(message));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
177
|
+
|
|
178
|
+
// Assertions for regression results
|
|
179
|
+
expect(Math.abs((radiationCalc.radiation![0] - 139644.9375) / 139644.9375)).toBeLessThan(1e-3);
|
|
180
|
+
expect(Math.abs((radiationCalc.poolFireFlameResult.flameDiameter! - 49.78919982910156) / 49.78919982910156)).toBeLessThan(1e-3);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { VesselStateCalculation, VesselLeakCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { JetFireCalculation } from "../../src/calculations/jetFire";
|
|
3
|
+
import { RadiationAtPointsCalculation } from "../../src/calculations/radiation";
|
|
4
|
+
import { State, Material, MaterialComponent, Vessel, Leak, DischargeParameters, Weather, Substrate, FlammableParameters, FlammableOutputConfig, Transect, LocalPosition } from "../../src/entities";
|
|
5
|
+
import { AtmosphericStabilityClass, ResultCode, Resolution, TimeVaryingOption, VesselShape, WindProfileFlag } from "../../src/enums";
|
|
6
|
+
import { setAccessToken } from "../../src/utilities";
|
|
7
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
8
|
+
|
|
9
|
+
if (!accessToken) {
|
|
10
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
setAccessToken(accessToken);
|
|
14
|
+
|
|
15
|
+
describe("RadiationAtPointsCalculation Integration - Test Case 69", () => {
|
|
16
|
+
test("should produce correct radiation results for METHANE", async () => {
|
|
17
|
+
const materialName = "METHANE";
|
|
18
|
+
const stateTemperature = 280.0;
|
|
19
|
+
const statePressure = 1.0e6;
|
|
20
|
+
const vesselShape = VesselShape.VESSEL_SPHERE;
|
|
21
|
+
const vesselDiameter = 3.0;
|
|
22
|
+
const leakHoleDiameter = 0.1;
|
|
23
|
+
const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
|
|
24
|
+
const leakHoleHeightFraction = 0.5;
|
|
25
|
+
const liquidFillFraction = 0.0;
|
|
26
|
+
const windSpeed = 2.0;
|
|
27
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
|
|
28
|
+
const timeOfInterest = 3600.0;
|
|
29
|
+
const radiationResolution = Resolution.MEDIUM;
|
|
30
|
+
const windProfileFlag = WindProfileFlag.LOGARITHMIC_PROFILE;
|
|
31
|
+
|
|
32
|
+
// Define the initial state of the vessel
|
|
33
|
+
const state = new State({
|
|
34
|
+
temperature: stateTemperature,
|
|
35
|
+
pressure: statePressure,
|
|
36
|
+
liquidFraction: 0.0,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Define the material contained by the vessel
|
|
40
|
+
const material = new Material({
|
|
41
|
+
name: materialName,
|
|
42
|
+
components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Create a vessel state calculation using the material and state
|
|
46
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
47
|
+
let resultCode = await vesselStateCalc.run();
|
|
48
|
+
|
|
49
|
+
// Check if there are any messages
|
|
50
|
+
if (vesselStateCalc.messages.length > 0) {
|
|
51
|
+
vesselStateCalc.messages.forEach((message) => console.log(message));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Validate the result of the vessel state calculation
|
|
55
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
56
|
+
|
|
57
|
+
// Create a vessel to use in the leak calculation using the previously defined entities
|
|
58
|
+
const vessel = new Vessel({
|
|
59
|
+
state: vesselStateCalc.outputState,
|
|
60
|
+
material: vesselStateCalc.material,
|
|
61
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
62
|
+
location: new LocalPosition(),
|
|
63
|
+
diameter: vesselDiameter,
|
|
64
|
+
shape: vesselShape,
|
|
65
|
+
liquidFillFractionByVolume: liquidFillFraction,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Create a leak to use in the vessel leak calculation
|
|
69
|
+
const leak = new Leak({
|
|
70
|
+
holeDiameter: leakHoleDiameter,
|
|
71
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
72
|
+
timeVaryingOption: timeVaryingOption,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Create discharge parameters for the vessel leak calculation
|
|
76
|
+
const dischargeParams = new DischargeParameters();
|
|
77
|
+
|
|
78
|
+
// Create a vessel leak calculation using the vessel, leak, and discharge parameters
|
|
79
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
80
|
+
resultCode = await vesselLeakCalc.run();
|
|
81
|
+
|
|
82
|
+
// Check if there are any messages
|
|
83
|
+
if (vesselLeakCalc.messages.length > 0) {
|
|
84
|
+
vesselLeakCalc.messages.forEach((message) => console.log(message));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Validate the result of the vessel leak calculation
|
|
88
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
89
|
+
|
|
90
|
+
// Instantiate the data required by the jet fire calculation
|
|
91
|
+
const weather = new Weather({
|
|
92
|
+
windSpeed: windSpeed,
|
|
93
|
+
stabilityClass: stabilityClass,
|
|
94
|
+
windProfileFlag: windProfileFlag,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const substrate = new Substrate();
|
|
98
|
+
const flammableParams = new FlammableParameters({ timeOfInterest });
|
|
99
|
+
|
|
100
|
+
// Create a jet fire calculation using the required input data
|
|
101
|
+
const jetFireCalc = new JetFireCalculation(
|
|
102
|
+
vesselLeakCalc.exitMaterial!,
|
|
103
|
+
vesselLeakCalc.dischargeRecords!,
|
|
104
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
105
|
+
vesselLeakCalc.dischargeResult!,
|
|
106
|
+
weather,
|
|
107
|
+
substrate,
|
|
108
|
+
flammableParams
|
|
109
|
+
);
|
|
110
|
+
resultCode = await jetFireCalc.run();
|
|
111
|
+
|
|
112
|
+
// Check if there are any messages
|
|
113
|
+
if (jetFireCalc.messages.length > 0) {
|
|
114
|
+
jetFireCalc.messages.forEach((message) => console.log(message));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Validate the result of the jet fire calculation
|
|
118
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
119
|
+
|
|
120
|
+
// Create flammable output configurations
|
|
121
|
+
const flammableOutputConfigs = [
|
|
122
|
+
{ x: 10.0, y: 0.0, z: 0.0 },
|
|
123
|
+
{ x: 15.0, y: 0.0, z: 1.0 },
|
|
124
|
+
{ x: 20.0, y: 0.0, z: 2.0 },
|
|
125
|
+
].map(({ x, y, z }) => {
|
|
126
|
+
return new FlammableOutputConfig({
|
|
127
|
+
position: new LocalPosition({ x, y, z }),
|
|
128
|
+
transect: new Transect({
|
|
129
|
+
transectStartPoint: new LocalPosition(),
|
|
130
|
+
transectEndPoint: new LocalPosition(),
|
|
131
|
+
}),
|
|
132
|
+
radiationResolution: radiationResolution,
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// Create a radiation at points calculation using the flame result, flame records, weather, flammable parameters, and flammable output configurations
|
|
137
|
+
const radiationAtPointsCalc = new RadiationAtPointsCalculation(
|
|
138
|
+
jetFireCalc.flameResult!,
|
|
139
|
+
jetFireCalc.flameRecords!,
|
|
140
|
+
jetFireCalc.flameRecords!.length,
|
|
141
|
+
weather,
|
|
142
|
+
jetFireCalc.flammableParameters,
|
|
143
|
+
flammableOutputConfigs,
|
|
144
|
+
flammableOutputConfigs.length
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
// Run the radiation at points calculation
|
|
148
|
+
resultCode = await radiationAtPointsCalc.run();
|
|
149
|
+
|
|
150
|
+
// Check if there are any messages
|
|
151
|
+
if (radiationAtPointsCalc.messages.length > 0) {
|
|
152
|
+
radiationAtPointsCalc.messages.forEach((message) => console.log(message));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Validate the result of the radiation at points calculation
|
|
156
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
157
|
+
|
|
158
|
+
const radiationResult = radiationAtPointsCalc.radiation![0];
|
|
159
|
+
const expectedRadiation = 24404.931814667765;
|
|
160
|
+
const radiationTolerance = 1e-3;
|
|
161
|
+
expect(Math.abs((radiationResult - expectedRadiation) / expectedRadiation)).toBeLessThan(radiationTolerance);
|
|
162
|
+
|
|
163
|
+
const flameLength = radiationAtPointsCalc.flameResult.flameLength!;
|
|
164
|
+
const expectedFlameLength = 33.750426875730376;
|
|
165
|
+
expect(Math.abs((flameLength - expectedFlameLength) / expectedFlameLength)).toBeLessThan(radiationTolerance);
|
|
166
|
+
});
|
|
167
|
+
});
|