From 13b3125adfc3e52b56373f23c81784d6e99d3165 Mon Sep 17 00:00:00 2001 From: Even Solbraa <41290109+EvenSol@users.noreply.github.com> Date: Fri, 20 Sep 2024 17:37:55 -0300 Subject: [PATCH] Antisurgetest (#1100) * added test * update * update calculator * update * update --- .../processEquipment/TwoPortEquipment.java | 1 + .../compressor/Compressor.java | 2 + .../processEquipment/util/Calculator.java | 20 ++++ .../processSystem/OilGasProcessTest.java | 109 +++++++++++++++++- 4 files changed, 131 insertions(+), 1 deletion(-) diff --git a/src/main/java/neqsim/processSimulation/processEquipment/TwoPortEquipment.java b/src/main/java/neqsim/processSimulation/processEquipment/TwoPortEquipment.java index 286de84623..98aabe4698 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/TwoPortEquipment.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/TwoPortEquipment.java @@ -81,6 +81,7 @@ public void setInletPressure(double pressure) { @Override public void setInletStream(StreamInterface stream) { this.inStream = stream; + this.outStream = inStream.clone(); } /** {@inheritDoc} */ diff --git a/src/main/java/neqsim/processSimulation/processEquipment/compressor/Compressor.java b/src/main/java/neqsim/processSimulation/processEquipment/compressor/Compressor.java index 3a60ba8892..8b9768ab95 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/compressor/Compressor.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/compressor/Compressor.java @@ -1002,6 +1002,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()); diff --git a/src/main/java/neqsim/processSimulation/processEquipment/util/Calculator.java b/src/main/java/neqsim/processSimulation/processEquipment/util/Calculator.java index 65049fde21..d1b3ad1c79 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/util/Calculator.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/util/Calculator.java @@ -7,6 +7,8 @@ import org.apache.logging.log4j.Logger; import neqsim.processSimulation.processEquipment.ProcessEquipmentBaseClass; import neqsim.processSimulation.processEquipment.ProcessEquipmentInterface; +import neqsim.processSimulation.processEquipment.compressor.Compressor; +import neqsim.processSimulation.processEquipment.splitter.Splitter; /** *

@@ -71,10 +73,28 @@ public boolean needRecalculation() { return false; } + public void runAntiSurgeCalc(UUID id) { + Compressor compressor = (Compressor) inputVariable.get(0); + double distToSurge = compressor.getDistanceToSurge(); + double flowInAntiSurge = 1e-6; + if (distToSurge < 0) { + flowInAntiSurge = -distToSurge * compressor.getInletStream().getFlowRate("MSm3/day"); + } + + Splitter anitSurgeSplitter = (Splitter) outputVariable; + + anitSurgeSplitter.setFlowRates(new double[] {-1, flowInAntiSurge}, "MSm3/day"); + + } + /** {@inheritDoc} */ @Override public void run(UUID id) { double sum = 0.0; + if (name.equals("anti surge calculator")) { + runAntiSurgeCalc(id); + return; + } if (name.equals("MEG makeup calculator")) { for (int i = 0; i < inputVariable.size(); i++) { diff --git a/src/test/java/neqsim/processSimulation/processSystem/OilGasProcessTest.java b/src/test/java/neqsim/processSimulation/processSystem/OilGasProcessTest.java index 87ed44d5ef..4a8052cdb6 100644 --- a/src/test/java/neqsim/processSimulation/processSystem/OilGasProcessTest.java +++ b/src/test/java/neqsim/processSimulation/processSystem/OilGasProcessTest.java @@ -2,11 +2,16 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; +import neqsim.processSimulation.processEquipment.compressor.Compressor; +import neqsim.processSimulation.processEquipment.heatExchanger.Cooler; import neqsim.processSimulation.processEquipment.heatExchanger.Heater; +import neqsim.processSimulation.processEquipment.mixer.Mixer; import neqsim.processSimulation.processEquipment.pump.Pump; import neqsim.processSimulation.processEquipment.separator.Separator; +import neqsim.processSimulation.processEquipment.splitter.Splitter; import neqsim.processSimulation.processEquipment.stream.Stream; import neqsim.processSimulation.processEquipment.stream.StreamInterface; +import neqsim.processSimulation.processEquipment.util.Calculator; import neqsim.processSimulation.processEquipment.util.Recycle; import neqsim.processSimulation.processEquipment.valve.ThrottlingValve; import neqsim.thermo.system.SystemInterface; @@ -122,7 +127,109 @@ public void runProcess() throws InterruptedException { assertEquals(seprator3rdStage.getGasOutStream().getFlowRate("kg/hr"), coolerLP.getOutletStream().getFlowRate("kg/hr"), 1e-4); - // System.out.println("recycle flow " + recycle1.getOutletStream().getFlowRate("kg/hr")); + // System.out.println("recycle flow " + + // recycle1.getOutletStream().getFlowRate("kg/hr")); // valveLP1.getOutletStream().getFluid().prettyPrint(); } + + @Test + public void runAntiSurgeProcess() throws InterruptedException { + SystemInterface thermoSystem = new SystemSrkEos(298.0, 10.0); + thermoSystem.addComponent("nitrogen", 1.0); + thermoSystem.addComponent("CO2", 1.0); + thermoSystem.addComponent("methane", 51.0); + thermoSystem.addComponent("ethane", 1.0); + thermoSystem.setMixingRule("classic"); + + Stream gas_from_separator = new Stream("feed stream", thermoSystem); + gas_from_separator.setPressure(55.0, "bara"); + gas_from_separator.setTemperature(30.0, "C"); + gas_from_separator.setFlowRate(7.0, "MSm3/day"); + gas_from_separator.run(); + + Stream recyclegasstream = gas_from_separator.clone(); + recyclegasstream.setFlowRate(1.2, "MSm3/day"); + recyclegasstream.run(); + + Mixer gasmixer = new Mixer("gas mixer"); + gasmixer.addStream(gas_from_separator); + gasmixer.addStream(recyclegasstream); + gasmixer.run(); + + Compressor gascompressor = new Compressor("gas compressor"); + gascompressor.setInletStream(gasmixer.getOutletStream()); + gascompressor.setOutletPressure(90.0, "bara"); + gascompressor.run(); + + double fluidh = gascompressor.getPolytropicFluidHead(); + + // gascompressor.generateCompressorCurves(); + + neqsim.processSimulation.processEquipment.compressor.CompressorChartGenerator compchartgenerator = + new neqsim.processSimulation.processEquipment.compressor.CompressorChartGenerator( + gascompressor); + gascompressor.setCompressorChart(compchartgenerator.generateCompressorChart("mid range")); + + + Cooler gascooler = new Cooler("gas cooler"); + gascooler.setInletStream(gascompressor.getOutletStream()); + gascooler.setOutTemperature(30.0, "C"); + gascooler.run(); + + Separator gassep = new Separator("gas separator"); + gassep.setInletStream(gascooler.getOutletStream()); + gassep.run(); + + Splitter gassplitter = new Splitter("gas splitter"); + gassplitter.setInletStream(gassep.getGasOutStream()); + gassplitter.setFlowRates(new double[] {7.0, 1.2}, "MSm3/day"); + gassplitter.run(); + + ThrottlingValve antisurgevalve = new ThrottlingValve("gas valve"); + antisurgevalve.setInletStream(gassplitter.getSplitStream(1)); + antisurgevalve.setOutletPressure(55.0, "bara"); + antisurgevalve.run(); + + Recycle recycl = new Recycle("rec"); + recycl.addStream(antisurgevalve.getOutletStream()); + recycl.setOutletStream(recyclegasstream); + recycl.run(); + + Calculator antisurgeCalculator = new Calculator("anti surge calculator"); + antisurgeCalculator.addInputVariable(gascompressor); + antisurgeCalculator.setOutputVariable(gassplitter); + + neqsim.processSimulation.processSystem.ProcessSystem operations = + new neqsim.processSimulation.processSystem.ProcessSystem(); + operations.add(gas_from_separator); + operations.add(recyclegasstream); + operations.add(gasmixer); + operations.add(gascompressor); + operations.add(gascooler); + operations.add(gassep); + operations.add(gassplitter); + operations.add(antisurgevalve); + operations.add(recycl); + operations.add(antisurgeCalculator); + operations.run(); + gascompressor.setOutletPressure(90.0); + + gascompressor.getCompressorChart().setUseCompressorChart(false); + 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(4685.039100, gascompressor.getCompressorChart().getSurgeCurve() + .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-4); + assertEquals(90.0, gascompressor.getOutletPressure(), 1e-4); + + + + gas_from_separator.setFlowRate(2.0, "MSm3/day"); + operations.run(); + assertEquals(1.36857161, gassplitter.getSplitStream(1).getFlowRate("MSm3/day"), 1e-4); + assertEquals(1.99999997741, gassplitter.getSplitStream(0).getFlowRate("MSm3/day"), 1e-4); + assertEquals(4671.5920797, gascompressor.getCompressorChart().getSurgeCurve() + .getSurgeFlow(gascompressor.getPolytropicFluidHead()), 1e-4); + assertEquals(90.0, gascompressor.getOutletPressure(), 1e-4); + } }