From 2c851bdc1d8497ea392aa37500509799aa91d63c Mon Sep 17 00:00:00 2001 From: Even Solbraa <41290109+EvenSol@users.noreply.github.com> Date: Thu, 27 Jul 2023 13:44:22 +0200 Subject: [PATCH] update mechanical design simulations (#788) * update mechanical design simulations * updated test * simplify object structure of prosess design and cost * update doc * fix bug * update --- .../costEstimation/CostEstimateBaseClass.java | 33 +-- .../SystemMechanicalDesign.java | 27 ++- .../pipeline/PipelineMechanicalDesign.java | 22 +- .../valve/ValveMechanicalDesign.java | 1 + .../ProcessEquipmentBaseClass.java | 4 + .../ProcessEquipmentInterface.java | 9 + .../distillation/DistillationColumn.java | 3 +- .../processEquipment/manifold/Manifold.java | 5 +- .../processEquipment/pipeline/Pipeline.java | 10 +- .../processEquipment/separator/Separator.java | 9 +- .../valve/ThrottlingValve.java | 18 ++ .../processSystem/ProcessSystem.java | 43 ---- .../processModules/SeparationTrainModule.java | 25 ++- .../SeparationTrainModuleSimple.java | 22 +- .../SystemMechanicalDesignTest.java | 200 ++++++++++++++++++ .../util/example/OffshoreProcess3.java | 2 +- .../util/example/simpleGasScrubber.java | 74 +++---- .../util/example/testGasScrubber.java | 6 +- 18 files changed, 376 insertions(+), 137 deletions(-) create mode 100644 src/test/java/neqsim/processSimulation/mechanicalDesign/SystemMechanicalDesignTest.java diff --git a/src/main/java/neqsim/processSimulation/costEstimation/CostEstimateBaseClass.java b/src/main/java/neqsim/processSimulation/costEstimation/CostEstimateBaseClass.java index 576a35c16..5d93ac38a 100644 --- a/src/main/java/neqsim/processSimulation/costEstimation/CostEstimateBaseClass.java +++ b/src/main/java/neqsim/processSimulation/costEstimation/CostEstimateBaseClass.java @@ -4,8 +4,8 @@ import java.util.Objects; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import neqsim.processSimulation.mechanicalDesign.SystemMechanicalDesign; import neqsim.processSimulation.processEquipment.ProcessEquipmentInterface; -import neqsim.processSimulation.processSystem.ProcessSystem; /** *

@@ -19,7 +19,7 @@ public class CostEstimateBaseClass implements java.io.Serializable { private static final long serialVersionUID = 1000; static Logger logger = LogManager.getLogger(CostEstimateBaseClass.class); - private ProcessSystem processSystem; + private SystemMechanicalDesign processdesign; private double CAPEXperWeight = 1000.0; // KNOK/tones /** @@ -27,20 +27,23 @@ public class CostEstimateBaseClass implements java.io.Serializable { * Constructor for CostEstimateBaseClass. *

* - * @param process a {@link neqsim.processSimulation.processSystem.ProcessSystem} object + * @param processdesign a {@link neqsim.processSimulation.mechanicalDesign.SystemMechanicalDesign} + * object */ - public CostEstimateBaseClass(ProcessSystem process) { - this.processSystem = process; + public CostEstimateBaseClass(SystemMechanicalDesign processdesign) { + this.processdesign = processdesign; } /** - *

Constructor for CostEstimateBaseClass.

+ *

+ * Constructor for CostEstimateBaseClass. + *

* - * @param process input process + * @param processdesign a {@link neqsim.processSimulation.mechanicalDesign.SystemMechanicalDesign} * @param costFactor cost factor */ - public CostEstimateBaseClass(ProcessSystem process, double costFactor) { - this(process); + public CostEstimateBaseClass(SystemMechanicalDesign processdesign, double costFactor) { + this(processdesign); this.CAPEXperWeight = costFactor; } @@ -52,7 +55,7 @@ public CostEstimateBaseClass(ProcessSystem process, double costFactor) { * @return a double */ public double getWeightBasedCAPEXEstimate() { - return this.processSystem.getSystemMechanicalDesign().getTotalWeight() * CAPEXperWeight; + return this.processdesign.getTotalWeight() * CAPEXperWeight; } /** @@ -64,12 +67,14 @@ public double getWeightBasedCAPEXEstimate() { */ public double getCAPEXestimate() { double cost = 0; - ArrayList names = this.processSystem.getAllUnitNames(); + ArrayList names = processdesign.getProcess().getAllUnitNames(); for (int i = 0; i < names.size(); i++) { try { - if (!((ProcessEquipmentInterface) this.processSystem.getUnit(names.get(i)) == null)) { - cost += ((ProcessEquipmentInterface) this.processSystem.getUnit(names.get(i))) - .getMechanicalDesign().getCostEstimate().getTotaltCost(); + if (!((ProcessEquipmentInterface) this.processdesign.getProcess() + .getUnit(names.get(i)) == null)) { + cost += + ((ProcessEquipmentInterface) this.processdesign.getProcess().getUnit(names.get(i))) + .getMechanicalDesign().getCostEstimate().getTotaltCost(); } } catch (Exception ex) { logger.error(ex.getMessage(), ex); diff --git a/src/main/java/neqsim/processSimulation/mechanicalDesign/SystemMechanicalDesign.java b/src/main/java/neqsim/processSimulation/mechanicalDesign/SystemMechanicalDesign.java index e8b170438..54d67fd3d 100644 --- a/src/main/java/neqsim/processSimulation/mechanicalDesign/SystemMechanicalDesign.java +++ b/src/main/java/neqsim/processSimulation/mechanicalDesign/SystemMechanicalDesign.java @@ -36,6 +36,10 @@ public SystemMechanicalDesign(ProcessSystem processSystem) { this.processSystem = processSystem; } + public ProcessSystem getProcess() { + return processSystem; + } + /** *

* setCompanySpecificDesignStandards. @@ -45,7 +49,7 @@ public SystemMechanicalDesign(ProcessSystem processSystem) { */ public void setCompanySpecificDesignStandards(String name) { for (int i = 0; i < this.processSystem.getUnitOperations().size(); i++) { - this.processSystem.getUnitOperations().get(i).getMechanicalDesign() + this.getProcess().getUnitOperations().get(i).getMechanicalDesign() .setCompanySpecificDesignStandards(name); } } @@ -60,6 +64,8 @@ public void runDesignCalculation() { for (int i = 0; i < names.size(); i++) { try { if (!((ProcessEquipmentInterface) this.processSystem.getUnit(names.get(i)) == null)) { + ((ProcessEquipmentInterface) this.processSystem.getUnit(names.get(i))) + .initMechanicalDesign(); ((ProcessEquipmentInterface) this.processSystem.getUnit(names.get(i))) .getMechanicalDesign().calcDesign(); totalPlotSpace += ((ProcessEquipmentInterface) this.processSystem.getUnit(names.get(i))) @@ -133,6 +139,25 @@ public int getTotalNumberOfModules() { return numberOfModules; } + /** + *

+ * getMechanicalWeight. + *

+ * + * @param unit a {@link java.lang.String} object + * @return a double + */ + public double getMechanicalWeight(String unit) { + double weight = 0.0; + for (int i = 0; i < processSystem.getUnitOperations().size(); i++) { + processSystem.getUnitOperations().get(i).getMechanicalDesign().calcDesign(); + System.out.println("Name " + processSystem.getUnitOperations().get(i).getName() + " weight " + + processSystem.getUnitOperations().get(i).getMechanicalDesign().getWeightTotal()); + weight += processSystem.getUnitOperations().get(i).getMechanicalDesign().getWeightTotal(); + } + return weight; + } + /** {@inheritDoc} */ @Override public int hashCode() { diff --git a/src/main/java/neqsim/processSimulation/mechanicalDesign/pipeline/PipelineMechanicalDesign.java b/src/main/java/neqsim/processSimulation/mechanicalDesign/pipeline/PipelineMechanicalDesign.java index 2be8af57d..e648a8ff0 100644 --- a/src/main/java/neqsim/processSimulation/mechanicalDesign/pipeline/PipelineMechanicalDesign.java +++ b/src/main/java/neqsim/processSimulation/mechanicalDesign/pipeline/PipelineMechanicalDesign.java @@ -66,17 +66,11 @@ public void calcDesign() { // ASME/ANSI Code B31.8 if (designStandardCode.equals("ANSI/ASME Standard B31.8")) { - wallThickness = ((AdiabaticPipe) getProcessEquipment()).getMechanicalDesign() - .getMaxOperationPressure() * innerDiameter - / (2.0 - * ((AdiabaticPipe) getProcessEquipment()).getMechanicalDesign() - .getMaterialPipeDesignStandard().getDesignFactor() - * ((AdiabaticPipe) getProcessEquipment()).getMechanicalDesign() - .getMaterialPipeDesignStandard().getEfactor() - * ((AdiabaticPipe) getProcessEquipment()).getMechanicalDesign() - .getMaterialPipeDesignStandard().getTemperatureDeratingFactor() - * ((AdiabaticPipe) getProcessEquipment()).getMechanicalDesign() - .getMaterialPipeDesignStandard().getMinimumYeildStrength()); + wallThickness = getMaxOperationPressure() * innerDiameter + / (2.0 * getMaterialPipeDesignStandard().getDesignFactor() + * getMaterialPipeDesignStandard().getEfactor() + * getMaterialPipeDesignStandard().getTemperatureDeratingFactor() + * getMaterialPipeDesignStandard().getMinimumYeildStrength()); } else if (designStandardCode.equals("ANSI/ASME Standard B31.3")) { wallThickness = 0.0001; // to be implemented // ((AdiabaticPipe) @@ -128,9 +122,9 @@ public static void main(String args[]) { operations.add(stream_1); operations.add(pipe); - operations.getSystemMechanicalDesign().setCompanySpecificDesignStandards("Statoil"); - operations.getSystemMechanicalDesign().runDesignCalculation(); - operations.getSystemMechanicalDesign().setDesign(); + // operations.getSystemMechanicalDesign().setCompanySpecificDesignStandards("Statoil"); + // operations.getSystemMechanicalDesign().runDesignCalculation(); + // operations.getSystemMechanicalDesign().setDesign(); operations.run(); } } diff --git a/src/main/java/neqsim/processSimulation/mechanicalDesign/valve/ValveMechanicalDesign.java b/src/main/java/neqsim/processSimulation/mechanicalDesign/valve/ValveMechanicalDesign.java index 66c173711..248bdb2b2 100644 --- a/src/main/java/neqsim/processSimulation/mechanicalDesign/valve/ValveMechanicalDesign.java +++ b/src/main/java/neqsim/processSimulation/mechanicalDesign/valve/ValveMechanicalDesign.java @@ -68,6 +68,7 @@ public void calcDesign() { valveCvMax = valve1.getThermoSystem().getVolume("m3/hr") * Math.sqrt(valve1.getThermoSystem().getDensity("kg/m3") / 1000.0 / dP); valveWeight = valveCvMax * 100.0; + setWeightTotal(valveWeight); } /** {@inheritDoc} */ diff --git a/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentBaseClass.java b/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentBaseClass.java index 404d287a4..8ceaacab5 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentBaseClass.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentBaseClass.java @@ -119,6 +119,10 @@ public MechanicalDesign getMechanicalDesign() { return new MechanicalDesign(this); } + /** {@inheritDoc} */ + @Override + public void initMechanicalDesign() {} + /** {@inheritDoc} */ @Override public String getSpecification() { diff --git a/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentInterface.java b/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentInterface.java index f7e2860ab..fc1507259 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentInterface.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/ProcessEquipmentInterface.java @@ -23,6 +23,15 @@ public interface ProcessEquipmentInterface extends SimulationInterface { */ public String[][] reportResults(); + /** + *

+ * Get a initMechanicalDesign for the equipment. + *

+ **/ + default void initMechanicalDesign() { + + } + /** *

* Get a mechanicalDesign for the equipment. diff --git a/src/main/java/neqsim/processSimulation/processEquipment/distillation/DistillationColumn.java b/src/main/java/neqsim/processSimulation/processEquipment/distillation/DistillationColumn.java index 1334c660a..988d860b8 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/distillation/DistillationColumn.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/distillation/DistillationColumn.java @@ -400,7 +400,8 @@ public void displayResult() { *

* component componentMassBalanceCheck. *

- * + * + * @param componentName component name to heck mass balance for * @return a boolean */ public boolean componentMassBalanceCheck(String componentName) { diff --git a/src/main/java/neqsim/processSimulation/processEquipment/manifold/Manifold.java b/src/main/java/neqsim/processSimulation/processEquipment/manifold/Manifold.java index e9981d04e..5779920dc 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/manifold/Manifold.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/manifold/Manifold.java @@ -40,6 +40,8 @@ public Manifold() { *

* Constructor for Splitter with name as input. *

+ * + * @param name name of manifold */ public Manifold(String name) { super(name); @@ -72,7 +74,8 @@ public StreamInterface getSplitStream(int i) { *

* getMixedStream. *

- * + * + * @return a {@link neqsim.processSimulation.processEquipment.stream.StreamInterface} **/ public StreamInterface getMixedStream() { return localmixer.getOutletStream(); diff --git a/src/main/java/neqsim/processSimulation/processEquipment/pipeline/Pipeline.java b/src/main/java/neqsim/processSimulation/processEquipment/pipeline/Pipeline.java index 0a0b337f7..47152a99d 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/pipeline/Pipeline.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/pipeline/Pipeline.java @@ -46,6 +46,8 @@ public class Pipeline extends TwoPortEquipment implements PipeLineInterface { double[] outerHeatTransferCoeffs = {1e-5, 1e-5}; // , 1e-5, 1e-5, 1e-5}; double[] wallHeatTransferCoeffs = {1e-5, 1e-5}; // , 1e-5, 1e-5, 1e-5}; + PipelineMechanicalDesign pipelineMechanicalDesign = null; + /** *

* Constructor for Pipeline. @@ -93,6 +95,12 @@ public Pipeline(String name, StreamInterface inStream) { super(name, inStream); } + @Override + public void initMechanicalDesign() { + pipelineMechanicalDesign = new PipelineMechanicalDesign(this); + } + + /** * {@inheritDoc} * @@ -101,7 +109,7 @@ public Pipeline(String name, StreamInterface inStream) { */ @Override public PipelineMechanicalDesign getMechanicalDesign() { - return new PipelineMechanicalDesign(this); + return pipelineMechanicalDesign; } /** {@inheritDoc} */ diff --git a/src/main/java/neqsim/processSimulation/processEquipment/separator/Separator.java b/src/main/java/neqsim/processSimulation/processEquipment/separator/Separator.java index 422cbde23..e3ababd76 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/separator/Separator.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/separator/Separator.java @@ -68,6 +68,8 @@ public class Separator extends ProcessEquipmentBaseClass implements SeparatorInt private double designLiquidLevelFraction = 0.8; ArrayList separatorSection = new ArrayList(); + SeparatorMechanicalDesign separatorMechanicalDesign; + /** * Constructor for Separator. */ @@ -118,7 +120,12 @@ public Separator(String name, StreamInterface inletStream) { */ @Override public SeparatorMechanicalDesign getMechanicalDesign() { - return new SeparatorMechanicalDesign(this); + return separatorMechanicalDesign; + } + + @Override + public void initMechanicalDesign() { + separatorMechanicalDesign = new SeparatorMechanicalDesign(this); } /** diff --git a/src/main/java/neqsim/processSimulation/processEquipment/valve/ThrottlingValve.java b/src/main/java/neqsim/processSimulation/processEquipment/valve/ThrottlingValve.java index 6ceff707c..6fd0fae3b 100644 --- a/src/main/java/neqsim/processSimulation/processEquipment/valve/ThrottlingValve.java +++ b/src/main/java/neqsim/processSimulation/processEquipment/valve/ThrottlingValve.java @@ -1,6 +1,7 @@ package neqsim.processSimulation.processEquipment.valve; import java.util.UUID; +import neqsim.processSimulation.mechanicalDesign.valve.ValveMechanicalDesign; import neqsim.processSimulation.processEquipment.TwoPortEquipment; import neqsim.processSimulation.processEquipment.stream.StreamInterface; import neqsim.thermo.system.SystemInterface; @@ -31,6 +32,7 @@ public class ThrottlingValve extends TwoPortEquipment implements ValveInterface double molarFlow = 0.0; private String pressureUnit = "bara"; private boolean acceptNegativeDP = true; + ValveMechanicalDesign valveMechanicalDesign; /** *

@@ -430,4 +432,20 @@ public boolean isAcceptNegativeDP() { public void setAcceptNegativeDP(boolean acceptNegativeDP) { this.acceptNegativeDP = acceptNegativeDP; } + + @Override + public void initMechanicalDesign() { + valveMechanicalDesign = new ValveMechanicalDesign(this); + } + + + /** + * {@inheritDoc} + * + * @return a {@link neqsim.processSimulation.mechanicalDesign.valve.ValveMechanicalDesign} object + */ + @Override + public ValveMechanicalDesign getMechanicalDesign() { + return valveMechanicalDesign; + } } diff --git a/src/main/java/neqsim/processSimulation/processSystem/ProcessSystem.java b/src/main/java/neqsim/processSimulation/processSystem/ProcessSystem.java index 22f009503..2f3cc2bce 100644 --- a/src/main/java/neqsim/processSimulation/processSystem/ProcessSystem.java +++ b/src/main/java/neqsim/processSimulation/processSystem/ProcessSystem.java @@ -13,9 +13,7 @@ import org.apache.logging.log4j.Logger; import neqsim.processSimulation.SimulationBaseClass; import neqsim.processSimulation.conditionMonitor.ConditionMonitor; -import neqsim.processSimulation.costEstimation.CostEstimateBaseClass; import neqsim.processSimulation.measurementDevice.MeasurementDeviceInterface; -import neqsim.processSimulation.mechanicalDesign.SystemMechanicalDesign; import neqsim.processSimulation.processEquipment.ProcessEquipmentBaseClass; import neqsim.processSimulation.processEquipment.ProcessEquipmentInterface; import neqsim.processSimulation.processEquipment.util.Recycle; @@ -714,28 +712,6 @@ public void setName(String name) { this.name = name; } - /** - *

- * Get a SystemMechanicalDesign object from processSystem. - *

- * - * @return a new SystemMechanicalDesign object - */ - public SystemMechanicalDesign getSystemMechanicalDesign() { - return new SystemMechanicalDesign(this); - } - - /** - *

- * Get a CostEstimateBaseClass object from processSystem. - *

- * - * @return a new CostEstimateBaseClass object - */ - public CostEstimateBaseClass getCostEstimator() { - return new CostEstimateBaseClass(this); - } - /** *

* getEntropyProduction. @@ -840,25 +816,6 @@ public double getHeaterDuty(String unit) { return heat; } - /** - *

- * getMechanicalWeight. - *

- * - * @param unit a {@link java.lang.String} object - * @return a double - */ - public double getMechanicalWeight(String unit) { - double weight = 0.0; - for (int i = 0; i < unitOperations.size(); i++) { - unitOperations.get(i).getMechanicalDesign().calcDesign(); - System.out.println("Name " + unitOperations.get(i).getName() + " weight " - + unitOperations.get(i).getMechanicalDesign().getWeightTotal()); - weight += unitOperations.get(i).getMechanicalDesign().getWeightTotal(); - } - return weight; - } - /** *

* Getter for the field surroundingTemperature. diff --git a/src/main/java/neqsim/processSimulation/processSystem/processModules/SeparationTrainModule.java b/src/main/java/neqsim/processSimulation/processSystem/processModules/SeparationTrainModule.java index 22734e141..5ff7a2884 100644 --- a/src/main/java/neqsim/processSimulation/processSystem/processModules/SeparationTrainModule.java +++ b/src/main/java/neqsim/processSimulation/processSystem/processModules/SeparationTrainModule.java @@ -42,7 +42,9 @@ public class SeparationTrainModule extends ProcessModuleBaseClass { double exportOilTemperature = 273.15 + 30; /** - *

Constructor for SeparationTrainModule.

+ *

+ * Constructor for SeparationTrainModule. + *

* * @param name a {@link java.lang.String} object */ @@ -303,16 +305,17 @@ public static void main(String[] args) { ((ProcessEquipmentInterface) separationModule.getOperations().getUnit("2nd stage recompressor")) .getMechanicalDesign().displayResults(); - operations.getSystemMechanicalDesign().runDesignCalculation(); - operations.getSystemMechanicalDesign().getTotalPlotSpace(); - System.out.println("Modules " + operations.getSystemMechanicalDesign().getTotalVolume()); - - System.out - .println("Modules " + operations.getSystemMechanicalDesign().getTotalNumberOfModules()); - System.out.println("Weight " + operations.getSystemMechanicalDesign().getTotalWeight()); - System.out.println("Plot space " + operations.getSystemMechanicalDesign().getTotalPlotSpace()); - System.out.println("CAPEX " + operations.getCostEstimator().getWeightBasedCAPEXEstimate()); - System.out.println("CAPEX " + operations.getCostEstimator().getCAPEXestimate()); + // operations.getSystemMechanicalDesign().runDesignCalculation(); + // operations.getSystemMechanicalDesign().getTotalPlotSpace(); + // System.out.println("Modules " + operations.getSystemMechanicalDesign().getTotalVolume()); + + // System.out + // .println("Modules " + operations.getSystemMechanicalDesign().getTotalNumberOfModules()); + // System.out.println("Weight " + operations.getSystemMechanicalDesign().getTotalWeight()); + // System.out.println("Plot space " + + // operations.getSystemMechanicalDesign().getTotalPlotSpace()); + // System.out.println("CAPEX " + operations.getCostEstimator().getWeightBasedCAPEXEstimate()); + // System.out.println("CAPEX " + operations.getCostEstimator().getCAPEXestimate()); /* * separationModule.getOutputStream("Inlet separator").displayResult(); diff --git a/src/main/java/neqsim/processSimulation/processSystem/processModules/SeparationTrainModuleSimple.java b/src/main/java/neqsim/processSimulation/processSystem/processModules/SeparationTrainModuleSimple.java index 8c8e08269..40e159496 100644 --- a/src/main/java/neqsim/processSimulation/processSystem/processModules/SeparationTrainModuleSimple.java +++ b/src/main/java/neqsim/processSimulation/processSystem/processModules/SeparationTrainModuleSimple.java @@ -40,7 +40,9 @@ public class SeparationTrainModuleSimple extends ProcessModuleBaseClass { double exportOilTemperature = 273.15 + 30; /** - *

Constructor for SeparationTrainModuleSimple.

+ *

+ * Constructor for SeparationTrainModuleSimple. + *

* * @param name a {@link java.lang.String} object */ @@ -299,16 +301,16 @@ public static void main(String[] args) { ((ProcessEquipmentInterface) separationModule.getOperations().getUnit("2nd stage recompressor")) .getMechanicalDesign().displayResults(); - operations.getSystemMechanicalDesign().runDesignCalculation(); - operations.getSystemMechanicalDesign().getTotalPlotSpace(); - System.out.println("Modules " + operations.getSystemMechanicalDesign().getTotalVolume()); + //operations.getSystemMechanicalDesign().runDesignCalculation(); + //operations.getSystemMechanicalDesign().getTotalPlotSpace(); + //System.out.println("Modules " + operations.getSystemMechanicalDesign().getTotalVolume()); - System.out - .println("Modules " + operations.getSystemMechanicalDesign().getTotalNumberOfModules()); - System.out.println("Weight " + operations.getSystemMechanicalDesign().getTotalWeight()); - System.out.println("Plot space " + operations.getSystemMechanicalDesign().getTotalPlotSpace()); - System.out.println("CAPEX " + operations.getCostEstimator().getWeightBasedCAPEXEstimate()); - System.out.println("CAPEX " + operations.getCostEstimator().getCAPEXestimate()); + //System.out + // .println("Modules " + operations.getSystemMechanicalDesign().getTotalNumberOfModules()); + //System.out.println("Weight " + operations.getSystemMechanicalDesign().getTotalWeight()); + //System.out.println("Plot space " + operations.getSystemMechanicalDesign().getTotalPlotSpace()); + //System.out.println("CAPEX " + operations.getCostEstimator().getWeightBasedCAPEXEstimate()); + //System.out.println("CAPEX " + operations.getCostEstimator().getCAPEXestimate()); /* * separationModule.getOutputStream("Inlet separator").displayResult(); diff --git a/src/test/java/neqsim/processSimulation/mechanicalDesign/SystemMechanicalDesignTest.java b/src/test/java/neqsim/processSimulation/mechanicalDesign/SystemMechanicalDesignTest.java new file mode 100644 index 000000000..e26e9228f --- /dev/null +++ b/src/test/java/neqsim/processSimulation/mechanicalDesign/SystemMechanicalDesignTest.java @@ -0,0 +1,200 @@ +package neqsim.processSimulation.mechanicalDesign; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import neqsim.processSimulation.costEstimation.CostEstimateBaseClass; +import neqsim.processSimulation.mechanicalDesign.pipeline.PipelineMechanicalDesign; +import neqsim.processSimulation.mechanicalDesign.separator.SeparatorMechanicalDesign; +import neqsim.processSimulation.mechanicalDesign.valve.ValveMechanicalDesign; +import neqsim.processSimulation.processEquipment.heatExchanger.Heater; +import neqsim.processSimulation.processEquipment.pipeline.AdiabaticPipe; +import neqsim.processSimulation.processEquipment.pump.Pump; +import neqsim.processSimulation.processEquipment.separator.Separator; +import neqsim.processSimulation.processEquipment.stream.Stream; +import neqsim.processSimulation.processEquipment.stream.StreamInterface; +import neqsim.processSimulation.processEquipment.util.Recycle; +import neqsim.processSimulation.processEquipment.valve.ThrottlingValve; +import neqsim.thermo.system.SystemInterface; +import neqsim.thermo.system.SystemSrkEos; + +public class SystemMechanicalDesignTest { + static neqsim.processSimulation.processSystem.ProcessSystem operations; + + @BeforeAll + static void createProcess() { + SystemInterface thermoSystem = new SystemSrkEos(298.0, 10.0); + thermoSystem.addComponent("water", 51.0); + thermoSystem.addComponent("nitrogen", 51.0); + thermoSystem.addComponent("CO2", 51.0); + thermoSystem.addComponent("methane", 51.0); + thermoSystem.addComponent("ethane", 51.0); + thermoSystem.addComponent("propane", 51.0); + thermoSystem.addComponent("i-butane", 51.0); + thermoSystem.addComponent("n-butane", 51.0); + thermoSystem.addComponent("iC5", 51.0); + thermoSystem.addComponent("nC5", 1.0); + + thermoSystem.addTBPfraction("C6", 1.0, 86.0 / 1000.0, 0.66); + thermoSystem.addTBPfraction("C7", 1.0, 91.0 / 1000.0, 0.74); + thermoSystem.addTBPfraction("C8", 1.0, 103.0 / 1000.0, 0.77); + thermoSystem.addTBPfraction("C9", 1.0, 117.0 / 1000.0, 0.79); + thermoSystem.addPlusFraction("C10_C12", 1.0, 145.0 / 1000.0, 0.80); + thermoSystem.addPlusFraction("C13_C14", 1.0, 181.0 / 1000.0, 0.8279); + thermoSystem.addPlusFraction("C15_C16", 1.0, 212.0 / 1000.0, 0.837); + thermoSystem.addPlusFraction("C17_C19", 1.0, 248.0 / 1000.0, 0.849); + thermoSystem.addPlusFraction("C20_C22", 1.0, 289.0 / 1000.0, 0.863); + thermoSystem.addPlusFraction("C23_C25", 1.0, 330.0 / 1000.0, 0.875); + thermoSystem.addPlusFraction("C26_C30", 1.0, 387.0 / 1000.0, 0.88); + thermoSystem.addPlusFraction("C31_C38", 1.0, 471.0 / 1000.0, 0.90); + thermoSystem.addPlusFraction("C38_C80", 1.0, 662.0 / 1000.0, 0.92); + thermoSystem.setMixingRule("classic"); + thermoSystem.setMultiPhaseCheck(true); + thermoSystem.setMolarComposition(new double[] {0.034266, 0.005269, 0.039189, 0.700553, 0.091154, + 0.050908, 0.007751, 0.014665, 0.004249, 0.004878, 0.004541, 0.007189, 0.006904, 0.004355, + 0.007658, 0.003861, 0.003301, 0.002624, 0.001857, 0.001320, 0.001426, 0.001164, 0.000916}); + // thermoSystem.prettyPrint(); + + Stream feedStream = new Stream("feed stream", thermoSystem); + feedStream.setFlowRate(604094, "kg/hr"); + feedStream.setTemperature(25.5, "C"); + feedStream.setPressure(26.0, "bara"); + + neqsim.processSimulation.processEquipment.separator.ThreePhaseSeparator seprator1stStage = + new neqsim.processSimulation.processEquipment.separator.ThreePhaseSeparator( + "1st stage separator", feedStream); + + ThrottlingValve valve1 = new ThrottlingValve("valve1", seprator1stStage.getLiquidOutStream()); + valve1.setOutletPressure(19.0); + + Heater oilHeater = new Heater("oil heater", valve1.getOutletStream()); + oilHeater.setOutTemperature(359.0); + + neqsim.processSimulation.processEquipment.separator.ThreePhaseSeparator seprator2ndStage = + new neqsim.processSimulation.processEquipment.separator.ThreePhaseSeparator( + "2nd stage separator", oilHeater.getOutletStream()); + + ThrottlingValve valve2 = new ThrottlingValve("valve2", seprator2ndStage.getLiquidOutStream()); + valve2.setOutletPressure(2.7); + + StreamInterface recircstream1 = valve2.getOutletStream().clone(); + recircstream1.setName("oilRecirc1"); + recircstream1.setFlowRate(1e-6, "kg/hr"); + + neqsim.processSimulation.processEquipment.separator.ThreePhaseSeparator seprator3rdStage = + new neqsim.processSimulation.processEquipment.separator.ThreePhaseSeparator( + "3rd stage separator"); + seprator3rdStage.addStream(valve2.getOutletStream()); + seprator3rdStage.addStream(recircstream1); + + ThrottlingValve pipeloss1st = + new ThrottlingValve("pipeloss1st", seprator3rdStage.getGasOutStream()); + pipeloss1st.setOutletPressure(2.7 - 0.03); + + Heater coolerLP = new Heater("cooler LP", pipeloss1st.getOutletStream()); + coolerLP.setOutTemperature(273.15 + 25.0); + + Separator sepregenGas = new Separator("sepregenGas", coolerLP.getOutletStream()); + + Pump oil1pump = new Pump("oil1pump", sepregenGas.getLiquidOutStream()); + oil1pump.setOutletPressure(19.); + + ThrottlingValve valveLP1 = new ThrottlingValve("valvseLP1", oil1pump.getOutletStream()); + valveLP1.setOutletPressure(2.7); + + Recycle recycle1 = new Recycle("oil recirc 1"); + recycle1.addStream(valveLP1.getOutletStream()); + recycle1.setOutletStream(recircstream1); + + operations = new neqsim.processSimulation.processSystem.ProcessSystem(); + operations.add(feedStream); + operations.add(seprator1stStage); + operations.add(valve1); + operations.add(oilHeater); + operations.add(seprator2ndStage); + operations.add(valve2); + operations.add(recircstream1); + operations.add(seprator3rdStage); + operations.add(pipeloss1st); + operations.add(coolerLP); + operations.add(sepregenGas); + operations.add(oil1pump); + operations.add(valveLP1); + operations.add(recycle1); + + operations.run(); + } + + @Test + void testRunDesignCalculationforProcess() { + // Test to run desgn calculation for a full process using the + // SystemMechanicalDesign class + SystemMechanicalDesign mecDesign = new SystemMechanicalDesign(operations); + mecDesign.runDesignCalculation(); + + System.out.println("total process weight " + mecDesign.getTotalWeight() + " kg"); + System.out.println("total process volume " + mecDesign.getTotalVolume() + " m3"); + System.out.println("total plot space " + mecDesign.getTotalPlotSpace() + " m2"); + System.out.println("separator inner diameter " + + ((Separator) operations.getUnit("sepregenGas")).getMechanicalDesign().innerDiameter); + System.out.println("valve weight " + + ((ThrottlingValve) operations.getUnit("valve1")).getMechanicalDesign().getWeightTotal()); + } + + @Test + void testRunDesignCalculationforSeparator() { + // Test to run design calculation for a process unit (separator using the + // SeparatorMechanicalDesign class) + SeparatorMechanicalDesign sepMechDesign = + new SeparatorMechanicalDesign((Separator) operations.getUnit("sepregenGas")); + sepMechDesign.calcDesign(); + System.out.println("separator inner diameter " + sepMechDesign.innerDiameter); + System.out.println("separator weight vessel shell " + sepMechDesign.weigthVesselShell); + System.out.println("separator weight structual steel " + sepMechDesign.weightStructualSteel); + } + + @Test + void testRunDesignCalculationforValve() { + ValveMechanicalDesign valve1MechDesign = + new ValveMechanicalDesign((ThrottlingValve) operations.getUnit("valve1")); + valve1MechDesign.calcDesign(); + System.out.println("valve total weight " + valve1MechDesign.getWeightTotal()); + } + + @Test + void testRunDesignForPipeline() { + + AdiabaticPipe pipe = new AdiabaticPipe("pipe1", + ((neqsim.processSimulation.processEquipment.separator.ThreePhaseSeparator) operations + .getUnit("1st stage separator")).getGasOutStream()); + pipe.setDiameter(1.0); + pipe.setLength(1000.0); + pipe.setPipeWallRoughness(10e-6); + pipe.setInletElevation(0.0); + pipe.setOutletElevation(20.0); + + pipe.run(); + + System.out.println("out pressure " + pipe.getOutletStream().getPressure("bara")); + + PipelineMechanicalDesign pipeMechDesign = new PipelineMechanicalDesign(pipe); + pipeMechDesign.setMaxOperationPressure(100.0); + pipeMechDesign.setMaxOperationTemperature(273.155 + 60.0); + pipeMechDesign.setMinOperationPressure(50.0); + pipeMechDesign.setMaxDesignGassVolumeFlow(100.0); + pipeMechDesign.setCompanySpecificDesignStandards("Statoil"); + pipeMechDesign.calcDesign(); + + System.out.println("wall thickness " + pipeMechDesign.getWallThickness()); + } + + @Test + void testCostEstimateProcess() { + SystemMechanicalDesign mecDesign = new SystemMechanicalDesign(operations); + mecDesign.runDesignCalculation(); + + CostEstimateBaseClass costEst = new CostEstimateBaseClass(mecDesign); + costEst.getWeightBasedCAPEXEstimate(); + + System.out.println("weight based cost estmate " + costEst.getWeightBasedCAPEXEstimate()); + } +} diff --git a/src/test/java/neqsim/processSimulation/util/example/OffshoreProcess3.java b/src/test/java/neqsim/processSimulation/util/example/OffshoreProcess3.java index 06a011c28..755a59453 100644 --- a/src/test/java/neqsim/processSimulation/util/example/OffshoreProcess3.java +++ b/src/test/java/neqsim/processSimulation/util/example/OffshoreProcess3.java @@ -346,6 +346,6 @@ public static void main(String[] args) { System.out.println("Power " + operations.getPower("W") / 1.0e6 + " MW"); System.out.println("exergy change " + operations.getExergyChange("J")); - System.out.println("total weight " + operations.getMechanicalWeight("kg") + " kg"); + // System.out.println("total weight " + operations.getMechanicalWeight("kg") + " kg"); } } diff --git a/src/test/java/neqsim/processSimulation/util/example/simpleGasScrubber.java b/src/test/java/neqsim/processSimulation/util/example/simpleGasScrubber.java index 8da90b91a..fcc028f20 100644 --- a/src/test/java/neqsim/processSimulation/util/example/simpleGasScrubber.java +++ b/src/test/java/neqsim/processSimulation/util/example/simpleGasScrubber.java @@ -5,51 +5,53 @@ import neqsim.thermodynamicOperations.ThermodynamicOperations; /** - *

simpleGasScrubber class.

+ *

+ * simpleGasScrubber class. + *

* * @author asmund * @version $Id: $Id * @since 2.2.3 */ public class simpleGasScrubber { - /** - * This method is just meant to test the thermo package. - * - * @param args an array of {@link java.lang.String} objects - */ - @SuppressWarnings("unused") - public static void main(String args[]) { - neqsim.thermo.system.SystemInterface testSystem = - new neqsim.thermo.system.SystemSrkEos((273.15 + 25.0), 20.00); - testSystem.addComponent("methane", 1200.00); - testSystem.addComponent("water", 1200.0); - testSystem.createDatabase(true); - testSystem.setMixingRule(2); - ThermodynamicOperations testOps = new ThermodynamicOperations(testSystem); - testOps.TPflash(); + /** + * This method is just meant to test the thermo package. + * + * @param args an array of {@link java.lang.String} objects + */ + @SuppressWarnings("unused") + public static void main(String args[]) { + neqsim.thermo.system.SystemInterface testSystem = + new neqsim.thermo.system.SystemSrkEos((273.15 + 25.0), 20.00); + testSystem.addComponent("methane", 1200.00); + testSystem.addComponent("water", 1200.0); + testSystem.createDatabase(true); + testSystem.setMixingRule(2); + ThermodynamicOperations testOps = new ThermodynamicOperations(testSystem); + testOps.TPflash(); - Stream stream_1 = new Stream("Stream1", testSystem); + Stream stream_1 = new Stream("Stream1", testSystem); - GasScrubberSimple gasScrubber = new GasScrubberSimple("Scrubber", stream_1); - // gasScrubber.addScrubberSection("mesh"); - // gasScrubber.addScrubberSection("mesh2"); - Stream stream_2 = new Stream("gas from scrubber", gasScrubber.getGasOutStream()); - Stream stream_3 = new Stream("liquid from scrubber", gasScrubber.getLiquidOutStream()); + GasScrubberSimple gasScrubber = new GasScrubberSimple("Scrubber", stream_1); + // gasScrubber.addScrubberSection("mesh"); + // gasScrubber.addScrubberSection("mesh2"); + Stream stream_2 = new Stream("gas from scrubber", gasScrubber.getGasOutStream()); + Stream stream_3 = new Stream("liquid from scrubber", gasScrubber.getLiquidOutStream()); - neqsim.processSimulation.processSystem.ProcessSystem operations = - new neqsim.processSimulation.processSystem.ProcessSystem(); - operations.add(stream_1); - operations.add(gasScrubber); - operations.add(stream_2); - operations.add(stream_3); - operations.run(); - // operations.displayResult(); + neqsim.processSimulation.processSystem.ProcessSystem operations = + new neqsim.processSimulation.processSystem.ProcessSystem(); + operations.add(stream_1); + operations.add(gasScrubber); + operations.add(stream_2); + operations.add(stream_3); + operations.run(); + // operations.displayResult(); - operations.getSystemMechanicalDesign().setCompanySpecificDesignStandards("StatoilTR"); + // operations.getSystemMechanicalDesign().setCompanySpecificDesignStandards("StatoilTR"); - // gasScrubber.getMechanicalDesign().calcDesign(); - // gasScrubber.getMechanicalDesign().displayResults(); - operations.getSystemMechanicalDesign().runDesignCalculation(); - double vol = operations.getSystemMechanicalDesign().getTotalVolume(); - } + // gasScrubber.getMechanicalDesign().calcDesign(); + // gasScrubber.getMechanicalDesign().displayResults(); + // operations.getSystemMechanicalDesign().runDesignCalculation(); + // double vol = operations.getSystemMechanicalDesign().getTotalVolume(); + } } diff --git a/src/test/java/neqsim/processSimulation/util/example/testGasScrubber.java b/src/test/java/neqsim/processSimulation/util/example/testGasScrubber.java index c8501a5cb..6a602a7d7 100644 --- a/src/test/java/neqsim/processSimulation/util/example/testGasScrubber.java +++ b/src/test/java/neqsim/processSimulation/util/example/testGasScrubber.java @@ -79,7 +79,7 @@ public static void main(String args[]) { scrubber.getGasLoadFactor(); // do design of process - operations.getSystemMechanicalDesign().setCompanySpecificDesignStandards("StatoilTR"); + // operations.getSystemMechanicalDesign().setCompanySpecificDesignStandards("StatoilTR"); // operations.runProcessDesignCalculation(); // prosessdesign do: calculate flow rates of TEG, amine, calculates heat duty @@ -88,8 +88,8 @@ public static void main(String args[]) { // operations.runMechanicalDesignCalculation(); // calculates diameters of colums, wall thickness, weight, size of equipment, // tray spacing - operations.getSystemMechanicalDesign().runDesignCalculation(); - operations.getSystemMechanicalDesign().setDesign(); + // operations.getSystemMechanicalDesign().runDesignCalculation(); + // operations.getSystemMechanicalDesign().setDesign(); operations.run(); scrubber.getGasLoadFactor(); // operations.calcDesign();