diff --git a/src/main/java/neqsim/processSimulation/controllerDevice/ControllerDeviceBaseClass.java b/src/main/java/neqsim/processSimulation/controllerDevice/ControllerDeviceBaseClass.java index 685eb70533..1486f94d3c 100644 --- a/src/main/java/neqsim/processSimulation/controllerDevice/ControllerDeviceBaseClass.java +++ b/src/main/java/neqsim/processSimulation/controllerDevice/ControllerDeviceBaseClass.java @@ -43,7 +43,9 @@ public class ControllerDeviceBaseClass extends NamedBaseClass implements Control private double TintValue = 0.0; /** - *

Constructor for ControllerDeviceBaseClass.

+ *

+ * Constructor for ControllerDeviceBaseClass. + *

*/ public ControllerDeviceBaseClass() { super("controller"); @@ -75,7 +77,8 @@ public void runTransient(double initResponse, double dt, UUID id) { transmitter.getMeasuredPercentValue() - (controllerSetPoint - transmitter.getMinimumValue()) / (transmitter.getMaximumValue() - transmitter.getMinimumValue()) * 100; - TintValue += Kp / Ti * error * dt; + if (Ti > 0) + TintValue += Kp / Ti * error * dt; double TderivValue = Kp * Td * (error - oldError) / dt; response = initResponse + propConstant * (Kp * error + TintValue + TderivValue); // System.out.println("error " + error + " %"); diff --git a/src/main/java/neqsim/processSimulation/processEquipment/separator/Separator.java b/src/main/java/neqsim/processSimulation/processEquipment/separator/Separator.java index e3ababd76a..d55243358b 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/separator/Separator.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/separator/Separator.java @@ -244,47 +244,52 @@ public void run(UUID id) { liquidOutStream.getFluid().init(3); } // liquidOutStream.setThermoSystemFromPhase(thermoSystem2, "aqueous"); - try { - thermoSystem = thermoSystem2.clone(); - thermoSystem.setTotalNumberOfMoles(1.0e-10); - thermoSystem.init(1); - // System.out.println("number of phases " + thermoSystem.getNumberOfPhases()); - double totalliquidVolume = 0.0; - for (int j = 0; j < thermoSystem.getNumberOfPhases(); j++) { - double relFact = gasVolume / (thermoSystem2.getPhase(j).getVolume() * 1.0e-5); - if (j >= 1) { - relFact = liquidVolume / (thermoSystem2.getPhase(j).getVolume() * 1.0e-5); - - totalliquidVolume += liquidVolume / thermoSystem2.getPhase(j).getMolarVolume(); - } - for (int i = 0; i < thermoSystem.getPhase(j).getNumberOfComponents(); i++) { - thermoSystem.addComponent(thermoSystem.getPhase(j).getComponent(i).getComponentNumber(), - relFact * thermoSystem2.getPhase(j).getComponent(i).getNumberOfMolesInPhase(), j); + if (getCalculateSteadyState()) { + thermoSystem = thermoSystem2; + } else { + try { + thermoSystem = thermoSystem2.clone(); + // thermoSystem.setTotalNumberOfMoles(1.0); + thermoSystem.init(1); + // System.out.println("number of phases " + thermoSystem.getNumberOfPhases()); + double totalliquidVolume = 0.0; + for (int j = 0; j < thermoSystem.getNumberOfPhases(); j++) { + double relFact = gasVolume / (thermoSystem2.getPhase(j).getVolume("m3")); + if (j >= 1) { + relFact = liquidVolume / (thermoSystem2.getPhase(j).getVolume("m3")); + + totalliquidVolume += liquidVolume / thermoSystem2.getPhase(j).getMolarVolume(); + } + + for (int i = 0; i < thermoSystem.getPhase(j).getNumberOfComponents(); i++) { + thermoSystem.addComponent(i, Math.signum(relFact - 1.0) * relFact + * thermoSystem2.getPhase(j).getComponent(i).getNumberOfMolesInPhase(), j); + } } - } - if (thermoSystem.hasPhaseType("gas")) { - thermoSystem.setBeta(gasVolume / thermoSystem2.getPhase(0).getMolarVolume() - / (gasVolume / thermoSystem2.getPhase(0).getMolarVolume() + totalliquidVolume)); + if (thermoSystem.hasPhaseType("gas")) { + thermoSystem.setBeta(gasVolume / thermoSystem2.getPhase(0).getMolarVolume() + / (gasVolume / thermoSystem2.getPhase(0).getMolarVolume() + totalliquidVolume)); + } + thermoSystem.initBeta(); + thermoSystem.init(3); + // System.out.println("moles in separator " + thermoSystem.getNumberOfMoles()); + // double volume1 = thermoSystem.getVolume(); + // System.out.println("volume1 bef " + volume1); + // System.out.println("beta " + thermoSystem.getBeta()); + + liquidLevel = thermoSystem.getPhase(1).getVolume("m3") / (liquidVolume + gasVolume); + liquidVolume = getLiquidLevel() * 3.14 / 4.0 * getInternalDiameter() * getInternalDiameter() + * getSeparatorLength(); + gasVolume = (1.0 - getLiquidLevel()) * 3.14 / 4.0 * getInternalDiameter() + * getInternalDiameter() * getSeparatorLength(); + // System.out.println("moles out" + + // liquidOutStream.getThermoSystem().getTotalNumberOfMoles()); + } catch (Exception ex) { + logger.error(ex.getMessage(), ex); } - thermoSystem.initBeta(); - thermoSystem.init(3); - // System.out.println("moles in separator " + thermoSystem.getNumberOfMoles()); - // double volume1 = thermoSystem.getVolume(); - // System.out.println("volume1 bef " + volume1); - // System.out.println("beta " + thermoSystem.getBeta()); - - liquidLevel = thermoSystem.getPhase(1).getVolume() * 1e-5 / (liquidVolume + gasVolume); - liquidVolume = getLiquidLevel() * 3.14 / 4.0 * getInternalDiameter() * getInternalDiameter() - * getSeparatorLength(); - gasVolume = (1.0 - getLiquidLevel()) * 3.14 / 4.0 * getInternalDiameter() - * getInternalDiameter() * getSeparatorLength(); - // System.out.println("moles out" + - // liquidOutStream.getThermoSystem().getTotalNumberOfMoles()); - } catch (Exception ex) { - logger.error(ex.getMessage(), ex); } - thermoSystem = thermoSystem2; + // thermoSystem = thermoSystem2; setCalculationIdentifier(id); } @@ -307,49 +312,44 @@ public void runTransient(double dt, UUID id) { run(id); increaseTime(dt); return; - } + } else { + inletStreamMixer.run(id); + thermoSystem.init(3); + gasOutStream.getThermoSystem().init(3); + liquidOutStream.getThermoSystem().init(3); + double volume1 = thermoSystem.getVolume("m3"); + // System.out.println("volume " + volume1); + double deltaEnergy = inletStreamMixer.getOutletStream().getThermoSystem().getEnthalpy() + - gasOutStream.getThermoSystem().getEnthalpy() + - liquidOutStream.getThermoSystem().getEnthalpy(); + // System.out.println("enthalph delta " + deltaEnergy); + double newEnergy = thermoSystem.getInternalEnergy() + dt * deltaEnergy; + for (int i = 0; i < thermoSystem.getPhase(0).getNumberOfComponents(); i++) { + double dn = inletStreamMixer.getOutletStream().getThermoSystem().getPhase(0).getComponent(i) + .getNumberOfMolesInPhase() + + inletStreamMixer.getOutletStream().getThermoSystem().getPhase(1).getComponent(i) + .getNumberOfMolesInPhase() + - gasOutStream.getThermoSystem().getPhase(0).getComponent(i).getNumberOfMolesInPhase() + - liquidOutStream.getThermoSystem().getPhase(0).getComponent(i) + .getNumberOfMolesInPhase(); + // System.out.println("dn " + dn); + thermoSystem.addComponent(inletStreamMixer.getOutletStream().getThermoSystem().getPhase(0) + .getComponent(i).getComponentNumber(), dn * dt); + } + ThermodynamicOperations thermoOps = new ThermodynamicOperations(thermoSystem); + thermoOps.VUflash(volume1, newEnergy, "m3", "J"); - inletStreamMixer.run(id); + setTempPres(thermoSystem.getTemperature(), thermoSystem.getPressure()); - // System.out.println("moles out" + - // liquidOutStream.getThermoSystem().getTotalNumberOfMoles()); - // double inMoles = - // inletStreamMixer.getOutStream().getThermoSystem().getTotalNumberOfMoles(); - // double gasoutMoles = gasOutStream.getThermoSystem().getNumberOfMoles(); - // double liqoutMoles = liquidOutStream.getThermoSystem().getNumberOfMoles(); - thermoSystem.init(3); - gasOutStream.getThermoSystem().init(3); - liquidOutStream.getThermoSystem().init(3); - double volume1 = thermoSystem.getVolume(); - // System.out.println("volume1 " + volume1); - double deltaEnergy = inletStreamMixer.getOutletStream().getThermoSystem().getEnthalpy() - - gasOutStream.getThermoSystem().getEnthalpy() - - liquidOutStream.getThermoSystem().getEnthalpy(); - // System.out.println("enthalph delta " + deltaEnergy); - double newEnergy = thermoSystem.getInternalEnergy() + dt * deltaEnergy; - for (int i = 0; i < thermoSystem.getPhase(0).getNumberOfComponents(); i++) { - double dn = inletStreamMixer.getOutletStream().getThermoSystem().getPhase(0).getComponent(i) - .getNumberOfMolesInPhase() - + inletStreamMixer.getOutletStream().getThermoSystem().getPhase(1).getComponent(i) - .getNumberOfMolesInPhase() - - gasOutStream.getThermoSystem().getPhase(0).getComponent(i).getNumberOfMolesInPhase() - - liquidOutStream.getThermoSystem().getPhase(0).getComponent(i).getNumberOfMolesInPhase(); - // System.out.println("dn " + dn); - thermoSystem.addComponent(inletStreamMixer.getOutletStream().getThermoSystem().getPhase(0) - .getComponent(i).getComponentNumber(), dn * dt); + liquidLevel = thermoSystem.getPhase(1).getVolume("m3") / (liquidVolume + gasVolume); + // System.out.println("liquid level " + liquidLevel); + liquidVolume = getLiquidLevel() * 3.14 / 4.0 * getInternalDiameter() * getInternalDiameter() + * getSeparatorLength(); + // System.out.println("gasvol " + gasVolume + " liqvol " + liquidVolume); + gasVolume = (1.0 - getLiquidLevel()) * 3.14 / 4.0 * getInternalDiameter() + * getInternalDiameter() * getSeparatorLength(); + setCalculationIdentifier(id); } - ThermodynamicOperations thermoOps = new ThermodynamicOperations(thermoSystem); - thermoOps.VUflash(volume1, newEnergy); - - setTempPres(thermoSystem.getTemperature(), thermoSystem.getPressure()); - - liquidLevel = thermoSystem.getPhase(1).getVolume() * 1e-5 / (liquidVolume + gasVolume); - // System.out.println("liquid level " + liquidLevel); - liquidVolume = getLiquidLevel() * 3.14 / 4.0 * getInternalDiameter() * getInternalDiameter() - * getSeparatorLength(); - gasVolume = (1.0 - getLiquidLevel()) * 3.14 / 4.0 * getInternalDiameter() - * getInternalDiameter() * getSeparatorLength(); - setCalculationIdentifier(id); } /** @@ -499,7 +499,7 @@ public void setInternalDiameter(double diameter) { * @return a double */ public double getGasSuperficialVelocity() { - return thermoSystem.getPhase(0).getTotalVolume() / 1e5 + return thermoSystem.getPhase(0).getVolume("m3") / (neqsim.thermo.ThermodynamicConstantsInterface.pi * getInternalDiameter() * getInternalDiameter() / 4.0); } @@ -554,7 +554,7 @@ public double getDeRatedGasLoadFactor() { if (surfaceTension < 10.0e-3) { derating = 1.0 - 0.5 * (10.0e-3 - surfaceTension) / 10.0e-3; } - System.out.println("derating " + derating); + // System.out.println("derating " + derating); double term1 = (thermoSystem.getPhase(1).getPhysicalProperties().getDensity() - thermoSystem.getPhase(0).getPhysicalProperties().getDensity()) / thermoSystem.getPhase(0).getPhysicalProperties().getDensity(); @@ -577,7 +577,7 @@ public double getDeRatedGasLoadFactor(int phase) { if (surfaceTension < 10.0e-3) { derating = 1.0 - 0.5 * (10.0e-3 - surfaceTension) / 10.0e-3; } - System.out.println("derating " + derating); + // System.out.println("derating " + derating); double term1 = (thermoSystem.getPhase(phase).getPhysicalProperties().getDensity() - thermoSystem.getPhase(0).getPhysicalProperties().getDensity()) / thermoSystem.getPhase(0).getPhysicalProperties().getDensity(); @@ -658,7 +658,7 @@ public SeparatorSection getSeparatorSection(String name) { return sec; } } - System.out.println("no section with name: " + name + " found....."); + // System.out.println("no section with name: " + name + " found....."); return null; } diff --git a/src/main/java/neqsim/processSimulation/processSystem/ProcessSystem.java b/src/main/java/neqsim/processSimulation/processSystem/ProcessSystem.java index c32529e658..c63a5a38f9 100644 --- a/src/main/java/neqsim/processSimulation/processSystem/ProcessSystem.java +++ b/src/main/java/neqsim/processSimulation/processSystem/ProcessSystem.java @@ -33,7 +33,7 @@ public class ProcessSystem extends SimulationBaseClass { static Logger logger = LogManager.getLogger(ProcessSystem.class); transient Thread thisThread; - String[][] signalDB = new String[1000][100]; + String[][] signalDB = new String[10000][100]; private double surroundingTemperature = 288.15; private int timeStepNumber = 0; private ArrayList unitOperations = diff --git a/src/test/java/neqsim/processSimulation/processSystem/ProcessSystemRunTransientTest.java b/src/test/java/neqsim/processSimulation/processSystem/ProcessSystemRunTransientTest.java index 32d6053ad2..4bcc10f26f 100644 --- a/src/test/java/neqsim/processSimulation/processSystem/ProcessSystemRunTransientTest.java +++ b/src/test/java/neqsim/processSimulation/processSystem/ProcessSystemRunTransientTest.java @@ -31,12 +31,10 @@ public void testGetName() { } @Test - void testGetTime() { - } + void testGetTime() {} @Test - void testGetTimeStep() { - } + void testGetTimeStep() {} private SystemInterface getTestSystem() { neqsim.thermo.system.SystemInterface testSystem = @@ -49,7 +47,7 @@ private SystemInterface getTestSystem() { return testSystem; } - // @Test + @Test public void testDynamicCalculation() { neqsim.thermo.system.SystemInterface testSystem = getTestSystem(); @@ -59,7 +57,7 @@ public void testDynamicCalculation() { ThrottlingValve valve1 = new ThrottlingValve("valve_1", stream1); valve1.setOutletPressure(5.0); - valve1.setPercentValveOpening(50); + valve1.setPercentValveOpening(40); Separator separator1 = new Separator("sep 1"); separator1.addStream(valve1.getOutletStream()); @@ -81,7 +79,7 @@ public void testDynamicCalculation() { flowController.setTransmitter(flowTransmitter); flowController.setReverseActing(true); flowController.setControllerSetPoint(63.5); - flowController.setControllerParameters(0.1, 0.10, 0.0); + flowController.setControllerParameters(1.2, 100.0, 0.0); p.add(stream1); p.add(valve1); @@ -90,15 +88,16 @@ public void testDynamicCalculation() { p.add(valve3); p.add(flowTransmitter); valve1.setController(flowController); + valve1.setCalculateSteadyState(false); p.run(); // transient behaviour p.setTimeStep(1.0); - for (int i = 0; i < 5; i++) { - // logger.info("volume flow " + flowTransmitter.getMeasuredValue() - // + " valve opening " + valve_1.getPercentValveOpening() + " pressure " - // + separator_1.getGasOutStream().getPressure()); + for (int i = 0; i < 50; i++) { + System.out.println("volume flow " + flowTransmitter.getMeasuredValue() + " valve opening " + + valve1.getPercentValveOpening() + " pressure " + + separator1.getGasOutStream().getPressure()); p.runTransient(); for (SimulationInterface sim : p.getUnitOperations()) { assertEquals(sim.getCalculationIdentifier(), p.getCalculationIdentifier()); @@ -111,49 +110,62 @@ public void testDynamicCalculation2() { neqsim.thermo.system.SystemInterface testSystem2 = new neqsim.thermo.system.SystemSrkEos((273.15 + 25.0), 10.00); testSystem2.addComponent("methane", 1.1); - testSystem2.addComponent("ethane", 0.10001); testSystem2.addComponent("n-heptane", 1.001); testSystem2.setMixingRule(2); - Stream purgeStream = new Stream("Purge Stream", testSystem2); - ThrottlingValve purgeValve = new ThrottlingValve("purgeValve", purgeStream); - purgeValve.setOutletPressure(7.0); - purgeValve.setPercentValveOpening(50.0); + neqsim.thermo.system.SystemInterface testSystem3 = + new neqsim.thermo.system.SystemSrkEos((273.15 + 25.0), 10.00); + testSystem3.addComponent("methane", 1.1); + testSystem3.addComponent("n-heptane", 0.001); + testSystem3.setMixingRule(2); + + Stream stream1 = new Stream("Stream1", testSystem2); + stream1.setFlowRate(1000.0, "kg/hr"); + stream1.setPressure(10.0, "bara"); + stream1.setTemperature(25.0, "C"); + + Stream streamPurge = new Stream("StreamPurge", testSystem3); + streamPurge.setFlowRate(5.0, "kg/hr"); + streamPurge.setPressure(10.0, "bara"); + streamPurge.setTemperature(25.0, "C"); - neqsim.thermo.system.SystemInterface testSystem = getTestSystem(); - Stream stream1 = new Stream("Stream1", testSystem); - stream1.setCalculateSteadyState(false); ThrottlingValve valve1 = new ThrottlingValve("valve_1", stream1); valve1.setOutletPressure(7.0); valve1.setPercentValveOpening(50); + valve1.setCalculateSteadyState(false); + + ThrottlingValve valvePurge = new ThrottlingValve("valve_purge", streamPurge); + valvePurge.setOutletPressure(7.0); + valvePurge.setPercentValveOpening(50); + valvePurge.setCalculateSteadyState(false); Separator separator1 = new Separator("separator_1"); separator1.addStream(valve1.getOutletStream()); - separator1.addStream(purgeValve.getOutletStream()); - separator1.setCalculateSteadyState(true); + separator1.addStream(valvePurge.getOutletStream()); + separator1.setCalculateSteadyState(false); + separator1.setSeparatorLength(3.0); + separator1.setInternalDiameter(0.8); ThrottlingValve valve2 = new ThrottlingValve("valve_2", separator1.getLiquidOutStream()); - valve2.setOutletPressure(5.0); + valve2.setOutletPressure(1.0); valve2.setPercentValveOpening(50); - valve2.setCalculateSteadyState(true); - // valve_2.setCv(10.0); + valve2.setCalculateSteadyState(false); ThrottlingValve valve3 = new ThrottlingValve("valve_3", separator1.getGasOutStream()); - valve3.setOutletPressure(5.0); + valve3.setOutletPressure(1.0); valve3.setPercentValveOpening(50); - valve3.setCalculateSteadyState(true); - // valve_3.setCv(10.0); + valve3.setCalculateSteadyState(false); LevelTransmitter separatorLevelTransmitter = new LevelTransmitter(separator1); separatorLevelTransmitter.setName("separatorLevelTransmitter1"); - separatorLevelTransmitter.setMaximumValue(1.0); - separatorLevelTransmitter.setMinimumValue(0.0); + separatorLevelTransmitter.setMaximumValue(0.5); + separatorLevelTransmitter.setMinimumValue(0.2); ControllerDeviceInterface separatorLevelController = new ControllerDeviceBaseClass(); - separatorLevelController.setReverseActing(true); + separatorLevelController.setReverseActing(false); separatorLevelController.setTransmitter(separatorLevelTransmitter); separatorLevelController.setControllerSetPoint(0.3); - separatorLevelController.setControllerParameters(1, 1000.0, 0.0); + separatorLevelController.setControllerParameters(0.510, 200.0, 0.0); PressureTransmitter separatorPressureTransmitter = new PressureTransmitter(separator1.getGasOutStream()); @@ -165,13 +177,12 @@ public void testDynamicCalculation2() { separatorPressureController.setTransmitter(separatorPressureTransmitter); separatorPressureController.setReverseActing(false); separatorPressureController.setControllerSetPoint(7.0); - separatorPressureController.setControllerParameters(0.5, 10.0, 0.0); + separatorPressureController.setControllerParameters(1.5, .0, 0.0); p.add(stream1); + p.add(streamPurge); p.add(valve1); - - p.add(purgeStream); - p.add(purgeValve); + p.add(valvePurge); p.add(separator1); p.add(valve2); p.add(valve3); @@ -189,26 +200,17 @@ public void testDynamicCalculation2() { } // p.displayResult(); - p.setTimeStep(0.01); - for (int i = 0; i < 500; i++) { - // logger.info("pressure "+separator_1.getGasOutStream().getPressure()+ " flow "+ - // separator_1.getGasOutStream().getFlowRate("kg/hr") + " sepr height - // "+separatorLevelTransmitter.getMeasuredValue()); + p.setTimeStep(1.0); + for (int i = 0; i < 9000; i++) { + System.out.println("pressure " + separator1.getGasOutStream().getPressure() + " flow " + + separator1.getGasOutStream().getFlowRate("kg/hr") + " sepr height " + + separatorLevelTransmitter.getMeasuredValue() + "valve2 opening " + + valve2.getPercentValveOpening() + "valve3 opening " + valve3.getPercentValveOpening()); p.runTransient(); for (SimulationInterface sim : p.getUnitOperations()) { assertEquals(p.getCalculationIdentifier(), sim.getCalculationIdentifier()); } } - valve1.setPercentValveOpening(60); - - for (int i = 0; i < 10; i++) { - // logger.info("pressure "+separator_1.getGasOutStream().getPressure()+ " flow "+ - // separator_1.getGasOutStream().getFlowRate("kg/hr")); - p.runTransient(); - for (SimulationInterface sim : p.getUnitOperations()) { - assertEquals(p.getCalculationIdentifier(), sim.getCalculationIdentifier()); - } - } } }