diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml index 1c7213b5..72140e5e 100644 --- a/.github/workflows/core.yml +++ b/.github/workflows/core.yml @@ -44,10 +44,20 @@ defaults: shell: bash -l {0} jobs: + spell-check: + name: Check Spelling + runs-on: ubuntu-latest + steps: + - name: Checkout source + uses: actions/checkout@v3 + - name: Run Spell Checker + uses: crate-ci/typos@master + pytest: # description: Run pytest with dev dependencies name: pytest (py${{ matrix.python-version }}/${{ matrix.os }}) runs-on: ${{ matrix.runner-image }} + needs: [spell-check] strategy: fail-fast: false matrix: diff --git a/.gitignore b/.gitignore index 357127f9..413dbf03 100644 --- a/.gitignore +++ b/.gitignore @@ -143,6 +143,7 @@ idaes_examples/notebooks/**/pysmo/*.pickle idaes_examples/notebooks/**/omlt/keras_surrogate/*.pb idaes_examples/notebooks/**/omlt/keras_surrogate/*.pdf idaes_examples/notebooks/**/omlt/*.pdf +idaes_examples/notebooks/docs/power_gen/solid_oxide_cell/soc_dynamic_flowsheet.svg alamo_run.alm idaes_examples/notebooks/docs/tut/sin_data.csv *.pb diff --git a/idaes_examples/archive/data_reconciliation/boiler_flowsheet_recon_src.ipynb b/idaes_examples/archive/data_reconciliation/boiler_flowsheet_recon_src.ipynb index 15a6b0fc..402842e8 100644 --- a/idaes_examples/archive/data_reconciliation/boiler_flowsheet_recon_src.ipynb +++ b/idaes_examples/archive/data_reconciliation/boiler_flowsheet_recon_src.ipynb @@ -614,7 +614,7 @@ "outputs": [], "source": [ "# Add the model references to the tag metadata based on the strings above.\n", - "da.upadate_metadata_model_references(m, df_meta)" + "da.update_metadata_model_references(m, df_meta)" ] }, { diff --git a/idaes_examples/archive/data_reconciliation/econ_recon_src.ipynb b/idaes_examples/archive/data_reconciliation/econ_recon_src.ipynb index 797b63df..503c399f 100644 --- a/idaes_examples/archive/data_reconciliation/econ_recon_src.ipynb +++ b/idaes_examples/archive/data_reconciliation/econ_recon_src.ipynb @@ -118,7 +118,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "It can be useful to visualize the measurement data and estimated uncertainty. The following creates box and whisker plots for each tag based on the data bins. A large number of plots may be created, so to manage them more easily, they are saved as PDFs and merged into a single multi-page PDF document. The deafault file name for the resulting PDF is \"data_plot_book.pdf.\"" + "It can be useful to visualize the measurement data and estimated uncertainty. The following creates box and whisker plots for each tag based on the data bins. A large number of plots may be created, so to manage them more easily, they are saved as PDFs and merged into a single multi-page PDF document. The default file name for the resulting PDF is \"data_plot_book.pdf.\"" ] }, { @@ -384,7 +384,7 @@ "outputs": [], "source": [ "# Add the model references to the tag metadata based on the strings above.\n", - "da.upadate_metadata_model_references(m, df_meta)" + "da.update_metadata_model_references(m, df_meta)" ] }, { @@ -413,7 +413,7 @@ "from idaes.core.util.tags import ModelTagGroup\n", "\n", "# This function creates a dictionary of streams based of streams based on model arcs. The function\n", - "# also takes an addtional set of stream-like objects for add to the stream dictionary. In this case,\n", + "# also takes an additional set of stream-like objects for add to the stream dictionary. In this case,\n", "# this is a single unit and the flowsheet doesn't contain any arcs, so we add the economized inlet and\n", "# outlet ports to the stream dictionary.\n", "stream_dict = ta.arcs_to_stream_dict(\n", @@ -459,7 +459,7 @@ " except KeyError:\n", " pass\n", "\n", - "# Any addtional tags can be added. This is required for tags that cannot be systematically generated\n", + "# Any additional tags can be added. This is required for tags that cannot be systematically generated\n", "# from the model streams.\n", "recon_tags.add(expr=m.fs.econ.heat_duty[0], name=\"ECON_Q\", format_string=\"{:.3f}\")" ] diff --git a/idaes_examples/archive/matopt/bifunctional_surface_design_src.ipynb b/idaes_examples/archive/matopt/bifunctional_surface_design_src.ipynb index d9a0ce4e..b123df61 100644 --- a/idaes_examples/archive/matopt/bifunctional_surface_design_src.ipynb +++ b/idaes_examples/archive/matopt/bifunctional_surface_design_src.ipynb @@ -43,7 +43,7 @@ "metadata": {}, "source": [ "## Importing Packages\n", - "We start by importing several standard Python modules for convienience. " + "We start by importing several standard Python modules for convenience. " ] }, { @@ -339,7 +339,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, we introduce a single descriptor for the weighted combination of acitivity and stability. \n", + "Finally, we introduce a single descriptor for the weighted combination of activity and stability. \n", "By changing the parameter weighting the catalytic portion of the objective function, we can optimize for a range of designs optimizing stability and activity. " ] }, diff --git a/idaes_examples/archive/matopt/bimetallic_nanocluster_design_src.ipynb b/idaes_examples/archive/matopt/bimetallic_nanocluster_design_src.ipynb index 643ce34c..a1872731 100644 --- a/idaes_examples/archive/matopt/bimetallic_nanocluster_design_src.ipynb +++ b/idaes_examples/archive/matopt/bimetallic_nanocluster_design_src.ipynb @@ -45,7 +45,7 @@ "source": [ "## Importing Packages\n", "\n", - "We start by importing several standard Python modules for convienience." + "We start by importing several standard Python modules for convenience." ] }, { diff --git a/idaes_examples/archive/matopt/monometallic_nanocluster_design_src.ipynb b/idaes_examples/archive/matopt/monometallic_nanocluster_design_src.ipynb index 32b4955b..b4a900c3 100644 --- a/idaes_examples/archive/matopt/monometallic_nanocluster_design_src.ipynb +++ b/idaes_examples/archive/matopt/monometallic_nanocluster_design_src.ipynb @@ -34,10 +34,10 @@ "\n", "In this module, we introduce the **MatOpt** interface for representing material properties and specifying optimization problems. \n", "\n", - "We have designed the interface with severl goals in mind:\n", + "We have designed the interface with several goals in mind:\n", "\n", "1. To **simplify the representation of nanostructured materials,** streamlining the creation of materials optimization problems. \n", - "2. To provide a simple interface so that users **do not need to understand the details of building mathematical optmization models** or the syntax of the Pyomo package. \n", + "2. To provide a simple interface so that users **do not need to understand the details of building mathematical optimization models** or the syntax of the Pyomo package. \n", "3. To **automate many of the common steps of materials optimization,** speeding up the development of new models. \n", "\n", "As an example system, we will consider the minimization of cohesive energy in nanoclusters, recently demonstrated in:\n", @@ -45,7 +45,7 @@ "Isenberg, N. M., et al., \"Identification of Optimally Stable Nanocluster Geometries via Mathematical Optimization and Density Functional Theory,\" *Molecular Systems Design & Engineering* 5 (2020): 232-244. DOI: [10.1039/C9ME00108E](https://pubs.rsc.org/en/content/articlelanding/2020/me/c9me00108e#!divAbstract).\n", "\n", "We seek to identify the geometry that minimizes the cohesive energy of a nanocluster on the face-centered cubic (FCC) lattice. \n", - "As a model for cohesive energy, we use model based on the square-root of coordination number, refered to as the Tomanek model [[1]](https://journals.aps.org/prb/abstract/10.1103/PhysRevB.28.665).\n", + "As a model for cohesive energy, we use model based on the square-root of coordination number, referred to as the Tomanek model [[1]](https://journals.aps.org/prb/abstract/10.1103/PhysRevB.28.665).\n", "In the equation below, we define the normalized cohesive energy, as the normalized contribution of the square root of the coordination number. \n", "\n", "$$\\hat{E}^{\\text{surf}} = \\frac{1}{N \\sqrt{12}} \\displaystyle \\sum_i \\sqrt{CN_i} $$\n", @@ -178,7 +178,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The MatOptModel additionally hold lists of ***MaterialDescriptor*** objects that define the relevant material desriptors. \n", + "The MatOptModel additionally hold lists of ***MaterialDescriptor*** objects that define the relevant material descriptors. \n", "By default, several universal site descriptors are pre-defined in the model. \n", "From these, all other material descriptors can be defined.\n", "\n", @@ -353,7 +353,7 @@ " Default: True\n", " tilim (float): Optional, solver time limit (in seconds).\n", " Default: 3600\n", - " trelim (float): Optional, solver tree memeory limit (in MB).\n", + " trelim (float): Optional, solver tree memory limit (in MB).\n", " Default: None (i.e., Pyomo/CPLEX default)\n", " solver (str): Solver choice. Currently only cplex or neos-cplex are supported\n", " Default: cplex\n", diff --git a/idaes_examples/archive/matopt/nanowire_design_src.ipynb b/idaes_examples/archive/matopt/nanowire_design_src.ipynb index 2111fb33..a1070c8e 100644 --- a/idaes_examples/archive/matopt/nanowire_design_src.ipynb +++ b/idaes_examples/archive/matopt/nanowire_design_src.ipynb @@ -40,7 +40,7 @@ "metadata": {}, "source": [ "## Importing Packages\n", - "We start by importing several standard Python modules for convienience. " + "We start by importing several standard Python modules for convenience. " ] }, { @@ -161,7 +161,7 @@ "source": [ "## Building a Model\n", "\n", - "In this example, we will build a model that maximizes the cohesive energy of the nanowire as an indicator of it's thermal stability. To begin, we start by creating a **MatOptModel** object to hold information about the model. Notice that we use a list of empty atoms as our set of building blocks because we will use a cohesive energy function for semiconductor materials that is indepedent of atom types. Thus, we do not need to specify the types of building blocks in our model." + "In this example, we will build a model that maximizes the cohesive energy of the nanowire as an indicator of it's thermal stability. To begin, we start by creating a **MatOptModel** object to hold information about the model. Notice that we use a list of empty atoms as our set of building blocks because we will use a cohesive energy function for semiconductor materials that is independent of atom types. Thus, we do not need to specify the types of building blocks in our model." ] }, { diff --git a/idaes_examples/archive/matopt/surface_design_src.ipynb b/idaes_examples/archive/matopt/surface_design_src.ipynb index 8923413b..49861f88 100644 --- a/idaes_examples/archive/matopt/surface_design_src.ipynb +++ b/idaes_examples/archive/matopt/surface_design_src.ipynb @@ -42,7 +42,7 @@ "metadata": {}, "source": [ "## Importing Packages\n", - "We start by importing several standard Python modules for convienience. " + "We start by importing several standard Python modules for convenience. " ] }, { @@ -211,7 +211,7 @@ "source": [ "First, we introduce two rules to fix special sites in the design. \n", "We fix the bottom two layers of atoms to exist, creating underlying bulk layers above which we will introduce nanostruced defets.\n", - "We also fix an arbitrary atom in the top layer, breaking symetry of the design space and resulting in easier to solve opitmization problems without actually restricting the designs that can be possibly represented. " + "We also fix an arbitrary atom in the top layer, breaking symmetry of the design space and resulting in easier to solve opitmization problems without actually restricting the designs that can be possibly represented. " ] }, { @@ -241,7 +241,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we introduce constraints thtat require atoms to be placed on top of each other, avoiding hollow pockets below the surface. " + "Next, we introduce constraints that require atoms to be placed on top of each other, avoiding hollow pockets below the surface. " ] }, { @@ -311,7 +311,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we define a simple model for the surface energy of nanostructured slabs as a piecwise linear function of coordination number. " + "Next, we define a simple model for the surface energy of nanostructured slabs as a piecewise linear function of coordination number. " ] }, { @@ -473,7 +473,7 @@ "metadata": {}, "source": [ "## Processing Solutions\n", - "Once the model is solved, we can plot the resulting design. However, it is often useful to label atoms according to some auxilliary information. In this case, we would like to label atoms that consitute ideal reactive sites. We loop over the sites and set the atom to S to highlight the sites that are reactive. Then, we can write the Design object to PDB or CFG files for plotting.\n", + "Once the model is solved, we can plot the resulting design. However, it is often useful to label atoms according to some auxiliary information. In this case, we would like to label atoms that constitute ideal reactive sites. We loop over the sites and set the atom to S to highlight the sites that are reactive. Then, we can write the Design object to PDB or CFG files for plotting.\n", "\n", "Additionally, we can manipulate the resulting design to better see the periodic pattern. Here, we replicate the design four times to see the periodic pattern. " ] diff --git a/idaes_examples/archive/power_gen/ngfc/NGFC_flowsheet_init.json.gz b/idaes_examples/archive/power_gen/ngfc/NGFC_flowsheet_init.json.gz index 422b947f..f3c19160 100644 Binary files a/idaes_examples/archive/power_gen/ngfc/NGFC_flowsheet_init.json.gz and b/idaes_examples/archive/power_gen/ngfc/NGFC_flowsheet_init.json.gz differ diff --git a/idaes_examples/archive/power_gen/ngfc/NGFC_flowsheet_solution.json.gz b/idaes_examples/archive/power_gen/ngfc/NGFC_flowsheet_solution.json.gz index 0bb58cfa..74f0cd47 100644 Binary files a/idaes_examples/archive/power_gen/ngfc/NGFC_flowsheet_solution.json.gz and b/idaes_examples/archive/power_gen/ngfc/NGFC_flowsheet_solution.json.gz differ diff --git a/idaes_examples/archive/power_gen/ngfc/NGFC_results.svg b/idaes_examples/archive/power_gen/ngfc/NGFC_results.svg index 6588363e..e15a7f3c 100644 --- a/idaes_examples/archive/power_gen/ngfc/NGFC_results.svg +++ b/idaes_examples/archive/power_gen/ngfc/NGFC_results.svg @@ -1,7 +1,7 @@ -image/svg+xml - +image/svg+xml + - + @@ -73,431 +73,431 @@ - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + For SVG HRSG - + - + Sheet.1 - + - + Sheet.2 Steam - - - Steam - + + + Steam + Sheet.3 - + - + Sheet.4 - + - + Sheet.5 SOFC Stack - - - SOFC Stack - + + + SOFC Stack + Sheet.6 - + - + Sheet.7 Air - - - Air - + + + Air + Sheet.8 - + - + Sheet.9 Cathode - - - Cathode - + + + Cathode + Sheet.10 Electrolyte - - - Electrolyte - + + + Electrolyte + Sheet.11 Anode - - - Anode - + + + Anode + AC source - - - - + + + + - - - - - + + + + + - + - - - + + + Inverter - + Sheet.14 - + Sheet.15 1 - - - + + + - + Sheet.16 Inverter - - - Inverter - + + + Inverter + Sheet.17 - + - + Sheet.18 - + - + Sheet.19 - + - + Sheet.20 - + - + Sheet.21 - + - + Dynamic connector.122 - + - + Sheet.23 - + - + Dynamic connector.124 - + - + Dynamic connector.125 - + - + Sheet.26 AC - - - AC - + + + AC + Dynamic connector.127 - + - + Sheet.29 Cathode Blower - - - Cathode Blower - + + + Cathode Blower + Sheet.31 Cathode HTX - - - Cathode HTX - + + + Cathode HTX + Sheet.32 Autothermal - - - Autothermal - + + + Autothermal + Dynamic connector.78 - + - + Dynamic connector.134 - + - + Sheet.35 - + - + Dynamic connector.136 - + - + Dynamic connector.138 - + - + Dynamic connector.137 - + - + Dynamic connector.139 - + - + Sheet.40 - + - + Sheet.41 - + - + Sheet.43 - + - + Dynamic connector.144 - + - + Dynamic connector.109 - + - + Dynamic connector.110 - + - + Sheet.50 Preheat - - - Preheat - + + + Preheat + Sheet.51 Autothermal Reformer - - - Autothermal Reformer - + + + Autothermal Reformer + Sheet.52 Anode HTX - - - Anode HTX - + + + Anode HTX + Sheet.53 Combustor - - - Combustor - + + + Combustor + Sheet.54 Natural Gas - - - Natural Gas - + + + Natural Gas + Dynamic connector.155 - + - + Sheet.62 - + - + Sheet.64 - + - + Dynamic connector.167 - + - + Sheet.66 - + - + Sheet.67 Air - - - Air - + + + Air + Sheet.68 Heat Recovery Steam Generator - - - Heat Recovery Steam Generator - + + + Heat Recovery Steam Generator + Sheet.69 Steam Turbine Generator - - - Steam Turbine Generator - + + + Steam Turbine Generator + Dynamic connector.154 - + - + AC source.160 - - - - + + + + - - - - - + + + + + - + Sheet.72 AC - - - AC - + + + AC + Dynamic connector.170 - + - + Dynamic connector.172 - + - + Dynamic connector.191 - + - + Dynamic connector.192 - + - + Dynamic connector.132 - + - + Dynamic connector.193 - + - + Dynamic connector.42 - + - + Dynamic connector.96 - + - + Sheet.98 Pre-Reformer - - - Pre-Reformer + + + Pre-Reformer -621 K137 kPaSYN_INT:P:3,642 mol/sF:979 K137 kPaANODE_RECT:P:4,084 mol/sF:890 K105 kPaCATH_INT:P:34,197 mol/sF:998 K104 kPaCATH_OUTT:P:32,525 mol/sF:998 K104 kPaCATH_HX_HIT:P:16,262 mol/sF:288 K101 kPaAIRT:P:17,934 mol/sF:834 K137 kPaANODE_INT:P:8,041 mol/sF:978 K137 kPaANO_HX_HIT:P:5,084 mol/sF:825 K136 kPaANO_HX_HOT:P:5,084 mol/sF:814 K137 kPaANO_HX_CIT:P:7,727 mol/sF:978 K137 kPaANODE_OUTT:P:9,169 mol/sF:476 K102 kPaCATH_HX_HOT:P:16,262 mol/sF:1,002 K105 kPaCATH_RECT:P:16,262 mol/sF:297 K111 kPaCATH_HX_CIT:P:17,934 mol/sF:787 K105 kPaCATH_HX_COT:P:17,934 mol/sF:348.30.6617.3ROM InputsFuel Inlet Temperature (C):Internal Reformation fraction:Air Inlet Temperature (C):4,000Avg. Curent Density (A/m^2):0.5Air Recirculation fraction:2.1Oxygen to Carbon ratio:Fuel Utilization fraction:Air Utilization fraction:0.80.449559.3ROM OutputsDC Stack Power (MW):0.8668Stack Voltage (V):30.6265.17-673.92Heat Duties (MW)Anode Heat Exchanger:Cathode Heat Exchanger:Anode:48.1Reformer Recuperator:114.57Cathode:422 K206 kPaSTEAM_INT:P:464 mol/sF:310 K203 kPaAIR_INT:P:1,333 mol/sF:747 K206 kPaREF_INT:P:465 mol/sF:288 K3,447 kPaFUEL_INT:P:1,161 mol/sF:1,060 K137 kPaREF_OUTT:P:2,944 mol/sF:1,265 K95 kPaCOMB_OUTT:P:9,545 mol/sF:405 K94 kPaANOD_EXHT:P:9,546 mol/sF:476 K102 kPaCOMB_AIRT:P:4,878 mol/sF:405 K101 kPaCATH_EXHT:P:11,384 mol/sF:476 K102 kPaCATH_HRSG_INT:P:11,384 mol/sF:107.321.110.4Performance SummarySteam Turbine Power (MW):NG Expander Power (MW):Auxiliary Load (MW):542.6AC Stack Power (MW):660.6Net Power (MW):Thermal Input (MW):HHV Efficiency (%):CO2 Emissions (g/kWh):1,056.0291.262.561,012 K3,447 kPaHOT_FUELT:P:1,161 mol/sF: \ No newline at end of file +621 K137 kPaSYN_INT:P:3,642 mol/sF:979 K137 kPaANODE_RECT:P:4,084 mol/sF:890 K105 kPaCATH_INT:P:34,197 mol/sF:998 K104 kPaCATH_OUTT:P:32,525 mol/sF:998 K104 kPaCATH_HX_HIT:P:16,262 mol/sF:288 K101 kPaAIRT:P:17,934 mol/sF:834 K137 kPaANODE_INT:P:8,041 mol/sF:978 K137 kPaANO_HX_HIT:P:5,084 mol/sF:825 K136 kPaANO_HX_HOT:P:5,084 mol/sF:814 K137 kPaANO_HX_CIT:P:7,727 mol/sF:978 K137 kPaANODE_OUTT:P:9,169 mol/sF:476 K102 kPaCATH_HX_HOT:P:16,262 mol/sF:1,002 K105 kPaCATH_RECT:P:16,262 mol/sF:297 K111 kPaCATH_HX_CIT:P:17,934 mol/sF:787 K105 kPaCATH_HX_COT:P:17,934 mol/sF:348.30.6617.3ROM InputsFuel Inlet Temperature (C):Internal Reformation fraction:Air Inlet Temperature (C):4,000Avg. Current Density (A/m^2):0.5Air Recirculation fraction:2.1Oxygen to Carbon ratio:Fuel Utilization fraction:Air Utilization fraction:0.80.449559.3ROM OutputsDC Stack Power (MW):0.8668Stack Voltage (V):30.6265.17-673.92Heat Duties (MW)Anode Heat Exchanger:Cathode Heat Exchanger:Anode:48.1Reformer Recuperator:114.57Cathode:422 K206 kPaSTEAM_INT:P:464 mol/sF:310 K203 kPaAIR_INT:P:1,333 mol/sF:747 K206 kPaREF_INT:P:465 mol/sF:288 K3,447 kPaFUEL_INT:P:1,161 mol/sF:1,060 K137 kPaREF_OUTT:P:2,944 mol/sF:1,265 K95 kPaCOMB_OUTT:P:9,545 mol/sF:405 K94 kPaANOD_EXHT:P:9,546 mol/sF:476 K102 kPaCOMB_AIRT:P:4,878 mol/sF:405 K101 kPaCATH_EXHT:P:11,384 mol/sF:476 K102 kPaCATH_HRSG_INT:P:11,384 mol/sF:107.321.110.4Performance SummarySteam Turbine Power (MW):NG Expander Power (MW):Auxiliary Load (MW):542.6AC Stack Power (MW):660.6Net Power (MW):Thermal Input (MW):HHV Efficiency (%):CO2 Emissions (g/kWh):1,056.0291.262.561,012 K3,447 kPaHOT_FUELT:P:1,161 mol/sF: \ No newline at end of file diff --git a/idaes_examples/archive/power_gen/ngfc/NGFC_results_template.svg b/idaes_examples/archive/power_gen/ngfc/NGFC_results_template.svg index 3e9ebc6f..2079cfd2 100644 --- a/idaes_examples/archive/power_gen/ngfc/NGFC_results_template.svg +++ b/idaes_examples/archive/power_gen/ngfc/NGFC_results_template.svg @@ -3896,7 +3896,7 @@ y="493.27994" x="-444.19608" id="tspan9468-5-5-3" - sodipodi:role="line">Avg. Curent Density (A/m^2):Avg. Current Density (A/m^2):" ] @@ -133,7 +132,7 @@ "\n", "The sequence of ```build_power_island()```, ```scale_flowsheet()```, ```set_power_island_inputs()```, and ```initialize_power_island()``` creates and initializes the unit models in the power island. At this stage, the inlet to the anode side of the power island is a guess of the syngas conditions. Then the solver is called to finalize the solution to the power island. The solution to the reformer section remains unaffected.\n", "\n", - "To combine the two sections ```connect_reformer_to_power_island()``` is called. The funtion unfixes the guess for the inlet to power island and connects the outlet of the reformer section to it. Then the solver is called a third time on the fully connected flowsheet.\n", + "To combine the two sections ```connect_reformer_to_power_island()``` is called. The function unfixes the guess for the inlet to power island and connects the outlet of the reformer section to it. Then the solver is called a third time on the fully connected flowsheet.\n", "\n", "In execution order, the flowsheet builds each of the two subsections, scales model constraints, sets inputs, initializes independently, and connects the two subsections.\n", "\n", @@ -154,11 +153,12 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import os\n", + "import logging\n", "\n", "# Import Pyomo libraries\n", "import pyomo.environ as pyo\n", @@ -167,14 +167,17 @@ "# Import IDAES core\n", "from idaes.core import FlowsheetBlock\n", "from idaes.core.util import model_serializer as ms\n", + "from idaes.core.util.model_statistics import degrees_of_freedom\n", "\n", "# Import NGFC model components\n", - "from idaes_examples.mod.power_gen import NGFC_flowsheet as NGFC" + "from idaes_examples.mod.power_gen import NGFC_flowsheet as NGFC\n", + "\n", + "import idaes.logger as idaeslog" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -182,14 +185,41 @@ "m = pyo.ConcreteModel(name=\"NGFC no CCS\")\n", "m.fs = FlowsheetBlock(dynamic=False)\n", "\n", - "# create the solver\n", - "solver = pyo.SolverFactory(\"ipopt\")\n", - "solver.options = {\"bound_push\": 1e-16}" + "# create the solvers\n", + "# the SOFC ROM is very large and using the ma97 linear solver significantly reduces the solve time\n", + "solver_ma97 = pyo.SolverFactory(\"ipopt\")\n", + "solver_ma97.options = {\n", + " \"max_iter\": 200,\n", + " \"tol\": 1e-7,\n", + " \"bound_push\": 1e-5,\n", + " \"mu_init\": 1e-2,\n", + " \"linear_solver\": \"ma97\",\n", + " \"nlp_scaling_method\": \"user-scaling\"\n", + "}\n", + "\n", + "# the ma57 linear solver is better for the initial solve before the ROM is built\n", + "solver_ma57 = pyo.SolverFactory(\"ipopt\")\n", + "solver_ma57.options = {\n", + " \"max_iter\": 200,\n", + " \"tol\": 1e-7,\n", + " \"bound_push\": 1e-5,\n", + " \"linear_solver\": \"ma57\",\n", + " \"OF_ma57_automatic_scaling\": \"yes\",\n", + " \"nlp_scaling_method\": \"user-scaling\"\n", + "}\n", + "\n", + "# suppress warnings about missing scaling factors\n", + "scaling_log = idaeslog.getLogger(\"idaes.core.util.scaling\")\n", + "scaling_log.setLevel(idaeslog.ERROR)\n", + "\n", + "# suppress NL writer warnings\n", + "nl_writer_log = logging.getLogger(\"pyomo.repn.plugins.nl_writer\")\n", + "nl_writer_log.setLevel(logging.ERROR)" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": { "scrolled": true }, @@ -199,178 +229,23 @@ "output_type": "stream", "text": [ "Scaling flowsheet variables\n", - "overwriting mole_frac lower bound, set to 0 to remove warnings\n", - "Scaling flowsheet constraints\n", - "Calculating scaling factors\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C2H6]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C3H8]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C4H10]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C2H6]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C3H8]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C4H10]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C2H6]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C3H8]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C4H10]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C2H6]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C3H8]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C4H10]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C2H6]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C3H8]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,C4H10]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.prereformer.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:03 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.anode.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C2H6]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C3H8]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C4H10]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C2H6]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C3H8]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C4H10]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C2H6]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C3H8]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C4H10]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C2H6]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C3H8]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C4H10]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,H2O]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CO2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,CH4]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C2H6]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C3H8]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,C4H10]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,N2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,O2]\n", - "2023-02-13 09:09:04 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.reformer.control_volume.properties_out[0.0]._material_density_term[Vap,Ar]\n", - "\n", - "Starting ROM initialization\n", - "ROM initialization completed\n", "Loading solved model\n" ] } ], "source": [ - "# initialization takes ~ 5 minutes, full solve takes ~ 1 hour\n", + "# full initialization and solves takes about 2 minutes\n", "reinit = False # switch to True to re-initialize and re-solve\n", "resolve = False # switch to True to re-solve only (for debugging)\n", "\n", "if os.path.exists(\"NGFC_flowsheet_init.json.gz\") and reinit is False:\n", " # already initialized, can build model and load results from json\n", + " NGFC.build_properties(m)\n", " NGFC.build_power_island(m)\n", " NGFC.build_reformer(m)\n", " NGFC.scale_flowsheet(m)\n", " NGFC.connect_reformer_to_power_island(m)\n", - " NGFC.SOFC_ROM_setup(m)\n", + " NGFC.SOFC_ROM_setup(m, init=False)\n", " NGFC.add_SOFC_energy_balance(m)\n", " NGFC.add_result_constraints(m)\n", " if os.path.exists(\"NGFC_flowsheet_solution.json.gz\") and resolve is False:\n", @@ -382,27 +257,13 @@ " # and then serialize solved model results\n", " print(\"Loading initialized model\")\n", " ms.from_json(m, fname=\"NGFC_flowsheet_init.json.gz\")\n", - " # solver and options\n", - " solver = pyo.SolverFactory(\"ipopt\")\n", - " solver.options = {\n", - " \"max_iter\": 50,\n", - " \"tol\": 1e-5,\n", - " \"bound_push\": 1e-8,\n", - " \"linear_solver\": \"ma57\",\n", - " \"ma57_pivtol\": 1e-3,\n", - " \"OF_ma57_automatic_scaling\": \"yes\",\n", - " \"nlp_scaling_method\": \"user-scaling\",\n", - " }\n", - " solve_iteration = 0\n", - " for i in range(1, 10): # keep looping until condition is met\n", - " solve_iteration += 1\n", - " print(\"Solve # \", solve_iteration)\n", - " res = solver.solve(m, tee=True)\n", - " if \"Optimal Solution Found\" in res.solver.message:\n", - " break\n", - " ms.to_json(m, fname=\"NGFC_flowsheet_solution.json.gz\")\n", + " \n", + " res = solver_ma97.solve(m, tee=True)\n", + " if \"Optimal Solution Found\" in res.solver.message:\n", + " ms.to_json(m, fname=\"NGFC_flowsheet_solution.json.gz\")\n", "else:\n", " # need to initialize model, serialize, and try to solve/serialize\n", + " NGFC.build_properties(m)\n", " NGFC.build_power_island(m)\n", " NGFC.build_reformer(m)\n", " NGFC.scale_flowsheet(m)\n", @@ -411,34 +272,23 @@ " NGFC.initialize_power_island(m)\n", " NGFC.initialize_reformer(m)\n", " NGFC.connect_reformer_to_power_island(m)\n", + " \n", + " solver_ma57.solve(m, tee=True)\n", + "\n", " NGFC.SOFC_ROM_setup(m)\n", " NGFC.add_SOFC_energy_balance(m)\n", " NGFC.add_result_constraints(m)\n", - " ms.to_json(m, fname=\"NGFC_flowsheet_init.json.gz\")\n", - " solver = pyo.SolverFactory(\"ipopt\")\n", - " solver.options = {\n", - " \"max_iter\": 50,\n", - " \"tol\": 1e-5,\n", - " \"bound_push\": 1e-8,\n", - " \"linear_solver\": \"ma57\",\n", - " \"ma57_pivtol\": 1e-3,\n", - " \"OF_ma57_automatic_scaling\": \"yes\",\n", - " \"nlp_scaling_method\": \"user-scaling\",\n", - " }\n", - " solve_iteration = 0\n", - " for i in range(1, 10): # keep looping until condition is met\n", - " solve_iteration += 1\n", - " print(\"Solve # \", solve_iteration)\n", - " res = solver.solve(m, tee=True)\n", - " if \"Optimal Solution Found\" in res.solver.message:\n", - " break\n", "\n", - " ms.to_json(m, fname=\"NGFC_flowsheet_solution.json.gz\")" + " ms.to_json(m, fname=\"NGFC_flowsheet_init.json.gz\")\n", + " \n", + " res = solver_ma97.solve(m, tee=True)\n", + " if \"Optimal Solution Found\" in res.solver.message:\n", + " ms.to_json(m, fname=\"NGFC_flowsheet_solution.json.gz\")" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": { "scrolled": true }, @@ -449,406 +299,12 @@ "text": [ "DOF = 0\n", "\n", - "Solve # 1\n", - "WARNING: model contains export suffix\n", - " 'fs.bypass_rejoin.mixed_state[0.0].scaling_factor' that contains 13\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.bypass_rejoin.bypass_inlet_state[0.0].scaling_factor' that contains 13\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.bypass_rejoin.syngas_inlet_state[0.0].scaling_factor' that contains 13\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 15 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 13 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer.control_volume.scaling_factor' that contains 10 component\n", - " keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix 'fs.reformer.scaling_factor' that\n", - " contains 4 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_mix.mixed_state[0.0].scaling_factor' that contains 13\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_mix.steam_inlet_state[0.0].scaling_factor' that contains 26\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_mix.oxygen_inlet_state[0.0].scaling_factor' that contains 13\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_mix.gas_inlet_state[0.0].scaling_factor' that contains 13\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.intercooler_s2.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 14 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.intercooler_s2.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 13 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.intercooler_s2.control_volume.scaling_factor' that contains 1\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.air_compressor_s2.properties_isentropic[0.0].scaling_factor' that\n", - " contains 15 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.air_compressor_s2.control_volume.properties_out[0.0].scaling_factor'\n", - " that contains 14 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.air_compressor_s2.control_volume.properties_in[0.0].scaling_factor'\n", - " that contains 15 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.intercooler_s1.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 14 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.intercooler_s1.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 13 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.intercooler_s1.control_volume.scaling_factor' that contains 1\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.air_compressor_s1.properties_isentropic[0.0].scaling_factor' that\n", - " contains 15 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.air_compressor_s1.control_volume.properties_out[0.0].scaling_factor'\n", - " that contains 14 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.air_compressor_s1.control_volume.properties_in[0.0].scaling_factor'\n", - " that contains 28 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_bypass.bypass_outlet_state[0.0].scaling_factor' that contains\n", - " 11 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_bypass.reformer_outlet_state[0.0].scaling_factor' that\n", - " contains 11 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_bypass.mixed_state[0.0].scaling_factor' that contains 11\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.NG_expander.properties_isentropic[0.0].scaling_factor' that contains\n", - " 15 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.NG_expander.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 14 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.NG_expander.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 15 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_recuperator.cold_side.properties_out[0.0].scaling_factor'\n", - " that contains 13 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_recuperator.cold_side.properties_in[0.0].scaling_factor' that\n", - " contains 27 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_recuperator.hot_side.properties_out[0.0].scaling_factor' that\n", - " contains 13 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.reformer_recuperator.hot_side.properties_in[0.0].scaling_factor' that\n", - " contains 13 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix 'fs.reformer_recuperator.scaling_factor'\n", - " that contains 2 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_HRSG.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 11 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_HRSG.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 10 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_HRSG.control_volume.scaling_factor' that contains 1 component\n", - " keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.combustor_expander.properties_isentropic[0.0].scaling_factor' that\n", - " contains 12 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.combustor_expander.control_volume.properties_out[0.0].scaling_factor'\n", - " that contains 10 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.combustor_expander.control_volume.properties_in[0.0].scaling_factor'\n", - " that contains 12 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.combustor_expander.control_volume.scaling_factor' that contains 1\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.combustor.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 13 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.combustor.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 10 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.combustor.control_volume.scaling_factor' that contains 1 component\n", - " keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.combustor_mix.mixed_state[0.0].scaling_factor' that contains 10\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.combustor_mix.cathode_inlet_state[0.0].scaling_factor' that contains\n", - " 10 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.combustor_mix.anode_inlet_state[0.0].scaling_factor' that contains 10\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_exhaust_translator.properties_out[0.0].scaling_factor' that\n", - " contains 11 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_exhaust_translator.properties_in[0.0].scaling_factor' that\n", - " contains 5 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_HRSG.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 8 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_HRSG.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 7 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_HRSG.control_volume.scaling_factor' that contains 1 component\n", - " keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_expander.properties_isentropic[0.0].scaling_factor' that\n", - " contains 9 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_expander.control_volume.properties_out[0.0].scaling_factor'\n", - " that contains 7 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_expander.control_volume.properties_in[0.0].scaling_factor'\n", - " that contains 9 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_expander.control_volume.scaling_factor' that contains 1\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_exhaust_split.combustor_outlet_state[0.0].scaling_factor' that\n", - " contains 5 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_exhaust_split.exhaust_outlet_state[0.0].scaling_factor' that\n", - " contains 5 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_exhaust_split.mixed_state[0.0].scaling_factor' that contains 5\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_blower.properties_isentropic[0.0].scaling_factor' that\n", - " contains 9 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_blower.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 8 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_blower.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 9 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_recycle.recycle_state[0.0].scaling_factor' that contains 5\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_recycle.exhaust_state[0.0].scaling_factor' that contains 5\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_recycle.mixed_state[0.0].scaling_factor' that contains 5\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_heat.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 8 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_heat.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 7 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_translator.properties_out[0.0].scaling_factor' that contains\n", - " 16 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_translator.properties_in[0.0].scaling_factor' that contains 5\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode.ion_outlet_state[0.0].scaling_factor' that contains 5\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode.air_outlet_state[0.0].scaling_factor' that contains 5\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode.mixed_state[0.0].scaling_factor' that contains 5 component\n", - " keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_mix.mixed_state[0.0].scaling_factor' that contains 7 component\n", - " keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_mix.recycle_state[0.0].scaling_factor' that contains 7\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_mix.feed_state[0.0].scaling_factor' that contains 7 component\n", - " keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_hx.cold_side.properties_out[0.0].scaling_factor' that contains\n", - " 8 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_hx.cold_side.properties_in[0.0].scaling_factor' that contains\n", - " 7 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_hx.hot_side.properties_out[0.0].scaling_factor' that contains\n", - " 7 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.cathode_hx.hot_side.properties_in[0.0].scaling_factor' that contains 7\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix 'fs.cathode_hx.hot_side.scaling_factor'\n", - " that contains 1 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix 'fs.cathode_hx.scaling_factor' that\n", - " contains 2 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.air_blower.properties_isentropic[0.0].scaling_factor' that contains 9\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.air_blower.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 8 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.air_blower.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 16 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.recycle_translator.properties_out[0.0].scaling_factor' that contains\n", - " 14 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.recycle_translator.properties_in[0.0].scaling_factor' that contains 8\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_blower.properties_isentropic[0.0].scaling_factor' that contains\n", - " 12 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_blower.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 11 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_blower.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 12 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_recycle.recycle_state[0.0].scaling_factor' that contains 8\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_recycle.exhaust_state[0.0].scaling_factor' that contains 8\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_recycle.mixed_state[0.0].scaling_factor' that contains 8\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode.control_volume.properties_out[0.0].scaling_factor' that contains\n", - " 11 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode.control_volume.properties_in[0.0].scaling_factor' that contains\n", - " 10 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix 'fs.anode.control_volume.scaling_factor'\n", - " that contains 10 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix 'fs.anode.scaling_factor' that contains\n", - " 4 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.fuel_cell_mix.mixed_state[0.0].scaling_factor' that contains 10\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.fuel_cell_mix.ion_inlet_state[0.0].scaling_factor' that contains 10\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.fuel_cell_mix.fuel_inlet_state[0.0].scaling_factor' that contains 10\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_translator.properties_out[0.0].scaling_factor' that contains 8\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_translator.properties_in[0.0].scaling_factor' that contains 11\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.prereformer.control_volume.properties_out[0.0].scaling_factor' that\n", - " contains 13 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.prereformer.control_volume.properties_in[0.0].scaling_factor' that\n", - " contains 13 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.prereformer.control_volume.scaling_factor' that contains 13 component\n", - " keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix 'fs.prereformer.scaling_factor' that\n", - " contains 4 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_hx.cold_side.properties_out[0.0].scaling_factor' that contains\n", - " 13 component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_hx.cold_side.properties_in[0.0].scaling_factor' that contains 13\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix 'fs.anode_hx.cold_side.scaling_factor'\n", - " that contains 1 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_hx.hot_side.properties_out[0.0].scaling_factor' that contains 10\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_hx.hot_side.properties_in[0.0].scaling_factor' that contains 10\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix 'fs.anode_hx.hot_side.scaling_factor'\n", - " that contains 1 component keys that are not exported as part of the NL\n", - " file. Skipping.\n", - "WARNING: model contains export suffix 'fs.anode_hx.scaling_factor' that\n", - " contains 3 component keys that are not exported as part of the NL file.\n", - " Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_mix.mixed_state[0.0].scaling_factor' that contains 13 component\n", - " keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_mix.recycle_state[0.0].scaling_factor' that contains 13\n", - " component keys that are not exported as part of the NL file. Skipping.\n", - "WARNING: model contains export suffix\n", - " 'fs.anode_mix.feed_state[0.0].scaling_factor' that contains 13 component\n", - " keys that are not exported as part of the NL file. Skipping.\n", - "Ipopt 3.13.2: max_iter=50\n", - "tol=0.0001\n", - "bound_push=1e-08\n", - "linear_solver=ma57\n", - "ma57_pivtol=0.001\n", + "Ipopt 3.13.2: max_iter=200\n", + "tol=1e-07\n", + "bound_push=1e-05\n", + "mu_init=0.01\n", + "linear_solver=ma97\n", "nlp_scaling_method=user-scaling\n", - "option_file_name=C:\\Users\\dang\\AppData\\Local\\Temp\\tmpohg_fgrp_ipopt.opt\n", - "\n", - "Using option file \"C:\\Users\\dang\\AppData\\Local\\Temp\\tmpohg_fgrp_ipopt.opt\".\n", "\n", "\n", "******************************************************************************\n", @@ -869,7 +325,7 @@ " computation. See http://www.hsl.rl.ac.uk.\n", "******************************************************************************\n", "\n", - "This is Ipopt version 3.13.2, running with linear solver ma57.\n", + "This is Ipopt version 3.13.2, running with linear solver ma97.\n", "\n", "Number of nonzeros in equality constraint Jacobian...: 759386\n", "Number of nonzeros in inequality constraint Jacobian.: 0\n", @@ -886,68 +342,67 @@ " inequality constraints with only upper bounds: 0\n", "\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", - " 0 0.0000000e+00 1.67e+00 1.00e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n", - " 1 0.0000000e+00 1.68e+02 4.70e+06 -1.0 3.39e+05 - 3.65e-03 1.00e+00f 1\n", - " 2 0.0000000e+00 1.67e+02 4.69e+06 -1.0 6.13e+05 - 2.87e-01 3.00e-03h 1\n", - " 3 0.0000000e+00 1.49e+02 3.77e+06 -1.0 5.96e+05 - 5.87e-01 2.18e-01H 1\n", - " 4 0.0000000e+00 8.40e+01 2.44e+06 -1.0 3.76e+05 - 9.06e-01 4.37e-01h 1\n", - " 5 0.0000000e+00 8.36e+01 2.32e+06 -1.0 5.96e+04 - 9.94e-01 4.75e-02h 1\n", - " 6 0.0000000e+00 5.67e+01 1.34e+06 -1.0 3.66e+04 - 1.00e+00 5.48e-01H 1\n", - " 7 0.0000000e+00 1.77e+00 4.29e+05 -1.0 1.26e+04 - 1.00e+00 1.00e+00H 1\n", - " 8 0.0000000e+00 4.61e-01 1.58e+05 -1.0 1.40e+03 - 1.00e+00 1.00e+00f 1\n", - " 9 0.0000000e+00 1.70e-01 5.81e+04 -1.0 1.43e+03 - 1.00e+00 1.00e+00h 1\n", + " 0 0.0000000e+00 1.61e+00 1.00e+00 -2.0 0.00e+00 - 0.00e+00 0.00e+00 0\n", + " 1 0.0000000e+00 1.23e+00 9.83e+02 -2.0 2.60e+00 - 3.06e-02 1.00e+00f 1\n", + " 2 0.0000000e+00 6.11e-01 3.99e+03 -2.0 1.59e+00 - 9.60e-01 5.04e-01h 1\n", + " 3 0.0000000e+00 4.71e-01 3.04e+03 -2.0 1.52e+00 - 9.90e-01 2.28e-01h 1\n", + " 4 0.0000000e+00 2.30e-03 6.07e+00 -2.0 9.63e-01 - 1.00e+00 1.00e+00h 1\n", + " 5 0.0000000e+00 4.83e-04 3.06e-01 -2.0 2.58e-01 - 1.00e+00 1.00e+00h 1\n", + " 6 0.0000000e+00 2.19e-05 7.45e-02 -2.0 8.17e-02 - 1.00e+00 1.00e+00h 1\n", + " 7 0.0000000e+00 1.11e-04 5.82e+00 -3.0 6.83e-01 - 1.00e+00 1.00e+00H 1\n", + " 8 0.0000000e+00 9.95e-07 1.11e-02 -3.0 2.92e-02 - 1.00e+00 1.00e+00f 1\n", + " 9 0.0000000e+00 1.27e-06 2.77e-04 -3.0 2.14e-02 - 1.00e+00 1.00e+00h 1\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", - " 10 0.0000000e+00 6.24e-02 2.14e+04 -1.0 1.06e+03 - 1.00e+00 1.00e+00h 1\n", - " 11 0.0000000e+00 2.30e-02 7.86e+03 -1.0 1.00e+00 0.0 5.53e-01 1.00e+00h 1\n", - " 12 0.0000000e+00 1.79e-02 6.12e+03 -1.0 2.54e+03 - 1.00e+00 2.50e-01f 3\n", - " 13 0.0000000e+00 1.68e-02 2.25e+03 -1.0 1.85e+03 - 9.04e-01 1.00e+00h 1\n", - " 14 0.0000000e+00 7.34e-03 8.29e+02 -1.0 1.12e+02 - 1.00e+00 1.00e+00h 1\n", - " 15 0.0000000e+00 5.21e-03 3.05e+02 -1.0 6.04e+02 - 1.00e+00 1.00e+00h 1\n", - " 16 0.0000000e+00 5.21e-03 1.47e+06 -1.0 2.54e+01 2.2 5.27e-06 8.21e-07H 1\n", - " 17 0.0000000e+00 1.38e-03 1.75e+02 -1.0 5.54e-01 2.7 1.00e+00 1.00e+00h 1\n", - " 18 0.0000000e+00 5.44e-04 1.56e+05 -1.0 2.08e+00 2.2 5.35e-01 1.00e+00H 1\n", - " 19 0.0000000e+00 6.97e-04 2.71e+05 -1.0 2.48e-01 2.6 2.43e-02 1.00e+00f 1\n", + " 10 0.0000000e+00 5.48e-07 1.46e+03 -4.5 6.14e-02 - 6.18e-01 1.00e+00H 1\n", + " 11 0.0000000e+00 6.02e-07 5.15e+02 -4.5 7.21e-02 - 6.08e-01 1.00e+00h 1\n", + " 12 0.0000000e+00 5.98e-07 1.18e-05 -4.5 1.04e-01 - 1.00e+00 1.00e+00h 1\n", + " 13 0.0000000e+00 5.29e-07 9.32e+02 -6.8 1.06e-01 - 2.12e-01 1.00e+00h 1\n", + " 14 0.0000000e+00 4.55e-07 1.72e+03 -6.8 1.46e-02 - 3.37e-01 1.00e+00h 1\n", + " 15 0.0000000e+00 4.14e-07 2.33e+03 -6.8 6.91e-03 - 5.64e-02 1.00e+00h 1\n", + " 16 0.0000000e+00 3.45e-07 2.90e+03 -6.8 1.01e-04 - 2.14e-01 1.00e+00h 1\n", + " 17 0.0000000e+00 5.97e-07 3.12e+03 -6.8 5.35e-04 - 1.37e-02 1.00e+00h 1\n", + " 18 0.0000000e+00 5.74e-07 3.25e+03 -6.8 1.60e-03 - 8.54e-02 1.00e+00h 1\n", + " 19 0.0000000e+00 5.30e-07 3.49e+03 -6.8 1.34e-03 - 8.76e-02 1.00e+00h 1\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", - " 20 0.0000000e+00 6.97e-04 1.19e+05 -1.0 8.84e-02 2.1 6.98e-01 1.00e+00h 1\n", - " 21 0.0000000e+00 6.86e-04 1.15e+05 -1.0 8.39e+03 - 3.71e-02 1.56e-02f 7\n", - " 22 0.0000000e+00 6.65e-04 7.09e+04 -1.0 8.17e+03 - 3.85e-01 3.12e-02f 6\n", - " 23 0.0000000e+00 6.54e-04 6.97e+04 -1.0 7.73e+03 - 2.01e-02 1.56e-02f 7\n", - " 24 0.0000000e+00 6.49e-04 7.20e+04 -1.0 7.53e+03 - 1.70e-01 7.81e-03f 8\n", - " 25 0.0000000e+00 6.39e-04 6.85e+04 -1.0 7.43e+03 - 7.02e-02 1.56e-02f 7\n", - " 26 0.0000000e+00 2.53e-03 5.60e+04 -1.0 7.23e+03 - 8.68e-01 2.50e-01f 3\n", - " 27 0.0000000e+00 2.39e-04 3.14e+03 -1.0 4.19e+03 - 6.72e-01 1.00e+00H 1\n", - " 28 0.0000000e+00 1.78e-05 1.20e+02 -1.0 6.59e-03 1.7 9.48e-01 1.00e+00h 1\n", + " 20 0.0000000e+00 7.79e-07 3.66e+03 -6.8 1.62e-04 - 1.95e-01 1.00e+00h 1\n", + " 21 0.0000000e+00 9.49e-07 3.26e+02 -6.8 1.01e-04 - 2.10e-01 1.00e+00h 1\n", + " 22 0.0000000e+00 9.34e-08 1.84e+02 -6.8 8.77e-05 - 4.61e-01 1.00e+00h 1\n", + "Cannot recompute multipliers for feasibility problem. Error in eq_mult_calculator\n", "\n", - "Number of Iterations....: 28\n", + "Number of Iterations....: 22\n", "\n", " (scaled) (unscaled)\n", "Objective...............: 0.0000000000000000e+00 0.0000000000000000e+00\n", - "Dual infeasibility......: 0.0000000000000000e+00 0.0000000000000000e+00\n", - "Constraint violation....: 1.7770481779855499e-05 1.7770481779855499e-05\n", + "Dual infeasibility......: 5.3733521937880550e+02 5.3733521937880549e+04\n", + "Constraint violation....: 9.3390433969156556e-08 9.3390433969156556e-08\n", "Complementarity.........: 0.0000000000000000e+00 0.0000000000000000e+00\n", - "Overall NLP error.......: 1.7770481779855499e-05 1.7770481779855499e-05\n", + "Overall NLP error.......: 9.3390433969156556e-08 5.3733521937880549e+04\n", "\n", "\n", - "Number of objective function evaluations = 93\n", - "Number of objective gradient evaluations = 29\n", - "Number of equality constraint evaluations = 93\n", + "Number of objective function evaluations = 27\n", + "Number of objective gradient evaluations = 23\n", + "Number of equality constraint evaluations = 27\n", "Number of inequality constraint evaluations = 0\n", - "Number of equality constraint Jacobian evaluations = 29\n", + "Number of equality constraint Jacobian evaluations = 23\n", "Number of inequality constraint Jacobian evaluations = 0\n", - "Number of Lagrangian Hessian evaluations = 28\n", - "Total CPU secs in IPOPT (w/o function evaluations) = 41.744\n", - "Total CPU secs in NLP function evaluations = 2.465\n", + "Number of Lagrangian Hessian evaluations = 22\n", + "Total CPU secs in IPOPT (w/o function evaluations) = 13.452\n", + "Total CPU secs in NLP function evaluations = 2.432\n", "\n", - "EXIT: Optimal Solution Found.\n" + "EXIT: Optimal Solution Found.\n", + "addfunc: duplicate function cubic_root_l\n", + "addfunc: duplicate function cubic_root_h\n", + "addfunc: duplicate function cubic_root_l_nan\n", + "addfunc: duplicate function cubic_root_h_nan\n", + "addfunc: duplicate function cubic_root_l_ext\n", + "addfunc: duplicate function cubic_root_h_ext\n", + "addfunc: duplicate function cbrt\n", + "addfunc: duplicate function x_over_exp_x_minus_one\n" ] } ], "source": [ "# After the initial solve, setup the flowsheet to be controlled by changing the ROM inputs\n", - "# from solved state, re-solving with new inputs takes ~ 30 minutes\n", - "\n", - "# to ensure overall convergence and discourage local minimia that end in solver loops,\n", - "# we take a similar approach as the flowsheet solve and only calculate 25 iterations at a time\n", "\n", "# current density\n", "m.fs.SOFC.current_density.fix(4000)\n", @@ -982,32 +437,15 @@ "m.fs.SOFC.deltaT_cell.unfix()\n", "m.fs.SOFC.air_util.fix(0.4488)\n", "\n", - "from idaes.core.util.model_statistics import degrees_of_freedom\n", - "\n", "print(\"DOF = \", degrees_of_freedom(m))\n", "print()\n", - "solver = pyo.SolverFactory(\"ipopt\")\n", - "solver.options = {\n", - " \"max_iter\": 50,\n", - " \"tol\": 1e-4,\n", - " \"bound_push\": 1e-8,\n", - " \"linear_solver\": \"ma57\",\n", - " \"ma57_pivtol\": 1e-3,\n", - " \"OF_ma57_automatic_scaling\": \"yes\",\n", - " \"nlp_scaling_method\": \"user-scaling\",\n", - "}\n", - "solve_iteration = 0\n", - "for i in range(1, 10): # keep looping until condition is met\n", - " solve_iteration += 1\n", - " print(\"Solve # \", solve_iteration)\n", - " status = solver.solve(m, tee=True)\n", - " if \"Optimal Solution Found\" in status.solver.message:\n", - " break" + "\n", + "status = solver_ma97.solve(m, tee=True)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": { "tags": [ "testing" @@ -1032,9 +470,9 @@ "\n", "import pytest\n", "\n", - "assert pytest.approx(660.608, rel=1e-5) == value(m.fs.net_power)\n", - "assert pytest.approx(0.625588, rel=1e-5) == value(m.fs.HHV_efficiency)\n", - "assert pytest.approx(291.249, rel=1e-5) == value(m.fs.CO2_emissions)\n", + "assert pytest.approx(659.8, rel=1e-1) == value(m.fs.net_power)\n", + "assert pytest.approx(0.6248, rel=1e-4) == value(m.fs.HHV_efficiency)\n", + "assert pytest.approx(291.2, rel=1e-1) == value(m.fs.CO2_emissions)\n", "\n", "print(\"Problem solved successfully\")" ] @@ -1047,16 +485,16 @@ "\n", "The results of the simulation can be viewed in the SVG file below.\n", "\n", - "It can be seen from the figure that the bulk of the power generated by the NGFC plant is from the SOFCs (542.6 MW). The steam turbine and natural gas expander both contribute smaller amounts at 107.3 and 21.1 MW, respectively. The auxiliary load from the recycle blowers and air compressors is only 10.4 MW. The net power of the system is 660.6 MW.\n", + "It can be seen from the figure that the bulk of the power generated by the NGFC plant is from the SOFCs (541.9 MW). The steam turbine and natural gas expander both contribute smaller amounts at 107.1 and 21.1 MW, respectively. The auxiliary load from the recycle blowers and air compressors is only 10.3 MW. The net power of the system is 659.8 MW.\n", "\n", - "The higher heating value of the natural gas feed is 908,839 J/mol. Multiplying by the inlet flowrate of 1,161 mol/s gives a total thermal input of 1056 MW. Based on the thermal input and the net generation the efficiency is 62.56%. The carbon emissions are 291.2 g/kWh.\n", + "The higher heating value of the natural gas feed is 908,839 J/mol. Multiplying by the inlet flowrate of 1,161 mol/s gives a total thermal input of 1056 MW. Based on the thermal input and the net generation the efficiency is 62.48%. The carbon emissions are 291.2 g/kWh.\n", "\n", - "The results also show the closure of the energy balance around the SOFC. The heat duty of the anode is -673.92 MW and the duty of the cathode is 114.57 MW. When added together they produce the DC stack power with an absolute value of 559.3 MW." + "The results also show the closure of the energy balance around the SOFC. The heat duty of the anode is -673.0 MW and the duty of the cathode is 114.3 MW. When added together they produce the DC stack power with an absolute value of 558.7 MW." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -1070,16 +508,16 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ - "image/svg+xml\n", - "\t\n", + "image/svg+xml\n", + "\t\n", "\t\t\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\t\n", "\t\t\n", "\t\n", @@ -1151,434 +589,434 @@ "\t\n", "\n", "\t\n", - "\t\t\n", - "\t\t\t\n", + "\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\n", + "\t\n", "\t\n", "\t\t\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", "\t\t\n", "\t\n", "\t\n", "\t\tFor SVG HRSG\n", - "\t\t\n", + "\t\t\n", "\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.1\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.2\n", "\t\t\tSteam\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tSteam\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tSteam\t\t\n", + "\t\t\n", "\t\t\tSheet.3\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.4\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.5\n", "\t\t\tSOFC Stack\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tSOFC Stack\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tSOFC Stack\t\t\n", + "\t\t\n", "\t\t\tSheet.6\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.7\n", "\t\t\tAir\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tAir\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tAir\t\t\n", + "\t\t\n", "\t\t\tSheet.8\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.9\n", "\t\t\tCathode\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tCathode\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tCathode\t\t\n", + "\t\t\n", "\t\t\tSheet.10\n", "\t\t\tElectrolyte\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tElectrolyte\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tElectrolyte\t\t\n", + "\t\t\n", "\t\t\tSheet.11\n", "\t\t\tAnode\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tAnode\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tAnode\t\t\n", + "\t\t\n", "\t\t\tAC source\n", "\t\t\t\n", - "\t\t\t\t\n", - "\t\t\t\t\n", - "\t\t\t\t\n", - "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\t\n", - "\t\t\t\t\n", - "\t\t\t\t\n", - "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", "\t\t\t\n", "\t\t\tInverter\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\t\tSheet.14\n", "\t\t\t\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\t\tSheet.15\n", "\t\t\t\t1\n", - "\t\t\t\t\n", - "\t\t\t\t\n", - "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.16\n", "\t\t\tInverter\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tInverter\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tInverter\t\t\n", + "\t\t\n", "\t\t\tSheet.17\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.18\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.19\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.20\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.21\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.122\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.23\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.124\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.125\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.26\n", "\t\t\tAC\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tAC\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tAC\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.127\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.29\n", "\t\t\tCathode Blower\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tCathode Blower\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tCathode Blower\t\t\n", + "\t\t\n", "\t\t\tSheet.31\n", "\t\t\tCathode HTX\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tCathode HTX\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tCathode HTX\t\t\n", + "\t\t\n", "\t\t\tSheet.32\n", "\t\t\tAutothermal\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tAutothermal\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tAutothermal\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.78\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.134\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.35\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.136\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.138\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.137\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.139\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.40\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.41\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.43\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.144\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.109\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.110\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.50\n", "\t\t\tPreheat\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tPreheat\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tPreheat\t\t\n", + "\t\t\n", "\t\t\tSheet.51\n", "\t\t\tAutothermal Reformer\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tAutothermal Reformer\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tAutothermal Reformer\t\t\n", + "\t\t\n", "\t\t\tSheet.52\n", "\t\t\tAnode HTX\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tAnode HTX\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tAnode HTX\t\t\n", + "\t\t\n", "\t\t\tSheet.53\n", "\t\t\tCombustor\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tCombustor\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tCombustor\t\t\n", + "\t\t\n", "\t\t\tSheet.54\n", "\t\t\tNatural Gas\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tNatural Gas\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tNatural Gas\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.155\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.62\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.64\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.167\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.66\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.67\n", "\t\t\tAir\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tAir\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tAir\t\t\n", + "\t\t\n", "\t\t\tSheet.68\n", "\t\t\tHeat Recovery Steam Generator\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tHeat Recovery Steam Generator\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tHeat Recovery Steam Generator\t\t\n", + "\t\t\n", "\t\t\tSheet.69\n", "\t\t\tSteam Turbine Generator\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tSteam Turbine Generator\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tSteam Turbine Generator\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.154\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tAC source.160\n", "\t\t\t\n", - "\t\t\t\t\n", - "\t\t\t\t\n", - "\t\t\t\t\n", - "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.72\n", "\t\t\tAC\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tAC\t\t\n", - "\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tAC\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.170\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.172\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.191\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.192\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.132\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.193\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.42\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tDynamic connector.96\n", - "\t\t\t\n", + "\t\t\t\n", "\t\t\n", - "\t\t\n", + "\t\t\n", "\t\t\tSheet.98\n", "\t\t\tPre-Reformer\n", "\t\t\t\n", - "\t\t\t\n", - "\t\t\t\n", - "\t\t\tPre-Reformer\t\t\n", + "\t\t\t\n", + "\t\t\t\n", + "\t\t\tPre-Reformer\t\t\n", "\t\n", - "621 K137 kPaSYN_INT:P:3,642 mol/sF:979 K137 kPaANODE_RECT:P:4,084 mol/sF:890 K105 kPaCATH_INT:P:34,197 mol/sF:998 K104 kPaCATH_OUTT:P:32,525 mol/sF:998 K104 kPaCATH_HX_HIT:P:16,262 mol/sF:288 K101 kPaAIRT:P:17,934 mol/sF:834 K137 kPaANODE_INT:P:8,041 mol/sF:978 K137 kPaANO_HX_HIT:P:5,084 mol/sF:825 K136 kPaANO_HX_HOT:P:5,084 mol/sF:814 K137 kPaANO_HX_CIT:P:7,727 mol/sF:978 K137 kPaANODE_OUTT:P:9,169 mol/sF:476 K102 kPaCATH_HX_HOT:P:16,262 mol/sF:1,002 K105 kPaCATH_RECT:P:16,262 mol/sF:297 K111 kPaCATH_HX_CIT:P:17,934 mol/sF:787 K105 kPaCATH_HX_COT:P:17,934 mol/sF:348.30.6617.3ROM InputsFuel Inlet Temperature (C):Internal Reformation fraction:Air Inlet Temperature (C):4,000Avg. Curent Density (A/m^2):0.5Air Recirculation fraction:2.1Oxygen to Carbon ratio:Fuel Utilization fraction:Air Utilization fraction:0.80.449559.3ROM OutputsDC Stack Power (MW):0.8668Stack Voltage (V):30.6265.17-673.92Heat Duties (MW)Anode Heat Exchanger:Cathode Heat Exchanger:Anode:48.1Reformer Recuperator:114.57Cathode:422 K206 kPaSTEAM_INT:P:464 mol/sF:310 K203 kPaAIR_INT:P:1,333 mol/sF:747 K206 kPaREF_INT:P:465 mol/sF:288 K3,447 kPaFUEL_INT:P:1,161 mol/sF:1,060 K137 kPaREF_OUTT:P:2,944 mol/sF:1,265 K95 kPaCOMB_OUTT:P:9,545 mol/sF:405 K94 kPaANOD_EXHT:P:9,546 mol/sF:476 K102 kPaCOMB_AIRT:P:4,878 mol/sF:405 K101 kPaCATH_EXHT:P:11,384 mol/sF:476 K102 kPaCATH_HRSG_INT:P:11,384 mol/sF:107.321.110.4Performance SummarySteam Turbine Power (MW):NG Expander Power (MW):Auxiliary Load (MW):542.6AC Stack Power (MW):660.6Net Power (MW):Thermal Input (MW):HHV Efficiency (%):CO2 Emissions (g/kWh):1,056.0291.262.561,012 K3,447 kPaHOT_FUELT:P:1,161 mol/sF:" + "621 K137 kPaSYN_INT:P:3,642 mol/sF:979 K137 kPaANODE_RECT:P:4,084 mol/sF:890 K105 kPaCATH_INT:P:34,197 mol/sF:998 K104 kPaCATH_OUTT:P:32,525 mol/sF:998 K104 kPaCATH_HX_HIT:P:16,262 mol/sF:288 K101 kPaAIRT:P:17,934 mol/sF:834 K137 kPaANODE_INT:P:8,041 mol/sF:978 K137 kPaANO_HX_HIT:P:5,084 mol/sF:825 K136 kPaANO_HX_HOT:P:5,084 mol/sF:814 K137 kPaANO_HX_CIT:P:7,727 mol/sF:978 K137 kPaANODE_OUTT:P:9,169 mol/sF:476 K102 kPaCATH_HX_HOT:P:16,262 mol/sF:1,002 K105 kPaCATH_RECT:P:16,262 mol/sF:297 K111 kPaCATH_HX_CIT:P:17,934 mol/sF:787 K105 kPaCATH_HX_COT:P:17,934 mol/sF:348.30.6617.3ROM InputsFuel Inlet Temperature (C):Internal Reformation fraction:Air Inlet Temperature (C):4,000Avg. Current Density (A/m^2):0.5Air Recirculation fraction:2.1Oxygen to Carbon ratio:Fuel Utilization fraction:Air Utilization fraction:0.80.449559.3ROM OutputsDC Stack Power (MW):0.8668Stack Voltage (V):30.6265.17-673.92Heat Duties (MW)Anode Heat Exchanger:Cathode Heat Exchanger:Anode:48.1Reformer Recuperator:114.57Cathode:422 K206 kPaSTEAM_INT:P:464 mol/sF:310 K203 kPaAIR_INT:P:1,333 mol/sF:747 K206 kPaREF_INT:P:465 mol/sF:288 K3,447 kPaFUEL_INT:P:1,161 mol/sF:1,060 K137 kPaREF_OUTT:P:2,944 mol/sF:1,265 K95 kPaCOMB_OUTT:P:9,545 mol/sF:405 K94 kPaANOD_EXHT:P:9,546 mol/sF:476 K102 kPaCOMB_AIRT:P:4,878 mol/sF:405 K101 kPaCATH_EXHT:P:11,384 mol/sF:476 K102 kPaCATH_HRSG_INT:P:11,384 mol/sF:107.321.110.4Performance SummarySteam Turbine Power (MW):NG Expander Power (MW):Auxiliary Load (MW):542.6AC Stack Power (MW):660.6Net Power (MW):Thermal Input (MW):HHV Efficiency (%):CO2 Emissions (g/kWh):1,056.0291.262.561,012 K3,447 kPaHOT_FUELT:P:1,161 mol/sF:" ], "text/plain": [ "" @@ -1608,7 +1046,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -1622,7 +1060,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.12" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/idaes_examples/archive/power_gen/rsofc/cpu.py b/idaes_examples/archive/power_gen/rsofc/cpu.py index c7c6d9fe..346d24de 100644 --- a/idaes_examples/archive/power_gen/rsofc/cpu.py +++ b/idaes_examples/archive/power_gen/rsofc/cpu.py @@ -254,7 +254,7 @@ def make_vars(self): doc="Vent temperature [K]", ) - # Pressue [Pa] + # Pressure [Pa] self.inlet_pressure = Var( self.flowsheet().config.time, initialize=17, @@ -283,7 +283,7 @@ def make_vars(self): def add_material_balances(self): """ This section is for material balance constraints""" - # Sum of all componenet mole fractions in a stream equals 1 + # Sum of all components mole fractions in a stream equals 1 @self.Constraint( self.flowsheet().config.time, doc="PureCO2 stream: component mole flow equation", @@ -640,7 +640,7 @@ def initialize(blk, outlvl=idaeslog.NOTSET, solver=None, optarg=None): outlvl : sets output level of initialisation routine optarg : solver options dictionary object (default={'tol': 1e-6}) - solver : str indicating whcih solver to use during + solver : str indicating which solver to use during initialization (default = 'ipopt') Returns: diff --git a/idaes_examples/archive/power_gen/rsofc/rsofc_soec_flowsheet.py b/idaes_examples/archive/power_gen/rsofc/rsofc_soec_flowsheet.py index 9cc0e89c..5a229bbf 100644 --- a/idaes_examples/archive/power_gen/rsofc/rsofc_soec_flowsheet.py +++ b/idaes_examples/archive/power_gen/rsofc/rsofc_soec_flowsheet.py @@ -202,7 +202,7 @@ def add_asu(fs): fs.intercooler_s2.outlet.temperature.fix(310.93) # K (100 F) fs.intercooler_s2.deltaP.fix(-3447) # Pa (-0.5 psi) - # air seperation unit + # air separation unit fs.ASU.split_fraction[0, "O2_outlet", "CO2"].fix(1e-10) fs.ASU.split_fraction[0, "O2_outlet", "H2O"].fix(1e-10) fs.ASU.split_fraction[0, "O2_outlet", "N2"].fix(0.0005) @@ -401,7 +401,7 @@ def add_aux_boiler_steam(fs): ) # enthalpy outlet fs.bhx2.outlet.enth_mol.fix( h_bhx2 - ) # K (100 F) # unfix after initalize and spec Q from cmb + ) # K (100 F) # unfix after initialize and spec Q from cmb fs.bhx1.overall_heat_transfer_coefficient.fix(100) fs.bhx1.delta_temperature_out.fix(10) # fix DT for pinch side @@ -1407,7 +1407,7 @@ def set_guess(fs): fs.preheat_split.inlet, F=7765, T=700, P=1.04e5, comp=comp_guess, fix=True ) - # Set guess for temp, pressure and mole frac conditions to initalize soec + # Set guess for temp, pressure and mole frac conditions to initialize soec fs.soec_stack.fuel_inlet.flow_mol[0].fix(5600) fs.soec_stack.fuel_inlet.temperature[0].fix(1023.15) fs.soec_stack.fuel_inlet.pressure[0].fix(1.01325e5) diff --git a/idaes_examples/archive/power_gen/rsofc/rsofc_soec_mode_PFD.svg b/idaes_examples/archive/power_gen/rsofc/rsofc_soec_mode_PFD.svg index 4cb35a9d..7b7bdd24 100644 --- a/idaes_examples/archive/power_gen/rsofc/rsofc_soec_mode_PFD.svg +++ b/idaes_examples/archive/power_gen/rsofc/rsofc_soec_mode_PFD.svg @@ -753,7 +753,7 @@ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.82222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" id="tspan104298">compression + id="tspan124110">compression compression + id="tspan124110">compression Nitrogen ASU - Hydrogen purification andcompression + Hydrogen purification andcompression Water_in Water_out1 Water_out2 diff --git a/idaes_examples/archive/power_gen/rsofc/rsofc_soec_src.ipynb b/idaes_examples/archive/power_gen/rsofc/rsofc_soec_src.ipynb index d2d078fe..85c5c931 100644 --- a/idaes_examples/archive/power_gen/rsofc/rsofc_soec_src.ipynb +++ b/idaes_examples/archive/power_gen/rsofc/rsofc_soec_src.ipynb @@ -193,7 +193,7 @@ " Nitrogen\n", " ASU\n", " \n", - " Hydrogen purification andcompression\n", + " Hydrogen purification andcompression\n", " Water_in\n", " Water_out1\n", " Water_out2\n", diff --git a/idaes_examples/archive/power_gen/soec/soec.ipynb b/idaes_examples/archive/power_gen/soec/soec.ipynb index 35aec23e..1dedf2ab 100644 --- a/idaes_examples/archive/power_gen/soec/soec.ipynb +++ b/idaes_examples/archive/power_gen/soec/soec.ipynb @@ -1493,7 +1493,7 @@ " \n", " Summary:\n", " \n", - " SOEC Electric Power:SOEC Current:Cell Potential:Number of cells:SOEC Power/H2:H2 Product Rate:Single-pass H2O coversion:Sweep Blower Power:Feed Heater Power:Sweep Heater Power:Heat Pump Power:Heat Pump Water Draw:Compressor Power:Total electric Power:Total Power/H2:\n", + " SOEC Electric Power:SOEC Current:Cell Potential:Number of cells:SOEC Power/H2:H2 Product Rate:Single-pass H2O conversion:Sweep Blower Power:Feed Heater Power:Sweep Heater Power:Heat Pump Power:Heat Pump Water Draw:Compressor Power:Total electric Power:Total Power/H2:\n", " \n", " 638.539 MW\n", " -478.598 MA\n", @@ -3579,7 +3579,7 @@ " \n", " Summary:\n", " \n", - " SOEC Electric Power:SOEC Current:Cell Potential:Number of cells:SOEC Power/H2:H2 Product Rate:Single-pass H2O coversion:Sweep Blower Power:Feed Heater Power:Sweep Heater Power:Heat Pump Power:Heat Pump Water Draw:Compressor Power:Total electric Power:Total Power/H2:\n", + " SOEC Electric Power:SOEC Current:Cell Potential:Number of cells:SOEC Power/H2:H2 Product Rate:Single-pass H2O conversion:Sweep Blower Power:Feed Heater Power:Sweep Heater Power:Heat Pump Power:Heat Pump Water Draw:Compressor Power:Total electric Power:Total Power/H2:\n", " \n", " 638.539 MW\n", " -478.598 MA\n", diff --git a/idaes_examples/archive/power_gen/soec/soec.py b/idaes_examples/archive/power_gen/soec/soec.py index 9b13fa0b..96c82a32 100644 --- a/idaes_examples/archive/power_gen/soec/soec.py +++ b/idaes_examples/archive/power_gen/soec/soec.py @@ -1558,13 +1558,13 @@ def _add_tags(self): display_units=pyo.units.MW, ) tag_group["total_electric_power"] = iutil.ModelTag( - doc="Total electric power for SOEC and auxilaries", + doc="Total electric power for SOEC and auxiliaries", expr=self.total_electric_power[0], format_string="{:.3f}", display_units=pyo.units.MW, ) tag_group["total_electric_power_per_h2"] = iutil.ModelTag( - doc="Total electric power for SOEC and auxilaries per H2 produced", + doc="Total electric power for SOEC and auxiliaries per H2 produced", expr=self.total_electric_power_per_h2[0], format_string="{:.3f}", display_units=pyo.units.MJ / pyo.units.kg, diff --git a/idaes_examples/archive/power_gen/soec/soec_standalone_template.svg b/idaes_examples/archive/power_gen/soec/soec_standalone_template.svg index 5eb48e41..23203ac6 100644 --- a/idaes_examples/archive/power_gen/soec/soec_standalone_template.svg +++ b/idaes_examples/archive/power_gen/soec/soec_standalone_template.svg @@ -3684,7 +3684,7 @@ x="11.245358" y="153.43445" style="text-align:end;text-anchor:end;stroke-width:0.264583" - id="tspan1177">Single-pass H2O coversion:Single-pass H2O conversion:" ] @@ -1871,7 +1871,7 @@ "outputs": [ { "data": { - "image/png": "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Vq0aN910EwCFChWiXr16bN26lbVr1/Lss8+yYsUKUlJSLu7woqKiGD58OKdOneLMmTP06NHjD/GcOXOGX375hXvuuediW2Ji4sXhe+655w9JBODgwYNUrvy/qtMdO3bk2WefpX///vTt25egoKB01z29dQwKCuKFF15gxYoVFChQgP3793P48GEAateuTbNmzQBo2rQpXbt2RURo1qwZe/bsubjsKlWqcODAAR8+AY9169bRpUuXi+vQv39/VqxYwR133MGZM2eIj49n3759/O1vf2PFihWsXLmSvn37Xpzf+zRZdmxnY9Jz4NR5hs+N4qfoI7SsWY437wql/jWlczSGnL5qqwHQSUReAxKAf6nqOqA6niOONLFOW5IzfHk7zs99AKqaLCJxQEXg2OVvKiKD8RzVULNmzexcH79QVWbNmkXDhg3/0P7BBx/8YSe0cOHCDO8t6NSpE4sWLaJw4cJ069aNgQMHkpKScjFJDRw4kLlz59K8eXOmTJnCsmXL/rCM1NRUypUrx8aNG9N9j5IlS6bbXrx48UtunBs6dCi9evVi4cKFtG/fniVLlqS77umt45QpUzh69Cjr16+ncOHCBAcHX1x20aJFL05XoECBi78XKFDgkn6bhIQEihcvnm6s6cnsO0mHDh349NNPadiwIZ06dWLy5MmsXr36klN73tslO7azMd5SU5Uv1+5l9KJoUlKVl25rwoDrgilYIOfvM8rpzvZCQHmgPfAcMF08e8D01lwzaecK4y5tVJ2gqmGqGub9DTlQ9ejRgw8++ODijizt9FSPHj345JNPSEpKAjynlM6ePUvnzp356quvSElJ4eDBgyxduvTisjp37sy7775Lhw4dqFy5MsePHyc6OpqmTT1HXvHx8VStWpWkpKRLOvpLly5NfHw8AGXKlKF27drMmDED8OxgN23adMX1aNy4MTExMRd/37lzJ82aNWPIkCGEhYURHR19yftkto5xcXFUqVKFwoULs3TpUn7/PcNHI2Ro+/btl5xqu5J27dqxfPlyjh07RkpKCtOmTeOGG24APNt17NixdO7cmZYtW7J06VKKFi1K2bJl012WP7ezyX92HztLv4lrGD43ihY1yrH4n50ZdH1tV5II5HwiiQVmq8daIBWo5LTX8JouCDjgtAel0473PCJSCCgLnPBr9DlkxIgRJCUlERoaSkhICCNG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\n", + "image/png": "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Vq0aN910EwCFChWiXr16bN26lbVr1/Lss8+yYsUKUlJSLu7woqKiGD58OKdOneLMmTP06NHjD/GcOXOGX375hXvuuediW2Ji4sXhe+655w9JBODgwYNUrvy/qtMdO3bk2WefpX///vTt25egoKB01z29dQwKCuKFF15gxYoVFChQgP3793P48GEAateuTbNmzQBo2rQpXbt2RURo1qwZe/bsubjsKlWqcODAAR8+AY9169bRpUuXi+vQv39/VqxYwR133MGZM2eIj49n3759/O1vf2PFihWsXLmSvn37Xpzf+zRZdmxnY9Jz4NR5hs+N4qfoI7SsWY437wql/jWlczSGnL5qqwHQSUReAxKAf6nqOqA6niOONLFOW5IzfHk7zs99AKqaLCJxQEXg2OVvKiKD8RzVULNmzexcH79QVWbNmkXDhg3/0P7BBx/8YSe0cOHCDO8t6NSpE4sWLaJw4cJ069aNgQMHkpKScjFJDRw4kLlz59K8eXOmTJnCsmXL/rCM1NRUypUrx8aNG9N9j5IlS6bbXrx48UtunBs6dCi9evVi4cKFtG/fniVLlqS77umt45QpUzh69Cjr16+ncOHCBAcHX1x20aJFL05XoECBi78XKFDgkn6bhIQEihcvnm6s6cnsO0mHDh349NNPadiwIZ06dWLy5MmsXr36klN73tslO7azMd5SU5Uv1+5l9KJoUlKVl25rwoDrgilYIOfvM8rpzvZCQHmgPfAcMF08e8D01lwzaecK4y5tVJ2gqmGqGub9DTlQ9ejRgw8++ODijizt9FSPHj345JNPSEpKAjynlM6ePUvnzp356quvSElJ4eDBgyxduvTisjp37sy7775Lhw4dqFy5MsePHyc6OpqmTT1HXvHx8VStWpWkpKRLOvpLly5NfHw8AGXKlKF27drMmDED8OxgN23adMX1aNy4MTExMRd/37lzJ82aNWPIkCGEhYURHR19yftkto5xcXFUqVKFwoULs3TpUn7/PcNHI2Ro+/btl5xqu5J27dqxfPlyjh07RkpKCtOmTeOGG24APNt17NixdO7cmZYtW7J06VKKFi1K2bJl012WP7ezyX92HztLv4lrGD43ihY1yrH4n50ZdH1tV5II5HwiiQVmq8daIBWo5LTX8JouCDjgtAel0473PCJSCCgLnPBr9DlkxIgRJCUlERoaSkhICCNG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", "text/plain": [ "
" ] @@ -1907,7 +1907,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZgAAAEGCAYAAABYV4NmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA5CklEQVR4nO3dd3gV1dbA4d9KgdAChCJIC016Dx0CiAIWmoCCKCAoUu1+6pUrXNu9NkSkiTRBRGwooNJUWggldKQjKAGkhRI6gfX9cSZ6iCkHyMlJWe/znCeTPbNn1pmTZGXPntlbVBVjjDEmtfn5OgBjjDGZkyUYY4wxXmEJxhhjjFdYgjHGGOMVlmCMMcZ4RYCvA0gvChYsqKGhob4OwxhjMpS1a9ceU9VCia2zBOMIDQ0lKirK12EYY0yGIiK/J7XOLpEZY4zxCkswxhhjvMISjDHGGK+wPhhjsqDLly8THR3NhQsXfB2KySCCgoIoXrw4gYGBHtexBGNMFhQdHU2ePHkIDQ1FRHwdjknnVJXjx48THR1N6dKlPa5nl8iMyYIuXLhAgQIFLLkYj4gIBQoUuO4WryUYY7IoSy7metzIz4vXEoyITBKRIyKyxa2shohEishmEZkjIsEJ6pQUkTMi8pxbWR1n+90iMlKcdyki2UVkplO+SkRC3er0FJFdzqunt94juJqOb/6wjTX7YrCpD4wx5m/ebMFMAdokKJsAvKiq1YBZwPMJ1r8P/JigbCzQFyjvvOL32Qc4oarlnHpvAYhICDAUqA/UA4aKSP5UeD+J+iPmHJ+t+oMu4yK58/2lTFy+l5PnLnnrcMYYYNy4cUydOjVV9hUaGsqxY8eS3ebNN9+85vtGjRqlyrG3b99OzZo1qVWrFnv27CF37typsl9PjBgxgnPnznn1GF5LMKq6FIhJUFwBWOosLwQ6xa8QkQ7Ab8CvbmVFgWBVjVRX82Aq0MFZ3R74xFn+CmjptG5aAwtVNUZVTzjHSZjoUk2pArlY/XJL3u5UndzZA3ht7lbqvfkTT32+nlW/HbdWjTEpUFWuXr16XXX69etHjx49/lEeFxeXWmFdI2GCWbFiRars99tvv6V9+/asX7+esmXLpso+46V0XjN0gknCFqCds9wFKAEgIrmAF4D/JNi+GBDt9n20Uxa/bj+AqsYBp4AC7uWJ1LmGiPQVkSgRiTp69OgNviXImS2A++uW4NuBjfnhiaZ0rVuCn7Yd4YHxK2k5fAkTlv1GzFlr1RgTb9++fVSqVIkBAwZQu3Zt9u/fzzvvvEPdunWpXr06Q4cO/WvbqVOnUr16dWrUqMHDDz8MwLBhw3j33XcBaN68Of/6179o1qwZH3zwAWvWrKFRo0bUqFGDevXqERsby5QpUxg0aNBf+7z33ntZvHjxP+Lq0KEDderUoUqVKowfPx6AF198kfPnz1OzZk26d+8O8FdLQ1V5/vnnqVq1KtWqVWPmzJkALF68mObNm9O5c2cqVqxI9+7d//HP5g8//MCIESOYMGECLVq0uGZdUvsdMGAAs2fPBqBjx4707t0bgIkTJzJkyJBEz2v//v0JCwujSpUqf53XkSNHcvDgQVq0aPHXsRcsWEDDhg2pXbs2Xbp04cyZM9f1mSYmrW9T7g2MFJFXgNlA/F/d/wDvq+qZBB1JifUqaQrrkqtzbaHqeGA8QFhYWKo0NSrfGsyr7avy4l0V+X7TIWas/oPXv9/G2/N20KZqEbrVK0mDMiHWwWrSjf/M+ZWtB0+n6j4r3xrM0LZVkt1mx44dTJ48mTFjxrBgwQJ27drF6tWrUVXatWvH0qVLKVCgAG+88QYREREULFiQmJiEF0VcTp48yZIlS7h06RIVK1Zk5syZ1K1bl9OnT5MjRw6P4540aRIhISGcP3+eunXr0qlTJ/73v/8xatQoNmzY8I/tv/nmGzZs2MDGjRs5duwYdevWJTw8HID169fz66+/cuutt9K4cWMiIiJo0qTJX3Xvvvtu+vXrR+7cuXnuuec82m94eDjLli2jXbt2HDhwgEOHDgGwfPlyunbt+o/zCvDGG28QEhLClStXaNmyJZs2beKJJ55g+PDh/PLLLxQsWJBjx47x+uuvs2jRInLlysVbb73F8OHDeeWVVzw+d4lJ0wSjqtuBVgAichtwj7OqPtBZRN4G8gFXReQC8DVQ3G0XxYGDznI0rhZQtIgEAHlxXZKLBponqLM49d9N8nJmC6BLWAm6hJVg+5+n+Xz1fr5eF83sjQcpUzAXXeuVoFPt4hTInT2tQzMmXShVqhQNGjQAXP89L1iwgFq1agFw5swZdu3axcaNG+ncuTMFCxYEICQkJNF9PfDAA4Drj2vRokWpW7cuAMHBwYlun5SRI0cya9YsAPbv38+uXbsoUKBAktsvX76cbt264e/vzy233EKzZs1Ys2YNwcHB1KtXj+LFXX++atasyb59+65JMMlJar9NmzZlxIgRbN26lcqVK3PixAkOHTpEZGQkI0eO5Pjx49ecV4AvvviC8ePHExcXx6FDh9i6dSvVq1e/5ngrV65k69atNG7cGIBLly7RsGHD6zp3iUnTBCMihVX1iIj4AUOAcQCq2tRtm2HAGVUd5XwfKyINgFVAD+BDZ9PZQE8gEugM/KyqKiLzgTfdOvZbAS95/c0lo2KRYIa1q8ILbSryw2ZXq+bNH7bzzvwdtK5ShAfrlaRhWXsmwfhGSi0Nb8mVK9dfy6rKSy+9xOOPP37NNiNHjvTo9yJ+X6qa6PYBAQHX9Eck9jzH4sWLWbRoEZGRkeTMmZPmzZun+NxHcn2s2bP//c+jv7//dfUPJbXfYsWKceLECebNm0d4eDgxMTF88cUX5M6dmzx58nD8+PFrzuvevXt59913WbNmDfnz56dXr16JvidV5c4772TGjBkex+gJb96mPAPXH/8KIhItIn2AbiKyE9iOqyUy2YNd9cd199luYA9/32U2ESggIruBZ4AXAVQ1BngNWOO8XnXKfC5HNn861SnOV/0bseDpcB5qUIplu47x4IRV3DF8CdNW/s65S97ppDQmPWvdujWTJk3667r/gQMHOHLkCC1btuSLL77g+PHjAEleIotXsWJFDh48yJo1awCIjY0lLi6O0NBQNmzYwNWrV9m/fz+rV6/+R91Tp06RP39+cubMyfbt21m5cuVf6wIDA7l8+fI/6oSHhzNz5kyuXLnC0aNHWbp0KfXq1bvh8+DJfhs2bMiIESMIDw+nadOmvPvuuzRt2jTR/Zw+fZpcuXKRN29eDh8+zI8//n2Tbp48eYiNjQWgQYMGREREsHv3bgDOnTvHzp07b/p9eK0Fo6rdklj1QQr1hiX4Pgqomsh2F3DdKJDYPiYBkzwK1EduuyUPQ9u6WjXfbzrElBX7+Pe3W3hn3na61itJj4alKJ4/p6/DNCZNtGrVim3btv11WSZ37tx8+umnVKlShZdffplmzZrh7+9PrVq1mDJlSpL7yZYtGzNnzmTw4MGcP3+eHDlysGjRIho3bkzp0qWpVq0aVatWpXbt2v+o26ZNG8aNG0f16tWpUKHCNZeZ+vbtS/Xq1alduzbTp0//q7xjx45ERkZSo0YNRIS3336bIkWKsH379ps6H0ntF6Bp06YsWLCAcuXKUapUKWJiYpJMMDVq1KBWrVpUqVKFMmXK/HUJLP493XXXXRQtWpRffvmFKVOm0K1bNy5evAjA66+/zm233XZT70PsNlqXsLAw9eWEY6rK2t9PMDliH/N+/RNVpXWVIjzSuDR1Q/Pb5TOTqrZt20alSpV8HYbJYBL7uRGRtaoaltj2NthlOiEihIWGEBYawoGT55kW+TszVv/Bj1v+pMqtwTzSuDRtaxQle4C/r0M1xhiP2Fhk6VCxfDl48a6KrHypJW92rMaluKs89+VGGv/vZ4Yv3MmRWBti3RiT/lkLJh3Lkc2fB+uXpFu9EizffYzJEfsY+dMuxi7ezb3Vb+WRxqFUL57P12GaDCqpO66MScyNdKdYgskARISm5QvRtHwh9h47yycr9vFl1H5mrT9AnVL5eaRxKG2qFCHA3xqkxjNBQUEcP37chuw3HomfDyYoKOi66lknv8PXnfzXK/bCZb6MimbKin38EXOO4vlz0De8DF3qlCBHNuunMcmzGS3N9UpqRsvkOvktwTgyWoKJd+Wq8tO2w4xbsod1f5ykQK5s9GoUSo+GoeTN6fnUpsYYcyMswXggoyaYeKrKmn0nGLt4N7/sOEoup/+mT5MyFMl7fc1aY4zxlCUYD2T0BONu26HTfLRkD3M2HcJPoGOtYvQNL0u5wmk314QxJmuwBOOBzJRg4u2POceEZb/x+Zr9XLpylVaVb6Ffs7LUKum1+deMMVmMJRgPZMYEE+/YmYt8smIfn6zYx+kLcTQoE0L/5uUIL1/Q7iAyxtwUSzAeyMwJJt6Zi3F8vvoPJizby5+nL1C5aDD9mpfl7qp2i7Mx5sZYgvFAVkgw8S7FXeXbDQcYt2QPvx09S8mQnPRvXpZOtYuTLcASjTHGc5ZgPJCVEky8q1eVhdsOM+aX3WyMPkWxfDkYdHs5SzTGGI9ZgvFAVkww8VSVJTuPMmLRLjbsP2mJxhjjMUswHsjKCSZeYolmYItydK5jicYYkzhLMB6wBPM3SzTGGE9ZgvGAJZh/UlWW7jrG+wt3WqIxxiTKEowHLMEkLT7RjFi0k/V/uBLNgBZl6VKnhCUaY7I4SzAesASTMlVl2a5jvG+JxhjjsATjAUswnotPNCMW7WSdk2gG3+66dGYPbBqTtViC8YAlmOunqizffYzhC10tmjIFc/FsqwrcVbUIfn42BI0xWUFyCcb+3TQ3LH6mzW/6N+LjHmEE+vsx8LN1tB8dwdKdR29oilVjTOZhCcbcNBHhzsq38MOTTRl+fw1OnLtEj0mrefDjVaz/44SvwzPG+IhdInPYJbLUczHuCp+v3s+HP+/i2JlLtKp8C8+1rsBtt+TxdWjGmFTmk0tkIjJJRI6IyBa3shoiEikim0VkjogEO+X1RGSD89ooIh3d6tRxtt8tIiPFGV9eRLKLyEynfJWIhLrV6Skiu5xXT2+9R5O47AH+9GwUypLnW/DsnbcRuec4bUYs5dkvNhJ94pyvwzPGpBGvtWBEJBw4A0xV1apO2RrgOVVdIiK9gdKq+m8RyQlcUtU4ESkKbARudb5fDTwJrAR+AEaq6o8iMgCorqr9RKQr0FFVHxCRECAKCAMUWAvUUdVkr9VYC8Z7Tpy9xNgle5iyYh8odG9QkoEtylEwd3Zfh2aMuUk+acGo6lIgJkFxBWCps7wQ6ORse05V45zyIFyJASfZBKtqpLoy4VSgg7Nde+ATZ/kroKXTumkNLFTVGCepLATapPLbM9chf65s/OvuSix5vjmd6hRjauTvNHv7F4Yv3Enshcu+Ds8Y4yVp3cm/BWjnLHcBSsSvEJH6IvIrsBno5yScYkC0W/1opwzn634AZ9tTQAH38kTqGB8qmjcH/72vOgueDqd5hcKM/GkX4W//woRlv3Hh8hVfh2eMSWVpnWB6AwNFZC2QB7gUv0JVV6lqFaAu8JKIBAGJPUwRf00vqXXJ1bmGiPQVkSgRiTp69Oh1vA1zM8oWys3o7rWZM6gJVYvl5fXvt9HyvSXM3njQbm02JhNJ0wSjqttVtZWq1gFmAHsS2WYbcBaoiqv1UdxtdXHgoLMcjdMCEpEAIC+uS3J/lSdSJ+GxxqtqmKqGFSpU6GbemrkB1YrnZVqf+kx/tD55cwTyxIz1dByzgrW/J7yyaozJiNI0wYhIYeerHzAEGOd8X9pJEohIKVx9NftU9RAQKyINnP6VHsB3zu5mA/F3iHUGfnb6aeYDrUQkv4jkB1o5ZSadalyuIHMGN+GdztU5dOo8ncZGMmD6Wn4/ftbXoRljbkKAt3YsIjOA5kBBEYkGhgK5RWSgs8k3wGRnuQnwoohcBq4CA1T1mLOuPzAFyAH86LwAJgLTRGQ3rpZLVwBVjRGR14A1znavqqr9S5zO+fsJXcJKcE/1ony8dC/jluxh4dbD9GwYyuDby5M3Z6CvQzTGXCd70NJhtymnL0dOX+C9BTv5Yu1+1+Wz28vzUINSNmqzMemMjUVmMpzCwUG81bk63w9uStVb8/Lq3K20HrGU+b/+aTcCGJNBWIIx6VrlW4OZ1qcek3vVxd9PeHzaWh4Yv5JN0Sd9HZoxJgWWYEy6JyK0qFiYeU825fUOVdlz5AztRkXw9MwNHDx53tfhGWOSYH0wDuuDyThiL1xmzOI9TFy+FwEebVqa/s3LkTu71+5ZMcYkwfpgTKaSJyiQF9pU5Odnm9GmahFG/7KH299dzKz10dY/Y0w6YgnGZFjF8+fkg661mDWgEUXzBvH0zI10HhfJlgOnfB2aMQZLMCYTqFUyP7MGNObtztX5/fhZ2o5azkvfbOb4mYu+Ds2YLM0SjMkU/PyE+8NK8PNzzenTuDRfRu2nxbuLmRKxl7grV30dnjFZkiUYk6kEBwUy5N7KzHuqKTVK5GPYnK3cM3I5K/YcS7myMSZVWYIxmVK5wnmY2rseHz1ch7OX4njw41UMnL6OA3ZbszFpxhKMybREhNZVirDomWY8c+dt/LT9MC3fW8wHi3bZ/DPGpAFLMCbTCwr054mW5fnp2ea0rHQL7y/ayR3DlzBviw07Y4w3WYIxWUaxfDkY/WBtZjzWgNzZA+j36Voenria3UdifR2aMZmSJRiT5TQsW4C5g5vwn3ZV2BR9kjYjlvHG91s5ezHO16EZk6lYgjFZUoC/Hz0bhbL4+RZ0CSvOx8v2OpfNDtllM2NSiSUYk6WF5MrGf++rztf9G5EvZzb6fbqO3lPWsD/mnK9DMybDswRjDFCnVH7mDGrMkHsqsXpvDHcMX8LoX3ZzKc4e0jTmRlmCMcYR4O/Ho03LsOjZZrSsVJh35u/grg+W2kOaxtwgSzDGJFA0bw7GdK/D5EfqcvmK8uDHq3h65gaOxtrYZsZcD0swxiShRYXCLHg6nMG3l2PupoO0fG8x01b+zpWrdhOAMZ6wBGNMMoIC/Xm2VQXmPRVO1WJ5+fe3W7hv7AqbEsAYD1iCMcYDZQvlZvqj9fmga00OnDhHu1HLGTb7V2IvXPZ1aMakW5ZgjPGQiNC+ZjF+erY53euX4pPIfbR8bwlzNh60Z2eMSUSKCUZEuohIHmd5iIh8IyK1vR+aMelT3hyBvNahKt8OaEzh4OwMnrGeXpPt2RljEvKkBfNvVY0VkSZAa+ATYKx3wzIm/atRIh/fDWzC0LaVidoXQ6v3lzJx+V67CcAYhycJJn5c83uAsar6HZDNeyEZk3H4+wmPNC7Ngmea0aBMCK/N3cp9YyLYdui0r0Mzxuc8STAHROQj4H7gBxHJ7kk9EZkkIkdEZItbWQ0RiRSRzSIyR0SCnfI7RWStU75WRG53q1PHKd8tIiNFRJzy7CIy0ylfJSKhbnV6isgu59XT47NhzA0qli8Hk3rVZWS3WkSfOE/bD5fz7vwdNu+MydI8STD3A/OBNqp6EggBnveg3hSgTYKyCcCLqloNmOW2n2NAW6e8JzDNrc5YoC9Q3nnF77MPcEJVywHvA28BiEgIMBSoD9QDhopIfg/iNeamiAjtatzKomea0b5mMUb9spu7P1jGyt+O+zo0Y3wiyQQjIlEi8gEQDvygqrsAVPWQqi5IacequhSISVBcAVjqLC8EOjnbrlfVg075r0CQ00IpCgSraqS6btOZCnRwtmuPqz8I4CugpdO6aQ0sVNUYVT3hHCdhojPGa/LnysZ799dgWp96XL56la7jV/LSN5s5dd5uaTZZS3ItmAa4WhnNgSUi8oOIPCkit93E8bYA7ZzlLkCJRLbpBKxX1YtAMSDabV20U4bzdT+AqsYBp4AC7uWJ1LmGiPR1EmnU0aNHb+gNGZOUpuULMf+pcPqGl2Hmmj+405kOwJisIskEo6pxqrpYVV9U1fq4LknFAq+LyHoRGXMDx+sNDBSRtUAe4JL7ShGpgutS1+PxRYmFlsK65OpcW6g6XlXDVDWsUKFCHoRvzPXJmS2Af91die8GNqFg7uz0+3Qdj0+L4vDpC74OzRiv8/hBS+fS2CRVvR+oA0y/3oOp6nZVbaWqdYAZwJ74dSJSHFeLqYeqxpdHA8XddlEcOOi2roRTNwDIi+uS3F/lidQxxieqFc/Ld4Ma80KbiizecZQ73lvCZ6v+4Krd0mwysYCkVojIHJL4zx9AVdsltS6ZfRZW1SMi4gcMAcY55fmA74GXVDXC7RiHRCRWRBoAq4AewIfO6tm4bgiIBDoDP6uqish84E23jv1WwEvXG6sxqS3Q34/+zctyV9UivPTNZv41azPfrj/AfztVo2yh3L4Oz5hUJ0kNcSEizZKrqKpLkt2xyAxc/TcFgcO47uzKDQx0NvkGV0JRERmCKwnscttFKycZheG6Iy0H8CMw2KkThOtus1q4Wi5dVfU359i9gX85+3lDVScnFytAWFiYRkVFpbSZMalCVfkyKprXv9/KhctXefKO8jweXoYAfxu9yWQsIrJWVcMSXefJGEoikg2I79zfoaqZ7nYYSzDGF47EXmDY7F/5YfOfVCuWl3e6VKdikWBfh2WMx5JLMJ48MNkcV8tiNDAG2Cki4akZoDFZVeE8QYzpXofRD9bm4EnXA5of/rSLy1dsqmaT8XnSHn8P1+WqZqoajus5k/e9G5YxWcs91Yuy4OlwWlcpwnsLd9LRhpsxmYAnCSZQVXfEf6OqO4FA74VkTNZUIHd2Rj1Ym7Hda/PnqQu0G7WckdaaMRmYJwkmSkQmikhz5/UxsNbbgRmTVd1VrSgLnm5Gm6pFGb5wJx1GR7D1oLVmTMbjSYLpj2v4lieAJ4GtQD9vBmVMVheSKxsfdqvFuIdqc/i0qzUzYtFOLsVZa8ZkHB7dRZYV2F1kJr06cfYSw+b8yncbDlKpaDDvdqlOlVvz+josY4Cbv4vsXmdomBgROe08+GjtdWPSSP5c2figay0+ergOR2Mv0n5UBO8vtNaMSf88uUQ2AtcT8wVUNVhV86iq3ahvTBprXaUIi54Jp22NW/ngp120G7WcLQdO+TosY5LkSYLZD2xRu5ZmjM/ly5mN9x+oycc9wjh+9hLtR0cwfMEOa82YdCnJscjc/B+umSyXABfjC1V1uNeiMsYk687Kt1A3ND+vzt3KyJ93s2DrYd5/oCaVitrFBZN+eNKCeQM4BwThGmI//mWM8aF8ObMx/P6aTOgRxrEzrr6ZcUv2cMVGaDbphCctmBBVbeX1SIwxN+SOyrcwv2Q4L8/awv9+3M6irYd57/4alCqQy9ehmSzOkxbMIhGxBGNMOlYgd3bGPlSb9x+owY7Dsdz1wTI+W/UH1nVqfMmTBDMQmCci5+02ZWPSLxGhY63izH8qnFol8/GvWZt5ZMoajtjsmcZHUkwwzm3Jfqqaw25TNib9uzVfDqb1rs+wtpVZ+dtxWo1YytxNNqmrSXs2u5ExmZCfn9CrcWm+f6IppQrkYtBn63lixnpOnrvk69BMFmIJxphMrGyh3HzdryHP3HkbP2w+ROsRS1m686ivwzJZhCUYYzK5AH8/nmhZnlkDGpMnKJAek1bz72+3cO5SnK9DM5mcRwlGRJqIyCPOciERKe3dsIwxqa1a8bzMHdyER5uU5tNVv3P3B8tY+/sJX4dlMjFPBrscCrwAvOQUBQKfejMoY4x3BAX6M+Teynz2aAMuX1G6jFvBO/O321Azxis8acF0BNoBZwFU9SD2JL8xGVrDsgWY91RTOtUuzuhf9tBxTAS7j5zxdVgmk/EkwVxyBrpUABGxx4ONyQTyBAXyTpcafPRwHQ6ePM+9Hy5j+qrf7eFMk2o8STBfiMhHQD4ReQxYBEzwbljGmLTSukoR5j0VTt3QEF6etYXHpq7l+JmLKVc0JgUezWgpIncCrQAB5qvqQm8HltZsRkuT1V29qkxesY+3ftxO3pyBvNelBuG3FfJ1WCadu9kZLd9S1YWq+ryqPqeqC0XkrdQP0xjjS35+Qp8mpfluUGPy53TdzvzqnK1cuHzF16GZDMqTS2R3JlJ2V2oHYoxJHyoVDWb2oCb0ahTKpIi9dBgdwY4/Y30dlsmAkkwwItJfRDYDFURkk9trL7AppR2LyCQROSIiW9zKaohIpIhsFpE5IhLslBcQkV9E5IyIjEqwnzrO9rtFZKSIiFOeXURmOuWrRCTUrU5PEdnlvHpe91kxJosLCvRnWLsqTO5Vl2NnLtJ21HKmROy1GwDMdUmuBfMZ0BaY7XyNf9VR1Yc82PcUoE2CsgnAi6paDZgFPO+UXwD+DTyXyH7GAn2B8s4rfp99gBOqWg54H3gLQERCgKFAfaAeMFRE8nsQrzEmgRYVCzPvqXCalCvIsDlbeWTKGo7G2g0AxjNJJhhVPaWq+1S1m6r+DpzHdatybhEpmdKOVXUpEJOguAKw1FleCHRytj2rqstxJZq/iEhRIFhVI51bpacCHZzV7YFPnOWvgJZO66Y1sFBVY1T1hHOchInOGOOhgrmzM7FnGK+1r0LknuO0GbGUn7cf9nVYJgPwpJO/rYjsAvYCS4B9wI83eLwtuB7aBOgClEhh+2JAtNv30U5Z/Lr9AKoaB5wCCriXJ1LnGiLSV0SiRCTq6FEbANCYpIgIDzcMZe7gJhQODqL3lChe+W6L3QBgkuVJJ//rQANgp6qWBloCETd4vN7AQBFZi2s0gJTGDpdEyjSFdcnVubZQdbyqhqlqWKFCdjumMSkpf0sevh3YiMealmZq5O/c++Fyfj14ytdhmXTKkwRzWVWPA34i4qeqvwA1b+RgqrpdVVupah1gBrAnhSrRQHG374sDB93WlQAQkQAgL65Lcn+VJ1LHGHOTsgf48/I9lZnWpx6nz1+m4+gVTFj2G1ev2g0A5lqeJJiTIpIbV9/JdBH5ALihcb5FpLDz1Q8YAoxLbntVPQTEikgDp3+lB/Cds3o2EH+HWGfgZ6efZj7QSkTyO537rZwyY0wqalq+EPOeCqdZhUK8/v02+nyyxkYAMNdI8Ul+Z+yx87iSUXdcLYXpTqsmuXozgOZAQeAwrju7cgMDnU2+AV5ykgIisg8IBrIBJ4FWqrpVRMJw3ZGWA1ffz2BVVREJAqYBtXC1XLqq6m/OvnoD/3KO84aqTk7pRNiT/MbcGFVl2srfef37beTLEciIrjVpVLagr8MyaSS5J/mTTTAi4o9raJg7vBVcemEJxpibs/XgaQbNWMfeY2cZ1KIcT7YsT4C/zWmY2d3wUDGqegU4JyJ5vRKZMSbTqHxrMHMHN6FLneJ8+PNuuo5fyYGT530dlvEhT/69uABsFpGJzpP0I0VkpLcDM8ZkPDmzBfB25xp80LUm2/+M5e4PljFvy5++Dsv4SIAH23zvvIwxxiPtaxajZol8DJ6xnn6fruXhBqV4+Z5KBAX6+zo0k4Y8STD7gZWqes7bwRhjMo9SBXLxVb9GvDN/Ox8v28uafTGMerAW5QrbhLhZhSeXyHoBG5xBKt92nuy3sb2MMSnKFuDHy/dUZvIjdTkSe5G2H0bwRdR+GzQzi0gxwahqD1W9Dde4YdHAaMDGVTHGeKxFhcL8+GRTapXMx/99tYknP99A7IXLvg7LeJknY5E95EyZ/BVwBzAKaOrtwIwxmcstwUFM61Of51rdxvebD3HPyOVs3H/S12EZL/LkEtkIXEPDfAw8oapvq2qkN4MyxmRO/n7CoNvLM7NvA65cVTqNXcHHS22YmczKk0tkBXENUhkEvCEiq0VkmtcjM8ZkWmGhIfzwRFNaVirMGz9so/cna4g5m9LYtyaj8eQSWTBQEigFhOIaKuaqd8MyxmR2eXMGMu6hOrzWvgordh/nnpHLWPt7wimkTEbmySWy5bhmstwEPKCqFVTVpiE2xty0+HlmvhnQiEB/Px74aCXjl+6xu8wyCU8ukVVX1QHAHFyDUBpjTKqqWiwvc59owp2Vb+HNH7bz2NQoTp6zS2YZnSeXyKqKyHpcs1FuFZG1IlLV+6EZY7KS4KBAxnSvzbC2lVmy8yj3jFzO+j9O+DoscxM8uUQ2HnhGVUupakngWafMGGNSlYjQq3FpvurXCBG4/6NIJi7fa5fMMihPEkwuZxZLAFR1MZDLaxEZY7K8GiXy8f3gpjSvUJjX5m6l36drOXXeHszMaDxJML+JyL9FJNR5DQH2ejswY0zWljdnIOMfrsOQeyrx07Yj3PvhMjZFn/R1WOY6eJJgegOFcM1AOctZfsSbQRljDLgumT3atAxf9GvI1avQaewKpkTYJbOMIsUpk7MKm9HSmPTt5LlLPPvFRn7afoS7qxXhf52qExwU6OuwsrzkZrRMcrh+EZkDJJl9VLVdKsRmjDEeyZczGx/3COPjZb/x9vwd/HpwOaMfrE3VYjbhbnqV3Hww76ZZFMYY4wE/P+HxZmWpUyo/gz5bz31jVvBK28p0r18SEfF1eCaB5BLMXlX9I80iMcYYD4WFhvDDk015euYGhny7hdV7Y/jvfdXIld2TORRNWkmuk//b+AUR+dr7oRhjjOdCcmVjcq+6PN+6AnM3HaTD6Ah2Hznj67CMm+QSjHt7s4y3AzHGmOvl5ycMbFGOaX3qE3P2Eu1HLef7TYd8HZZxJJdgNIllY4xJVxqXK8jcJ5pwW5E8DPxsHa/N3crlKzbou68ll2BqiMhpEYkFqjvLp0UkVkROp1WAxhjjiaJ5czCzb0N6NQpl4vK9PPjxSg6fvuDrsLK0JBOMqvqrarCq5lHVAGc5/vvgtAzSGGM8kS3Aj2HtqvBB15psOXCae0YuZ+Vvx30dVpblyZP8N0REJonIERHZ4lZWQ0QiRWSziMxxJjOLX/eSiOwWkR0i0tqtvI6z/W4RGSnOvYgikl1EZjrlq0Qk1K1OTxHZ5bxs7hpjspj2NYvx3aDGBOcIoPuEVXy0xOaY8QWvJRhgCtAmQdkE4EVVrYZr2JnnAUSkMtAVqOLUGSMi/k6dsUBfoLzzit9nH+CEqpYD3gfecvYVAgwF6gP1gKEikt8L788Yk47ddkseZg9qQusqt/DfH7fT79O1nL5gA2amJa8lGFVdCiSc/7QCsNRZXgh0cpbbA5+r6kVV3QvsBuqJSFEgWFUj1fXvx1Sgg1udT5zlr4CWTuumNbBQVWNU9YRznISJzhiTBeTOHsDoB2sz5J5KLNp2hPajItj+p3UhpxVvtmASswWIH2KmC1DCWS4G7HfbLtopK+YsJyy/po6qxgGngALJ7OsfRKSviESJSNTRo0dv8C0ZY9Kz+AEzZzzWgLMX4+gwOoJZ66NTrmhuWlonmN7AQBFZC+QB4udETWyMB02m/EbrXFuoOl5Vw1Q1rFChQskGbozJ2OqVDmHuE02oUTwfT8/cyJBvN3Mx7oqvw8rU0jTBqOp2VW2lqnWAGcAeZ1U0f7dmAIoDB53y4omUX1NHRAKAvLguySW1L2NMFlc4TxDTH63P4+Fl+HTlH9z/0UoOnDzv67AyrTRNMCJS2PnqBwwBxjmrZgNdnTvDSuPqzF+tqoeAWBFp4PSv9AC+c6sTf4dYZ+Bnp59mPtBKRPI7nfutnDJjjCHA34+X7q7EuIdqs+fIGe4duYxlu+wSuTd48zblGUAkUEFEokWkD9BNRHYC23G1KiYDqOqvwBfAVmAeMFBV49uu/XHdfbYbV4vnR6d8IlBARHYDzwAvOvuKAV4D1jivV50yY4z5S5uqRZk9qDGF8wTRc9Jqxi62W5lTm0045rAJx4zJms5diuP/vtrE3E2HuLtaEd7uXIPcNiqzx5KbcCytO/mNMSZdyZktgA+71eJfd1dk3pY/6Tg6gr3Hzvo6rEzBEowxJssTEfqGl2Van/ocO3ORdh8u56dth30dVoZnCcYYYxyNyxVkzuAmlCqYkz6fRDFi0U6uXrVuhBtlCcYYY9wUz5+Tr/o14r7axRixaBd9p0XZEDM3yBKMMcYkEBToz3tdavCfdlVYvOMoHUZFsOtwrK/DynAswRhjTCJEhJ6NQvnssQacvuAaYubHzTZb5vWwBGOMMcmoVzqEuYObUP6WPPSfvo635m3nivXLeMQSjDHGpKBI3iBmPt6AbvVKMnbxHnpNXs3Jc5dSrpjFWYIxxhgPZA/w57/3VeN/91Vj1W8xtB21nK0Hbej/5FiCMcaY69C1XklmPt6Ay3HKfWMj+G7DAV+HlG5ZgjHGmOtUq2R+5gxuQvVi+Xjy8w28NncrcVeu+jqsdMcSjDHG3IBCebIz/bH69GoUysTle+k1eY31yyRgCcYYY25QoL8fw9pV4e1O1Vm9N4Z2oyLYac/L/MUSjDHG3KT765ZgRt8GnL98hY6jI5j/65++DildsARjjDGpoE6p/MwZ1IRyhXPz+LS1fLBoV5Yfx8wSjDHGpBLX8zINua9WMd5ftJMB09dx9mKcr8PyGUswxhiTioIC/Xnv/hoMuacSC7b+SaexK/jj+Dlfh+UTlmCMMSaViQiPNi3DlEfqcfDkedqNXs6K3cd8HVaaswRjjDFeEn5bIWYPakLB3Nl5eNJqpkTsJStNU28JxhhjvCi0YC5mDWhEiwqFGTZnKy98vYmLcVd8HVaasARjjDFelicokPEP1+GJ28vxRVQ03cav5MjpC74Oy+sswRhjTBrw8xOeaVWBMd1rs+1QLO1GRbBx/0lfh+VVlmCMMSYN3V2tKF/3b0SAv9Dlo0i+WRft65C8xhKMMcakscq3BjN7UBNql8zHM19s5I3vt2bKScwswRhjjA+E5MrGtD716dGwFB8v28ujn6wh9sJlX4eVqryWYERkkogcEZEtbmU1RWSliGwQkSgRqeeUZxORySKyWUQ2ikhztzp1nPLdIjJSRMQpzy4iM53yVSIS6lanp4jscl49vfUejTHmZgT6+/Fq+6q83qEqS3cd474xmeuhTG+2YKYAbRKUvQ38R1VrAq843wM8BqCq1YA7gfdEJD62sUBfoLzzit9nH+CEqpYD3gfeAhCREGAoUB+oBwwVkfyp/N6MMSbVPNSgFNN61+NI7EXaj17Oyt+O+zqkVOG1BKOqS4GYhMVAsLOcFzjoLFcGfnLqHQFOAmEiUhQIVtVIdT2dNBXo4NRpD3ziLH8FtHRaN62Bhaoao6ongIX8M9EZY0y60qhcQb4b2JiQXNl4aMIqZqz+w9ch3bS07oN5CnhHRPYD7wIvOeUbgfYiEiAipYE6QAmgGOB+i0W0U4bzdT+AqsYBp4AC7uWJ1DHGmHQrtGAuvhnQmEblCvLSN5v5z5xfM/RMmWmdYPoDT6tqCeBpYKJTPglXIogCRgArgDhAEtlH/K0WSa1Lrs41RKSv0xcUdfToUU/fgzHGeE3eHIFM6hnGI41DmRyxj96fRHHqfMbs/E/rBNMT+MZZ/hJXHwmqGqeqT6tqTVVtD+QDduFKOsXd6hfn78tq0bhaOYhIAK5LbjHu5YnUuYaqjlfVMFUNK1So0M2/O2OMSQUB/n4MbVuF/95XjRW7j9FxTAR7j531dVjXLa0TzEGgmbN8O64kgojkFJFczvKdQJyqblXVQ0CsiDRw+ld6AN859WfjSlgAnYGfnX6a+UArEcnvdO63csqMMSZD6VavJJ8+Wp8TZy/RYXREhhuR2Zu3Kc8AIoEKIhItIn1w3S32nohsBN7EdXcYQGFgnYhsA14AHnbbVX9gArAb2AP86JRPBAqIyG7gGeBFAFWNAV4D1jivV50yY4zJcBqUKcB3A5tQOI9rROZpK3/3dUgek6w0dHRywsLCNCoqytdhGGNMomIvXOaJGev5ZcdRejQsxSv3VibA3/fPyovIWlUNS2yd76MzxhiTojxBgUzoWZfHmpZmauTv9Jq8hlPn0nfnvyUYY4zJIPz9hJfvqczbnauzau9xOoyJYM/RM74OK0mWYIwxJoO5P6wEnz3WgFPnL9NxdATLdqXPxywswRhjTAZUNzSE7wY2pmjeHPSavIZP02HnvyUYY4zJoEqE5OSr/g0JL1+QId9u4bW56WvYf0swxhiTgeUJCuTjHmH0ahTKxOV7eXxaFGcvxvk6LMASjDHGZHgB/n4Ma1eFV9tX4eftR+g8LpKDJ8/7OixLMMYYk1n0aBjKpF512R9zjg6jI9gcfcqn8ViCMcaYTKR5hcJ83b8Rgf5+dPloBfO2HPJZLJZgjDEmk6lQJA/fDmxMxSLB9Pt0HWMX78EXo7ZYgjHGmEyoUJ7sfN63AfdWL8pb87bzwtebuBSXtnPLBKTp0YwxxqSZoEB/RnatRZmCuRj58272x5xn7EO1yZczW5oc31owxhiTifn5Cc+0qsDw+2uw9vcT3DdmRZrNLWMJxhhjsoD7ahdn+mP1OXHuEh3HRLDyt+NeP6YlGGOMySLqhobw7cDGFMiVjYcnruKrtdFePZ4lGGOMyUJKFcjFN/0bU690CM99uZG3523nqpeGl7EEY4wxWUzenIFMeaQe3eqVYMziPQyasc4rY5jZXWTGGJMFBfr78WbHapQpmJvTFy7j7yepfgxLMMYYk0WJCI+Fl/Ha/u0SmTHGGK+wBGOMMcYrLMEYY4zxCkswxhhjvMISjDHGGK+wBGOMMcYrLMEYY4zxCkswxhhjvEJ8MctZeiQiR4HffR1HMgoCx3wdRDIsvptj8d0ci+/m3Ex8pVS1UGIrLMFkECISpaphvo4jKRbfzbH4bo7Fd3O8FZ9dIjPGGOMVlmCMMcZ4hSWYjGO8rwNIgcV3cyy+m2Px3RyvxGd9MMYYY7zCWjDGGGO8whKMMcYYr7AEk86ISAkR+UVEtonIryLypFM+TEQOiMgG53W3D2PcJyKbnTiinLIQEVkoIrucr/l9FFsFt3O0QUROi8hTvjx/IjJJRI6IyBa3siTPl4i8JCK7RWSHiLT2UXzviMh2EdkkIrNEJJ9THioi593O4zgfxZfk55nW5y+ZGGe6xbdPRDY45Wl6DpP5m+L9n0FVtVc6egFFgdrOch5gJ1AZGAY85+v4nLj2AQUTlL0NvOgsvwi8lQ7i9Af+BEr58vwB4UBtYEtK58v5rDcC2YHSwB7A3wfxtQICnOW33OILdd/Oh+cv0c/TF+cvqRgTrH8PeMUX5zCZvyle/xm0Fkw6o6qHVHWdsxwLbAOK+TYqj7QHPnGWPwE6+C6Uv7QE9qiqT0doUNWlQEyC4qTOV3vgc1W9qKp7gd1AvbSOT1UXqGqc8+1KoLg3Y0hOEucvKWl+/iD5GEVEgPuBGd6OIzHJ/E3x+s+gJZh0TERCgVrAKqdokHPJYpKvLkE5FFggImtFpK9TdouqHgLXDzRQ2GfR/a0r1/5Sp5fzB0mfr2LAfrftovH9Pxi9gR/dvi8tIutFZImINPVVUCT+eabH89cUOKyqu9zKfHIOE/xN8frPoCWYdEpEcgNfA0+p6mlgLFAWqAkcwtXk9pXGqlobuAsYKCLhPowlUSKSDWgHfOkUpafzlxxJpMxnzxKIyMtAHDDdKToElFTVWsAzwGciEuyD0JL6PNPV+XN049p/dHxyDhP5m5LkpomU3dA5tASTDolIIK4fhOmq+g2Aqh5W1SuqehX4mDRo9idFVQ86X48As5xYDotIUQDn6xFfxee4C1inqochfZ0/R1LnKxoo4bZdceBgGscGgIj0BO4Fuqtzcd65bHLcWV6L6/r8bWkdWzKfZ7o5fwAiEgDcB8yML/PFOUzsbwpp8DNoCSadca7XTgS2qepwt/Kibpt1BLYkrJsWRCSXiOSJX8bVGbwFmA30dDbrCXzni/jcXPNfY3o5f26SOl+zga4ikl1ESgPlgdVpHZyItAFeANqp6jm38kIi4u8sl3Hi+80H8SX1eaaL8+fmDmC7qkbHF6T1OUzqbwpp8TOYVncy2MvjOz6a4GqObgI2OK+7gWnAZqd8NlDUR/GVwXWHyUbgV+Blp7wA8BOwy/ka4sNzmBM4DuR1K/PZ+cOV6A4Bl3H9d9gnufMFvIzrv9odwF0+im83ruvw8T+D45xtOzmf+0ZgHdDWR/El+Xmm9flLKkanfArQL8G2aXoOk/mb4vWfQRsqxhhjjFfYJTJjjDFeYQnGGGOMV1iCMcYY4xWWYIwxxniFJRhjjDFeYQnGZDjOaLSp8hyLiDQXkUYebrtPRAqmsE0vEbk1lWIrJCLLRWSLiHRwK/8uqWOISD8R6ZEax09rqXnuTPpgCcZkdc0BjxKMh3oBqfVHshuuQQgbAs8DiEhbXCMUJPpktaqOU9WpN3vg+AcB01gvUu/cmXTAEozJqPxF5GNnfosFIpIDQETKisg8ZyDOZSJS0SlvKyKrnAEGF4nILc7Af/2Ap515Oa4ZdFBECjj7Xi8iH+GM0ZSwBSUiz4lrfpLOQBgw3dnfPSIyy227O0XkGzx3GciBa9j0q86wI08B7yRVwYnjOWd5sYi8JSKrRWRn/PsTEX8ReVdcc/psEpHBTvk+EXlFRJYDXUSklYhEisg6EfnSGcsqfrs3nXVRIlJbROaLyB4R6ecWy/MissY5xn/czt22hJ9dIucux3WcJ5NOWYIxGVV5YLSqVgFO4no6GmA8MFhV6wDPAWOc8uVAA3UNMPg58H+qug8YB7yvqjVVdVmCYwwFljt1ZgMlkwtIVb8ConCN3VUT+AGoJCKFnE0eASZfx3v8DGgNzMM1/8kAYKq6Dd3igQBVrYcrMQ11yvrimuejlqpW5++BLAEuqGoTYBEwBLhDXQObRuEamDHeflVtCCzD9bR6Z6AB8CqAiLTC9RnVwzUgZR35e1DUf3x2Cc+dqp6/jvdo0qkAXwdgzA3aq6obnOW1QKjzH3Yj4EvX8EuA679/cA3YN9MZwyobsNeDY4TjGqgQVf1eRE5cT4CqqiIyDXhIRCbjutTlcf+Iqp4C7gEQ13D0LwD3icjHQH7gPVWNTGE38S2mtbgmugLX+Fjj1JnvRVXd5zGJH5SxAa6JpyKcc5kNcD/WbOfrZiC3uuYZiRWRC+Ka/bKV81rvbJcbV2L5g0Q+uxTeg8mgLMGYjOqi2/IVXJeS/ICTTushoQ+B4ao6W0Sa42oReCKxsZTiuLb1H5RM/cnAHOAC8KX+PYkXACJSH/jI+fYVVZ1N4l4B3sDVL7MWV+vmO6BFCvHHn6cr/P37LiQ9/PpZt20Wqmq3FPZ7lWs/i6vOcQT4r6p+5F7JuSyZ2GdnMiG7RGYyDXXNcbFXRLqAaxRZEanhrM4LHHCWe7pVi8U1jWxilgLdnX3dhavVAHAYKOz00WTHNaR9ovtzOuMP4rrcNCWRmFc5l4RqJpVcRKQ8cKuqLsE1kOdVXAkiucSWnAVAP6dPBxEJSWSblUBjESnnbJNTRK5nSPn5QG+3fptiIpLSJHTJfRYmA7IEYzKb7kAfEYkf7bm9Uz4M16WzZcAxt+3nAB0T6+QH/gOEi8g6XJd7/gBQ1cu4+hpWAXOB7W51pgDjEnRUT8fVZ7H1Bt/TG7gSFLhG7e2FKwG8e4P7m4DrvWxyztODCTdQ1aPOcWaIyCbneBU9PYCqLsDVyooUkc3AV6ScPKbwz3NnMjAbTdkYLxORUcB6VZ3o61iMSUuWYIzxIhFZi6tf405VvZjS9sZkJpZgjDHGeIX1wRhjjPEKSzDGGGO8whKMMcYYr7AEY4wxxisswRhjjPGK/weFeOE2S2pR4QAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -1935,7 +1935,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -1963,7 +1963,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEJCAYAAAB7UTvrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAy8klEQVR4nO3dd3xUZfb48c+hht5bgEDA0AkgoQgWqoIg2NiFrwUsi4VdVveHBkQQV1EUxLZrARdR1wJSo6IgKrIqHSWEhBIgQAgECBJqQsr5/TE3cQhpQGYm5bxfr7xy57nt5JnJnLnPvfeMqCrGGGMMQClfB2CMMabwsKRgjDEmkyUFY4wxmSwpGGOMyWRJwRhjTCZLCsYYYzJ5NCmIyOMisk1EIkTkUxHxE5HpIrJdRMJFZLGIVHdbfoKIRIvIDhG5yZOxGWOMuZh46j4FEWkI/AS0UdVzIjIfWAbEAd+raqqIvASgqqEi0gb4FOgK+AMrgRaqmuaRAI0xxlykjBe2X0FEUoCKQJyqrnCbvxa405keCnymqsnAXhGJxpUg1uS08dq1a2vTpk09ErgxxhRXmzZtOqaqdbKb57GkoKoHRWQGsB84B6zIkhAA7gfmOdMNcSWJDLFO2wVEZDQwGiAgIICNGzcWdOjGGFOsici+nOZ57JyCiNTA9ek/ENdwUCURudtt/kQgFfg4oymbzVw0tqWqs1Q1RFVD6tTJNtEZY4y5TJ480dwP2KuqR1U1BVgE9AAQkZHAYOAu/eOkRizQ2G39RrjOPxhjjPESTyaF/UB3EakoIgL0BaJEZAAQCgxR1bNuy4cBw0WkvIgEAkHAeg/GZ4wxJgtPnlNYJyILgM24hol+BWYB24DywLeuXMFaVX1YVbc5VyhFOsuPuZwrj1JSUoiNjSUpKamg/hRj8PPzo1GjRpQtW9bXoRjjUR67JNUbQkJCNOuJ5r1791KlShVq1aqFk3SMuSKqSkJCAqdOnSIwMNDX4RhzxURkk6qGZDev2N3RnJSUZAnBFCgRoVatWnb0aUqEYpcUAEsIpsDZa8qUFMUyKRhjTHGlqny2fj8rI+M9sn1LCl7Sq1evArnRbtWqVQwePLgAIsqfEydO8NZbb3ltf1fitdde4+zZs3kvaEwRtS/hDHe9t47xi7ay5LeDHtmHJQVzgdTU1AseF6akoKqkp6fnOP9ykkLWv9eYwig1LZ3Zq/dw02ur2RqbyAu3teeN4Z08si9LCgXszJkzDBo0iA4dOtCuXTvmzZt30TKPPPIIISEhtG3blmeeeSazfdmyZbRq1Yprr72WsWPH5nlEsH79enr06EGnTp3o0aMHO3bsAOC6667jt99+y1yuZ8+ehIeHc+bMGe6//366dOlCp06dWLp0KQBz585l2LBh3HLLLdx4440X7GP8+PHs3r2bjh078sQTTwAwffp0unTpQnBwcGb8MTExtGrVigcffJB27dpx1113sXLlSnr27ElQUBDr17tuOZkyZQr33HMPffr0ISgoiNmzZ2fuK6fttm7dmkcffZSrr76aAwcOZNt/b7zxBnFxcfTu3ZvevXsDULly5cxtL1iwgFGjRgEwatQo/vGPf9C7d29CQ0PZvXs3AwYMoHPnzlx33XVs37491343xpuiDp3k9rd/YeqyKK69qg7f/uMG/q9bAKVKeeY8l6cL4vnUs19sIzLuZIFus41/VZ65pW2O87/55hv8/f356quvAEhMTLxomalTp1KzZk3S0tLo27cv4eHhtGjRgoceeojVq1cTGBjIiBEj8oylVatWrF69mjJlyrBy5UqeeuopFi5cyIMPPsjcuXN57bXX2LlzJ8nJyQQHB/PUU0/Rp08f5syZw4kTJ+jatSv9+vUDYM2aNYSHh1OzZs0L9jFt2jQiIiIyk8yKFSvYtWsX69evR1UZMmQIq1evJiAggOjoaD7//HNmzZpFly5d+OSTT/jpp58ICwvjhRdeYMmSJQCEh4ezdu1azpw5Q6dOnRg0aBARERE5bnfHjh28//77mUcs2fXf2LFjmTlzJj/88AO1a9fOs+927tzJypUrKV26NH379uWdd94hKCiIdevW8eijj/L999/nuQ1jPCk5NY1/fx/NW6t2U61CWf71f50Y1L6Bxy96KNZJwRfat2/PuHHjCA0NZfDgwVx33XUXLTN//nxmzZpFamoqhw4dIjIykvT0dJo1a5Z5HfyIESOYNWtWrvtKTExk5MiR7Nq1CxEhJSUFgGHDhvHcc88xffp05syZk/kJecWKFYSFhTFjxgzAdfnu/v37Aejfv/9FCSE7K1asYMWKFXTq5Dp0PX36NLt27SIgIIDAwEDat28PQNu2benbty8iQvv27YmJicncxtChQ6lQoQIVKlSgd+/erF+/np9++inH7TZp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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEJCAYAAAB7UTvrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAy8klEQVR4nO3dd3xUZfb48c+hht5bgEDA0AkgoQgWqoIg2NiFrwUsi4VdVveHBkQQV1EUxLZrARdR1wJSo6IgKrIqHSWEhBIgQAgECBJqQsr5/TE3cQhpQGYm5bxfr7xy57nt5JnJnLnPvfeMqCrGGGMMQClfB2CMMabwsKRgjDEmkyUFY4wxmSwpGGOMyWRJwRhjTCZLCsYYYzJ5NCmIyOMisk1EIkTkUxHxE5HpIrJdRMJFZLGIVHdbfoKIRIvIDhG5yZOxGWOMuZh46j4FEWkI/AS0UdVzIjIfWAbEAd+raqqIvASgqqEi0gb4FOgK+AMrgRaqmuaRAI0xxlykjBe2X0FEUoCKQJyqrnCbvxa405keCnymqsnAXhGJxpUg1uS08dq1a2vTpk09ErgxxhRXmzZtOqaqdbKb57GkoKoHRWQGsB84B6zIkhAA7gfmOdMNcSWJDLFO2wVEZDQwGiAgIICNGzcWdOjGGFOsici+nOZ57JyCiNTA9ek/ENdwUCURudtt/kQgFfg4oymbzVw0tqWqs1Q1RFVD6tTJNtEZY4y5TJ480dwP2KuqR1U1BVgE9AAQkZHAYOAu/eOkRizQ2G39RrjOPxhjjPESTyaF/UB3EakoIgL0BaJEZAAQCgxR1bNuy4cBw0WkvIgEAkHAeg/GZ4wxJgtPnlNYJyILgM24hol+BWYB24DywLeuXMFaVX1YVbc5VyhFOsuPuZwrj1JSUoiNjSUpKamg/hRj8PPzo1GjRpQtW9bXoRjjUR67JNUbQkJCNOuJ5r1791KlShVq1aqFk3SMuSKqSkJCAqdOnSIwMNDX4RhzxURkk6qGZDev2N3RnJSUZAnBFCgRoVatWnb0aUqEYpcUAEsIpsDZa8qUFMUyKRhjTHGlqny2fj8rI+M9sn1LCl7Sq1evArnRbtWqVQwePLgAIsqfEydO8NZbb3ltf1fitdde4+zZs3kvaEwRtS/hDHe9t47xi7ay5LeDHtmHJQVzgdTU1AseF6akoKqkp6fnOP9ykkLWv9eYwig1LZ3Zq/dw02ur2RqbyAu3teeN4Z08si9LCgXszJkzDBo0iA4dOtCuXTvmzZt30TKPPPIIISEhtG3blmeeeSazfdmyZbRq1Yprr72WsWPH5nlEsH79enr06EGnTp3o0aMHO3bsAOC6667jt99+y1yuZ8+ehIeHc+bMGe6//366dOlCp06dWLp0KQBz585l2LBh3HLLLdx4440X7GP8+PHs3r2bjh078sQTTwAwffp0unTpQnBwcGb8MTExtGrVigcffJB27dpx1113sXLlSnr27ElQUBDr17tuOZkyZQr33HMPffr0ISgoiNmzZ2fuK6fttm7dmkcffZSrr76aAwcOZNt/b7zxBnFxcfTu3ZvevXsDULly5cxtL1iwgFGjRgEwatQo/vGPf9C7d29CQ0PZvXs3AwYMoHPnzlx33XVs37491343xpuiDp3k9rd/YeqyKK69qg7f/uMG/q9bAKVKeeY8l6cL4vnUs19sIzLuZIFus41/VZ65pW2O87/55hv8/f356quvAEhMTLxomalTp1KzZk3S0tLo27cv4eHhtGjRgoceeojVq1cTGBjIiBEj8oylVatWrF69mjJlyrBy5UqeeuopFi5cyIMPPsjcuXN57bXX2LlzJ8nJyQQHB/PUU0/Rp08f5syZw4kTJ+jatSv9+vUDYM2aNYSHh1OzZs0L9jFt2jQiIiIyk8yKFSvYtWsX69evR1UZMmQIq1evJiAggOjoaD7//HNmzZpFly5d+OSTT/jpp58ICwvjhRdeYMmSJQCEh4ezdu1azpw5Q6dOnRg0aBARERE5bnfHjh28//77mUcs2fXf2LFjmTlzJj/88AO1a9fOs+927tzJypUrKV26NH379uWdd94hKCiIdevW8eijj/L999/nuQ1jPCk5NY1/fx/NW6t2U61CWf71f50Y1L6Bxy96KNZJwRfat2/PuHHjCA0NZfDgwVx33XUXLTN//nxmzZpFamoqhw4dIjIykvT0dJo1a5Z5HfyIESOYNWtWrvtKTExk5MiR7Nq1CxEhJSUFgGHDhvHcc88xffp05syZk/kJecWKFYSFhTFjxgzAdfnu/v37Aejfv/9FCSE7K1asYMWKFXTq5Dp0PX36NLt27SIgIIDAwEDat28PQNu2benbty8iQvv27YmJicncxtChQ6lQoQIVKlSgd+/erF+/np9++inH7TZp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", "text/plain": [ "
" ] diff --git a/idaes_examples/archive/power_gen/supercritical/supercritical_power_plant_src.ipynb b/idaes_examples/archive/power_gen/supercritical/supercritical_power_plant_src.ipynb index ad4caf5d..338f6dbd 100644 --- a/idaes_examples/archive/power_gen/supercritical/supercritical_power_plant_src.ipynb +++ b/idaes_examples/archive/power_gen/supercritical/supercritical_power_plant_src.ipynb @@ -3257,14 +3257,14 @@ "2022-09-16 12:08:39 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.fwh8.cooling.area\n", "2022-09-16 12:08:39 [INFO] idaes.init.Steam Cycle Model: Starting initialization\n", "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.inlet_split: Initialization Complete: optimal - Optimal Solution Found\n", - "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve intialization started\n", - "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve intialization complete\n", - "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve intialization started\n", - "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve intialization complete\n", - "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve intialization started\n", - "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve intialization complete\n", - "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve intialization started\n", - "2022-09-16 12:08:40 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve intialization complete\n", + "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve initialization started\n", + "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve initialization complete\n", + "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve initialization started\n", + "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve initialization complete\n", + "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve initialization started\n", + "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve initialization complete\n", + "2022-09-16 12:08:39 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve initialization started\n", + "2022-09-16 12:08:40 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve initialization complete\n", "2022-09-16 12:08:40 [INFO] idaes.init.fs.turb.inlet_stage[1]: Initialization Complete: optimal - Optimal Solution Found\n", "2022-09-16 12:08:40 [INFO] idaes.init.fs.turb.inlet_stage[2]: Initialization Complete: optimal - Optimal Solution Found\n", "2022-09-16 12:08:40 [INFO] idaes.init.fs.turb.inlet_stage[3]: Initialization Complete: optimal - Optimal Solution Found\n", @@ -3280,14 +3280,14 @@ "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.lp_split[11]: Initialization Complete: optimal - Optimal Solution Found\n", "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.outlet_stage: Initialization Complete (Outlet Stage): optimal - Optimal Solution Found\n", "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.inlet_split: Initialization Complete: optimal - Optimal Solution Found\n", - "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve intialization started\n", - "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve intialization complete\n", - "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve intialization started\n", - "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve intialization complete\n", - "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve intialization started\n", - "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve intialization complete\n", - "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve intialization started\n", - "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve intialization complete\n", + "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve initialization started\n", + "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve initialization complete\n", + "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve initialization started\n", + "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve initialization complete\n", + "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve initialization started\n", + "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve initialization complete\n", + "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve initialization started\n", + "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve initialization complete\n", "2022-09-16 12:08:42 [INFO] idaes.init.fs.turb.inlet_stage[1]: Initialization Complete: optimal - Optimal Solution Found\n", "2022-09-16 12:08:43 [INFO] idaes.init.fs.turb.inlet_stage[2]: Initialization Complete: optimal - Optimal Solution Found\n", "2022-09-16 12:08:43 [INFO] idaes.init.fs.turb.inlet_stage[3]: Initialization Complete: optimal - Optimal Solution Found\n", diff --git a/idaes_examples/archive/power_gen/supercritical/supercritical_steam_cycle_src.ipynb b/idaes_examples/archive/power_gen/supercritical/supercritical_steam_cycle_src.ipynb index 24aed502..d8d5db80 100644 --- a/idaes_examples/archive/power_gen/supercritical/supercritical_steam_cycle_src.ipynb +++ b/idaes_examples/archive/power_gen/supercritical/supercritical_steam_cycle_src.ipynb @@ -1150,14 +1150,14 @@ "2022-09-16 12:10:56 [WARNING] idaes.core.util.scaling: Missing scaling factor for fs.fwh8.cooling.area\n", "2022-09-16 12:10:56 [INFO] idaes.init.Steam Cycle Model: Starting initialization\n", "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.inlet_split: Initialization Complete: optimal - Optimal Solution Found\n", - "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve intialization started\n", - "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve intialization complete\n", - "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve intialization started\n", - "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve intialization complete\n", - "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve intialization started\n", - "2022-09-16 12:10:57 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve intialization complete\n", - "2022-09-16 12:10:57 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve intialization started\n", - "2022-09-16 12:10:57 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve intialization complete\n", + "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve initialization started\n", + "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve initialization complete\n", + "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve initialization started\n", + "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve initialization complete\n", + "2022-09-16 12:10:56 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve initialization started\n", + "2022-09-16 12:10:57 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve initialization complete\n", + "2022-09-16 12:10:57 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve initialization started\n", + "2022-09-16 12:10:57 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve initialization complete\n", "2022-09-16 12:10:57 [INFO] idaes.init.fs.turb.inlet_stage[1]: Initialization Complete: optimal - Optimal Solution Found\n", "2022-09-16 12:10:57 [INFO] idaes.init.fs.turb.inlet_stage[2]: Initialization Complete: optimal - Optimal Solution Found\n", "2022-09-16 12:10:57 [INFO] idaes.init.fs.turb.inlet_stage[3]: Initialization Complete: optimal - Optimal Solution Found\n", @@ -1173,14 +1173,14 @@ "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.lp_split[11]: Initialization Complete: optimal - Optimal Solution Found\n", "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.outlet_stage: Initialization Complete (Outlet Stage): optimal - Optimal Solution Found\n", "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.inlet_split: Initialization Complete: optimal - Optimal Solution Found\n", - "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve intialization started\n", - "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve intialization complete\n", - "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve intialization started\n", - "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve intialization complete\n", - "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve intialization started\n", - "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve intialization complete\n", - "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve intialization started\n", - "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve intialization complete\n", + "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve initialization started\n", + "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[1]: Steam valve initialization complete\n", + "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve initialization started\n", + "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[2]: Steam valve initialization complete\n", + "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve initialization started\n", + "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[3]: Steam valve initialization complete\n", + "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve initialization started\n", + "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.throttle_valve[4]: Steam valve initialization complete\n", "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.inlet_stage[1]: Initialization Complete: optimal - Optimal Solution Found\n", "2022-09-16 12:10:59 [INFO] idaes.init.fs.turb.inlet_stage[2]: Initialization Complete: optimal - Optimal Solution Found\n", "2022-09-16 12:11:00 [INFO] idaes.init.fs.turb.inlet_stage[3]: Initialization Complete: optimal - Optimal Solution Found\n", diff --git a/idaes_examples/archive/ripe/__init__.py b/idaes_examples/archive/ripe/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/idaes_examples/archive/ripe/clc.csv b/idaes_examples/archive/ripe/clc.csv deleted file mode 100644 index de3debbe..00000000 --- a/idaes_examples/archive/ripe/clc.csv +++ /dev/null @@ -1,33 +0,0 @@ -0.079111706,0.024202272 -0.128812507,0.064406608 -0.178362619,0.098030835 -0.224310337,0.13410538 -0.258410748,0.164062818 -0.304140207,0.189085218 -0.347046853,0.221691581 -0.384646869,0.244710317 -0.436366916,0.273685428 -0.489249009,0.303155575 -0.506703599,0.323913195 -0.551429918,0.342154371 -0.607150778,0.372149481 -0.652444747,0.398337777 -0.70285924,0.422371936 -0.754709809,0.449946271 -0.806508955,0.475275176 -0.860822469,0.503894911 -0.917264769,0.527161 -0.967346721,0.551238705 -1.028341715,0.57668451 -1.082502966,0.598655449 -1.136646025,0.619831959 -1.19078226,0.640710558 -1.24480786,0.656758033 -1.298853812,0.673694276 -1.35289624,0.690476598 -1.40652671,0.689270058 -1.460354801,0.696693008 -1.512777561,0.703608801 -1.567937074,0.708311539 -1.62164293,0.710396917 -1.650910985,0.710396917 diff --git a/idaes_examples/archive/ripe/clc.py b/idaes_examples/archive/ripe/clc.py deleted file mode 100644 index 95a9dbcd..00000000 --- a/idaes_examples/archive/ripe/clc.py +++ /dev/null @@ -1,34 +0,0 @@ -################################################################################# -# The Institute for the Design of Advanced Energy Systems Integrated Platform -# Framework (IDAES IP) was produced under the DOE Institute for the -# Design of Advanced Energy Systems (IDAES), and is copyright (c) 2018-2022 -# by the software owners: The Regents of the University of California, through -# Lawrence Berkeley National Laboratory, National Technology & Engineering -# Solutions of Sandia, LLC, Carnegie Mellon University, West Virginia University -# Research Corporation, et al. All rights reserved. -# -# Please see the files COPYRIGHT.md and LICENSE.md for full copyright and -# license information. -################################################################################# -from idaes.surrogate import ripe -import numpy as np -from idaes.surrogate.ripe import mechs as mechs - -def main(): - spec = ['X'] - # Import data from csv - data = np.genfromtxt('clc.csv', delimiter=',') - t = data[:,0] - xdata = data[:,1] - stoich = [1] - - # User pre-defined clc rate forms found in RIPE - # mechs = ripe.clcforms - clc_mechs = [mechs.powerlawp5, mechs.powerlaw2, mechs.powerlaw3, mechs.powerlaw4, mechs.avrami2, mechs.avrami3, mechs.avrami4, mechs.avrami5, mechs.randomnuc, mechs.ptompkins, mechs.jander, mechs.antijander, mechs.valensi, mechs.parabolic, mechs.gb3d, mechs.zlt, mechs.grain] - - # Identify optimal kinetic mechanism - results = ripe.ripemodel(xdata,stoichiometry=stoich,mechanisms=clc_mechs,time=t) - - -if __name__ == "__main__": - main() diff --git a/idaes_examples/archive/ripe/clc_nb_src.ipynb b/idaes_examples/archive/ripe/clc_nb_src.ipynb deleted file mode 100644 index f2f4f810..00000000 --- a/idaes_examples/archive/ripe/clc_nb_src.ipynb +++ /dev/null @@ -1,178 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "36c45c51", - "metadata": { - "tags": [ - "header", - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "###############################################################################\n", - "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n", - "# Framework (IDAES IP) was produced under the DOE Institute for the\n", - "# Design of Advanced Energy Systems (IDAES), and is copyright (c) 2018-2022\n", - "# by the software owners: The Regents of the University of California, through\n", - "# Lawrence Berkeley National Laboratory, National Technology & Engineering\n", - "# Solutions of Sandia, LLC, Carnegie Mellon University, West Virginia University\n", - "# Research Corporation, et al. All rights reserved.\n", - "#\n", - "# Please see the files COPYRIGHT.md and LICENSE.md for full copyright and\n", - "# license information.\n", - "###############################################################################" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Example from:\n", - "\n", - "Wilson, Zachary T., and Nikolaos V. Sahinidis. \"Automated learning of chemical reaction networks.\" Computers & Chemical Engineering 127 (2019): 88-98.\n", - "https://doi.org/10.1016/j.compchemeng.2019.05.020\n", - "\n", - "Case 2: Dynamic Chemical Looping Combusion Reactor\n", - "\n", - "This is an example of a CLC reactor. The kinetic reaction rates encapsulate solid-gas reactions. The kinetic rate laws for this example are semi-physical or empirical to provide insights on the underlying physical mechanisms.\n", - "\n", - "The rate laws are often expressed in terms similar to\n", - "\n", - "$ \\frac{dX}{dT} = kA(X)g(F) $\n", - "\n", - "where $ A(X) $ is a mechanism-dependent activity term, and the function $ g(F) $ is a parametric function of processss conditions, typically in this case the partial pressure of methane used as a fuel. \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Imports and data\n", - "\n", - "from idaes.apps import ripe\n", - "import numpy as np\n", - "from idaes.apps.ripe import mechs as mechs\n", - "\n", - "\n", - "np.random.seed(20)\n", - "\n", - "# Import data from csv\n", - "data = np.genfromtxt(\"clc.csv\", delimiter=\",\")\n", - "t = data[:, 0]\n", - "xdata = data[:, 1]\n", - "\n", - "# Stoichiometry\n", - "# One species\n", - "stoich = [1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We are going to use empirical pre-defined functions from RIPE, defined in the idaes.surrogate.ripe.mechs. The mechanisms depend on only one species for these pre-defined rate forms.\n", - "\n", - "Rate Equation | $ A(x) $\n", - ":--- | :--- \n", - "Random Nucleation | $ 1-x $ \n", - "Power law $n = 2/3, 1.5, 2, 3, 4 $ | $ nx^{(n-1/n)} $\n", - "Avrami-Erofeev $ n = 0.5, 1.5, 2, 3, 4$ | $ n(1-x)(-log(1-x))^{(n-1/n)} $\n", - "Prout Tompkins | $ x(x-1) $\n", - "Jander | $ 3(1-x)^{1/3} (1/(1+x)^{((-1/3)-1)}) $\n", - "Antijander | $ 3/2(1-x)^{(2/3)}(1/(1+x)^{((-1/3)-1)}) $\n", - "Valensi | $ 1/(-log(1-x)) $\n", - "Parabolic | $ 1/2x $\n", - "Ginstling-Brountstein diffusion-3d | $ (3/2)(1-x)^{(4/3)}/((1-x)^{(-1/3)}-1) $\n", - "Zhuralev-Leshokin-Tempelman | $ (3/2)/((1-x)^{(-1/3)}-1) $\n", - "Grain model | $ (1-x)^{(2/3)} $\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# User pre-defined clc rate forms found in RIPE\n", - "# mechs = ripe.clcforms\n", - "clc_mechs = [\n", - " mechs.randomnuc,\n", - " mechs.powerlawp5,\n", - " mechs.powerlaw2,\n", - " mechs.powerlaw3,\n", - " mechs.powerlaw4,\n", - " mechs.avrami2,\n", - " mechs.avrami3,\n", - " mechs.avrami4,\n", - " mechs.avrami5,\n", - " mechs.ptompkins,\n", - " mechs.jander,\n", - " mechs.antijander,\n", - " mechs.valensi,\n", - " mechs.parabolic,\n", - " mechs.gb3d,\n", - " mechs.zlt,\n", - " mechs.grain,\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "All that is left is to run the ripe modeler:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Identify optimal kinetic mechanism\n", - "results = ripe.ripemodel(xdata, stoichiometry=stoich, mechanisms=clc_mechs, time=t)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "idaes": { - "skip": [ - "test" - ] - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/idaes_examples/archive/ripe/crac.py b/idaes_examples/archive/ripe/crac.py deleted file mode 100644 index 91aad9b7..00000000 --- a/idaes_examples/archive/ripe/crac.py +++ /dev/null @@ -1,160 +0,0 @@ -################################################################################# -# The Institute for the Design of Advanced Energy Systems Integrated Platform -# Framework (IDAES IP) was produced under the DOE Institute for the -# Design of Advanced Energy Systems (IDAES), and is copyright (c) 2018-2022 -# by the software owners: The Regents of the University of California, through -# Lawrence Berkeley National Laboratory, National Technology & Engineering -# Solutions of Sandia, LLC, Carnegie Mellon University, West Virginia University -# Research Corporation, et al. All rights reserved. -# -# Please see the files COPYRIGHT.md and LICENSE.md for full copyright and -# license information. -################################################################################# -# This file contains an example application of the RIPE software -# The goal is to identify the reaction kinetics present in a reactor -# where ethylbenzene is converted to styrene, with a number of side products -# -# Initial training sets provided through random or space-filling sampling -# result in incorrect model identification -# Error maximization sampling can be used to refine the model - -import pyomo.environ as pyo -from idaes.surrogate import ripe -import numpy as np -import random -import cracsim - -np.random.seed(100) - -# Define kinetic mechanisms, adsorption parameters must be known a-priori -kco = 35 -kst = 1.5 - -def main(): - Tr = 750.0 - # Experimental variance is known in this problem, - # it can be estimated if not provided - noise = 0.05 - # ndata = 10 in publication example - ndata = 30 - ns = 9 - # Define temperature bounds - Tlo = 500 - Tup = 1000 - # Define range of inlet concentrations - lb = [0,0,0,0,0,1,0,0,1] - ub = [3]*ns - - gc = .008314 - - Temp = np.linspace(Tlo,Tup,ndata) - # Initialize concentration data - - # Inlet concentrations are fixed in publication example - # cdata0 = [[.5,0,0,0,0,4.5,0,0,4.5]]*ndata - cdata0=np.zeros([ndata,ns]) - for i in range(ndata): - for j in range(ns): - cdata0[i,j] = random.uniform(lb[j],ub[j]) - - - # Calculate steady-state concentration values from simulator cracsim.py - cdata = cracsim.sim(np.hstack((cdata0, np.expand_dims(Temp, axis=1)))) - - # In this example, we know the true stoichiometries. Lets define them first for clarity - t_stoich = [[-1,1,0,0,0,0,1,0,0],[-1,0,1,1,0,0,0,0,0],[0,0,0,-1,2,0,-2,0,0],[0,0,0,0,-1,-2,4,1,0]] - # Additional considered stoichiometries are defined - a_stoich = [[-1,0,0,0,0,-16,21,8,0],[-1,0,0,4,0,0,-3,0,0],[0,0,0,-1,0,-4,6,2,0],[-1,0,1,0,2,0,-2,0,0]] - # Index 0-3 are the true reactions, 4-7 are considered reactions - stoichs = t_stoich+a_stoich - - # Define kinetic mechanisms, adsorption parameters must be known a-priori - kco = 35 - kst = 1.5 - - # Mechanisms can be defined for each stoichiometry using a list-of-list - mechs = [[[0,1,3,4,7],eb_dep],[[0],[t_st_prod,cat_st_prod_t1]],[[0,1],cat_ben_prod_t2],[[2,3],meth_prod_t3],[[2,3],ch4_to_co_t4],[[2,3,4,5,6,7],[ma_g,ma_h]]] - - # Experimental variance is known in this case - sigma = np.multiply(noise**2,cdata) - - results = ripe.ripemodel(cdata,stoich = stoichs,mechanisms=mechs,x0=cdata0,temp=Temp,sigma=sigma,tref=Tr) - - -def keq(*x): - a,b,c,d,f,g,h,i,j,T = x - temp = 0.1 + 300/T - return pyo.exp(temp) - -# These mechanisms are present in the simulation -def cat_st_prod_t1(*x): - a,b,c,d,f,g,h,i,j,Temp = x - return (a - (b * h) / keq(*x)) * (1/((1+kst*b)*(1+kco*i))) - -def cat_ben_prod_t2(*x): - # Mechanism for EB > B + C2H4 - a,b,c,d,f,g,h,i,j,Temp = x - return a / (1+kco*i) - -def meth_prod_t3(*x): - # Mechanism for C2H4+4H2O > 2CO2+6H - a,b,c,d,f,g,h,i,j,Temp = x - return d * h - -def ch4_to_co_t4(*x): - a,b,c,d,f,g,h,i,j,Temp = x - #mechanism for CH4+2H2O > CO2+4H2 - return f * g - -# Additional mechanisms are specified for the true stoichiometries and additional stoichs -def eb_dep(*x): - a,b,c,d,f,g,h,i,j,Temp = x - return a - -def t_st_prod(*x): - a,b,c,d,f,g,h,i,j,Temp = x - return (a - (b * h) / keq(*x)) - -def ma_h(*x): - a,b,c,d,f,g,h,i,j,Temp = x - return h - -def ma_g(*x): - a,b,c,d,f,g,h,i,j,Temp = x - return g - - -# The following section of code can be un-commented in order to continue sampling data until an accurate model is obtained -# note that this is considerably more computationally expensive -''' -#Append T bounds for ems variables -lb.append(Tlo) -ub.append(Tup) - -# Call RIPE ems in order to identify the next best sample point -[new_points, err] = ripe.ems(results,cracsim.sim,lb,ub,ns,x=cdata,x0=cdata0,Temp=Temp,Tref=Tr)#,frac=fracfun) -new_res = cracsim.sim(new_points) -ite = 0 -data = cdata -data0 = cdata0 -tdata = Temp.tolist() -# print 'maximum allowable tolerances : ', [2*noise*s for s in new_res] -while any(err > [2*noise*s for s in new_res] ): -# print 'Which concentration : ', err > [noise*s for s in new_res] - data = np.vstack((data,new_res)) - data0 = np.vstack((data0,new_points[:-1])) - tdata.append(new_points[-1]) - results = {} - ite+=1 - sigma = np.multiply(noise**2,np.array(data)) - results = ripe.ripemodel(data,stoich = stoichs,mechanisms=mechs,x0=data0,sigma=sigma,temp=tdata,tref=Tr, hide_output=True) - [new_points, err] = ripe.ems(results,cracsim.sim,lb,ub,10,x=data,x0=data0,temp=tdata,tref=Tr) - new_res = cracsim.sim(new_points) -# print 'currently at '+str(len(data))+' data points' -# print 'proposed new conc : ', new_res -# print 'maximum allowable tolerances : ', [noise*s for s in new_res] -''' - - -if __name__ == "__main__": - main() diff --git a/idaes_examples/archive/ripe/cracsim.py b/idaes_examples/archive/ripe/cracsim.py deleted file mode 100644 index def81369..00000000 --- a/idaes_examples/archive/ripe/cracsim.py +++ /dev/null @@ -1,165 +0,0 @@ -################################################################################# -# The Institute for the Design of Advanced Energy Systems Integrated Platform -# Framework (IDAES IP) was produced under the DOE Institute for the -# Design of Advanced Energy Systems (IDAES), and is copyright (c) 2018-2022 -# by the software owners: The Regents of the University of California, through -# Lawrence Berkeley National Laboratory, National Technology & Engineering -# Solutions of Sandia, LLC, Carnegie Mellon University, West Virginia University -# Research Corporation, et al. All rights reserved. -# -# Please see the files COPYRIGHT.md and LICENSE.md for full copyright and -# license information. -################################################################################# -# This file contains a reactor simulator built in pyomo -# The simulator emulates behavior observed in the production of -# Styrene from ethylbenzene - -import numpy as np -import pyomo.environ as pyo - -# define fractional variance of noise, SNR = 1 / noise -noise = 0.05 - -# Reference temperature defined -Tr = 750.0 -# Kinetic parameters are hard coded in the form [[k1,k2...],[E1,E2,...]] -kinetic_params = [[250,220,38,25],[115,131,55,75]] - - -def sim(data): - import numpy as np - # Enable 1/2d calls - # Ensure that data sizes and shapes are consistent - try: - x0 = data[:,:9] - Temp = data[:,9] - except: - x0 = data[:9] - Temp = data[9] - params = kinetic_params - dshape = np.shape(x0) - if len(dshape) == 1: - x0 = np.expand_dims(x0, axis=-1) - x0 = np.ndarray.transpose(x0) - dshape = np.shape(x0) - npc = dshape[0] - ns = dshape[1] - # Define the reactor simulation in pyomo - def pyomosim(data): - # Define rate parameters - kco = 35 - kst = 1.5 - sparam = 1.0 - flow = 1.0 - vol = 1.0 - gc = .008314 - # Define kinetic rate parameters - k = params[0] - E = params[1] - # define UB for concentration - #nound_ub = 20 - # pyomo solver options - opt = pyo.SolverFactory('baron') - cracmodel = pyo.ConcreteModel() - ca0,cb0,cc0,cd0,cf0,cg0,ch0,ci0,cj0,T = [float(v) for v in data] - - bound_ub = 100.0 - # Define cracmodel variables - # A = Eb , B = St , C = Bz , D = Et, E = Tl, F = Me, G = Water, H = H2 I = CO2, J = N2 - cracmodel.a = pyo.Var(domain = pyo.NonNegativeReals, bounds = (0,bound_ub), initialize = ca0) - cracmodel.b = pyo.Var(domain = pyo.NonNegativeReals, bounds = (0,bound_ub), initialize = cb0) - cracmodel.c = pyo.Var(domain = pyo.NonNegativeReals, bounds = (0,bound_ub), initialize = cc0) - cracmodel.d = pyo.Var(domain = pyo.NonNegativeReals, bounds = (0,bound_ub), initialize = cd0) - cracmodel.f = pyo.Var(domain = pyo.NonNegativeReals, bounds = (0,bound_ub), initialize = cf0) - cracmodel.g = pyo.Var(domain = pyo.NonNegativeReals, bounds = (0,bound_ub), initialize = cg0) - cracmodel.h = pyo.Var(domain = pyo.NonNegativeReals, bounds = (0,bound_ub), initialize = ch0) - cracmodel.i = pyo.Var(domain = pyo.NonNegativeReals, bounds = (0,bound_ub), initialize = ci0) - cracmodel.j = pyo.Var(domain = pyo.NonNegativeReals, bounds = (0,bound_ub), initialize = cj0) - cracmodel.r1 = pyo.Var(domain = pyo.Reals) - cracmodel.r2 = pyo.Var(domain = pyo.Reals) - cracmodel.r4 = pyo.Var(domain = pyo.Reals) - cracmodel.r5 = pyo.Var(domain = pyo.Reals) - - def keq(T): - return pyo.exp(0.1 + (300 / T)) -# return pyo.exp(-1.0*(122700-126.3*T-0.002194*T**2)/(gc*T)) * sparam - # define reaction rate variable - - def fr1(cracmodel): - # A <> B + H - return cracmodel.r1 == k[0] * pyo.exp(-(E[0]/(gc))*((1/T)-(1/Tr))) * (cracmodel.a - (cracmodel.b * cracmodel.h)/keq(T)) * (1.0/((1+kst*cracmodel.b)*(1+kco*cracmodel.i))) - def fr2(cracmodel): - # A > C + D - return cracmodel.r2 == k[1] * pyo.exp(-(E[1]/(gc))*((1/T)-(1/Tr))) * cracmodel.a * (1.0/(1+kco*cracmodel.i)) - - def fr4(cracmodel): - # D + 2H > 2F - return cracmodel.r4 == k[2] * pyo.exp(-(E[2]/(gc))*((1/T)-(1/Tr))) * cracmodel.d * cracmodel.h - def fr5(cracmodel): - # F+G > I + 4H - return cracmodel.r5 == k[3] * pyo.exp(-(E[3]/(gc))*((1/T)-(1/Tr))) * cracmodel.f * cracmodel.g - - cracmodel.er1 = pyo.Constraint( rule = fr1) - cracmodel.er2 = pyo.Constraint( rule = fr2) - cracmodel.er4 = pyo.Constraint( rule = fr4) - cracmodel.er5 = pyo.Constraint( rule = fr5) - cracmodel.sets = pyo.RangeSet(9) - cracmodel.dum = pyo.Var(cracmodel.sets, domain = pyo.Reals) - - def fra(cracmodel): # A - 1,2,3 - return cracmodel.dum[1] == ca0-cracmodel.a - cracmodel.r1 -cracmodel.r2 - def frb(cracmodel): # B - 1 - return cracmodel.dum[2] == cb0-cracmodel.b+cracmodel.r1 - def frc(cracmodel): # C - 2 - return cracmodel.dum[3] == cc0-cracmodel.c+cracmodel.r2 - def frd(cracmodel): # D - 2,4 - return cracmodel.dum[4] == cd0-cracmodel.d+cracmodel.r2-cracmodel.r4 - def frf(cracmodel): # F - 3,4,5 - return cracmodel.dum[5] == cf0-cracmodel.f+2*cracmodel.r4-cracmodel.r5 - def frg(cracmodel): # G - 5 - return cracmodel.dum[6] == cg0-cracmodel.g-2*cracmodel.r5 - def frh(cracmodel): # H - 1,3,4,5 - return cracmodel.dum[7] == ch0-cracmodel.h+cracmodel.r1-2*cracmodel.r4+4*cracmodel.r5 - def fri(cracmodel): # I - 5 - return cracmodel.dum[8] == ci0-cracmodel.i + cracmodel.r5 - def frj(cracmodel): # J - N2 is inert - return cracmodel.dum[9] == cj0-cracmodel.j - - cracmodel.era = pyo.Constraint( rule = fra) - cracmodel.erb = pyo.Constraint( rule = frb) - cracmodel.erc = pyo.Constraint( rule = frc) - cracmodel.erd = pyo.Constraint( rule = frd) - cracmodel.erf = pyo.Constraint( rule = frf) - cracmodel.erg = pyo.Constraint( rule = frg) - cracmodel.erh = pyo.Constraint( rule = frh) - cracmodel.eri = pyo.Constraint( rule = fri) - cracmodel.erj = pyo.Constraint( rule = frj) - - # minimize square of dummy variables to find steady-state concentrations - def objf(cracmodel): - return sum(cracmodel.dum[s]**2 for s in cracmodel.sets) - - cracmodel.OBJ = pyo.Objective(rule = objf) - results = opt.solve(cracmodel) - cracmodel.solutions.store_to(results) - klist = ['a','b','c','d','f','g','h','i','j'] - # Add noise of the specifiec SNR, noise has variance eps ~ N(0,noise*conc) - vn = [results.Solution.Variable[key]['Value']+np.random.normal(0,noise*results.Solution.Variable[key]['Value']) for key in klist] - return vn - - # Simulate over requested datapoints - # requested data may have 1 or more points - concentrations = [] - if npc != 1: - for i in range(npc): - try: - t2 = Temp[0][i] - except: - t2 = Temp[i] - conres = pyomosim(np.ndarray.tolist(x0[i,:])+[t2]) - - concentrations.append(conres) - else: - conres = pyomosim(data) - concentrations = conres - return concentrations diff --git a/idaes_examples/archive/ripe/index.md b/idaes_examples/archive/ripe/index.md deleted file mode 100644 index 99152f29..00000000 --- a/idaes_examples/archive/ripe/index.md +++ /dev/null @@ -1 +0,0 @@ -# RIPE \ No newline at end of file diff --git a/idaes_examples/archive/ripe/isoT.py b/idaes_examples/archive/ripe/isoT.py deleted file mode 100644 index 9ac1b95f..00000000 --- a/idaes_examples/archive/ripe/isoT.py +++ /dev/null @@ -1,94 +0,0 @@ -################################################################################# -# The Institute for the Design of Advanced Energy Systems Integrated Platform -# Framework (IDAES IP) was produced under the DOE Institute for the -# Design of Advanced Energy Systems (IDAES), and is copyright (c) 2018-2022 -# by the software owners: The Regents of the University of California, through -# Lawrence Berkeley National Laboratory, National Technology & Engineering -# Solutions of Sandia, LLC, Carnegie Mellon University, West Virginia University -# Research Corporation, et al. All rights reserved. -# -# Please see the files COPYRIGHT.md and LICENSE.md for full copyright and -# license information. -################################################################################# -import pyomo.environ as pyo -from idaes.surrogate import ripe -import numpy as np -import random -import isotsim - -np.random.seed(20) - - -def main(): - - #ndata = 100 - noise = 0.1 - ns = 5 - lb_conc = [0,0,0,0,0] - ub_conc = [10,10,0,0,0] - - - # Initialize concentration arrays - - # initial concentrations - only 2 data points at bounds - cdata0 = [[1,1,0,0,0],[10,10,0,0,0]] - cdata = isotsim.sim(cdata0) - nd = len(cdata0) - - # Considered reaction stoichiometries - stoich = [[-1,-1,1,0,0] ,[0,-1,-1,1,0],[-1,0,0,-1,1],[-1,-2,0,1,0] ,[-2,-2,0,0,1],[-1,-1,-1,0,1],[-2,-1,1,-1,1]] - - # IRIPE internal mass action kinetics are specified - rxn_mechs = [['all','massact']] - - # Use expected variance - estimated from data if not provided - sigma = np.multiply(noise**2,np.array(cdata)) - - # Call to RIPE - results = ripe.ripemodel(cdata,stoich = stoich,mechanisms=rxn_mechs,x0=cdata0,hide_output=False,sigma=sigma,deltaterm=0,expand_output=True) - - # Adaptive experimental design using error maximization sampling - [new_points, err] = ripe.ems(results, isotsim.sim, lb_conc, ub_conc, 5, x=cdata, x0=cdata0) - - # Implement EMS as described in the RIPE publication - new_res = isotsim.sim(new_points)[0] - ite = 0 - # print 'maximum allowable tolerances : ', [noise*s for s in new_res] - while any(err > [2*noise*s for s in new_res] ): - # print 'Which concentrations violate error (True=violation) : ', err > [noise*s for s in new_res] - results = {} - ite+=1 - # Data updated explicitly so RBFopt subroutines produce consistent results - new_cdata0 = np.zeros([nd+ite,ns]) - new_cdata = np.zeros([nd+ite,ns]) - new_cdata0[:-1][:] = cdata0[:][:] - new_cdata[:-1][:] = cdata[:][:] - new_cdata0[-1][:] = new_points[:] - res = isotsim.sim(new_points)[0] - for j in range(len(res)): - new_cdata[-1][j] = res[j] - - #Update weight parameters - sigma = np.multiply(noise**2,np.array(new_cdata)) - - # Build updated RIPE model - results = ripe.ripemodel(new_cdata,stoich = stoich,mechanisms=rxn_mechs,x0=new_cdata0,sigma=sigma,expand_output=True) - - # Another call to EMS - [new_points, err] = ripe.ems(results, isotsim.sim, lb_conc, ub_conc, 5, x=cdata, x0=cdata0) - - # Update results - new_res = isotsim.sim(new_points)[0] - cdata0 = new_cdata0 - cdata = new_cdata - - # Final call to RIPE to get concise output - results = ripe.ripemodel(cdata,stoich = stoich,mechanisms=rxn_mechs,x0=cdata0,sigma=sigma,expand_output=False) - #print results - - -if __name__ == "__main__": - main() - - - diff --git a/idaes_examples/archive/ripe/isotsim.py b/idaes_examples/archive/ripe/isotsim.py deleted file mode 100644 index 05b13e78..00000000 --- a/idaes_examples/archive/ripe/isotsim.py +++ /dev/null @@ -1,112 +0,0 @@ -################################################################################# -# The Institute for the Design of Advanced Energy Systems Integrated Platform -# Framework (IDAES IP) was produced under the DOE Institute for the -# Design of Advanced Energy Systems (IDAES), and is copyright (c) 2018-2022 -# by the software owners: The Regents of the University of California, through -# Lawrence Berkeley National Laboratory, National Technology & Engineering -# Solutions of Sandia, LLC, Carnegie Mellon University, West Virginia University -# Research Corporation, et al. All rights reserved. -# -# Please see the files COPYRIGHT.md and LICENSE.md for full copyright and -# license information. -################################################################################# -import numpy as np -noise = 0.1 - - -def sim(data): - x0 = data - params = [1.5,2.1,0.9] - #pyomo simulator for cracking example - import numpy as np - import pyomo.environ as pyo - - dshape = np.shape(x0) - - if len(dshape) == 1: - x0 = np.expand_dims(x0, axis=-1) - x0 = np.ndarray.transpose(x0) - dshape = np.shape(x0) - npc = dshape[0] - ns = dshape[1] - if dshape[0] == 1: - xo = [x0]*npc - - def pyomosim(x0): - # Define rate parameters - flow = 1.0 - vol = 1.0 - gc = 8.314 - # Define kinetic rate parameters - k = params - a0,b0,c0,d0,e0 = np.array(x0).T.tolist() - opt = pyo.SolverFactory('baron') - model = pyo.ConcreteModel() -# bound_ub = 100 - # Define model variables - model.a = pyo.Var(domain = pyo.NonNegativeReals)#, bounds = (0.0,bound_ub)) - model.b = pyo.Var(domain = pyo.NonNegativeReals)#, bounds = (0.0,bound_ub)) - model.c = pyo.Var(domain = pyo.NonNegativeReals)#, bounds = (0.0,bound_ub)) - model.d = pyo.Var(domain = pyo.NonNegativeReals)#, bounds = (0.0,bound_ub)) - model.e = pyo.Var(domain = pyo.NonNegativeReals)#, bounds = (0.0,bound_ub)) - model.dset = pyo.RangeSet(5) - model.dum = pyo.Var(model.dset) - - model.r1 = pyo.Var(domain = pyo.Reals) - model.r2 = pyo.Var(domain = pyo.Reals) - model.r3 = pyo.Var(domain = pyo.Reals) - - def fr1(model): - return model.r1 == k[0] * model.a * model.b - def fr2(model): - return model.r2 == k[1] * model.b * model.c - def fr3(model): - return model.r3 == k[2] * model.a * model.d - - model.er1 = pyo.Constraint( rule = fr1) - model.er2 = pyo.Constraint( rule = fr2) - model.er3 = pyo.Constraint( rule = fr3) - - num = 1.0 - def fra(model): - return num * model.dum[1] == (flow/vol)*(a0-model.a ) - model.r1 -model.r3 - def frb(model): - return num * model.dum[2] == (flow/vol)*(b0-model.b ) - model.r1 - model.r2 - def frc(model): - return num * model.dum[3] == (flow/vol)*(c0-model.c) + model.r1 - model.r2 - def frd(model): - return num * model.dum[4] == (flow/vol)*(d0-model.d) + model.r2 - model.r3 - def fre(model): - return num * model.dum[5] == (flow/vol)*(e0-model.e) + model.r3 - - model.era = pyo.Constraint(rule=fra) - model.erb = pyo.Constraint( rule = frb) - model.erc = pyo.Constraint( rule = frc) - model.erd = pyo.Constraint( rule = frd) - model.ere = pyo.Constraint( rule = fre) - - def objf(model): - return sum([ model.dum[i]**2 for i in model.dset]) - - model.OBJ = pyo.Objective(rule = objf) - - results = opt.solve(model, tee=False) - model.solutions.store_to(results) - # Note: noise is not truly normally distributed as concentration values cannot be negative -# print 'debug this : ', results.Solution.Variable['a']['Value'],np.random.normal(0,noise*results.Solution.Variable['a']['Value']),np.argmax([0.0,results.Solution.Variable['a']['Value']+np.random.normal(0,noise*results.Solution.Variable['a']['Value'])]) - v = [results.Solution.Variable[key]['Value'] for key in ['a','b','c','d','e']] - vn = [results.Solution.Variable[key]['Value']+np.random.normal(0,noise*results.Solution.Variable[key]['Value']) for key in ['a','b','c','d','e']] - tsum = 0 - for i in range(5): - if vn[i] < 0: - vn[i] = v[i] - tsum+= 1 -# print 'total number of zeros : ', tsum - return vn - - # Simulate over requested datapoints - concentrations = [] - for i in range(npc): - conres = pyomosim(x0[i]) - concentrations.append(conres) - return concentrations diff --git a/idaes_examples/archive/ripe/ripe_isothermal_cstr_src.ipynb b/idaes_examples/archive/ripe/ripe_isothermal_cstr_src.ipynb deleted file mode 100644 index 66222900..00000000 --- a/idaes_examples/archive/ripe/ripe_isothermal_cstr_src.ipynb +++ /dev/null @@ -1,330 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "13a2fb8e", - "metadata": { - "tags": [ - "header", - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "###############################################################################\n", - "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n", - "# Framework (IDAES IP) was produced under the DOE Institute for the\n", - "# Design of Advanced Energy Systems (IDAES), and is copyright (c) 2018-2022\n", - "# by the software owners: The Regents of the University of California, through\n", - "# Lawrence Berkeley National Laboratory, National Technology & Engineering\n", - "# Solutions of Sandia, LLC, Carnegie Mellon University, West Virginia University\n", - "# Research Corporation, et al. All rights reserved.\n", - "#\n", - "# Please see the files COPYRIGHT.md and LICENSE.md for full copyright and\n", - "# license information.\n", - "###############################################################################" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Example from:\n", - "\n", - "Wilson, Zachary T., and Nikolaos V. Sahinidis. \"Automated learning of chemical reaction networks.\" Computers & Chemical Engineering 127 (2019): 88-98.\n", - "https://doi.org/10.1016/j.compchemeng.2019.05.020\n", - "\n", - "*Case 1: Isothermal CSTR*\n", - "\n", - "For isothermal CSTRs across a known range of feed concentrations, $C_s^l \\leq C_s^0 \\leq C_s^u$, s $\\in$ F. \n", - "\n", - "The simulated reaction networks id defined below, where $k_1^{true} = 1.5$, $k_2^{true} = 2.1$, and $k_3^{true} = 0.9$ with a residence time of $\\tau = 1$ is used for the reactor. \n", - "\n", - "\n", - "$A + B \\rightarrow C \\quad \\{{k_1^{true}}\\}$ \n", - "\n", - "$B + C \\rightarrow D \\quad \\{{k_2^{true}}\\}$\n", - "\n", - "$A + D \\rightarrow E \\quad \\{{k_3^{true}}\\}$\n", - "\n", - "Initial concentrations are specificed for species $F = {A,B}$ over the range $0 \\leq C_s^0 \\leq 10$, $s\\in F$." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Imports\n", - "\n", - "import pyomo.environ as pyo\n", - "from idaes.apps import ripe\n", - "import numpy as np\n", - "import random\n", - "import isotsim\n", - "\n", - "np.random.seed(20)\n", - "\n", - "# Setup the problem\n", - "noise = 0.1\n", - "ns = 5 # number of species\n", - "lb_conc = [0, 0, 0, 0, 0]\n", - "ub_conc = [10, 10, 0, 0, 0]\n", - "\n", - "# initial concentrations - only 2 data points\n", - "cdata0 = [[1, 1, 0, 0, 0], [10, 10, 0, 0, 0]]\n", - "cdata = isotsim.sim(cdata0)\n", - "nd = len(cdata0) # number of data points\n", - "\n", - "# Expected variance based off the noise in the data\n", - "sigma = np.multiply(noise**2, np.array(cdata))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The postulated set reaction stoichiometries is defined as:\n", - "\n", - "$ A + B \\rightarrow C $\n", - "\n", - "$ B + C \\rightarrow D $\n", - "\n", - "$ A + D \\rightarrow E $\n", - "\n", - "$ A + 2B \\rightarrow D $\n", - "\n", - "$ 2A + 2B \\rightarrow E $\n", - "\n", - "$ A + B + C \\rightarrow E $\n", - "\n", - "$ 2A + B + D \\rightarrow C + E$\n", - "\n", - "$ C + D \\rightarrow E + A $\n", - "\n", - "$ 3A + 3B \\rightarrow C + E $\n", - "\n", - "$ 3A + 4B \\rightarrow D + E $\n", - "\n", - "$ 2A + 3B \\rightarrow C + D $\n", - "\n", - "$ 4A + 5B \\rightarrow C + D + E $" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# considered reaction stoichiometries\n", - "# A B C D E\n", - "stoich = [\n", - " [-1, -1, 1, 0, 0],\n", - " [0, -1, -1, 1, 0],\n", - " [-1, 0, 0, -1, 1],\n", - " [-1, -2, 0, 1, 0],\n", - " [-2, -2, 0, 0, 1],\n", - " [-1, -1, -1, 0, 1],\n", - " [-2, -1, 1, -1, 1],\n", - " [1, 0, -1, -1, 1],\n", - " [-3, -3, 1, 0, 1],\n", - " [-3, -4, 0, 1, 1],\n", - " [-2, -3, 1, 1, 0],\n", - " [-4, -5, 1, 1, 1],\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We have the initial conditions and possible stoichiometries to consider, but we still need the kinetics reaction mechanisms. Reaction mechanisms require a stoichiometry and kinetic model. In this case, we will be using mass action kinetics for all the stoichiometries available, which is built into RIPE." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# IRIPE internal mass action kinetics are specified\n", - "rxn_mechs = [[\"all\", \"massact\"]]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we are ready to run the RIPE model builder:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "results = ripe.ripemodel(\n", - " cdata,\n", - " stoich=stoich,\n", - " mechanisms=rxn_mechs,\n", - " x0=cdata0,\n", - " hide_output=False,\n", - " sigma=sigma,\n", - " deltaterm=0,\n", - " expand_output=True,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Based on the number of data points, the best model chosen is only one reaction.\n", - "\n", - "$ 4A + 5B \\rightarrow C + D + E $\n", - "\n", - "So similar to how ALAMO iterates between developing a model and adding additional points with error maximization, RIPE provides methods to do the same." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Adaptive experimental design using error maximization sampling\n", - "[new_points, err] = ripe.ems(\n", - " results, isotsim.sim, lb_conc, ub_conc, 5, x=cdata, x0=cdata0 # number of species\n", - ")\n", - "print(\"New Point\", new_points)\n", - "print(\"Error\", err)\n", - "\n", - "# Implement EMS as described in the RIPE publication\n", - "new_res = isotsim.sim(new_points)[0]\n", - "print(\"New Result\", new_res)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Running ripe.ems gives us additional points maximizing the error that we can use to develop a new model until our error tolerance is achieved. A common loop in using RIPE follows:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ite = 0\n", - "\n", - "while any(err > [2 * noise * s for s in new_res]):\n", - " print(\n", - " \"Which concentrations violate error (True=violation) : \",\n", - " err > [noise * s for s in new_res],\n", - " )\n", - " results = {}\n", - " ite += 1\n", - "\n", - " # Data updated explicitly\n", - " # so RBFopt subroutines produce consistent results\n", - "\n", - " new_cdata0 = np.zeros([nd + ite, ns])\n", - " new_cdata = np.zeros([nd + ite, ns])\n", - " new_cdata0[:-1][:] = cdata0[:][:]\n", - " new_cdata[:-1][:] = cdata[:][:]\n", - " new_cdata0[-1][:] = new_points[:]\n", - " res = isotsim.sim(new_points)[0]\n", - " for j in range(len(res)):\n", - " new_cdata[-1][j] = res[j]\n", - "\n", - " # Update weight parameters\n", - " sigma = np.multiply(noise**2, np.array(new_cdata))\n", - "\n", - " # Build updated RIPE model\n", - " results = ripe.ripemodel(\n", - " new_cdata,\n", - " stoich=stoich,\n", - " mechanisms=rxn_mechs,\n", - " x0=new_cdata0,\n", - " sigma=sigma,\n", - " expand_output=True,\n", - " )\n", - "\n", - " # Another call to EMS\n", - " [new_points, err] = ripe.ems(\n", - " results, isotsim.sim, lb_conc, ub_conc, 5, x=cdata, x0=cdata0\n", - " )\n", - "\n", - " # Update results\n", - " new_res = isotsim.sim(new_points)[0]\n", - " cdata0 = new_cdata0\n", - " cdata = new_cdata" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The results can vary, but RIPE can identify the simulated system of:\n", - "\n", - "$A + B \\rightarrow C \\quad \\{{k_1^{true}}\\}$ \n", - "\n", - "$B + C \\rightarrow D \\quad \\{{k_2^{true}}\\}$\n", - "\n", - "$A + D \\rightarrow E \\quad \\{{k_3^{true}}\\}$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Final call to RIPE to get concise output\n", - "results = ripe.ripemodel(\n", - " cdata,\n", - " stoich=stoich,\n", - " mechanisms=rxn_mechs,\n", - " x0=cdata0,\n", - " sigma=sigma,\n", - " expand_output=False,\n", - ")\n", - "print(results)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/idaes_examples/archive/ripe/sv.alm b/idaes_examples/archive/ripe/sv.alm deleted file mode 100644 index 4832c0c6..00000000 --- a/idaes_examples/archive/ripe/sv.alm +++ /dev/null @@ -1,23 +0,0 @@ -linfcns 1 -funform 1 -trace 1 -tracefname temptrace.trc -solvemip 1 -ninputs 1 -noutputs 1 -xlabels st -modeler 1 -monomialpower 0.5 1 1.5 2 -logfcns 1 -expfcns 1 -constant 0 -xmin 0 -xmax 1.650910985 -cvxbic 1 -initialpoints 3 -ndata 3 -begin_data -1.512777561 0.703608801 -1.567937074 0.708311539 -1.62164293 0.710396917 -end_data diff --git a/idaes_examples/archive/ripe/temp.alm b/idaes_examples/archive/ripe/temp.alm deleted file mode 100644 index 4832c0c6..00000000 --- a/idaes_examples/archive/ripe/temp.alm +++ /dev/null @@ -1,23 +0,0 @@ -linfcns 1 -funform 1 -trace 1 -tracefname temptrace.trc -solvemip 1 -ninputs 1 -noutputs 1 -xlabels st -modeler 1 -monomialpower 0.5 1 1.5 2 -logfcns 1 -expfcns 1 -constant 0 -xmin 0 -xmax 1.650910985 -cvxbic 1 -initialpoints 3 -ndata 3 -begin_data -1.512777561 0.703608801 -1.567937074 0.708311539 -1.62164293 0.710396917 -end_data diff --git a/idaes_examples/archive/ripe/temp.lst b/idaes_examples/archive/ripe/temp.lst deleted file mode 100644 index 0f23cb5d..00000000 --- a/idaes_examples/archive/ripe/temp.lst +++ /dev/null @@ -1,160 +0,0 @@ - *************************************************************************** - ALAMO version 2022.10.7. Built: WIN-64 Fri Oct 7 21:02:38 EDT 2022 - -The options and data used in solving this problem are as follows: - -NINPUTS = 1 -NOUTPUTS = 1 -NTRANS = 0 -NCVF = 5 -NPENL = 100 -NDATA = 3 -NPREDATA = 0 -NSAMPLE = 0 -NVALDATA = 0 -NVALSAMPLE = 0 -NVALSETS = 0 -PRFREQ = 1 -INITIALPOINTS = 3 -SAMPLER = 1 -MODELER = 1 -INITIALIZER = 3 -BUILDER = 1 -ENUM1 = 16384 -ENUMALL = 0 -GREEDYBUILDER = T -NDGELS = 120 -SCREENER = 0 -SISMULT = 1 -MAXSIM = 10 -MINPOINTS = 1 -MAXPOINTS = 7 -OBJFUN = 1 -SNOBFITP = 0.5 -SNOBFITRESOLUTION = 0.100000000000E-004 -MAXTIME = 1000 -DATALIMITTERMS = T -NUMLIMITBASIS = T -CONVPEN = 0 -MONO = 3 -MULTI2 = 0 -MULTI3 = 0 -RATIOS = 0 -EXPFCNS = T -LINFCNS = T -LOGFCNS = T -SINFCNS = F -COSFCNS = F -CONSTANT = F -GRBFCNS = F -PRBF = F -LK = F -NCUSTOMBAS = 0 -OTHERBASIS = 0 -USEGPU = F -XSCALING = F -SCALEZ = F -MAXITER = 1 -TOLESTERROR = 0.999999977648E-002 -TOLSSE = 0 -FUNFORM = 1 -RBFPARAM = 1 -PRESET = -111111 -LINEARERROR = F -SOLVEMIP = F -DELTATERM = T -SHORTCUT = T -DIVE = T -FIRSTFEAS = F -MIPOPTCA = 0.500000007451E-001 -MIPOPTCR = 0.999999974738E-004 -CRTOL = 0.100000000000E-002 -CRNINITIAL = 0 -CRMAXITER = 10 -CRNVIOL = 5 -CRNTRIALS = 100 -CRNCUSTOM = 0 -NGROUPS = 0 -SIMULATOR = mysim -SIMIN = input.txt -SIMOUT = output.txt -SCRATCH = almscr -BARONEXE = almbaron.exe -=========================================================================== - -XLABELS XMIN XMAX XISINT -st 0.00000000000 1.65091098500 F -ZLABELS TOLMEANERROR TOLRELMETRIC TOLABSMETRIC MAXTERMS ZISINT TOLMAXERROR -Z1 0.00000000000 0.100000000000E-005 0.100000000000E-005 5 F 0.500000000000E-001 - -XDATA and ZDATA - 1.512777561 0.703608801 - 1.567937074 0.708311539 - 1.62164293 0.710396917 - -MONOPOWERS -0.5 1.5 2 -=========================================================================== -Total number of bases considered = 5 - -BASES considered - st - exp(st) - st**0.5 - st**1.5 - st**2 -=========================================================================== - - Step 0: Initializing data set - User provided an initial data set of 3 data points - We will sample no more data points at this stage - *************************************************************************** - Iteration 1 (Approx. elapsed time 0.0 s) - - Step 1: Model building using BIC - - Model building for variable Z1 - sigma in almsurr1 = 1.00000000000000 - ---- - BIC = 1.10 with Z1 = 0.56503112463080173988317 * st**0.5 - - Calculating quality metrics on observed data set. - Errors on observed data points - (for each data point: x, z, zmodel, square error, absolute error): - 1.512777561 0.703608801 0.694960160025 0.747989907093E-004 1.22918317145 - 1.567937074 0.708311539 0.707516685047 0 0.112218128562 - 1.62164293 0.710396917 0.71953179251 0.834459505821E-004 1.28588332682 - Maximum absolute errors (%) on observed data points - 1.28588332682 - - - Quality metrics for output Z1 - ----------------------------- - SSE OLR: 0.850E-30 - SSE: 0.159E-03 - RMSE: 0.728E-02 - R2: 1.00 - R2 adjusted: 1.00 - Model size: 1 - BIC: 1.10 - Cp: -1.00 - AICc: -23.5 - HQC: -29.3 - MSE: 0.159E-03 - SSEp: 0.159E-03 - RIC: 3.22 - MADp: 1.29 - - BETAS and BASES chosen for this output - 0.565031124630802 st**0.5 - - - Total execution time 0.0 s - Times breakdown - OLR time: 0.0 s in 16 ordinary linear regression problem(s) - MIP time: 0.0 s in 0 quadratic integer problem(s) - Simulation time: 0.0 s to simulate 0 point(s) - All other time: 0.0 s in 1 iteration(s) - - Normal termination - *************************************************************************** diff --git a/idaes_examples/archive/ripe/temptrace.trc b/idaes_examples/archive/ripe/temptrace.trc deleted file mode 100644 index 644e83b2..00000000 --- a/idaes_examples/archive/ripe/temptrace.trc +++ /dev/null @@ -1,76 +0,0 @@ -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 32, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.379E-03, 0.881E-01, 0.525E-01, 0.988, 1, 3.55, 3.31, -29.9, -187., -186., 0.294E-02, 0.881E-01, 69.6, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 32, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.51900110087274464731877 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 29, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.359E-03, 0.409E-01, 0.376E-01, 0.993, 1, 3.41, 3.26, -27.0, -188., -188., 0.151E-02, 0.409E-01, 77.6, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 29, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.54326638220273648638425 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 26, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.143E-03, 0.176E-01, 0.260E-01, 0.996, 1, 3.28, 3.24, -24.0, -188., -187., 0.733E-03, 0.176E-01, 84.4, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 26, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.56409136389973191239022 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 23, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.125E-03, 0.821E-02, 0.189E-01, 0.998, 1, 3.14, 3.23, -21.0, -180., -180., 0.391E-03, 0.821E-02, 89.9, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 23, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.58097796099196175045876 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 20, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.117E-03, 0.369E-02, 0.136E-01, 0.998, 1, 3.00, 3.22, -18.0, -170., -170., 0.205E-03, 0.369E-02, 94.9, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 20, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.59627190907604532554842 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 17, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.109E-03, 0.192E-02, 0.106E-01, 0.999, 1, 2.84, 3.22, -15.0, -152., -152., 0.128E-03, 0.192E-02, 99.0, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 17, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.60891015104919832268138 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 14, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.107E-03, 0.130E-02, 0.962E-02, 0.999, 1, 2.64, 3.22, -12.0, -128., -128., 0.108E-03, 0.130E-02, 102., 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 14, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.61924197147691284470739 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 11, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.958E-04, 0.122E-02, 0.105E-01, 0.997, 1, 2.40, 3.22, -9.00, -97.7, -98.4, 0.136E-03, 0.122E-02, 104., 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 11, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.62387747636893386982138 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 8, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.368E-04, 0.113E-02, 0.119E-01, 0.994, 1, 2.08, 3.22, -6.00, -68.2, -69.5, 0.188E-03, 0.113E-02, 102., 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 8, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.61718699265488141669778 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 5, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.618E-29, 0.625E-04, 0.354E-02, 0.999, 1, 1.61, 3.22, -3.00, -53.1, -55.5, 0.208E-04, 0.625E-04, 16.5, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 5, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 1.2673175353245353935705 * st**1.5 -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.143E-30, 0.173E-04, 0.240E-02, 1.00, 1, 1.10, 3.22, -1.00, -30.2, -36.0, 0.173E-04, 0.173E-04, 1.87, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.63334822685992542279365 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.918E-30, 0.486E-04, 0.403E-02, 1.00, 1, 1.10, 3.22, -1.00, -27.1, -32.9, 0.486E-04, 0.486E-04, 1.59, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.62906836705257784814194 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.185E-31, 0.183E-04, 0.247E-02, 1.00, 1, 1.10, 3.22, -1.00, -30.0, -35.8, 0.183E-04, 0.183E-04, 1.03, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.61409670114056258416468 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.496E-30, 0.222E-04, 0.272E-02, 1.00, 1, 1.10, 3.22, -1.00, -29.4, -35.3, 0.222E-04, 0.222E-04, 0.913, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.21105498219212401322942 * exp(st) -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.123E-30, 0.394E-04, 0.363E-02, 1.00, 1, 1.10, 3.22, -1.00, -27.7, -33.5, 0.394E-04, 0.394E-04, 0.986, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.21095275318545478326904 * exp(st) -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.111E-30, 0.871E-04, 0.539E-02, 1.00, 1, 1.10, 3.22, -1.00, -25.3, -31.2, 0.871E-04, 0.871E-04, 1.17, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.57536306576793760925170 * st**0.5 -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.740E-31, 0.101E-04, 0.184E-02, 1.00, 1, 1.10, 3.22, -1.00, -31.8, -37.6, 0.101E-04, 0.101E-04, 0.355, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.58903135703939046852184 * st**0.5 -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.281E-29, 0.218E-03, 0.852E-02, 1.00, 1, 1.10, 3.22, -1.00, -22.6, -28.4, 0.218E-03, 0.218E-03, 1.70, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.58356040616139981391797 * st**0.5 -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.850E-30, 0.159E-03, 0.728E-02, 1.00, 1, 1.10, 3.22, -1.00, -23.5, -29.3, 0.159E-03, 0.159E-03, 1.29, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.56503112463080173988317 * st**0.5 -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 32, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.379E-03, 0.881E-01, 0.525E-01, 0.988, 1, 3.55, 3.31, -29.9, -187., -186., 0.294E-02, 0.881E-01, 69.6, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 32, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.51900110087274464731877 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 29, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.359E-03, 0.409E-01, 0.376E-01, 0.993, 1, 3.41, 3.26, -27.0, -188., -188., 0.151E-02, 0.409E-01, 77.6, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 29, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.54326638220273648638425 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 26, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.143E-03, 0.176E-01, 0.260E-01, 0.996, 1, 3.28, 3.24, -24.0, -188., -187., 0.733E-03, 0.176E-01, 84.4, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 26, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.56409136389973191239022 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 23, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.125E-03, 0.821E-02, 0.189E-01, 0.998, 1, 3.14, 3.23, -21.0, -180., -180., 0.391E-03, 0.821E-02, 89.9, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 23, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.58097796099196175045876 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 20, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.117E-03, 0.369E-02, 0.136E-01, 0.998, 1, 3.00, 3.22, -18.0, -170., -170., 0.205E-03, 0.369E-02, 94.9, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 20, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.59627190907604532554842 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 17, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.109E-03, 0.192E-02, 0.106E-01, 0.999, 1, 2.84, 3.22, -15.0, -152., -152., 0.128E-03, 0.192E-02, 99.0, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 17, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.60891015104919832268138 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 14, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.107E-03, 0.130E-02, 0.962E-02, 0.999, 1, 2.64, 3.22, -12.0, -128., -128., 0.108E-03, 0.130E-02, 102., 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 14, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.61924197147691284470739 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 11, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.958E-04, 0.122E-02, 0.105E-01, 0.997, 1, 2.40, 3.22, -9.00, -97.7, -98.4, 0.136E-03, 0.122E-02, 104., 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 11, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.62387747636893386982138 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 8, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.368E-04, 0.113E-02, 0.119E-01, 0.994, 1, 2.08, 3.22, -6.00, -68.2, -69.5, 0.188E-03, 0.113E-02, 102., 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 8, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.61718699265488141669778 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 5, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.618E-29, 0.625E-04, 0.354E-02, 0.999, 1, 1.61, 3.22, -3.00, -53.1, -55.5, 0.208E-04, 0.625E-04, 16.5, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 5, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 1.2673175353245353935705 * st**1.5 -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.143E-30, 0.173E-04, 0.240E-02, 1.00, 1, 1.10, 3.22, -1.00, -30.2, -36.0, 0.173E-04, 0.173E-04, 1.87, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.63334822685992542279365 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.918E-30, 0.486E-04, 0.403E-02, 1.00, 1, 1.10, 3.22, -1.00, -27.1, -32.9, 0.486E-04, 0.486E-04, 1.59, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.62906836705257784814194 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.185E-31, 0.183E-04, 0.247E-02, 1.00, 1, 1.10, 3.22, -1.00, -30.0, -35.8, 0.183E-04, 0.183E-04, 1.03, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.61409670114056258416468 * st -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.496E-30, 0.222E-04, 0.272E-02, 1.00, 1, 1.10, 3.22, -1.00, -29.4, -35.3, 0.222E-04, 0.222E-04, 0.913, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.21105498219212401322942 * exp(st) -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.123E-30, 0.394E-04, 0.363E-02, 1.00, 1, 1.10, 3.22, -1.00, -27.7, -33.5, 0.394E-04, 0.394E-04, 0.986, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.21095275318545478326904 * exp(st) -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.111E-30, 0.871E-04, 0.539E-02, 1.00, 1, 1.10, 3.22, -1.00, -25.3, -31.2, 0.871E-04, 0.871E-04, 1.17, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.57536306576793760925170 * st**0.5 -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.740E-31, 0.101E-04, 0.184E-02, 1.00, 1, 1.10, 3.22, -1.00, -31.8, -37.6, 0.101E-04, 0.101E-04, 0.355, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.58903135703939046852184 * st**0.5 -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.281E-29, 0.218E-03, 0.852E-02, 1.00, 1, 1.10, 3.22, -1.00, -22.6, -28.4, 0.218E-03, 0.218E-03, 1.70, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.58356040616139981391797 * st**0.5 -#filename, NINPUTS, NOUTPUTS, INITIALPOINTS, OUTPUT, SET, INITIALIZER, SAMPLER, MODELER, BUILDER, GREEDYBUILD, BACKSTEPPER, GREEDYBACK, REGULARIZER, SOLVEMIP, SSEOLR, SSE, RMSE, R2, ModelSize, BIC, RIC, Cp, AICc, HQC, MSE, SSEp, MADp, OLRTime, numOLRs, OLRoneCalls, OLRoneFails, OLRgsiCalls, OLRgsiFails, OLRdgelCalls, OLRdgelFails, OLRclrCalls, OLRclrFails, OLRgmsCalls, OLRgmsFails, CLRTime, numCLRs, MIPTime, NumMIPs, LassoTime, Metric1Lasso, Metric2Lasso, LassoSuccess, LassoRed, nBasInitAct, nBas, SimTime, SimData, TotData, NdataConv, OtherTime, NumIters, IterConv, TimeConv, Step0Time, Step1Time, Step2Time, TotalTime, AlamoStatus, AlamoVersion, Model -temp.alm, 1, 1, 3, 1, 0, 3, 1, 1, 1, T, 0, T, 0, F, 0.850E-30, 0.159E-03, 0.728E-02, 1.00, 1, 1.10, 3.22, -1.00, -23.5, -29.3, 0.159E-03, 0.159E-03, 1.29, 0.0000000, 16, 5, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0.0000000, 0, 0.0000000, 0, 0.0000000, 0.17976931+309, 0.17976931+309, F, 0.0000000, 5, 6, 0.0000000, 0, 3, 0, 0.0000000, 1, 0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0, 2022.10.7, Z1 = 0.56503112463080173988317 * st**0.5 diff --git a/idaes_examples/archive/ripe/tmpscratch b/idaes_examples/archive/ripe/tmpscratch deleted file mode 100644 index 517da6e1..00000000 --- a/idaes_examples/archive/ripe/tmpscratch +++ /dev/null @@ -1,57 +0,0 @@ - *************************************************************************** - ALAMO version 2022.10.7. Built: WIN-64 Fri Oct 7 21:02:38 EDT 2022 - - If you use this software, please cite: - Cozad, A., N. V. Sahinidis and D. C. Miller, - Automatic Learning of Algebraic Models for Optimization, - AIChE Journal, 60, 2211-2227, 2014. - - ALAMO is powered by the BARON software from http://www.minlp.com/ - *************************************************************************** - Licensee: Dan Gunter at US Department of Energy, dkgunter@lbl.gov. - *************************************************************************** - Reading input data - Checking input consistency and initializing data structures - Warning: powers of 1 will be discarded from the set of basis functions. - Warning: eliminating basis log(st) - - Step 0: Initializing data set - User provided an initial data set of 3 data points - We will sample no more data points at this stage - *************************************************************************** - Iteration 1 (Approx. elapsed time 0.0 s) - - Step 1: Model building using BIC - - Model building for variable Z1 - ---- - BIC = 1.10 with Z1 = 0.57 * st**0.5 - - Calculating quality metrics on observed data set. - - Quality metrics for output Z1 - ----------------------------- - SSE OLR: 0.850E-30 - SSE: 0.159E-03 - RMSE: 0.728E-02 - R2: 1.00 - R2 adjusted: 1.00 - Model size: 1 - BIC: 1.10 - Cp: -1.00 - AICc: -23.5 - HQC: -29.3 - MSE: 0.159E-03 - SSEp: 0.159E-03 - RIC: 3.22 - MADp: 1.29 - - Total execution time 0.0 s - Times breakdown - OLR time: 0.0 s in 16 ordinary linear regression problem(s) - MIP time: 0.0 s in 0 quadratic integer problem(s) - Simulation time: 0.0 s to simulate 0 point(s) - All other time: 0.0 s in 1 iteration(s) - - Normal termination - *************************************************************************** diff --git a/idaes_examples/mod/co2_adsorption_desorption/NETL_32D_gas_phase_thermo.py b/idaes_examples/mod/co2_adsorption_desorption/NETL_32D_gas_phase_thermo.py index 9f273146..37a6de39 100644 --- a/idaes_examples/mod/co2_adsorption_desorption/NETL_32D_gas_phase_thermo.py +++ b/idaes_examples/mod/co2_adsorption_desorption/NETL_32D_gas_phase_thermo.py @@ -442,13 +442,13 @@ def initialize( hold_state : flag indicating whether the initialization routine should unfix any state variables fixed during initialization (default=False). - - True - states varaibles are not unfixed, and + - True - states variables are not unfixed, and a dict of returned containing flags for which states were fixed during initialization. - False - state variables are unfixed after initialization by calling the - relase_state method + release_state method Returns: If hold_states is True, returns a dict containing flags for which states were fixed during initialization. @@ -563,7 +563,7 @@ def initialize( def release_state(blk, flags, outlvl=0): """ - Method to relase state variables fixed during initialization. + Method to release state variables fixed during initialization. Keyword Arguments: flags : dict containing information of which state variables were fixed during initialization, and should now be diff --git a/idaes_examples/mod/co2_adsorption_desorption/NETL_32D_solid_phase_thermo.py b/idaes_examples/mod/co2_adsorption_desorption/NETL_32D_solid_phase_thermo.py index c6901f56..7161648b 100644 --- a/idaes_examples/mod/co2_adsorption_desorption/NETL_32D_solid_phase_thermo.py +++ b/idaes_examples/mod/co2_adsorption_desorption/NETL_32D_solid_phase_thermo.py @@ -104,7 +104,7 @@ def build(self): ) # TODO - actual molecular weights of the materials can be substituted here - # but are not necessary for peformance calculations + # but are not necessary for performance calculations mw_comp_dict = { "H2O_s": 0.018, # MW of H2O(g) is used for H2O(s) "Car": 0.044, # MW of CO2(g) is used for carbamate @@ -275,7 +275,7 @@ def initialize( initialization. - False - state variables are unfixed after initialization by calling the - relase_state method + release_state method Returns: If hold_states is True, returns a dict containing flags for which states were fixed during initialization. @@ -342,7 +342,7 @@ def initialize( def release_state(blk, flags, outlvl=idaeslog.NOTSET): """ - Method to relase state variables fixed during initialization. + Method to release state variables fixed during initialization. Keyword Arguments: flags : dict containing information of which state variables were fixed during initialization, and should now be diff --git a/idaes_examples/mod/dae/petsc/pid_steam_tank.py b/idaes_examples/mod/dae/petsc/pid_steam_tank.py index 70a65643..f93b54d6 100644 --- a/idaes_examples/mod/dae/petsc/pid_steam_tank.py +++ b/idaes_examples/mod/dae/petsc/pid_steam_tank.py @@ -47,7 +47,7 @@ def _valve_pressure_flow_cb(b): b.Cv = pyo.Var( initialize=0.1, - doc="Valve flow coefficent", + doc="Valve flow coefficient", units=umeta("amount") / umeta("time") / umeta("pressure"), ) b.Cv.fix() @@ -75,7 +75,7 @@ def create_model( """Create a test model and solver Args: - time_set (list): The begining and end point of the time domain + time_set (list): The beginning and end point of the time domain time_units (Pyomo Unit object): Units of time domain nfe (int): Number of finite elements argument for the DAE transformation. diff --git a/idaes_examples/mod/hda/hda_ideal_VLE.py b/idaes_examples/mod/hda/hda_ideal_VLE.py index cd1581e8..9498ec7c 100644 --- a/idaes_examples/mod/hda/hda_ideal_VLE.py +++ b/idaes_examples/mod/hda/hda_ideal_VLE.py @@ -433,7 +433,7 @@ def initialize(blk, state_args={}, state_vars_fixed=False, state_args : Dictionary with initial guesses for the state vars chosen. Note that if this method is triggered through the control volume, and if initial guesses - were not provied at the unit model level, the + were not provided at the unit model level, the control volume passes the inlet values as initial guess.The keys for the state_args dictionary are: @@ -444,7 +444,7 @@ def initialize(blk, state_args={}, state_vars_fixed=False, outlvl : sets output level of initialization routine * 0 = no output (default) * 1 = return solver state for each step in routine - * 2 = include solver output infomation (tee=True) + * 2 = include solver output information (tee=True) optarg : solver options dictionary object (default=None) state_vars_fixed: Flag to denote if state vars have already been fixed. @@ -455,18 +455,18 @@ def initialize(blk, state_args={}, state_vars_fixed=False, with 0D blocks. - False - states have not been fixed. The state block will deal with fixing/unfixing. - solver : str indicating whcih solver to use during + solver : str indicating which solver to use during initialization (default = 'ipopt') hold_state : flag indicating whether the initialization routine should unfix any state variables fixed during initialization (default=False). - - True - states varaibles are not unfixed, and + - True - states variables are not unfixed, and a dict of returned containing flags for which states were fixed during initialization. - False - state variables are unfixed after initialization by calling the - relase_state method + release_state method Returns: If hold_states is True, returns a dict containing flags for which states were fixed during initialization. @@ -554,7 +554,7 @@ def initialize(blk, state_args={}, state_vars_fixed=False, def release_state(blk, flags, outlvl=0): ''' - Method to relase state variables fixed during initialization. + Method to release state variables fixed during initialization. Keyword Arguments: flags : dict containing information of which state variables were fixed during initialization, and should now be @@ -712,7 +712,7 @@ def rule_energy_internal_mol_phase_comp(b, p, j): return b.energy_internal_mol_phase_comp[p, j] == \ b.enth_mol_phase_comp[p, j] - \ const.gas_constant*(b.temperature - - b._params.temeprature_ref) + b._params.temperature_ref) else: return b.energy_internal_mol_phase_comp[p, j] == \ b.enth_mol_phase_comp[p, j] diff --git a/idaes_examples/mod/methanol/methanol_param_VLE.py b/idaes_examples/mod/methanol/methanol_param_VLE.py index 1ee5128a..041eb6e1 100644 --- a/idaes_examples/mod/methanol/methanol_param_VLE.py +++ b/idaes_examples/mod/methanol/methanol_param_VLE.py @@ -11,7 +11,7 @@ # at the URL "https://github.com/IDAES/idaes-pse". ############################################################################## """ -Example property package for the VLE calucations for the methanol synthesis +Example property package for the VLE calculations for the methanol synthesis problem from Turkay & Grossmann. The parameters and correlations are from the paper. """ @@ -37,7 +37,7 @@ from .methanol_state_block_VLE import IdealStateBlock -# Some more inforation about this module +# Some more information about this module __author__ = "Jaffer Ghouse", "Brandon Paul" __version__ = "0.0.1" diff --git a/idaes_examples/mod/methanol/methanol_state_block_VLE.py b/idaes_examples/mod/methanol/methanol_state_block_VLE.py index d518221e..ce803ef2 100644 --- a/idaes_examples/mod/methanol/methanol_state_block_VLE.py +++ b/idaes_examples/mod/methanol/methanol_state_block_VLE.py @@ -40,7 +40,7 @@ solve_indexed_blocks) from idaes.core.util.exceptions import ConfigurationError -# Some more inforation about this module +# Some more information about this module __author__ = "Jaffer Ghouse", "Brandon Paul" __version__ = "0.0.1" @@ -65,7 +65,7 @@ def initialize(blk, state_args=None, state_args : Dictionary with initial guesses for the state vars chosen. Note that if this method is triggered through the control volume, and if initial guesses - were not provied at the unit model level, the + were not provided at the unit model level, the control volume passes the inlet values as initial guess.The keys for the state_args dictionary are: @@ -79,7 +79,7 @@ def initialize(blk, state_args=None, * 0 = no output (default) * 1 = return solver state for each step in routine - * 2 = include solver output infomation (tee=True) + * 2 = include solver output information (tee=True) optarg : solver options dictionary object (default=None) solver : str indicating which solver to use during @@ -190,7 +190,7 @@ def initialize(blk, state_args=None, def release_state(blk, flags, outlvl=0): ''' - Method to relase state variables fixed during initialization. + Method to release state variables fixed during initialization. Keyword Arguments: flags : dict containing information of which state variables diff --git a/idaes_examples/mod/power_gen/NGFC_flowsheet.py b/idaes_examples/mod/power_gen/NGFC_flowsheet.py index 97aa8cc8..f2a18617 100644 --- a/idaes_examples/mod/power_gen/NGFC_flowsheet.py +++ b/idaes_examples/mod/power_gen/NGFC_flowsheet.py @@ -18,6 +18,8 @@ """ import os +import logging + from collections import OrderedDict # Import Pyomo libraries @@ -33,7 +35,6 @@ from idaes.core.util import model_serializer as ms, ModelTag, ModelTagGroup from idaes.core.util.tags import svg_tag from idaes.core.util.tables import create_stream_table_dataframe -from idaes.core.util.exceptions import InitializationError import idaes.core.util.scaling as iscale @@ -71,10 +72,8 @@ initialize_SOFC_ROM, ) -import logging - -def build_power_island(m): +def build_properties(m): # create property packages - 3 property packages and 1 reaction NG_config = get_prop( components=[ @@ -105,6 +104,8 @@ def build_power_island(m): **get_rxn(m.fs.syn_props, reactions=["h2_cmb", "co_cmb", "ch4_cmb"]) ) + +def build_power_island(m): # build anode side units m.fs.anode_mix = Mixer( inlet_list=["feed", "recycle"], @@ -725,7 +726,7 @@ def set_reformer_inputs(m): m.fs.reformer_bypass.split_fraction[0, "bypass_outlet"].fix(0.6) # air to reformer - m.fs.air_compressor_s1.inlet.flow_mol[0] == 1332.9 # mol/s + m.fs.air_compressor_s1.inlet.flow_mol[0] = 1332.9 # mol/s m.fs.air_compressor_s1.inlet.temperature.fix(288.15) # K m.fs.air_compressor_s1.inlet.pressure.fix(101353) # Pa, equal to 14.7 psia m.fs.air_compressor_s1.inlet.mole_frac_comp.fix(1e-11) @@ -749,7 +750,7 @@ def set_reformer_inputs(m): m.fs.intercooler_s2.deltaP.fix(-3447) # Pa, equal to -0.5 psi # steam to reformer - m.fs.reformer_mix.steam_inlet.flow_mol[0] == 464.77 # mol/s + m.fs.reformer_mix.steam_inlet.flow_mol[0] = 464.77 # mol/s m.fs.reformer_mix.steam_inlet.temperature.fix(422) # K m.fs.reformer_mix.steam_inlet.pressure.fix(206843) # Pa, equal to 30 psia m.fs.reformer_mix.steam_inlet.mole_frac_comp.fix(1e-11) @@ -767,219 +768,180 @@ def scale_flowsheet(m): m.fs.NG_props.set_default_scaling("flow_mol_phase", 1e-3) m.fs.NG_props.set_default_scaling("temperature", 1e-2) m.fs.NG_props.set_default_scaling("pressure", 1e-5) - m.fs.NG_props.set_default_scaling("mole_frac_comp", 1e2) - m.fs.NG_props.set_default_scaling("mole_frac_comp", 1e2, index="C2H6") - m.fs.NG_props.set_default_scaling("mole_frac_comp", 1e2, index="C3H8") - m.fs.NG_props.set_default_scaling("mole_frac_comp", 1e2, index="C4H10") - m.fs.NG_props.set_default_scaling("mole_frac_phase_comp", 1e2) - m.fs.NG_props.set_default_scaling( - "mole_frac_phase_comp", 1e2, index=("Vap", "C2H6") - ) - m.fs.NG_props.set_default_scaling( - "mole_frac_phase_comp", 1e2, index=("Vap", "C3H8") - ) - m.fs.NG_props.set_default_scaling( - "mole_frac_phase_comp", 1e2, index=("Vap", "C4H10") - ) - m.fs.NG_props.set_default_scaling("enth_mol_phase", 1e-6) - m.fs.NG_props.set_default_scaling("entr_mol_phase", 1e-4) + m.fs.NG_props.set_default_scaling("entr_mol_phase", 1e-1) + m.fs.NG_props.set_default_scaling("entr_mol", 1e-1) # set syn_props default scaling m.fs.syn_props.set_default_scaling("flow_mol", 1e-3) m.fs.syn_props.set_default_scaling("flow_mol_phase", 1e-3) + m.fs.syn_props.set_default_scaling("flow_mol_phase_comp", 1e-3) m.fs.syn_props.set_default_scaling("temperature", 1e-2) m.fs.syn_props.set_default_scaling("pressure", 1e-5) m.fs.syn_props.set_default_scaling("mole_frac_comp", 1e2) m.fs.syn_props.set_default_scaling("mole_frac_phase_comp", 1e2) m.fs.syn_props.set_default_scaling("enth_mol_phase", 1e-6) - m.fs.syn_props.set_default_scaling("entr_mol_phase", 1e-4) + m.fs.syn_props.set_default_scaling("entr_mol_phase", 1e-1) + m.fs.syn_props.set_default_scaling("entr_mol", 1e-1) # set air_props default scaling m.fs.air_props.set_default_scaling("flow_mol", 1e-3) m.fs.air_props.set_default_scaling("flow_mol_phase", 1e-3) + m.fs.air_props.set_default_scaling("flow_mol_phase_comp", 1) m.fs.air_props.set_default_scaling("temperature", 1e-2) m.fs.air_props.set_default_scaling("pressure", 1e-5) m.fs.air_props.set_default_scaling("mole_frac_comp", 1e2) m.fs.air_props.set_default_scaling("mole_frac_phase_comp", 1e2) m.fs.air_props.set_default_scaling("enth_mol_phase", 1e-6) - m.fs.air_props.set_default_scaling("entr_mol_phase", 1e-4) - - iscale.set_scaling_factor(m.fs.prereformer.lagrange_mult, 1e-4) - iscale.set_scaling_factor(m.fs.anode.lagrange_mult, 1e-4) - - iscale.set_scaling_factor(m.fs.reformer.lagrange_mult, 1e-4) - - # overwrite mole_frac lower bound to remove warnings - print('overwriting mole_frac lower bound, set to 0 to remove warnings') - for var in m.fs.component_data_objects(pyo.Var, descend_into=True): - if '.mole_frac' in var.name: # don't catch log_mole_frac variables - var.setlb(0) - - # some specific variable scaling - - # heat exchanger areas and overall heat transfer coefficiencts - iscale.set_scaling_factor(m.fs.anode_hx.area, 1e-4) - iscale.set_scaling_factor(m.fs.anode_hx.overall_heat_transfer_coefficient, 1) - iscale.set_scaling_factor(m.fs.cathode_hx.area, 1e-4) - iscale.set_scaling_factor(m.fs.cathode_hx.overall_heat_transfer_coefficient, 1) - iscale.set_scaling_factor(m.fs.reformer_recuperator.area, 1e-4) - iscale.set_scaling_factor(m.fs.reformer_recuperator.overall_heat_transfer_coefficient, 1) - - # control volume heats - iscale.set_scaling_factor(m.fs.anode_hx.tube.heat, 1e-7) - iscale.set_scaling_factor(m.fs.anode_hx.shell.heat, 1e-7) - iscale.set_scaling_factor(m.fs.anode.control_volume.heat, 1e-8) - iscale.set_scaling_factor(m.fs.cathode_hx.tube.heat, 1e-8) - iscale.set_scaling_factor(m.fs.cathode_hx.shell.heat, 1e-8) - iscale.set_scaling_factor(m.fs.cathode_heat.control_volume.heat, 1e-8) - iscale.set_scaling_factor(m.fs.cathode_HRSG.control_volume.heat, 1e-6) - iscale.set_scaling_factor(m.fs.intercooler_s1.control_volume.heat, 1e-6) - iscale.set_scaling_factor(m.fs.intercooler_s2.control_volume.heat, 1e-6) - iscale.set_scaling_factor(m.fs.anode_HRSG.control_volume.heat, 1e-8) - iscale.set_scaling_factor(m.fs.prereformer.control_volume.heat, 1e-6) - iscale.set_scaling_factor(m.fs.reformer.control_volume.heat, 1e-6) - iscale.set_scaling_factor(m.fs.reformer_recuperator.shell.heat, 1e-6) - iscale.set_scaling_factor(m.fs.reformer_recuperator.tube.heat, 1e-6) - - # work - iscale.set_scaling_factor(m.fs.anode_blower.control_volume.work, 1e-5) - iscale.set_scaling_factor(m.fs.air_blower.control_volume.work, 1e-6) - iscale.set_scaling_factor(m.fs.cathode_blower.control_volume.work, 1e-5) - iscale.set_scaling_factor(m.fs.air_compressor_s1.control_volume.work, 1e-6) - iscale.set_scaling_factor(m.fs.air_compressor_s2.control_volume.work, 1e-6) - iscale.set_scaling_factor(m.fs.cathode_expander.control_volume.work, 1e-6) - iscale.set_scaling_factor(m.fs.combustor_expander.control_volume.work, 1e-6) - iscale.set_scaling_factor(m.fs.NG_expander.control_volume.work, 1e-6) - - # reaction extents - iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_extent[0, "h2_cmb"], 1e2) - iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_extent[0, "co_cmb"], 1e2) - iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_extent[0, "ch4_cmb"], 1e5) - - print('Scaling flowsheet constraints') - - list_units = ['anode_mix', 'anode_hx', 'prereformer', 'anode_translator', - 'fuel_cell_mix', 'anode', 'anode_recycle', 'anode_blower', - 'recycle_translator', 'air_blower', 'cathode_hx', - 'cathode_mix', 'cathode', 'cathode_translator', - 'cathode_heat', 'cathode_recycle', 'cathode_blower', - 'cathode_exhaust_split', 'cathode_expander', 'cathode_HRSG', - 'cathode_exhaust_translator', 'combustor_mix', 'combustor', - 'combustor_expander', 'anode_HRSG', 'reformer_recuperator', - 'NG_expander', 'reformer_bypass', 'air_compressor_s1', - 'intercooler_s1', 'air_compressor_s2', 'intercooler_s2', - 'reformer_mix', 'reformer', 'bypass_rejoin'] + m.fs.air_props.set_default_scaling("entr_mol_phase", 1e-1) + m.fs.air_props.set_default_scaling("entr_mol", 1e-1) + + built_units = [] + + if hasattr(m.fs, "reformer"): + iscale.set_scaling_factor(m.fs.reformer.lagrange_mult, 1e-4) + + # heat exchanger areas and overall heat transfer coefficiencts + iscale.set_scaling_factor(m.fs.reformer_recuperator.area, 1e-3) + iscale.set_scaling_factor(m.fs.reformer_recuperator.overall_heat_transfer_coefficient, 1e-1) + + # control volume heats + iscale.set_scaling_factor(m.fs.intercooler_s1.control_volume.heat, 1e-4) + iscale.set_scaling_factor(m.fs.intercooler_s2.control_volume.heat, 1e-5) + iscale.set_scaling_factor(m.fs.reformer.control_volume.heat, 1e-6) + iscale.set_scaling_factor(m.fs.reformer_recuperator.shell.heat, 1e-6) + iscale.set_scaling_factor(m.fs.reformer_recuperator.tube.heat, 1e-6) + + # work + iscale.set_scaling_factor(m.fs.air_compressor_s1.control_volume.work, 1e-5) + iscale.set_scaling_factor(m.fs.air_compressor_s2.control_volume.work, 1e-5) + iscale.set_scaling_factor(m.fs.NG_expander.control_volume.work, 1e-6) + + reformer_units = [ + 'reformer_recuperator', 'NG_expander', 'reformer_bypass', + 'air_compressor_s1', 'intercooler_s1', 'air_compressor_s2', + 'intercooler_s2', 'reformer_mix', 'reformer', 'bypass_rejoin' + ] + built_units += reformer_units + + if hasattr(m.fs, "anode"): + iscale.set_scaling_factor(m.fs.anode.lagrange_mult, 1e-4) + iscale.set_scaling_factor(m.fs.prereformer.lagrange_mult, 1e-4) + + # heat exchanger areas and overall heat transfer coefficiencts + iscale.set_scaling_factor(m.fs.anode_hx.area, 1e-4) + iscale.set_scaling_factor(m.fs.anode_hx.overall_heat_transfer_coefficient, 1e-1) + iscale.set_scaling_factor(m.fs.cathode_hx.area, 1e-4) + iscale.set_scaling_factor(m.fs.cathode_hx.overall_heat_transfer_coefficient, 1e-1) + + # control volume heats + iscale.set_scaling_factor(m.fs.anode_hx.tube.heat, 1e-7) + iscale.set_scaling_factor(m.fs.anode_hx.shell.heat, 1e-7) + iscale.set_scaling_factor(m.fs.anode.control_volume.heat, 1e-8) + iscale.set_scaling_factor(m.fs.cathode_hx.tube.heat, 1e-8) + iscale.set_scaling_factor(m.fs.cathode_hx.shell.heat, 1e-8) + iscale.set_scaling_factor(m.fs.cathode_heat.control_volume.heat, 1e-8) + iscale.set_scaling_factor(m.fs.cathode_HRSG.control_volume.heat, 1e-7) + iscale.set_scaling_factor(m.fs.anode_HRSG.control_volume.heat, 1e-8) + iscale.set_scaling_factor(m.fs.prereformer.control_volume.heat, 1) + + # work + iscale.set_scaling_factor(m.fs.anode_blower.control_volume.work, 1e-4) + iscale.set_scaling_factor(m.fs.air_blower.control_volume.work, 1e-5) + iscale.set_scaling_factor(m.fs.cathode_blower.control_volume.work, 1e-5) + iscale.set_scaling_factor(m.fs.cathode_expander.control_volume.work, 1e-3) + iscale.set_scaling_factor(m.fs.combustor_expander.control_volume.work, 1e-3) + + # reaction extents + iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_extent[0, "h2_cmb"], 1) + iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_extent[0, "co_cmb"], 1) + iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_extent[0, "ch4_cmb"], 1e1) + + iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_generation[0, "Vap", "H2"], 1e-1) + iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_generation[0, "Vap", "CO"], 1e-1) + iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_generation[0, "Vap", "H2O"], 1e-1) + iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_generation[0, "Vap", "CO2"], 1e-1) + iscale.set_scaling_factor(m.fs.combustor.control_volume.rate_reaction_generation[0, "Vap", "O2"], 1e-1) + + power_island_units = [ + 'anode_mix', 'anode_hx', 'prereformer', 'anode_translator', + 'fuel_cell_mix', 'anode', 'anode_recycle', 'anode_blower', + 'recycle_translator', 'air_blower', 'cathode_hx', + 'cathode_mix', 'cathode', 'cathode_translator', + 'cathode_heat', 'cathode_recycle', 'cathode_blower', + 'cathode_exhaust_split', 'cathode_expander', 'cathode_HRSG', + 'cathode_exhaust_translator', 'combustor_mix', 'combustor', + 'combustor_expander', 'anode_HRSG' + ] + built_units += power_island_units # set scaling for unit constraints - for name in list_units: + for name in built_units: unit = getattr(m.fs, name) - # mixer constraints + # mixer if hasattr(unit, 'material_mixing_equations'): for (t, j), c in unit.material_mixing_equations.items(): iscale.constraint_scaling_transform(c, 1e-3, overwrite=False) - if hasattr(unit, 'enthalpy_mixing_equations'): - for t, c in unit.enthalpy_mixing_equations.items(): - iscale.constraint_scaling_transform(c, 1e-3, overwrite=False) - if hasattr(unit, 'minimum_pressure_constraint'): - for (t, i), c in unit.minimum_pressure_constraint.items(): - iscale.constraint_scaling_transform(c, 1e-5, overwrite=False) - if hasattr(unit, 'mixture_pressure'): - for t, c in unit.mixture_pressure.items(): - iscale.constraint_scaling_transform(c, 1e-5, overwrite=False) - - # separator constraints - if hasattr(unit, 'material_splitting_eqn'): - for (t, o, j), c in unit.material_splitting_eqn.items(): - iscale.constraint_scaling_transform(c, 1e-3, overwrite=False) - if hasattr(unit, 'temperature_equality_eqn'): - for (t, o), c in unit.temperature_equality_eqn.items(): - iscale.constraint_scaling_transform(c, 1e-2, overwrite=False) - if hasattr(unit, 'pressure_equality_eqn'): - for (t, o), c in unit.pressure_equality_eqn.items(): - iscale.constraint_scaling_transform(c, 1e-5, overwrite=False) - if hasattr(unit, 'sum_split_frac'): - for t, c in unit.sum_split_frac.items(): - iscale.constraint_scaling_transform(c, 1, overwrite=False) - - # pressurechanger constraints - - if hasattr(unit, "ratioP_calculation"): - for t, c in unit.ratioP_calculation.items(): - iscale.constraint_scaling_transform(c, 1e-5, overwrite=False) - - if hasattr(unit, "actual_work"): - for t, c in unit.actual_work.items(): - iscale.constraint_scaling_transform(c, 1e-6, overwrite=False) - - if hasattr(unit, "isentropic_pressure"): - for t, c in unit.isentropic_pressure.items(): - iscale.constraint_scaling_transform(c, 1e-5, overwrite=False) - - if hasattr(unit, "isentropic"): - for t, c in unit.isentropic.items(): - iscale.constraint_scaling_transform(c, 1e-1, overwrite=False) - + # pressure changer if hasattr(unit, "isentropic_energy_balance"): for t, c in unit.isentropic_energy_balance.items(): iscale.constraint_scaling_transform(c, 1e-3, overwrite=False) - - if hasattr(unit, "state_material_balances"): - for (t, j), c in unit.state_material_balances.items(): - iscale.constraint_scaling_transform(c, 1e-3, overwrite=False) - - # HeatExchanger non-CV constraints + # heat exchanger if hasattr(unit, "heat_transfer_equation"): for t, c in unit.heat_transfer_equation.items(): iscale.constraint_scaling_transform(c, 1e-7, overwrite=False) - if hasattr(unit, "unit_heat_balance"): - for t, c in unit.unit_heat_balance.items(): - iscale.constraint_scaling_transform(c, 1e-7, overwrite=False) - - if hasattr(unit, "delta_temperature_in_equation"): - for t, c in unit.delta_temperature_in_equation.items(): - iscale.constraint_scaling_transform(c, 1e-1, overwrite=False) - - if hasattr(unit, "delta_temperature_out_equation"): - for t, c in unit.delta_temperature_out_equation.items(): - iscale.constraint_scaling_transform(c, 1e-1, overwrite=False) - - # Translator has no constraints to scale - # Gibbs reactor minimization is scaled elsewhere, set by gibbs_scaling - # adding scaling factors of unity here for completeness - if hasattr(unit, "gibbs_minimization"): - for (t, p, j), c in unit.gibbs_minimization.items(): - iscale.constraint_scaling_transform(c, 1, overwrite=False) - - if hasattr(unit, "inert_species_balance"): - for (t, p, j), c in unit.inert_species_balance.items(): - iscale.constraint_scaling_transform(c, 1, overwrite=False) - - print('Calculating scaling factors') iscale.calculate_scaling_factors(m) - print() - -def initialize_power_island(m): + constraints_to_scale = { + m.fs.prereformer.control_volume.element_balances[0.0, "H"]: 1e-2, + m.fs.prereformer.control_volume.element_balances[0.0, "C"]: 1e-2, + m.fs.prereformer.control_volume.element_balances[0.0, "O"]: 1e-2, + m.fs.prereformer.control_volume.element_balances[0.0, "N"]: 1e-2, + m.fs.prereformer.control_volume.element_balances[0.0, "Ar"]: 1e-2, + m.fs.prereformer.inert_species_balance[0.0, "Vap", "O2"]: 1e-2, + m.fs.anode.control_volume.element_balances[0.0, "H"]: 1e-2, + m.fs.anode.control_volume.element_balances[0.0, "C"]: 1e-2, + m.fs.anode.control_volume.element_balances[0.0, "O"]: 1e-2, + m.fs.anode.control_volume.element_balances[0.0, "N"]: 1e-2, + m.fs.anode.control_volume.element_balances[0.0, "Ar"]: 1e-2, + m.fs.anode_recycle.material_splitting_eqn[0.0, "exhaust", "CH4"]: 0.01, + m.fs.anode_recycle.material_splitting_eqn[0.0, "recycle", "CH4"]: 0.01, + m.fs.anode_hx.hot_side.material_balances[0.0, "CH4"]: 0.01, + m.fs.combustor_mix.material_mixing_equations[0.0, "CH4"]: 0.01, + m.fs.combustor.control_volume.material_balances[0.0, "CH4"]: 0.01, + m.fs.anode_blower.isentropic_energy_balance[0.0]: 1e-5, + m.fs.air_blower.isentropic_energy_balance[0.0]: 1e-5, + m.fs.cathode_blower.isentropic_energy_balance[0.0]: 1e-5, + m.fs.cathode_expander.isentropic_energy_balance[0.0]: 1e-5, + m.fs.combustor_expander.isentropic_energy_balance[0.0]: 1e-4, + } + + for c, sf in constraints_to_scale.items(): + iscale.constraint_scaling_transform(c, sf) + + +def initialize_power_island(m, outlvl=logging.INFO): solver = pyo.SolverFactory("ipopt") solver.options = { "max_iter": 500, "tol": 1e-5, "bound_push": 1e-8, "linear_solver": "ma57", - "ma57_pivtol": 1e-3, "OF_ma57_automatic_scaling": "yes", "nlp_scaling_method": "user-scaling" - } + } # cathode side - m.fs.air_blower.initialize(outlvl=logging.INFO) + m.fs.air_blower.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.cathode_hx.tube_inlet, m.fs.air_blower.outlet) + propagate_state( + source=m.fs.air_blower.outlet, + destination=m.fs.cathode_hx.tube_inlet + ) - # fix cathode inlet to initial guess + # set cathode inlet to initial guess m.fs.cathode.inlet.flow_mol[0] = 34174 m.fs.cathode.inlet.temperature[0] = 892 m.fs.cathode.inlet.pressure[0] = 105490 @@ -989,39 +951,61 @@ def initialize_power_island(m): m.fs.cathode.inlet.mole_frac_comp[0, "O2"] = 0.1690 m.fs.cathode.inlet.mole_frac_comp[0, "Ar"] = 0.0099 - m.fs.cathode.initialize(outlvl=logging.INFO) - - m.fs.cathode.inlet.unfix() + m.fs.cathode.initialize(outlvl=outlvl, optarg=solver.options) # cathode translator block - propagate_state(m.fs.cathode_translator.inlet, m.fs.cathode.ion_outlet) + propagate_state( + source=m.fs.cathode.ion_outlet, + destination=m.fs.cathode_translator.inlet + ) - m.fs.cathode_translator.initialize() + m.fs.cathode_translator.initialize(outlvl=outlvl, optarg=solver.options) # rest of cathode side - propagate_state(m.fs.cathode_heat.inlet, m.fs.cathode.air_outlet) + propagate_state( + source=m.fs.cathode.air_outlet, + destination=m.fs.cathode_heat.inlet + ) - m.fs.cathode_heat.initialize(outlvl=logging.INFO) + m.fs.cathode_heat.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.cathode_recycle.inlet, m.fs.cathode_heat.outlet) + propagate_state( + source=m.fs.cathode_heat.outlet, + destination=m.fs.cathode_recycle.inlet + ) - m.fs.cathode_recycle.initialize(outlvl=logging.INFO) + m.fs.cathode_recycle.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.cathode_hx.shell_inlet, m.fs.cathode_recycle.exhaust) + propagate_state( + source=m.fs.cathode_recycle.exhaust, + destination=m.fs.cathode_hx.shell_inlet + ) - m.fs.cathode_hx.initialize(outlvl=logging.INFO) + m.fs.cathode_hx.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.cathode_blower.inlet, m.fs.cathode_recycle.recycle) + propagate_state( + source=m.fs.cathode_recycle.recycle, + destination=m.fs.cathode_blower.inlet + ) - m.fs.cathode_blower.initialize(outlvl=logging.INFO) + m.fs.cathode_blower.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.cathode_mix.recycle, m.fs.cathode_blower.outlet) + propagate_state( + source=m.fs.cathode_blower.outlet, + destination=m.fs.cathode_mix.recycle + ) - propagate_state(m.fs.cathode_mix.feed, m.fs.cathode_hx.tube_outlet) + propagate_state( + source=m.fs.cathode_hx.tube_outlet, + destination=m.fs.cathode_mix.feed + ) - m.fs.cathode_mix.initialize(outlvl=logging.INFO) + m.fs.cathode_mix.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.cathode.inlet, m.fs.cathode_mix.outlet) + propagate_state( + source=m.fs.cathode_mix.outlet, + destination=m.fs.cathode.inlet + ) # anode side # anode inlet is used as tear stream @@ -1041,51 +1025,52 @@ def initialize_power_island(m): m.fs.anode.lagrange_mult[0, "H"] = 78296 m.fs.anode.lagrange_mult[0, "O"] = 291784 - m.fs.anode.outlet.mole_frac_comp[0, "O2"] = 0 - - # This initialization step fails to converge, but is sufficient to resolve - try: - m.fs.anode.initialize(outlvl=logging.INFO) - except InitializationError: - # this step may end on Solve to Acceptable Level, add resolve condition - for i in range(1, 10): # keep looping until condition is met - res = solver.solve(m.fs.anode, tee=True) - if 'Optimal Solution Found' in res.solver.message: - break + m.fs.anode.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.anode_recycle.inlet, m.fs.anode.outlet) - - m.fs.anode_recycle.initialize(outlvl=logging.INFO) + propagate_state( + source=m.fs.anode.outlet, + destination=m.fs.anode_recycle.inlet + ) - propagate_state(m.fs.anode_blower.inlet, m.fs.anode_recycle.recycle) + m.fs.anode_recycle.initialize(outlvl=outlvl, optarg=solver.options) - # This initialization step fails to converge, but is sufficient to resolve - try: - m.fs.anode_blower.initialize(outlvl=logging.INFO) - except InitializationError: - # this step may end on Solve to Acceptable Level, add resolve condition - for i in range(1, 10): # keep looping until condition is met - res = solver.solve(m.fs.anode_blower, tee=True) - if 'Optimal Solution Found' in res.solver.message: - break + propagate_state( + source=m.fs.anode_recycle.recycle, + destination=m.fs.anode_blower.inlet + ) - propagate_state(m.fs.recycle_translator.inlet, m.fs.anode_blower.outlet) + m.fs.anode_blower.initialize(outlvl=outlvl, optarg=solver.options) - m.fs.recycle_translator.initialize() + propagate_state( + source=m.fs.anode_blower.outlet, + destination=m.fs.recycle_translator.inlet + ) - propagate_state(m.fs.anode_mix.recycle, m.fs.recycle_translator.outlet) + m.fs.recycle_translator.initialize(outlvl=outlvl, optarg=solver.options) - m.fs.anode_mix.initialize(outlvl=logging.INFO) + propagate_state( + source=m.fs.recycle_translator.outlet, + destination=m.fs.anode_mix.recycle + ) - propagate_state(m.fs.anode_hx.tube_inlet, m.fs.anode_mix.outlet) + m.fs.anode_mix.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.anode_hx.shell_inlet, m.fs.anode_recycle.exhaust) + propagate_state( + source=m.fs.anode_mix.outlet, + destination=m.fs.anode_hx.tube_inlet + ) - m.fs.anode_hx.initialize(outlvl=logging.INFO) + propagate_state( + source=m.fs.anode_recycle.exhaust, + destination=m.fs.anode_hx.shell_inlet + ) - propagate_state(m.fs.prereformer.inlet, m.fs.anode_hx.tube_outlet) + m.fs.anode_hx.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.prereformer.outlet, m.fs.prereformer.inlet) + propagate_state( + source=m.fs.anode_hx.tube_outlet, + destination=m.fs.prereformer.inlet + ) m.fs.prereformer.gibbs_scaling = 1e-4 @@ -1093,91 +1078,106 @@ def initialize_power_island(m): m.fs.prereformer.lagrange_mult[0, "H"] = 62744 m.fs.prereformer.lagrange_mult[0, "O"] = 293569 - m.fs.prereformer.outlet.mole_frac_comp[0, "O2"] = 0 - m.fs.prereformer.outlet.mole_frac_comp[0, "Ar"] = 0.003 - m.fs.prereformer.outlet.mole_frac_comp[0, "C2H6"] = 0 - m.fs.prereformer.outlet.mole_frac_comp[0, "C3H8"] = 0 - m.fs.prereformer.outlet.mole_frac_comp[0, "C4H10"] = 0 + m.fs.prereformer.initialize(outlvl=outlvl, optarg=solver.options) - m.fs.prereformer.initialize(outlvl=logging.INFO) - - propagate_state(m.fs.anode_translator.inlet, m.fs.prereformer.outlet) + propagate_state( + source=m.fs.prereformer.outlet, + destination=m.fs.anode_translator.inlet + ) - m.fs.anode_translator.initialize() + m.fs.anode_translator.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.fuel_cell_mix.fuel_inlet, m.fs.anode_translator.outlet) + propagate_state( + source=m.fs.anode_translator.outlet, + destination=m.fs.fuel_cell_mix.fuel_inlet + ) - propagate_state(m.fs.fuel_cell_mix.ion_inlet, m.fs.cathode_translator.outlet) + propagate_state( + source=m.fs.cathode_translator.outlet, + destination=m.fs.fuel_cell_mix.ion_inlet + ) - m.fs.fuel_cell_mix.initialize(outlvl=logging.INFO) + m.fs.fuel_cell_mix.initialize(outlvl=outlvl, optarg=solver.options) ############################## # Combustor and HRSG section # ############################## # cathode side - propagate_state(m.fs.cathode_exhaust_split.inlet, m.fs.cathode_hx.shell_outlet) + propagate_state( + source=m.fs.cathode_hx.shell_outlet, + destination=m.fs.cathode_exhaust_split.inlet + ) - m.fs.cathode_exhaust_split.initialize(outlvl=logging.INFO) + m.fs.cathode_exhaust_split.initialize(outlvl=outlvl, optarg=solver.options) propagate_state( - m.fs.cathode_expander.inlet, m.fs.cathode_exhaust_split.exhaust_outlet + source=m.fs.cathode_exhaust_split.exhaust_outlet, + destination=m.fs.cathode_expander.inlet ) - m.fs.cathode_expander.initialize(outlvl=logging.INFO) + m.fs.cathode_expander.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.cathode_HRSG.inlet, m.fs.cathode_expander.outlet) + propagate_state( + source=m.fs.cathode_expander.outlet, + destination=m.fs.cathode_HRSG.inlet + ) - m.fs.cathode_HRSG.initialize(outlvl=logging.INFO) + m.fs.cathode_HRSG.initialize(outlvl=outlvl, optarg=solver.options) propagate_state( - m.fs.cathode_exhaust_translator.inlet, - m.fs.cathode_exhaust_split.combustor_outlet, + source=m.fs.cathode_exhaust_split.combustor_outlet, + destination=m.fs.cathode_exhaust_translator.inlet ) - m.fs.cathode_exhaust_translator.initialize() + m.fs.cathode_exhaust_translator.initialize(outlvl=outlvl, optarg=solver.options) # anode side propagate_state( - m.fs.combustor_mix.cathode_inlet, m.fs.cathode_exhaust_translator.outlet + source=m.fs.cathode_exhaust_translator.outlet, + destination=m.fs.combustor_mix.cathode_inlet ) - propagate_state(m.fs.combustor_mix.anode_inlet, m.fs.anode_hx.shell_outlet) + propagate_state( + source=m.fs.anode_hx.shell_outlet, + destination=m.fs.combustor_mix.anode_inlet + ) - m.fs.combustor_mix.initialize(outlvl=logging.INFO) + m.fs.combustor_mix.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.combustor.inlet, m.fs.combustor_mix.outlet) + propagate_state( + source=m.fs.combustor_mix.outlet, + destination=m.fs.combustor.inlet + ) - # This initialization step fails to converge, but is sufficient to resolve - try: - m.fs.combustor.initialize(outlvl=logging.INFO) - except InitializationError: - # this step may end on Solve to Acceptable Level, add resolve condition - for i in range(1, 10): # keep looping until condition is met - res = solver.solve(m.fs.combustor, tee=True) - if 'Optimal Solution Found' in res.solver.message: - break + m.fs.combustor.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.combustor_expander.inlet, m.fs.combustor.outlet) + propagate_state( + source=m.fs.combustor.outlet, + destination=m.fs.combustor_expander.inlet + ) - m.fs.combustor_expander.initialize() + m.fs.combustor_expander.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.anode_HRSG.inlet, m.fs.combustor_expander.outlet) + propagate_state( + source=m.fs.combustor_expander.outlet, + destination=m.fs.anode_HRSG.inlet + ) - m.fs.anode_HRSG.initialize() + m.fs.anode_HRSG.initialize(outlvl=outlvl, optarg=solver.options) -def initialize_reformer(m): +def initialize_reformer(m, outlvl=logging.INFO): solver = pyo.SolverFactory("ipopt") solver.options = { "max_iter": 500, "tol": 1e-5, "bound_push": 1e-8, "linear_solver": "ma57", - "ma57_pivtol": 1e-3, "OF_ma57_automatic_scaling": "yes", "nlp_scaling_method": "user-scaling" - } + } + m.fs.reformer.inlet.flow_mol[0] = 2262 # mol/s m.fs.reformer.inlet.temperature[0] = 470 # K m.fs.reformer.inlet.pressure[0] = 203395 # Pa @@ -1185,102 +1185,89 @@ def initialize_reformer(m): m.fs.reformer.inlet.mole_frac_comp[0, "C2H6"] = 0.006 m.fs.reformer.inlet.mole_frac_comp[0, "C3H8"] = 0.002 m.fs.reformer.inlet.mole_frac_comp[0, "C4H10"] = 0.001 - m.fs.reformer.inlet.mole_frac_comp[0, "H2"] = 0 - m.fs.reformer.inlet.mole_frac_comp[0, "CO"] = 0 + m.fs.reformer.inlet.mole_frac_comp[0, "H2"] = 1e-19 + m.fs.reformer.inlet.mole_frac_comp[0, "CO"] = 1e-19 m.fs.reformer.inlet.mole_frac_comp[0, "CO2"] = 0.002 m.fs.reformer.inlet.mole_frac_comp[0, "H2O"] = 0.212 m.fs.reformer.inlet.mole_frac_comp[0, "N2"] = 0.458 m.fs.reformer.inlet.mole_frac_comp[0, "O2"] = 0.122 m.fs.reformer.inlet.mole_frac_comp[0, "Ar"] = 0.006 - m.fs.reformer.lagrange_mult[0, "C"] = 39230 - m.fs.reformer.lagrange_mult[0, "H"] = 81252 - m.fs.reformer.lagrange_mult[0, "O"] = 315049 - - m.fs.reformer.outlet.mole_frac_comp[0, "O2"] = 0 - m.fs.reformer.outlet.mole_frac_comp[0, "Ar"] = 0.004 - m.fs.reformer.outlet.mole_frac_comp[0, "CH4"] = 0.0005 - m.fs.reformer.outlet.mole_frac_comp[0, "C2H6"] = 0 - m.fs.reformer.outlet.mole_frac_comp[0, "C3H8"] = 0 - m.fs.reformer.outlet.mole_frac_comp[0, "C4H10"] = 0 - - # This initialization step fails to converge, but is sufficient to resolve - try: - m.fs.reformer.initialize(outlvl=logging.INFO) - except InitializationError: - # this step may end on Solve to Acceptable Level, add resolve condition - for i in range(1, 10): # keep looping until condition is met - res = solver.solve(m.fs.reformer, tee=True) - if 'Optimal Solution Found' in res.solver.message: - break + m.fs.reformer.initialize(outlvl=outlvl, optarg=solver.options) # reformer recuperator - propagate_state(m.fs.reformer_recuperator.shell_inlet, m.fs.reformer.outlet) - - # This initialization step fails to converge, but is sufficient to resolve - try: - m.fs.reformer_recuperator.initialize(outlvl=logging.INFO) - except InitializationError: - # this step may end on Solve to Acceptable Level, add resolve condition - for i in range(1, 10): # keep looping until condition is met - res = solver.solve(m.fs.reformer_recuperator, tee=True) - if 'Optimal Solution Found' in res.solver.message: - break + propagate_state( + source=m.fs.reformer.outlet, + destination=m.fs.reformer_recuperator.shell_inlet + ) + + m.fs.reformer_recuperator.initialize(outlvl=outlvl, optarg=solver.options) # NG expander - propagate_state(m.fs.NG_expander.inlet, m.fs.reformer_recuperator.tube_outlet) - - # This initialization step fails to converge, but is sufficient to resolve - try: - m.fs.NG_expander.initialize(outlvl=logging.INFO) - except InitializationError: - # this step may end on Solve to Acceptable Level, add resolve condition - for i in range(1, 10): # keep looping until condition is met - res = solver.solve(m.fs.NG_expander, tee=True) - if 'Optimal Solution Found' in res.solver.message: - break + propagate_state( + source=m.fs.reformer_recuperator.tube_outlet, + destination=m.fs.NG_expander.inlet + ) + + m.fs.NG_expander.initialize(outlvl=outlvl, optarg=solver.options) # reformer bypass - propagate_state(m.fs.reformer_bypass.inlet, m.fs.NG_expander.outlet) + propagate_state( + source=m.fs.NG_expander.outlet, + destination=m.fs.reformer_bypass.inlet + ) - m.fs.reformer_bypass.initialize() + m.fs.reformer_bypass.initialize(outlvl=outlvl, optarg=solver.options) # air compressor train - m.fs.air_compressor_s1.initialize() + m.fs.air_compressor_s1.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.intercooler_s1.inlet, m.fs.air_compressor_s1.outlet) + propagate_state( + source=m.fs.air_compressor_s1.outlet, + destination=m.fs.intercooler_s1.inlet + ) - m.fs.intercooler_s1.initialize() + m.fs.intercooler_s1.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.air_compressor_s2.inlet, m.fs.intercooler_s1.outlet) + propagate_state( + source=m.fs.intercooler_s1.outlet, + destination=m.fs.air_compressor_s2.inlet + ) - # This initialization step fails to converge, but is sufficient to resolve - try: - m.fs.air_compressor_s2.initialize(outlvl=logging.INFO) - except InitializationError: - # this step may end on Solve to Acceptable Level, add resolve condition - for i in range(1, 10): # keep looping until condition is met - res = solver.solve(m.fs.air_compressor_s2, tee=True) - if 'Optimal Solution Found' in res.solver.message: - break + m.fs.air_compressor_s2.initialize(outlvl=outlvl, optarg=solver.options) - propagate_state(m.fs.intercooler_s2.inlet, m.fs.air_compressor_s2.outlet) + propagate_state( + source=m.fs.air_compressor_s2.outlet, + destination=m.fs.intercooler_s2.inlet + ) - m.fs.intercooler_s2.initialize() + m.fs.intercooler_s2.initialize(outlvl=outlvl, optarg=solver.options) # reformer mixer - propagate_state(m.fs.reformer_mix.oxygen_inlet, m.fs.intercooler_s2.outlet) + propagate_state( + source=m.fs.intercooler_s2.outlet, + destination=m.fs.reformer_mix.oxygen_inlet + ) - propagate_state(m.fs.reformer_mix.gas_inlet, m.fs.reformer_bypass.reformer_outlet) + propagate_state( + source=m.fs.reformer_bypass.reformer_outlet, + destination=m.fs.reformer_mix.gas_inlet + ) - m.fs.reformer_mix.initialize() + m.fs.reformer_mix.initialize(outlvl=outlvl, optarg=solver.options) # bypass rejoin - propagate_state(m.fs.bypass_rejoin.syngas_inlet, m.fs.reformer_recuperator.shell_outlet) + propagate_state( + source=m.fs.reformer_recuperator.shell_outlet, + destination=m.fs.bypass_rejoin.syngas_inlet + ) - propagate_state(m.fs.bypass_rejoin.bypass_inlet, m.fs.reformer_bypass.bypass_outlet) + propagate_state( + source=m.fs.reformer_bypass.bypass_outlet, + destination=m.fs.bypass_rejoin.bypass_inlet + ) - m.fs.bypass_rejoin.initialize() + m.fs.bypass_rejoin.initialize(outlvl=outlvl, optarg=solver.options) def connect_reformer_to_power_island(m): @@ -1291,7 +1278,7 @@ def connect_reformer_to_power_island(m): pyo.TransformationFactory("network.expand_arcs").apply_to(m.fs) -def SOFC_ROM_setup(m): +def SOFC_ROM_setup(m, init=True): # create the ROM build_SOFC_ROM(m.fs) @@ -1404,11 +1391,14 @@ def ROM_internal_reformation(fs): m.fs.SOFC.pressure.fix(1) # initialize ROM - calculate_variable_from_constraint( - m.fs.SOFC.air_temperature, m.fs.ROM_air_inlet_temperature - ) - calculate_variable_from_constraint(m.fs.SOFC.air_util, m.fs.ROM_air_utilization) - initialize_SOFC_ROM(m.fs.SOFC) + if init: + calculate_variable_from_constraint( + m.fs.SOFC.air_temperature, m.fs.ROM_air_inlet_temperature + ) + calculate_variable_from_constraint( + m.fs.SOFC.air_util, m.fs.ROM_air_utilization + ) + initialize_SOFC_ROM(m.fs.SOFC) # add constraints for power calculations m.fs.F = pyo.Param(initialize=96487, units=pyunits.C / pyunits.mol) @@ -1661,7 +1651,7 @@ def fstr(value, decimals, unit=""): tag_group.str_include_units = False original_svg_file = os.path.join(this_file_dir(), - "../../notebooks/archive/power_gen/ngfc/NGFC_results_template.svg") + "../../archive/power_gen/ngfc/NGFC_results_template.svg") with open(original_svg_file, "r") as f: svg_tag(svg=f, tag_group=tag_group, outfile=outfile) @@ -1676,11 +1666,12 @@ def main(): if os.path.exists("../../notebooks/archive/power_gen/ngfc/NGFC_flowsheet_init.json.gz") and reinit is False: # already initialized, can build model and load results from json + build_properties(m) build_power_island(m) build_reformer(m) scale_flowsheet(m) connect_reformer_to_power_island(m) - SOFC_ROM_setup(m) + SOFC_ROM_setup(m, init=False) add_SOFC_energy_balance(m) add_result_constraints(m) if os.path.exists("../../notebooks/archive/power_gen/ngfc/NGFC_flowsheet_solution.json.gz") and resolve is False: @@ -1693,26 +1684,20 @@ def main(): print('Loading initialized model') ms.from_json(m, fname="NGFC_flowsheet_init.json.gz") # solver and options - solver = pyo.SolverFactory("ipopt") - solver.options = { - "max_iter": 50, - "tol": 1e-5, - "bound_push": 1e-8, - "linear_solver": "ma57", - "ma57_pivtol": 1e-3, - "OF_ma57_automatic_scaling": "yes", + solver_ma97 = pyo.SolverFactory("ipopt") + solver_ma97.options = { + "max_iter": 200, + "tol": 1e-7, + "bound_push": 1e-5, + "mu_init": 1e-2, + "linear_solver": "ma97", "nlp_scaling_method": "user-scaling" - } - solve_iteration = 0 - for i in range(1, 10): # keep looping until condition is met - solve_iteration += 1 - print('Solve # ', solve_iteration) - res = solver.solve(m, tee=True) - if 'Optimal Solution Found' in res.solver.message: - break + } + solver_ma97.solve(m, tee=True) ms.to_json(m, fname="NGFC_flowsheet_solution.json.gz") else: # need to initialize model, serialize, and try to solve/serialize + build_properties(m) build_power_island(m) build_reformer(m) scale_flowsheet(m) @@ -1721,27 +1706,34 @@ def main(): initialize_power_island(m) initialize_reformer(m) connect_reformer_to_power_island(m) - SOFC_ROM_setup(m) + + solver_ma57 = pyo.SolverFactory("ipopt") + solver_ma57.options = { + "max_iter": 200, + "tol": 1e-7, + "bound_push": 1e-5, + "linear_solver": "ma57", + "OF_ma57_automatic_scaling": "yes", + "nlp_scaling_method": "user-scaling" + } + solver_ma57.solve(m, tee=True) + + SOFC_ROM_setup(m, init=True) add_SOFC_energy_balance(m) add_result_constraints(m) + ms.to_json(m, fname="NGFC_flowsheet_init.json.gz") - solver = pyo.SolverFactory("ipopt") - solver.options = { - "max_iter": 50, - "tol": 1e-5, - "bound_push": 1e-8, - "linear_solver": "ma57", - "ma57_pivtol": 1e-3, - "OF_ma57_automatic_scaling": "yes", + + solver_ma97 = pyo.SolverFactory("ipopt") + solver_ma97.options = { + "max_iter": 200, + "tol": 1e-7, + "bound_push": 1e-5, + "mu_init": 1e-2, + "linear_solver": "ma97", "nlp_scaling_method": "user-scaling" - } - solve_iteration = 0 - for i in range(1, 10): # keep looping until condition is met - solve_iteration += 1 - print('Solve # ', solve_iteration) - res = solver.solve(m, tee=True) - if 'Optimal Solution Found' in res.solver.message: - break + } + solver_ma97.solve(m, tee=True) ms.to_json(m, fname="NGFC_flowsheet_solution.json.gz") diff --git a/idaes_examples/mod/power_gen/SOFC_ROM.py b/idaes_examples/mod/power_gen/SOFC_ROM.py index 5bb651c8..3c271de3 100644 --- a/idaes_examples/mod/power_gen/SOFC_ROM.py +++ b/idaes_examples/mod/power_gen/SOFC_ROM.py @@ -58,7 +58,7 @@ def build_SOFC_ROM(m): n_outputs = 48 n_samples = 13424 - # create indecies for vars and params + # create indices for vars and params input_index = list(range(n_inputs)) input_plus_index = list(range(n_inputs + 1)) output_index = list(range(n_outputs)) diff --git a/idaes_examples/mod/power_gen/gas_turbine.py b/idaes_examples/mod/power_gen/gas_turbine.py index eee8ec4d..40072093 100644 --- a/idaes_examples/mod/power_gen/gas_turbine.py +++ b/idaes_examples/mod/power_gen/gas_turbine.py @@ -85,11 +85,11 @@ def _add_properties( self.cmb_species = cmb_species self.flue_species = flue_species self.rxns = rxns - # Here three differnt type of property blocks are used, so that we can + # Here three different type of property blocks are used, so that we can # avoid components with zero flow, which can cause problems with # certain property calculations (entropy for example). Three types of # gas streams are Air, combstion mixture, and flue gas. Fortunately - # natural gas has some air compoents in it so the combustion property + # natural gas has some air components in it so the combustion property # parameters can be used for natural gas and natural gas mixed with air. self.prop_water = iapws95.Iapws95ParameterBlock() self.air_prop_params = GenericParameterBlock( @@ -122,7 +122,7 @@ def _add_models(self): property_package=self.flue_prop_params, ) self.vsv = um.Valve( - doc="Valve to approximatly variable inlet guide vanes", + doc="Valve to approximately variable inlet guide vanes", valve_function_callback=um.ValveFunctionType.linear, property_package=self.air_prop_params, ) @@ -323,7 +323,7 @@ def head_isen_eqn(b, t): )*pyo.units.m**2/pyo.units.s**2 def _add_constraints(self): - """Add addtional flowsheet constraints and expressions""" + """Add additional flowsheet constraints and expressions""" self.cmbout_o2_mol_frac = pyo.Var( self.time, initialize=0.1157, doc="Combustor outlet O2 mole fraction." ) @@ -373,7 +373,7 @@ def gt_power_expr(b, t): + self.gts3.control_volume.work[t] ) - # Add a varable and constraint for gross power. This allows fixing power + # Add a variable and constraint for gross power. This allows fixing power # for simulations where a specific power output is desired. self.gt_power = pyo.Var(self.time, units=pyo.units.W) @@ -920,7 +920,7 @@ def initialize( propagate_state(self.g02b) self.gts1.ratioP[0] = 0.7 self.gts1.initialize(outlvl=outlvl, solver=solver, optarg=optarg) - # blade cooling air valve01, and calculate a flow coefficent + # blade cooling air valve01, and calculate a flow coefficient propagate_state(self.air05) self.valve01.Cv = 2 self.valve01.Cv.unfix() @@ -943,7 +943,7 @@ def initialize( propagate_state(self.g04) self.gts2.ratioP[0] = 0.7 self.gts2.initialize(outlvl=outlvl, solver=solver, optarg=optarg) - # blade cooling air valve02, and calculate a flow coefficent + # blade cooling air valve02, and calculate a flow coefficient propagate_state(self.air07) self.valve02.Cv = 2 self.valve02.Cv.unfix() @@ -966,7 +966,7 @@ def initialize( propagate_state(self.g06) self.gts3.ratioP[0] = 0.7 self.gts3.initialize(outlvl=outlvl, solver=solver, optarg=optarg) - # blade cooling air valve03, and calculate a flow coefficent + # blade cooling air valve03, and calculate a flow coefficient propagate_state(self.air09) self.valve03.Cv = 2 self.valve03.Cv.unfix() @@ -998,17 +998,17 @@ def initialize( self.valve01.control_volume.properties_in[0].flow_mol.unfix() self.valve02.control_volume.properties_in[0].flow_mol.unfix() self.valve03.control_volume.properties_in[0].flow_mol.unfix() - # deltaP will be whatever is needed to satisfy the power requirment + # deltaP will be whatever is needed to satisfy the power requirement self.vsv.deltaP.unfix() # The compressor efficiency is a little high since it doesn't include # throttling in the valve use to approximate VSV. self.cmp1.efficiency_isentropic.fix(0.92) self.cmp1.ratioP.fix(17.5) # lowering this ratio, just means less pressure - # drop in the VSV valve, decresing throttle loss + # drop in the VSV valve, decreasing throttle loss # Exhaust pressure will be a bit over ATM due to HRSG. This will come from # HRSG model when coupled to form NGCC model self.exhaust_1.pressure.fix(1.1e5) - # Don't know how much blade cooling air is needed for off desing case, but + # Don't know how much blade cooling air is needed for off design case, but # full load flows were based on WVU model. For now just leave valves at # fixed opening. self.valve01.valve_opening.fix() diff --git a/idaes_examples/mod/power_gen/hrsg.py b/idaes_examples/mod/power_gen/hrsg.py index a128b03f..7d6425e7 100644 --- a/idaes_examples/mod/power_gen/hrsg.py +++ b/idaes_examples/mod/power_gen/hrsg.py @@ -89,7 +89,7 @@ def _add_properties(self): def _add_unit_models(self): """Add process unit models""" - # short refernce to property parameter blocks + # short reference to property parameter blocks prop_water = self.prop_water prop_gas = self.prop_gas @@ -121,7 +121,7 @@ def _add_unit_models(self): property_package_args={'has_phase_equilibrium':False} ) self.drum_lp = HelmPhaseSeparator( - doc="Phase seperator for LP evaporator (parital evaporator)", + doc="Phase separator for LP evaporator (partial evaporator)", property_package=prop_water, property_package_args={'has_phase_equilibrium':False} ) diff --git a/idaes_examples/mod/power_gen/ngcc.py b/idaes_examples/mod/power_gen/ngcc.py index 3c71e805..38143237 100644 --- a/idaes_examples/mod/power_gen/ngcc.py +++ b/idaes_examples/mod/power_gen/ngcc.py @@ -221,7 +221,7 @@ def _add_constraints(self): self.cap_specific_reboiler_duty = pyo.Var( initialize=2.7e6, units=pyo.units.J / pyo.units.kg ) - self.cap_addtional_co2 = pyo.Var( + self.cap_additional_co2 = pyo.Var( self.config.time, initialize=0.0, units=pyo.units.kg / pyo.units.s ) self.cap_specific_compression_power = pyo.Var( @@ -349,7 +349,7 @@ def reboiler_duty_expr(b, t): # scale to flue gas flow * 0.04401 * pyo.units.kg / pyo.units.mol - + b.cap_addtional_co2[t] + + b.cap_additional_co2[t] ) + b.cap_additional_reboiler_duty[t] ) @@ -431,7 +431,7 @@ def initialize( # here suffix=False avoids loading scaling factors iutil.from_json(self, fname=load_from, wts=iutil.StoreSpec(suffix=False)) else: - self.cap_addtional_co2.fix() + self.cap_additional_co2.fix() self.cap_fraction.fix() self.cap_specific_reboiler_duty.fix() self.cap_specific_compression_power.fix() @@ -495,7 +495,7 @@ def initialize( self.st.steam_turbine.inlet_split.inlet.unfix() solver_obj.solve(self, tee=True) - init_log.info(f"Fix flow coefficent and free throttle") + init_log.info(f"Fix flow coefficient and free throttle") self.st.steam_turbine.throttle_valve[1].pressure_flow_equation.deactivate() self.st.steam_turbine.outlet_stage.flow_coeff.fix() solver_obj.solve(self, tee=True) diff --git a/idaes_examples/mod/power_gen/ngcc_soec_costing.py b/idaes_examples/mod/power_gen/ngcc_soec_costing.py index e1b9d13f..5d7423c7 100644 --- a/idaes_examples/mod/power_gen/ngcc_soec_costing.py +++ b/idaes_examples/mod/power_gen/ngcc_soec_costing.py @@ -101,7 +101,7 @@ def CO2_aux_load_constraint(b, t): return b.CO2_aux_load[t] == baseline_CO2_aux_load*(b.CO2_captured[t]/baseline_capture) # CO2 compressor auxiliary load - # this load is included in CO2_aux_load but needed seperatly for costing + # this load is included in CO2_aux_load but needed separately for costing m.fs.CO2_compressor_load = pyo.Var(m.fs.time, units=pyunits.kW) @m.fs.Constraint(m.fs.time) @@ -760,7 +760,7 @@ def get_ngcc_soec_capital_cost(m, CE_index_year): }, ) - # accounts with auxilliary load as the process parameter + # accounts with auxiliary load as the process parameter aux_load_accounts = ["11.2", "11.3", "11.4", "11.5", "11.6", "12.1", "12.2", "12.3", "12.4", "12.5", "12.6", "12.7", "12.8", "12.9"] diff --git a/idaes_examples/mod/power_gen/soc_dynamic_flowsheet.py b/idaes_examples/mod/power_gen/soc_dynamic_flowsheet.py new file mode 100644 index 00000000..d1277f37 --- /dev/null +++ b/idaes_examples/mod/power_gen/soc_dynamic_flowsheet.py @@ -0,0 +1,1472 @@ +import os +import pandas as pd +import numpy as np + +import pyomo.environ as pyo +from pyomo.common.config import ConfigValue, Bool +from pyomo.network import Arc +from pyomo.common.fileutils import this_file_dir + +from idaes.core import FlowsheetBlockData, declare_process_block_class +from idaes.core.util.model_statistics import degrees_of_freedom +from idaes.models.properties.modular_properties.base.generic_property import ( + GenericParameterBlock + ) +import idaes.core.util.scaling as iscale +from idaes.models_extra.power_generation.properties.natural_gas_PR import get_prop, EosType +from idaes.models_extra.power_generation.unit_models.soc_submodels import SolidOxideModuleSimple +import idaes.models.unit_models as gum +from idaes.models.properties import iapws95 +from idaes.core.util.initialization import propagate_state +import idaes.logger as idaeslog +import idaes.core.util as iutil +import idaes.core.util.tables as tables +from idaes.core.solvers import get_solver +from idaes.core.util.tags import svg_tag +from idaes.models_extra.power_generation.unit_models import CrossFlowHeatExchanger1D +from idaes.models.unit_models.heat_exchanger import HeatExchangerFlowPattern +from idaes.models_extra.power_generation.unit_models import Heater1D +from idaes.models.control.controller import ( + PIDController, ControllerType +) +from pyomo.common.collections import ComponentSet +from pyomo.dae import DerivativeVar + +def scale_indexed_constraint(con, sf): + for c in con.values(): + iscale.constraint_scaling_transform(c, sf) + +def set_indexed_variable_bounds(var, bounds): + for subvar in var.values(): + subvar.bounds = bounds + +@declare_process_block_class("SocStandaloneFlowsheet") +class SocStandaloneFlowsheetData(FlowsheetBlockData): + sweep_comp = { + "O2":0.2074, + "H2O":0.0099, + "CO2":0.0003, + "N2":0.7732, + "Ar":0.0092, + } + + CONFIG = FlowsheetBlockData.CONFIG + CONFIG.declare( + "thin_electrolyte_and_oxygen_electrode", + ConfigValue( + default=False, + domain=Bool, + description="Determines whether to use some thin submodels in SOEC", + doc="""Determines whether to use thin submodels in SOEC, + **default** - False. + **Valid values:** { + **True** - Use thin submodels, + **False** - do not use thin submodels.}""", + ), + ) + CONFIG.declare( + "include_interconnect", + ConfigValue( + default=False, + domain=Bool, + description="Determines whether to make interconnect in SOEC", + doc="""Determines whether to make interconnect in SOEC, + **default** - False. + **Valid values:** { + **True** - Make interconnect, + **False** - do not make interconnect.}""", + ), + ) + CONFIG.declare( + "quasi_steady_state", + ConfigValue( + default=False, + domain=Bool, + description="If True, force units to be steady-state even if flowsheet is dynamic", + doc="""Determines whether to force units to be steady-state even if flowsheet is dynamic, + **default** - False. + **Valid values:** { + **True** - Force steady state units, + **False** - Create dynamic unit models where appropriate.}""", + ), + ) + + def build(self): + super().build() + + self._add_properties() + self._add_units() + self._add_arcs() + self._add_constraints() + self._set_initial_inputs() + self._define_cell_params() + self._scaling() + self._add_tags() + self._make_temperature_gradient_terms() + self.manipulated_variables = ComponentSet([ + self.makeup_mix.makeup.flow_mol, + self.sweep_blower.inlet.flow_mol, + self.soc_module.potential_cell, + self.feed_recycle_split.recycle_ratio, + self.sweep_recycle_split.recycle_ratio, + self.condenser_split.recycle_ratio, + self.feed_heater.electric_heat_duty, + self.sweep_heater.electric_heat_duty, + self.condenser_flash.vap_outlet.temperature, + self.makeup_mix.makeup_mole_frac_comp_H2, + self.makeup_mix.makeup_mole_frac_comp_H2O, + ]) + if self.config.dynamic: + self.controller_set = ComponentSet() + + def _add_properties(self): + self.water_prop_params = iapws95.Iapws95ParameterBlock() + self.o2_side_prop_params = GenericParameterBlock( + **get_prop(self.sweep_comp, ["Vap"], eos=EosType.IDEAL), + doc="Air property parameters", + ) + self.h2_side_prop_params = GenericParameterBlock( + **get_prop(["H2", "H2O", "Ar", "N2"], ["Vap"], eos=EosType.IDEAL), + doc="H2O + H2 gas property parameters", + ) + self.h2_condensing_prop_params = GenericParameterBlock( + **get_prop(["H2", "H2O", "Ar", "N2"], ["Liq", "Vap",], eos=EosType.PR), + doc="H2O + H2 gas property parameters", + ) + self.h2_condensing_prop_params.H2.config.parameter_data["kappa1"] = 0.0 + self.h2_condensing_prop_params.N2.config.parameter_data["kappa1"] = 0.0 + self.h2_condensing_prop_params.Ar.config.parameter_data["kappa1"] = 0.0 + self.h2_condensing_prop_params.H2O.config\ + .parameter_data["kappa1"] = -0.0665 # p. 312 of (Sandler, 2006) + # Use PR-SV for water phase equilibrium + sqrt = pyo.sqrt + def omega_func(cobj): + return (0.378893 + 1.4897153*cobj.omega - 0.17131848*cobj.omega**2 + + 0.0196554*cobj.omega**3) + def alpha_func(T, fw, cobj): + TR = T / cobj.temperature_crit + kappa1 = cobj.config.parameter_data["kappa1"] + kappa = fw + kappa1*(1 + sqrt(TR))*(0.7 - TR) + return (1 + kappa*(1-sqrt(TR)))**2 + + def dalpha_dT_func(T,fw,cobj): + Tc = cobj.temperature_crit + Tr = T /Tc + kappa1 = cobj.config.parameter_data["kappa1"] + kappa = fw + kappa1*(1 + sqrt(Tr))*(0.7 - Tr) + dkappa_dT = kappa1*((0.7 - Tr)/(2*sqrt(T*Tc)) - (1 + sqrt(Tr))/Tc) + return 2*(1 + kappa*(1-sqrt(Tr)))*((1-sqrt(Tr))*dkappa_dT + - kappa/(2*sqrt(T*Tc))) + + def d2alpha_dT2_func(T,fw,cobj): + Tc = cobj.temperature_crit + Tr = T/Tc + kappa1 = cobj.config.parameter_data["kappa1"] + kappa = fw + kappa1*(1 + sqrt(Tr))*(0.7 - Tr) + + sqrt_alpha = 1 + kappa*(1-sqrt(Tr)) + + dsqrtalpha_dTr = -fw/(2*sqrt(Tr)) - 1.7*kappa1 + 2*kappa1*Tr + d2sqrtalpha_dTr = 2*kappa1 + fw/(4*Tr**1.5) + + d2alpha_dTr2 = 2*dsqrtalpha_dTr**2 + 2*sqrt_alpha*d2sqrtalpha_dTr + + return d2alpha_dTr2/Tc**2 + self.h2_condensing_prop_params.PR_func_fw = omega_func + self.h2_condensing_prop_params.PR_func_alpha = alpha_func + self.h2_condensing_prop_params.PR_func_dalpha_dT = dalpha_dT_func + self.h2_condensing_prop_params.PR_func_d2alpha_dT2 = d2alpha_dT2_func + + + generic_prop_packages = [self.o2_side_prop_params, + self.h2_side_prop_params, + self.h2_condensing_prop_params + ] + for pp in generic_prop_packages: + pp.set_default_scaling("enth_mol_phase", 1e-3) + pp.set_default_scaling("pressure", 1e-5) + pp.set_default_scaling("temperature", 1e-2) + pp.set_default_scaling("flow_mol", 1e-3) + + _mf_scale = { + "Ar":100, + "O2":10, + "N2":10, + "H2":10, + "H2O":100, + "CO2":1000} + for comp, s in _mf_scale.items(): + self.o2_side_prop_params.set_default_scaling("mole_frac_comp", s, index=comp) + self.o2_side_prop_params.set_default_scaling("mole_frac_phase_comp", s, index=("Vap", comp)) + self.o2_side_prop_params.set_default_scaling("flow_mol_phase_comp", s*1e-3, index=("Vap", comp)) + + _mf_scale = { + "H2": 1, + "H2O": 1, + "N2": 10, + "Ar": 10, + } + for comp, s in _mf_scale.items(): + for params in [self.h2_side_prop_params, self.h2_condensing_prop_params]: + params.set_default_scaling("mole_frac_comp", s, index=comp) + params.set_default_scaling("mole_frac_phase_comp", s, index=("Vap", comp)) + params.set_default_scaling("flow_mol_phase_comp", s * 1e-3, index=("Vap", comp)) + + self.h2_condensing_prop_params.set_default_scaling("mole_frac_phase_comp", 1, index=("Liq", "H2O")) + self.h2_condensing_prop_params.set_default_scaling("flow_mol_phase_comp", 1 * 1e-3, index=("Liq", "H2O")) + + def _define_cell_params(self): + self.soc_module.number_cells.fix(4e5) + soec = self.soc_module.solid_oxide_cell + + soec.fuel_channel.length_x.fix(873e-6) + soec.length_y.fix(0.2345) + soec.length_z.fix(0.2345) + soec.fuel_channel.heat_transfer_coefficient.fix(100) + + soec.oxygen_channel.length_x.fix(873e-6) + soec.oxygen_channel.heat_transfer_coefficient.fix(100) + + soec.fuel_electrode.length_x.fix(1e-3) + soec.fuel_electrode.porosity.fix(0.326) + soec.fuel_electrode.tortuosity.fix(3) + soec.fuel_electrode.solid_heat_capacity.fix(595) + soec.fuel_electrode.solid_density.fix(7740.0) + soec.fuel_electrode.solid_thermal_conductivity.fix(6.23) + soec.fuel_electrode.resistivity_log_preexponential_factor\ + .fix(pyo.log(2.5e-5)) + soec.fuel_electrode.resistivity_thermal_exponent_dividend.fix(0) + + if self.config.thin_electrolyte_and_oxygen_electrode: + soec.oxygen_electrode.contact_fraction.fix(1) + soec.oxygen_electrode.log_preexponential_factor.fix(pyo.log(7.8125e-05 * 40e-6)) + soec.oxygen_electrode.thermal_exponent_dividend.fix(0) + + soec.electrolyte.contact_fraction.fix(1) + soec.electrolyte.log_preexponential_factor.fix(-9 + pyo.log(10.5e-6)) + soec.electrolyte.thermal_exponent_dividend.fix(8988) + else: + soec.oxygen_electrode.length_x.fix(40e-6) + soec.oxygen_electrode.porosity.fix(0.30717) + soec.oxygen_electrode.tortuosity.fix(3.0) + soec.oxygen_electrode.solid_heat_capacity.fix(142.3) + soec.oxygen_electrode.solid_density.fix(5300) + soec.oxygen_electrode.solid_thermal_conductivity.fix(2.0) + soec.oxygen_electrode.resistivity_log_preexponential_factor\ + .fix(pyo.log(7.8125e-05)) + soec.oxygen_electrode.resistivity_thermal_exponent_dividend.fix(0) + + soec.electrolyte.length_x.fix(10.5e-6) + soec.electrolyte.heat_capacity.fix(400) + soec.electrolyte.density.fix(6000) + soec.electrolyte.thermal_conductivity.fix(2.17) + soec.electrolyte.resistivity_log_preexponential_factor\ + .fix(-9) + soec.electrolyte.resistivity_thermal_exponent_dividend.fix(8988) + + soec.fuel_triple_phase_boundary.exchange_current_log_preexponential_factor\ + .fix(22.5) + soec.fuel_triple_phase_boundary.exchange_current_activation_energy.fix(110.8e3) + soec.fuel_triple_phase_boundary.activation_potential_alpha1.fix(1 - 0.352184) + soec.fuel_triple_phase_boundary.activation_potential_alpha2.fix(0.352184) + + soec.fuel_triple_phase_boundary.exchange_current_exponent_comp["H2"].fix(0.5) + soec.fuel_triple_phase_boundary.exchange_current_exponent_comp["H2O"].fix(0.5) + + soec.oxygen_triple_phase_boundary.exchange_current_log_preexponential_factor\ + .fix(25.5) + soec.oxygen_triple_phase_boundary.exchange_current_activation_energy.fix(112.1e3) + soec.oxygen_triple_phase_boundary.activation_potential_alpha1.fix(1 - 0.497231) + soec.oxygen_triple_phase_boundary.activation_potential_alpha2.fix(0.497231) + + soec.oxygen_triple_phase_boundary.exchange_current_exponent_comp["O2"].fix(0.25) + if self.config.include_interconnect: + soec.interconnect.length_x.fix(5e-3) + soec.interconnect.density.fix(7640) + soec.interconnect.heat_capacity.fix(948) + soec.interconnect.thermal_conductivity.fix(27) + soec.interconnect.resistivity_log_preexponential_factor.fix(pyo.log(110e-8)) + soec.interconnect.resistivity_thermal_exponent_dividend.fix(0) + + + def _add_units(self): + zfaces = np.linspace(0, 1, 11).tolist() + xfaces_electrode = [0.0, 1.0] + xfaces_electrolyte = [0.0, 1.0] + + air_sweep = True + dynamic_unit_models = self.config.dynamic and not self.config.quasi_steady_state + + soc_cell_config = { + "has_holdup": True, + "dynamic": dynamic_unit_models, + "has_gas_holdup": False, + "control_volume_zfaces": zfaces, + "control_volume_xfaces_fuel_electrode": xfaces_electrode, + "fuel_component_list": ["H2", "H2O", "Ar", "N2"], + "fuel_triple_phase_boundary_stoich_dict": {"H2": -0.5, "H2O": 0.5, "Vac":0.5, "O^2-":-0.5, "e^-":1.0}, + "inert_fuel_species_triple_phase_boundary": ["Ar", "N2"], + "flow_pattern": HeatExchangerFlowPattern.countercurrent, + "include_temperature_x_thermo": True, + } + if self.config.include_interconnect: + soc_cell_config["flux_through_interconnect"] = True + soc_cell_config["control_volume_xfaces_interconnect"] = [0.0, 1.0] + + if air_sweep: + soc_cell_config["oxygen_component_list"] = ["Ar","CO2","H2O","O2","N2"] + soc_cell_config["oxygen_triple_phase_boundary_stoich_dict"] = { + "Ar": 0.0, + "CO2": 0.0, + "H2O": 0.0, + "O2": -0.25, + "N2": 0.0, + "Vac": -0.5, + "O^2-": 0.5, + "e^-": -1.0 + } + soc_cell_config["inert_oxygen_species_triple_phase_boundary"] = ["Ar","CO2","H2O","N2"] + else: + soc_cell_config["oxygen_component_list"] = ["O2","H2O"] + soc_cell_config["oxygen_triple_phase_boundary_stoich_dict"] = { + "O2": -0.25, "H2O": 0, "Vac":-0.5, "O^2-":0.5, "e^-":-1.0 + } + soc_cell_config["inert_oxygen_species_triple_phase_boundary"] = ["H2O"] + + if self.config.thin_electrolyte_and_oxygen_electrode: + soc_cell_config["thin_oxygen_electrode"] = True + soc_cell_config["thin_electrolyte"] = True + else: + soc_cell_config["control_volume_xfaces_oxygen_electrode"] = xfaces_electrode + soc_cell_config["control_volume_xfaces_electrolyte"] = xfaces_electrolyte + self.soc_module = SolidOxideModuleSimple( + dynamic=dynamic_unit_models, + solid_oxide_cell_config=soc_cell_config, + fuel_property_package=self.h2_side_prop_params, + oxygen_property_package=self.o2_side_prop_params, + ) + + self.sweep_recycle_split = gum.Separator( + doc="Sweep recycle splitter", + property_package=self.o2_side_prop_params, + outlet_list=["out", "recycle"], + ) + self.feed_recycle_split = gum.Separator( + doc="Feed recycle splitter", + property_package=self.h2_side_prop_params, + outlet_list=["out", "recycle"], + ) + self.sweep_recycle_mix = gum.Mixer( + doc="Sweep recycle mixer", + property_package=self.o2_side_prop_params, + inlet_list=["feed", "recycle"], + momentum_mixing_type=gum.MomentumMixingType.none + ) + + @self.sweep_recycle_mix.Constraint(self.time) + def pressure_equality_eqn(b,t): + return b.mixed_state[t].pressure == b.feed_state[t].pressure + + self.feed_recycle_mix = gum.Mixer( + doc="Feed recycle mixer", + property_package=self.h2_side_prop_params, + inlet_list=["feed", "recycle"], + momentum_mixing_type=gum.MomentumMixingType.none + ) + + @self.feed_recycle_mix.Constraint(self.time) + def pressure_equality_eqn(b,t): + return b.mixed_state[t].pressure == b.feed_state[t].pressure + + self.sweep_exchanger = CrossFlowHeatExchanger1D( + has_holdup=True, + dynamic=dynamic_unit_models, + cold_side={ + "property_package": self.o2_side_prop_params, + "dynamic": False, + "has_holdup": False, + "has_pressure_change": False, + "transformation_method": "dae.finite_difference", + "transformation_scheme": "BACKWARD", + }, + hot_side={ + "property_package": self.o2_side_prop_params, + "dynamic": False, + "has_holdup": False, + "has_pressure_change": False, + "transformation_method": "dae.finite_difference", + "transformation_scheme": "BACKWARD", + }, + shell_is_hot=True, + flow_type=HeatExchangerFlowPattern.countercurrent, + finite_elements=10, + tube_arrangement="in-line", + ) + self.feed_hot_exchanger = CrossFlowHeatExchanger1D( + has_holdup=True, + dynamic=dynamic_unit_models, + cold_side={ + "property_package": self.h2_side_prop_params, + "has_holdup": False, + "dynamic": False, + "has_pressure_change": False, + "transformation_method": "dae.finite_difference", + "transformation_scheme": "BACKWARD", + }, + hot_side={ + "property_package": self.h2_side_prop_params, + "has_holdup": False, + "dynamic": False, + "has_pressure_change": False, + "transformation_method": "dae.finite_difference", + "transformation_scheme": "BACKWARD", + }, + shell_is_hot=True, + flow_type=HeatExchangerFlowPattern.countercurrent, + finite_elements=12, + tube_arrangement="staggered", + ) + self.feed_medium_exchanger = CrossFlowHeatExchanger1D( + has_holdup=True, + dynamic=dynamic_unit_models, + cold_side={ + "property_package": self.h2_side_prop_params, + "has_holdup": False, + "dynamic": False, + "has_pressure_change": False, + "transformation_method": "dae.finite_difference", + "transformation_scheme": "BACKWARD", + }, + hot_side={ + "property_package": self.o2_side_prop_params, + "has_holdup": False, + "dynamic": False, + "has_pressure_change": False, + "transformation_method": "dae.finite_difference", + "transformation_scheme": "BACKWARD", + }, + shell_is_hot=True, + finite_elements=6, + flow_type=HeatExchangerFlowPattern.countercurrent, + tube_arrangement="staggered", + ) + self.sweep_blower = gum.Compressor( + doc="Sweep blower", + property_package=self.o2_side_prop_params, + dynamic=False + ) + self.feed_heater = Heater1D( + property_package=self.h2_side_prop_params, + has_holdup=True, + dynamic=dynamic_unit_models, + has_fluid_holdup=False, + has_pressure_change=False, + finite_elements=4, + tube_arrangement="in-line", + ) + self.sweep_heater = Heater1D( + property_package=self.o2_side_prop_params, + has_holdup=True, + dynamic=dynamic_unit_models, + has_fluid_holdup=False, + has_pressure_change=False, + finite_elements=4, + tube_arrangement="in-line", + ) + self.condenser_flash = gum.Flash( + property_package=self.h2_condensing_prop_params, + has_heat_transfer=True, + has_holdup=False, + dynamic=False, + ) + self.condenser_split = gum.Separator( + dynamic=False, + doc="Vent gas recirculation splitter", + property_package=self.h2_side_prop_params, + outlet_list=["out", "recycle"], + ) + + self.makeup_mix = gum.Mixer( + dynamic=False, + doc="Vent gas recirculation splitter", + property_package=self.h2_side_prop_params, + inlet_list=["makeup", "recycle"], + momentum_mixing_type=gum.MomentumMixingType.none + ) + + @self.makeup_mix.Constraint(self.time) + def pressure_equality_eqn(b, t): + return b.mixed_state[t].pressure == b.makeup_state[t].pressure + + def _add_arcs(self): + self.ostrm01 = Arc( + doc="SOEC sweep gas out to recycle splitter", + source=self.soc_module.oxygen_outlet, + destination=self.sweep_recycle_split.inlet, + ) + self.hstrm01 = Arc( + doc="SOEC hydrogen stream out to recycle splitter", + source=self.soc_module.fuel_outlet, + destination=self.feed_recycle_split.inlet, + ) + self.ostrm02 = Arc( + doc="SOEC sweep recycle to sweep mixer", + source=self.sweep_recycle_split.recycle, + destination=self.sweep_recycle_mix.recycle, + ) + self.hstrm02 = Arc( + doc="SOEC hydrogen recycle to feed mixer", + source=self.feed_recycle_split.recycle, + destination=self.feed_recycle_mix.recycle, + ) + self.sweep03 = Arc( + doc="Sweep mixer to sweep heater", + source=self.sweep_recycle_mix.outlet, + destination=self.sweep_heater.inlet, + ) + self.feed03 = Arc( + doc="Feed mixer to feed heater", + source=self.feed_recycle_mix.outlet, + destination=self.feed_heater.inlet, + ) + self.sweep04 = Arc( + doc="Sweep heater to SOEC", + source=self.sweep_heater.outlet, + destination=self.soc_module.oxygen_inlet, + ) + self.feed04 = Arc( + doc="Feed heater to SOEC", + source=self.feed_heater.outlet, + destination=self.soc_module.fuel_inlet, + ) + self.ostrm03 = Arc( + doc="Sweep to heat recovery hx", + source=self.sweep_recycle_split.out, + destination=self.sweep_exchanger.shell_inlet, + ) + self.ostrm04 = Arc( + doc="Sweep to medium temp heat recovery hx", + source=self.sweep_exchanger.shell_outlet, + destination=self.feed_medium_exchanger.shell_inlet, + ) + self.sweep01 = Arc( + doc="Sweep blower to translator", + source=self.sweep_blower.outlet, + destination=self.sweep_exchanger.tube_inlet, + ) + self.sweep02 = Arc( + doc="", + source=self.sweep_exchanger.tube_outlet, + destination=self.sweep_recycle_mix.feed + ) + self.hstrm03 = Arc( + doc="", + source=self.feed_recycle_split.out, + destination=self.feed_hot_exchanger.shell_inlet, + ) + self.hstrmShortcut = Arc( + source=self.feed_hot_exchanger.shell_outlet, + destination=self.condenser_flash.inlet + ) + self.hstrm06 = Arc( + source=self.condenser_flash.vap_outlet, + destination=self.condenser_split.inlet + ) + self.vgr = Arc( + source=self.condenser_split.recycle, + destination=self.makeup_mix.recycle + ) + + self.feed00 = Arc( + source=self.makeup_mix.outlet, + destination=self.feed_medium_exchanger.tube_inlet + ) + self.feed01 = Arc( + doc="", + source=self.feed_medium_exchanger.tube_outlet, + destination=self.feed_hot_exchanger.tube_inlet, + ) + self.feed02 = Arc( + doc="", + source=self.feed_hot_exchanger.tube_outlet, + destination=self.feed_recycle_mix.feed, + ) + pyo.TransformationFactory("network.expand_arcs").apply_to(self) + + def _add_constraints(self): + for split in [self.feed_recycle_split, self.sweep_recycle_split, self.condenser_split]: + split.recycle_split_fraction = pyo.Reference(split.split_fraction[:, "recycle"], ctype=pyo.Var) + split.recycle_ratio = pyo.Var(self.time, units=pyo.units.dimensionless, bounds=(0, None)) + @split.Constraint(self.time) + def recycle_ratio_eqn(b, t): + return b.recycle_ratio[t] == b.recycle_split_fraction[t] / (1 - b.recycle_split_fraction[t]) + + self.h2_mass_production = pyo.Var(self.time, initialize=2, + units=pyo.units.kg/pyo.units.s) + + @self.Constraint(self.time) + def h2_mass_production_eqn(b, t): + return( + b.h2_mass_production[t] + == 0.002016*(pyo.units.kg/pyo.units.mol) * ( + b.condenser_split.out_state[t].flow_mol + * b.condenser_split.out_state[t].mole_frac_comp["H2"] + - b.makeup_mix.makeup_state[t].flow_mol + * b.makeup_mix.makeup_state[t].mole_frac_comp["H2"] + ) + ) + + self.h2_mass_consumption = pyo.Var(self.time, initialize=1, + units=pyo.units.kg/pyo.units.s) + + @self.Constraint(self.time) + def h2_mass_consumption_eqn(b, t): + return( + b.h2_mass_consumption[t] + == 0.002016*(pyo.units.kg/pyo.units.mol) * ( + b.makeup_mix.makeup_state[t].flow_mol + * b.makeup_mix.makeup_state[t].mole_frac_comp["H2"] + ) + ) + + self.makeup_mix.makeup_mole_frac_comp_H2 = pyo.Reference(self.makeup_mix.makeup.mole_frac_comp[:, "H2"]) + self.makeup_mix.makeup_mole_frac_comp_H2O = pyo.Reference(self.makeup_mix.makeup.mole_frac_comp[:, "H2O"]) + self.soc_module.fuel_inlet_mole_frac_comp_H2 = pyo.Reference(self.soc_module.fuel_inlet.mole_frac_comp[:, "H2"]) + self.soc_module.fuel_inlet_mole_frac_comp_H2O = pyo.Reference(self.soc_module.fuel_inlet.mole_frac_comp[:, "H2O"]) + self.soc_module.fuel_outlet_mole_frac_comp_H2 = pyo.Reference(self.soc_module.fuel_outlet.mole_frac_comp[:, "H2"]) + self.soc_module.fuel_outlet_mole_frac_comp_H2O = pyo.Reference(self.soc_module.fuel_outlet.mole_frac_comp[:, "H2O"]) + self.soc_module.oxygen_outlet_mole_frac_comp_O2 = pyo.Reference(self.soc_module.oxygen_outlet.mole_frac_comp[:, "O2"]) + + self.soec_water_consumption_rate = pyo.Var(self.time, initialize=0.75) + + @self.Constraint(self.time) + def soec_water_consumption_rate_eqn(b, t): + return b.soec_water_consumption_rate[t] == ( + b.makeup_mix.makeup_state[t].flow_mol * b.makeup_mix.makeup_state[t].mole_frac_comp["H2O"] + - b.condenser_flash.liq_outlet.flow_mol[t] + - b.condenser_split.out_state[t].flow_mol * b.condenser_split.out_state[t].mole_frac_comp["H2O"] + ) + + self.total_electric_power = pyo.Var(self.time, initialize=300e6, units=pyo.units.W) + + @self.Constraint(self.time) + def total_electric_power_eqn(b, t): + return b.total_electric_power[t] == ( + b.soc_module.electrical_work[t] + + b.sweep_blower.control_volume.work[t] + + b.sweep_heater.electric_heat_duty[t] + + b.feed_heater.electric_heat_duty[t] + ) + + # Need new variables instead of just References because the temperature objects on the interconnect + # are Expressions + self.stack_fuel_inlet_temperature = pyo.Var(self.time, initialize=1000, units=pyo.units.K) + self.stack_sweep_inlet_temperature = pyo.Var(self.time, initialize=1000, units=pyo.units.K) + self.stack_core_temperature = pyo.Var(self.time, initialize=1000, units=pyo.units.K) + + @self.Constraint(self.time) + def stack_fuel_inlet_temperature_eqn(b, t): + return b.stack_fuel_inlet_temperature[t] == b.soc_module.solid_oxide_cell.interconnect.temperature[t, 1, 1] + @self.Constraint(self.time) + def stack_sweep_inlet_temperature_eqn(b, t): + return b.stack_sweep_inlet_temperature[t] == b.soc_module.solid_oxide_cell.interconnect.temperature[t, 1, 10] + + @self.Constraint(self.time) + def stack_core_temperature_eqn(b, t): + return b.stack_core_temperature[t] == ( + b.soc_module.solid_oxide_cell.interconnect.temperature[t, 1, 5] + + b.soc_module.solid_oxide_cell.interconnect.temperature[t, 1, 6] + ) / 2 + + + + def _scaling(self): + ssf = iscale.set_scaling_factor + cst = iscale.constraint_scaling_transform + + ssf(self.total_electric_power, 1e-8) + ssf(self.soec_water_consumption_rate, 1e-3) + ssf(self.feed_recycle_split.recycle_ratio, 1) + ssf(self.sweep_recycle_split.recycle_ratio, 1) + ssf(self.condenser_split.recycle_ratio, 1) + ssf(self.h2_mass_production, 1) + + scale_indexed_constraint(self.total_electric_power_eqn, 1e-8) + scale_indexed_constraint(self.soec_water_consumption_rate_eqn, 1e-3) + + ssf(self.condenser_flash.control_volume.heat, 1e-7) + + ssf(self.feed_heater.control_volume.area, 1e-1) + ssf(self.sweep_heater.control_volume.area, 1e-1) + ssf(self.feed_heater.control_volume.heat, 1e-6) + ssf(self.feed_heater.electric_heat_duty, 1e-6) + ssf(self.feed_heater.control_volume._enthalpy_flow, 1e-8) + ssf(self.feed_heater.control_volume.enthalpy_flow_dx, 1e-7) + ssf(self.feed_heater.heat_holdup, 1e-9) + + ssf(self.sweep_heater.control_volume.heat, 1e-6) + ssf(self.sweep_heater.electric_heat_duty, 1e-6) + ssf(self.sweep_heater.control_volume._enthalpy_flow, 1e-8) + ssf(self.sweep_heater.control_volume.enthalpy_flow_dx, 1e-7) + ssf(self.sweep_heater.heat_holdup, 1e-9) + + def scale_hx(hx): + shell = hx.hot_side + tube = hx.cold_side + ssf(shell.area, 1e-1) + ssf(hx.hot_side.heat, 1e-6) + ssf(tube.area, 1) + ssf(hx.cold_side.heat, 1e-6) + ssf(shell._enthalpy_flow, 1e-8) + ssf(tube._enthalpy_flow, 1e-8) + ssf(shell.enthalpy_flow_dx, 1e-7) + ssf(tube.enthalpy_flow_dx, 1e-7) + ssf(hx.heat_holdup, 1e-8) + scale_hx(self.sweep_exchanger) + scale_hx(self.feed_medium_exchanger) + scale_hx(self.feed_hot_exchanger) + + for t in self.time: + ssf( + self.sweep_recycle_mix.feed_state[t].enth_mol_phase["Vap"], 1e-4) + ssf( + self.sweep_recycle_mix.recycle_state[t].enth_mol_phase["Vap"], 1e-4) + ssf( + self.sweep_recycle_mix.mixed_state[t].enth_mol_phase["Vap"], 1e-4) + ssf( + self.feed_recycle_mix.feed_state[t].enth_mol_phase["Vap"], 1e-4) + ssf( + self.feed_recycle_mix.recycle_state[t].enth_mol_phase["Vap"], 1e-4) + ssf( + self.feed_recycle_mix.mixed_state[t].enth_mol_phase["Vap"], 1e-4) + cst( + self.sweep_recycle_mix.pressure_equality_eqn[t],1e-5) + cst( + self.feed_recycle_mix.pressure_equality_eqn[t],1e-5) + cst( + self.makeup_mix.pressure_equality_eqn[t],1e-5) + + ssf(self.sweep_blower.control_volume.properties_in[t].enth_mol_phase["Vap"],1e-4) + ssf(self.sweep_blower.control_volume.properties_out[t].enth_mol_phase["Vap"],1e-4) + ssf(self.sweep_blower.properties_isentropic[t].enth_mol_phase["Vap"],1e-4) + ssf(self.sweep_blower.control_volume.work[t], 1e-6) + + ssf(self.stack_fuel_inlet_temperature[t], 1e-2) + ssf(self.stack_sweep_inlet_temperature[t], 1e-2) + ssf(self.stack_core_temperature[t], 1e-2) + cst(self.stack_fuel_inlet_temperature_eqn[t], 1e-2) + cst(self.stack_sweep_inlet_temperature_eqn[t], 1e-2) + cst(self.stack_core_temperature_eqn[t], 1e-2) + + iscale.propagate_indexed_component_scaling_factors(self) + + + @staticmethod + def _set_gas_port(port, F, T, P, y, fix=True): + port.temperature[:] = T + port.pressure[:] = P + port.flow_mol[:] = F + for c, v in y.items(): + port.mole_frac_comp[:, c] = v + if fix: + port.temperature.fix() + port.pressure.fix() + port.flow_mol.fix() + port.mole_frac_comp.fix() + + def _set_initial_inputs(self): + self.makeup_mix.makeup.pressure.fix(1.2e5) + self.makeup_mix.makeup.temperature.fix(378.15) + self.makeup_mix.makeup.mole_frac_comp[:, "Ar"].fix(0.0008) + self.makeup_mix.makeup.mole_frac_comp[:, "N2"].fix(0.0002) + + sweep_comp = self.sweep_comp.copy() + sweep_comp["H2"] = 1e-19 + + self.sweep_blower.inlet.temperature.fix(288.15) + self.sweep_blower.inlet.pressure.fix(101300) + for c, v in self.sweep_comp.items(): + self.sweep_blower.inlet.mole_frac_comp[:, c].fix(v) + + # Recycle splits + self.sweep_recycle_split.split_fraction[:, "recycle"].set_value(0.50) + self.feed_recycle_split.split_fraction[:, "recycle"].set_value(0.5) + self.sweep_blower.efficiency_isentropic.fix(0.85) + self.sweep_blower.control_volume.properties_out[:].pressure.fix(1.2e5) + + def fix_heater_params(heater): + heater.di_tube.fix(0.0525018) + heater.thickness_tube.fix(0.0039116) + heater.pitch_x.fix(0.1) + heater.pitch_y.fix(0.1) + heater.length_tube_seg.fix(10) + heater.number_passes.fix(1) + heater.rfouling = 0.0001 + heater.fcorrection_htc_shell.fix(1) + heater.cp_wall = 502.4 + + fix_heater_params(self.feed_heater) + self.feed_heater.number_rows_per_pass.fix(40) + self.feed_heater.number_columns_per_pass.fix(40) + self.feed_heater.electric_heat_duty[:].fix(2840706) + + fix_heater_params(self.sweep_heater) + self.sweep_heater.number_rows_per_pass.fix(60) + self.sweep_heater.number_columns_per_pass.fix(60) + self.sweep_heater.electric_heat_duty[:].fix(4807703.46412979) + + self.condenser_flash.control_volume.deltaP.fix(0) + + + + def fix_hx_params(hx): + hx.pitch_x.fix(0.1) + hx.pitch_y.fix(0.1) + hx.therm_cond_wall = 43.0 + hx.rfouling_tube = 0.0001 + hx.rfouling_shell = 0.0001 + hx.fcorrection_htc_tube.fix(1) + hx.fcorrection_htc_shell.fix(1) + + hx.cp_wall.value = 502.4 + + fix_hx_params(self.sweep_exchanger) + # number of tube bundle segments, typically it is the same as or a multiple of the "finite_elements" in the config + self.sweep_exchanger.number_passes.fix(10) + # number of tube columns in the direction perpendicular to the shell side flow direction + self.sweep_exchanger.number_columns_per_pass.fix(50) + # number of tube rows at tube side inlet + self.sweep_exchanger.number_rows_per_pass.fix(25) + self.sweep_exchanger.di_tube.fix(0.0525018) + self.sweep_exchanger.length_tube_seg.fix(5.5) + self.sweep_exchanger.thickness_tube.fix(0.0039116) + + fix_hx_params(self.feed_medium_exchanger) + + self.feed_medium_exchanger.di_tube.fix(0.0525018) + # tube thickness + self.feed_medium_exchanger.thickness_tube.fix(0.0039116) + self.feed_medium_exchanger.length_tube_seg.fix(3.5) + # number of tube bundle segments, typically it is the same as or a multiple of the "finite_elements" in the config + self.feed_medium_exchanger.number_passes.fix(3) + # number of tube columns in the direction perpendicular to the shell side flow direction + self.feed_medium_exchanger.number_columns_per_pass.fix(40) + # number of tube rows at tube side inlet + self.feed_medium_exchanger.number_rows_per_pass.fix(25) + + fix_hx_params(self.feed_hot_exchanger) + + self.feed_hot_exchanger.di_tube.fix(0.0525018) + self.feed_hot_exchanger.thickness_tube.fix(0.0039116) + self.feed_hot_exchanger.length_tube_seg.fix(4.3) + self.feed_hot_exchanger.number_passes.fix(12) + self.feed_hot_exchanger.number_columns_per_pass.fix(50) + self.feed_hot_exchanger.number_rows_per_pass.fix(25) + + def initialize_build( + self, + outlvl=idaeslog.NOTSET, + solver="ipopt", + optarg=None, + load_from=None, + save_to="soc_flowsheet_init.json.gz", + fuel_cell_mode=False, + ): + if self.config.dynamic: + raise NotImplementedError("Initialization is not supported for dynamic models.") + + if load_from is not None: + if os.path.exists(load_from): + init_log.info_low(f"SOC flowsheet load initial from {load_from}") + # Here suffix=False avoids loading scaling factors + iutil.from_json( + self, fname=load_from, wts=iutil.StoreSpec(suffix=False) + ) + return + + solver_obj = get_solver(solver, optarg) + init_log = idaeslog.getInitLogger(self.name, outlvl) + solve_log = idaeslog.getSolveLogger(self.name, outlvl) + + def safe_solve(blk): + assert degrees_of_freedom(blk) == 0 + with idaeslog.solver_log(solve_log, idaeslog.DEBUG) as slc: + results = solver_obj.solve(blk, tee=slc.tee) + pyo.assert_optimal_termination(results) + + if fuel_cell_mode: + feed_comp = {"H2": 0.969, "H2O": 0.03, "N2": 0.0002, "Ar": 0.0008} + self.makeup_mix.makeup.flow_mol.fix(474.75) + for t in self.time: + for j in self.makeup_mix.makeup_state.component_list: + self.makeup_mix.makeup.mole_frac_comp[t, j].fix(feed_comp[j]) + else: + feed_comp = {"H2": 1e-14, "H2O": 0.999 - 1e-14, "N2": 0.0002, "Ar": 0.0008} + self.makeup_mix.makeup.flow_mol.fix(1320) + for t in self.time: + for j in self.makeup_mix.makeup_state.component_list: + self.makeup_mix.makeup.mole_frac_comp[t, j].fix(feed_comp[j]) + + if fuel_cell_mode: + self._set_gas_port( + self.feed_recycle_mix.feed, + F=480, + T=921.34, + P=1.2e5, + y={"H2": 0.96, "H2O": 0.03, "Ar": 0.008, "N2": 0.002}, + fix=False + ) + self._set_gas_port( + self.feed_recycle_mix.recycle, + F=250, + T=921.34, + P=1.2e5, + y={"H2": 0.71, "H2O": 0.28, "Ar": 0.008, "N2": 0.002}, + fix=False + ) + self._set_gas_port( + self.makeup_mix.recycle, + F=10, + T=320.53, + P=1.2e5, + y={"H2": 0.71/0.75, "H2O": 0.04, "Ar": 0.008/0.75, "N2": 0.002/0.75}, + fix=False + ) + self.sweep_blower.inlet.flow_mol.fix(6098.2) + self._set_gas_port( + self.sweep_recycle_mix.feed, + F=6120.0, + T=859.60, + P=1.2e5, + y={"O2": 0.20740, "H2O": 0.0099000, "CO2":0.00030000, "N2": 0.77320, "Ar": 0.0092000}, + fix=False + ) + self._set_gas_port( + self.sweep_recycle_mix.recycle, + F=5892.0, + T=1009.7, + P=1.2e5, + y={"O2": 0.17673, "H2O": 0.010283, "CO2": 0.00031161, "N2": 0.80312, "Ar": 0.0095560}, + fix=False + ) + else: + self._set_gas_port( + self.feed_recycle_mix.feed, F=1325, T=897, P=1.2e5, y=feed_comp) + self._set_gas_port( + self.feed_recycle_mix.feed, F=1325, T=897, P=1.2e5, y=feed_comp) + feed_comp["H2"] = 0.7 + feed_comp["H2O"] = 0.299 + self._set_gas_port( + self.feed_recycle_mix.recycle, F=1325, T=1020, P=1.2e5, y=feed_comp, fix=False) + self._set_gas_port( + self.makeup_mix.recycle, F=1, T=(273.15 + 105), P=1.2e5, + y={"H2": 0.85, "H2O": 0.15, "N2": 0.0002, "Ar": 0.0008} + ) + sweep_comp = self.sweep_comp.copy() + self._set_gas_port( + self.sweep_recycle_mix.feed, F=2250, T=990, P=1.2e5, y=sweep_comp) + self.sweep_blower.inlet.flow_mol.fix(2250) + if fuel_cell_mode: + pass + else: + recycle_comp = { + "O2":0.35, + "H2O":(1-0.35)/(1-0.2074)*0.0099, + "CO2":(1-0.35)/(1-0.2074)*0.0003, + "N2":(1-0.35)/(1-0.2074)*0.7732, + "Ar":(1-0.35)/(1-0.2074)*0.0092, + } + self._set_gas_port( + self.sweep_recycle_mix.recycle, F=2750, T=1020, P=1.2e5, y=recycle_comp, fix=False) + + self.sweep_blower.initialize(outlvl=outlvl, solver=solver, optarg=optarg) + propagate_state(self.sweep01) + + self.feed_recycle_mix.initialize(outlvl=outlvl, solver=solver, optarg=optarg) + self.sweep_recycle_mix.initialize(outlvl=outlvl, solver=solver, optarg=optarg) + + propagate_state(self.feed03) + propagate_state(self.sweep03) + self.sweep_heater.default_initializer( + solver=solver, solver_options=optarg, output_level=outlvl + ).initialize(model=self.sweep_heater) + self.feed_heater.default_initializer( + solver=solver, solver_options=optarg, output_level=outlvl + ).initialize(model=self.feed_heater) + propagate_state(self.feed04) + propagate_state(self.sweep04) + + if fuel_cell_mode: + self.soc_module.potential_cell.fix(0.902) + self.soc_module.initialize( + current_density_guess=0, #4000, Don't know why the initialization has so much trouble with the real value + temperature_guess=980, + outlvl=outlvl, + solver=solver, + optarg=optarg + ) + self.sweep_recycle_split.split_fraction[:, "recycle"].fix(0.50) + self.feed_recycle_split.split_fraction[:, "recycle"].fix(0.01) + else: + self.soc_module.potential_cell.fix(1.3) + self.soc_module.initialize( + current_density_guess=0, + temperature_guess=1020.15, + outlvl=outlvl, + solver=solver, + optarg=optarg + ) + self.sweep_recycle_split.split_fraction[:, "recycle"].fix(0.50) + self.feed_recycle_split.split_fraction[:, "recycle"].fix(0.5) + + propagate_state(self.ostrm01) + self.sweep_recycle_split.initialize(outlvl=outlvl, solver=solver, optarg=optarg) + propagate_state(self.ostrm02) + propagate_state(self.ostrm03) + + propagate_state(self.hstrm01) + self.feed_recycle_split.initialize(outlvl=outlvl, solver=solver, optarg=optarg) + propagate_state(self.hstrm02) + propagate_state(self.hstrm03) + + self.sweep_exchanger.default_initializer( + solver=solver, solver_options=optarg, output_level=outlvl + ).initialize(model=self.sweep_exchanger) + + propagate_state(self.ostrm04) + + self.makeup_mix.initialize(outlvl=outlvl, solver=solver, optarg=optarg) + + propagate_state(self.feed00) + + self.feed_medium_exchanger.default_initializer( + solver=solver, solver_options=optarg, output_level=outlvl + ).initialize(model=self.feed_medium_exchanger) + + propagate_state(self.feed01) + + self.feed_hot_exchanger.default_initializer( + solver=solver, solver_options=optarg, output_level=outlvl + ).initialize(model=self.feed_hot_exchanger) + + propagate_state(self.feed02) + propagate_state(self.hstrmShortcut) + + self.condenser_flash.control_volume.properties_out[:].temperature.fix(273.15+50) + self.condenser_flash.initialize(outlvl=outlvl, solver=solver, optarg=optarg) + + propagate_state(self.hstrm06) + + if fuel_cell_mode: + self.condenser_split.split_fraction[:, "recycle"].fix(0.5) + self.condenser_split.split_fraction[:, "out"].value = 0.5 + else: + self.condenser_split.split_fraction[:, "recycle"].fix(0.0001) + self.condenser_split.split_fraction[:, "out"].value = 0.9999 + + self.condenser_split.initialize(outlvl=outlvl, solver=solver, optarg=optarg) + + propagate_state(self.vgr) + + self.makeup_mix.initialize(outlvl=outlvl, solver=solver, optarg=optarg) + + propagate_state(self.feed00) + + # Time for final solve + x1 = self.feed_heater.control_volume.length_domain.last() + self.feed_heater.control_volume.properties[:, x1].temperature.fix() + self.feed_heater.electric_heat_duty.unfix() + x1 = self.sweep_heater.control_volume.length_domain.last() + self.sweep_heater.control_volume.properties[:, x1].temperature.fix() + self.sweep_heater.electric_heat_duty.unfix() + + self.feed_recycle_mix.feed.unfix() + self.feed_recycle_mix.recycle.unfix() + self.sweep_recycle_mix.feed.unfix() + self.sweep_recycle_mix.recycle.unfix() + self.makeup_mix.recycle.unfix() + + safe_solve(self) + + self.feed_heater.control_volume.properties[:, :].temperature.unfix() + self.feed_heater.electric_heat_duty.fix() + self.sweep_heater.control_volume.properties[:, :].temperature.unfix() + self.sweep_heater.electric_heat_duty.fix() + + for split in [self.feed_recycle_split, self.sweep_recycle_split, self.condenser_split]: + split.split_fraction.unfix() + split.recycle_ratio.fix() + + if save_to is not None: + iutil.to_json(self, fname=save_to) + init_log.info_low(f"Initialization saved to {save_to}") + + + def _add_tags(self): + t0 = self.time.first() + tag_group = iutil.ModelTagGroup() + self.tags_streams = tag_group + stream_states = tables.stream_states_dict( + tables.arcs_to_stream_dict( + self, + descend_into=False, + additional={ + "sweep00": self.sweep_blower.inlet, + "feed00": self.feed_medium_exchanger.tube_inlet, + "hstrm04": self.feed_hot_exchanger.shell_outlet, + "ostrm05": self.feed_medium_exchanger.shell_outlet, + }, + ), + time_point=t0 + ) + for i, s in stream_states.items(): # create the tags for steam quantities + tag_group[f"{i}_F"] = iutil.ModelTag( + doc=f"{i}: mass flow", + expr=s.flow_mass, + format_string="{:.3f}", + display_units=pyo.units.kg / pyo.units.s, + ) + tag_group[f"{i}_Fmol"] = iutil.ModelTag( + doc=f"{i}: mole flow", + expr=s.flow_mol, + format_string="{:.3f}", + display_units=pyo.units.kmol / pyo.units.s, + ) + tag_group[f"{i}_Fvol"] = iutil.ModelTag( + doc=f"{i}: volumetric flow", + expr=s.flow_vol, + format_string="{:.3f}", + display_units=pyo.units.m ** 3 / pyo.units.s, + ) + tag_group[f"{i}_P"] = iutil.ModelTag( + doc=f"{i}: pressure", + expr=s.pressure, + format_string="{:.3f}", + display_units=pyo.units.bar, + ) + tag_group[f"{i}_T"] = iutil.ModelTag( + doc=f"{i}: temperature", + expr=s.temperature, + format_string="{:.2f}", + display_units=pyo.units.K, + ) + try: + tag_group[f"{i}_vf"] = iutil.ModelTag( + doc=f"{i}: vapor fraction", + expr=100*s.vapor_frac, + format_string="{:.2f}", + display_units="%", + ) + except AttributeError: # If there is no vapor fraction it's not steam + tag_group[f"{i}_yH2O"] = iutil.ModelTag( + doc=f"{i}: mole percent H2O", + expr=100, + format_string="{:.3f}", + display_units="%", + ) + try: # gas (not steam) properties have mole fractions + for c in s.mole_frac_comp: + tag_group[f"{i}_y{c}"] = iutil.ModelTag( + doc=f"{i}: mole percent {c}", + expr=s.mole_frac_comp[c] * 100, + format_string="{:.3f}", + display_units="%", + ) + except AttributeError: # If there is no mole fraction it's steam + tag_group[f"{i}_yH2O"] = iutil.ModelTag( + doc=f"{i}: mole percent H2O", + expr=100, + format_string="{:.3f}", + display_units="%", + ) + + tag_group = iutil.ModelTagGroup() + self.tags_output = tag_group + tag_group["cell_potential"] = iutil.ModelTag( + doc="Cell potential", + expr=self.soc_module.potential_cell[t0], + format_string="{:.3f}", + display_units=pyo.units.volts, + ) + tag_group["soec_current"] = iutil.ModelTag( + doc="SOEC electrical current", + expr=self.soc_module.number_cells*sum(self.soc_module.solid_oxide_cell.current_density[t0,iz] + * self.soc_module.solid_oxide_cell.fuel_electrode.xface_area[iz] + for iz in self.soc_module.solid_oxide_cell.iznodes), + format_string="{:.3f}", + display_units=pyo.units.MA, + ) + tag_group["soec_power"] = iutil.ModelTag( + doc="SOEC electric power", + expr=self.soc_module.electrical_work[t0], + format_string="{:.3f}", + display_units=pyo.units.MW, + ) + tag_group["h2_mass_production"] = iutil.ModelTag( + doc="H2 mass production rate", + expr=self.h2_mass_production[t0], + format_string="{:.3f}", + display_units=pyo.units.kg/pyo.units.s, + ) + tag_group["h2_mass_consumption"] = iutil.ModelTag( + doc="H2 mass consumption rate-excludes H2 leaving through condenser splitter", + expr=self.h2_mass_consumption[t0], + format_string="{:.3f}", + display_units=pyo.units.kg/pyo.units.s, + ) + tag_group["feed_heater_power"] = iutil.ModelTag( + doc="Feed heater power", + expr=self.feed_heater.electric_heat_duty[t0], + format_string="{:.3f}", + display_units=pyo.units.MW, + ) + tag_group["sweep_heater_power"] = iutil.ModelTag( + doc="Sweep heater power", + expr=self.sweep_heater.electric_heat_duty[t0], + format_string="{:.3f}", + display_units=pyo.units.MW, + ) + tag_group["total_electric_power"] = iutil.ModelTag( + doc="Total electric power for SOEC and auxiliaries", + expr=self.total_electric_power[t0], + format_string="{:.3f}", + display_units=pyo.units.MW, + ) + tag_group["vent_gas_recycle_ratio"] = iutil.ModelTag( + doc="Vent gas recycle ratio", + expr=self.condenser_split.recycle_ratio[t0], + format_string="{:.1f}", + display_units=pyo.units.dimensionless, + ) + tag_group = iutil.ModelTagGroup() + self.tags_input = tag_group + + + @staticmethod + def _stream_col_gen(tag_group): + for tag in tag_group.values(): + spltstr = tag.doc.split(":") + stream = spltstr[0].strip() + col = f"{spltstr[1].strip()} ({tag.get_unit_str()})" + yield tag, stream, col + + @staticmethod + def _stream_table(tag_group): + rows = set() + cols = set() + tags = [] + for tag, stream, col in SoecStandaloneFlowsheetData._stream_col_gen(tag_group): + rows.add(stream) + cols.add(col) + tags.append((tag, stream, col)) + df = pd.DataFrame(index=sorted(rows), columns=sorted(cols)) + for tag, stream, col in tags: + df.at[stream, col] = tag.get_display_value() + return df + + def streams_dataframe(self): + return self._stream_table(self.tags_streams) + + def write_pfd(self, fname=None): + """Add model results to the flowsheet template. If fname is specified, + this saves the resulting svg to a file. If fname is not specified, it + returns the svg string. + Args: + fname: Name of file to save svg. If None, return the svg string + Returns: (None or Str) + """ + infilename = os.path.join(this_file_dir(), "soc_dynamic_template.svg") + with open(infilename, "r") as f: + s = svg_tag(svg=f, tag_group=self.tags_streams, outfile=None) + s = svg_tag(svg=s, tag_group=self.tags_output, outfile=None) + s = svg_tag(svg=s, tag_group=self.tags_input, outfile=fname) + if fname is None: + return s + + def add_controllers(self, variable_pairings): + assert self.config.dynamic + for mv, (controller_name, cv, controller_type, mv_bound_type, antiwindup_type) in variable_pairings.items(): + assert mv in self.manipulated_variables + controller = PIDController( + process_var=cv, + manipulated_var=mv, + controller_type=controller_type, + mv_bound_type=mv_bound_type, + antiwindup_type=antiwindup_type, + calculate_initial_integral=False, + ) + self.controller_set.add(controller) + self.add_component(controller_name, controller) + if controller_type == ControllerType.PI: + controller.mv_integral_component[self.time.first()].value = 0 + + self.manipulated_variables.remove(mv) + self.manipulated_variables.add(controller.setpoint) + self.manipulated_variables.add(controller.mv_ref) + mv.unfix() + + for t in self.time: + sf_cv = iscale.get_scaling_factor(cv[t], default=1, warning=True) + iscale.set_scaling_factor(controller.setpoint[t], sf_cv) + sf_mv = iscale.get_scaling_factor(mv[t], default=1, warning=True) + iscale.set_scaling_factor(controller.mv_ref[t], sf_mv) + iscale.constraint_scaling_transform(controller.mv_eqn[t], sf_mv) + + def _make_temperature_gradient_terms(self): + soec = self.soc_module.solid_oxide_cell + dz = soec.zfaces.at(2) - soec.zfaces.at(1) + # Going to assume that the zfaces are evenly spaced + for iz in soec.iznodes: + assert abs(soec.zfaces.at(iz + 1) - soec.zfaces.at(iz) - dz) < 1e-8 + dz = dz * soec.length_z + def finite_difference(expr, t, ix, iz): + # Since this is mostly for reference, no need to worry about upwinding or whatever + if iz == soec.iznodes.first(): + if ix is None: + return (-1.5 * expr[t, iz] + 2 * expr[t, iz + 1] - 0.5 * expr[t, iz + 2]) / dz + else: + return (-1.5 * expr[t, ix, iz] + 2 * expr[t, ix, iz + 1] - 0.5 * expr[t, ix, iz + 2]) / dz + elif iz == soec.iznodes.last(): + if ix is None: + return (1.5 * expr[t, iz] - 2 * expr[t, iz - 1] + 0.5 * expr[t, iz - 2]) / dz + else: + return (1.5 * expr[t, ix, iz] - 2 * expr[t, ix, iz - 1] + 0.5 * expr[t, ix, iz - 2]) / dz + else: + if ix is None: + return (0.5 * expr[t, iz + 1] - 0.5 * expr[t, iz - 1]) / dz + else: + return (0.5 * expr[t, ix, iz + 1] - 0.5 * expr[t, ix, iz - 1]) / dz + + soec.dtemperature_z_dz = pyo.Var(self.time, soec.iznodes, initialize=0, units=pyo.units.K / pyo.units.m) + @soec.Constraint(self.time, soec.iznodes) + def dtemperature_z_dz_eqn(b, t, iz): + return b.dtemperature_z_dz[t, iz] == finite_difference(b.temperature_z, t, None, iz) + + soec.fuel_electrode.dtemperature_dz = pyo.Var( + self.time, + soec.fuel_electrode.ixnodes, + soec.fuel_electrode.iznodes, + initialize=0, + units=pyo.units.K / pyo.units.m + ) + @soec.fuel_electrode.Constraint(self.time, soec.fuel_electrode.ixnodes, soec.fuel_electrode.iznodes) + def dtemperature_dz_eqn(b, t, ix, iz): + return b.dtemperature_dz[t, ix, iz] == finite_difference(b.temperature, t, ix, iz) + if soec.fuel_electrode.config.dynamic: + soec.fuel_electrode.d2temperature_dzdt = DerivativeVar(soec.fuel_electrode.dtemperature_dz, wrt=self.time, initialize=0) + else: + @soec.fuel_electrode.Expression(self.time, soec.fuel_electrode.ixnodes, soec.fuel_electrode.iznodes) + def d2temperature_dzdt(b, t, ix, iz): + return 0 * pyo.units.K / pyo.units.m / pyo.units.s + soec.fuel_electrode.d2temperature_dzdt_dummy = pyo.Var(self.time, soec.fuel_electrode.ixnodes, soec.fuel_electrode.iznodes, initialize=0) + @soec.fuel_electrode.Constraint(self.time, soec.fuel_electrode.ixnodes, soec.fuel_electrode.iznodes) + def d2temperature_dzdt_dummy_eqn(b, t, ix, iz): + return b.d2temperature_dzdt[t, ix, iz] == b.d2temperature_dzdt_dummy[t, ix, iz] + + soec.interconnect.dtemperature_dz = pyo.Var( + self.time, + soec.interconnect.ixnodes, + soec.interconnect.iznodes, + initialize=0, + units=pyo.units.K / pyo.units.m + ) + + @soec.interconnect.Constraint(self.time, soec.interconnect.ixnodes, soec.interconnect.iznodes) + def dtemperature_dz_eqn(b, t, ix, iz): + return b.dtemperature_dz[t, ix, iz] == finite_difference(b.temperature, t, ix, iz) + + vars = [soec.dtemperature_z_dz, soec.fuel_electrode.dtemperature_dz, soec.interconnect.dtemperature_dz] + cons = [ + soec.dtemperature_z_dz_eqn, + soec.fuel_electrode.dtemperature_dz_eqn, + soec.interconnect.dtemperature_dz_eqn + ] + for var, con in zip(vars, cons): + for idx, element in var.items(): + iscale.set_scaling_factor(element, 5e-3) + iscale.constraint_scaling_transform(con[idx], 5e-3) + + + def set_performance_bounds(self): + set_indexed_variable_bounds(self.soc_module.potential_cell, [0.7, 1.4]) + set_indexed_variable_bounds(self.feed_heater.electric_heat_duty, (0, 2e6)) + set_indexed_variable_bounds(self.sweep_heater.electric_heat_duty, (0, 4e6)) + + set_indexed_variable_bounds(self.soc_module.solid_oxide_cell.fuel_electrode.dtemperature_dz, (-750, 750)) + + for t in self.time: + self.feed_recycle_split.split_fraction[t, "recycle"].bounds = (1e-4, 1) + self.sweep_recycle_split.split_fraction[t, "recycle"].bounds = (1e-4, 1) + self.condenser_split.split_fraction[t, "recycle"].bounds = (1e-4, 1) + + def make_performance_constraints(self): + if len(self.time) > 1: + raise NotImplementedError("Performance constraints are implemented only for steady-state target problems.") + t0 = self.time.first() + + @self.soc_module.solid_oxide_cell.Constraint(self.time, self.soc_module.solid_oxide_cell.iznodes) + def temperature_upper_bound_eqn(b, t, iz): + return b.fuel_electrode.temperature[t, 1, iz] <= 750 + 273.15 + + scale_indexed_constraint(self.soc_module.solid_oxide_cell.temperature_upper_bound_eqn, 1e-2) + + delta_T_limit = 75 + + @self.Constraint(self.time) + def thermal_gradient_eqn_1(b, t): + return (b.soc_module.solid_oxide_cell.fuel_electrode.temperature[t, 1, 1] + - b.soc_module.solid_oxide_cell.fuel_electrode.temperature[t, 1, 10]) <= delta_T_limit + + @self.Constraint(self.time) + def thermal_gradient_eqn_2(b, t): + return (b.soc_module.solid_oxide_cell.fuel_electrode.temperature[t, 1, 10] + - b.soc_module.solid_oxide_cell.fuel_electrode.temperature[t, 1, 1]) <= delta_T_limit + + @self.Constraint(self.time) + def thermal_gradient_eqn_3(b, t): + return (b.soc_module.solid_oxide_cell.fuel_electrode.temperature[t, 1, 1] + - b.soc_module.solid_oxide_cell.fuel_electrode.temperature[t, 1, 10]) >= -delta_T_limit + + @self.Constraint(self.time) + def thermal_gradient_eqn_4(b, t): + return (b.soc_module.solid_oxide_cell.fuel_electrode.temperature[t, 1, 10] + - b.soc_module.solid_oxide_cell.fuel_electrode.temperature[t, 1, 1]) >= -delta_T_limit + + iscale.constraint_scaling_transform(self.thermal_gradient_eqn_1[t0], 1e-2) + iscale.constraint_scaling_transform(self.thermal_gradient_eqn_2[t0], 1e-2) + iscale.constraint_scaling_transform(self.thermal_gradient_eqn_3[t0], 1e-2) + iscale.constraint_scaling_transform(self.thermal_gradient_eqn_4[t0], 1e-2) + + def fix_initial_conditions(self, t=None): + if t is None: + t = self.time.first() + soec = self.soc_module.solid_oxide_cell + soec.mean_temperature_eqn[t, :].activate() + soec.fuel_electrode.int_energy_density_solid[t, :, :].fix() + if not self.config.thin_electrolyte_and_oxygen_electrode: + raise NotImplementedError( + "Fixing initial conditions for non-thin electrolyte and " + "oxygen electrode has not been implemented." + ) + if self.config.include_interconnect: + soec.interconnect.int_energy_density_solid[t, :, :].fix() + + soec.fuel_electrode.d2temperature_dzdt_dummy[t, :, :].fix() + for hx in [ + self.sweep_exchanger, + self.feed_medium_exchanger, + self.feed_hot_exchanger + ]: + hx.temp_wall_center_eqn[t, :].deactivate() + hx.heat_holdup[t, :].fix() + + for heater in [self.feed_heater, + self.sweep_heater]: + heater.temp_wall_center_eqn[t,:].deactivate() + heater.heat_holdup[t,:].fix() + + for controller in self.controller_set: + if controller.config.controller_type in [ControllerType.PI, ControllerType.PID]: + controller.mv_integral_component[t].fix() + if controller.config.controller_type in [ControllerType.PD, ControllerType.PID]: + controller.derivative_term[t].fix(0) diff --git a/idaes_examples/mod/power_gen/soc_dynamic_template.svg b/idaes_examples/mod/power_gen/soc_dynamic_template.svg new file mode 100644 index 00000000..0e816547 --- /dev/null +++ b/idaes_examples/mod/power_gen/soc_dynamic_template.svg @@ -0,0 +1,2765 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + SOEC + Hydrogen Side + Oxygen Side + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sweep03 + + + + ostrm01 + + + + ostrm02 + + + + + sweep00 + + + + + hstrm01 + + + + hstrm02 + + + + hstrm03 + + + + feed00 + + + + feed02 + + + + F:T:P:yH2: + ? + ? + ? + + ? + + + + + + F:T:P: + ? + ? + ? + + + + + F:T:P: + ? + ? + ? + + + + + + + + + F:T:P:yO2: + ? + ? + ? + + ? + + + + + + + ostrm 05 + + + + F:T:P:yH2: + ? + ? + ? + + ? + + + + + + + F:T:P:yO2: + ? + ? + ? + + ? + + + + + + steam_heater + steam_hot_exchanger + sweep_heater + steam_medium_exchanger + sweep_exchanger + + F:T:P: + ? + ? + ? + + + + + + + F:T:P: + ? + ? + ? + + + + + + F:T:P: + ? + ? + ? + + + + + + F:T:P:yH2: + ? + ? + ? + + ? + + + + + F:T:P: + ? + ? + ? + + + + + + + F:T:P: + ? + ? + ? + + + + + F:T:P: + ? + ? + ? + + + + + + + + + + + + + + + + + + + feed04 + + + + F:T:P: + ? + ? + ? + + + + + F:T:P: + ? + ? + ? + + + + + + + T:P: + ? + ? + + + + + Summary: + + SOEC Electric Power:SOEC Current:Cell Potential:H2 Production Rate:H2 Consumption Rate:Feed Heater Power:Sweep Heater Power:Total Electric Power:Vent Gas Recycle Ratio: + + ? + ? + ? + ? + ? + ? + ? + ? + ? + + + + + + + ostrm03 + + + + + + + + + + feed03 + + + + + + sweep02 + + + + + ostrm04 + + + + + + F:T:P: + ? + ? + ? + + + + + + + feed01 + + + + + sweep04 + + + + F:T:P:yH2: + ? + ? + ? + + ? + + + + F:T:P:yH2: + ? + ? + ? + + ? + + + + + + + + + + + hstrm04 + + hstrm06 + + knockout + + out + + makeup + + vgr + + diff --git a/idaes_examples/mod/power_gen/soec.py b/idaes_examples/mod/power_gen/soec.py index f30ef55d..033c0175 100644 --- a/idaes_examples/mod/power_gen/soec.py +++ b/idaes_examples/mod/power_gen/soec.py @@ -1111,19 +1111,19 @@ def _add_tags(self): display_units=pyo.units.MW, ) tag_group["total_electric_power"] = iutil.ModelTag( - doc="Total electric power for SOEC and auxilaries", + doc="Total electric power for SOEC and auxiliaries", expr=self.total_electric_power[0], format_string="{:.3f}", display_units=pyo.units.MW, ) tag_group["bop_power"] = iutil.ModelTag( - doc="Total electric power for SOEC and auxilaries", + doc="Total electric power for SOEC and auxiliaries", expr=self.total_electric_power[0] - self.soec_ac_power[0], format_string="{:.3f}", display_units=pyo.units.MW, ) tag_group["total_electric_power_per_h2"] = iutil.ModelTag( - doc="Total electric power for SOEC and auxilaries per H2 produced", + doc="Total electric power for SOEC and auxiliaries per H2 produced", expr=self.total_electric_power_per_h2[0], format_string="{:.3f}", display_units=pyo.units.kWh / pyo.units.kg, diff --git a/idaes_examples/mod/properties/thermophysical_property_example.py b/idaes_examples/mod/properties/thermophysical_property_example.py index 7014d769..53b83821 100644 --- a/idaes_examples/mod/properties/thermophysical_property_example.py +++ b/idaes_examples/mod/properties/thermophysical_property_example.py @@ -196,18 +196,18 @@ def initialize(blk, state_args={}, state_vars_fixed=False, with 0D blocks. - False - states have not been fixed. The state block will deal with fixing/unfixing. - solver : str indicating whcih solver to use during + solver : str indicating which solver to use during initialization (default = None, use default solver) hold_state : flag indicating whether the initialization routine should unfix any state variables fixed during initialization (default=False). - - True - states varaibles are not unfixed, and + - True - states variables are not unfixed, and a dict of returned containing flags for which states were fixed during initialization. - False - state variables are unfixed after initialization by calling the - relase_state method + release_state method Returns: If hold_states is True, returns a dict containing flags for which states were fixed during initialization. diff --git a/idaes_examples/nbnew.py b/idaes_examples/nbnew.py index 886c54a9..641d7e1b 100644 --- a/idaes_examples/nbnew.py +++ b/idaes_examples/nbnew.py @@ -90,7 +90,7 @@ class AddNotebook: directories in the table of contents. """ - def __init__(self, term: Terminal, path: Path = None): + def __init__(self, term: Terminal, path: Path = None, git: str = "git"): """Constructor. Args: @@ -108,15 +108,7 @@ def __init__(self, term: Terminal, path: Path = None): c, spc = self.colors, " " * 10 self._hdr = f"{c.rev}{spc}add notebook{spc}{c.reg}" - self._git = "git" - - @property - def git_program(self): - return self._git - - @git_program.setter - def git_program(self, value): - self._git = value + self.git_program = git def run(self) -> Union[Path, None]: """Run the UI. @@ -306,7 +298,13 @@ def _git_commit(self, created: List[Path]) -> bool: assert len(created) > 0 t, c = self.term, self.colors - print(f"{c.star}Add and commit files to git") + print( + f"{c.star}Add and commit files to git (git command={c.em}{self.git_program}{c.reg})" + ) + + if self.git_program is None: + print(f"{c.em}Not staging to Git{c.reg}") + return True # ok ok = False @@ -350,43 +348,58 @@ def _add_notebook_to_config(self, dirname: str, path: str) -> Union[dict, None]: f"Add {c.light}{path}{c.reg} notebook to section {c.light}{dirname}{c.reg}" ) toc = read_toc(self.root / "notebooks") - found = False + for part in toc["parts"]: + # Look in each chapter for chapter in part["chapters"]: - for item in chapter: - # Chapter with sections - if "sections" in item: - for section in chapter["sections"]: - if section.get("file", "").startswith(dirname): - if entry in chapter["sections"]: - part_name = part.get("caption", "?") - chap_name = chapter.get("file", "?") - print( - f"{c.err}Found existing entry in " - f"{c.light}_toc.yml{c.err} at{c.light}" - f"({part_name}).chapters.({chap_name})" - f"{c.err}!{c.reg}" - ) - break - chapter["sections"].append(entry) - found = True - break - # Chapter w/o sections - elif isinstance(item, dict) and item.get("file", "").startswith( - dirname - ): - if entry in part["chapters"]: + if "file" not in chapter: + continue + # Get chapter file and directory + ch_file = chapter["file"] + ch_dirname = Path(ch_file).parent.as_posix() + + # See if we found the location + if ch_dirname != dirname: + continue # keep looking + + # Chapter with sections (root file is an index) + if ch_file.endswith("index"): + # Add to existing section or create new section + if "sections" in chapter: + sec_files = (sec["file"] for sec in chapter["sections"]) + if entry["file"] in sec_files: part_name = part.get("caption", "?") + chap_name = chapter.get("file", "?") print( - f"{c.err}Found existing entry in {c.reg}" - f"({part_name}).chapters{c.err}!{c.reg}" + f"{c.err}Found existing entry in " + f"{c.light}_toc.yml{c.err} at{c.light}" + f"({part_name}).chapters.({chap_name})" + f"{c.err}!{c.reg}" ) - break - part["chapters"].append(entry) - found = True - if found: - return toc - return None + return None # abort! + chapter["sections"].append(entry) + return toc # success! + else: + chapter["sections"] = [entry] + return toc # success! + + # Chapters without sections, i.e. just + # {"file": "notebook_name_doc"} + else: + # Look for matching {"file":..} entry in the chapter + ch_files = (ch["file"] for ch in part["chapters"]) + if entry["file"] in ch_files: + part_name = part.get("caption", "?") + print( + f"{c.err}Found existing entry in {c.reg}" + f"({part_name}).chapters{c.err}!{c.reg}" + ) + return None # abort! + # Otherwise add a new chapter entry + part["chapters"].append(entry) + return toc # success! + + return None # not found at all def _write_new_toc(self, d: dict): """Preserve comments from original YAML. @@ -421,6 +434,7 @@ def _write_new_toc(self, d: dict): class App: def __init__(self): self.term = Terminal() + self.git_program = None def run(self) -> int: try: @@ -435,7 +449,7 @@ def run(self) -> int: return retcode def do_new(self) -> int: - adder = AddNotebook(self.term) + adder = AddNotebook(self.term, git=self.git_program) path = adder.run() if path is None: diff --git a/idaes_examples/notebooks/_toc.yml b/idaes_examples/notebooks/_toc.yml index b4bb80d4..acb05e93 100644 --- a/idaes_examples/notebooks/_toc.yml +++ b/idaes_examples/notebooks/_toc.yml @@ -105,6 +105,9 @@ parts: - file: docs/power_gen/ngcc/index sections: - file: docs/power_gen/ngcc/ngcc_doc + - file: docs/power_gen/solid_oxide_cell/index + sections: + - file: docs/power_gen/solid_oxide_cell/soc_pid_control_doc # ----------------------------- # active (not documented) # ----------------------------- diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_soec_base.svg b/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_soec_base.svg new file mode 100644 index 00000000..4c16fab6 --- /dev/null +++ b/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_soec_base.svg @@ -0,0 +1,465 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HRSG + Cold Flue Gas + Gas Turbine Exhaust + Makeup Water + HP + IP + LP + Condensate Pump + Condenser + + + Cold Reheat + Hot Reheat + + + + + + + From Dryer + From Reclaimer + + + + + + + + + + + To Reclaimer + To Dryer + To Ejector + + + + + + + From NG Preheater + To NG Preheater + + + + + + + + + + CaptureReboiler + + + + + To SOEC + + + + + + + + t01 + + + + t02 + + + + t11 + + + + t15 + + + + t14 + + + + t13 + + + + t10 + + + + t09 + + + + t13 + + + + t04 + + + + t05 + + + + t03 + + + + t06 + + + + t07 + + + + t08 + + + + t12 + + + + cw01 + + + + cw02 + + + + t18 + + + + t17 + + + + t16 + + + + + + 134.553 kg/s + 859.52 K + 172.456 bar + 63.535 kJ/mol + 1.000 + + + + F:T:P:H:X: + + + 153.186 kg/s + 857.71 K + 19.521 bar + 65.873 kJ/mol + 1.000 + + + F:T:P:H:X: + + + + + + + 0.793 kg/s + 306.25 K + 1.013 bar + 2.500 kJ/mol + 0.000 + + + F:T:P:H:X: + + + 3603.056 kg/s + 289.70 K + 5.000 bar + 1.260 kJ/mol + 0.000 + + + F:T:P:H:X: + + + 71.938 kg/s + 307.61 K + 0.055 bar + 45.225 kJ/mol + 0.978 + + + F:T:P:H:X: + + + + 38.644 kg/s + 557.00 K + 6.550 bar + 54.529 kJ/mol + 1.000 + + + F:T:P:H:X: + + + 55.854 kg/s + 577.11 K + 2.900 bar + 55.449 kJ/mol + 1.000 + + + F:T:P:H:X: + + + + + + + 64.038 kg/s + 577.11 K + 2.900 bar + 55.449 kJ/mol + 1.000 + + + F:T:P:H:X: + + + 153.186 kg/s + 583.43 K + 2.900 bar + 55.681 kJ/mol + 1.000 + + + F:T:P:H:X: + + + 134.553 kg/s + 585.07 K + 24.002 bar + 54.783 kJ/mol + 1.000 + + + F:T:P:H:X: + + + + 71.938 kg/s + 577.11 K + 2.900 bar + 55.449 kJ/mol + 1.000 + + + F:T:P:H:X: + + + + + + 136.770 kg/s + 353.07 K + 6.550 bar + 6.038 kJ/mol + 0.000 + + + + F:T:P:H:X: + + + + 0.001 kg/s + 487.00 K + 20.000 bar + 50.496 kJ/mol + 1.000 + + + F:T:P:H:X: + + + 0.000 kg/s + 476.00 K + 16.000 bar + 50.393 kJ/mol + 1.000 + + + F:T:P:H:X: + + + 71.938 kg/s + 307.61 K + 0.055 bar + 2.601 kJ/mol + 0.000 + + + F:T:P:H:X: + + + 3603.056 kg/s + 300.99 K + 5.000 bar + 2.111 kJ/mol + 0.000 + + + F:T:P:H:X: + + + + 64.038 kg/s + 404.22 K + 2.900 bar + 9.926 kJ/mol + 0.000 + + + F:T:P:H:X: + + + + 72.731 kg/s + 307.59 K + 0.055 bar + 2.600 kJ/mol + 0.000 + + + F:T:P:H:X: + + + + 72.731 kg/s + 307.65 K + 6.550 bar + 2.615 kJ/mol + 0.000 + + + F:T:P:H:X: + + + \ No newline at end of file diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc.ipynb b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc.ipynb new file mode 100644 index 00000000..7a640f1f --- /dev/null +++ b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc.ipynb @@ -0,0 +1,344 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [ + "header", + "hide-cell" + ] + }, + "outputs": [], + "source": [ + "###############################################################################\n", + "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n", + "# Framework (IDAES IP) was produced under the DOE Institute for the\n", + "# Design of Advanced Energy Systems (IDAES).\n", + "#\n", + "# Copyright (c) 2018-2023 by the software owners: The Regents of the\n", + "# University of California, through Lawrence Berkeley National Laboratory,\n", + "# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon\n", + "# University, West Virginia University Research Corporation, et al.\n", + "# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md\n", + "# for full copyright and license information.\n", + "###############################################################################" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NGCC Baseline and Turndown\n", + "Maintainer: John Eslick \n", + "Author: John Eslick \n", + "Updated: 2023-06-01 \n", + "\n", + "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1: Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B (https://www.netl.doe.gov/projects/files/CostAndPerformanceBaselineForFossilEnergyPlantsVol1BitumCoalAndNGtoElectBBRRev4-1_092419.pdf)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports\n", + "\n", + "Import the modules that will be used." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "from IPython.core.display import SVG\n", + "import pyomo.environ as pyo\n", + "import idaes\n", + "from idaes.core.solvers import use_idaes_solver_configuration_defaults\n", + "import idaes.core.util.scaling as iscale\n", + "import idaes.core.util as iutil\n", + "from idaes_examples.mod.power_gen import ngcc\n", + "import pytest\n", + "import logging\n", + "\n", + "logging.getLogger(\"pyomo\").setLevel(logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Make Output Directories\n", + "\n", + "This notebook can produce a large number of output files. To make it easier to manage, some subdirectories are used to organize output. This ensures that the directories exist." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def make_directory(path):\n", + " \"\"\"Make a directory if it doesn't exist\"\"\"\n", + " try:\n", + " os.mkdir(path)\n", + " except FileExistsError:\n", + " pass\n", + "\n", + "\n", + "make_directory(\"data\")\n", + "make_directory(\"data_pfds\")\n", + "make_directory(\"data_tabulated\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Solver Settings\n", + "\n", + "Use the IDAES configuration system for solver settings. These will apply to all Ipopt instances created, including the ones created in initialization methods." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "use_idaes_solver_configuration_defaults()\n", + "idaes.cfg.ipopt.options.nlp_scaling_method = \"user-scaling\"\n", + "idaes.cfg.ipopt.options.linear_solver = \"ma57\"\n", + "idaes.cfg.ipopt.options.OF_ma57_automatic_scaling = \"yes\"\n", + "idaes.cfg.ipopt.options.ma57_pivtol = 1e-5\n", + "idaes.cfg.ipopt.options.ma57_pivtolmax = 0.1\n", + "solver = pyo.SolverFactory(\"ipopt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create the NGCC model\n", + "\n", + "Create the NGCC model and initialize it or read the saved initialization if available. The base initialized NGCC model is configured to match the baseline report with 90% capture using a Cansolv system." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "m = pyo.ConcreteModel()\n", + "m.fs = ngcc.NgccFlowsheet(dynamic=False)\n", + "iscale.calculate_scaling_factors(m)\n", + "m.fs.initialize(\n", + " load_from=\"ngcc_init.json.gz\",\n", + " save_to=\"ngcc_init.json.gz\",\n", + ")\n", + "res = solver.solve(m, tee=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Show PFDs with baseline results\n", + "\n", + "This displays PFDs in the notebook, and saves them to files. The full NGCC model is too big to show well in a single PFD, so it is broken into the three main sections, gas turbine, heat recovery steam generator (HRSG), and steam turbine." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def display_pfd():\n", + " print(\"\\n\\nGas Turbine Section\\n\")\n", + " display(SVG(m.fs.gt.write_pfd()))\n", + " print(\"\\n\\nHRSG Section\\n\")\n", + " display(SVG(m.fs.hrsg.write_pfd()))\n", + " print(\"\\n\\nSteam Turbine Section\\n\")\n", + " display(SVG(m.fs.st.write_pfd()))\n", + "\n", + "\n", + "display_pfd()\n", + "\n", + "m.fs.gt.write_pfd(fname=\"data_pfds/gt_baseline.svg\")\n", + "m.fs.hrsg.write_pfd(fname=\"data_pfds/hrsg_baseline.svg\")\n", + "m.fs.st.write_pfd(fname=\"data_pfds/st_baseline.svg\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test key model outputs against NETL baseline" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Assert results approximately agree with baseline report\n", + "assert pyo.value(m.fs.net_power_mw[0]) == pytest.approx(646)\n", + "assert pyo.value(m.fs.gross_power[0]) == pytest.approx(-690e6, rel=0.001)\n", + "assert pyo.value(100 * m.fs.lhv_efficiency[0]) == pytest.approx(52.8, abs=0.1)\n", + "assert pyo.value(\n", + " m.fs.total_variable_cost_rate[0] / m.fs.net_power_mw[0]\n", + ") == pytest.approx(37.2799, rel=0.01)\n", + "assert pyo.value(m.fs.fuel_cost_rate[0] / m.fs.net_power_mw[0]) == pytest.approx(\n", + " 31.6462, rel=0.01\n", + ")\n", + "assert pyo.value(\n", + " m.fs.other_variable_cost_rate[0] / m.fs.net_power_mw[0]\n", + ") == pytest.approx(5.63373, rel=0.01)\n", + "assert pyo.value(m.fs.gt.gt_power[0]) == pytest.approx(-477e6, rel=0.001)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "\n", + "variables = [\"net_power\", \"gross_power\", \"gt_power\"]\n", + "netl_baseline = [646, 690, 477]\n", + "idaes_prediction = [\n", + " pyo.value(m.fs.net_power_mw[0]),\n", + " -pyo.value(m.fs.gross_power[0]) * 1e-6,\n", + " -pyo.value(m.fs.gt.gt_power[0]) * 1e-6,\n", + "]\n", + "\n", + "label_location = np.arange(len(variables))\n", + "\n", + "width = 0.4\n", + "\n", + "fig, ax = plt.subplots()\n", + "netl_data = ax.bar(variables, netl_baseline, label=\"NETL Baseline\")\n", + "idaes_sim = ax.bar(\n", + " label_location + (width / 2), idaes_prediction, width, label=\"IDAES Prediction\"\n", + ")\n", + "\n", + "ax.set_ylabel(\"Power (MW)\")\n", + "ax.set_xticks(label_location)\n", + "ax.set_xticklabels(variables)\n", + "ax.legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run turndown cases 5 MW interval\n", + "\n", + "Here we set the CO2 capture rate to 97% and set the specific reboiler duty to PZ advanced solvent system. The minimum power is 160 MW net, which corresponds to a bit under 25%. This is roughly the minimum load for the NGCC modeled. Results are tabulated for tags in the tags_output tag group in a Pandas data frame. \n", + "\n", + "To run the series, change run_series to True. Running the turndown series takes a while, unless previous saved results are available. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "run_series = False\n", + "if run_series:\n", + " idaes.cfg.ipopt.options.tol = 1e-6\n", + " idaes.cfg.ipopt.options.max_iter = 50\n", + " solver = pyo.SolverFactory(\"ipopt\")\n", + "\n", + " m.fs.cap_specific_reboiler_duty.fix(2.4e6)\n", + " m.fs.cap_fraction.fix(0.97)\n", + " powers = np.linspace(650, 160, int((650 - 160) / 5) + 1)\n", + " powers = list(powers)\n", + " powers.insert(1, 646)\n", + "\n", + " df = pd.DataFrame(columns=m.fs.tags_output.table_heading())\n", + "\n", + " for p in powers:\n", + " print(\"Simulation for net power = \", p)\n", + " fname = f\"data/ngcc_{int(p)}.json.gz\"\n", + " if os.path.exists(fname):\n", + " iutil.from_json(m, fname=fname, wts=iutil.StoreSpec(suffix=False))\n", + " else:\n", + " m.fs.net_power_mw.fix(p)\n", + " res = solver.solve(m, tee=False, symbolic_solver_labels=True)\n", + " if not pyo.check_optimal_termination(res):\n", + " break\n", + " iutil.to_json(m, fname=fname)\n", + " df.loc[m.fs.tags_output[\"net_power\"].value] = m.fs.tags_output.table_row(\n", + " numeric=True\n", + " )\n", + " if abs(p - 650) < 0.1:\n", + " m.fs.gt.streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_gt.csv\"\n", + " )\n", + " m.fs.st.steam_streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_st.csv\"\n", + " )\n", + " m.fs.hrsg.steam_streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_hrsg_steam.csv\"\n", + " )\n", + " m.fs.hrsg.flue_gas_streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_hrsg_gas.csv\"\n", + " )\n", + " df.to_csv(\"data_tabulated/ngcc.csv\")\n", + "\n", + " # Display the results from the run stored in a pandas dataframe\n", + " pd.set_option(\"display.max_rows\", None)\n", + " pd.set_option(\"display.max_columns\", None)\n", + " display(df)\n", + "\n", + " # Plot results\n", + " plt.plot(df[\"net_power (MW)\"], df[\"lhv_efficiency (%)\"])\n", + " plt.grid()\n", + " plt.xlabel(\"Net Power (MW)\")\n", + " plt.ylabel(\"LHV Efficiency (%)\")\n", + " plt.title(\"Net Power vs. Efficiency\")\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_init.json.gz b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_init.json.gz new file mode 100644 index 00000000..d27944ab Binary files /dev/null and b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_init.json.gz differ diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_test.ipynb b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_test.ipynb new file mode 100644 index 00000000..900511dc --- /dev/null +++ b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_test.ipynb @@ -0,0 +1,344 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [ + "header", + "hide-cell" + ] + }, + "outputs": [], + "source": [ + "###############################################################################\n", + "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n", + "# Framework (IDAES IP) was produced under the DOE Institute for the\n", + "# Design of Advanced Energy Systems (IDAES).\n", + "#\n", + "# Copyright (c) 2018-2023 by the software owners: The Regents of the\n", + "# University of California, through Lawrence Berkeley National Laboratory,\n", + "# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon\n", + "# University, West Virginia University Research Corporation, et al.\n", + "# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md\n", + "# for full copyright and license information.\n", + "###############################################################################" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NGCC Baseline and Turndown\n", + "Maintainer: John Eslick \n", + "Author: John Eslick \n", + "Updated: 2023-06-01 \n", + "\n", + "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1: Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B (https://www.netl.doe.gov/projects/files/CostAndPerformanceBaselineForFossilEnergyPlantsVol1BitumCoalAndNGtoElectBBRRev4-1_092419.pdf)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports\n", + "\n", + "Import the modules that will be used." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "from IPython.core.display import SVG\n", + "import pyomo.environ as pyo\n", + "import idaes\n", + "from idaes.core.solvers import use_idaes_solver_configuration_defaults\n", + "import idaes.core.util.scaling as iscale\n", + "import idaes.core.util as iutil\n", + "from idaes_examples.mod.power_gen import ngcc\n", + "import pytest\n", + "import logging\n", + "\n", + "logging.getLogger(\"pyomo\").setLevel(logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Make Output Directories\n", + "\n", + "This notebook can produce a large number of output files. To make it easier to manage, some subdirectories are used to organize output. This ensures that the directories exist." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def make_directory(path):\n", + " \"\"\"Make a directory if it doesn't exist\"\"\"\n", + " try:\n", + " os.mkdir(path)\n", + " except FileExistsError:\n", + " pass\n", + "\n", + "\n", + "make_directory(\"data\")\n", + "make_directory(\"data_pfds\")\n", + "make_directory(\"data_tabulated\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Solver Settings\n", + "\n", + "Use the IDAES configuration system for solver settings. These will apply to all Ipopt instances created, including the ones created in initialization methods." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "use_idaes_solver_configuration_defaults()\n", + "idaes.cfg.ipopt.options.nlp_scaling_method = \"user-scaling\"\n", + "idaes.cfg.ipopt.options.linear_solver = \"ma57\"\n", + "idaes.cfg.ipopt.options.OF_ma57_automatic_scaling = \"yes\"\n", + "idaes.cfg.ipopt.options.ma57_pivtol = 1e-5\n", + "idaes.cfg.ipopt.options.ma57_pivtolmax = 0.1\n", + "solver = pyo.SolverFactory(\"ipopt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create the NGCC model\n", + "\n", + "Create the NGCC model and initialize it or read the saved initialization if available. The base initialized NGCC model is configured to match the baseline report with 90% capture using a Cansolv system." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "m = pyo.ConcreteModel()\n", + "m.fs = ngcc.NgccFlowsheet(dynamic=False)\n", + "iscale.calculate_scaling_factors(m)\n", + "m.fs.initialize(\n", + " load_from=\"ngcc_init.json.gz\",\n", + " save_to=\"ngcc_init.json.gz\",\n", + ")\n", + "res = solver.solve(m, tee=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Show PFDs with baseline results\n", + "\n", + "This displays PFDs in the notebook, and saves them to files. The full NGCC model is too big to show well in a single PFD, so it is broken into the three main sections, gas turbine, heat recovery steam generator (HRSG), and steam turbine." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def display_pfd():\n", + " print(\"\\n\\nGas Turbine Section\\n\")\n", + " display(SVG(m.fs.gt.write_pfd()))\n", + " print(\"\\n\\nHRSG Section\\n\")\n", + " display(SVG(m.fs.hrsg.write_pfd()))\n", + " print(\"\\n\\nSteam Turbine Section\\n\")\n", + " display(SVG(m.fs.st.write_pfd()))\n", + "\n", + "\n", + "display_pfd()\n", + "\n", + "m.fs.gt.write_pfd(fname=\"data_pfds/gt_baseline.svg\")\n", + "m.fs.hrsg.write_pfd(fname=\"data_pfds/hrsg_baseline.svg\")\n", + "m.fs.st.write_pfd(fname=\"data_pfds/st_baseline.svg\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test key model outputs against NETL baseline" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Assert results approximately agree with baseline reoprt\n", + "assert pyo.value(m.fs.net_power_mw[0]) == pytest.approx(646)\n", + "assert pyo.value(m.fs.gross_power[0]) == pytest.approx(-690e6, rel=0.001)\n", + "assert pyo.value(100 * m.fs.lhv_efficiency[0]) == pytest.approx(52.8, abs=0.1)\n", + "assert pyo.value(\n", + " m.fs.total_variable_cost_rate[0] / m.fs.net_power_mw[0]\n", + ") == pytest.approx(37.2799, rel=0.01)\n", + "assert pyo.value(m.fs.fuel_cost_rate[0] / m.fs.net_power_mw[0]) == pytest.approx(\n", + " 31.6462, rel=0.01\n", + ")\n", + "assert pyo.value(\n", + " m.fs.other_variable_cost_rate[0] / m.fs.net_power_mw[0]\n", + ") == pytest.approx(5.63373, rel=0.01)\n", + "assert pyo.value(m.fs.gt.gt_power[0]) == pytest.approx(-477e6, rel=0.001)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "\n", + "variables = [\"net_power\", \"gross_power\", \"gt_power\"]\n", + "netl_baseline = [646, 690, 477]\n", + "idaes_prediction = [\n", + " pyo.value(m.fs.net_power_mw[0]),\n", + " -pyo.value(m.fs.gross_power[0]) * 1e-6,\n", + " -pyo.value(m.fs.gt.gt_power[0]) * 1e-6,\n", + "]\n", + "\n", + "label_location = np.arange(len(variables))\n", + "\n", + "width = 0.4\n", + "\n", + "fig, ax = plt.subplots()\n", + "netl_data = ax.bar(variables, netl_baseline, label=\"NETL Baseline\")\n", + "idaes_sim = ax.bar(\n", + " label_location + (width / 2), idaes_prediction, width, label=\"IDAES Prediction\"\n", + ")\n", + "\n", + "ax.set_ylabel(\"Power (MW)\")\n", + "ax.set_xticks(label_location)\n", + "ax.set_xticklabels(variables)\n", + "ax.legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run turndown cases 5 MW interval\n", + "\n", + "Here we set the CO2 capture rate to 97% and set the specific reboiler duty to PZ advanced solvent system. The minimum power is 160 MW net, which corresponds to a bit under 25%. This is roughly the minimum load for the NGCC modeled. Results are tabulated for tags in the tags_output tag group in a Pandas data frame. \n", + "\n", + "To run the series, change run_series to True. Running the turndown series takes a while, unless previous saved results are available. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "run_series = False\n", + "if run_series:\n", + " idaes.cfg.ipopt.options.tol = 1e-6\n", + " idaes.cfg.ipopt.options.max_iter = 50\n", + " solver = pyo.SolverFactory(\"ipopt\")\n", + "\n", + " m.fs.cap_specific_reboiler_duty.fix(2.4e6)\n", + " m.fs.cap_fraction.fix(0.97)\n", + " powers = np.linspace(650, 160, int((650 - 160) / 5) + 1)\n", + " powers = list(powers)\n", + " powers.insert(1, 646)\n", + "\n", + " df = pd.DataFrame(columns=m.fs.tags_output.table_heading())\n", + "\n", + " for p in powers:\n", + " print(\"Simulation for net power = \", p)\n", + " fname = f\"data/ngcc_{int(p)}.json.gz\"\n", + " if os.path.exists(fname):\n", + " iutil.from_json(m, fname=fname, wts=iutil.StoreSpec(suffix=False))\n", + " else:\n", + " m.fs.net_power_mw.fix(p)\n", + " res = solver.solve(m, tee=False, symbolic_solver_labels=True)\n", + " if not pyo.check_optimal_termination(res):\n", + " break\n", + " iutil.to_json(m, fname=fname)\n", + " df.loc[m.fs.tags_output[\"net_power\"].value] = m.fs.tags_output.table_row(\n", + " numeric=True\n", + " )\n", + " if abs(p - 650) < 0.1:\n", + " m.fs.gt.streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_gt.csv\"\n", + " )\n", + " m.fs.st.steam_streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_st.csv\"\n", + " )\n", + " m.fs.hrsg.steam_streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_hrsg_steam.csv\"\n", + " )\n", + " m.fs.hrsg.flue_gas_streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_hrsg_gas.csv\"\n", + " )\n", + " df.to_csv(\"data_tabulated/ngcc.csv\")\n", + "\n", + " # Display the results from the run stored in a pandas dataframe\n", + " pd.set_option(\"display.max_rows\", None)\n", + " pd.set_option(\"display.max_columns\", None)\n", + " display(df)\n", + "\n", + " # Plot results\n", + " plt.plot(df[\"net_power (MW)\"], df[\"lhv_efficiency (%)\"])\n", + " plt.grid()\n", + " plt.xlabel(\"Net Power (MW)\")\n", + " plt.ylabel(\"LHV Efficiency (%)\")\n", + " plt.title(\"Net Power vs. Efficiency\")\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 3 +} diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_usr.ipynb b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_usr.ipynb new file mode 100644 index 00000000..900511dc --- /dev/null +++ b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_usr.ipynb @@ -0,0 +1,344 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [ + "header", + "hide-cell" + ] + }, + "outputs": [], + "source": [ + "###############################################################################\n", + "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n", + "# Framework (IDAES IP) was produced under the DOE Institute for the\n", + "# Design of Advanced Energy Systems (IDAES).\n", + "#\n", + "# Copyright (c) 2018-2023 by the software owners: The Regents of the\n", + "# University of California, through Lawrence Berkeley National Laboratory,\n", + "# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon\n", + "# University, West Virginia University Research Corporation, et al.\n", + "# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md\n", + "# for full copyright and license information.\n", + "###############################################################################" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NGCC Baseline and Turndown\n", + "Maintainer: John Eslick \n", + "Author: John Eslick \n", + "Updated: 2023-06-01 \n", + "\n", + "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1: Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B (https://www.netl.doe.gov/projects/files/CostAndPerformanceBaselineForFossilEnergyPlantsVol1BitumCoalAndNGtoElectBBRRev4-1_092419.pdf)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports\n", + "\n", + "Import the modules that will be used." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "from IPython.core.display import SVG\n", + "import pyomo.environ as pyo\n", + "import idaes\n", + "from idaes.core.solvers import use_idaes_solver_configuration_defaults\n", + "import idaes.core.util.scaling as iscale\n", + "import idaes.core.util as iutil\n", + "from idaes_examples.mod.power_gen import ngcc\n", + "import pytest\n", + "import logging\n", + "\n", + "logging.getLogger(\"pyomo\").setLevel(logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Make Output Directories\n", + "\n", + "This notebook can produce a large number of output files. To make it easier to manage, some subdirectories are used to organize output. This ensures that the directories exist." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def make_directory(path):\n", + " \"\"\"Make a directory if it doesn't exist\"\"\"\n", + " try:\n", + " os.mkdir(path)\n", + " except FileExistsError:\n", + " pass\n", + "\n", + "\n", + "make_directory(\"data\")\n", + "make_directory(\"data_pfds\")\n", + "make_directory(\"data_tabulated\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Solver Settings\n", + "\n", + "Use the IDAES configuration system for solver settings. These will apply to all Ipopt instances created, including the ones created in initialization methods." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "use_idaes_solver_configuration_defaults()\n", + "idaes.cfg.ipopt.options.nlp_scaling_method = \"user-scaling\"\n", + "idaes.cfg.ipopt.options.linear_solver = \"ma57\"\n", + "idaes.cfg.ipopt.options.OF_ma57_automatic_scaling = \"yes\"\n", + "idaes.cfg.ipopt.options.ma57_pivtol = 1e-5\n", + "idaes.cfg.ipopt.options.ma57_pivtolmax = 0.1\n", + "solver = pyo.SolverFactory(\"ipopt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create the NGCC model\n", + "\n", + "Create the NGCC model and initialize it or read the saved initialization if available. The base initialized NGCC model is configured to match the baseline report with 90% capture using a Cansolv system." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "m = pyo.ConcreteModel()\n", + "m.fs = ngcc.NgccFlowsheet(dynamic=False)\n", + "iscale.calculate_scaling_factors(m)\n", + "m.fs.initialize(\n", + " load_from=\"ngcc_init.json.gz\",\n", + " save_to=\"ngcc_init.json.gz\",\n", + ")\n", + "res = solver.solve(m, tee=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Show PFDs with baseline results\n", + "\n", + "This displays PFDs in the notebook, and saves them to files. The full NGCC model is too big to show well in a single PFD, so it is broken into the three main sections, gas turbine, heat recovery steam generator (HRSG), and steam turbine." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def display_pfd():\n", + " print(\"\\n\\nGas Turbine Section\\n\")\n", + " display(SVG(m.fs.gt.write_pfd()))\n", + " print(\"\\n\\nHRSG Section\\n\")\n", + " display(SVG(m.fs.hrsg.write_pfd()))\n", + " print(\"\\n\\nSteam Turbine Section\\n\")\n", + " display(SVG(m.fs.st.write_pfd()))\n", + "\n", + "\n", + "display_pfd()\n", + "\n", + "m.fs.gt.write_pfd(fname=\"data_pfds/gt_baseline.svg\")\n", + "m.fs.hrsg.write_pfd(fname=\"data_pfds/hrsg_baseline.svg\")\n", + "m.fs.st.write_pfd(fname=\"data_pfds/st_baseline.svg\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test key model outputs against NETL baseline" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Assert results approximately agree with baseline reoprt\n", + "assert pyo.value(m.fs.net_power_mw[0]) == pytest.approx(646)\n", + "assert pyo.value(m.fs.gross_power[0]) == pytest.approx(-690e6, rel=0.001)\n", + "assert pyo.value(100 * m.fs.lhv_efficiency[0]) == pytest.approx(52.8, abs=0.1)\n", + "assert pyo.value(\n", + " m.fs.total_variable_cost_rate[0] / m.fs.net_power_mw[0]\n", + ") == pytest.approx(37.2799, rel=0.01)\n", + "assert pyo.value(m.fs.fuel_cost_rate[0] / m.fs.net_power_mw[0]) == pytest.approx(\n", + " 31.6462, rel=0.01\n", + ")\n", + "assert pyo.value(\n", + " m.fs.other_variable_cost_rate[0] / m.fs.net_power_mw[0]\n", + ") == pytest.approx(5.63373, rel=0.01)\n", + "assert pyo.value(m.fs.gt.gt_power[0]) == pytest.approx(-477e6, rel=0.001)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "\n", + "variables = [\"net_power\", \"gross_power\", \"gt_power\"]\n", + "netl_baseline = [646, 690, 477]\n", + "idaes_prediction = [\n", + " pyo.value(m.fs.net_power_mw[0]),\n", + " -pyo.value(m.fs.gross_power[0]) * 1e-6,\n", + " -pyo.value(m.fs.gt.gt_power[0]) * 1e-6,\n", + "]\n", + "\n", + "label_location = np.arange(len(variables))\n", + "\n", + "width = 0.4\n", + "\n", + "fig, ax = plt.subplots()\n", + "netl_data = ax.bar(variables, netl_baseline, label=\"NETL Baseline\")\n", + "idaes_sim = ax.bar(\n", + " label_location + (width / 2), idaes_prediction, width, label=\"IDAES Prediction\"\n", + ")\n", + "\n", + "ax.set_ylabel(\"Power (MW)\")\n", + "ax.set_xticks(label_location)\n", + "ax.set_xticklabels(variables)\n", + "ax.legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run turndown cases 5 MW interval\n", + "\n", + "Here we set the CO2 capture rate to 97% and set the specific reboiler duty to PZ advanced solvent system. The minimum power is 160 MW net, which corresponds to a bit under 25%. This is roughly the minimum load for the NGCC modeled. Results are tabulated for tags in the tags_output tag group in a Pandas data frame. \n", + "\n", + "To run the series, change run_series to True. Running the turndown series takes a while, unless previous saved results are available. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "run_series = False\n", + "if run_series:\n", + " idaes.cfg.ipopt.options.tol = 1e-6\n", + " idaes.cfg.ipopt.options.max_iter = 50\n", + " solver = pyo.SolverFactory(\"ipopt\")\n", + "\n", + " m.fs.cap_specific_reboiler_duty.fix(2.4e6)\n", + " m.fs.cap_fraction.fix(0.97)\n", + " powers = np.linspace(650, 160, int((650 - 160) / 5) + 1)\n", + " powers = list(powers)\n", + " powers.insert(1, 646)\n", + "\n", + " df = pd.DataFrame(columns=m.fs.tags_output.table_heading())\n", + "\n", + " for p in powers:\n", + " print(\"Simulation for net power = \", p)\n", + " fname = f\"data/ngcc_{int(p)}.json.gz\"\n", + " if os.path.exists(fname):\n", + " iutil.from_json(m, fname=fname, wts=iutil.StoreSpec(suffix=False))\n", + " else:\n", + " m.fs.net_power_mw.fix(p)\n", + " res = solver.solve(m, tee=False, symbolic_solver_labels=True)\n", + " if not pyo.check_optimal_termination(res):\n", + " break\n", + " iutil.to_json(m, fname=fname)\n", + " df.loc[m.fs.tags_output[\"net_power\"].value] = m.fs.tags_output.table_row(\n", + " numeric=True\n", + " )\n", + " if abs(p - 650) < 0.1:\n", + " m.fs.gt.streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_gt.csv\"\n", + " )\n", + " m.fs.st.steam_streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_st.csv\"\n", + " )\n", + " m.fs.hrsg.steam_streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_hrsg_steam.csv\"\n", + " )\n", + " m.fs.hrsg.flue_gas_streams_dataframe().to_csv(\n", + " \"data_tabulated/ngcc_stream_650mw_hrsg_gas.csv\"\n", + " )\n", + " df.to_csv(\"data_tabulated/ngcc.csv\")\n", + "\n", + " # Display the results from the run stored in a pandas dataframe\n", + " pd.set_option(\"display.max_rows\", None)\n", + " pd.set_option(\"display.max_columns\", None)\n", + " display(df)\n", + "\n", + " # Plot results\n", + " plt.plot(df[\"net_power (MW)\"], df[\"lhv_efficiency (%)\"])\n", + " plt.grid()\n", + " plt.xlabel(\"Net Power (MW)\")\n", + " plt.ylabel(\"LHV Efficiency (%)\")\n", + " plt.title(\"Net Power vs. Efficiency\")\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 3 +} diff --git a/idaes_examples/notebooks/docs/dae/petsc_chem.ipynb b/idaes_examples/notebooks/docs/dae/petsc_chem.ipynb index 8c18a64c..44969c96 100644 --- a/idaes_examples/notebooks/docs/dae/petsc_chem.ipynb +++ b/idaes_examples/notebooks/docs/dae/petsc_chem.ipynb @@ -271,7 +271,7 @@ "source": [ "## Interpolate Trajectory\n", "\n", - "For a number of reasons, such as initializating Pyomo problems or showing results at even time intervals it can be useful to show values at specific time points. The PetscTrajectory class has a method to use linear interpolation to produce a new dictionary of trajectory data at specified time points. " + "For a number of reasons, such as initializing Pyomo problems or showing results at even time intervals it can be useful to show values at specific time points. The PetscTrajectory class has a method to use linear interpolation to produce a new dictionary of trajectory data at specified time points. " ] }, { diff --git a/idaes_examples/notebooks/docs/dae/petsc_chem_doc.ipynb b/idaes_examples/notebooks/docs/dae/petsc_chem_doc.ipynb index 784704fd..f36b14c1 100644 --- a/idaes_examples/notebooks/docs/dae/petsc_chem_doc.ipynb +++ b/idaes_examples/notebooks/docs/dae/petsc_chem_doc.ipynb @@ -1164,7 +1164,7 @@ "source": [ "## Interpolate Trajectory\n", "\n", - "For a number of reasons, such as initializating Pyomo problems or showing results at even time intervals it can be useful to show values at specific time points. The PetscTrajectory class has a method to use linear interpolation to produce a new dictionary of trajectory data at specified time points. " + "For a number of reasons, such as initializing Pyomo problems or showing results at even time intervals it can be useful to show values at specific time points. The PetscTrajectory class has a method to use linear interpolation to produce a new dictionary of trajectory data at specified time points. " ] }, { @@ -1270,4 +1270,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/dae/petsc_chem_test.ipynb b/idaes_examples/notebooks/docs/dae/petsc_chem_test.ipynb index 1248341a..c92befe9 100644 --- a/idaes_examples/notebooks/docs/dae/petsc_chem_test.ipynb +++ b/idaes_examples/notebooks/docs/dae/petsc_chem_test.ipynb @@ -160,7 +160,7 @@ " time=m.t,\n", " between=[m.t.first(), m.t.last()],\n", " ts_options={\n", - " \"--ts_type\": \"cn\", # Crank\u2013Nicolson\n", + " \"--ts_type\": \"cn\", # Crank–Nicolson\n", " \"--ts_adapt_type\": \"basic\",\n", " \"--ts_dt\": 0.01,\n", " \"--ts_save_trajectory\": 1,\n", @@ -271,7 +271,7 @@ "source": [ "## Interpolate Trajectory\n", "\n", - "For a number of reasons, such as initializating Pyomo problems or showing results at even time intervals it can be useful to show values at specific time points. The PetscTrajectory class has a method to use linear interpolation to produce a new dictionary of trajectory data at specified time points. " + "For a number of reasons, such as initializing Pyomo problems or showing results at even time intervals it can be useful to show values at specific time points. The PetscTrajectory class has a method to use linear interpolation to produce a new dictionary of trajectory data at specified time points. " ] }, { @@ -347,4 +347,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/dae/petsc_chem_usr.ipynb b/idaes_examples/notebooks/docs/dae/petsc_chem_usr.ipynb index 1248341a..c92befe9 100644 --- a/idaes_examples/notebooks/docs/dae/petsc_chem_usr.ipynb +++ b/idaes_examples/notebooks/docs/dae/petsc_chem_usr.ipynb @@ -160,7 +160,7 @@ " time=m.t,\n", " between=[m.t.first(), m.t.last()],\n", " ts_options={\n", - " \"--ts_type\": \"cn\", # Crank\u2013Nicolson\n", + " \"--ts_type\": \"cn\", # Crank–Nicolson\n", " \"--ts_adapt_type\": \"basic\",\n", " \"--ts_dt\": 0.01,\n", " \"--ts_save_trajectory\": 1,\n", @@ -271,7 +271,7 @@ "source": [ "## Interpolate Trajectory\n", "\n", - "For a number of reasons, such as initializating Pyomo problems or showing results at even time intervals it can be useful to show values at specific time points. The PetscTrajectory class has a method to use linear interpolation to produce a new dictionary of trajectory data at specified time points. " + "For a number of reasons, such as initializing Pyomo problems or showing results at even time intervals it can be useful to show values at specific time points. The PetscTrajectory class has a method to use linear interpolation to produce a new dictionary of trajectory data at specified time points. " ] }, { @@ -347,4 +347,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox.ipynb b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox.ipynb index 42a51d1f..74dfd06a 100755 --- a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox.ipynb +++ b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox.ipynb @@ -604,7 +604,7 @@ }, "outputs": [], "source": [ - "# Call the report_strucutral_issues() method" + "# Call the report_structural_issues() method" ] }, { @@ -1586,7 +1586,7 @@ }, "outputs": [], "source": [ - "# Check for new strucutral issues" + "# Check for new structural issues" ] }, { @@ -2077,7 +2077,7 @@ "Normally in these cases we would need to map the solution from the scaled model back to the unscaled model so we can view the results. In this case, we are not actually interested in the solution so we move on with the model diagnosis.\n", "\n", "\n", - "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnositcsToolbox`` with the scaled model as the ``model`` argument.\n", + "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnosticsToolbox`` with the scaled model as the ``model`` argument.\n", "\n", "\n", "
\n", diff --git a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_doc.ipynb b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_doc.ipynb index f75092f1..3730cf0f 100644 --- a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_doc.ipynb +++ b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_doc.ipynb @@ -1741,7 +1741,7 @@ "Normally in these cases we would need to map the solution from the scaled model back to the unscaled model so we can view the results. In this case, we are not actually interested in the solution so we move on with the model diagnosis.\n", "
\n", "\n", - "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnositcsToolbox`` with the scaled model as the ``model`` argument.\n", + "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnosticsToolbox`` with the scaled model as the ``model`` argument.\n", "\n", "\n", "
\n", @@ -1833,4 +1833,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_exercise.ipynb b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_exercise.ipynb index dd680878..af574b64 100644 --- a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_exercise.ipynb +++ b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_exercise.ipynb @@ -169,7 +169,7 @@ }, "outputs": [], "source": [ - "# Call the report_strucutral_issues() method" + "# Call the report_structural_issues() method" ] }, { @@ -571,7 +571,7 @@ }, "outputs": [], "source": [ - "# Check for new strucutral issues" + "# Check for new structural issues" ] }, { @@ -722,7 +722,7 @@ "Normally in these cases we would need to map the solution from the scaled model back to the unscaled model so we can view the results. In this case, we are not actually interested in the solution so we move on with the model diagnosis.\n", "
\n", "\n", - "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnositcsToolbox`` with the scaled model as the ``model`` argument.\n", + "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnosticsToolbox`` with the scaled model as the ``model`` argument.\n", "\n", "\n", "
\n", @@ -783,4 +783,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_solution.ipynb b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_solution.ipynb index 9ea0c9bc..e2092d01 100644 --- a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_solution.ipynb +++ b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_solution.ipynb @@ -591,7 +591,7 @@ }, "outputs": [], "source": [ - "# Call the report_strucutral_issues() method" + "# Call the report_structural_issues() method" ] }, { @@ -1535,7 +1535,7 @@ }, "outputs": [], "source": [ - "# Check for new strucutral issues" + "# Check for new structural issues" ] }, { @@ -1994,7 +1994,7 @@ "Normally in these cases we would need to map the solution from the scaled model back to the unscaled model so we can view the results. In this case, we are not actually interested in the solution so we move on with the model diagnosis.\n", "
\n", "\n", - "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnositcsToolbox`` with the scaled model as the ``model`` argument.\n", + "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnosticsToolbox`` with the scaled model as the ``model`` argument.\n", "\n", "\n", "
\n", @@ -2101,4 +2101,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_test.ipynb b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_test.ipynb index e69345be..067ad085 100644 --- a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_test.ipynb +++ b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_test.ipynb @@ -1756,7 +1756,7 @@ "Normally in these cases we would need to map the solution from the scaled model back to the unscaled model so we can view the results. In this case, we are not actually interested in the solution so we move on with the model diagnosis.\n", "
\n", "\n", - "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnositcsToolbox`` with the scaled model as the ``model`` argument.\n", + "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnosticsToolbox`` with the scaled model as the ``model`` argument.\n", "\n", "\n", "
\n", @@ -1862,4 +1862,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_usr.ipynb b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_usr.ipynb index 9ea0c9bc..e2092d01 100644 --- a/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_usr.ipynb +++ b/idaes_examples/notebooks/docs/diagnostics/diagnostics_toolbox_usr.ipynb @@ -591,7 +591,7 @@ }, "outputs": [], "source": [ - "# Call the report_strucutral_issues() method" + "# Call the report_structural_issues() method" ] }, { @@ -1535,7 +1535,7 @@ }, "outputs": [], "source": [ - "# Check for new strucutral issues" + "# Check for new structural issues" ] }, { @@ -1994,7 +1994,7 @@ "Normally in these cases we would need to map the solution from the scaled model back to the unscaled model so we can view the results. In this case, we are not actually interested in the solution so we move on with the model diagnosis.\n", "
\n", "\n", - "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnositcsToolbox`` with the scaled model as the ``model`` argument.\n", + "Now that we have fixed the scaling issues, we can go back to the ``DiagnosticsToolbox`` and see if we still have any warnings. Note however that we need to look at the scaled model now rather than the original model, so we need to create a new instance of the ``DiagnosticsToolbox`` with the scaled model as the ``model`` argument.\n", "\n", "\n", "
\n", @@ -2101,4 +2101,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing.ipynb b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing.ipynb index 0b9c4081..cf4f631c 100644 --- a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing.ipynb @@ -232,7 +232,7 @@ "source": [ "The costing module provides a `unit_mapping` dictionary linking generic unit model classes with recommended costing methods. In this example, StoichiometricReactor and Flash vessels utilize different vessel costing methods with similar arguments. The diameter and length attributes need to exist in order to cost vessel sizing and material requirements, and we add them if they don't exist already. The `unit_mapping` method provides an opportunity to automatically select the correct vessel orientation (vertical or horizontal) based on the unit type; passing a `StoichiometricReactor` or `PFR` class object will call the `cost_horizontal_vessel` method, while passing a `Flash` or `CSTR` class object will call the `cost_vertical_vessel` method.\n", "\n", - "All vessels are assigned costing succintly via a loop below - users may define each block individually if desired:" + "All vessels are assigned costing succinctly via a loop below - users may define each block individually if desired:" ] }, { diff --git a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_doc.ipynb b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_doc.ipynb index 9339ebf2..438d7945 100644 --- a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_doc.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_doc.ipynb @@ -838,7 +838,7 @@ "source": [ "The costing module provides a `unit_mapping` dictionary linking generic unit model classes with recommended costing methods. In this example, StoichiometricReactor and Flash vessels utilize different vessel costing methods with similar arguments. The diameter and length attributes need to exist in order to cost vessel sizing and material requirements, and we add them if they don't exist already. The `unit_mapping` method provides an opportunity to automatically select the correct vessel orientation (vertical or horizontal) based on the unit type; passing a `StoichiometricReactor` or `PFR` class object will call the `cost_horizontal_vessel` method, while passing a `Flash` or `CSTR` class object will call the `cost_vertical_vessel` method.\n", "\n", - "All vessels are assigned costing succintly via a loop below - users may define each block individually if desired:" + "All vessels are assigned costing succinctly via a loop below - users may define each block individually if desired:" ] }, { @@ -1866,4 +1866,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_test.ipynb b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_test.ipynb index 054f1c48..59b5e0d2 100644 --- a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_test.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_test.ipynb @@ -59,7 +59,7 @@ "example, toluene will be reacted with hydrogen gas at high temperatures\n", " to form benzene via the following reaction:\n", "\n", - "**C6H5CH3 + H2 \u2192 C6H6 + CH4**\n", + "**C6H5CH3 + H2 → C6H6 + CH4**\n", "\n", "\n", "This reaction is often accompanied by an equilibrium side reaction\n", @@ -232,7 +232,7 @@ "source": [ "The costing module provides a `unit_mapping` dictionary linking generic unit model classes with recommended costing methods. In this example, StoichiometricReactor and Flash vessels utilize different vessel costing methods with similar arguments. The diameter and length attributes need to exist in order to cost vessel sizing and material requirements, and we add them if they don't exist already. The `unit_mapping` method provides an opportunity to automatically select the correct vessel orientation (vertical or horizontal) based on the unit type; passing a `StoichiometricReactor` or `PFR` class object will call the `cost_horizontal_vessel` method, while passing a `Flash` or `CSTR` class object will call the `cost_vertical_vessel` method.\n", "\n", - "All vessels are assigned costing succintly via a loop below - users may define each block individually if desired:" + "All vessels are assigned costing succinctly via a loop below - users may define each block individually if desired:" ] }, { @@ -560,4 +560,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_usr.ipynb b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_usr.ipynb index 5d73b18b..dfce578b 100644 --- a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_usr.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_costing_usr.ipynb @@ -59,7 +59,7 @@ "example, toluene will be reacted with hydrogen gas at high temperatures\n", " to form benzene via the following reaction:\n", "\n", - "**C6H5CH3 + H2 \u2192 C6H6 + CH4**\n", + "**C6H5CH3 + H2 → C6H6 + CH4**\n", "\n", "\n", "This reaction is often accompanied by an equilibrium side reaction\n", @@ -232,7 +232,7 @@ "source": [ "The costing module provides a `unit_mapping` dictionary linking generic unit model classes with recommended costing methods. In this example, StoichiometricReactor and Flash vessels utilize different vessel costing methods with similar arguments. The diameter and length attributes need to exist in order to cost vessel sizing and material requirements, and we add them if they don't exist already. The `unit_mapping` method provides an opportunity to automatically select the correct vessel orientation (vertical or horizontal) based on the unit type; passing a `StoichiometricReactor` or `PFR` class object will call the `cost_horizontal_vessel` method, while passing a `Flash` or `CSTR` class object will call the `cost_vertical_vessel` method.\n", "\n", - "All vessels are assigned costing succintly via a loop below - users may define each block individually if desired:" + "All vessels are assigned costing succinctly via a loop below - users may define each block individually if desired:" ] }, { @@ -560,4 +560,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation.ipynb b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation.ipynb index 0179081c..ea0e1dd1 100644 --- a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation.ipynb @@ -80,8 +80,7 @@ "We will be using two thermodynamic packages: one (first in the list above) containing all four components (i.e., toluene, hydrogen, benzene, and methane) and the other (second in the list above) containing benzene and toluene only. The latter is needed to simplify the VLE calculations in the distillation column model. \n", "\n", "![](HDA_flowsheet_distillation.png)\n", - "\n", - "" + "\n" ] }, { @@ -602,7 +601,7 @@ "source": [ "## Connecting Unit Models using Arcs\n", "\n", - "We have now added the initial set of unit models to the flowsheet. However, we have not yet specifed how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " + "We have now added the initial set of unit models to the flowsheet. However, we have not yet specified how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " ] }, { @@ -1205,7 +1204,7 @@ "- Add the distillation column \n", "- Connect it to the heater \n", "- Add the necessary equality constraints\n", - "- Propogate the state variable information from the outlet of the heater to the inlet of the distillation column \n", + "- Propagate the state variable information from the outlet of the heater to the inlet of the distillation column \n", "- Fix the degrees of freedom of the distillation block (reflux ratio, boilup ratio, and condenser pressure)\n", "- Scale the control volume heat variables to help convergence\n", "- Initialize the distillation block.\n", @@ -1466,7 +1465,7 @@ "source": [ "
\n", "Inline Exercise:\n", - "You can querry additional variables here if you like. \n", + "You can query additional variables here if you like. \n", "\n", "Use Shift+Enter to run the cell once you have typed in your code. \n", "
" diff --git a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_doc.ipynb b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_doc.ipynb index b719e1e8..ff03b6e7 100644 --- a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_doc.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_doc.ipynb @@ -549,7 +549,7 @@ "source": [ "## Connecting Unit Models using Arcs\n", "\n", - "We have now added the initial set of unit models to the flowsheet. However, we have not yet specifed how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " + "We have now added the initial set of unit models to the flowsheet. However, we have not yet specified how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " ] }, { @@ -2247,7 +2247,7 @@ "- Add the distillation column \n", "- Connect it to the heater \n", "- Add the necessary equality constraints\n", - "- Propogate the state variable information from the outlet of the heater to the inlet of the distillation column \n", + "- Propagate the state variable information from the outlet of the heater to the inlet of the distillation column \n", "- Fix the degrees of freedom of the distillation block (reflux ratio, boilup ratio, and condenser pressure)\n", "- Scale the control volume heat variables to help convergence\n", "- Initialize the distillation block.\n", @@ -6977,7 +6977,7 @@ "source": [ "
\n", "Inline Exercise:\n", - "You can querry additional variables here if you like. \n", + "You can query additional variables here if you like. \n", "\n", "Use Shift+Enter to run the cell once you have typed in your code. \n", "
" @@ -7589,4 +7589,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_exercise.ipynb b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_exercise.ipynb index 1a4834ff..410b7c88 100644 --- a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_exercise.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_exercise.ipynb @@ -61,7 +61,7 @@ "example, toluene will be reacted with hydrogen gas at high temperatures\n", " to form benzene via the following reaction:\n", "\n", - "**C6H5CH3 + H2 \u2192 C6H6 + CH4**\n", + "**C6H5CH3 + H2 → C6H6 + CH4**\n", "\n", "\n", "This reaction is often accompanied by an equilibrium side reaction\n", @@ -80,8 +80,7 @@ "We will be using two thermodynamic packages: one (first in the list above) containing all four components (i.e., toluene, hydrogen, benzene, and methane) and the other (second in the list above) containing benzene and toluene only. The latter is needed to simplify the VLE calculations in the distillation column model. \n", "\n", "![](HDA_flowsheet_distillation.png)\n", - "\n", - "" + "\n" ] }, { @@ -535,7 +534,7 @@ "source": [ "## Connecting Unit Models using Arcs\n", "\n", - "We have now added the initial set of unit models to the flowsheet. However, we have not yet specifed how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " + "We have now added the initial set of unit models to the flowsheet. However, we have not yet specified how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " ] }, { @@ -1049,7 +1048,7 @@ "- Add the distillation column \n", "- Connect it to the heater \n", "- Add the necessary equality constraints\n", - "- Propogate the state variable information from the outlet of the heater to the inlet of the distillation column \n", + "- Propagate the state variable information from the outlet of the heater to the inlet of the distillation column \n", "- Fix the degrees of freedom of the distillation block (reflux ratio, boilup ratio, and condenser pressure)\n", "- Scale the control volume heat variables to help convergence\n", "- Initialize the distillation block.\n", @@ -1262,7 +1261,7 @@ "source": [ "
\n", "Inline Exercise:\n", - "You can querry additional variables here if you like. \n", + "You can query additional variables here if you like. \n", "\n", "Use Shift+Enter to run the cell once you have typed in your code. \n", "
" @@ -1629,4 +1628,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_solution.ipynb b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_solution.ipynb index ecabdf9c..1412322e 100644 --- a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_solution.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_solution.ipynb @@ -61,7 +61,7 @@ "example, toluene will be reacted with hydrogen gas at high temperatures\n", " to form benzene via the following reaction:\n", "\n", - "**C6H5CH3 + H2 \u2192 C6H6 + CH4**\n", + "**C6H5CH3 + H2 → C6H6 + CH4**\n", "\n", "\n", "This reaction is often accompanied by an equilibrium side reaction\n", @@ -80,8 +80,7 @@ "We will be using two thermodynamic packages: one (first in the list above) containing all four components (i.e., toluene, hydrogen, benzene, and methane) and the other (second in the list above) containing benzene and toluene only. The latter is needed to simplify the VLE calculations in the distillation column model. \n", "\n", "![](HDA_flowsheet_distillation.png)\n", - "\n", - "" + "\n" ] }, { @@ -602,7 +601,7 @@ "source": [ "## Connecting Unit Models using Arcs\n", "\n", - "We have now added the initial set of unit models to the flowsheet. However, we have not yet specifed how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " + "We have now added the initial set of unit models to the flowsheet. However, we have not yet specified how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " ] }, { @@ -1161,7 +1160,7 @@ "- Add the distillation column \n", "- Connect it to the heater \n", "- Add the necessary equality constraints\n", - "- Propogate the state variable information from the outlet of the heater to the inlet of the distillation column \n", + "- Propagate the state variable information from the outlet of the heater to the inlet of the distillation column \n", "- Fix the degrees of freedom of the distillation block (reflux ratio, boilup ratio, and condenser pressure)\n", "- Scale the control volume heat variables to help convergence\n", "- Initialize the distillation block.\n", @@ -1374,7 +1373,7 @@ "source": [ "
\n", "Inline Exercise:\n", - "You can querry additional variables here if you like. \n", + "You can query additional variables here if you like. \n", "\n", "Use Shift+Enter to run the cell once you have typed in your code. \n", "
" @@ -1788,4 +1787,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_test.ipynb b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_test.ipynb index 05b005f1..1468da16 100644 --- a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_test.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_test.ipynb @@ -61,7 +61,7 @@ "example, toluene will be reacted with hydrogen gas at high temperatures\n", " to form benzene via the following reaction:\n", "\n", - "**C6H5CH3 + H2 \u2192 C6H6 + CH4**\n", + "**C6H5CH3 + H2 → C6H6 + CH4**\n", "\n", "\n", "This reaction is often accompanied by an equilibrium side reaction\n", @@ -80,8 +80,7 @@ "We will be using two thermodynamic packages: one (first in the list above) containing all four components (i.e., toluene, hydrogen, benzene, and methane) and the other (second in the list above) containing benzene and toluene only. The latter is needed to simplify the VLE calculations in the distillation column model. \n", "\n", "![](HDA_flowsheet_distillation.png)\n", - "\n", - "" + "\n" ] }, { @@ -550,7 +549,7 @@ "source": [ "## Connecting Unit Models using Arcs\n", "\n", - "We have now added the initial set of unit models to the flowsheet. However, we have not yet specifed how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " + "We have now added the initial set of unit models to the flowsheet. However, we have not yet specified how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " ] }, { @@ -1111,7 +1110,7 @@ "- Add the distillation column \n", "- Connect it to the heater \n", "- Add the necessary equality constraints\n", - "- Propogate the state variable information from the outlet of the heater to the inlet of the distillation column \n", + "- Propagate the state variable information from the outlet of the heater to the inlet of the distillation column \n", "- Fix the degrees of freedom of the distillation block (reflux ratio, boilup ratio, and condenser pressure)\n", "- Scale the control volume heat variables to help convergence\n", "- Initialize the distillation block.\n", @@ -1372,7 +1371,7 @@ "source": [ "
\n", "Inline Exercise:\n", - "You can querry additional variables here if you like. \n", + "You can query additional variables here if you like. \n", "\n", "Use Shift+Enter to run the cell once you have typed in your code. \n", "
" @@ -1779,4 +1778,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_usr.ipynb b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_usr.ipynb index ecabdf9c..1412322e 100644 --- a/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_usr.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/hda_flowsheet_with_distillation_usr.ipynb @@ -61,7 +61,7 @@ "example, toluene will be reacted with hydrogen gas at high temperatures\n", " to form benzene via the following reaction:\n", "\n", - "**C6H5CH3 + H2 \u2192 C6H6 + CH4**\n", + "**C6H5CH3 + H2 → C6H6 + CH4**\n", "\n", "\n", "This reaction is often accompanied by an equilibrium side reaction\n", @@ -80,8 +80,7 @@ "We will be using two thermodynamic packages: one (first in the list above) containing all four components (i.e., toluene, hydrogen, benzene, and methane) and the other (second in the list above) containing benzene and toluene only. The latter is needed to simplify the VLE calculations in the distillation column model. \n", "\n", "![](HDA_flowsheet_distillation.png)\n", - "\n", - "" + "\n" ] }, { @@ -602,7 +601,7 @@ "source": [ "## Connecting Unit Models using Arcs\n", "\n", - "We have now added the initial set of unit models to the flowsheet. However, we have not yet specifed how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " + "We have now added the initial set of unit models to the flowsheet. However, we have not yet specified how the units are connected. To do this, we will be using the `Arc` which is a pyomo component that takes in two arguments: `source` and `destination`. Let us connect the outlet of the mixer (M101) to the inlet of the heater (H101). " ] }, { @@ -1161,7 +1160,7 @@ "- Add the distillation column \n", "- Connect it to the heater \n", "- Add the necessary equality constraints\n", - "- Propogate the state variable information from the outlet of the heater to the inlet of the distillation column \n", + "- Propagate the state variable information from the outlet of the heater to the inlet of the distillation column \n", "- Fix the degrees of freedom of the distillation block (reflux ratio, boilup ratio, and condenser pressure)\n", "- Scale the control volume heat variables to help convergence\n", "- Initialize the distillation block.\n", @@ -1374,7 +1373,7 @@ "source": [ "
\n", "Inline Exercise:\n", - "You can querry additional variables here if you like. \n", + "You can query additional variables here if you like. \n", "\n", "Use Shift+Enter to run the cell once you have typed in your code. \n", "
" @@ -1788,4 +1787,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis.ipynb b/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis.ipynb index 24e4ccb3..44462419 100644 --- a/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis.ipynb @@ -51,7 +51,7 @@ "source": [ "## 1. Introduction\n", "\n", - "This example demonstrates a simulation of methanol synthesis from hydrogen and carbon monoxide. Each methanol flowsheet module includes several built-in methods. This notebook demonstrates building the flowsheet, implementing model scaling, initialization and solving a square problem, costing and final constrainted optimization.\n", + "This example demonstrates a simulation of methanol synthesis from hydrogen and carbon monoxide. Each methanol flowsheet module includes several built-in methods. This notebook demonstrates building the flowsheet, implementing model scaling, initialization and solving a square problem, costing and final constrained optimization.\n", "\n", "The ```build_model()``` method creates the Pyomo concrete model and builds the flowsheet by importing thermophysical and reaction properties and unit models and defining stream connections between these units. This method also implements appropriate default scaling on state and property variables.\n", "\n", @@ -357,7 +357,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As expected, the process achieves a much greater revenue as a result of increasing conversion and lowering the inlet temperature to the Flash unit to encourage methanol recovery in the liquid phase. The results show a slight increase in equipment and operating costs from these changes, as well as a small loss of methanol in the exhuast." + "As expected, the process achieves a much greater revenue as a result of increasing conversion and lowering the inlet temperature to the Flash unit to encourage methanol recovery in the liquid phase. The results show a slight increase in equipment and operating costs from these changes, as well as a small loss of methanol in the exhaust." ] }, { @@ -556,7 +556,7 @@ "metadata": {}, "source": [ "## 5.3 Flowsheet Costing and Optimization\n", - "Now that we have a well-initialized and solved flowsheet, we can add process economics and optimize the revenue. We utilize IDAES costing tools to calculate reactor and flash vessel capital cost, and implement surrogate models to account for heat exchanger capital costs, reactor operating costs and utility costs for heating, cooling and electricity. As before, revenue is determined from total liquid methanol sales, operating costs, annualized capital costs and feed raw material costs. The flowsheet report method returns key process results, which are updated for new results with the prescence of a recycle stream:" + "Now that we have a well-initialized and solved flowsheet, we can add process economics and optimize the revenue. We utilize IDAES costing tools to calculate reactor and flash vessel capital cost, and implement surrogate models to account for heat exchanger capital costs, reactor operating costs and utility costs for heating, cooling and electricity. As before, revenue is determined from total liquid methanol sales, operating costs, annualized capital costs and feed raw material costs. The flowsheet report method returns key process results, which are updated for new results with the presence of a recycle stream:" ] }, { diff --git a/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_doc.ipynb b/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_doc.ipynb index 0c126bb1..6e83e8ed 100644 --- a/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_doc.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_doc.ipynb @@ -51,7 +51,7 @@ "source": [ "## 1. Introduction\n", "\n", - "This example demonstrates a simulation of methanol synthesis from hydrogen and carbon monoxide. Each methanol flowsheet module includes several built-in methods. This notebook demonstrates building the flowsheet, implementing model scaling, initialization and solving a square problem, costing and final constrainted optimization.\n", + "This example demonstrates a simulation of methanol synthesis from hydrogen and carbon monoxide. Each methanol flowsheet module includes several built-in methods. This notebook demonstrates building the flowsheet, implementing model scaling, initialization and solving a square problem, costing and final constrained optimization.\n", "\n", "The ```build_model()``` method creates the Pyomo concrete model and builds the flowsheet by importing thermophysical and reaction properties and unit models and defining stream connections between these units. This method also implements appropriate default scaling on state and property variables.\n", "\n", @@ -2164,7 +2164,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As expected, the process achieves a much greater revenue as a result of increasing conversion and lowering the inlet temperature to the Flash unit to encourage methanol recovery in the liquid phase. The results show a slight increase in equipment and operating costs from these changes, as well as a small loss of methanol in the exhuast." + "As expected, the process achieves a much greater revenue as a result of increasing conversion and lowering the inlet temperature to the Flash unit to encourage methanol recovery in the liquid phase. The results show a slight increase in equipment and operating costs from these changes, as well as a small loss of methanol in the exhaust." ] }, { @@ -2880,7 +2880,7 @@ "metadata": {}, "source": [ "## 5.3 Flowsheet Costing and Optimization\n", - "Now that we have a well-initialized and solved flowsheet, we can add process economics and optimize the revenue. We utilize IDAES costing tools to calculate reactor and flash vessel capital cost, and implement surrogate models to account for heat exchanger capital costs, reactor operating costs and utility costs for heating, cooling and electricity. As before, revenue is determined from total liquid methanol sales, operating costs, annualized capital costs and feed raw material costs. The flowsheet report method returns key process results, which are updated for new results with the prescence of a recycle stream:" + "Now that we have a well-initialized and solved flowsheet, we can add process economics and optimize the revenue. We utilize IDAES costing tools to calculate reactor and flash vessel capital cost, and implement surrogate models to account for heat exchanger capital costs, reactor operating costs and utility costs for heating, cooling and electricity. As before, revenue is determined from total liquid methanol sales, operating costs, annualized capital costs and feed raw material costs. The flowsheet report method returns key process results, which are updated for new results with the presence of a recycle stream:" ] }, { @@ -4123,4 +4123,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_test.ipynb b/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_test.ipynb index da4c6fec..a7ec0962 100644 --- a/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_test.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_test.ipynb @@ -51,7 +51,7 @@ "source": [ "## 1. Introduction\n", "\n", - "This example demonstrates a simulation of methanol synthesis from hydrogen and carbon monoxide. Each methanol flowsheet module includes several built-in methods. This notebook demonstrates building the flowsheet, implementing model scaling, initialization and solving a square problem, costing and final constrainted optimization.\n", + "This example demonstrates a simulation of methanol synthesis from hydrogen and carbon monoxide. Each methanol flowsheet module includes several built-in methods. This notebook demonstrates building the flowsheet, implementing model scaling, initialization and solving a square problem, costing and final constrained optimization.\n", "\n", "The ```build_model()``` method creates the Pyomo concrete model and builds the flowsheet by importing thermophysical and reaction properties and unit models and defining stream connections between these units. This method also implements appropriate default scaling on state and property variables.\n", "\n", @@ -357,7 +357,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As expected, the process achieves a much greater revenue as a result of increasing conversion and lowering the inlet temperature to the Flash unit to encourage methanol recovery in the liquid phase. The results show a slight increase in equipment and operating costs from these changes, as well as a small loss of methanol in the exhuast." + "As expected, the process achieves a much greater revenue as a result of increasing conversion and lowering the inlet temperature to the Flash unit to encourage methanol recovery in the liquid phase. The results show a slight increase in equipment and operating costs from these changes, as well as a small loss of methanol in the exhaust." ] }, { @@ -556,7 +556,7 @@ "metadata": {}, "source": [ "## 5.3 Flowsheet Costing and Optimization\n", - "Now that we have a well-initialized and solved flowsheet, we can add process economics and optimize the revenue. We utilize IDAES costing tools to calculate reactor and flash vessel capital cost, and implement surrogate models to account for heat exchanger capital costs, reactor operating costs and utility costs for heating, cooling and electricity. As before, revenue is determined from total liquid methanol sales, operating costs, annualized capital costs and feed raw material costs. The flowsheet report method returns key process results, which are updated for new results with the prescence of a recycle stream:" + "Now that we have a well-initialized and solved flowsheet, we can add process economics and optimize the revenue. We utilize IDAES costing tools to calculate reactor and flash vessel capital cost, and implement surrogate models to account for heat exchanger capital costs, reactor operating costs and utility costs for heating, cooling and electricity. As before, revenue is determined from total liquid methanol sales, operating costs, annualized capital costs and feed raw material costs. The flowsheet report method returns key process results, which are updated for new results with the presence of a recycle stream:" ] }, { @@ -730,4 +730,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_usr.ipynb b/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_usr.ipynb index 6dc05f0e..86592750 100644 --- a/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_usr.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/methanol_synthesis_usr.ipynb @@ -51,7 +51,7 @@ "source": [ "## 1. Introduction\n", "\n", - "This example demonstrates a simulation of methanol synthesis from hydrogen and carbon monoxide. Each methanol flowsheet module includes several built-in methods. This notebook demonstrates building the flowsheet, implementing model scaling, initialization and solving a square problem, costing and final constrainted optimization.\n", + "This example demonstrates a simulation of methanol synthesis from hydrogen and carbon monoxide. Each methanol flowsheet module includes several built-in methods. This notebook demonstrates building the flowsheet, implementing model scaling, initialization and solving a square problem, costing and final constrained optimization.\n", "\n", "The ```build_model()``` method creates the Pyomo concrete model and builds the flowsheet by importing thermophysical and reaction properties and unit models and defining stream connections between these units. This method also implements appropriate default scaling on state and property variables.\n", "\n", @@ -329,7 +329,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As expected, the process achieves a much greater revenue as a result of increasing conversion and lowering the inlet temperature to the Flash unit to encourage methanol recovery in the liquid phase. The results show a slight increase in equipment and operating costs from these changes, as well as a small loss of methanol in the exhuast." + "As expected, the process achieves a much greater revenue as a result of increasing conversion and lowering the inlet temperature to the Flash unit to encourage methanol recovery in the liquid phase. The results show a slight increase in equipment and operating costs from these changes, as well as a small loss of methanol in the exhaust." ] }, { @@ -492,7 +492,7 @@ "metadata": {}, "source": [ "## 5.3 Flowsheet Costing and Optimization\n", - "Now that we have a well-initialized and solved flowsheet, we can add process economics and optimize the revenue. We utilize IDAES costing tools to calculate reactor and flash vessel capital cost, and implement surrogate models to account for heat exchanger capital costs, reactor operating costs and utility costs for heating, cooling and electricity. As before, revenue is determined from total liquid methanol sales, operating costs, annualized capital costs and feed raw material costs. The flowsheet report method returns key process results, which are updated for new results with the prescence of a recycle stream:" + "Now that we have a well-initialized and solved flowsheet, we can add process economics and optimize the revenue. We utilize IDAES costing tools to calculate reactor and flash vessel capital cost, and implement surrogate models to account for heat exchanger capital costs, reactor operating costs and utility costs for heating, cooling and electricity. As before, revenue is determined from total liquid methanol sales, operating costs, annualized capital costs and feed raw material costs. The flowsheet report method returns key process results, which are updated for new results with the presence of a recycle stream:" ] }, { @@ -626,4 +626,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/gt_baseline.svg b/idaes_examples/notebooks/docs/flowsheets/power_gen/ngcc/data_pfds/gt_baseline.svg similarity index 100% rename from idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/gt_baseline.svg rename to idaes_examples/notebooks/docs/flowsheets/power_gen/ngcc/data_pfds/gt_baseline.svg diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/hrsg_baseline.svg b/idaes_examples/notebooks/docs/flowsheets/power_gen/ngcc/data_pfds/hrsg_baseline.svg similarity index 100% rename from idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/hrsg_baseline.svg rename to idaes_examples/notebooks/docs/flowsheets/power_gen/ngcc/data_pfds/hrsg_baseline.svg diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/st_baseline.svg b/idaes_examples/notebooks/docs/flowsheets/power_gen/ngcc/data_pfds/st_baseline.svg similarity index 100% rename from idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/st_baseline.svg rename to idaes_examples/notebooks/docs/flowsheets/power_gen/ngcc/data_pfds/st_baseline.svg diff --git a/idaes_examples/notebooks/docs/flowsheets/results.txt b/idaes_examples/notebooks/docs/flowsheets/results.txt new file mode 100644 index 00000000..d344d467 --- /dev/null +++ b/idaes_examples/notebooks/docs/flowsheets/results.txt @@ -0,0 +1,116 @@ +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.pressure_crit' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.temperature_crit' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.mw_comp' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.dens_liq_param_1' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.dens_liq_param_2' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.dens_liq_param_3' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.dens_liq_param_4' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.temperature_boil' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.cp_ig_1' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.cp_ig_2' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.cp_ig_3' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.cp_ig_4' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.cp_ig_5' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.pressure_sat_coeff_A' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.pressure_sat_coeff_B' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.pressure_sat_coeff_C' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BTHM_params.dh_vap' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BT_params.pressure_critical' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BT_params.temperature_critical' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BT_params.mw_comp' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BT_params.dh_form' to mutable. +WARNING: Params with units must be mutable. Converting Param +'fs.BT_params.ds_form' to mutable. +fs.M101 + +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Ipopt 3.13.2: nlp_scaling_method=gradient-based +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: tol=1e-06 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: max_iter=200 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: ****************************************************************************** +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: This program contains Ipopt, a library for large-scale nonlinear optimization. +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Ipopt is released as open source code under the Eclipse Public License (EPL). +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: For more information visit http://projects.coin-or.org/Ipopt +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: This version of Ipopt was compiled from source code available at +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: https://github.com/IDAES/Ipopt as part of the Institute for the Design of +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Advanced Energy Systems Process Systems Engineering Framework (IDAES PSE +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Framework) Copyright (c) 2018-2019. See https://github.com/IDAES/idaes-pse. +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: This version of Ipopt was compiled using HSL, a collection of Fortran codes +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: for large-scale scientific computation. All technical papers, sales and +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: publicity material resulting from use of the HSL codes within IPOPT must +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: contain the following acknowledgement: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: HSL, a collection of Fortran codes for large-scale scientific +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: computation. See http://www.hsl.rl.ac.uk. +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: ****************************************************************************** +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: This is Ipopt version 3.13.2, running with linear solver ma27. +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of nonzeros in equality constraint Jacobian...: 119 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of nonzeros in inequality constraint Jacobian.: 0 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of nonzeros in Lagrangian Hessian.............: 65 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Total number of variables............................: 53 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: variables with only lower bounds: 0 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: variables with lower and upper bounds: 10 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: variables with only upper bounds: 0 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Total number of equality constraints.................: 53 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Total number of inequality constraints...............: 0 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: inequality constraints with only lower bounds: 0 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: inequality constraints with lower and upper bounds: 0 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: inequality constraints with only upper bounds: 0 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: 0 0.0000000e+00 3.50e+05 0.00e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: 1 0.0000000e+00 2.49e+05 1.88e+02 -1.0 3.50e+05 - 5.25e-03 1.00e+00h 1 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: 2 0.0000000e+00 1.17e+03 8.88e-01 -1.0 2.49e+05 - 7.16e-01 9.95e-01h 1 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: 3 0.0000000e+00 8.20e-07 6.34e-04 -1.0 1.17e+03 - 9.89e-01 1.00e+00h 1 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of Iterations....: 3 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: (scaled) (unscaled) +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Objective...............: 0.0000000000000000e+00 0.0000000000000000e+00 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Dual infeasibility......: 0.0000000000000000e+00 0.0000000000000000e+00 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Constraint violation....: 8.9849861361974459e-10 8.1956386566162109e-07 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Complementarity.........: 0.0000000000000000e+00 0.0000000000000000e+00 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Overall NLP error.......: 8.9849861361974459e-10 8.1956386566162109e-07 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of objective function evaluations = 4 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of objective gradient evaluations = 4 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of equality constraint evaluations = 4 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of inequality constraint evaluations = 0 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of equality constraint Jacobian evaluations = 4 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of inequality constraint Jacobian evaluations = 0 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Number of Lagrangian Hessian evaluations = 3 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Total CPU secs in IPOPT (w/o function evaluations) = 0.002 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: Total CPU secs in NLP function evaluations = 0.000 +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: +2024-05-16 20:53:29 [DEBUG] idaes.solve.fs.M101: EXIT: Optimal Solution Found. +2024-05-16 20:53:30 [INFO] idaes.init.fs.M101: Initialization Complete: optimal - Optimal Solution Found +fs.H101 + +2024-05-16 20:53:30 [INFO] idaes.init.fs.H101: Step 1: preparation complete. diff --git a/idaes_examples/notebooks/docs/flowsheets/solver_captured.py b/idaes_examples/notebooks/docs/flowsheets/solver_captured.py index e0330b40..9c342a70 100644 --- a/idaes_examples/notebooks/docs/flowsheets/solver_captured.py +++ b/idaes_examples/notebooks/docs/flowsheets/solver_captured.py @@ -11,7 +11,7 @@ # for full copyright and license information. ################################################################################# """ -Captured sover +Captured solver """ import json @@ -35,7 +35,7 @@ def __init__(self, model, report=None): def solve(self, solver): solver = CapturedSolver(solver) self._result = solver.solve(self._model) - self._text = solver.ouput_text + self._text = solver.output_text return self._result def report(self): @@ -63,7 +63,7 @@ def solve(self, model, **kwargs): return self._solve_captured(model) @property - def ouput_text(self): + def output_text(self): p = self._output.index(self._outsep) output = self._output if p == -1 else self._output[:p] return "\n".join(output) diff --git a/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption.ipynb b/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption.ipynb index afb85e8e..5f335183 100644 --- a/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption.ipynb @@ -67,7 +67,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Import Pyomo pakages \n", + "### Import Pyomo packages \n", "\n", "We will need the following components from the pyomo libraries.\n", "\n", @@ -162,7 +162,7 @@ "metadata": {}, "outputs": [], "source": [ - "# create concret model\n", + "# create concrete model\n", "m = ConcreteModel()\n", "\n", "# create flowsheet\n", diff --git a/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_doc.ipynb b/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_doc.ipynb index 01e1d2a4..7b5c1930 100644 --- a/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_doc.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_doc.ipynb @@ -67,7 +67,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Import Pyomo pakages \n", + "### Import Pyomo packages \n", "\n", "We will need the following components from the pyomo libraries.\n", "\n", @@ -162,7 +162,7 @@ "metadata": {}, "outputs": [], "source": [ - "# create concret model\n", + "# create concrete model\n", "m = ConcreteModel()\n", "\n", "# create flowsheet\n", @@ -607,4 +607,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_test.ipynb b/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_test.ipynb index 0205b289..7fc0adf4 100644 --- a/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_test.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_test.ipynb @@ -67,7 +67,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Import Pyomo pakages \n", + "### Import Pyomo packages \n", "\n", "We will need the following components from the pyomo libraries.\n", "\n", @@ -162,7 +162,7 @@ "metadata": {}, "outputs": [], "source": [ - "# create concret model\n", + "# create concrete model\n", "m = ConcreteModel()\n", "\n", "# create flowsheet\n", @@ -640,4 +640,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_usr.ipynb b/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_usr.ipynb index 01e1d2a4..7b5c1930 100644 --- a/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_usr.ipynb +++ b/idaes_examples/notebooks/docs/flowsheets/temperature_swing_adsorption/temperature_swing_adsorption_usr.ipynb @@ -67,7 +67,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Import Pyomo pakages \n", + "### Import Pyomo packages \n", "\n", "We will need the following components from the pyomo libraries.\n", "\n", @@ -162,7 +162,7 @@ "metadata": {}, "outputs": [], "source": [ - "# create concret model\n", + "# create concrete model\n", "m = ConcreteModel()\n", "\n", "# create flowsheet\n", @@ -607,4 +607,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/flowsheets/trial.ipynb b/idaes_examples/notebooks/docs/flowsheets/trial.ipynb new file mode 100644 index 00000000..39290616 --- /dev/null +++ b/idaes_examples/notebooks/docs/flowsheets/trial.ipynb @@ -0,0 +1,1278 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.pressure_crit' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.temperature_crit' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.mw_comp' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.dens_liq_param_1' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.dens_liq_param_2' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.dens_liq_param_3' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.dens_liq_param_4' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.temperature_boil' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.cp_ig_1' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.cp_ig_2' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.cp_ig_3' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.cp_ig_4' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.cp_ig_5' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.pressure_sat_coeff_A' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.pressure_sat_coeff_B' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.pressure_sat_coeff_C' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BTHM_params.dh_vap' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BT_params.pressure_critical' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BT_params.temperature_critical' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BT_params.mw_comp' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BT_params.dh_form' to mutable.\n", + "WARNING: Params with units must be mutable. Converting Param\n", + "'fs.BT_params.ds_form' to mutable.\n" + ] + } + ], + "source": [ + "from pyomo.environ import (\n", + " Constraint,\n", + " Var,\n", + " ConcreteModel,\n", + " Expression,\n", + " Objective,\n", + " TransformationFactory,\n", + " value,\n", + ")\n", + "# Todo: Import the above mentioned tools from pyomo.network\n", + "from pyomo.network import Arc, SequentialDecomposition\n", + "from idaes.core import FlowsheetBlock\n", + "\n", + "from idaes.models.unit_models import (\n", + " PressureChanger,\n", + " Mixer,\n", + " Separator as Splitter,\n", + " Heater,\n", + " CSTR,\n", + " Flash,\n", + " Translator,\n", + ")\n", + "\n", + "from idaes.models_extra.column_models import TrayColumn\n", + "from idaes.models_extra.column_models.condenser import CondenserType, TemperatureSpec\n", + "# Utility tools to put together the flowsheet and calculate the degrees of freedom\n", + "from idaes.models.unit_models.pressure_changer import ThermodynamicAssumption\n", + "from idaes.core.util.model_statistics import degrees_of_freedom\n", + "from idaes.core.util.initialization import propagate_state\n", + "from idaes.core.solvers import get_solver\n", + "import idaes.core.util.scaling as iscale\n", + "\n", + "# Import idaes logger to set output levels\n", + "import idaes.logger as idaeslog\n", + "\n", + "from idaes_examples.mod.hda import hda_reaction as reaction_props\n", + "from idaes.models.properties.activity_coeff_models.BTX_activity_coeff_VLE import (\n", + " BTXParameterBlock,\n", + ")\n", + "\n", + "from idaes_examples.mod.hda.hda_ideal_VLE import HDAParameterBlock\n", + "# Create a Pyomo Concrete Model to contain the problem\n", + "m = ConcreteModel()\n", + "\n", + "# Add a steady state flowsheet block to the model\n", + "m.fs = FlowsheetBlock(dynamic=False)\n", + "# Property package for benzene, toluene, hydrogen, methane mixture\n", + "m.fs.BTHM_params = HDAParameterBlock()\n", + "\n", + "# Property package for the benzene-toluene mixture\n", + "m.fs.BT_params = BTXParameterBlock(\n", + " valid_phase=(\"Liq\", \"Vap\"), activity_coeff_model=\"Ideal\"\n", + ")\n", + "\n", + "# Reaction package for the HDA reaction\n", + "m.fs.reaction_params = reaction_props.HDAReactionParameterBlock(\n", + " property_package=m.fs.BTHM_params\n", + ")\n", + "# Adding the mixer M101 to the flowsheet\n", + "m.fs.M101 = Mixer(\n", + " property_package=m.fs.BTHM_params,\n", + " inlet_list=[\"toluene_feed\", \"hydrogen_feed\", \"vapor_recycle\"],\n", + ")\n", + "\n", + "# Adding the heater H101 to the flowsheet\n", + "m.fs.H101 = Heater(property_package=m.fs.BTHM_params, has_phase_equilibrium=True)\n", + "# Todo: Add reactor with the specifications above\n", + "m.fs.R101 = CSTR(\n", + " property_package=m.fs.BTHM_params,\n", + " reaction_package=m.fs.reaction_params,\n", + " has_heat_of_reaction=True,\n", + " has_heat_transfer=True,\n", + ")\n", + "\n", + "# Adding the flash tank F101 to the flowsheet\n", + "m.fs.F101 = Flash(\n", + " property_package=m.fs.BTHM_params, has_heat_transfer=True, has_pressure_change=True\n", + ")\n", + "\n", + "# Adding the splitter S101 to the flowsheet\n", + "m.fs.S101 = Splitter(\n", + " property_package=m.fs.BTHM_params, outlet_list=[\"purge\", \"recycle\"]\n", + ")\n", + "\n", + "# Adding the compressor C101 to the flowsheet\n", + "m.fs.C101 = PressureChanger(\n", + " property_package=m.fs.BTHM_params,\n", + " compressor=True,\n", + " thermodynamic_assumption=ThermodynamicAssumption.isothermal,\n", + ")\n", + "# Add translator block to convert between property packages\n", + "m.fs.translator = Translator(\n", + " inlet_property_package=m.fs.BTHM_params, outlet_property_package=m.fs.BT_params\n", + ")\n", + "# Add constraint: Total flow = benzene flow + toluene flow (molar)\n", + "m.fs.translator.eq_total_flow = Constraint(\n", + " expr=m.fs.translator.outlet.flow_mol[0]\n", + " == m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"benzene\"]\n", + " + m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"toluene\"]\n", + ")\n", + "\n", + "# Add constraint: Outlet temperature = Inlet temperature\n", + "m.fs.translator.eq_temperature = Constraint(\n", + " expr=m.fs.translator.outlet.temperature[0] == m.fs.translator.inlet.temperature[0]\n", + ")\n", + "\n", + "# Todo: Add constraint: Outlet pressure = Inlet pressure\n", + "m.fs.translator.eq_pressure = Constraint(\n", + " expr=m.fs.translator.outlet.pressure[0] == m.fs.translator.inlet.pressure[0]\n", + ")\n", + "\n", + "# Remaining constraints on the translator block\n", + "\n", + "# Add constraint: Benzene mole fraction definition\n", + "m.fs.translator.eq_mole_frac_benzene = Constraint(\n", + " expr=m.fs.translator.outlet.mole_frac_comp[0, \"benzene\"]\n", + " == m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"benzene\"]\n", + " / (\n", + " m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"benzene\"]\n", + " + m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"toluene\"]\n", + " + m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"hydrogen\"]\n", + " + m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"methane\"]\n", + " )\n", + ")\n", + "\n", + "# Add constraint: Toluene mole fraction definition\n", + "m.fs.translator.eq_mole_frac_toluene = Constraint(\n", + " expr=m.fs.translator.outlet.mole_frac_comp[0, \"toluene\"]\n", + " == m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"toluene\"]\n", + " / (\n", + " m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"benzene\"]\n", + " + m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"toluene\"]\n", + " + m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"hydrogen\"]\n", + " + m.fs.translator.inlet.flow_mol_phase_comp[0, \"Liq\", \"methane\"]\n", + " )\n", + ")\n", + "# Todo: Add the Heater H102 to the flowsheet\n", + "m.fs.H102 = Heater(\n", + " property_package=m.fs.BT_params,\n", + " has_pressure_change=True,\n", + " has_phase_equilibrium=True,\n", + ")\n", + "\n", + "m.fs.s03 = Arc(source=m.fs.M101.outlet, destination=m.fs.H101.inlet)\n", + "\n", + "# Todo: Connect the H101 outlet to R101 inlet\n", + "m.fs.s04 = Arc(source=m.fs.H101.outlet, destination=m.fs.R101.inlet)\n", + "m.fs.s05 = Arc(source=m.fs.R101.outlet, destination=m.fs.F101.inlet)\n", + "m.fs.s06 = Arc(source=m.fs.F101.vap_outlet, destination=m.fs.S101.inlet)\n", + "m.fs.s08 = Arc(source=m.fs.S101.recycle, destination=m.fs.C101.inlet)\n", + "m.fs.s09 = Arc(source=m.fs.C101.outlet, destination=m.fs.M101.vapor_recycle)\n", + "m.fs.s10a = Arc(source=m.fs.F101.liq_outlet, destination=m.fs.translator.inlet)\n", + "m.fs.s10b = Arc(source=m.fs.translator.outlet, destination=m.fs.H102.inlet)\n", + "\n", + "TransformationFactory(\"network.expand_arcs\").apply_to(m)\n", + "\n", + "# Define the conversion variables using 'Var'\n", + "m.fs.R101.conversion = Var(initialize=0.75, bounds=(0, 1))\n", + "\n", + "# Append the constraint to the model\n", + "m.fs.R101.conv_constraint = Constraint(\n", + " expr=m.fs.R101.conversion * m.fs.R101.inlet.flow_mol_phase_comp[0, \"Vap\", \"toluene\"]\n", + " == (\n", + " m.fs.R101.inlet.flow_mol_phase_comp[0, \"Vap\", \"toluene\"]\n", + " - m.fs.R101.outlet.flow_mol_phase_comp[0, \"Vap\", \"toluene\"]\n", + " )\n", + ")\n", + "\n", + "m.fs.M101.toluene_feed.flow_mol_phase_comp[0, \"Vap\", \"benzene\"].fix(1e-5)\n", + "m.fs.M101.toluene_feed.flow_mol_phase_comp[0, \"Vap\", \"toluene\"].fix(1e-5)\n", + "m.fs.M101.toluene_feed.flow_mol_phase_comp[0, \"Vap\", \"hydrogen\"].fix(1e-5)\n", + "m.fs.M101.toluene_feed.flow_mol_phase_comp[0, \"Vap\", \"methane\"].fix(1e-5)\n", + "m.fs.M101.toluene_feed.flow_mol_phase_comp[0, \"Liq\", \"benzene\"].fix(1e-5)\n", + "m.fs.M101.toluene_feed.flow_mol_phase_comp[0, \"Liq\", \"toluene\"].fix(0.30)\n", + "m.fs.M101.toluene_feed.flow_mol_phase_comp[0, \"Liq\", \"hydrogen\"].fix(1e-5)\n", + "m.fs.M101.toluene_feed.flow_mol_phase_comp[0, \"Liq\", \"methane\"].fix(1e-5)\n", + "m.fs.M101.toluene_feed.temperature.fix(303.2)\n", + "m.fs.M101.toluene_feed.pressure.fix(350000)\n", + "\n", + "m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, \"Vap\", \"benzene\"].fix(1e-5)\n", + "m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, \"Vap\", \"toluene\"].fix(1e-5)\n", + "m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, \"Vap\", \"hydrogen\"].fix(0.30)\n", + "m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, \"Vap\", \"methane\"].fix(0.02)\n", + "m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, \"Liq\", \"benzene\"].fix(1e-5)\n", + "m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, \"Liq\", \"toluene\"].fix(1e-5)\n", + "m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, \"Liq\", \"hydrogen\"].fix(1e-5)\n", + "m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, \"Liq\", \"methane\"].fix(1e-5)\n", + "m.fs.M101.hydrogen_feed.temperature.fix(303.2)\n", + "m.fs.M101.hydrogen_feed.pressure.fix(350000)\n", + "\n", + "# Fix the temperature of the outlet from the heater H101\n", + "m.fs.H101.outlet.temperature.fix(600)\n", + "\n", + "# Todo: Fix the 'conversion' of the reactor R101\n", + "m.fs.R101.conversion.fix(0.75)\n", + "\n", + "# Todo: Fix the 'heat_duty' of the reactor R101\n", + "m.fs.R101.heat_duty.fix(0)\n", + "\n", + "# Fix the temperature of the vapor outlet from F101\n", + "m.fs.F101.vap_outlet.temperature.fix(325.0)\n", + "\n", + "# Fix the pressure drop in the flash F101\n", + "m.fs.F101.deltaP.fix(0)\n", + "\n", + "# Fix the split fraction of the 'purge' stream from S101\n", + "m.fs.S101.split_fraction[0, \"purge\"].fix(0.2)\n", + "\n", + "# Fix the pressure of the outlet from the compressor C101\n", + "m.fs.C101.outlet.pressure.fix(350000)\n", + "\n", + "# Fix the temperature of the outlet from the heater H102\n", + "m.fs.H102.outlet.temperature.fix(375)\n", + "\n", + "# Fix the pressure drop in the heater H102\n", + "m.fs.H102.deltaP.fix(-200000)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Set scaling factors for heat duty, reaction extent and volume\n", + "iscale.set_scaling_factor(m.fs.H101.control_volume.heat, 1e-2)\n", + "iscale.set_scaling_factor(m.fs.R101.control_volume.heat, 1e-2)\n", + "iscale.set_scaling_factor(m.fs.R101.control_volume.rate_reaction_extent, 1)\n", + "iscale.set_scaling_factor(m.fs.R101.control_volume.volume, 1)\n", + "iscale.set_scaling_factor(m.fs.F101.control_volume.heat, 1e-2)\n", + "iscale.set_scaling_factor(m.fs.H102.control_volume.heat, 1e-2)\n", + "\n", + "# iscale.set_scaling_factor(m.fs.F101.control_volume.properties_out[0.0].pressure_sat['hydrogen'], 8.234E+07)\n", + "# iscale.set_scaling_factor(m.fs.H101.control_volume.properties_out[0.0].pressure_sat['hydrogen'], 8.592E+07)\n", + "iscale.set_scaling_factor(m.fs.R101.control_volume.properties_out[0.0].temperature, 5.811E-05)\n", + "iscale.set_scaling_factor(m.fs.F101.control_volume.properties_in[0.0].temperature, 5.811E-05)\n", + "iscale.set_scaling_factor(m.fs.C101.ratioP[0.0],3.500E-05)\n", + "iscale.set_scaling_factor(m.fs.F101.control_volume.properties_out[0.0].pressure_sat['methane'], 3.343E06)\n", + " \n", + "# iscale.calculate_scaling_factors(m.fs.H101)\n", + "# iscale.calculate_scaling_factors(m.fs.R101)\n", + "# iscale.calculate_scaling_factors(m.fs.F101)\n", + "# iscale.calculate_scaling_factors(m.fs.H102)\n", + "# iscale.calculate_scaling_factors(m.fs.S101)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "seq = SequentialDecomposition()\n", + "seq.options.select_tear_method = \"heuristic\"\n", + "seq.options.tear_method = \"Wegstein\"\n", + "seq.options.iterLim = 3\n", + "\n", + "# Using the SD tool\n", + "G = seq.create_graph(m)\n", + "heuristic_tear_set = seq.tear_set_arcs(G, method=\"heuristic\")\n", + "order = seq.calculation_order(G)\n", + "\n", + "tear_guesses = {\n", + " \"flow_mol_phase_comp\": {\n", + " (0, \"Vap\", \"benzene\"): 1e-5,\n", + " (0, \"Vap\", \"toluene\"): 1e-5,\n", + " (0, \"Vap\", \"hydrogen\"): 0.30,\n", + " (0, \"Vap\", \"methane\"): 0.02,\n", + " (0, \"Liq\", \"benzene\"): 1e-5,\n", + " (0, \"Liq\", \"toluene\"): 0.30,\n", + " (0, \"Liq\", \"hydrogen\"): 1e-5,\n", + " (0, \"Liq\", \"methane\"): 1e-5,\n", + " },\n", + " \"temperature\": {0: 303},\n", + " \"pressure\": {0: 350000},\n", + "}\n", + "\n", + "# Pass the tear_guess to the SD tool\n", + "seq.set_guesses_for(m.fs.H101.inlet, tear_guesses)\n", + "\n", + "from idaes.core.initialization.block_triangularization import BlockTriangularizationInitializer\n", + "initializer = BlockTriangularizationInitializer(constraint_tolerance=1e-4)\n", + "def function(unit):\n", + " print(unit.name)\n", + " if isinstance(unit, Heater): # Heaters have their own initialization method\n", + " unit.initialize(outlvl=idaeslog.INFO)\n", + " else:\n", + " status = initializer.initialize(unit, output_level=idaeslog.INFO)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "seq = SequentialDecomposition()\n", + "seq.options.select_tear_method = \"heuristic\"\n", + "seq.options.tear_method = \"Wegstein\"\n", + "seq.options.iterLim = 3\n", + "\n", + "# Using the SD tool\n", + "G = seq.create_graph(m)\n", + "heuristic_tear_set = seq.tear_set_arcs(G, method=\"heuristic\")\n", + "order = seq.calculation_order(G)\n", + "\n", + "tear_guesses = {\n", + " \"flow_mol_phase_comp\": {\n", + " (0, \"Vap\", \"benzene\"): 1e-5,\n", + " (0, \"Vap\", \"toluene\"): 1e-5,\n", + " (0, \"Vap\", \"hydrogen\"): 0.30,\n", + " (0, \"Vap\", \"methane\"): 0.02,\n", + " (0, \"Liq\", \"benzene\"): 1e-5,\n", + " (0, \"Liq\", \"toluene\"): 0.30,\n", + " (0, \"Liq\", \"hydrogen\"): 1e-5,\n", + " (0, \"Liq\", \"methane\"): 1e-5,\n", + " },\n", + " \"temperature\": {0: 303},\n", + " \"pressure\": {0: 350000},\n", + "}\n", + "\n", + "# Pass the tear_guess to the SD tool\n", + "seq.set_guesses_for(m.fs.H101.inlet, tear_guesses)\n", + "\n", + "def function(unit):\n", + " print(unit.name)\n", + " try:\n", + " print(unit.default_initializer())\n", + " initializer = unit.default_initializer()\n", + " initializer.initialize(unit, output_level=idaeslog.INFO)\n", + " except:\n", + " print(f'{unit} did not initialize well')\n", + " print(initializer.initialize(unit, output_level=idaeslog.INFO))\n", + " # if isinstance(unit, Heater): # Heaters have their own initialization method\n", + " # unit.initialize(outlvl=idaeslog.INFO)\n", + " # else:\n", + " # status = initializer.initialize(unit, output_level=idaeslog.INFO)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "fs.H101\n", + "\n", + "fs.H101 did not initialize well\n" + ] + }, + { + "ename": "NotImplementedError", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNotImplementedError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[60], line 34\u001b[0m, in \u001b[0;36mfunction\u001b[1;34m(unit)\u001b[0m\n\u001b[0;32m 33\u001b[0m initializer \u001b[38;5;241m=\u001b[39m unit\u001b[38;5;241m.\u001b[39mdefault_initializer()\n\u001b[1;32m---> 34\u001b[0m \u001b[43minitializer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialize\u001b[49m\u001b[43m(\u001b[49m\u001b[43munit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput_level\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43midaeslog\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mINFO\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 35\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m:\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\initializer_base.py:192\u001b[0m, in \u001b[0;36mInitializerBase.initialize\u001b[1;34m(self, model, initial_guesses, json_file, output_level, exclude_unused_vars)\u001b[0m\n\u001b[0;32m 188\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 189\u001b[0m \u001b[38;5;66;03m# Base method does not have a return (NotImplementedError),\u001b[39;00m\n\u001b[0;32m 190\u001b[0m \u001b[38;5;66;03m# but we expect this to be overloaded, disable pylint warning\u001b[39;00m\n\u001b[0;32m 191\u001b[0m \u001b[38;5;66;03m# pylint: disable=E1111\u001b[39;00m\n\u001b[1;32m--> 192\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialization_routine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 193\u001b[0m \u001b[38;5;66;03m# 6. finally: Restore model state\u001b[39;00m\n\u001b[0;32m 194\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\general_hierarchical.py:70\u001b[0m, in \u001b[0;36mSingleControlVolumeUnitInitializer.initialization_routine\u001b[1;34m(self, model, plugin_initializer_args, copy_inlet_state)\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;66;03m# The default initialization_routine is sufficient\u001b[39;00m\n\u001b[1;32m---> 70\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialization_routine\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 71\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 72\u001b[0m \u001b[43m \u001b[49m\u001b[43mplugin_initializer_args\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mplugin_initializer_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 73\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy_inlet_state\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy_inlet_state\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 74\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\initializer_base.py:676\u001b[0m, in \u001b[0;36mModularInitializerBase.initialization_routine\u001b[1;34m(self, model, plugin_initializer_args, **kwargs)\u001b[0m\n\u001b[0;32m 675\u001b[0m \u001b[38;5;66;03m# Initialize model and sub-models\u001b[39;00m\n\u001b[1;32m--> 676\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minitialize_submodels(\n\u001b[0;32m 677\u001b[0m model, plugin_initializer_args, sub_initializers, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs\n\u001b[0;32m 678\u001b[0m )\n\u001b[0;32m 679\u001b[0m _log\u001b[38;5;241m.\u001b[39minfo_high(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStep 2: sub-model initialization complete.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\initializer_base.py:745\u001b[0m, in \u001b[0;36mModularInitializerBase.initialize_submodels\u001b[1;34m(self, model, plugin_initializer_args, sub_initializers, **kwargs)\u001b[0m\n\u001b[0;32m 744\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sm \u001b[38;5;129;01mis\u001b[39;00m model:\n\u001b[1;32m--> 745\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minitialize_main_model(model, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 746\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\general_hierarchical.py:100\u001b[0m, in \u001b[0;36mSingleControlVolumeUnitInitializer.initialize_main_model\u001b[1;34m(self, model, copy_inlet_state)\u001b[0m\n\u001b[0;32m 98\u001b[0m _log \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_logger(model)\n\u001b[1;32m--> 100\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialize_control_volume\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcontrol_volume\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy_inlet_state\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 102\u001b[0m \u001b[38;5;66;03m# Solve main model\u001b[39;00m\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\general_hierarchical.py:138\u001b[0m, in \u001b[0;36mSingleControlVolumeUnitInitializer.initialize_control_volume\u001b[1;34m(self, control_volume, copy_inlet_state)\u001b[0m\n\u001b[0;32m 136\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(control_volume, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mproperties_in\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[0;32m 137\u001b[0m \u001b[38;5;66;03m# 0-D control volume\u001b[39;00m\n\u001b[1;32m--> 138\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_init_props_0D\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcontrol_volume\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy_inlet_state\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 139\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 140\u001b[0m \u001b[38;5;66;03m# 1-D control volume\u001b[39;00m\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\general_hierarchical.py:155\u001b[0m, in \u001b[0;36mSingleControlVolumeUnitInitializer._init_props_0D\u001b[1;34m(self, control_volume, copy_inlet_state)\u001b[0m\n\u001b[0;32m 154\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m prop_init \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 155\u001b[0m \u001b[43mprop_init\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialize\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 156\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcontrol_volume\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mproperties_in\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 157\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_level\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_output_level\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 158\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 160\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m copy_inlet_state:\n\u001b[0;32m 161\u001b[0m \u001b[38;5;66;03m# Just in case the user set a different initializer for the outlet\u001b[39;00m\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\initializer_base.py:182\u001b[0m, in \u001b[0;36mInitializerBase.initialize\u001b[1;34m(self, model, initial_guesses, json_file, output_level, exclude_unused_vars)\u001b[0m\n\u001b[0;32m 181\u001b[0m \u001b[38;5;66;03m# 3. Fix states to make square\u001b[39;00m\n\u001b[1;32m--> 182\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfix_initialization_states\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 184\u001b[0m \u001b[38;5;66;03m# 4. Prechecks\u001b[39;00m\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\initializer_base.py:279\u001b[0m, in \u001b[0;36mInitializerBase.fix_initialization_states\u001b[1;34m(self, model)\u001b[0m\n\u001b[0;32m 278\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 279\u001b[0m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfix_initialization_states\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 280\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m:\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\base\\property_base.py:314\u001b[0m, in \u001b[0;36mStateBlock.fix_initialization_states\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 308\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 309\u001b[0m \u001b[38;5;124;03mFixes state variables for state blocks.\u001b[39;00m\n\u001b[0;32m 310\u001b[0m \n\u001b[0;32m 311\u001b[0m \u001b[38;5;124;03mReturns:\u001b[39;00m\n\u001b[0;32m 312\u001b[0m \u001b[38;5;124;03m None\u001b[39;00m\n\u001b[0;32m 313\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m--> 314\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m\n", + "\u001b[1;31mNotImplementedError\u001b[0m: ", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[1;31mNotImplementedError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[61], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mseq\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunction\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\javal\\anaconda3\\envs\\idaes-pse\\lib\\site-packages\\pyomo\\network\\decomposition.py:296\u001b[0m, in \u001b[0;36mSequentialDecomposition.run\u001b[1;34m(self, model, function)\u001b[0m\n\u001b[0;32m 293\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcache\u001b[38;5;241m.\u001b[39mclear()\n\u001b[0;32m 295\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 296\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_run_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunction\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 297\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 298\u001b[0m \u001b[38;5;66;03m# Cleanup\u001b[39;00m\n\u001b[0;32m 299\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcache\u001b[38;5;241m.\u001b[39mclear()\n", + "File \u001b[1;32mc:\\Users\\javal\\anaconda3\\envs\\idaes-pse\\lib\\site-packages\\pyomo\\network\\decomposition.py:317\u001b[0m, in \u001b[0;36mSequentialDecomposition._run_impl\u001b[1;34m(self, model, function)\u001b[0m\n\u001b[0;32m 315\u001b[0m logger\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStarting first pass run of network\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 316\u001b[0m order \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcalculation_order(G)\n\u001b[1;32m--> 317\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_order\u001b[49m\u001b[43m(\u001b[49m\u001b[43mG\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunction\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43muse_guesses\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[0;32m 319\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msolve_tears\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(tset):\n\u001b[0;32m 320\u001b[0m \u001b[38;5;66;03m# Not solving tears, we're done\u001b[39;00m\n\u001b[0;32m 321\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n", + "File \u001b[1;32mc:\\Users\\javal\\anaconda3\\envs\\idaes-pse\\lib\\site-packages\\pyomo\\network\\decomposition.py:407\u001b[0m, in \u001b[0;36mSequentialDecomposition.run_order\u001b[1;34m(self, G, order, function, ignore, use_guesses)\u001b[0m\n\u001b[0;32m 404\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mload_guesses(guesses, port, fixed_ins)\n\u001b[0;32m 405\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mload_values(port, default, fixed_ins, use_guesses)\n\u001b[1;32m--> 407\u001b[0m \u001b[43mfunction\u001b[49m\u001b[43m(\u001b[49m\u001b[43munit\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 409\u001b[0m \u001b[38;5;66;03m# free the inputs that were not already fixed\u001b[39;00m\n\u001b[0;32m 410\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m var \u001b[38;5;129;01min\u001b[39;00m fixed_ins:\n", + "Cell \u001b[1;32mIn[60], line 37\u001b[0m, in \u001b[0;36mfunction\u001b[1;34m(unit)\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[0;32m 36\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00munit\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m did not initialize well\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m---> 37\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43minitializer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialize\u001b[49m\u001b[43m(\u001b[49m\u001b[43munit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput_level\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43midaeslog\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mINFO\u001b[49m\u001b[43m)\u001b[49m)\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\initializer_base.py:192\u001b[0m, in \u001b[0;36mInitializerBase.initialize\u001b[1;34m(self, model, initial_guesses, json_file, output_level, exclude_unused_vars)\u001b[0m\n\u001b[0;32m 187\u001b[0m \u001b[38;5;66;03m# 5. try: Call specified initialization routine\u001b[39;00m\n\u001b[0;32m 188\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 189\u001b[0m \u001b[38;5;66;03m# Base method does not have a return (NotImplementedError),\u001b[39;00m\n\u001b[0;32m 190\u001b[0m \u001b[38;5;66;03m# but we expect this to be overloaded, disable pylint warning\u001b[39;00m\n\u001b[0;32m 191\u001b[0m \u001b[38;5;66;03m# pylint: disable=E1111\u001b[39;00m\n\u001b[1;32m--> 192\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialization_routine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 193\u001b[0m \u001b[38;5;66;03m# 6. finally: Restore model state\u001b[39;00m\n\u001b[0;32m 194\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 195\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrestore_model_state(model)\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\general_hierarchical.py:70\u001b[0m, in \u001b[0;36mSingleControlVolumeUnitInitializer.initialization_routine\u001b[1;34m(self, model, plugin_initializer_args, copy_inlet_state)\u001b[0m\n\u001b[0;32m 55\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 56\u001b[0m \u001b[38;5;124;03mCommon initialization routine for models with one control volume.\u001b[39;00m\n\u001b[0;32m 57\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 67\u001b[0m \u001b[38;5;124;03m Pyomo solver results object\u001b[39;00m\n\u001b[0;32m 68\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;66;03m# The default initialization_routine is sufficient\u001b[39;00m\n\u001b[1;32m---> 70\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialization_routine\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 71\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 72\u001b[0m \u001b[43m \u001b[49m\u001b[43mplugin_initializer_args\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mplugin_initializer_args\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 73\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy_inlet_state\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy_inlet_state\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 74\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\initializer_base.py:676\u001b[0m, in \u001b[0;36mModularInitializerBase.initialization_routine\u001b[1;34m(self, model, plugin_initializer_args, **kwargs)\u001b[0m\n\u001b[0;32m 673\u001b[0m _log\u001b[38;5;241m.\u001b[39minfo_high(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStep 1: preparation complete.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 675\u001b[0m \u001b[38;5;66;03m# Initialize model and sub-models\u001b[39;00m\n\u001b[1;32m--> 676\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minitialize_submodels(\n\u001b[0;32m 677\u001b[0m model, plugin_initializer_args, sub_initializers, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs\n\u001b[0;32m 678\u001b[0m )\n\u001b[0;32m 679\u001b[0m _log\u001b[38;5;241m.\u001b[39minfo_high(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStep 2: sub-model initialization complete.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 681\u001b[0m \u001b[38;5;66;03m# Solve full model including plug-ins\u001b[39;00m\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\initializer_base.py:745\u001b[0m, in \u001b[0;36mModularInitializerBase.initialize_submodels\u001b[1;34m(self, model, plugin_initializer_args, sub_initializers, **kwargs)\u001b[0m\n\u001b[0;32m 743\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m sm \u001b[38;5;129;01min\u001b[39;00m model\u001b[38;5;241m.\u001b[39minitialization_order:\n\u001b[0;32m 744\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sm \u001b[38;5;129;01mis\u001b[39;00m model:\n\u001b[1;32m--> 745\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minitialize_main_model(model, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 746\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 747\u001b[0m sub_initializers[sm]\u001b[38;5;241m.\u001b[39mplugin_initialize(\n\u001b[0;32m 748\u001b[0m sm, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mplugin_initializer_args[sm]\n\u001b[0;32m 749\u001b[0m )\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\general_hierarchical.py:100\u001b[0m, in \u001b[0;36mSingleControlVolumeUnitInitializer.initialize_main_model\u001b[1;34m(self, model, copy_inlet_state)\u001b[0m\n\u001b[0;32m 97\u001b[0m \u001b[38;5;66;03m# Get logger\u001b[39;00m\n\u001b[0;32m 98\u001b[0m _log \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_logger(model)\n\u001b[1;32m--> 100\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialize_control_volume\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcontrol_volume\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy_inlet_state\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 102\u001b[0m \u001b[38;5;66;03m# Solve main model\u001b[39;00m\n\u001b[0;32m 103\u001b[0m solve_log \u001b[38;5;241m=\u001b[39m idaeslog\u001b[38;5;241m.\u001b[39mgetSolveLogger(\n\u001b[0;32m 104\u001b[0m model\u001b[38;5;241m.\u001b[39mname, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_output_level(), tag\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124munit\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 105\u001b[0m )\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\general_hierarchical.py:138\u001b[0m, in \u001b[0;36mSingleControlVolumeUnitInitializer.initialize_control_volume\u001b[1;34m(self, control_volume, copy_inlet_state)\u001b[0m\n\u001b[0;32m 135\u001b[0m \u001b[38;5;66;03m# Initialize properties\u001b[39;00m\n\u001b[0;32m 136\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(control_volume, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mproperties_in\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[0;32m 137\u001b[0m \u001b[38;5;66;03m# 0-D control volume\u001b[39;00m\n\u001b[1;32m--> 138\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_init_props_0D\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcontrol_volume\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy_inlet_state\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 139\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 140\u001b[0m \u001b[38;5;66;03m# 1-D control volume\u001b[39;00m\n\u001b[0;32m 141\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_init_props_1D(control_volume)\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\general_hierarchical.py:155\u001b[0m, in \u001b[0;36mSingleControlVolumeUnitInitializer._init_props_0D\u001b[1;34m(self, control_volume, copy_inlet_state)\u001b[0m\n\u001b[0;32m 152\u001b[0m prop_init \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_submodel_initializer(control_volume\u001b[38;5;241m.\u001b[39mproperties_in)\n\u001b[0;32m 154\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m prop_init \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 155\u001b[0m \u001b[43mprop_init\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialize\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 156\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcontrol_volume\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mproperties_in\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 157\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_level\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_output_level\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 158\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 160\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m copy_inlet_state:\n\u001b[0;32m 161\u001b[0m \u001b[38;5;66;03m# Just in case the user set a different initializer for the outlet\u001b[39;00m\n\u001b[0;32m 162\u001b[0m prop_init \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_submodel_initializer(control_volume\u001b[38;5;241m.\u001b[39mproperties_out)\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\initializer_base.py:182\u001b[0m, in \u001b[0;36mInitializerBase.initialize\u001b[1;34m(self, model, initial_guesses, json_file, output_level, exclude_unused_vars)\u001b[0m\n\u001b[0;32m 177\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mload_initial_guesses(\n\u001b[0;32m 178\u001b[0m model, initial_guesses\u001b[38;5;241m=\u001b[39minitial_guesses, json_file\u001b[38;5;241m=\u001b[39mjson_file\n\u001b[0;32m 179\u001b[0m )\n\u001b[0;32m 181\u001b[0m \u001b[38;5;66;03m# 3. Fix states to make square\u001b[39;00m\n\u001b[1;32m--> 182\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfix_initialization_states\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 184\u001b[0m \u001b[38;5;66;03m# 4. Prechecks\u001b[39;00m\n\u001b[0;32m 185\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprecheck(model)\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\initialization\\initializer_base.py:279\u001b[0m, in \u001b[0;36mInitializerBase.fix_initialization_states\u001b[1;34m(self, model)\u001b[0m\n\u001b[0;32m 268\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 269\u001b[0m \u001b[38;5;124;03mCall to model.fix_initialization_states method. Method will pass if\u001b[39;00m\n\u001b[0;32m 270\u001b[0m \u001b[38;5;124;03mfix_initialization_states not found.\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 276\u001b[0m \u001b[38;5;124;03m None\u001b[39;00m\n\u001b[0;32m 277\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 278\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 279\u001b[0m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfix_initialization_states\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 280\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m:\n\u001b[0;32m 281\u001b[0m _log\u001b[38;5;241m.\u001b[39minfo_high(\n\u001b[0;32m 282\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mModel \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmodel\u001b[38;5;241m.\u001b[39mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m does not have a fix_initialization_states method - attempting to continue.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 283\u001b[0m )\n", + "File \u001b[1;32mc:\\users\\javal\\desktop\\internship\\idaes-pse\\idaes\\core\\base\\property_base.py:314\u001b[0m, in \u001b[0;36mStateBlock.fix_initialization_states\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 307\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfix_initialization_states\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m 308\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 309\u001b[0m \u001b[38;5;124;03m Fixes state variables for state blocks.\u001b[39;00m\n\u001b[0;32m 310\u001b[0m \n\u001b[0;32m 311\u001b[0m \u001b[38;5;124;03m Returns:\u001b[39;00m\n\u001b[0;32m 312\u001b[0m \u001b[38;5;124;03m None\u001b[39;00m\n\u001b[0;32m 313\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 314\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m\n", + "\u001b[1;31mNotImplementedError\u001b[0m: " + ] + } + ], + "source": [ + "seq.run(m, function)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING: model contains export suffix 'scaling_factor' that contains 1\n", + "component keys that are not exported as part of the NL file. Skipping.\n", + "====================================================================================\n", + "Model Statistics\n", + "\n", + " Jacobian Condition Number: 2.551E+23\n", + "\n", + "------------------------------------------------------------------------------------\n", + "4 WARNINGS\n", + "\n", + " WARNING: 11 Constraints with large residuals (>1.0E-05)\n", + " WARNING: 4 Variables at or outside bounds (tol=0.0E+00)\n", + " WARNING: 28 Variables with extreme Jacobian values (<1.0E-08 or >1.0E+08)\n", + " WARNING: 9 Constraints with extreme Jacobian values (<1.0E-08 or >1.0E+08)\n", + "\n", + "------------------------------------------------------------------------------------\n", + "6 Cautions\n", + "\n", + " Caution: 68 Variables with value close to their bounds (abs=1.0E-04, rel=1.0E-04)\n", + " Caution: 67 Variables with value close to zero (tol=1.0E-08)\n", + " Caution: 138 Variables with extreme value (<1.0E-04 or >1.0E+04)\n", + " Caution: 99 Variables with extreme Jacobian values (<1.0E-04 or >1.0E+04)\n", + " Caution: 63 Constraints with extreme Jacobian values (<1.0E-04 or >1.0E+04)\n", + " Caution: 232 extreme Jacobian Entries (<1.0E-04 or >1.0E+04)\n", + "\n", + "------------------------------------------------------------------------------------\n", + "Suggested next steps:\n", + "\n", + " display_constraints_with_large_residuals()\n", + " display_variables_at_or_outside_bounds()\n", + " display_variables_with_extreme_jacobians()\n", + " display_constraints_with_extreme_jacobians()\n", + "\n", + "====================================================================================\n" + ] + } + ], + "source": [ + "from idaes.core.util import DiagnosticsToolbox\n", + "dt=DiagnosticsToolbox(m)\n", + "dt.report_numerical_issues()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING: model contains export suffix 'scaling_factor' that contains 1\n", + "component keys that are not exported as part of the NL file. Skipping.\n", + "====================================================================================\n", + "The following variable(s) are associated with extreme Jacobian values (<1.0E-04 or>1.0E+04):\n", + "\n", + " fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene]: 1.477E+11\n", + " fs.R101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane]: 1.267E+11\n", + " fs.R101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]: 1.267E+11\n", + " fs.F101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane]: 1.267E+11\n", + " fs.F101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen]: 1.267E+11\n", + " fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane]: 8.886E+10\n", + " fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]: 8.886E+10\n", + " fs.C101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene]: 7.163E+10\n", + " fs.M101.vapor_recycle_state[0.0].flow_mol_phase_comp[Liq,toluene]: 7.162E+10\n", + " fs.C101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene]: 7.162E+10\n", + " fs.R101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane]: 6.625E+10\n", + " fs.R101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen]: 6.625E+10\n", + " fs.C101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane]: 6.275E+10\n", + " fs.C101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen]: 6.275E+10\n", + " fs.M101.vapor_recycle_state[0.0].flow_mol_phase_comp[Liq,methane]: 6.274E+10\n", + " fs.M101.vapor_recycle_state[0.0].flow_mol_phase_comp[Liq,hydrogen]: 6.274E+10\n", + " fs.C101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane]: 6.274E+10\n", + " fs.C101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]: 6.274E+10\n", + " fs.C101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene]: 5.386E+10\n", + " fs.M101.vapor_recycle_state[0.0].flow_mol_phase_comp[Liq,benzene]: 5.386E+10\n", + " fs.C101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene]: 5.386E+10\n", + " fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene]: 2.289E+10\n", + " fs.R101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene]: 1.320E+10\n", + " fs.F101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene]: 1.320E+10\n", + " fs.R101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene]: 7.777E+09\n", + " fs.R101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene]: 3.638E+09\n", + " fs.F101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene]: 3.638E+09\n", + " fs.R101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene]: 1.205E+09\n", + " fs.F101.control_volume.properties_out[0.0].pressure_sat[hydrogen]: 8.234E-07\n", + " fs.H101.control_volume.properties_out[0.0].pressure_sat[hydrogen]: 8.592E-07\n", + " fs.R101.control_volume.properties_out[0.0].temperature: 5.811E+05\n", + " fs.F101.control_volume.properties_in[0.0].temperature: 5.811E+05\n", + " fs.H102.control_volume.properties_in[0.0].mole_frac_phase_comp[Liq,benzene]: 4.130E+05\n", + " fs.translator.properties_out[0.0].mole_frac_phase_comp[Liq,benzene]: 4.096E+05\n", + " fs.translator.properties_out[0.0].mole_frac_comp[benzene]: 4.096E+05\n", + " fs.H102.control_volume.properties_in[0.0].mole_frac_comp[benzene]: 4.096E+05\n", + " fs.R101.control_volume.properties_in[0.0].temperature: 3.964E+05\n", + " fs.H101.control_volume.properties_out[0.0].pressure_sat[methane]: 2.624E-06\n", + " fs.H102.control_volume.properties_in[0.0].mole_frac_phase_comp[Vap,benzene]: 3.602E+05\n", + " fs.H102.control_volume.properties_in[0.0].mole_frac_phase_comp[Vap,toluene]: 3.540E+05\n", + " fs.translator.properties_out[0.0].mole_frac_phase_comp[Vap,benzene]: 3.500E+05\n", + " fs.translator.properties_out[0.0].mole_frac_phase_comp[Vap,toluene]: 3.500E+05\n", + " fs.C101.ratioP[0.0]: 3.500E+05\n", + " fs.F101.control_volume.properties_out[0.0].pressure_sat[methane]: 3.343E-06\n", + " fs.C101.control_volume.properties_in[0.0].temperature: 2.171E+05\n", + " fs.C101.control_volume.properties_out[0.0].temperature: 2.171E+05\n", + " fs.M101.vapor_recycle_state[0.0].temperature: 2.171E+05\n", + " fs.M101.mixed_state[0.0].temperature: 2.129E+05\n", + " fs.H101.control_volume.properties_in[0.0].temperature: 2.129E+05\n", + " fs.H102.control_volume.properties_out[0.0].mole_frac_phase_comp[Liq,benzene]: 1.981E+05\n", + " fs.F101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene]: 1.981E+05\n", + " fs.H102.control_volume.properties_in[0.0].mole_frac_phase_comp[Liq,toluene]: 1.867E+05\n", + " fs.translator.properties_out[0.0].mole_frac_phase_comp[Liq,toluene]: 1.860E+05\n", + " fs.translator.properties_out[0.0].mole_frac_comp[toluene]: 1.860E+05\n", + " fs.H102.control_volume.properties_in[0.0].mole_frac_comp[toluene]: 1.860E+05\n", + " fs.F101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene]: 1.822E+05\n", + " fs.H102.control_volume.properties_out[0.0].mole_frac_comp[benzene]: 1.779E+05\n", + " fs.H102.control_volume.properties_out[0.0].mole_frac_phase_comp[Vap,benzene]: 1.750E+05\n", + " fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene]: 1.675E+05\n", + " fs.H102.control_volume.properties_out[0.0].mole_frac_phase_comp[Vap,toluene]: 1.613E+05\n", + " fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene]: 1.510E+05\n", + " fs.F101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene]: 1.171E+05\n", + " fs.F101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane]: 1.123E+05\n", + " fs.F101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]: 1.123E+05\n", + " fs.R101.control_volume.rate_reaction_extent[0.0,R1]: 1.080E+05\n", + " fs.H102.control_volume.properties_out[0.0].flow_mol_phase[Vap]: 8.447E+04\n", + " fs.H102.control_volume.properties_out[0.0].mole_frac_phase_comp[Liq,toluene]: 8.206E+04\n", + " fs.H102.control_volume.properties_in[0.0].flow_mol_phase[Vap]: 8.067E+04\n", + " fs.H102.control_volume.properties_out[0.0].mole_frac_comp[toluene]: 7.317E+04\n", + " fs.R101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene]: 5.596E+04\n", + " fs.F101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene]: 5.596E+04\n", + " fs.R101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene]: 4.923E+04\n", + " fs.F101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene]: 4.923E+04\n", + " fs.H102.control_volume.properties_out[0.0].flow_mol_phase[Liq]: 4.781E+04\n", + " fs.H102.control_volume.properties_in[0.0].flow_mol_phase[Liq]: 4.302E+04\n", + " fs.R101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]: 4.069E+04\n", + " fs.F101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen]: 4.069E+04\n", + " fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]: 3.961E+04\n", + " fs.R101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane]: 3.957E+04\n", + " fs.F101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane]: 3.957E+04\n", + " fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane]: 3.919E+04\n", + " fs.R101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene]: 3.884E+04\n", + " fs.F101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene]: 3.594E+04\n", + " fs.R101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene]: 3.429E+04\n", + " fs.R101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen]: 2.774E+04\n", + " fs.R101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane]: 2.714E+04\n", + " fs.M101.vapor_recycle_state[0.0].flow_mol_phase_comp[Vap,toluene]: 2.646E+04\n", + " fs.C101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene]: 2.646E+04\n", + " fs.C101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene]: 2.646E+04\n", + " fs.M101.vapor_recycle_state[0.0].flow_mol_phase_comp[Vap,benzene]: 2.297E+04\n", + " fs.C101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene]: 2.297E+04\n", + " fs.C101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene]: 2.297E+04\n", + " fs.M101.mixed_state[0.0].flow_mol_phase_comp[Vap,toluene]: 2.144E+04\n", + " fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene]: 2.143E+04\n", + " fs.M101.mixed_state[0.0].flow_mol_phase_comp[Vap,benzene]: 1.873E+04\n", + " fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene]: 1.872E+04\n", + " fs.F101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]: 1.747E+04\n", + " fs.F101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane]: 1.745E+04\n", + " fs.R101.control_volume.reactions[0.0].k_rxn: 1.343E+04\n", + "\n", + "====================================================================================\n" + ] + } + ], + "source": [ + "dt.display_variables_with_extreme_jacobians()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{Member of equilibrium_constraint} : Size=4, Index=fs.BTHM_params.component_list, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " benzene : 0.0 : (fs.H101.control_volume.properties_out[0.0].pressure_sat[benzene]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]))) - ((fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]))*fs.H101.control_volume.properties_out[0.0].pressure) : 0.0 : True\n" + ] + } + ], + "source": [ + "m.fs.H101.control_volume.properties_out[0.0].equilibrium_constraint['benzene'].pprint()" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.0011934341309824958" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(m.fs.H101.control_volume.properties_out[0.0].pressure_sat['benzene'].value*(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','benzene'].value/(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','benzene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','toluene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','methane'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','hydrogen'].value))) - ((m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','benzene'].value/(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','benzene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','toluene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','methane'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','hydrogen'].value))*m.fs.H101.control_volume.properties_out[0.0].pressure.value)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.0007997438714495e-05\n", + "1e-12\n", + "2.0007997438714495e-05\n", + "1e-12\n", + "2.0007997438714495e-05\n", + "1.3034935871152319e-07\n", + "0.30001000799734406\n", + "8.414878009343252e-07\n" + ] + } + ], + "source": [ + "print(m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Liq','hydrogen'].value)\n", + "print(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','hydrogen'].value)\n", + "print(m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Liq','methane'].value)\n", + "print(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','methane'].value)\n", + "print(m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Liq','benzene'].value)\n", + "print(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','benzene'].value)\n", + "print(m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Liq','toluene'].value)\n", + "print(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','toluene'].value)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.562139567854012\n" + ] + } + ], + "source": [ + "print(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','hydrogen'].value)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "temperature : State temperature\n", + " Size=1, Index=None, Units=K\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : 298 : 314.07480065353843 : 1000 : False : True : NonNegativeReals\n" + ] + } + ], + "source": [ + "m.fs.H101.control_volume.properties_in[0.0].temperature.pprint()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "(m.fs.H101.control_volume.properties_out[0.0].pressure_sat['benzene'].value*(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','benzene'].value/(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','benzene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','toluene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','methane'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','hydrogen'].value))) - ((m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','benzene'].value/(m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','benzene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','toluene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','methane'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','hydrogen'].value))*m.fs.H101.control_volume.properties_out[0.0].pressure.value)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1000.0*m.fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp['Liq','hydrogen'].value - (m.fs.BTHM_params.cp_ig_5['Liq','hydrogen'].value/5*(m.fs.H101.control_volume.properties_out[0.0].temperature.value**5 - m.fs.BTHM_params.temperature_ref.value**5) + m.fs.BTHM_params.cp_ig_4['Liq','hydrogen'].value/4*(m.fs.H101.control_volume.properties_out[0.0].temperature.value**4 - m.fs.BTHM_params.temperature_ref.value**4) + m.fs.BTHM_params.cp_ig_3['Liq','hydrogen'].value/3*(m.fs.H101.control_volume.properties_out[0.0].temperature.value**3 - m.fs.BTHM_params.temperature_ref.value**3) + m.fs.BTHM_params.cp_ig_2['Liq','hydrogen'].value/2*(m.fs.H101.control_volume.properties_out[0.0].temperature.value**2 - m.fs.BTHM_params.temperature_ref.value**2) + m.fs.BTHM_params.cp_ig_1['Liq','hydrogen'].value*(m.fs.H101.control_volume.properties_out[0.0].temperature.value - m.fs.BTHM_params.temperature_ref.value))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "s03_expanded : Size=1, Index=None, Active=True\n", + " 3 Constraint Declarations\n", + " flow_mol_phase_comp_equality : Size=8, Index=fs._time*fs.BTHM_params.phase_list*fs.BTHM_params.component_list, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " (0.0, 'Liq', 'benzene') : 0.0 : fs.M101.mixed_state[0.0].flow_mol_phase_comp[Liq,benzene] - fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] : 0.0 : True\n", + " (0.0, 'Liq', 'hydrogen') : 0.0 : fs.M101.mixed_state[0.0].flow_mol_phase_comp[Liq,hydrogen] - fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen] : 0.0 : True\n", + " (0.0, 'Liq', 'methane') : 0.0 : fs.M101.mixed_state[0.0].flow_mol_phase_comp[Liq,methane] - fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] : 0.0 : True\n", + " (0.0, 'Liq', 'toluene') : 0.0 : fs.M101.mixed_state[0.0].flow_mol_phase_comp[Liq,toluene] - fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] : 0.0 : True\n", + " (0.0, 'Vap', 'benzene') : 0.0 : fs.M101.mixed_state[0.0].flow_mol_phase_comp[Vap,benzene] - fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] : 0.0 : True\n", + " (0.0, 'Vap', 'hydrogen') : 0.0 : fs.M101.mixed_state[0.0].flow_mol_phase_comp[Vap,hydrogen] - fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen] : 0.0 : True\n", + " (0.0, 'Vap', 'methane') : 0.0 : fs.M101.mixed_state[0.0].flow_mol_phase_comp[Vap,methane] - fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] : 0.0 : True\n", + " (0.0, 'Vap', 'toluene') : 0.0 : fs.M101.mixed_state[0.0].flow_mol_phase_comp[Vap,toluene] - fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] : 0.0 : True\n", + " pressure_equality : Size=1, Index=fs._time, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " 0.0 : 0.0 : fs.M101.mixed_state[0.0].pressure - fs.H101.control_volume.properties_in[0.0].pressure : 0.0 : True\n", + " temperature_equality : Size=1, Index=fs._time, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " 0.0 : 0.0 : fs.M101.mixed_state[0.0].temperature - fs.H101.control_volume.properties_in[0.0].temperature : 0.0 : True\n", + "\n", + " 3 Declarations: flow_mol_phase_comp_equality pressure_equality temperature_equality\n" + ] + } + ], + "source": [ + "m.fs.s03_expanded.pprint()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "temperature : State temperature\n", + " Size=1, Index=None, Units=K\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : 298 : 314.0955643806385 : 1000 : False : True : NonNegativeReals\n" + ] + } + ], + "source": [ + "m.fs.M101.mixed_state[0.0].temperature.pprint()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "temperature : State temperature\n", + " Size=1, Index=None, Units=K\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : 298 : 314.0747969291496 : 1000 : False : True : NonNegativeReals\n" + ] + } + ], + "source": [ + "m.fs.H101.control_volume.properties_in[0.0].temperature.pprint()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "temperature : State temperature\n", + " Size=1, Index=None, Units=K\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : 298 : 600 : 1000 : True : True : NonNegativeReals\n" + ] + } + ], + "source": [ + "m.fs.H101.control_volume.properties_out[0.0].temperature.pprint()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "control_volume : Size=1, Index=None, Active=True\n", + " 2 Var Declarations\n", + " heat : Heat transferred into control volume\n", + " Size=1, Index=fs._time, Units=kg*m**2/s**3\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " 0.0 : None : 47334.81195332139 : None : False : True : Reals\n", + " phase_equilibrium_generation : Amount of generation in control volume by phase equilibria\n", + " Size=4, Index=fs._time*fs.BTHM_params.phase_equilibrium_idx, Units=mol/s\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " (0.0, 1) : None : 1.9877650660161695e-05 : None : False : True : Reals\n", + " (0.0, 2) : None : 0.3000091665124016 : None : False : True : Reals\n", + " (0.0, 3) : None : 2.0007999028186373e-05 : None : False : True : Reals\n", + " (0.0, 4) : None : 2.0007999028186373e-05 : None : False : True : Reals\n", + "\n", + " 3 Constraint Declarations\n", + " enthalpy_balances : Energy balances\n", + " Size=1, Index=fs._time, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " 0.0 : 0.0 : ((fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen])*fs.H101.control_volume.properties_in[0.0].enth_mol_phase[Liq]) + ((fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])*fs.H101.control_volume.properties_in[0.0].enth_mol_phase[Vap]) - (((fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen])*fs.H101.control_volume.properties_out[0.0].enth_mol_phase[Liq]) + ((fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])*fs.H101.control_volume.properties_out[0.0].enth_mol_phase[Vap])) + fs.H101.control_volume.heat[0.0] : 0.0 : True\n", + " material_balances : Material balances\n", + " Size=8, Index=fs._time*fs.BTHM_params._phase_component_set, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " (0.0, 'Liq', 'benzene') : 0.0 : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] - fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + (- fs.H101.control_volume.phase_equilibrium_generation[0.0,1] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,2] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,3] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,4]) : 0.0 : True\n", + " (0.0, 'Liq', 'hydrogen') : 0.0 : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen] - fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen] + (0*fs.H101.control_volume.phase_equilibrium_generation[0.0,1] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,2] - fs.H101.control_volume.phase_equilibrium_generation[0.0,3] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,4]) : 0.0 : True\n", + " (0.0, 'Liq', 'methane') : 0.0 : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] - fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + (0*fs.H101.control_volume.phase_equilibrium_generation[0.0,1] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,2] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,3] - fs.H101.control_volume.phase_equilibrium_generation[0.0,4]) : 0.0 : True\n", + " (0.0, 'Liq', 'toluene') : 0.0 : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] - fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + (0*fs.H101.control_volume.phase_equilibrium_generation[0.0,1] - fs.H101.control_volume.phase_equilibrium_generation[0.0,2] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,3] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,4]) : 0.0 : True\n", + " (0.0, 'Vap', 'benzene') : 0.0 : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] - fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + (fs.H101.control_volume.phase_equilibrium_generation[0.0,1] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,2] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,3] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,4]) : 0.0 : True\n", + " (0.0, 'Vap', 'hydrogen') : 0.0 : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen] - fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen] + (0*fs.H101.control_volume.phase_equilibrium_generation[0.0,1] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,2] + fs.H101.control_volume.phase_equilibrium_generation[0.0,3] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,4]) : 0.0 : True\n", + " (0.0, 'Vap', 'methane') : 0.0 : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] - fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + (0*fs.H101.control_volume.phase_equilibrium_generation[0.0,1] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,2] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,3] + fs.H101.control_volume.phase_equilibrium_generation[0.0,4]) : 0.0 : True\n", + " (0.0, 'Vap', 'toluene') : 0.0 : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] - fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + (0*fs.H101.control_volume.phase_equilibrium_generation[0.0,1] + fs.H101.control_volume.phase_equilibrium_generation[0.0,2] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,3] + 0*fs.H101.control_volume.phase_equilibrium_generation[0.0,4]) : 0.0 : True\n", + " pressure_balance : Momentum balance\n", + " Size=1, Index=fs._time, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " 0.0 : 0.0 : fs.H101.control_volume.properties_in[0.0].pressure - fs.H101.control_volume.properties_out[0.0].pressure : 0.0 : True\n", + "\n", + " 2 Block Declarations\n", + " properties_in : Material properties at inlet\n", + " Size=1, Index=fs._time, Active=True\n", + " fs.H101.control_volume.properties_in[0.0] : Active=True\n", + " 5 Var Declarations\n", + " enth_mol_phase : Phase molar specific enthalpies\n", + " Size=2, Index=fs.BTHM_params.phase_list, Units=J/mol\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " Liq : None : 2525.479995256094 : None : False : True : Reals\n", + " Vap : None : 3211.3802801501315 : None : False : True : Reals\n", + " enth_mol_phase_comp : Phase-component molar specific enthalpies\n", + " Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list, Units=J/mol\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " ('Liq', 'benzene') : None : 2192.769648165968 : None : False : True : Reals\n", + " ('Liq', 'hydrogen') : None : 0.0 : None : False : True : Reals\n", + " ('Liq', 'methane') : None : 0.0 : None : False : True : Reals\n", + " ('Liq', 'toluene') : None : 2525.839038198804 : None : False : True : Reals\n", + " ('Vap', 'benzene') : None : 35222.27194658621 : None : False : True : Reals\n", + " ('Vap', 'hydrogen') : None : 460.2898578972873 : None : False : True : Reals\n", + " ('Vap', 'methane') : None : 573.3661650080942 : None : False : True : Reals\n", + " ('Vap', 'toluene') : None : 39982.308320562464 : None : False : True : Reals\n", + " flow_mol_phase_comp : Phase-component molar flow rates\n", + " Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list, Units=mol/s\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " ('Liq', 'benzene') : 1e-12 : 2.0008000000025254e-05 : 100 : False : True : Reals\n", + " ('Liq', 'hydrogen') : 1e-12 : 2.0008000000025254e-05 : 100 : False : True : Reals\n", + " ('Liq', 'methane') : 1e-12 : 2.0008000000025254e-05 : 100 : False : True : Reals\n", + " ('Liq', 'toluene') : 1e-12 : 0.30001000799999994 : 100 : False : True : Reals\n", + " ('Vap', 'benzene') : 1e-12 : 0.11973067378485161 : 100 : False : True : Reals\n", + " ('Vap', 'hydrogen') : 1e-12 : 0.5621188927427752 : 100 : False : True : Reals\n", + " ('Vap', 'methane') : 1e-12 : 1.0409451348733987 : 100 : False : True : Reals\n", + " ('Vap', 'toluene') : 1e-12 : 0.012503960539012862 : 100 : False : True : Reals\n", + " pressure : State pressure\n", + " Size=1, Index=None, Units=Pa\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : 100000 : 349999.99919098296 : 1000000 : False : True : NonNegativeReals\n", + " temperature : State temperature\n", + " Size=1, Index=None, Units=K\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : 298 : 314.0747969291496 : 1000 : False : True : NonNegativeReals\n", + "\n", + " 6 Expression Declarations\n", + " enthalpy_flow_terms : Size=2, Index=fs.BTHM_params.phase_list\n", + " Key : Expression\n", + " Liq : (fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen])*fs.H101.control_volume.properties_in[0.0].enth_mol_phase[Liq]\n", + " Vap : (fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])*fs.H101.control_volume.properties_in[0.0].enth_mol_phase[Vap]\n", + " flow_mol : Total molar flowrate\n", + " Size=1, Index=None\n", + " Key : Expression\n", + " None : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen]\n", + " flow_mol_phase : Phase molar flow rates\n", + " Size=2, Index=fs.BTHM_params.phase_list\n", + " Key : Expression\n", + " Liq : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen]\n", + " Vap : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen]\n", + " material_flow_terms : Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list\n", + " Key : Expression\n", + " ('Liq', 'benzene') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene]\n", + " ('Liq', 'hydrogen') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen]\n", + " ('Liq', 'methane') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane]\n", + " ('Liq', 'toluene') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene]\n", + " ('Vap', 'benzene') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene]\n", + " ('Vap', 'hydrogen') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen]\n", + " ('Vap', 'methane') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane]\n", + " ('Vap', 'toluene') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene]\n", + " mole_frac_comp : Mixture mole fractions\n", + " Size=4, Index=fs.BTHM_params.component_list\n", + " Key : Expression\n", + " benzene : (fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene])/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " hydrogen : (fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " methane : (fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane])/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " toluene : (fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene])/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " mole_frac_phase_comp : Phase mole fractions\n", + " Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list\n", + " Key : Expression\n", + " ('Liq', 'benzene') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen])\n", + " ('Liq', 'hydrogen') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen])\n", + " ('Liq', 'methane') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen])\n", + " ('Liq', 'toluene') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen])\n", + " ('Vap', 'benzene') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " ('Vap', 'hydrogen') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " ('Vap', 'methane') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " ('Vap', 'toluene') : fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + "\n", + " 2 Constraint Declarations\n", + " eq_enth_mol_phase : Size=2, Index=fs.BTHM_params.phase_list, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " Liq : 0.0 : fs.H101.control_volume.properties_in[0.0].enth_mol_phase[Liq] - (fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Liq,benzene]*(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen])) + fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Liq,toluene]*(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen])) + fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Liq,methane]*(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen])) + fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Liq,hydrogen]*(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Liq,hydrogen]))) : 0.0 : True\n", + " Vap : 0.0 : fs.H101.control_volume.properties_in[0.0].enth_mol_phase[Vap] - (fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Vap,benzene]*(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])) + fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Vap,toluene]*(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])) + fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Vap,methane]*(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen])) + fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Vap,hydrogen]*(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen]/(fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp[Vap,hydrogen]))) : 0.0 : True\n", + " eq_enth_mol_phase_comp : Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " ('Liq', 'benzene') : 0.0 : 1000.0*fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Liq,benzene] - (fs.BTHM_params.cp_ig_5[Liq,benzene]/5*(fs.H101.control_volume.properties_in[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Liq,benzene]/4*(fs.H101.control_volume.properties_in[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Liq,benzene]/3*(fs.H101.control_volume.properties_in[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Liq,benzene]/2*(fs.H101.control_volume.properties_in[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Liq,benzene]*(fs.H101.control_volume.properties_in[0.0].temperature - fs.BTHM_params.temperature_ref)) : 0.0 : True\n", + " ('Liq', 'hydrogen') : 0.0 : 1000.0*fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Liq,hydrogen] - (fs.BTHM_params.cp_ig_5[Liq,hydrogen]/5*(fs.H101.control_volume.properties_in[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Liq,hydrogen]/4*(fs.H101.control_volume.properties_in[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Liq,hydrogen]/3*(fs.H101.control_volume.properties_in[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Liq,hydrogen]/2*(fs.H101.control_volume.properties_in[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Liq,hydrogen]*(fs.H101.control_volume.properties_in[0.0].temperature - fs.BTHM_params.temperature_ref)) : 0.0 : True\n", + " ('Liq', 'methane') : 0.0 : 1000.0*fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Liq,methane] - (fs.BTHM_params.cp_ig_5[Liq,methane]/5*(fs.H101.control_volume.properties_in[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Liq,methane]/4*(fs.H101.control_volume.properties_in[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Liq,methane]/3*(fs.H101.control_volume.properties_in[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Liq,methane]/2*(fs.H101.control_volume.properties_in[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Liq,methane]*(fs.H101.control_volume.properties_in[0.0].temperature - fs.BTHM_params.temperature_ref)) : 0.0 : True\n", + " ('Liq', 'toluene') : 0.0 : 1000.0*fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Liq,toluene] - (fs.BTHM_params.cp_ig_5[Liq,toluene]/5*(fs.H101.control_volume.properties_in[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Liq,toluene]/4*(fs.H101.control_volume.properties_in[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Liq,toluene]/3*(fs.H101.control_volume.properties_in[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Liq,toluene]/2*(fs.H101.control_volume.properties_in[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Liq,toluene]*(fs.H101.control_volume.properties_in[0.0].temperature - fs.BTHM_params.temperature_ref)) : 0.0 : True\n", + " ('Vap', 'benzene') : 0.0 : fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Vap,benzene] - (fs.BTHM_params.cp_ig_5[Vap,benzene]/5*(fs.H101.control_volume.properties_in[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Vap,benzene]/4*(fs.H101.control_volume.properties_in[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Vap,benzene]/3*(fs.H101.control_volume.properties_in[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Vap,benzene]/2*(fs.H101.control_volume.properties_in[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Vap,benzene]*(fs.H101.control_volume.properties_in[0.0].temperature - fs.BTHM_params.temperature_ref) + fs.BTHM_params.dh_vap[benzene]) : 0.0 : True\n", + " ('Vap', 'hydrogen') : 0.0 : fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Vap,hydrogen] - (fs.BTHM_params.cp_ig_5[Vap,hydrogen]/5*(fs.H101.control_volume.properties_in[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Vap,hydrogen]/4*(fs.H101.control_volume.properties_in[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Vap,hydrogen]/3*(fs.H101.control_volume.properties_in[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Vap,hydrogen]/2*(fs.H101.control_volume.properties_in[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Vap,hydrogen]*(fs.H101.control_volume.properties_in[0.0].temperature - fs.BTHM_params.temperature_ref) + fs.BTHM_params.dh_vap[hydrogen]) : 0.0 : True\n", + " ('Vap', 'methane') : 0.0 : fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Vap,methane] - (fs.BTHM_params.cp_ig_5[Vap,methane]/5*(fs.H101.control_volume.properties_in[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Vap,methane]/4*(fs.H101.control_volume.properties_in[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Vap,methane]/3*(fs.H101.control_volume.properties_in[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Vap,methane]/2*(fs.H101.control_volume.properties_in[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Vap,methane]*(fs.H101.control_volume.properties_in[0.0].temperature - fs.BTHM_params.temperature_ref) + fs.BTHM_params.dh_vap[methane]) : 0.0 : True\n", + " ('Vap', 'toluene') : 0.0 : fs.H101.control_volume.properties_in[0.0].enth_mol_phase_comp[Vap,toluene] - (fs.BTHM_params.cp_ig_5[Vap,toluene]/5*(fs.H101.control_volume.properties_in[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Vap,toluene]/4*(fs.H101.control_volume.properties_in[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Vap,toluene]/3*(fs.H101.control_volume.properties_in[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Vap,toluene]/2*(fs.H101.control_volume.properties_in[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Vap,toluene]*(fs.H101.control_volume.properties_in[0.0].temperature - fs.BTHM_params.temperature_ref) + fs.BTHM_params.dh_vap[toluene]) : 0.0 : True\n", + "\n", + " 13 Declarations: flow_mol_phase_comp pressure temperature flow_mol_phase flow_mol mole_frac_phase_comp mole_frac_comp material_flow_terms enthalpy_flow_terms enth_mol_phase eq_enth_mol_phase enth_mol_phase_comp eq_enth_mol_phase_comp\n", + " properties_out : Material properties at outlet\n", + " Size=1, Index=fs._time, Active=True\n", + " fs.H101.control_volume.properties_out[0.0] : Active=True\n", + " 3 Param Declarations\n", + " eps_1 : Smoothing parameter for Teq\n", + " Size=1, Index=None, Domain=Any, Default=0.01, Mutable=True, Units=K\n", + " Key : Value\n", + " None : 0.01\n", + " eps_2 : Smoothing parameter for Teq\n", + " Size=1, Index=None, Domain=Any, Default=0.0005, Mutable=True, Units=K\n", + " Key : Value\n", + " None : 0.0005\n", + " temperature_bubble : Bubble point temperature\n", + " Size=1, Index=None, Domain=Any, Default=None, Mutable=True, Units=K\n", + " Key : Value\n", + " None : 33.0\n", + "\n", + " 9 Var Declarations\n", + " _t1 : Intermediate temperature for calculating Teq\n", + " Size=1, Index=None, Units=K\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : None : 600.0000000440917 : None : False : True : Reals\n", + " _teq : Temperature for calculating phase equilibrium\n", + " Size=1, Index=None, Units=K\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : None : 367.75868720488586 : None : False : True : Reals\n", + " enth_mol_phase : Phase molar specific enthalpies\n", + " Size=2, Index=fs.BTHM_params.phase_list, Units=J/mol\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " Liq : None : 64383.97262126232 : None : False : True : Reals\n", + " Vap : None : 26366.377714386934 : None : False : True : Reals\n", + " enth_mol_phase_comp : Phase-component molar specific enthalpies\n", + " Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list, Units=J/mol\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " ('Liq', 'benzene') : None : 56825.818946131 : None : False : True : Reals\n", + " ('Liq', 'hydrogen') : None : 0.0 : None : False : True : Reals\n", + " ('Liq', 'methane') : None : 0.0 : None : False : True : Reals\n", + " ('Liq', 'toluene') : None : 65554.90548557646 : None : False : True : Reals\n", + " ('Vap', 'benzene') : None : 70982.1937493005 : None : False : True : Reals\n", + " ('Vap', 'hydrogen') : None : 8809.610210110926 : None : False : True : Reals\n", + " ('Vap', 'methane') : None : 13288.690957398636 : None : False : True : Reals\n", + " ('Vap', 'toluene') : None : 84411.90574416363 : None : False : True : Reals\n", + " flow_mol_phase_comp : Phase-component molar flow rates\n", + " Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list, Units=mol/s\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " ('Liq', 'benzene') : 1e-12 : 1.3034933986355738e-07 : 100 : False : True : Reals\n", + " ('Liq', 'hydrogen') : 1e-12 : 1e-12 : 100 : False : True : Reals\n", + " ('Liq', 'methane') : 1e-12 : 1e-12 : 100 : False : True : Reals\n", + " ('Liq', 'toluene') : 1e-12 : 8.414875983652426e-07 : 100 : False : True : Reals\n", + " ('Vap', 'benzene') : 1e-12 : 0.11975055143551176 : 100 : False : True : Reals\n", + " ('Vap', 'hydrogen') : 1e-12 : 0.5621389007418034 : 100 : False : True : Reals\n", + " ('Vap', 'methane') : 1e-12 : 1.040965142872427 : 100 : False : True : Reals\n", + " ('Vap', 'toluene') : 1e-12 : 0.31251312705141443 : 100 : False : True : Reals\n", + " pressure : State pressure\n", + " Size=1, Index=None, Units=Pa\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : 100000 : 349999.99919098296 : 1000000 : False : True : NonNegativeReals\n", + " pressure_sat : Vapor pressure\n", + " Size=4, Index=fs.BTHM_params.component_list, Units=Pa\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " benzene : None : 153528.18538316718 : None : False : True : Reals\n", + " hydrogen : None : 189790945.5804816 : None : False : True : Reals\n", + " methane : None : 60785306.759204485 : None : False : True : Reals\n", + " toluene : None : 62064.03049432264 : None : False : True : Reals\n", + " temperature : State temperature\n", + " Size=1, Index=None, Units=K\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : 298 : 600 : 1000 : True : True : NonNegativeReals\n", + " temperature_dew : Dew point temperature\n", + " Size=1, Index=None, Units=K\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " None : None : 367.75868720515496 : None : False : True : Reals\n", + "\n", + " 9 Expression Declarations\n", + " _p_sat_dewT : Size=4, Index=fs.BTHM_params.component_list\n", + " Key : Expression\n", + " benzene : 100000.0*Pa*10**(fs.BTHM_params.pressure_sat_coeff_A[benzene] - fs.BTHM_params.pressure_sat_coeff_B[benzene]/(fs.H101.control_volume.properties_out[0.0].temperature_dew + fs.BTHM_params.pressure_sat_coeff_C[benzene]))\n", + " hydrogen : 100000.0*Pa*10**(fs.BTHM_params.pressure_sat_coeff_A[hydrogen] - fs.BTHM_params.pressure_sat_coeff_B[hydrogen]/(fs.H101.control_volume.properties_out[0.0].temperature_dew + fs.BTHM_params.pressure_sat_coeff_C[hydrogen]))\n", + " methane : 100000.0*Pa*10**(fs.BTHM_params.pressure_sat_coeff_A[methane] - fs.BTHM_params.pressure_sat_coeff_B[methane]/(fs.H101.control_volume.properties_out[0.0].temperature_dew + fs.BTHM_params.pressure_sat_coeff_C[methane]))\n", + " toluene : 100000.0*Pa*10**(fs.BTHM_params.pressure_sat_coeff_A[toluene] - fs.BTHM_params.pressure_sat_coeff_B[toluene]/(fs.H101.control_volume.properties_out[0.0].temperature_dew + fs.BTHM_params.pressure_sat_coeff_C[toluene]))\n", + " _tr_eq : Component reduced temperatures\n", + " Size=4, Index=fs.BTHM_params.component_list\n", + " Key : Expression\n", + " benzene : 1/fs.BTHM_params.temperature_crit[benzene]*fs.H101.control_volume.properties_out[0.0]._teq\n", + " hydrogen : 1/fs.BTHM_params.temperature_crit[hydrogen]*fs.H101.control_volume.properties_out[0.0]._teq\n", + " methane : 1/fs.BTHM_params.temperature_crit[methane]*fs.H101.control_volume.properties_out[0.0]._teq\n", + " toluene : 1/fs.BTHM_params.temperature_crit[toluene]*fs.H101.control_volume.properties_out[0.0]._teq\n", + " enthalpy_flow_terms : Size=2, Index=fs.BTHM_params.phase_list\n", + " Key : Expression\n", + " Liq : (fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen])*fs.H101.control_volume.properties_out[0.0].enth_mol_phase[Liq]\n", + " Vap : (fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])*fs.H101.control_volume.properties_out[0.0].enth_mol_phase[Vap]\n", + " flow_mol : Total molar flowrate\n", + " Size=1, Index=None\n", + " Key : Expression\n", + " None : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]\n", + " flow_mol_phase : Phase molar flow rates\n", + " Size=2, Index=fs.BTHM_params.phase_list\n", + " Key : Expression\n", + " Liq : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]\n", + " Vap : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]\n", + " fug_phase_comp : Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list\n", + " Key : Expression\n", + " ('Liq', 'benzene') : fs.H101.control_volume.properties_out[0.0].pressure_sat[benzene]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]))\n", + " ('Liq', 'hydrogen') : fs.H101.control_volume.properties_out[0.0].mole_frac_phase_comp[Liq,hydrogen]\n", + " ('Liq', 'methane') : fs.H101.control_volume.properties_out[0.0].mole_frac_phase_comp[Liq,methane]\n", + " ('Liq', 'toluene') : fs.H101.control_volume.properties_out[0.0].pressure_sat[toluene]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]))\n", + " ('Vap', 'benzene') : (fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]))*fs.H101.control_volume.properties_out[0.0].pressure\n", + " ('Vap', 'hydrogen') : 1e-06\n", + " ('Vap', 'methane') : 1e-06\n", + " ('Vap', 'toluene') : (fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]))*fs.H101.control_volume.properties_out[0.0].pressure\n", + " material_flow_terms : Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list\n", + " Key : Expression\n", + " ('Liq', 'benzene') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene]\n", + " ('Liq', 'hydrogen') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]\n", + " ('Liq', 'methane') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane]\n", + " ('Liq', 'toluene') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene]\n", + " ('Vap', 'benzene') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene]\n", + " ('Vap', 'hydrogen') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]\n", + " ('Vap', 'methane') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane]\n", + " ('Vap', 'toluene') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene]\n", + " mole_frac_comp : Mixture mole fractions\n", + " Size=4, Index=fs.BTHM_params.component_list\n", + " Key : Expression\n", + " benzene : (fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene])/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " hydrogen : (fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " methane : (fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane])/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " toluene : (fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene])/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " mole_frac_phase_comp : Phase mole fractions\n", + " Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list\n", + " Key : Expression\n", + " ('Liq', 'benzene') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen])\n", + " ('Liq', 'hydrogen') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen])\n", + " ('Liq', 'methane') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen])\n", + " ('Liq', 'toluene') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen])\n", + " ('Vap', 'benzene') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " ('Vap', 'hydrogen') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " ('Vap', 'methane') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + " ('Vap', 'toluene') : fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])\n", + "\n", + " 7 Constraint Declarations\n", + " _t1_constraint : Size=1, Index=None, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " None : 0.0 : fs.H101.control_volume.properties_out[0.0]._t1 - 0.5*(fs.H101.control_volume.properties_out[0.0].temperature + fs.H101.control_volume.properties_out[0.0].temperature_bubble + sqrt((fs.H101.control_volume.properties_out[0.0].temperature - fs.H101.control_volume.properties_out[0.0].temperature_bubble)**2 + fs.H101.control_volume.properties_out[0.0].eps_1**2)) : 0.0 : True\n", + " _teq_constraint : Size=1, Index=None, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " None : 0.0 : fs.H101.control_volume.properties_out[0.0]._teq - 0.5*(fs.H101.control_volume.properties_out[0.0]._t1 + fs.H101.control_volume.properties_out[0.0].temperature_dew - sqrt((fs.H101.control_volume.properties_out[0.0]._t1 - fs.H101.control_volume.properties_out[0.0].temperature_dew)**2 + fs.H101.control_volume.properties_out[0.0].eps_2**2)) : 0.0 : True\n", + " eq_enth_mol_phase : Size=2, Index=fs.BTHM_params.phase_list, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " Liq : 0.0 : fs.H101.control_volume.properties_out[0.0].enth_mol_phase[Liq] - (fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Liq,benzene]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen])) + fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Liq,toluene]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen])) + fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Liq,methane]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen])) + fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Liq,hydrogen]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]))) : 0.0 : True\n", + " Vap : 0.0 : fs.H101.control_volume.properties_out[0.0].enth_mol_phase[Vap] - (fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Vap,benzene]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])) + fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Vap,toluene]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])) + fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Vap,methane]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen])) + fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Vap,hydrogen]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]))) : 0.0 : True\n", + " eq_enth_mol_phase_comp : Size=8, Index=fs.BTHM_params.phase_list*fs.BTHM_params.component_list, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " ('Liq', 'benzene') : 0.0 : 1000.0*fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Liq,benzene] - (fs.BTHM_params.cp_ig_5[Liq,benzene]/5*(fs.H101.control_volume.properties_out[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Liq,benzene]/4*(fs.H101.control_volume.properties_out[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Liq,benzene]/3*(fs.H101.control_volume.properties_out[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Liq,benzene]/2*(fs.H101.control_volume.properties_out[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Liq,benzene]*(fs.H101.control_volume.properties_out[0.0].temperature - fs.BTHM_params.temperature_ref)) : 0.0 : True\n", + " ('Liq', 'hydrogen') : 0.0 : 1000.0*fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Liq,hydrogen] - (fs.BTHM_params.cp_ig_5[Liq,hydrogen]/5*(fs.H101.control_volume.properties_out[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Liq,hydrogen]/4*(fs.H101.control_volume.properties_out[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Liq,hydrogen]/3*(fs.H101.control_volume.properties_out[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Liq,hydrogen]/2*(fs.H101.control_volume.properties_out[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Liq,hydrogen]*(fs.H101.control_volume.properties_out[0.0].temperature - fs.BTHM_params.temperature_ref)) : 0.0 : True\n", + " ('Liq', 'methane') : 0.0 : 1000.0*fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Liq,methane] - (fs.BTHM_params.cp_ig_5[Liq,methane]/5*(fs.H101.control_volume.properties_out[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Liq,methane]/4*(fs.H101.control_volume.properties_out[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Liq,methane]/3*(fs.H101.control_volume.properties_out[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Liq,methane]/2*(fs.H101.control_volume.properties_out[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Liq,methane]*(fs.H101.control_volume.properties_out[0.0].temperature - fs.BTHM_params.temperature_ref)) : 0.0 : True\n", + " ('Liq', 'toluene') : 0.0 : 1000.0*fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Liq,toluene] - (fs.BTHM_params.cp_ig_5[Liq,toluene]/5*(fs.H101.control_volume.properties_out[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Liq,toluene]/4*(fs.H101.control_volume.properties_out[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Liq,toluene]/3*(fs.H101.control_volume.properties_out[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Liq,toluene]/2*(fs.H101.control_volume.properties_out[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Liq,toluene]*(fs.H101.control_volume.properties_out[0.0].temperature - fs.BTHM_params.temperature_ref)) : 0.0 : True\n", + " ('Vap', 'benzene') : 0.0 : fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Vap,benzene] - (fs.BTHM_params.cp_ig_5[Vap,benzene]/5*(fs.H101.control_volume.properties_out[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Vap,benzene]/4*(fs.H101.control_volume.properties_out[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Vap,benzene]/3*(fs.H101.control_volume.properties_out[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Vap,benzene]/2*(fs.H101.control_volume.properties_out[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Vap,benzene]*(fs.H101.control_volume.properties_out[0.0].temperature - fs.BTHM_params.temperature_ref) + fs.BTHM_params.dh_vap[benzene]) : 0.0 : True\n", + " ('Vap', 'hydrogen') : 0.0 : fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Vap,hydrogen] - (fs.BTHM_params.cp_ig_5[Vap,hydrogen]/5*(fs.H101.control_volume.properties_out[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Vap,hydrogen]/4*(fs.H101.control_volume.properties_out[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Vap,hydrogen]/3*(fs.H101.control_volume.properties_out[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Vap,hydrogen]/2*(fs.H101.control_volume.properties_out[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Vap,hydrogen]*(fs.H101.control_volume.properties_out[0.0].temperature - fs.BTHM_params.temperature_ref) + fs.BTHM_params.dh_vap[hydrogen]) : 0.0 : True\n", + " ('Vap', 'methane') : 0.0 : fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Vap,methane] - (fs.BTHM_params.cp_ig_5[Vap,methane]/5*(fs.H101.control_volume.properties_out[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Vap,methane]/4*(fs.H101.control_volume.properties_out[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Vap,methane]/3*(fs.H101.control_volume.properties_out[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Vap,methane]/2*(fs.H101.control_volume.properties_out[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Vap,methane]*(fs.H101.control_volume.properties_out[0.0].temperature - fs.BTHM_params.temperature_ref) + fs.BTHM_params.dh_vap[methane]) : 0.0 : True\n", + " ('Vap', 'toluene') : 0.0 : fs.H101.control_volume.properties_out[0.0].enth_mol_phase_comp[Vap,toluene] - (fs.BTHM_params.cp_ig_5[Vap,toluene]/5*(fs.H101.control_volume.properties_out[0.0].temperature**5 - fs.BTHM_params.temperature_ref**5) + fs.BTHM_params.cp_ig_4[Vap,toluene]/4*(fs.H101.control_volume.properties_out[0.0].temperature**4 - fs.BTHM_params.temperature_ref**4) + fs.BTHM_params.cp_ig_3[Vap,toluene]/3*(fs.H101.control_volume.properties_out[0.0].temperature**3 - fs.BTHM_params.temperature_ref**3) + fs.BTHM_params.cp_ig_2[Vap,toluene]/2*(fs.H101.control_volume.properties_out[0.0].temperature**2 - fs.BTHM_params.temperature_ref**2) + fs.BTHM_params.cp_ig_1[Vap,toluene]*(fs.H101.control_volume.properties_out[0.0].temperature - fs.BTHM_params.temperature_ref) + fs.BTHM_params.dh_vap[toluene]) : 0.0 : True\n", + " eq_pressure_sat : Size=4, Index=fs.BTHM_params.component_list, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " benzene : - fs.BTHM_params.pressure_sat_coeff_B[benzene] : (log10(1/Pa*1e-05*fs.H101.control_volume.properties_out[0.0].pressure_sat[benzene]) - fs.BTHM_params.pressure_sat_coeff_A[benzene])*(fs.H101.control_volume.properties_out[0.0]._teq + fs.BTHM_params.pressure_sat_coeff_C[benzene]) : - fs.BTHM_params.pressure_sat_coeff_B[benzene] : True\n", + " hydrogen : - fs.BTHM_params.pressure_sat_coeff_B[hydrogen] : (log10(1/Pa*1e-05*fs.H101.control_volume.properties_out[0.0].pressure_sat[hydrogen]) - fs.BTHM_params.pressure_sat_coeff_A[hydrogen])*(fs.H101.control_volume.properties_out[0.0]._teq + fs.BTHM_params.pressure_sat_coeff_C[hydrogen]) : - fs.BTHM_params.pressure_sat_coeff_B[hydrogen] : True\n", + " methane : - fs.BTHM_params.pressure_sat_coeff_B[methane] : (log10(1/Pa*1e-05*fs.H101.control_volume.properties_out[0.0].pressure_sat[methane]) - fs.BTHM_params.pressure_sat_coeff_A[methane])*(fs.H101.control_volume.properties_out[0.0]._teq + fs.BTHM_params.pressure_sat_coeff_C[methane]) : - fs.BTHM_params.pressure_sat_coeff_B[methane] : True\n", + " toluene : - fs.BTHM_params.pressure_sat_coeff_B[toluene] : (log10(1/Pa*1e-05*fs.H101.control_volume.properties_out[0.0].pressure_sat[toluene]) - fs.BTHM_params.pressure_sat_coeff_A[toluene])*(fs.H101.control_volume.properties_out[0.0]._teq + fs.BTHM_params.pressure_sat_coeff_C[toluene]) : - fs.BTHM_params.pressure_sat_coeff_B[toluene] : True\n", + " eq_temperature_dew : Size=1, Index=None, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " None : 0.0 : fs.H101.control_volume.properties_out[0.0].pressure*(((fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene])/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]))/(100000.0*Pa*10**(fs.BTHM_params.pressure_sat_coeff_A[toluene] - fs.BTHM_params.pressure_sat_coeff_B[toluene]/(fs.H101.control_volume.properties_out[0.0].temperature_dew + fs.BTHM_params.pressure_sat_coeff_C[toluene]))) + ((fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene])/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]))/(100000.0*Pa*10**(fs.BTHM_params.pressure_sat_coeff_A[benzene] - fs.BTHM_params.pressure_sat_coeff_B[benzene]/(fs.H101.control_volume.properties_out[0.0].temperature_dew + fs.BTHM_params.pressure_sat_coeff_C[benzene])))) - 1 : 0.0 : True\n", + " equilibrium_constraint : Size=4, Index=fs.BTHM_params.component_list, Active=True\n", + " Key : Lower : Body : Upper : Active\n", + " benzene : 0.0 : (fs.H101.control_volume.properties_out[0.0].pressure_sat[benzene]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]))) - ((fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]))*fs.H101.control_volume.properties_out[0.0].pressure) : 0.0 : True\n", + " hydrogen : 0.0 : ((fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]))) - 1e-06 : 0.0 : True\n", + " methane : 0.0 : ((fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]))) - 1e-06 : 0.0 : True\n", + " toluene : 0.0 : (fs.H101.control_volume.properties_out[0.0].pressure_sat[toluene]*(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Liq,hydrogen]))) - ((fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene]/(fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,benzene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,toluene] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,methane] + fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp[Vap,hydrogen]))*fs.H101.control_volume.properties_out[0.0].pressure) : 0.0 : True\n", + "\n", + " 1 Suffix Declarations\n", + " scaling_factor : Direction=EXPORT, Datatype=FLOAT\n", + " Key : Value\n", + " fs.H101.control_volume.properties_out[0.0].equilibrium_constraint : 1e-06\n", + " fs.H101.control_volume.properties_out[0.0].equilibrium_constraint[benzene] : 1e-06\n", + " fs.H101.control_volume.properties_out[0.0].equilibrium_constraint[hydrogen] : 1e-06\n", + " fs.H101.control_volume.properties_out[0.0].equilibrium_constraint[methane] : 1e-06\n", + " fs.H101.control_volume.properties_out[0.0].equilibrium_constraint[toluene] : 1e-06\n", + "\n", + " 29 Declarations: flow_mol_phase_comp pressure temperature flow_mol_phase flow_mol mole_frac_phase_comp mole_frac_comp _teq _t1 eps_1 eps_2 _t1_constraint temperature_bubble _teq_constraint temperature_dew _p_sat_dewT eq_temperature_dew _tr_eq equilibrium_constraint fug_phase_comp pressure_sat eq_pressure_sat material_flow_terms enthalpy_flow_terms enth_mol_phase eq_enth_mol_phase enth_mol_phase_comp eq_enth_mol_phase_comp scaling_factor\n", + "\n", + " 1 Suffix Declarations\n", + " scaling_factor : Direction=EXPORT, Datatype=FLOAT\n", + " Key : Value\n", + " fs.H101.control_volume.heat : 0.01\n", + " fs.H101.control_volume.heat[0.0] : 0.01\n", + "\n", + " 8 Declarations: properties_in properties_out phase_equilibrium_generation material_balances heat enthalpy_balances pressure_balance scaling_factor\n" + ] + } + ], + "source": [ + "m.fs.H101.control_volume.pprint()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-3.6307028494775295e-09" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(((m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Liq','benzene'].value + m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Liq','toluene'].value + m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Liq','methane'].value + m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Liq','hydrogen'].value)*m.fs.H101.control_volume.properties_in[0.0].enth_mol_phase['Liq'].value) + ((m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Vap','benzene'].value + m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Vap','toluene'].value + m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Vap','methane'].value + m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Vap','hydrogen'].value)*m.fs.H101.control_volume.properties_in[0.0].enth_mol_phase['Vap'].value) - (((m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','benzene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','toluene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','methane'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','hydrogen'].value)*m.fs.H101.control_volume.properties_out[0.0].enth_mol_phase['Liq'].value) + ((m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','benzene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','toluene'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','methane'].value + m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Vap','hydrogen'].value)*m.fs.H101.control_volume.properties_out[0.0].enth_mol_phase['Vap'].value)) + m.fs.H101.control_volume.heat[0.0].value)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-2.8161118050115327e-14" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(m.fs.H101.control_volume.properties_in[0.0].flow_mol_phase_comp['Liq','hydrogen'].value - m.fs.H101.control_volume.properties_out[0.0].flow_mol_phase_comp['Liq','hydrogen'].value + (0*m.fs.H101.control_volume.phase_equilibrium_generation[0.0,1].value + 0*m.fs.H101.control_volume.phase_equilibrium_generation[0.0,2].value - m.fs.H101.control_volume.phase_equilibrium_generation[0.0,3].value + 0*m.fs.H101.control_volume.phase_equilibrium_generation[0.0,4].value))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "idaes-pse", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/idaes_examples/notebooks/docs/flowsheets/trial.py b/idaes_examples/notebooks/docs/flowsheets/trial.py new file mode 100644 index 00000000..5a5b6666 --- /dev/null +++ b/idaes_examples/notebooks/docs/flowsheets/trial.py @@ -0,0 +1,117 @@ +from pyomo.environ import ( + Constraint, + Var, + ConcreteModel, + Expression, + Objective, + TransformationFactory, + value, +) + +import pyomo.environ as pyo + +# Todo: Import the above mentioned tools from pyomo.network +from pyomo.network import Arc, SequentialDecomposition +from idaes.core import FlowsheetBlock + +from idaes.models.unit_models import ( + PressureChanger, + Mixer, + Separator as Splitter, + Heater, + CSTR, + Flash, + Translator, +) + +from idaes.models_extra.column_models import TrayColumn +from idaes.models_extra.column_models.condenser import CondenserType, TemperatureSpec +# Utility tools to put together the flowsheet and calculate the degrees of freedom +from idaes.models.unit_models.pressure_changer import ThermodynamicAssumption +from idaes.core.util.model_statistics import degrees_of_freedom +from idaes.core.util.initialization import propagate_state +from idaes.core.solvers import get_solver +import idaes.core.util.scaling as iscale + +# Import idaes logger to set output levels +import idaes.logger as idaeslog + +from idaes_examples.mod.hda import hda_reaction as reaction_props +from idaes.models.properties.activity_coeff_models.BTX_activity_coeff_VLE import ( + BTXParameterBlock, +) + +from idaes_examples.mod.hda.hda_ideal_VLE import HDAParameterBlock + +def main(): + # Create a Pyomo Concrete Model to contain the problem + m = ConcreteModel() + + # Add a steady state flowsheet block to the model + m.fs = FlowsheetBlock(dynamic=False) + # Property package for benzene, toluene, hydrogen, methane mixture + m.fs.BTHM_params = HDAParameterBlock() + + # Property package for the benzene-toluene mixture + m.fs.BT_params = BTXParameterBlock( + valid_phase=("Liq", "Vap"), activity_coeff_model="Ideal" + ) + + # Reaction package for the HDA reaction + m.fs.reaction_params = reaction_props.HDAReactionParameterBlock( + property_package=m.fs.BTHM_params + ) + # Adding the mixer M101 to the flowsheet + m.fs.M101 = Mixer( + property_package=m.fs.BTHM_params, + inlet_list=["toluene_feed", "hydrogen_feed", "vapor_recycle"], + ) + + # Adding the heater H101 to the flowsheet + m.fs.H101 = Heater(property_package=m.fs.BTHM_params, has_phase_equilibrium=True) + + m.fs.s03 = Arc(source=m.fs.M101.outlet, destination=m.fs.H101.inlet) + + TransformationFactory("network.expand_arcs").apply_to(m) + + m.fs.M101.toluene_feed.flow_mol_phase_comp[0, "Vap", "benzene"].fix(1e-5) + m.fs.M101.toluene_feed.flow_mol_phase_comp[0, "Vap", "toluene"].fix(1e-5) + m.fs.M101.toluene_feed.flow_mol_phase_comp[0, "Vap", "hydrogen"].fix(1e-5) + m.fs.M101.toluene_feed.flow_mol_phase_comp[0, "Vap", "methane"].fix(1e-5) + m.fs.M101.toluene_feed.flow_mol_phase_comp[0, "Liq", "benzene"].fix(1e-5) + m.fs.M101.toluene_feed.flow_mol_phase_comp[0, "Liq", "toluene"].fix(0.30) + m.fs.M101.toluene_feed.flow_mol_phase_comp[0, "Liq", "hydrogen"].fix(1e-5) + m.fs.M101.toluene_feed.flow_mol_phase_comp[0, "Liq", "methane"].fix(1e-5) + m.fs.M101.toluene_feed.temperature.fix(303.2) + m.fs.M101.toluene_feed.pressure.fix(350000) + + m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, "Vap", "benzene"].fix(1e-5) + m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, "Vap", "toluene"].fix(1e-5) + m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, "Vap", "hydrogen"].fix(0.30) + m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, "Vap", "methane"].fix(0.02) + m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, "Liq", "benzene"].fix(1e-5) + m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, "Liq", "toluene"].fix(1e-5) + m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, "Liq", "hydrogen"].fix(1e-5) + m.fs.M101.hydrogen_feed.flow_mol_phase_comp[0, "Liq", "methane"].fix(1e-5) + m.fs.M101.hydrogen_feed.temperature.fix(303.2) + m.fs.M101.hydrogen_feed.pressure.fix(350000) + + # Fix the temperature of the outlet from the heater H101 + m.fs.H101.outlet.temperature.fix(600) + + iscale.set_scaling_factor(m.fs.H101.control_volume.heat, 1e-2) + + m.scaling_factor = pyo.Suffix(direction=pyo.Suffix.EXPORT) + + def function(unit): + print(unit) + print(unit.default_initializer()) + initializer = unit.default_initializer() + initializer.initialize(unit, output_level=idaeslog.DEBUG) + + units=[m.fs.M101,m.fs.H101] + for i in units: + function(i) + +if __name__=='__main__': + main() \ No newline at end of file diff --git a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model.ipynb b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model.ipynb index 81a9f371..d1648edd 100644 --- a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model.ipynb +++ b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model.ipynb @@ -35,7 +35,7 @@ "Maintainer: Andrew Lee \n", "Updated: 2023-06-01 \n", "\n", - "In this module, we will be using Pyomo's `parmest` tool in conjuction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", + "In this module, we will be using Pyomo's `parmest` tool in conjunction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", "\n", "We will complete the following tasks:\n", "* Set up a method to return an initialized model\n", @@ -45,8 +45,7 @@ "\n", "## Key links to documentation:\n", "* NRTL Model - https://idaes-pse.readthedocs.io/en/stable/reference_guides/model_libraries/generic/property_models/activity_coefficient.html\n", - "* parmest - https://pyomo.readthedocs.io/en/stable/contributed_packages/parmest/index.html\n", - "" + "* parmest - https://pyomo.readthedocs.io/en/stable/contributed_packages/parmest/index.html\n" ] }, { diff --git a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_doc.ipynb b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_doc.ipynb index ac7d083d..edb05ee6 100644 --- a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_doc.ipynb +++ b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_doc.ipynb @@ -35,7 +35,7 @@ "Maintainer: Andrew Lee \n", "Updated: 2023-06-01 \n", "\n", - "In this module, we will be using Pyomo's `parmest` tool in conjuction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", + "In this module, we will be using Pyomo's `parmest` tool in conjunction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", "\n", "We will complete the following tasks:\n", "* Set up a method to return an initialized model\n", @@ -920,4 +920,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_exercise.ipynb b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_exercise.ipynb index 98e12ba1..9ebb2bbd 100644 --- a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_exercise.ipynb +++ b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_exercise.ipynb @@ -35,7 +35,7 @@ "Maintainer: Andrew Lee \n", "Updated: 2023-06-01 \n", "\n", - "In this module, we will be using Pyomo's `parmest` tool in conjuction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", + "In this module, we will be using Pyomo's `parmest` tool in conjunction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", "\n", "We will complete the following tasks:\n", "* Set up a method to return an initialized model\n", @@ -45,8 +45,7 @@ "\n", "## Key links to documentation:\n", "* NRTL Model - https://idaes-pse.readthedocs.io/en/stable/reference_guides/model_libraries/generic/property_models/activity_coefficient.html\n", - "* parmest - https://pyomo.readthedocs.io/en/stable/contributed_packages/parmest/index.html\n", - "" + "* parmest - https://pyomo.readthedocs.io/en/stable/contributed_packages/parmest/index.html\n" ] }, { @@ -413,4 +412,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_solution.ipynb b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_solution.ipynb index 7fd57e58..d70ff27d 100644 --- a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_solution.ipynb +++ b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_solution.ipynb @@ -35,7 +35,7 @@ "Maintainer: Andrew Lee \n", "Updated: 2023-06-01 \n", "\n", - "In this module, we will be using Pyomo's `parmest` tool in conjuction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", + "In this module, we will be using Pyomo's `parmest` tool in conjunction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", "\n", "We will complete the following tasks:\n", "* Set up a method to return an initialized model\n", @@ -45,8 +45,7 @@ "\n", "## Key links to documentation:\n", "* NRTL Model - https://idaes-pse.readthedocs.io/en/stable/reference_guides/model_libraries/generic/property_models/activity_coefficient.html\n", - "* parmest - https://pyomo.readthedocs.io/en/stable/contributed_packages/parmest/index.html\n", - "" + "* parmest - https://pyomo.readthedocs.io/en/stable/contributed_packages/parmest/index.html\n" ] }, { @@ -540,4 +539,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_test.ipynb b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_test.ipynb index 614fa796..7add77ff 100644 --- a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_test.ipynb +++ b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_test.ipynb @@ -35,7 +35,7 @@ "Maintainer: Andrew Lee \n", "Updated: 2023-06-01 \n", "\n", - "In this module, we will be using Pyomo's `parmest` tool in conjuction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", + "In this module, we will be using Pyomo's `parmest` tool in conjunction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", "\n", "We will complete the following tasks:\n", "* Set up a method to return an initialized model\n", @@ -45,8 +45,7 @@ "\n", "## Key links to documentation:\n", "* NRTL Model - https://idaes-pse.readthedocs.io/en/stable/reference_guides/model_libraries/generic/property_models/activity_coefficient.html\n", - "* parmest - https://pyomo.readthedocs.io/en/stable/contributed_packages/parmest/index.html\n", - "" + "* parmest - https://pyomo.readthedocs.io/en/stable/contributed_packages/parmest/index.html\n" ] }, { @@ -481,4 +480,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_usr.ipynb b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_usr.ipynb index 7fd57e58..d70ff27d 100644 --- a/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_usr.ipynb +++ b/idaes_examples/notebooks/docs/param_est/parameter_estimation_nrtl_using_unit_model_usr.ipynb @@ -35,7 +35,7 @@ "Maintainer: Andrew Lee \n", "Updated: 2023-06-01 \n", "\n", - "In this module, we will be using Pyomo's `parmest` tool in conjuction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", + "In this module, we will be using Pyomo's `parmest` tool in conjunction with IDAES models for parameter estimation. We demonstrate these tools by estimating the parameters associated with the NRTL property model for a benzene-toluene mixture. The NRTL model has 2 sets of parameters: the non-randomness parameter (`alpha_ij`) and the binary interaction parameter (`tau_ij`), where `i` and `j` is the pure component species. In this example, we will be only estimate the binary interaction parameter (`tau_ij`) for a given dataset. When estimating parameters associated with the property package, IDAES provides the flexibility of doing the parameter estimation by just using the state block or by using a unit model with a specified property package. This module will demonstrate parameter estimation by using the flash unit model with the NRTL property package. \n", "\n", "We will complete the following tasks:\n", "* Set up a method to return an initialized model\n", @@ -45,8 +45,7 @@ "\n", "## Key links to documentation:\n", "* NRTL Model - https://idaes-pse.readthedocs.io/en/stable/reference_guides/model_libraries/generic/property_models/activity_coefficient.html\n", - "* parmest - https://pyomo.readthedocs.io/en/stable/contributed_packages/parmest/index.html\n", - "" + "* parmest - https://pyomo.readthedocs.io/en/stable/contributed_packages/parmest/index.html\n" ] }, { @@ -540,4 +539,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc.ipynb b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc.ipynb index f91154e8..8c430e3a 100644 --- a/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc.ipynb +++ b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc.ipynb @@ -5125,7 +5125,7 @@ " t16\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5437,7 +5437,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Assert results approximatly agree with baseline reoprt\n", + "# Assert results approximately agree with baseline reoprt\n", "assert pyo.value(m.fs.net_power_mw[0]) == pytest.approx(646)\n", "assert pyo.value(m.fs.gross_power[0]) == pytest.approx(-690e6, rel=0.001)\n", "assert pyo.value(100 * m.fs.lhv_efficiency[0]) == pytest.approx(52.8, abs=0.1)\n", @@ -5619,5 +5619,9 @@ } }, "nbformat": 4, +<<<<<<< HEAD:idaes_examples/notebooks/docs/power_gen/ngcc/ngcc.ipynb "nbformat_minor": 5 +======= + "nbformat_minor": 3 +>>>>>>> 8818ba74788937addd589a9b2aedb1a0139f0ad7:idaes_examples/notebooks/active/power_gen/ngcc/ngcc_doc.ipynb } diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/steam_turbine_template.svg b/idaes_examples/notebooks/docs/power_gen/ngcc/steam_turbine_template.svg index 7d1b06e5..49630870 100644 --- a/idaes_examples/notebooks/docs/power_gen/ngcc/steam_turbine_template.svg +++ b/idaes_examples/notebooks/docs/power_gen/ngcc/steam_turbine_template.svg @@ -1081,7 +1081,7 @@