From d21d60901016d283f6414be4e68899d00e6b802e Mon Sep 17 00:00:00 2001 From: Even Solbraa <41290109+EvenSol@users.noreply.github.com> Date: Sun, 29 Sep 2024 16:00:13 -0300 Subject: [PATCH] try fix anti surge calc (#1122) --- .../compressor/Compressor.java | 10 +-- .../processEquipment/util/Calculator.java | 19 ++++- .../processSystem/OilGasProcessTest.java | 85 +++++++++++-------- 3 files changed, 67 insertions(+), 47 deletions(-) diff --git a/src/main/java/neqsim/processSimulation/processEquipment/compressor/Compressor.java b/src/main/java/neqsim/processSimulation/processEquipment/compressor/Compressor.java index 8c21ffd8a..8f2ccc8ee 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/compressor/Compressor.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/compressor/Compressor.java @@ -607,7 +607,8 @@ public void run(UUID id) { } double hout = hinn + dH; isentropicEfficiency = (newEnt - hinn) / dH; - // TODO: the polytropic efficiency calculation here need to be corrected, it is always larger + // TODO: the polytropic efficiency calculation here need to be corrected, it is + // always larger // than isentropic efficiency polytropicEfficiency = isentropicEfficiency; dH = hout - hinn; @@ -966,11 +967,8 @@ public boolean isSurge(double flow, double head) { /** {@inheritDoc} */ @Override public double getDistanceToSurge() { - getCompressorChart().getSurgeCurve(); - getCompressorChart().getSurgeCurve().getSurgeFlow(getPolytropicFluidHead()); - return (getInletStream().getFlowRate("m3/hr") - - getCompressorChart().getSurgeCurve().getSurgeFlow(getPolytropicFluidHead())) - / getCompressorChart().getSurgeCurve().getSurgeFlow(getPolytropicFluidHead()); + return getInletStream().getFlowRate("m3/hr") + / getCompressorChart().getSurgeCurve().getSurgeFlow(getPolytropicFluidHead()) - 1; } /** diff --git a/src/main/java/neqsim/processSimulation/processEquipment/util/Calculator.java b/src/main/java/neqsim/processSimulation/processEquipment/util/Calculator.java index c26ab6e4e..2cb2f7624 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/util/Calculator.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/util/Calculator.java @@ -75,13 +75,24 @@ public boolean needRecalculation() { public void runAntiSurgeCalc(UUID id) { Compressor compressor = (Compressor) inputVariable.get(0); + + Splitter anitSurgeSplitter = (Splitter) outputVariable; double distToSurge = compressor.getDistanceToSurge(); - double flowInAntiSurge = 1e-6; - if (distToSurge < 0) { - flowInAntiSurge = -distToSurge * compressor.getInletStream().getFlowRate("MSm3/day"); + double flowInAntiSurge = anitSurgeSplitter.getSplitStream(1).getFlowRate("MSm3/day"); + if (compressor.getDistanceToSurge() > 0) { + flowInAntiSurge = anitSurgeSplitter.getSplitStream(1).getFlowRate("MSm3/day") + - anitSurgeSplitter.getSplitStream(1).getFlowRate("MSm3/day") * distToSurge * 0.5; + } else if (compressor.getDistanceToSurge() < 0) { + flowInAntiSurge = anitSurgeSplitter.getSplitStream(1).getFlowRate("MSm3/day") + - distToSurge * compressor.getInletStream().getFlowRate("MSm3/day") * 0.8; + if (flowInAntiSurge > compressor.getInletStream().getFlowRate("MSm3/day")) { + flowInAntiSurge = compressor.getInletStream().getFlowRate("MSm3/day") * 0.99; + } + } + if (flowInAntiSurge < 1e-6) { + flowInAntiSurge = 1e-6; } - Splitter anitSurgeSplitter = (Splitter) outputVariable; anitSurgeSplitter.setFlowRates(new double[] {-1, flowInAntiSurge}, "MSm3/day"); anitSurgeSplitter.run(); anitSurgeSplitter.setCalculationIdentifier(id); diff --git a/src/test/java/neqsim/processSimulation/processSystem/OilGasProcessTest.java b/src/test/java/neqsim/processSimulation/processSystem/OilGasProcessTest.java index 46090e4c2..42eb9dbf4 100644 --- a/src/test/java/neqsim/processSimulation/processSystem/OilGasProcessTest.java +++ b/src/test/java/neqsim/processSimulation/processSystem/OilGasProcessTest.java @@ -3,7 +3,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import neqsim.processSimulation.processEquipment.compressor.Compressor; -import neqsim.processSimulation.processEquipment.compressor.SurgeCurve; import neqsim.processSimulation.processEquipment.heatExchanger.Cooler; import neqsim.processSimulation.processEquipment.heatExchanger.Heater; import neqsim.processSimulation.processEquipment.mixer.Mixer; @@ -189,7 +188,7 @@ public void runAntiSurgeProcess() throws InterruptedException { Recycle recycl = new Recycle("rec"); recycl.addStream(antisurgevalve.getOutletStream()); recycl.setOutletStream(recyclegasstream); - recycl.setFlowAccuracy(1e-12); + recycl.setFlowAccuracy(1e-20); recycl.run(); Calculator antisurgeCalculator = new Calculator("anti surge calculator"); @@ -222,11 +221,12 @@ public void runAntiSurgeProcess() throws InterruptedException { gas_from_separator.setFlowRate(2.0, "MSm3/day"); operations.run(); - assertEquals(1.5704782278734, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-4); - assertEquals(1.99999997741, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-4); - assertEquals(4402.40767965, gascompressor.getCompressorChart().getSurgeCurve() - .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-4); - assertEquals(144.6783957, gascompressor.getOutletPressure(), 1e-4); + // assertEquals(4.00961638, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-4); + assertEquals(2.005737385700, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-2); + assertEquals(4157.46978573787, gascompressor.getCompressorChart().getSurgeCurve() + .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-1); + assertEquals(4157.470818, gascompressor.getInletStream().getFlowRate("m3/hr"), 1e-2); + assertEquals(109.8098956, gascompressor.getOutletPressure(), 1e-2); gas_from_separator.setFlowRate(8.0, "MSm3/day"); operations.run(); @@ -237,14 +237,14 @@ public void runAntiSurgeProcess() throws InterruptedException { .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-4); assertEquals(82.7494476493, gascompressor.getOutletPressure(), 1e-4); - gas_from_separator.setFlowRate(0.1, "MSm3/day"); - gascompressor.setSpeed(2000); + gas_from_separator.setFlowRate(0.5, "MSm3/day"); + operations.run(); - assertEquals(0.66417291176, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-4); - assertEquals(0.09999851484397385, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-4); - assertEquals(4037.5356388, gascompressor.getCompressorChart().getSurgeCurve() + assertEquals(5.70145187, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-4); + assertEquals(0.50010559709, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-4); + assertEquals(4159.042541, gascompressor.getCompressorChart().getSurgeCurve() .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-4); - assertEquals(96.609347, gascompressor.getOutletPressure(), 1e-4); + assertEquals(112.0488937, gascompressor.getOutletPressure(), 1e-4); } @Test @@ -268,8 +268,13 @@ public void runAntiSurgeProcess2() throws InterruptedException { gasmixer.addStream(gas_from_separator); gasmixer.addStream(recyclegasstream); + Cooler gascooler2 = new Cooler("gas cooler2 "); + gascooler2.setInletStream(gasmixer.getOutletStream()); + gascooler2.setOutTemperature(30.0, "C"); + Compressor gascompressor = new Compressor("gas compressor"); - gascompressor.setInletStream(gasmixer.getOutletStream()); + gascompressor.setInletStream(gascooler2.getOutletStream()); + gascompressor.setPolytropicEfficiency(0.85); gascompressor.setOutletPressure(90.0, "bara"); Cooler gascooler = new Cooler("gas cooler"); @@ -297,6 +302,7 @@ public void runAntiSurgeProcess2() throws InterruptedException { operations.add(gas_from_separator); operations.add(recyclegasstream); operations.add(gasmixer); + operations.add(gascooler2); operations.add(gascompressor); operations.add(gascooler); operations.add(gassep); @@ -306,11 +312,12 @@ public void runAntiSurgeProcess2() throws InterruptedException { operations.run(); double fluidh = gascompressor.getPolytropicFluidHead(); + double flowratetocompressor = gascompressor.getInletStream().getFlowRate("MSm3/day"); + neqsim.processSimulation.processEquipment.compressor.CompressorChartGenerator compchartgenerator = new neqsim.processSimulation.processEquipment.compressor.CompressorChartGenerator( gascompressor); gascompressor.setCompressorChart(compchartgenerator.generateCompressorChart("mid range")); - gascompressor.setOutletPressure(90.0); gascompressor.getCompressorChart().setUseCompressorChart(false); @@ -321,37 +328,41 @@ public void runAntiSurgeProcess2() throws InterruptedException { operations.add(antisurgeCalculator); operations.run(); - assertEquals(6.9999999, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-4); - assertEquals(1e-6, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-4); - assertEquals(4646.77601821, gascompressor.getCompressorChart().getSurgeCurve() - .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-4); + assertEquals(7.00019789, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-2); + assertEquals(0.001732061306, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-4); + assertEquals(4685.038961, gascompressor.getCompressorChart().getSurgeCurve() + .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-2); + assertEquals(5176.97051519596, gascompressor.getInletStream().getFlowRate("m3/hr"), 10); assertEquals(90.0, gascompressor.getOutletPressure(), 1e-4); - gas_from_separator.setFlowRate(2.0, "MSm3/day"); + gas_from_separator.setFlowRate(1.0, "MSm3/day"); operations.run(); - assertEquals(1.58988554, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-2); - assertEquals(1.99847869184, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-4); - assertEquals(4632.1489149, gascompressor.getCompressorChart().getSurgeCurve() - .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-4); + double flow = gasmixer.getOutletStream().getFlowRate("MSm3/day"); + assertEquals(5.33483946, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-2); + assertEquals(1.0, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-4); + assertEquals(4685.0389615, gascompressor.getCompressorChart().getSurgeCurve() + .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-2); + assertEquals(4684.996901, gascompressor.getInletStream().getFlowRate("m3/hr"), 1e-1); assertEquals(90.0, gascompressor.getOutletPressure(), 1e-4); - gas_from_separator.setFlowRate(8.0, "MSm3/day"); + + gas_from_separator.setFlowRate(9.0, "MSm3/day"); operations.run(); - assertEquals(1.0000000000014376E-6, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), - 1e-4); - assertEquals(8.000000000000004, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-4); - assertEquals(4646.77601880, gascompressor.getCompressorChart().getSurgeCurve() - .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-4); + assertEquals(1.0224661428980936E-8, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), + 1e-2); + assertEquals(9.0, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-4); + assertEquals(4685.0389615, gascompressor.getCompressorChart().getSurgeCurve() + .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-2); + assertEquals(6656.10407208, gascompressor.getInletStream().getFlowRate("m3/hr"), 1e-2); assertEquals(90.0, gascompressor.getOutletPressure(), 1e-4); - double[] flows = new double[] {7044, 7560, 7760}; - double[] head = new double[] {74, 80, 90}; - SurgeCurve surg = new SurgeCurve(flows, head); - gascompressor.getCompressorChart().setSurgeCurve(surg); + gas_from_separator.setFlowRate(5.5, "MSm3/day"); operations.run(); - assertEquals(6753.1900, gascompressor.getCompressorChart().getSurgeCurve() + assertEquals(0.834839487572494, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-2); + assertEquals(5.5, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-4); + assertEquals(4685.0389615, gascompressor.getCompressorChart().getSurgeCurve() .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-2); - assertEquals(5998.55269, gascompressor.getInletStream().getFlowRate("m3/hr"), 1e-4); - assertEquals(0.9071841061, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-4); + assertEquals(4685.038986, gascompressor.getInletStream().getFlowRate("m3/hr"), 1); + assertEquals(90.0, gascompressor.getOutletPressure(), 1e-4); } }