@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,123 @@
|
|
|
1
|
+
import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DischargeParameters, Leak, Material, MaterialComponent, State, Vessel } from "../../src/entities";
|
|
3
|
+
import { ResultCode, TimeVaryingOption, VesselShape } from "../../src/enums";
|
|
4
|
+
|
|
5
|
+
import { setAccessToken } from "../../src/utilities";
|
|
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
|
+
describe('Vessel Leak Calculation - Test Case 7', () => {
|
|
14
|
+
test('test case 7 - vessel leak calculation', async () => {
|
|
15
|
+
// Set the case properties
|
|
16
|
+
const materialName = 'TOLUENE';
|
|
17
|
+
const stateTemperature = 280.0;
|
|
18
|
+
const statePressure = 1.50E+05;
|
|
19
|
+
const vesselShape = VesselShape.HORIZONTAL_CYLINDER;
|
|
20
|
+
const vesselLength = 5.0;
|
|
21
|
+
const vesselDiameter = 2.0;
|
|
22
|
+
const leakHoleDiameter = 0.05;
|
|
23
|
+
const timeVaryingOption = TimeVaryingOption.TIME_VARYING_RATE;
|
|
24
|
+
const leakHoleHeightFraction = 0.0;
|
|
25
|
+
|
|
26
|
+
// Define the initial state of the vessel
|
|
27
|
+
const state = new State({
|
|
28
|
+
temperature: stateTemperature,
|
|
29
|
+
pressure: statePressure,
|
|
30
|
+
liquidFraction: 0.0
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Define the material contained by the vessel
|
|
34
|
+
const material = new Material({
|
|
35
|
+
name: materialName,
|
|
36
|
+
components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })]
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Create a vessel state calculation using the material and state
|
|
40
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
41
|
+
|
|
42
|
+
// Run the vessel state calculation
|
|
43
|
+
console.log('Running vessel_state_calculation...');
|
|
44
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
45
|
+
|
|
46
|
+
// Check vessel state calculation result
|
|
47
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
48
|
+
|
|
49
|
+
// Optional: Log messages if any
|
|
50
|
+
if (vesselStateCalculation.messages.length > 0) {
|
|
51
|
+
vesselStateCalculation.messages.forEach(message => {
|
|
52
|
+
console.log(message);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Create a vessel to use in the leak calculation
|
|
57
|
+
const vessel = new Vessel({
|
|
58
|
+
state: vesselStateCalculation.outputState!,
|
|
59
|
+
material: vesselStateCalculation.material,
|
|
60
|
+
diameter: vesselDiameter,
|
|
61
|
+
length: vesselLength,
|
|
62
|
+
shape: vesselShape,
|
|
63
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
64
|
+
liquidFillFractionByVolume: 0.5
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Create a leak to use in the vessel leak calculation
|
|
68
|
+
const leak = new Leak({
|
|
69
|
+
holeDiameter: leakHoleDiameter,
|
|
70
|
+
timeVaryingOption: timeVaryingOption,
|
|
71
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Create discharge parameters to use in the vessel leak calculation
|
|
75
|
+
const dischargeParameters = new DischargeParameters();
|
|
76
|
+
|
|
77
|
+
// Create a vessel leak calculation using the vessel, leak, and discharge parameters
|
|
78
|
+
const vesselLeakCalculation = new VesselLeakCalculation(
|
|
79
|
+
vessel,
|
|
80
|
+
leak,
|
|
81
|
+
dischargeParameters
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
// Run the vessel leak calculation
|
|
85
|
+
console.log('Running vessel_leak_calculation...');
|
|
86
|
+
const vesselLeakResultCode = await vesselLeakCalculation.run();
|
|
87
|
+
|
|
88
|
+
// Check vessel leak calculation result
|
|
89
|
+
expect(vesselLeakResultCode).toBe(ResultCode.SUCCESS);
|
|
90
|
+
|
|
91
|
+
// Optional: Log messages if any
|
|
92
|
+
if (vesselLeakCalculation.messages.length > 0) {
|
|
93
|
+
vesselLeakCalculation.messages.forEach(message => {
|
|
94
|
+
console.log(message);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Regression tests for discharge records
|
|
99
|
+
const dischargeRecords = vesselLeakCalculation.dischargeRecords;
|
|
100
|
+
|
|
101
|
+
// Check number of discharge records
|
|
102
|
+
expect(dischargeRecords).toBeDefined();
|
|
103
|
+
expect(dischargeRecords!.length).toBe(900);
|
|
104
|
+
|
|
105
|
+
// Check mass flow regression
|
|
106
|
+
const expectedMassFlow = 12.605655881613954;
|
|
107
|
+
const actualMassFlow = dischargeRecords ? dischargeRecords[0].massFlow : undefined;
|
|
108
|
+
expect(actualMassFlow).toBeDefined();
|
|
109
|
+
expect(Math.abs(((actualMassFlow as number) - expectedMassFlow) / expectedMassFlow)).toBeLessThan(1e-3);
|
|
110
|
+
|
|
111
|
+
// Check final velocity regression
|
|
112
|
+
const expectedFinalVelocity = 12.154668210488419;
|
|
113
|
+
const actualFinalVelocity = dischargeRecords ? dischargeRecords[0].finalVelocity : undefined;
|
|
114
|
+
expect(actualFinalVelocity).toBeDefined();
|
|
115
|
+
expect(Math.abs(((actualFinalVelocity as number) - expectedFinalVelocity) / expectedFinalVelocity)).toBeLessThan(1e-3);
|
|
116
|
+
|
|
117
|
+
// Check droplet diameter regression
|
|
118
|
+
const expectedDropletDiameter = 0.002048354602442208;
|
|
119
|
+
const actualDropletDiameter = dischargeRecords ? dischargeRecords[0].dropletDiameter : undefined;
|
|
120
|
+
expect(actualDropletDiameter).toBeDefined();
|
|
121
|
+
expect(Math.abs(((actualDropletDiameter as number) - expectedDropletDiameter) / expectedDropletDiameter)).toBeLessThan(1e-3);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DischargeParameters, Leak, Material, MaterialComponent, State, Vessel } from "../../src/entities";
|
|
3
|
+
import { ResultCode, TimeVaryingOption, VesselShape } from "../../src/enums";
|
|
4
|
+
|
|
5
|
+
import { setAccessToken } from "../../src/utilities";
|
|
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 Leak Calculation - Test Case 8', () => {
|
|
15
|
+
test('Vessel leak calculation for Carbon Dioxide (Toxic)', async () => {
|
|
16
|
+
// Set the case properties
|
|
17
|
+
const materialName = 'CARBON DIOXIDE (TOXIC)';
|
|
18
|
+
const stateTemperature = 280.0;
|
|
19
|
+
const statePressure = 8.0E+06;
|
|
20
|
+
const vesselShape = VesselShape.VESSEL_SPHERE;
|
|
21
|
+
const vesselDiameter = 5.0;
|
|
22
|
+
const leakHoleDiameter = 0.008;
|
|
23
|
+
const timeVaryingOption = TimeVaryingOption.INITIAL_RATE;
|
|
24
|
+
const leakHoleHeightFraction = 0.5;
|
|
25
|
+
|
|
26
|
+
// Define the initial state of the vessel
|
|
27
|
+
const state = new State({
|
|
28
|
+
temperature: stateTemperature,
|
|
29
|
+
pressure: statePressure,
|
|
30
|
+
liquidFraction: 0.0
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Define the material contained by the vessel
|
|
34
|
+
const material = new Material({
|
|
35
|
+
name: materialName,
|
|
36
|
+
components: [new MaterialComponent({ name: materialName, moleFraction: 1.0 })]
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Create a vessel state calculation using the material and state
|
|
40
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
41
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
42
|
+
|
|
43
|
+
// Check vessel state calculation result
|
|
44
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
45
|
+
|
|
46
|
+
// Create a vessel to use in the leak calculation
|
|
47
|
+
const vessel = new Vessel({
|
|
48
|
+
state: vesselStateCalculation.outputState!,
|
|
49
|
+
material: vesselStateCalculation.material,
|
|
50
|
+
diameter: vesselDiameter,
|
|
51
|
+
shape: vesselShape,
|
|
52
|
+
liquidFillFractionByVolume: 0.8,
|
|
53
|
+
vesselConditions: vesselStateCalculation.vesselConditions
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Create a leak to use in the vessel leak calculation
|
|
57
|
+
const leak = new Leak({
|
|
58
|
+
holeDiameter: leakHoleDiameter,
|
|
59
|
+
timeVaryingOption: timeVaryingOption,
|
|
60
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Create discharge parameters to use in the vessel leak calculation
|
|
64
|
+
const dischargeParameters = new DischargeParameters();
|
|
65
|
+
|
|
66
|
+
// Create a vessel leak calculation using the vessel, leak, and discharge parameters
|
|
67
|
+
const vesselLeakCalculation = new VesselLeakCalculation(
|
|
68
|
+
vessel,
|
|
69
|
+
leak,
|
|
70
|
+
dischargeParameters
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
// Run the vessel leak calculation
|
|
74
|
+
const vesselLeakResultCode = await vesselLeakCalculation.run();
|
|
75
|
+
|
|
76
|
+
// Check vessel leak calculation result
|
|
77
|
+
expect(vesselLeakResultCode).toBe(ResultCode.SUCCESS);
|
|
78
|
+
|
|
79
|
+
// Regression tests for discharge records
|
|
80
|
+
const dischargeRecords = vesselLeakCalculation.dischargeRecords;
|
|
81
|
+
expect(dischargeRecords).toBeDefined();
|
|
82
|
+
expect(dischargeRecords!.length).toBe(2);
|
|
83
|
+
|
|
84
|
+
// Check mass flow regression
|
|
85
|
+
const expectedMassFlow = 4.015328433666382;
|
|
86
|
+
const actualMassFlow = dischargeRecords ? dischargeRecords[0].massFlow : undefined;
|
|
87
|
+
expect(actualMassFlow).toBeDefined();
|
|
88
|
+
expect(Math.abs(((actualMassFlow as number) - expectedMassFlow) / expectedMassFlow)).toBeLessThan(1e-3);
|
|
89
|
+
|
|
90
|
+
// Check final velocity regression
|
|
91
|
+
const expectedFinalVelocity = 141.10842725286392;
|
|
92
|
+
const actualFinalVelocity = dischargeRecords ? dischargeRecords[0].finalVelocity : undefined;
|
|
93
|
+
expect(actualFinalVelocity).toBeDefined();
|
|
94
|
+
expect(Math.abs(((actualFinalVelocity as number) - expectedFinalVelocity) / expectedFinalVelocity)).toBeLessThan(1e-3);
|
|
95
|
+
|
|
96
|
+
// Check droplet diameter regression
|
|
97
|
+
const expectedDropletDiameter = 1.1446905156710795e-05;
|
|
98
|
+
const actualDropletDiameter = dischargeRecords ? dischargeRecords[0].dropletDiameter : undefined;
|
|
99
|
+
expect(actualDropletDiameter).toBeDefined();
|
|
100
|
+
expect(Math.abs(((actualDropletDiameter as number) - expectedDropletDiameter) / expectedDropletDiameter)).toBeLessThan(1e-3);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { VesselLeakCalculation, VesselStateCalculation } from "../../src/calculations/discharge";
|
|
2
|
+
import { DischargeParameters, Leak, Material, MaterialComponent, State, Vessel } from "../../src/entities";
|
|
3
|
+
import { ResultCode, TimeVaryingOption, VesselShape } from "../../src/enums";
|
|
4
|
+
|
|
5
|
+
import { setAccessToken } from "../../src/utilities";
|
|
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
|
+
describe('Vessel Leak Calculation - Test Case 9', () => {
|
|
14
|
+
test('Vessel leak calculation for N-Octane + N-Heptane', async () => {
|
|
15
|
+
// Set the case properties
|
|
16
|
+
const stateTemperature = 250.0;
|
|
17
|
+
const statePressure = 5.00E+05;
|
|
18
|
+
const vesselShape = VesselShape.VERTICAL_CYLINDER;
|
|
19
|
+
const vesselHeight = 3.0;
|
|
20
|
+
const vesselDiameter = 1.5;
|
|
21
|
+
const leakHoleDiameter = 0.1;
|
|
22
|
+
const timeVaryingOption = TimeVaryingOption.TIME_VARYING_RATE;
|
|
23
|
+
const leakHoleHeightFraction = 0.0;
|
|
24
|
+
|
|
25
|
+
// Define the initial state of the vessel
|
|
26
|
+
const state = new State({
|
|
27
|
+
temperature: stateTemperature,
|
|
28
|
+
pressure: statePressure,
|
|
29
|
+
liquidFraction: 0.0
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Define the material contained by the vessel
|
|
33
|
+
const material = new Material({
|
|
34
|
+
name: 'N-OCTANE+N-HEPTANE',
|
|
35
|
+
components: [
|
|
36
|
+
new MaterialComponent({ name: 'N-OCTANE', moleFraction: 0.5 }),
|
|
37
|
+
new MaterialComponent({ name: 'N-HEPTANE', moleFraction: 0.5 })
|
|
38
|
+
],
|
|
39
|
+
componentCount: 2
|
|
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 to use in the leak calculation
|
|
50
|
+
const vessel = new Vessel({
|
|
51
|
+
state: vesselStateCalculation.outputState!,
|
|
52
|
+
material: vesselStateCalculation.material,
|
|
53
|
+
diameter: vesselDiameter,
|
|
54
|
+
height: vesselHeight,
|
|
55
|
+
shape: vesselShape,
|
|
56
|
+
liquidFillFractionByVolume: 0.8,
|
|
57
|
+
vesselConditions: vesselStateCalculation.vesselConditions
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Create a leak to use in the vessel leak calculation
|
|
61
|
+
const leak = new Leak({
|
|
62
|
+
holeDiameter: leakHoleDiameter,
|
|
63
|
+
timeVaryingOption: timeVaryingOption,
|
|
64
|
+
holeHeightFraction: leakHoleHeightFraction,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Create discharge parameters to use in the vessel leak calculation
|
|
68
|
+
const dischargeParameters = new DischargeParameters();
|
|
69
|
+
|
|
70
|
+
// Create a vessel leak calculation using the vessel, leak, and discharge parameters
|
|
71
|
+
const vesselLeakCalculation = new VesselLeakCalculation(
|
|
72
|
+
vessel,
|
|
73
|
+
leak,
|
|
74
|
+
dischargeParameters
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
// Run the vessel leak calculation
|
|
78
|
+
const vesselLeakResultCode = await vesselLeakCalculation.run();
|
|
79
|
+
|
|
80
|
+
// Check vessel leak calculation result
|
|
81
|
+
expect(vesselLeakResultCode).toBe(ResultCode.SUCCESS);
|
|
82
|
+
|
|
83
|
+
// Regression tests for discharge records
|
|
84
|
+
const dischargeRecords = vesselLeakCalculation.dischargeRecords;
|
|
85
|
+
expect(dischargeRecords).toBeDefined();
|
|
86
|
+
expect(dischargeRecords!.length).toBe(698);
|
|
87
|
+
|
|
88
|
+
// Check mass flow regression
|
|
89
|
+
const expectedMassFlow = 125.74564365679295;
|
|
90
|
+
const actualMassFlow = dischargeRecords ? dischargeRecords[0].massFlow : undefined;
|
|
91
|
+
expect(actualMassFlow).toBeDefined();
|
|
92
|
+
expect(Math.abs(((actualMassFlow as number) - expectedMassFlow) / expectedMassFlow)).toBeLessThan(1e-3);
|
|
93
|
+
|
|
94
|
+
// Check final velocity regression
|
|
95
|
+
const expectedFinalVelocity = 36.48936892716285;
|
|
96
|
+
const actualFinalVelocity = dischargeRecords ? dischargeRecords[0].finalVelocity : undefined;
|
|
97
|
+
expect(actualFinalVelocity).toBeDefined();
|
|
98
|
+
expect(Math.abs(((actualFinalVelocity as number) - expectedFinalVelocity) / expectedFinalVelocity)).toBeLessThan(1e-3);
|
|
99
|
+
|
|
100
|
+
// Check droplet diameter regression
|
|
101
|
+
const expectedDropletDiameter = 0.0001917147651424711;
|
|
102
|
+
const actualDropletDiameter = dischargeRecords ? dischargeRecords[0].dropletDiameter : undefined;
|
|
103
|
+
expect(actualDropletDiameter).toBeDefined();
|
|
104
|
+
expect(Math.abs(((actualDropletDiameter as number) - expectedDropletDiameter) / expectedDropletDiameter)).toBeLessThan(1e-3);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
@@ -0,0 +1,84 @@
|
|
|
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
|
+
|
|
13
|
+
describe('Test Case - VLR AMMONIA', () => {
|
|
14
|
+
test('Vessel line rupture calculation for AMMONIA', async () => {
|
|
15
|
+
|
|
16
|
+
// Define the initial state of the vessel
|
|
17
|
+
const state = new State({
|
|
18
|
+
temperature: 290.0,
|
|
19
|
+
pressure: 7.0e6,
|
|
20
|
+
liquidFraction: 1.0
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Define the material contained by the vessel
|
|
24
|
+
const material = new Material({
|
|
25
|
+
name: "AMMONIA",
|
|
26
|
+
components: [new MaterialComponent({ name: "AMMONIA", moleFraction: 1.0 })]
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Create a vessel state calculation using the material and state
|
|
30
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
31
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
32
|
+
|
|
33
|
+
// Check the result of vessel state calculation
|
|
34
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
35
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
36
|
+
|
|
37
|
+
// Create a vessel for the line rupture calculation (cuboid: 2m height, 1m width, 3m length)
|
|
38
|
+
const vessel = new Vessel({
|
|
39
|
+
state: state,
|
|
40
|
+
material: material,
|
|
41
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
42
|
+
liquidFillFractionByVolume: 0.7,
|
|
43
|
+
shape: VesselShape.VESSEL_CUBOID,
|
|
44
|
+
height: 2,
|
|
45
|
+
width: 1,
|
|
46
|
+
length: 3
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Create a line rupture
|
|
50
|
+
const lineRupture = new LineRupture({
|
|
51
|
+
pipeDiameter: 0.1,
|
|
52
|
+
pipeLength: 1.0,
|
|
53
|
+
pipeHeightFraction: 0.1
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Create the vessel line rupture calculation
|
|
57
|
+
const vesselLineRuptureCalculation = new VesselLineRuptureCalculation(vessel, lineRupture, new DischargeParameters());
|
|
58
|
+
|
|
59
|
+
// Run the calculation
|
|
60
|
+
const lineRuptureResultCode = await vesselLineRuptureCalculation.run();
|
|
61
|
+
|
|
62
|
+
// Check result
|
|
63
|
+
expect(lineRuptureResultCode).toBe(ResultCode.SUCCESS);
|
|
64
|
+
|
|
65
|
+
// Output messages
|
|
66
|
+
if (vesselLineRuptureCalculation.messages.length > 0) {
|
|
67
|
+
console.log('Messages:');
|
|
68
|
+
vesselLineRuptureCalculation.messages.forEach(msg => console.log(msg));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Validate output values
|
|
72
|
+
const dischargeRecords = vesselLineRuptureCalculation.dischargeRecords!;
|
|
73
|
+
const dischargeResult = vesselLineRuptureCalculation.dischargeResult!;
|
|
74
|
+
|
|
75
|
+
expect(dischargeRecords.length).toBe(2);
|
|
76
|
+
expect(Math.abs((dischargeRecords[0].massFlow! - 489.84382051168984) / 489.84382051168984)).toBeLessThan(1e-3);
|
|
77
|
+
expect(Math.abs((dischargeRecords[0].finalState.temperature! - 239.747566488825) / 239.747566488825)).toBeLessThan(1e-3);
|
|
78
|
+
expect(Math.abs((dischargeRecords[0].finalVelocity! - 242.1191558154253) / 242.1191558154253)).toBeLessThan(1e-3);
|
|
79
|
+
expect(Math.abs((dischargeResult.releaseMass! - 2578.8221114859684) / 2578.8221114859684)).toBeLessThan(1e-3);
|
|
80
|
+
|
|
81
|
+
console.log(`vessel_line_rupture_calculation.discharge_result.release_mass: ${dischargeResult.releaseMass} [kg]`);
|
|
82
|
+
console.log(`SUCCESS: vessel_line_rupture_calculation (${vesselLineRuptureCalculation.calculationElapsedTime}ms)`);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
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 ETHANE + METHANE + HYDROGEN", () => {
|
|
13
|
+
test("Vessel line rupture calculation for ETHANE_METHANE_HY", async () => {
|
|
14
|
+
|
|
15
|
+
// Define the initial state of the vessel
|
|
16
|
+
const state = new State({
|
|
17
|
+
temperature: 260.0,
|
|
18
|
+
pressure: 5e5,
|
|
19
|
+
liquidFraction: 1.0
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Define the material composition
|
|
23
|
+
const material = new Material({
|
|
24
|
+
name: "ETHANE_METHANE_HY",
|
|
25
|
+
components: [
|
|
26
|
+
new MaterialComponent({ name: "ETHANE", moleFraction: 0.15 }),
|
|
27
|
+
new MaterialComponent({ name: "METHANE", moleFraction: 0.8 }),
|
|
28
|
+
new MaterialComponent({ name: "HYDROGEN", moleFraction: 0.05 })
|
|
29
|
+
],
|
|
30
|
+
componentCount: 3
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Run the vessel state calculation
|
|
34
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
35
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
36
|
+
|
|
37
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
38
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
39
|
+
|
|
40
|
+
// Define the vessel (sphere with 3m diameter)
|
|
41
|
+
const vessel = new Vessel({
|
|
42
|
+
state: state,
|
|
43
|
+
material: material,
|
|
44
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
45
|
+
liquidFillFractionByVolume: 0.7,
|
|
46
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
47
|
+
diameter: 3
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Define line rupture (0.5m diameter, 1m length, height fraction 0.5)
|
|
51
|
+
const lineRupture = new LineRupture({
|
|
52
|
+
pipeDiameter: 0.5,
|
|
53
|
+
pipeLength: 1.0,
|
|
54
|
+
pipeHeightFraction: 0.5
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Run the vessel line rupture calculation
|
|
58
|
+
const vesselLineRuptureCalculation = new VesselLineRuptureCalculation(vessel, lineRupture, new DischargeParameters());
|
|
59
|
+
const lineRuptureResultCode = await vesselLineRuptureCalculation.run();
|
|
60
|
+
|
|
61
|
+
expect(lineRuptureResultCode).toBe(ResultCode.SUCCESS);
|
|
62
|
+
|
|
63
|
+
// Output messages
|
|
64
|
+
if (vesselLineRuptureCalculation.messages.length > 0) {
|
|
65
|
+
console.log("Messages:");
|
|
66
|
+
vesselLineRuptureCalculation.messages.forEach(msg => console.log(msg));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Validate outputs
|
|
70
|
+
const dischargeRecords = vesselLineRuptureCalculation.dischargeRecords!;
|
|
71
|
+
const dischargeResult = vesselLineRuptureCalculation.dischargeResult!;
|
|
72
|
+
|
|
73
|
+
expect(dischargeRecords.length).toBe(2);
|
|
74
|
+
expect(Math.abs((dischargeRecords[0].massFlow! - 158.64730421749067) / 158.64730421749067)).toBeLessThan(1e-3);
|
|
75
|
+
expect(Math.abs((dischargeRecords[0].finalState.temperature! - 190.35560483348553) / 190.35560483348553)).toBeLessThan(1e-3);
|
|
76
|
+
expect(Math.abs((dischargeRecords[0].finalVelocity! - 556.7861619546059) / 556.7861619546059)).toBeLessThan(1e-3);
|
|
77
|
+
expect(Math.abs((dischargeResult.releaseMass! - 58.02291202254755) / 58.02291202254755)).toBeLessThan(1e-3);
|
|
78
|
+
|
|
79
|
+
console.log(`vessel_line_rupture_calculation.discharge_result.release_mass: ${dischargeResult.releaseMass} [kg]`);
|
|
80
|
+
console.log(`SUCCESS: vessel_line_rupture_calculation (${vesselLineRuptureCalculation.calculationElapsedTime}ms)`);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -0,0 +1,79 @@
|
|
|
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 N-DECANE", () => {
|
|
13
|
+
test("Vessel line rupture calculation for N-DECANE", async () => {
|
|
14
|
+
|
|
15
|
+
// Define the initial state of the vessel
|
|
16
|
+
const state = new State({
|
|
17
|
+
temperature: 280.0,
|
|
18
|
+
pressure: 1.5e5,
|
|
19
|
+
liquidFraction: 1.0
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Define the material contained by the vessel
|
|
23
|
+
const material = new Material({
|
|
24
|
+
name: "N-DECANE",
|
|
25
|
+
components: [
|
|
26
|
+
new MaterialComponent({ name: "N-DECANE", moleFraction: 1.0 })
|
|
27
|
+
]
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Run the vessel state calculation
|
|
31
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
32
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
33
|
+
|
|
34
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
35
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
36
|
+
|
|
37
|
+
// Define the vessel (vertical cylinder, 3m height, 1.5m diameter)
|
|
38
|
+
const vessel = new Vessel({
|
|
39
|
+
state: state,
|
|
40
|
+
material: material,
|
|
41
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
42
|
+
liquidFillFractionByVolume: 0.7,
|
|
43
|
+
shape: VesselShape.VERTICAL_CYLINDER,
|
|
44
|
+
height: 3,
|
|
45
|
+
diameter: 1.5
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Define the line rupture (0.02m diameter, 10m length, height fraction 0)
|
|
49
|
+
const lineRupture = new LineRupture({
|
|
50
|
+
pipeDiameter: 0.02,
|
|
51
|
+
pipeLength: 10.0,
|
|
52
|
+
pipeHeightFraction: 0
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Run the vessel line rupture calculation
|
|
56
|
+
const vesselLineRuptureCalculation = new VesselLineRuptureCalculation(vessel, lineRupture, new DischargeParameters());
|
|
57
|
+
const lineRuptureResultCode = await vesselLineRuptureCalculation.run();
|
|
58
|
+
|
|
59
|
+
expect(lineRuptureResultCode).toBe(ResultCode.SUCCESS);
|
|
60
|
+
|
|
61
|
+
if (vesselLineRuptureCalculation.messages.length > 0) {
|
|
62
|
+
console.log("Messages:");
|
|
63
|
+
vesselLineRuptureCalculation.messages.forEach(msg => console.log(msg));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const dischargeRecords = vesselLineRuptureCalculation.dischargeRecords!;
|
|
67
|
+
const dischargeResult = vesselLineRuptureCalculation.dischargeResult!;
|
|
68
|
+
|
|
69
|
+
expect(dischargeRecords.length).toBe(2);
|
|
70
|
+
expect(Math.abs((dischargeRecords[0].massFlow! - 0.8312460349563479) / 0.8312460349563479)).toBeLessThan(1e-3);
|
|
71
|
+
expect(Math.abs((dischargeRecords[0].finalState.temperature! - 280.0421759165028) / 280.0421759165028)).toBeLessThan(1e-3);
|
|
72
|
+
expect(Math.abs((dischargeRecords[0].finalVelocity! - 3.569757805283587) / 3.569757805283587)).toBeLessThan(1e-3);
|
|
73
|
+
expect(Math.abs((dischargeResult.releaseMass! - 2750.746981948948) / 2750.746981948948)).toBeLessThan(1e-3);
|
|
74
|
+
|
|
75
|
+
console.log(`vessel_line_rupture_calculation.discharge_result.release_mass: ${dischargeResult.releaseMass} [kg]`);
|
|
76
|
+
console.log(`SUCCESS: vessel_line_rupture_calculation (${vesselLineRuptureCalculation.calculationElapsedTime}ms)`);
|
|
77
|
+
console.log(`final velocity = ${dischargeRecords[0].finalVelocity}`);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
@@ -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 OXYGEN", () => {
|
|
13
|
+
test("Vessel line rupture calculation for OXYGEN", async () => {
|
|
14
|
+
|
|
15
|
+
// Define the initial state of the vessel
|
|
16
|
+
const state = new State({
|
|
17
|
+
temperature: 300.0,
|
|
18
|
+
pressure: 1e7,
|
|
19
|
+
liquidFraction: 1.0
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Define the material contained by the vessel
|
|
23
|
+
const material = new Material({
|
|
24
|
+
name: "OXYGEN",
|
|
25
|
+
components: [
|
|
26
|
+
new MaterialComponent({ name: "OXYGEN", moleFraction: 1.0 })
|
|
27
|
+
]
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Run the vessel state calculation
|
|
31
|
+
const vesselStateCalculation = new VesselStateCalculation(material, state);
|
|
32
|
+
const vesselStateResultCode = await vesselStateCalculation.run();
|
|
33
|
+
|
|
34
|
+
expect(vesselStateResultCode).toBe(ResultCode.SUCCESS);
|
|
35
|
+
console.log(`SUCCESS: vessel_state_calculation (${vesselStateCalculation.calculationElapsedTime}ms)`);
|
|
36
|
+
|
|
37
|
+
// Define the vessel (sphere with 5m diameter)
|
|
38
|
+
const vessel = new Vessel({
|
|
39
|
+
state: state,
|
|
40
|
+
material: material,
|
|
41
|
+
vesselConditions: vesselStateCalculation.vesselConditions,
|
|
42
|
+
liquidFillFractionByVolume: 0.7,
|
|
43
|
+
shape: VesselShape.VESSEL_SPHERE,
|
|
44
|
+
diameter: 5
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Define the line rupture (0.5m diameter, 10m length, pipe height fraction 1)
|
|
48
|
+
const lineRupture = new LineRupture({
|
|
49
|
+
pipeDiameter: 0.5,
|
|
50
|
+
pipeLength: 10.0,
|
|
51
|
+
pipeHeightFraction: 1
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Run the vessel line rupture calculation
|
|
55
|
+
const vesselLineRuptureCalculation = new VesselLineRuptureCalculation(vessel, lineRupture, new DischargeParameters());
|
|
56
|
+
const lineRuptureResultCode = await vesselLineRuptureCalculation.run();
|
|
57
|
+
|
|
58
|
+
expect(lineRuptureResultCode).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! - 4351.317585307134) / 4351.317585307134)).toBeLessThan(1e-3);
|
|
70
|
+
expect(Math.abs((dischargeRecords[0].finalState.temperature! - 147.19547540940934) / 147.19547540940934)).toBeLessThan(1e-3);
|
|
71
|
+
expect(Math.abs((dischargeRecords[0].finalVelocity! - 510.5081623160129) / 510.5081623160129)).toBeLessThan(1e-3);
|
|
72
|
+
expect(Math.abs((dischargeResult.releaseMass! - 8699.938240300542) / 8699.938240300542)).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
|
+
});
|