@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,77 @@
|
|
|
1
|
+
import { VesselLineRuptureCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { Material, MaterialComponent, State, Vessel, LineRupture, DischargeParameters } from "../../src/entities";
|
|
3
|
+
import { ResultCode, VesselShape } from "../../src/enums";
|
|
4
|
+
import { setAccessToken } from "../../src/utilities";
|
|
5
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
6
|
+
|
|
7
|
+
if (!accessToken) {
|
|
8
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
setAccessToken(accessToken);
|
|
12
|
+
describe("Test Case - VLR PROPANE", () => {
|
|
13
|
+
test("Vessel line rupture calculation for PROPANE", async () => {
|
|
14
|
+
// Define the initial state of the vessel
|
|
15
|
+
const state = new State({
|
|
16
|
+
temperature: 250.0,
|
|
17
|
+
pressure: 3.0e5,
|
|
18
|
+
liquidFraction: 1.0
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Define the material contained by the vessel
|
|
22
|
+
const material = new Material({
|
|
23
|
+
name: "PROPANE",
|
|
24
|
+
components: [
|
|
25
|
+
new MaterialComponent({ name: "PROPANE", moleFraction: 1.0 })
|
|
26
|
+
]
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Run the vessel state calculation
|
|
30
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
31
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
32
|
+
|
|
33
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
34
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
35
|
+
|
|
36
|
+
// Define the vessel (horizontal cylinder: 2m diameter, 5m length)
|
|
37
|
+
const vessel = new Vessel({
|
|
38
|
+
state: state,
|
|
39
|
+
material: material,
|
|
40
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
41
|
+
liquidFillFractionByVolume: 0.7,
|
|
42
|
+
shape: VesselShape.HORIZONTAL_CYLINDER,
|
|
43
|
+
diameter: 2,
|
|
44
|
+
length: 5
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Define the line rupture (0.1m diameter, 5m length, height fraction 0.3)
|
|
48
|
+
const lineRupture = new LineRupture({
|
|
49
|
+
pipeDiameter: 0.1,
|
|
50
|
+
pipeLength: 5.0,
|
|
51
|
+
pipeHeightFraction: 0.3
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Run the vessel line rupture calculation
|
|
55
|
+
const vesselLineRuptureCalculation = new VesselLineRuptureCalculation(vessel, lineRupture, new DischargeParameters());
|
|
56
|
+
const resultCode = await vesselLineRuptureCalculation.run();
|
|
57
|
+
|
|
58
|
+
expect(resultCode).toBe(ResultCode.SUCCESS);
|
|
59
|
+
|
|
60
|
+
if (vesselLineRuptureCalculation.messages.length > 0) {
|
|
61
|
+
console.log("Messages:");
|
|
62
|
+
vesselLineRuptureCalculation.messages.forEach(msg => console.log(msg));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const dischargeRecords = vesselLineRuptureCalculation.dischargeRecords!;
|
|
66
|
+
const dischargeResult = vesselLineRuptureCalculation.dischargeResult!;
|
|
67
|
+
|
|
68
|
+
expect(dischargeRecords.length).toBe(2);
|
|
69
|
+
expect(Math.abs((dischargeRecords[0].massFlow! - 67.02362285598161) / 67.02362285598161)).toBeLessThan(1e-3);
|
|
70
|
+
expect(Math.abs((dischargeRecords[0].finalState.temperature! - 231.07970451768477) / 231.07970451768477)).toBeLessThan(1e-3);
|
|
71
|
+
expect(Math.abs((dischargeRecords[0].finalVelocity! - 63.51263298624852) / 63.51263298624852)).toBeLessThan(1e-3);
|
|
72
|
+
expect(Math.abs((dischargeResult.releaseMass! - 6149.058906744638) / 6149.058906744638)).toBeLessThan(1e-3);
|
|
73
|
+
|
|
74
|
+
console.log(`vessel_line_rupture_calculation.discharge_result.release_mass: ${dischargeResult.releaseMass} [kg]`);
|
|
75
|
+
console.log(`SUCCESS: vessel_line_rupture_calculation (${vesselLineRuptureCalculation.calculationElapsedTime}ms)`);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { VesselReliefValveCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DischargeParameters, Material, MaterialComponent, ReliefValve, State, Vessel} from "../../src/entities";
|
|
3
|
+
import { ResultCode, VesselShape } from "../../src/enums";
|
|
4
|
+
|
|
5
|
+
import { setAccessToken } from "../../src/utilities";
|
|
6
|
+
|
|
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('Vessel Relief Valve Calculation - Chlorine', () => {
|
|
16
|
+
test('Vessel relief valve calculation for Chlorine', async () => {
|
|
17
|
+
// Set the case properties
|
|
18
|
+
const materialName = 'CHLORINE';
|
|
19
|
+
const stateTemperature = 320.0;
|
|
20
|
+
const statePressure = 1.0E+06;
|
|
21
|
+
const liquidFraction = 1.0;
|
|
22
|
+
const vesselShape = VesselShape.HORIZONTAL_CYLINDER;
|
|
23
|
+
const vesselDiameter = 2.0;
|
|
24
|
+
const vesselLength = 5.0;
|
|
25
|
+
const reliefValvePipeDiameter = 0.02;
|
|
26
|
+
const reliefValvePipeLength = 10.0;
|
|
27
|
+
const reliefValveConstrictionDiameter = 0.02;
|
|
28
|
+
|
|
29
|
+
// Define the initial state of the vessel
|
|
30
|
+
const state = new State({
|
|
31
|
+
temperature: stateTemperature,
|
|
32
|
+
pressure: statePressure,
|
|
33
|
+
liquidFraction: liquidFraction
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Define the material contained by the vessel
|
|
37
|
+
const material = new Material({
|
|
38
|
+
name: materialName,
|
|
39
|
+
components: [
|
|
40
|
+
new MaterialComponent({ name: materialName, moleFraction: 1.0 })
|
|
41
|
+
]
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Create a vessel state calculation using the material and state
|
|
45
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
46
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
47
|
+
|
|
48
|
+
// Check vessel state calculation result
|
|
49
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
50
|
+
|
|
51
|
+
// Create a vessel using the calculated state and material
|
|
52
|
+
const vessel = new Vessel({
|
|
53
|
+
state: vesselStateCalculation.outputState!,
|
|
54
|
+
material: vesselStateCalculation.material,
|
|
55
|
+
liquidFillFractionByVolume: 0.7,
|
|
56
|
+
shape: vesselShape,
|
|
57
|
+
diameter: vesselDiameter,
|
|
58
|
+
length: vesselLength,
|
|
59
|
+
vesselConditions: vesselStateCalculation.vesselConditions
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Create a relief valve to use in the vessel relief valve calculation
|
|
63
|
+
const reliefValve = new ReliefValve({
|
|
64
|
+
pipeDiameter: reliefValvePipeDiameter,
|
|
65
|
+
pipeLength: reliefValvePipeLength,
|
|
66
|
+
pipeHeightFraction: 1.0,
|
|
67
|
+
reliefValveConstrictionDiameter: reliefValveConstrictionDiameter
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Create a vessel relief valve calculation
|
|
71
|
+
const dischargeParameters = new DischargeParameters();
|
|
72
|
+
const vesselReliefValveCalculation = new VesselReliefValveCalculation(
|
|
73
|
+
vessel,
|
|
74
|
+
reliefValve,
|
|
75
|
+
dischargeParameters
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
// Run the vessel relief valve calculation
|
|
79
|
+
const vesselReliefValveResultCode = await vesselReliefValveCalculation.run();
|
|
80
|
+
|
|
81
|
+
// Check vessel relief valve calculation result
|
|
82
|
+
expect(vesselReliefValveResultCode).toBe(ResultCode.SUCCESS);
|
|
83
|
+
|
|
84
|
+
// Regression tests for discharge results
|
|
85
|
+
const expectedReleaseMass = 466.32195097490285;
|
|
86
|
+
const actualReleaseMass = vesselReliefValveCalculation.dischargeResult?.releaseMass ?? 0;
|
|
87
|
+
expect(Math.abs((actualReleaseMass - expectedReleaseMass) / expectedReleaseMass)).toBeLessThan(1e-3);
|
|
88
|
+
|
|
89
|
+
// Regression tests for discharge records
|
|
90
|
+
const dischargeRecords = vesselReliefValveCalculation.dischargeRecords!;
|
|
91
|
+
expect(dischargeRecords).toBeDefined();
|
|
92
|
+
expect(dischargeRecords.length).toBe(2);
|
|
93
|
+
|
|
94
|
+
expect(Math.abs((dischargeRecords[1].time! - 1075.2115493324122) / 1075.2115493324122)).toBeLessThan(1e-3);
|
|
95
|
+
expect(Math.abs((dischargeRecords[0].massFlow! - 0.43370251302121643) / 0.43370251302121643)).toBeLessThan(1e-3);
|
|
96
|
+
expect(Math.abs((dischargeRecords[0].orificeState.pressure! - 217541.03350332877) / 217541.03350332877)).toBeLessThan(1e-3);
|
|
97
|
+
expect(Math.abs((dischargeRecords[0].finalVelocity! - 276.4442859277149) / 276.4442859277149)).toBeLessThan(1e-3);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { VesselReliefValveCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DischargeParameters, Material, MaterialComponent, ReliefValve, State, Vessel } from "../../src/entities";
|
|
3
|
+
import { ResultCode, VesselShape } from "../../src/enums";
|
|
4
|
+
|
|
5
|
+
import { setAccessToken } from "../../src/utilities";
|
|
6
|
+
|
|
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
|
+
describe('Vessel Relief Valve Calculation - Hydrogen', () => {
|
|
15
|
+
test('Vessel relief valve calculation for Hydrogen', async () => {
|
|
16
|
+
// Set the case properties
|
|
17
|
+
const materialName = 'HYDROGEN';
|
|
18
|
+
const stateTemperature = 270.0;
|
|
19
|
+
const statePressure = 8e6;
|
|
20
|
+
const liquidFraction = 1.0;
|
|
21
|
+
const vesselShape = VesselShape.VESSEL_SPHERE;
|
|
22
|
+
const vesselDiameter = 5.0;
|
|
23
|
+
const reliefValvePipeDiameter = 0.5;
|
|
24
|
+
const reliefValvePipeLength = 1.0;
|
|
25
|
+
const reliefValveConstrictionDiameter = 0.25;
|
|
26
|
+
|
|
27
|
+
// Define the initial state of the vessel
|
|
28
|
+
const state = new State({
|
|
29
|
+
temperature: stateTemperature,
|
|
30
|
+
pressure: statePressure,
|
|
31
|
+
liquidFraction: liquidFraction
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Define the material contained by the vessel
|
|
35
|
+
const material = new Material({
|
|
36
|
+
name: materialName,
|
|
37
|
+
components: [
|
|
38
|
+
new MaterialComponent({ name: materialName, moleFraction: 1.0 })
|
|
39
|
+
]
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Create a vessel state calculation using the material and state
|
|
43
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
44
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
45
|
+
|
|
46
|
+
// Check vessel state calculation result
|
|
47
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
48
|
+
|
|
49
|
+
// Create a vessel using the calculated state and material
|
|
50
|
+
const vessel = new Vessel({
|
|
51
|
+
state: vesselStateCalculation.outputState!,
|
|
52
|
+
material: vesselStateCalculation.material,
|
|
53
|
+
liquidFillFractionByVolume: 0.7,
|
|
54
|
+
shape: vesselShape,
|
|
55
|
+
diameter: vesselDiameter,
|
|
56
|
+
vesselConditions: vesselStateCalculation.vesselConditions
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Create a relief valve to use in the vessel relief valve calculation
|
|
60
|
+
const reliefValve = new ReliefValve({
|
|
61
|
+
pipeDiameter: reliefValvePipeDiameter,
|
|
62
|
+
pipeLength: reliefValvePipeLength,
|
|
63
|
+
pipeHeightFraction: 1.0,
|
|
64
|
+
reliefValveConstrictionDiameter: reliefValveConstrictionDiameter
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Create a vessel relief valve calculation
|
|
68
|
+
const dischargeParameters = new DischargeParameters();
|
|
69
|
+
const vesselReliefValveCalculation = new VesselReliefValveCalculation(
|
|
70
|
+
vessel,
|
|
71
|
+
reliefValve,
|
|
72
|
+
dischargeParameters
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
// Run the vessel relief valve calculation
|
|
76
|
+
const vesselReliefValveResultCode = await vesselReliefValveCalculation.run();
|
|
77
|
+
|
|
78
|
+
// Check vessel relief valve calculation result
|
|
79
|
+
expect(vesselReliefValveResultCode).toBe(ResultCode.SUCCESS);
|
|
80
|
+
|
|
81
|
+
// Regression tests for discharge results
|
|
82
|
+
const expectedReleaseMass = 442.9319348311668;
|
|
83
|
+
const actualReleaseMass = vesselReliefValveCalculation.dischargeResult?.releaseMass ?? 0;
|
|
84
|
+
expect(Math.abs((actualReleaseMass - expectedReleaseMass) / expectedReleaseMass)).toBeLessThan(1e-3);
|
|
85
|
+
|
|
86
|
+
// Regression tests for discharge records
|
|
87
|
+
const dischargeRecords = vesselReliefValveCalculation.dischargeRecords!;
|
|
88
|
+
expect(dischargeRecords).toBeDefined();
|
|
89
|
+
expect(dischargeRecords.length).toBe(2);
|
|
90
|
+
|
|
91
|
+
expect(Math.abs((dischargeRecords[1].time! - 1.6933094303236609) / 1.6933094303236609)).toBeLessThan(1e-3);
|
|
92
|
+
expect(Math.abs((dischargeRecords[0].massFlow! - 261.5776696799618) / 261.5776696799618)).toBeLessThan(1e-3);
|
|
93
|
+
expect(Math.abs((dischargeRecords[0].orificeState.pressure! - 1453253.4181444559) / 1453253.4181444559)).toBeLessThan(1e-3);
|
|
94
|
+
expect(Math.abs((dischargeRecords[0].finalVelocity! - 1947.6881413918381) / 1947.6881413918381)).toBeLessThan(1e-3);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { VesselReliefValveCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DischargeParameters, Material, MaterialComponent, ReliefValve, State, Vessel } from "../../src/entities";
|
|
3
|
+
import { ResultCode, VesselShape } from "../../src/enums";
|
|
4
|
+
|
|
5
|
+
import { setAccessToken } from "../../src/utilities";
|
|
6
|
+
|
|
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('Vessel Relief Valve Calculation - Methane', () => {
|
|
16
|
+
test('Vessel relief valve calculation for Methane', async () => {
|
|
17
|
+
// Define the initial state of the vessel
|
|
18
|
+
const state = new State({ temperature: 240.0, pressure: 5e6, liquidFraction: 1.0 });
|
|
19
|
+
|
|
20
|
+
// Define the material contained by the vessel
|
|
21
|
+
const material = new Material({
|
|
22
|
+
name: "METHANE",
|
|
23
|
+
components: [new MaterialComponent({ name: "METHANE", moleFraction: 1.0 })]
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// Create a vessel state calculation using the material and state
|
|
27
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
28
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
29
|
+
|
|
30
|
+
// Check vessel state calculation result
|
|
31
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
32
|
+
|
|
33
|
+
// Create a vessel using the calculated state and material
|
|
34
|
+
const vessel = new Vessel({
|
|
35
|
+
state: vesselStateCalculation.outputState!,
|
|
36
|
+
material: vesselStateCalculation.material,
|
|
37
|
+
liquidFillFractionByVolume: 0.7,
|
|
38
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
39
|
+
diameter: 3,
|
|
40
|
+
vesselConditions: vesselStateCalculation.vesselConditions
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Create a relief valve
|
|
44
|
+
const reliefValve = new ReliefValve({
|
|
45
|
+
pipeDiameter: 0.1,
|
|
46
|
+
pipeLength: 5.0,
|
|
47
|
+
pipeHeightFraction: 1.0,
|
|
48
|
+
reliefValveConstrictionDiameter: 0.01
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Create a vessel relief valve calculation
|
|
52
|
+
const dischargeParameters = new DischargeParameters();
|
|
53
|
+
const vesselReliefValveCalculation = new VesselReliefValveCalculation(
|
|
54
|
+
vessel,
|
|
55
|
+
reliefValve,
|
|
56
|
+
dischargeParameters
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
// Run the vessel relief valve calculation
|
|
60
|
+
const vesselReliefValveResultCode = await vesselReliefValveCalculation.run();
|
|
61
|
+
|
|
62
|
+
// Check vessel relief valve calculation result
|
|
63
|
+
expect(vesselReliefValveResultCode).toBe(ResultCode.SUCCESS);
|
|
64
|
+
|
|
65
|
+
// Regression tests for discharge results
|
|
66
|
+
const expectedReleaseMass = 701.8787816018365;
|
|
67
|
+
const actualReleaseMass = vesselReliefValveCalculation.dischargeResult?.releaseMass ?? 0;
|
|
68
|
+
expect(Math.abs((actualReleaseMass - expectedReleaseMass) / expectedReleaseMass)).toBeLessThan(1e-3);
|
|
69
|
+
|
|
70
|
+
// Regression tests for discharge records
|
|
71
|
+
const dischargeRecords = vesselReliefValveCalculation.dischargeRecords!;
|
|
72
|
+
expect(dischargeRecords).toBeDefined();
|
|
73
|
+
expect(dischargeRecords.length).toBe(2);
|
|
74
|
+
|
|
75
|
+
expect(Math.abs((dischargeRecords[1].time! - 798.3770006929267) / 798.3770006929267)).toBeLessThan(1e-3);
|
|
76
|
+
expect(Math.abs((dischargeRecords[0].massFlow! - 0.8791320153169022) / 0.8791320153169022)).toBeLessThan(1e-3);
|
|
77
|
+
expect(Math.abs((dischargeRecords[0].orificeState.pressure! - 101325.0) / 101325.0)).toBeLessThan(1e-3);
|
|
78
|
+
expect(Math.abs((dischargeRecords[0].finalVelocity! - 112.52375086203219) / 112.52375086203219)).toBeLessThan(1e-3);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { VesselReliefValveCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DischargeParameters, Material, MaterialComponent, ReliefValve, State, Vessel } from "../../src/entities";
|
|
3
|
+
import { ResultCode, VesselShape } from "../../src/enums";
|
|
4
|
+
|
|
5
|
+
import { setAccessToken } from "../../src/utilities";
|
|
6
|
+
|
|
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('Vessel Relief Valve Calculation - MET+H2S', () => {
|
|
16
|
+
test('Vessel relief valve calculation for MET+H2S', async () => {
|
|
17
|
+
// Define the initial state of the vessel
|
|
18
|
+
const state = new State({ temperature: 280.0, pressure: 2e6, liquidFraction: 1.0 });
|
|
19
|
+
|
|
20
|
+
// Define the material contained by the vessel
|
|
21
|
+
const material = new Material({
|
|
22
|
+
name: "MET+H2S",
|
|
23
|
+
components: [
|
|
24
|
+
new MaterialComponent({ name: "METHANE", moleFraction: 0.9 }),
|
|
25
|
+
new MaterialComponent({ name: "HYDROGEN SULFIDE", moleFraction: 0.1 })
|
|
26
|
+
],
|
|
27
|
+
componentCount: 2
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Create a vessel state calculation using the material and state
|
|
31
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
32
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
33
|
+
|
|
34
|
+
// Check vessel state calculation result
|
|
35
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
36
|
+
|
|
37
|
+
// Create a vessel using the calculated state and material
|
|
38
|
+
const vessel = new Vessel({
|
|
39
|
+
state: vesselStateCalculation.outputState!,
|
|
40
|
+
material: vesselStateCalculation.material,
|
|
41
|
+
liquidFillFractionByVolume: 0.7,
|
|
42
|
+
shape: VesselShape.VESSEL_CUBOID,
|
|
43
|
+
height: 2,
|
|
44
|
+
width: 1,
|
|
45
|
+
length: 3,
|
|
46
|
+
vesselConditions: vesselStateCalculation.vesselConditions
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Create a relief valve
|
|
50
|
+
const reliefValve = new ReliefValve({
|
|
51
|
+
pipeDiameter: 0.1,
|
|
52
|
+
pipeLength: 1.0,
|
|
53
|
+
pipeHeightFraction: 1.0,
|
|
54
|
+
reliefValveConstrictionDiameter: 0.05
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Create a vessel relief valve calculation
|
|
58
|
+
const dischargeParameters = new DischargeParameters();
|
|
59
|
+
const vesselReliefValveCalculation = new VesselReliefValveCalculation(
|
|
60
|
+
vessel,
|
|
61
|
+
reliefValve,
|
|
62
|
+
dischargeParameters
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
// Run the vessel relief valve calculation
|
|
66
|
+
const vesselReliefValveResultCode = await vesselReliefValveCalculation.run();
|
|
67
|
+
|
|
68
|
+
// Check vessel relief valve calculation result
|
|
69
|
+
expect(vesselReliefValveResultCode).toBe(ResultCode.SUCCESS);
|
|
70
|
+
|
|
71
|
+
// Regression tests for discharge results
|
|
72
|
+
const expectedReleaseMass = 97.16333722218255;
|
|
73
|
+
const actualReleaseMass = vesselReliefValveCalculation.dischargeResult?.releaseMass ?? 0;
|
|
74
|
+
expect(Math.abs((actualReleaseMass - expectedReleaseMass) / expectedReleaseMass)).toBeLessThan(1e-3);
|
|
75
|
+
|
|
76
|
+
// Regression tests for discharge records
|
|
77
|
+
const dischargeRecords = vesselReliefValveCalculation.dischargeRecords!;
|
|
78
|
+
expect(dischargeRecords).toBeDefined();
|
|
79
|
+
expect(dischargeRecords.length).toBe(2);
|
|
80
|
+
|
|
81
|
+
expect(Math.abs((dischargeRecords[1].time! - 12.434893609230256) / 12.434893609230256)).toBeLessThan(1e-3);
|
|
82
|
+
expect(Math.abs((dischargeRecords[0].massFlow! - 7.81376506109063) / 7.81376506109063)).toBeLessThan(1e-3);
|
|
83
|
+
expect(Math.abs((dischargeRecords[0].orificeState.pressure! - 391491.52234610944) / 391491.52234610944)).toBeLessThan(1e-3);
|
|
84
|
+
expect(Math.abs((dischargeRecords[0].finalVelocity! - 582.3607141206039) / 582.3607141206039)).toBeLessThan(1e-3);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { VesselReliefValveCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DischargeParameters, Material, MaterialComponent, ReliefValve, State, Vessel } from "../../src/entities";
|
|
3
|
+
import { ResultCode, VesselShape } from "../../src/enums";
|
|
4
|
+
import { setAccessToken } from "../../src/utilities";
|
|
5
|
+
|
|
6
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
7
|
+
|
|
8
|
+
if (!accessToken) {
|
|
9
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
setAccessToken(accessToken);
|
|
13
|
+
|
|
14
|
+
describe('Vessel Relief Valve Calculation - Nitrogen', () => {
|
|
15
|
+
test('Vessel relief valve calculation for Nitrogen', async () => {
|
|
16
|
+
// Define the initial state of the vessel
|
|
17
|
+
const state = new State({ temperature: 300.0, pressure: 4e6, liquidFraction: 1.0 });
|
|
18
|
+
|
|
19
|
+
// Define the material contained by the vessel
|
|
20
|
+
const material = new Material({
|
|
21
|
+
name: "NITROGEN",
|
|
22
|
+
components: [new MaterialComponent({ name: "NITROGEN", moleFraction: 1.0 })]
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Create a vessel state calculation using the material and state
|
|
26
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
27
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
28
|
+
|
|
29
|
+
// Check vessel state calculation result
|
|
30
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
31
|
+
|
|
32
|
+
// Create a vessel using the calculated state and material
|
|
33
|
+
const vessel = new Vessel({
|
|
34
|
+
state: vesselStateCalculation.outputState!,
|
|
35
|
+
material: vesselStateCalculation.material,
|
|
36
|
+
liquidFillFractionByVolume: 0.7,
|
|
37
|
+
shape: VesselShape.HORIZONTAL_CYLINDER,
|
|
38
|
+
diameter: 1.5,
|
|
39
|
+
height: 3,
|
|
40
|
+
vesselConditions: vesselStateCalculation.vesselConditions
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Create a relief valve
|
|
44
|
+
const reliefValve = new ReliefValve({
|
|
45
|
+
pipeDiameter: 0.5,
|
|
46
|
+
pipeLength: 10.0,
|
|
47
|
+
pipeHeightFraction: 1.0,
|
|
48
|
+
reliefValveConstrictionDiameter: 0.5
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Create a vessel relief valve calculation
|
|
52
|
+
const dischargeParameters = new DischargeParameters();
|
|
53
|
+
const vesselReliefValveCalculation = new VesselReliefValveCalculation(
|
|
54
|
+
vessel,
|
|
55
|
+
reliefValve,
|
|
56
|
+
dischargeParameters
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
// Run the vessel relief valve calculation
|
|
60
|
+
const vesselReliefValveResultCode = await vesselReliefValveCalculation.run();
|
|
61
|
+
|
|
62
|
+
// Check vessel relief valve calculation result
|
|
63
|
+
expect(vesselReliefValveResultCode).toBe(ResultCode.SUCCESS);
|
|
64
|
+
|
|
65
|
+
// Regression tests for discharge results
|
|
66
|
+
const expectedReleaseMass = 314.94879020959837;
|
|
67
|
+
const actualReleaseMass = vesselReliefValveCalculation.dischargeResult?.releaseMass ?? 0;
|
|
68
|
+
expect(Math.abs((actualReleaseMass - expectedReleaseMass) / expectedReleaseMass)).toBeLessThan(1e-3);
|
|
69
|
+
|
|
70
|
+
// Regression tests for discharge records
|
|
71
|
+
const dischargeRecords = vesselReliefValveCalculation.dischargeRecords!;
|
|
72
|
+
expect(dischargeRecords).toBeDefined();
|
|
73
|
+
expect(dischargeRecords.length).toBe(2);
|
|
74
|
+
|
|
75
|
+
expect(Math.abs((dischargeRecords[1].time! - 0.20034090677203503) / 0.20034090677203503)).toBeLessThan(1e-3);
|
|
76
|
+
expect(Math.abs((dischargeRecords[0].massFlow! - 1572.064314194075) / 1572.064314194075)).toBeLessThan(1e-3);
|
|
77
|
+
expect(Math.abs((dischargeRecords[0].orificeState.pressure! - 2165508.2851427207) / 2165508.2851427207)).toBeLessThan(1e-3);
|
|
78
|
+
expect(Math.abs((dischargeRecords[0].finalVelocity! - 554.7205461435867) / 554.7205461435867)).toBeLessThan(1e-3);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { Material, MaterialComponent, State } from "../../src/entities";
|
|
3
|
+
import { ResultCode } from "../../src/enums";
|
|
4
|
+
import { setAccessToken } from "../../src/utilities";
|
|
5
|
+
|
|
6
|
+
const accessToken = process.env.PWS_ACCESS_TOKEN;
|
|
7
|
+
|
|
8
|
+
if (!accessToken) {
|
|
9
|
+
throw new Error("ACCESS_TOKEN environment variable is not set.");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
setAccessToken(accessToken);
|
|
13
|
+
|
|
14
|
+
describe('Vessel State Calculation - Test for Ammonia', () => {
|
|
15
|
+
test('Ammonia vessel state calculation', async () => {
|
|
16
|
+
// Define the initial state of the vessel
|
|
17
|
+
const state = new State({
|
|
18
|
+
temperature: 270.0,
|
|
19
|
+
pressure: 8.0e6,
|
|
20
|
+
liquidFraction: 0.8
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Define the material contained by the vessel
|
|
24
|
+
const material = new Material({
|
|
25
|
+
name: "AMMONIA",
|
|
26
|
+
components: [
|
|
27
|
+
new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 })
|
|
28
|
+
]
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// Create a vessel state calculation using the material and state
|
|
32
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
33
|
+
|
|
34
|
+
// Run the vessel state calculation
|
|
35
|
+
console.log('Running vessel_state_calculation...');
|
|
36
|
+
const resultCode = await vesselStateCalculation.run();
|
|
37
|
+
|
|
38
|
+
// Print any messages
|
|
39
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
40
|
+
console.log('Messages:');
|
|
41
|
+
vesselStateCalculation.messages.forEach((message) => {
|
|
42
|
+
console.log(message);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Check if the calculation was successful
|
|
47
|
+
if (resultCode === ResultCode.SUCCESS) {
|
|
48
|
+
// Regression test for vessel conditions
|
|
49
|
+
expect(vesselStateCalculation.vesselConditions).toBe(4);
|
|
50
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
51
|
+
} else {
|
|
52
|
+
// Fail the test if the result code is not successful
|
|
53
|
+
throw new Error(`FAILED vessel_state_calculation with result code ${resultCode}`);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { Material, MaterialComponent, State } from "../../src/entities";
|
|
3
|
+
import { ResultCode } from "../../src/enums";
|
|
4
|
+
|
|
5
|
+
import { setAccessToken } from "../../src/utilities";
|
|
6
|
+
|
|
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('Vessel State Calculation - Test for Butane', () => {
|
|
16
|
+
test('Butane vessel state calculation', async () => {
|
|
17
|
+
// Define the initial state of the vessel
|
|
18
|
+
const state = new State({
|
|
19
|
+
temperature: 300.0,
|
|
20
|
+
pressure: 8.0e6,
|
|
21
|
+
liquidFraction: 0.8
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// Define the material contained by the vessel
|
|
25
|
+
const material = new Material({
|
|
26
|
+
name: "N-BUTANE",
|
|
27
|
+
components: [
|
|
28
|
+
new MaterialComponent({ name: "N-BUTANE", moleFraction: 1.0 })
|
|
29
|
+
]
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Create a vessel state calculation using the material and state
|
|
33
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
34
|
+
|
|
35
|
+
// Run the vessel state calculation
|
|
36
|
+
console.log('Running vessel_state_calculation...');
|
|
37
|
+
const resultCode = await vesselStateCalculation.run();
|
|
38
|
+
|
|
39
|
+
// Print any messages
|
|
40
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
41
|
+
console.log('Messages:');
|
|
42
|
+
vesselStateCalculation.messages.forEach((message) => {
|
|
43
|
+
console.log(message);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Check if the calculation was successful
|
|
48
|
+
if (resultCode === ResultCode.SUCCESS) {
|
|
49
|
+
// Regression test for vessel conditions
|
|
50
|
+
expect(vesselStateCalculation.vesselConditions).toBe(4);
|
|
51
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
52
|
+
} else {
|
|
53
|
+
// Fail the test if the result code is not successful
|
|
54
|
+
throw new Error(`FAILED vessel_state_calculation with result code ${resultCode}`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|