@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,127 @@
|
|
|
1
|
+
import { VesselStateCalculation,VesselLeakCalculation} from "../../src/calculations/discharge";
|
|
2
|
+
import { JetFireCalculation} from "../../src/calculations/jetFire";
|
|
3
|
+
import { RadiationContourCalculation} 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, ContourType} 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("RadiationContourCalculation Integration", () => {
|
|
16
|
+
test("should perform full pipeline and produce expected flame and contour data", async () => {
|
|
17
|
+
// Initial parameters
|
|
18
|
+
const materialName = "METHANE";
|
|
19
|
+
const stateTemperature = 280.0;
|
|
20
|
+
const statePressure = 1.0e6;
|
|
21
|
+
const vesselShape = VesselShape.VESSEL_SPHERE;
|
|
22
|
+
const vesselDiameter = 3.0;
|
|
23
|
+
const leakHoleDiameter = 0.1;
|
|
24
|
+
const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
|
|
25
|
+
const leakHoleHeightFraction = 0.5;
|
|
26
|
+
const liquidFillFraction = 0.0;
|
|
27
|
+
const windSpeed = 2.0;
|
|
28
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
|
|
29
|
+
const timeOfInterest = 3600.0;
|
|
30
|
+
const radiationResolution = Resolution.MEDIUM;
|
|
31
|
+
|
|
32
|
+
const state = new State({
|
|
33
|
+
temperature: stateTemperature,
|
|
34
|
+
pressure: statePressure,
|
|
35
|
+
liquidFraction: 0.0,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const material = new Material({
|
|
39
|
+
name: materialName,
|
|
40
|
+
components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
44
|
+
console.log("Running vesselStateCalculation...");
|
|
45
|
+
let resultCode = await vesselStateCalc.run();
|
|
46
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
47
|
+
|
|
48
|
+
const vessel = new Vessel({
|
|
49
|
+
state: vesselStateCalc.outputState,
|
|
50
|
+
material: vesselStateCalc.material,
|
|
51
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
52
|
+
location: new LocalPosition(),
|
|
53
|
+
diameter: vesselDiameter,
|
|
54
|
+
shape: vesselShape,
|
|
55
|
+
liquidFillFractionByVolume: liquidFillFraction,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const leak = new Leak({
|
|
59
|
+
holeDiameter: leakHoleDiameter,
|
|
60
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
61
|
+
timeVaryingOption: timeVaryingOption,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const dischargeParams = new DischargeParameters();
|
|
65
|
+
|
|
66
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
67
|
+
console.log("Running vesselLeakCalculation...");
|
|
68
|
+
resultCode = await vesselLeakCalc.run();
|
|
69
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
70
|
+
|
|
71
|
+
const weather = new Weather({ windSpeed, stabilityClass });
|
|
72
|
+
const substrate = new Substrate();
|
|
73
|
+
const flammableParams = new FlammableParameters({ timeOfInterest });
|
|
74
|
+
|
|
75
|
+
const jetFireCalc = new JetFireCalculation(
|
|
76
|
+
vesselLeakCalc.exitMaterial!,
|
|
77
|
+
vesselLeakCalc.dischargeRecords!,
|
|
78
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
79
|
+
vesselLeakCalc.dischargeResult!,
|
|
80
|
+
weather,
|
|
81
|
+
substrate,
|
|
82
|
+
flammableParams
|
|
83
|
+
);
|
|
84
|
+
console.log("Running jetFireCalculation...");
|
|
85
|
+
resultCode = await jetFireCalc.run();
|
|
86
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
87
|
+
|
|
88
|
+
const flammableOutputConfigs = [0, 1, 2].map((z) => {
|
|
89
|
+
return new FlammableOutputConfig({
|
|
90
|
+
position: new LocalPosition({x: 0.0, y: 0.0, z: z}),
|
|
91
|
+
transect: new Transect({
|
|
92
|
+
transectStartPoint: new LocalPosition(),
|
|
93
|
+
transectEndPoint: new LocalPosition(),
|
|
94
|
+
}),
|
|
95
|
+
radiationResolution,
|
|
96
|
+
contourType: ContourType.SIDEVIEW
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const radiationContourCalc = new RadiationContourCalculation(
|
|
101
|
+
jetFireCalc.flameResult!,
|
|
102
|
+
jetFireCalc.flameRecords!,
|
|
103
|
+
jetFireCalc.flameRecords!.length,
|
|
104
|
+
weather,
|
|
105
|
+
jetFireCalc.flammableParameters,
|
|
106
|
+
flammableOutputConfigs[0]
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
console.log("Running radiationContourCalculation...");
|
|
110
|
+
resultCode = await radiationContourCalc.run();
|
|
111
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
112
|
+
|
|
113
|
+
// Regression tests
|
|
114
|
+
expect(radiationContourCalc.contourPoints!.length).toBe(182);
|
|
115
|
+
|
|
116
|
+
const xCoord = radiationContourCalc.contourPoints!.at(-2)?.x!;
|
|
117
|
+
expect(Math.abs((xCoord - 0.3857580731049737) / 0.3857580731049737)).toBeLessThan(1e-3);
|
|
118
|
+
|
|
119
|
+
const flameLength = radiationContourCalc.flameResult.flameLength!;
|
|
120
|
+
expect(Math.abs((flameLength - 33.750426875730376) / 33.750426875730376)).toBeLessThan(1e-3);
|
|
121
|
+
|
|
122
|
+
console.log(
|
|
123
|
+
`SUCCESS: radiation_contour_calculation (${radiationContourCalc.calculationElapsedTime}ms)`
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { VesselStateCalculation,VesselLeakCalculation} from "../../src/calculations/discharge";
|
|
2
|
+
import { JetFireCalculation} from "../../src/calculations/jetFire";
|
|
3
|
+
import { RadiationContourCalculation} 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, ContourType} 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("RadiationContourCalculation Integration - Test Case 52", () => {
|
|
16
|
+
test("should produce correct radiation contour results for N-BUTANE", async () => {
|
|
17
|
+
const materialName = "N-BUTANE";
|
|
18
|
+
const stateTemperature = 220.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.5;
|
|
26
|
+
const windSpeed = 2.0;
|
|
27
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
|
|
28
|
+
const timeOfInterest = 2600.0;
|
|
29
|
+
const radiationResolution = Resolution.HIGH;
|
|
30
|
+
|
|
31
|
+
const state = new State({
|
|
32
|
+
temperature: stateTemperature,
|
|
33
|
+
pressure: statePressure,
|
|
34
|
+
liquidFraction: 0.0,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const material = new Material({
|
|
38
|
+
name: materialName,
|
|
39
|
+
components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
43
|
+
console.log("Running vesselStateCalculation...");
|
|
44
|
+
let resultCode = await vesselStateCalc.run();
|
|
45
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
46
|
+
|
|
47
|
+
const vessel = new Vessel({
|
|
48
|
+
state: vesselStateCalc.outputState,
|
|
49
|
+
material: vesselStateCalc.material,
|
|
50
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
51
|
+
location: new LocalPosition(),
|
|
52
|
+
diameter: vesselDiameter,
|
|
53
|
+
shape: vesselShape,
|
|
54
|
+
liquidFillFractionByVolume: liquidFillFraction,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const leak = new Leak({
|
|
58
|
+
holeDiameter: leakHoleDiameter,
|
|
59
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
60
|
+
timeVaryingOption: timeVaryingOption,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const dischargeParams = new DischargeParameters();
|
|
64
|
+
|
|
65
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
66
|
+
console.log("Running vesselLeakCalculation...");
|
|
67
|
+
resultCode = await vesselLeakCalc.run();
|
|
68
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
69
|
+
|
|
70
|
+
const weather = new Weather({ windSpeed, stabilityClass });
|
|
71
|
+
const substrate = new Substrate();
|
|
72
|
+
const flammableParams = new FlammableParameters({ timeOfInterest });
|
|
73
|
+
|
|
74
|
+
const jetFireCalc = new JetFireCalculation(
|
|
75
|
+
vesselLeakCalc.exitMaterial!,
|
|
76
|
+
vesselLeakCalc.dischargeRecords!,
|
|
77
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
78
|
+
vesselLeakCalc.dischargeResult!,
|
|
79
|
+
weather,
|
|
80
|
+
substrate,
|
|
81
|
+
flammableParams
|
|
82
|
+
);
|
|
83
|
+
console.log("Running jetFireCalculation...");
|
|
84
|
+
resultCode = await jetFireCalc.run();
|
|
85
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
86
|
+
|
|
87
|
+
const flammableOutputConfigs = [2.0, 4.0, 5.0].map((z) => {
|
|
88
|
+
return new FlammableOutputConfig({
|
|
89
|
+
position: new LocalPosition({ x: 0.0, y: 0.0, z }),
|
|
90
|
+
transect: new Transect({
|
|
91
|
+
transectStartPoint: new LocalPosition(),
|
|
92
|
+
transectEndPoint: new LocalPosition(),
|
|
93
|
+
}),
|
|
94
|
+
radiationResolution,
|
|
95
|
+
contourType: ContourType.SIDEVIEW
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const radiationContourCalc = new RadiationContourCalculation(
|
|
100
|
+
jetFireCalc.flameResult!,
|
|
101
|
+
jetFireCalc.flameRecords!,
|
|
102
|
+
jetFireCalc.flameRecords!.length,
|
|
103
|
+
weather,
|
|
104
|
+
jetFireCalc.flammableParameters,
|
|
105
|
+
flammableOutputConfigs[0]
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
console.log("Running radiationContourCalculation...");
|
|
109
|
+
resultCode = await radiationContourCalc.run();
|
|
110
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
111
|
+
|
|
112
|
+
// Regression checks
|
|
113
|
+
expect(radiationContourCalc.contourPoints!.length).toBe(360);
|
|
114
|
+
|
|
115
|
+
const xCoord = radiationContourCalc.contourPoints!.at(-2)?.x!;
|
|
116
|
+
expect(Math.abs((xCoord - (-42.092296747468765)) / -42.092296747468765)).toBeLessThan(1e-3);
|
|
117
|
+
|
|
118
|
+
const flameLength = radiationContourCalc.flameResult.flameLength!;
|
|
119
|
+
expect(Math.abs((flameLength - 138.4978616734956) / 138.4978616734956)).toBeLessThan(1e-3);
|
|
120
|
+
|
|
121
|
+
console.log(
|
|
122
|
+
`SUCCESS: radiation_contour_calculation (${radiationContourCalc.calculationElapsedTime}ms)`
|
|
123
|
+
);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { VesselStateCalculation,VesselLeakCalculation} from "../../src/calculations/discharge";
|
|
2
|
+
import { JetFireCalculation} from "../../src/calculations/jetFire";
|
|
3
|
+
import { RadiationContourCalculation} 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, ContourType} 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("RadiationContourCalculation Integration - Test Case 53", () => {
|
|
16
|
+
test("should produce correct radiation contour results for PROPANE", async () => {
|
|
17
|
+
const materialName = "PROPANE";
|
|
18
|
+
const stateTemperature = 290.0;
|
|
19
|
+
const statePressure = 5.0e5;
|
|
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.3;
|
|
25
|
+
const liquidFillFraction = 0.4;
|
|
26
|
+
const windSpeed = 2.0;
|
|
27
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
|
|
28
|
+
const timeOfInterest = 2600.0;
|
|
29
|
+
const radiationResolution = Resolution.LOW;
|
|
30
|
+
|
|
31
|
+
const state = new State({
|
|
32
|
+
temperature: stateTemperature,
|
|
33
|
+
pressure: statePressure,
|
|
34
|
+
liquidFraction: 0.0,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const material = new Material({
|
|
38
|
+
name: materialName,
|
|
39
|
+
components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })],
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
43
|
+
console.log("Running vesselStateCalculation...");
|
|
44
|
+
let resultCode = await vesselStateCalc.run();
|
|
45
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
46
|
+
|
|
47
|
+
const vessel = new Vessel({
|
|
48
|
+
state: vesselStateCalc.outputState,
|
|
49
|
+
material: vesselStateCalc.material,
|
|
50
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
51
|
+
location: new LocalPosition(),
|
|
52
|
+
diameter: vesselDiameter,
|
|
53
|
+
shape: vesselShape,
|
|
54
|
+
liquidFillFractionByVolume: liquidFillFraction,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const leak = new Leak({
|
|
58
|
+
holeDiameter: leakHoleDiameter,
|
|
59
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
60
|
+
timeVaryingOption: timeVaryingOption,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const dischargeParams = new DischargeParameters();
|
|
64
|
+
|
|
65
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
66
|
+
console.log("Running vesselLeakCalculation...");
|
|
67
|
+
resultCode = await vesselLeakCalc.run();
|
|
68
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
69
|
+
|
|
70
|
+
const weather = new Weather({ windSpeed, stabilityClass });
|
|
71
|
+
const substrate = new Substrate();
|
|
72
|
+
const flammableParams = new FlammableParameters({ timeOfInterest });
|
|
73
|
+
|
|
74
|
+
const jetFireCalc = new JetFireCalculation(
|
|
75
|
+
vesselLeakCalc.exitMaterial!,
|
|
76
|
+
vesselLeakCalc.dischargeRecords!,
|
|
77
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
78
|
+
vesselLeakCalc.dischargeResult!,
|
|
79
|
+
weather,
|
|
80
|
+
substrate,
|
|
81
|
+
flammableParams
|
|
82
|
+
);
|
|
83
|
+
console.log("Running jetFireCalculation...");
|
|
84
|
+
resultCode = await jetFireCalc.run();
|
|
85
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
86
|
+
|
|
87
|
+
const flammableOutputConfigs = [2.0, 3.0, 6.0].map((z) => {
|
|
88
|
+
return new FlammableOutputConfig({
|
|
89
|
+
position: new LocalPosition({ x: 0.0, y: 0.0, z }),
|
|
90
|
+
transect: new Transect({
|
|
91
|
+
transectStartPoint: new LocalPosition(),
|
|
92
|
+
transectEndPoint: new LocalPosition(),
|
|
93
|
+
}),
|
|
94
|
+
radiationResolution,
|
|
95
|
+
contourType: ContourType.FOOTPRINT
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const radiationContourCalc = new RadiationContourCalculation(
|
|
100
|
+
jetFireCalc.flameResult!,
|
|
101
|
+
jetFireCalc.flameRecords!,
|
|
102
|
+
jetFireCalc.flameRecords!.length,
|
|
103
|
+
weather,
|
|
104
|
+
jetFireCalc.flammableParameters,
|
|
105
|
+
flammableOutputConfigs[0]
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
console.log("Running radiationContourCalculation...");
|
|
109
|
+
resultCode = await radiationContourCalc.run();
|
|
110
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
111
|
+
|
|
112
|
+
// Regression checks
|
|
113
|
+
expect(radiationContourCalc.contourPoints!.length).toBe(99);
|
|
114
|
+
|
|
115
|
+
const xCoord = radiationContourCalc.contourPoints!.at(-2)?.x!;
|
|
116
|
+
expect(Math.abs((xCoord - 7.78359999167067) / 7.78359999167067)).toBeLessThan(1e-3);
|
|
117
|
+
|
|
118
|
+
const flameLength = radiationContourCalc.flameResult.flameLength!;
|
|
119
|
+
expect(Math.abs((flameLength - 31.712372512867706) / 31.712372512867706)).toBeLessThan(1e-3);
|
|
120
|
+
|
|
121
|
+
console.log(
|
|
122
|
+
`SUCCESS: radiation_contour_calculation (${radiationContourCalc.calculationElapsedTime}ms)`
|
|
123
|
+
);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { VesselStateCalculation,VesselLeakCalculation} from "../../src/calculations/discharge";
|
|
2
|
+
import { JetFireCalculation} from "../../src/calculations/jetFire";
|
|
3
|
+
import { RadiationContourCalculation} 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, ContourType} 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("RadiationContourCalculation Integration - Test Case 54", () => {
|
|
16
|
+
test("should produce correct radiation contour results for ETHANE_METHANE_HYDROGEN", async () => {
|
|
17
|
+
const materialName = "ETHANE_METHANE_HYDROGEN";
|
|
18
|
+
const stateTemperature = 360.0;
|
|
19
|
+
const statePressure = 3.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.3;
|
|
25
|
+
const liquidFillFraction = 0.4;
|
|
26
|
+
const windSpeed = 2.0;
|
|
27
|
+
const stabilityClass = AtmosphericStabilityClass.STABILITY_F;
|
|
28
|
+
const timeOfInterest = 2600.0;
|
|
29
|
+
const radiationResolution = Resolution.HIGH;
|
|
30
|
+
|
|
31
|
+
const state = new State({
|
|
32
|
+
temperature: stateTemperature,
|
|
33
|
+
pressure: statePressure,
|
|
34
|
+
liquidFraction: 0.0,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const material = new Material({
|
|
38
|
+
name: materialName,
|
|
39
|
+
components: [
|
|
40
|
+
new MaterialComponent({ name: "ETHANE", moleFraction: 0.5 }),
|
|
41
|
+
new MaterialComponent({ name: "METHANE", moleFraction: 0.3 }),
|
|
42
|
+
new MaterialComponent({ name: "HYDROGEN", moleFraction: 0.2 }),
|
|
43
|
+
],
|
|
44
|
+
componentCount: 3,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const vesselStateCalc = new VesselStateCalculation(material, state);
|
|
48
|
+
console.log("Running vesselStateCalculation...");
|
|
49
|
+
let resultCode = await vesselStateCalc.run();
|
|
50
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
51
|
+
|
|
52
|
+
const vessel = new Vessel({
|
|
53
|
+
state: vesselStateCalc.outputState,
|
|
54
|
+
material: vesselStateCalc.material,
|
|
55
|
+
vesselConditions: vesselStateCalc.vesselConditions,
|
|
56
|
+
location: new LocalPosition(),
|
|
57
|
+
diameter: vesselDiameter,
|
|
58
|
+
shape: vesselShape,
|
|
59
|
+
liquidFillFractionByVolume: liquidFillFraction,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const leak = new Leak({
|
|
63
|
+
holeDiameter: leakHoleDiameter,
|
|
64
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
65
|
+
timeVaryingOption: timeVaryingOption,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const dischargeParams = new DischargeParameters();
|
|
69
|
+
|
|
70
|
+
const vesselLeakCalc = new VesselLeakCalculation(vessel, leak, dischargeParams);
|
|
71
|
+
console.log("Running vesselLeakCalculation...");
|
|
72
|
+
resultCode = await vesselLeakCalc.run();
|
|
73
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
74
|
+
|
|
75
|
+
const weather = new Weather({ windSpeed, stabilityClass });
|
|
76
|
+
const substrate = new Substrate();
|
|
77
|
+
const flammableParams = new FlammableParameters({ timeOfInterest });
|
|
78
|
+
|
|
79
|
+
const jetFireCalc = new JetFireCalculation(
|
|
80
|
+
vesselLeakCalc.exitMaterial!,
|
|
81
|
+
vesselLeakCalc.dischargeRecords!,
|
|
82
|
+
vesselLeakCalc.dischargeRecords!.length,
|
|
83
|
+
vesselLeakCalc.dischargeResult!,
|
|
84
|
+
weather,
|
|
85
|
+
substrate,
|
|
86
|
+
flammableParams
|
|
87
|
+
);
|
|
88
|
+
console.log("Running jetFireCalculation...");
|
|
89
|
+
resultCode = await jetFireCalc.run();
|
|
90
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
91
|
+
|
|
92
|
+
const flammableOutputConfigs = [2.0, 5.0, 6.0].map((z) => {
|
|
93
|
+
return new FlammableOutputConfig({
|
|
94
|
+
position: new LocalPosition({ x: 0.0, y: 0.0, z }),
|
|
95
|
+
transect: new Transect({
|
|
96
|
+
transectStartPoint: new LocalPosition(),
|
|
97
|
+
transectEndPoint: new LocalPosition(),
|
|
98
|
+
}),
|
|
99
|
+
radiationResolution,
|
|
100
|
+
contourType: ContourType.FOOTPRINT
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const radiationContourCalc = new RadiationContourCalculation(
|
|
105
|
+
jetFireCalc.flameResult!,
|
|
106
|
+
jetFireCalc.flameRecords!,
|
|
107
|
+
jetFireCalc.flameRecords!.length,
|
|
108
|
+
weather,
|
|
109
|
+
jetFireCalc.flammableParameters,
|
|
110
|
+
flammableOutputConfigs[0]
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
console.log("Running radiationContourCalculation...");
|
|
114
|
+
resultCode = await radiationContourCalc.run();
|
|
115
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
116
|
+
|
|
117
|
+
// Regression checks
|
|
118
|
+
expect(radiationContourCalc.contourPoints!.length).toBe(463);
|
|
119
|
+
|
|
120
|
+
const xCoord = radiationContourCalc.contourPoints!.at(-2)?.x!;
|
|
121
|
+
expect(Math.abs((xCoord - 26.0094272142727627) / 26.009427214272762)).toBeLessThan(1e-3);
|
|
122
|
+
|
|
123
|
+
const flameLength = radiationContourCalc.flameResult.flameLength!;
|
|
124
|
+
expect(Math.abs((flameLength - 52.44271020259119) / 52.44271020259119)).toBeLessThan(1e-3);
|
|
125
|
+
|
|
126
|
+
console.log(
|
|
127
|
+
`SUCCESS: radiation_contour_calculation (${radiationContourCalc.calculationElapsedTime}ms)`
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ReliefValveMinTemperatureCalculation } from "../../src/calculations/utilities";
|
|
2
|
+
import { Material, MaterialComponent } from "../../src/entities";
|
|
3
|
+
import { ResultCode } 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("ReliefValveMinTemperatureCalculation", () => {
|
|
14
|
+
test("should correctly compute minimum temperature for PROPANE at 1e6 Pa", async () => {
|
|
15
|
+
const material = new Material({
|
|
16
|
+
name: "PROPANE",
|
|
17
|
+
components: [
|
|
18
|
+
new MaterialComponent({
|
|
19
|
+
name: "PROPANE",
|
|
20
|
+
moleFraction: 1.0,
|
|
21
|
+
}),
|
|
22
|
+
],
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const pressure = 1e6;
|
|
26
|
+
|
|
27
|
+
const calc = new ReliefValveMinTemperatureCalculation(material, pressure);
|
|
28
|
+
|
|
29
|
+
console.log("Running relief_valve_min_temperature_calculation...");
|
|
30
|
+
const resultCode = await calc.run();
|
|
31
|
+
|
|
32
|
+
if (calc.messages.length > 0) {
|
|
33
|
+
console.log("Messages:");
|
|
34
|
+
calc.messages.forEach((msg) => console.log(msg));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
38
|
+
|
|
39
|
+
const expectedMinTemp = 300.04391253626204;
|
|
40
|
+
const actualMinTemp = calc.minTemperature!;
|
|
41
|
+
const tolerance = 1e-3;
|
|
42
|
+
|
|
43
|
+
expect(Math.abs((actualMinTemp - expectedMinTemp) / expectedMinTemp)).toBeLessThan(tolerance);
|
|
44
|
+
|
|
45
|
+
console.log(
|
|
46
|
+
`SUCCESS: relief_valve_min_temperature_calculation (${calc.calculationElapsedTime}ms)`
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { SetMixingLayerHeightCalculation } from "../../src/calculations/utilities";
|
|
2
|
+
import { Weather } from "../../src/entities";
|
|
3
|
+
import { AtmosphericStabilityClass, ResultCode } 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("SetMixingLayerHeightCalculation", () => {
|
|
14
|
+
test("should correctly set mixing layer height based on stability class and wind speed", async () => {
|
|
15
|
+
const weather = new Weather({
|
|
16
|
+
windSpeed: 5.0,
|
|
17
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_A_,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const calc = new SetMixingLayerHeightCalculation(weather);
|
|
21
|
+
|
|
22
|
+
console.log("Running set_mixing_layer_height_calculation...");
|
|
23
|
+
const resultCode = await calc.run();
|
|
24
|
+
calc.messages.forEach((msg) => console.log(msg));
|
|
25
|
+
|
|
26
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
27
|
+
|
|
28
|
+
const expectedMixingLayerHeight = 1300.0;
|
|
29
|
+
const actualMixingLayerHeight = calc.updatedWeather!.mixingLayerHeight!;
|
|
30
|
+
expect(actualMixingLayerHeight).toBeCloseTo(expectedMixingLayerHeight, 6);
|
|
31
|
+
|
|
32
|
+
console.log(
|
|
33
|
+
`SUCCESS: set_mixing_layer_height_calculation (${calc.calculationElapsedTime}ms)`
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { SetMixingLayerHeightCalculation } from "../../src/calculations/utilities";
|
|
2
|
+
import { Weather } from "../../src/entities";
|
|
3
|
+
import { AtmosphericStabilityClass, ResultCode } 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("SetMixingLayerHeightCalculation", () => {
|
|
14
|
+
test("should correctly set mixing layer height for stability class D and wind speed 5.0", async () => {
|
|
15
|
+
const weather = new Weather({
|
|
16
|
+
windSpeed: 5.0,
|
|
17
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_D,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const calc = new SetMixingLayerHeightCalculation(weather);
|
|
21
|
+
|
|
22
|
+
console.log("Running set_mixing_layer_height_calculation...");
|
|
23
|
+
const resultCode = await calc.run();
|
|
24
|
+
calc.messages.forEach((msg) => console.log(msg));
|
|
25
|
+
|
|
26
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
27
|
+
|
|
28
|
+
const expectedMixingLayerHeight = 800.0;
|
|
29
|
+
const actualMixingLayerHeight = calc.updatedWeather!.mixingLayerHeight!;
|
|
30
|
+
expect(actualMixingLayerHeight).toBeCloseTo(expectedMixingLayerHeight, 6);
|
|
31
|
+
|
|
32
|
+
console.log(
|
|
33
|
+
`SUCCESS: set_mixing_layer_height_calculation (${calc.calculationElapsedTime}ms)`
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { SetMixingLayerHeightCalculation } from "../../src/calculations/utilities";
|
|
2
|
+
import { Weather } from "../../src/entities";
|
|
3
|
+
import { AtmosphericStabilityClass, ResultCode } 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("SetMixingLayerHeightCalculation", () => {
|
|
14
|
+
test("should correctly set mixing layer height for stability class F and wind speed 5.0", async () => {
|
|
15
|
+
const weather = new Weather({
|
|
16
|
+
windSpeed: 5.0,
|
|
17
|
+
stabilityClass: AtmosphericStabilityClass.STABILITY_F,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const calc = new SetMixingLayerHeightCalculation(weather);
|
|
21
|
+
|
|
22
|
+
console.log("Running set_mixing_layer_height_calculation...");
|
|
23
|
+
const resultCode = await calc.run();
|
|
24
|
+
calc.messages.forEach((msg) => console.log(msg));
|
|
25
|
+
|
|
26
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
27
|
+
|
|
28
|
+
const expectedMixingLayerHeight = 100.0;
|
|
29
|
+
const actualMixingLayerHeight = calc.updatedWeather!.mixingLayerHeight!;
|
|
30
|
+
expect(actualMixingLayerHeight).toBeCloseTo(expectedMixingLayerHeight, 6);
|
|
31
|
+
|
|
32
|
+
console.log(
|
|
33
|
+
`SUCCESS: set_mixing_layer_height_calculation (${calc.calculationElapsedTime}ms)`
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
});
|