From af42c9c8f48788f486576dbc715d0f4b0969e768 Mon Sep 17 00:00:00 2001 From: Even Solbraa <41290109+EvenSol@users.noreply.github.com> Date: Sun, 4 Jun 2023 11:12:15 +0200 Subject: [PATCH] Testelectrolytes eos (#720) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * initial work * added more implementations * added methods for stream and saturator * added test for recalculation to process module * added calc check heater/cooler * style * Update Heater.java * revert * Update Stream.java * added check for null * update * fixed database parameters * fixed db table * added test and fixed bugs * added test for recalc for mxer * add test * fixed bug * set private * update * update * use solved property remove isUpdated * testelectrolyteEos * added updates to test * remove logging * fixed error * fix error * fix * fix --------- Co-authored-by: Åsmund Våge Fannemel <34712686+asmfstatoil@users.noreply.github.com> --- .../ProcessEquipmentInterface.java | 3 + .../neqsim/thermo/ThermodynamicModelTest.java | 127 ++++++++------- .../neqsim/thermo/system/SystemInterface.java | 10 ++ .../neqsim/thermo/system/SystemThermo.java | 12 +- .../system/SystemElectrolyteCPATest.java | 154 ++++++++++++------ .../system/SystemFurstElectrolyteEoS.java | 127 +++++++++++++++ 6 files changed, 325 insertions(+), 108 deletions(-) create mode 100644 src/test/java/neqsim/thermo/system/SystemFurstElectrolyteEoS.java diff --git a/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentInterface.java b/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentInterface.java index 880d8e2e5..90db6e21e 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentInterface.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentInterface.java @@ -37,6 +37,9 @@ public interface ProcessEquipmentInterface extends SimulationInterface { *

* Check if process module needs recalculating. *

+ * + * @return true or false + * */ public default boolean needRecalculation() { return true; diff --git a/src/main/java/neqsim/thermo/ThermodynamicModelTest.java b/src/main/java/neqsim/thermo/ThermodynamicModelTest.java index ecb0abd13..8fe472c0b 100644 --- a/src/main/java/neqsim/thermo/ThermodynamicModelTest.java +++ b/src/main/java/neqsim/thermo/ThermodynamicModelTest.java @@ -21,6 +21,7 @@ public class ThermodynamicModelTest implements ThermodynamicConstantsInterface { private static final long serialVersionUID = 1000; SystemInterface system; + private double maxError = 1e-10; static Logger logger = LogManager.getLogger(ThermodynamicModelTest.class); /** @@ -76,7 +77,7 @@ public void runTest() { * @return a boolean */ public boolean checkFugacityCoefficients() { - double temp1 = 0 ; + double temp1 = 0; for (int j = 0; j < system.getNumberOfPhases(); j++) { for (int i = 0; i < system.getPhase(j).getNumberOfComponents(); i++) { temp1 += system.getPhase(j).getComponents()[i].getNumberOfMolesInPhase() @@ -87,8 +88,8 @@ public boolean checkFugacityCoefficients() { temp1 -= system.getPhase(j).getGresTP() / (R * system.getTemperature()); } logger.info("Testing fugacity coefficients..................."); - //logger.info("Total fug gas : " + temp1); - //logger.info("Total fug liq : " + temp2); + // logger.info("Total fug gas : " + temp1); + // logger.info("Total fug liq : " + temp2); // logger.info("Testing fugacity coefficients..................."); // logger.info("Total fug gas : " + temp1); // logger.info("Total fug liq : " + temp2); @@ -99,11 +100,11 @@ public boolean checkFugacityCoefficients() { // temp1 -= system.getPhase(j).getGresTP() / (R * system.getTemperature()); // temp2 -= system.getPhases()[1].getGresTP() / (R * system.getTemperature()); double sum = Math.abs(temp1); - //logger.info("Diffference fug gas : " + temp1); - //logger.info("Difference fug liq : " + temp2); // logger.info("Diffference fug gas : " + temp1); // logger.info("Difference fug liq : " + temp2); - return Math.abs(sum) < 1e-10; + // logger.info("Diffference fug gas : " + temp1); + // logger.info("Difference fug liq : " + temp2); + return Math.abs(sum) < maxError; } /** @@ -118,35 +119,35 @@ public boolean checkFugacityCoefficientsDn() { double temp1 = 0; double sum = 0; for (int k = 0; k < system.getNumberOfPhases(); k++) { - for (int j = 0; j < system.getPhase(k).getNumberOfComponents(); j++) { - temp1 = 0; - //temp2 = 0; - // temp1 += - // Math.log(system.getPhases()[0].getComponents()[j].getFugacityCoefficient()); - // temp2 += - // Math.log(system.getPhases()[1].getComponents()[j].getFugacityCoefficient()); - for (int i = 0; i < system.getPhase(k).getNumberOfComponents(); i++) { - temp1 += system.getPhase(k).getComponents()[i].getNumberOfMolesInPhase() - * system.getPhase(k).getComponents()[i].getdfugdn(j); - //temp2 += system.getPhases()[1].getComponents()[i].getNumberOfMolesInPhase() - //* system.getPhases()[1].getComponents()[i].getdfugdn(j); - // logger.info("fug " + - // system.getPhases()[1].getComponents()[i].getNumberOfMolesInPhase()*system.getPhases()[1].getComponents()[i].getdfugdn(j)); + for (int j = 0; j < system.getPhase(k).getNumberOfComponents(); j++) { + temp1 = 0; + // temp2 = 0; + // temp1 += + // Math.log(system.getPhases()[0].getComponents()[j].getFugacityCoefficient()); + // temp2 += + // Math.log(system.getPhases()[1].getComponents()[j].getFugacityCoefficient()); + for (int i = 0; i < system.getPhase(k).getNumberOfComponents(); i++) { + temp1 += system.getPhase(k).getComponents()[i].getNumberOfMolesInPhase() + * system.getPhase(k).getComponents()[i].getdfugdn(j); + // temp2 += system.getPhases()[1].getComponents()[i].getNumberOfMolesInPhase() + // * system.getPhases()[1].getComponents()[i].getdfugdn(j); + // logger.info("fug " + + // system.getPhases()[1].getComponents()[i].getNumberOfMolesInPhase()*system.getPhases()[1].getComponents()[i].getdfugdn(j)); + } + + + // logger.info("test fugdn gas : " + j + " " + temp1 + " name " + + // system.getPhases()[0].getComponents()[j].getComponentName()); + // logger.info("test fugdn liq : " + j + " " + temp2); } - - - // logger.info("test fugdn gas : " + j + " " + temp1 + " name " + - // system.getPhases()[0].getComponents()[j].getComponentName()); - // logger.info("test fugdn liq : " + j + " " + temp2); } - } - sum += Math.abs(temp1) ; - logger.info("Testing composition derivatives of fugacity coefficients..................."); + sum += Math.abs(temp1); + logger.info("Testing composition derivatives of fugacity coefficients..................."); logger.info("Diffference : " + sum); // logger.info("Testing composition derivatives of fugacity // coefficients..................."); // logger.info("Difference : " + sum); - return Math.abs(sum) < 1e-10; + return Math.abs(sum) < maxError; } /** @@ -162,34 +163,35 @@ public boolean checkFugacityCoefficientsDn2() { double sum = 0; for (int k = 0; k < system.getNumberOfPhases(); k++) { - for (int j = 0; j < system.getPhase(k).getNumberOfComponents(); j++) { - temp1 = 0; - //temp2 = 0; - // temp1 += - // Math.log(system.getPhases()[0].getComponents()[j].getFugacityCoefficient()); - // temp2 += - // Math.log(system.getPhases()[1].getComponents()[j].getFugacityCoefficient()); - for (int i = 0; i < system.getPhase(k).getNumberOfComponents(); i++) { - temp1 += system.getPhase(k).getComponents()[i].getdfugdn(j) - - system.getPhase(k).getComponents()[j].getdfugdn(i); - //temp2 += system.getPhases()[1].getComponents()[i].getdfugdn(j) - // - system.getPhases()[1].getComponents()[j].getdfugdn(i); + for (int j = 0; j < system.getPhase(k).getNumberOfComponents(); j++) { + temp1 = 0; + // temp2 = 0; + // temp1 += + // Math.log(system.getPhases()[0].getComponents()[j].getFugacityCoefficient()); + // temp2 += + // Math.log(system.getPhases()[1].getComponents()[j].getFugacityCoefficient()); + for (int i = 0; i < system.getPhase(k).getNumberOfComponents(); i++) { + temp1 += system.getPhase(k).getComponents()[i].getdfugdn(j) + - system.getPhase(k).getComponents()[j].getdfugdn(i); + // temp2 += system.getPhases()[1].getComponents()[i].getdfugdn(j) + // - system.getPhases()[1].getComponents()[j].getdfugdn(i); + } + // sum += Math.abs(temp1) + Math.abs(temp2); + // logger.info("test fugdn gas : " + j + " " + temp1); + // logger.info("test fugdn liq : " + j + " " + temp2); } - //sum += Math.abs(temp1) + Math.abs(temp2); - // logger.info("test fugdn gas : " + j + " " + temp1); - // logger.info("test fugdn liq : " + j + " " + temp2); + + // logger.info("Testing composition derivatives2 of fugacity + // coefficients..................."); + // logger.info("Diffference : " + sum); + // logger.info("Testing composition derivatives2 of fugacity + // coefficients..................."); + // logger.info("Difference : " + sum); } - - //logger.info("Testing composition derivatives2 of fugacity coefficients..................."); - //logger.info("Diffference : " + sum); - // logger.info("Testing composition derivatives2 of fugacity - // coefficients..................."); - // logger.info("Difference : " + sum); - } - sum += Math.abs(temp1) ; - logger.info("Testing composition derivatives2 of fugacity coefficients..................."); - logger.info("Diffference : " + sum); - return Math.abs(sum) < 1e-10; + sum += Math.abs(temp1); + logger.info("Testing composition derivatives2 of fugacity coefficients..................."); + logger.info("Diffference : " + sum); + return Math.abs(sum) < maxError; } /** @@ -222,7 +224,7 @@ public boolean checkFugacityCoefficientsDP() { // coefficients..................."); // logger.info("Error : " + sum); - return Math.abs(sum) < 1e-10; + return Math.abs(sum) < maxError; } /** @@ -255,7 +257,7 @@ public boolean checkFugacityCoefficientsDT() { // logger.info("Testing temperature derivatives of fugacity // coefficients..................."); // logger.info("Error : " + sum); - return Math.abs(sum) < 1e-10; + return Math.abs(sum) < maxError; } /** @@ -420,4 +422,15 @@ public boolean checkNumerically() { } return true; } + + /** + *

+ * + * @param maxErr Maximum error before test will report failed Set maximum allowed error in model + * check + *

+ */ + public void setMaxError(double maxErr) { + this.maxError = maxErr; + } } diff --git a/src/main/java/neqsim/thermo/system/SystemInterface.java b/src/main/java/neqsim/thermo/system/SystemInterface.java index 2a1bc5316..575a0a91f 100644 --- a/src/main/java/neqsim/thermo/system/SystemInterface.java +++ b/src/main/java/neqsim/thermo/system/SystemInterface.java @@ -652,6 +652,16 @@ public default boolean IsPhase(int i) { */ public PhaseInterface getPhase(String phaseTypeName); + /** + *

+ * getPhase. + *

+ * + * @param pt a {@link neqsim.thermo.phase.PhaseType} object + * @return a {@link neqsim.thermo.phase.PhaseInterface} object + */ + public PhaseInterface getPhase(PhaseType pt); + /** *

* getPhaseIndexOfPhase. diff --git a/src/main/java/neqsim/thermo/system/SystemThermo.java b/src/main/java/neqsim/thermo/system/SystemThermo.java index 5ea9987a6..d68d27387 100644 --- a/src/main/java/neqsim/thermo/system/SystemThermo.java +++ b/src/main/java/neqsim/thermo/system/SystemThermo.java @@ -2337,10 +2337,7 @@ public final PhaseInterface getPhase(int i) { return phaseArray[phaseIndex[i]]; } - /** {@inheritDoc} */ - @Override - public PhaseInterface getPhase(String phaseTypeName) { - PhaseType pt = PhaseType.byDesc(phaseTypeName); + public PhaseInterface getPhase(PhaseType pt) { if (!this.hasPhaseType(pt)) { throw new RuntimeException("Phase with phase type " + pt + " not found."); } @@ -2353,6 +2350,13 @@ public PhaseInterface getPhase(String phaseTypeName) { return null; } + /** {@inheritDoc} */ + @Override + public PhaseInterface getPhase(String phaseTypeName) { + PhaseType pt = PhaseType.byDesc(phaseTypeName); + return getPhase(pt); + } + /** {@inheritDoc} */ @Override public PhaseInterface getPhaseOfType(String phaseTypeName) { diff --git a/src/test/java/neqsim/thermo/system/SystemElectrolyteCPATest.java b/src/test/java/neqsim/thermo/system/SystemElectrolyteCPATest.java index a542a9113..df3558a0b 100644 --- a/src/test/java/neqsim/thermo/system/SystemElectrolyteCPATest.java +++ b/src/test/java/neqsim/thermo/system/SystemElectrolyteCPATest.java @@ -1,9 +1,12 @@ package neqsim.thermo.system; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import neqsim.thermo.phase.PhaseType; import neqsim.thermodynamicOperations.ThermodynamicOperations; /** @@ -15,56 +18,113 @@ * @version $Id: $Id * @since 2.2.3 */ -public class SystemElectrolyteCPATest extends neqsim.NeqSimTest{ - static SystemElectrolyteCPA thermoSystem; +public class SystemElectrolyteCPATest extends neqsim.NeqSimTest { + static SystemInterface thermoSystem; + static ThermodynamicOperations testOps; + static neqsim.thermo.ThermodynamicModelTest testModel = null; - /** - *

- * setUp. - *

- */ - @BeforeAll - public static void setUp() { - thermoSystem = new SystemElectrolyteCPA(298.15, 1.01325); - thermoSystem.addComponent("water", 1.0); - thermoSystem.addComponent("methane", 0.1); - thermoSystem.addComponent("Na+", 0.001); - thermoSystem.addComponent("Cl-", 0.001); - thermoSystem.setMixingRule(4); - } + /** + *

+ * setUp. + *

+ */ + @BeforeAll + public static void setUp() { + thermoSystem = new SystemElectrolyteCPAstatoil(298.15, 10.01325); + thermoSystem.addComponent("methane", 0.1); + thermoSystem.addComponent("water", 1.0); + thermoSystem.addComponent("Na+", 0.001); + thermoSystem.addComponent("Cl-", 0.001); + thermoSystem.setMixingRule(10); + testModel = new neqsim.thermo.ThermodynamicModelTest(thermoSystem); + testModel.setMaxError(1e-10); + testOps = new ThermodynamicOperations(thermoSystem); + testOps.TPflash(); + thermoSystem.initProperties(); + } - /** - *

- * tearDown. - *

- */ - @AfterAll - public static void tearDown() {} + /** + *

+ * tearDown. + *

+ */ + @AfterAll + public static void tearDown() {} - /** - *

- * testTPflash. - *

- */ - @Test - public void testTPflash() { - ThermodynamicOperations testOps = new ThermodynamicOperations(thermoSystem); - thermoSystem.init(0); - thermoSystem.initPhysicalProperties(); + /** + *

+ * testTPflash. + *

+ */ + @Test + public void testTPflash() { + assertEquals(2, thermoSystem.getNumberOfPhases()); + } - testOps.TPflash(); - assertEquals(2, thermoSystem.getNumberOfPhases()); - } + /** + *

+ * testinitPhysicalProperties. + *

+ */ + @Test + public void testDensity() { + assertEquals(6.594232943612613, thermoSystem.getPhase(PhaseType.GAS).getDensity("kg/m3"), 0.01); + assertEquals(996.5046667778549, thermoSystem.getPhase(PhaseType.AQUEOUS).getDensity("kg/m3"), + 0.01); + } - /** - *

- * testinitPhysicalProperties. - *

- */ - @Test - public void testinitPhysicalProperties() { - thermoSystem.initPhysicalProperties(); - assertEquals(thermoSystem.getPhase(0).getPhysicalProperties().getDensity(), - thermoSystem.getPhase(0).getPhysicalProperties().getDensity()); - } + /** + *

+ * testFugacityCoefficients. + *

+ */ + @Test + @DisplayName("test the fugacity coefficients calculated") + public void testFugacityCoefficients() { + assertTrue(testModel.checkFugacityCoefficients()); + } + + /** + *

+ * checkFugacityCoefficientsDP. + *

+ */ + @Test + @DisplayName("test derivative of fugacity coefficients with respect to pressure") + public void checkFugacityCoefficientsDP() { + assertTrue(testModel.checkFugacityCoefficientsDP()); + } + + /** + *

+ * checkFugacityCoefficientsDT. + *

+ */ + @Test + @DisplayName("test derivative of fugacity coefficients with respect to temperature") + public void checkFugacityCoefficientsDT() { + assertTrue(testModel.checkFugacityCoefficientsDT()); + } + + /** + *

+ * checkFugacityCoefficientsDn. + *

+ */ + @Test + @DisplayName("test derivative of fugacity coefficients with respect to composition") + public void checkFugacityCoefficientsDn() { + assertTrue(testModel.checkFugacityCoefficientsDn()); + } + + /** + *

+ * checkFugacityCoefficientsDn2. + *

+ */ + @Test + @DisplayName("test derivative of fugacity coefficients with respect to composition (2nd method)") + public void checkFugacityCoefficientsDn2() { + assertTrue(testModel.checkFugacityCoefficientsDn2()); + } } diff --git a/src/test/java/neqsim/thermo/system/SystemFurstElectrolyteEoS.java b/src/test/java/neqsim/thermo/system/SystemFurstElectrolyteEoS.java new file mode 100644 index 000000000..4e02403f8 --- /dev/null +++ b/src/test/java/neqsim/thermo/system/SystemFurstElectrolyteEoS.java @@ -0,0 +1,127 @@ +package neqsim.thermo.system; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import neqsim.thermodynamicOperations.ThermodynamicOperations; + +/** + *

+ * ElectrolyteCPAEosTest class. + *

+ * + * @author ESOL + * @version $Id: $Id + * @since 2.2.3 + */ +public class SystemFurstElectrolyteEoS extends neqsim.NeqSimTest { + static SystemInterface thermoSystem; + static ThermodynamicOperations testOps; + static neqsim.thermo.ThermodynamicModelTest testModel = null; + + /** + *

+ * setUp. + *

+ */ + @BeforeAll + public static void setUp() { + thermoSystem = new SystemFurstElectrolyteEos(298.15, 10.01325); + thermoSystem.addComponent("methane", 0.1); + thermoSystem.addComponent("water", 1.0); + thermoSystem.addComponent("Na+", 0.001); + thermoSystem.addComponent("Cl-", 0.001); + thermoSystem.setMixingRule(4); + testModel = new neqsim.thermo.ThermodynamicModelTest(thermoSystem); + testOps = new ThermodynamicOperations(thermoSystem); + testOps.TPflash(); + thermoSystem.initProperties(); + } + + /** + *

+ * tearDown. + *

+ */ + @AfterAll + public static void tearDown() {} + + /** + *

+ * testTPflash. + *

+ */ + @Test + public void testTPflash() { + assertEquals(2, thermoSystem.getNumberOfPhases()); + } + + /** + *

+ * testinitPhysicalProperties. + *

+ */ + @Test + public void testinitPhysicalProperties() { + assertEquals(thermoSystem.getPhase(0).getPhysicalProperties().getDensity(), + thermoSystem.getPhase(0).getPhysicalProperties().getDensity()); + } + + /** + *

+ * testFugacityCoefficients. + *

+ */ + @Test + @DisplayName("test the fugacity coefficients calculated") + public void testFugacityCoefficients() { + assertTrue(testModel.checkFugacityCoefficients()); + } + + /** + *

+ * checkFugacityCoefficientsDP. + *

+ */ + @Test + @DisplayName("test derivative of fugacity coefficients with respect to pressure") + public void checkFugacityCoefficientsDP() { + assertTrue(testModel.checkFugacityCoefficientsDP()); + } + + /** + *

+ * checkFugacityCoefficientsDT. + *

+ */ + @Test + @DisplayName("test derivative of fugacity coefficients with respect to temperature") + public void checkFugacityCoefficientsDT() { + assertTrue(testModel.checkFugacityCoefficientsDT()); + } + + /** + *

+ * checkFugacityCoefficientsDn. + *

+ */ + @Test + @DisplayName("test derivative of fugacity coefficients with respect to composition") + public void checkFugacityCoefficientsDn() { + assertTrue(testModel.checkFugacityCoefficientsDn()); + } + + /** + *

+ * checkFugacityCoefficientsDn2. + *

+ */ + @Test + @DisplayName("test derivative of fugacity coefficients with respect to composition (2nd method)") + public void checkFugacityCoefficientsDn2() { + assertTrue(testModel.checkFugacityCoefficientsDn2()); + } +}