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": "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", "text/plain": [ "
" ] @@ -1935,7 +1935,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEGCAYAAABiq/5QAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAArRklEQVR4nO3dd3yV5f3/8dcnA8KGDEKYYcneYSPgRK0DHFUcoLVF2mK1Fr+12ir+WjvcqxVFUbQOqMU9ClqZsoKEJVvCJiRhhU2S6/fHuUMjJiFATu6TnPfz8TiPc5879znnk+sk7/s+133f123OOUREJHxE+F2AiIiULwW/iEiYUfCLiIQZBb+ISJhR8IuIhJkovwsojfj4eJecnOx3GSIiFcrixYuznHMJJ8+vEMGfnJxMamqq32WIiFQoZrapqPnq6hERCTMKfhGRMKPgFxEJMxWij19ETs/x48fZunUrR44c8bsUKQcxMTE0btyY6OjoUi2v4BephLZu3UqtWrVITk7GzPwuR4LIOUd2djZbt26lefPmpXqOunpEKqEjR44QFxen0A8DZkZcXNxpfbtT8ItUUgr98HG6n3WlDv5F6bt5YcYGv8sQEQkplTr4P1+xk0f/s5pvNu/xuxQROQ3jx4/n9ddfL5PXSk5OJisrq8Rl/vznP3/vcb9+/crkvUtrxowZfP311ycel+XvX5RKHfy/vugcGtSO4YH3VpCbl+93OSJhyTlHfv7p/f+NHj2aESNG/GB+bm5uWZX1PScHf+EQLisl1X5y8Bf3+5eVSh38NatG8dAVHVi1Yz+vzk33uxyRsJGenk67du34xS9+Qffu3dmyZQuPPfYYPXv2pHPnzjz00EMnln399dfp3LkzXbp04ZZbbgFg3LhxPP744wAMHjyY+++/n0GDBvHMM8+waNEi+vXrR5cuXejVqxc5OTm89tprjBkz5sRrXn755cyYMeMHdQ0dOpQePXrQoUMHXnrpJQDuu+8+Dh8+TNeuXbnpppsAqFmzJhBYad1777107NiRTp06MXnyZCAQ1IMHD+baa6+lbdu23HTTTRR1NcOTa//oo4/o3bs33bp148ILLyQjI4P09HTGjx/PU089RdeuXZk9e/b3fv+0tDT69OlD586dGTZsGHv2nH0PRqU/nHNIh0QubFefJ6ev5bLOSTSqW83vkkTK1cMfreTb7fvL9DXbN6zNQ1d0KHGZNWvW8Oqrr/KPf/yDadOmsW7dOhYuXIhzjiuvvJJZs2YRFxfHI488wty5c4mPj2f37t1FvtbevXuZOXMmx44do23btkyePJmePXuyf/9+qlUr/f/0xIkTiY2N5fDhw/Ts2ZNrrrmGv/71rzz//POkpaX9YPmpU6eSlpbG0qVLycrKomfPngwcOBCAJUuWsHLlSho2bEj//v2ZO3cuAwYMKLZ2gD179jB//nzMjJdffplHH32UJ554gtGjR1OzZk3Gjh0LwJdffnni+SNGjOC5555j0KBBPPjggzz88MM8/fTTpf6di1Kpt/ghsLd73JWBP9BxH670uRqR8NGsWTP69OkDwLRp05g2bRrdunWje/furF69mnXr1vHf//6Xa6+9lvj4eABiY2OLfK3rr78eCKxMkpKS6NmzJwC1a9cmKqr026/PPvssXbp0oU+fPmzZsoV169aVuPycOXMYPnw4kZGRJCYmMmjQIBYtWgRAr169aNy4MREREXTt2pX09PQSa4fA+RVDhgyhU6dOPPbYY6xcWXIm7du3j7179zJo0CAARo4cyaxZs0r9+xan0m/xAzSuV527L2zNXz5bzbSVO7m4QwO/SxIpN6faMg+WGjVqnJh2zvG73/2OO+6443vLPPvss6U6FLHgtZxzRS4fFRX1vf0IRR3TPmPGDL744gvmzZtH9erVGTx48CmPfS+q+6ZA1apVT0xHRkYW24dfuB3uvPNO7rnnHq688kpmzJjBuHHjSnz/YKn0W/wFfjKgOW0b1GLchys5eDQ4O4hEpGhDhgxh4sSJHDhwAIBt27axa9cuLrjgAqZMmUJ2djZAsV09Bdq2bcv27dtPbHXn5OSQm5tLcnIyaWlp5Ofns2XLFhYuXPiD5+7bt4969epRvXp1Vq9ezfz580/8LDo6muPHj//gOQMHDmTy5Mnk5eWRmZnJrFmz6NWr1xm3w759+2jUqBEAkyZNOjG/Vq1a5OTk/GD5OnXqUK9ePWbPng3AG2+8cWLr/2yETfBHR0bwyLCObN93hKe/WOt3OSJh5eKLL+bGG2+kb9++dOrUiWuvvZacnBw6dOjAAw88wKBBg+jSpQv33HNPia9TpUoVJk+ezJ133kmXLl246KKLOHLkCP3796d58+Z06tSJsWPH0r179x8895JLLiE3N5fOnTvzhz/84UQ3FMCoUaPo3LnziZ27BYYNG3Zix/P555/Po48+SoMGZ95jMG7cOK677jrOPffcE91bAFdccQXvvffeiZ27hU2aNIl7772Xzp07k5aWxoMPPnjG71/ASvoqEypSUlJcWV2I5XdTlzMldQsfjRlA+4a1y+Q1RULNqlWraNeund9lSDkq6jM3s8XOuZSTlw2bLf4C913SlrrVorn/veXk5Yf+Sk9EpKyFXfDXqR7N7y9vR9qWvby9cLPf5YiIlLuwC36AoV0b0b9VHH/7fDW7cjReuVROFaEbV8rG6X7WYRn8ZsYfr+rI0eP5/OnjVX6XI1LmYmJiyM7OVviHgYLx+GNiYkr9nLA4jr8oLRJq8ovzWvL0F+u4LqUx57ZO8LskkTLTuHFjtm7dSmZmpt+lSDkouAJXaYXdUT2FHTmex6XPzMY5x+d3DyQmOrLM30NExC86qqcIMdGRPDK0I+nZh/jHV+v9LkdEpFyEdfAD9GsVz7BujXhh5gbW7zrgdzkiIkEX9sEPcP9l7agWHcnv31+unWEiUukp+IGEWlW579J2zP9uN1O/2eZ3OSIiQaXg99zQswndm9blkU9XsefgMb/LEREJmqAFv5nFmNlCM1tqZivN7GFvfqyZTTezdd59vWDVcDoiIoxHhnVi3+Hj/O3z1X6XIyISNMHc4j8KnO+c6wJ0BS4xsz7AfcCXzrnWwJfe45DQLqk2Px3QnHcWbWFResnDw4qIVFRBC34XUHCYTLR3c8BVQMFA1JOAocGq4UzcdWFrGtWtxgPvLedYri7QLiKVT1D7+M0s0szSgF3AdOfcAiDRObcDwLuvX8xzR5lZqpmllufZh9WrRPHwlR1Ym3GAV+ZsLLf3FREpL0ENfudcnnOuK9AY6GVmHU/juS8551KccykJCeU7nMKF7RMZ0iGRZ75cy5bdh8r1vUVEgq1cjupxzu0FZgCXABlmlgTg3e8qjxpO17grOxBpxh8+WKFj+0WkUgnmUT0JZlbXm64GXAisBj4ERnqLjQQ+CFYNZyOpTjXuHdKGGWsyeWP+Jr/LEREpM8EcnTMJmGRmkQRWMFOccx+b2TxgipndDmwGrgtiDWdlZL9kZq3L4k+frCKlWawu1SgilUJYj85ZGtkHjnLpM7OpGRPFx3cOoHqVsB3JWkQqGI3OeYbialbl6Ru6sjHrIA99sNLvckREzpqCvxT6tYxnzHmt+NfirXyQprF8RKRiU/CX0l0XtCalWT0eeG8Fm7IP+l2OiMgZU/CXUlRkBE/f0JUIgzvfXqKzekWkwlLwn4bG9arz6LWdWbZ1H49PW+N3OSIiZ0TBf5ou6ZjEzX2a8tKs75ixJiTPPRMRKZGC/wz8/kftadugFr+ZspRd+4/4XY6IyGlR8J+BmOhInhvejYPHcvn1lDTy80P/XAgRkQIK/jPUOrEW467owNz12bwwc4Pf5YiIlJqC/yxc37MJP+qcxJPT17J40x6/yxERKRUF/1kwM/5ydSeS6sTwq7eXsO/wcb9LEhE5JQX/WaodE81zw7uRsf8Iv5u6TEM4i0jIU/CXgW5N6zF2SBs+Xb6Ttxdu8bscEZESKfjLyKhzW3Bu63ge/mglazNy/C5HRKRYCv4yEhFhPPHjLtSKiWLMW99w+Fie3yWJiBRJwV+G6teK4ckfd2VtxgH++Mm3fpcjIlIkBX8ZG3hOAncMasFbCzbzybIdfpcjIvIDCv4gGHtxG7o0qct9U5exZfchv8sREfkeBX8QREdG8NwN3cAFhnA+mqv+fhEJHQr+IGkaFxjCOW3LXn77ro7vF5HQoeAPoks7JTH24nN4P207z3y5zu9yREQAiPK7gMrul+e1YmPWIZ7+Yh3JcTUY2q2R3yWJSJjTFn+QFYzn07t5LP/37jJS03f7XZKIhDkFfzmoEhXB+Jt70KheNUa9sVgXaxcRXyn4y0m9GlWYeGtP8p3jttcWse+QRvIUEX8o+MtR8/gavHhzD7bsPsTofy7mWG6+3yWJSBhS8Jez3i3i+OvVnZn3XTa/f3+5DvMUkXKno3p8cE2PxmzKPsiz/11P8/ia/HxwS79LEpEwouD3ya8vOoeN2Yf42+eraRZXncs6JfldkoiECXX1+MTMeOzaznRvWpdfT04jbctev0sSkTCh4PdRTHQkE0akUL92VX46KZWtezSgm4gEn4LfZ3E1qzJxZE+O5uZx+2up5BzRYZ4iElwK/hDQOrEWL9zUgw2ZBxjz1hJy83SYp4gEj4I/RAxoHc8fh3Zk5tpMHv7oWx3mKSJBo6N6QsjwXk1JzzrIi7O+o3l8DX4yoLnfJYlIJaTgDzG/vaQt6dkH+eMn39I0tjoXtk/0uyQRqWTU1RNiIiKMp6/vRqdGdfjVO0tYsW2f3yWJSCWj4A9B1apE8vKIFOpUi+b2SYs0mqeIlCkFf4iqXzuG127rxbHcfIa/NF8XbReRMhO04DezJmb2lZmtMrOVZnaXN3+cmW0zszTvdlmwaqjo2jSoxT9/2puDx/K44aX5OsFLRMpEMLf4c4HfOOfaAX2AX5pZe+9nTznnunq3T4NYQ4XXoWEd3vxpb3KOHGf4hPls33vY75JEpIILWvA753Y4577xpnOAVYAuOHsGOjaqwxu392bvwePcOGE+O/cd8bskEanAyqWP38ySgW7AAm/WGDNbZmYTzaxeMc8ZZWapZpaamZlZHmWGtC5N6jLp9l5kHTjGjRPms2u/wl9EzkzQg9/MagL/Bu52zu0HXgBaAl2BHcATRT3POfeScy7FOZeSkJAQ7DIrhO5N6/HabT3Zuf8IwyfMJzPnqN8liUgFFNTgN7NoAqH/pnNuKoBzLsM5l+ecywcmAL2CWUNlk5Icy6u39mT73iPc9PJ8sg8o/EXk9ATzqB4DXgFWOeeeLDS/8BVHhgErglVDZdW7RRyv3JrC5t2HuOnlBew+eMzvkkSkAgnmFn9/4Bbg/JMO3XzUzJab2TLgPODXQayh0urXMp6XR/RkY9ZBbn55AXsPKfxFpHSsIowCmZKS4lJTU/0uIyTNXJvJzyalnjjmv061aL9LEpEQYWaLnXMpJ8/XmbsV3KBzEnjxlh6s3rmfERMXsl8XchGRU1DwVwLnta3PP27qwcpt+xg5caGu4iUiJVLwVxIXtU/k+Ru7s2zrPm57dREHj+b6XZKIhCgFfyVySccGPHtDN5Zs2cttry3i0DGFv4j8kIK/kvlR5ySeur4rqem7uf21VA4fy/O7JBEJMQr+SujKLg154sddmL8xm5+9nqpuHxH5HgV/JTWsW2Mev7YLX2/IYviE+WTpDF8R8Sj4K7FrejRmwogU1mbkcM0LX5OepSt5iYiCv9K7oF0ib/+sDzlHcrn6ha9J27LX75JExGcK/jDQrWk93h3dlxpVIxn+0nz+uzrD75JExEcK/jDRIqEmU3/en1b1a/Kz1xfzzsLNfpckIj5R8IeRhFpVeWdUH/q3iue+qct55ot1VISxmkSkbCn4w0yNqlG8MjKFa7o35qkv1nL/e8vJzcv3uywRKUdRpV3QzLoA53oPZzvnlganJAm26MgIHr+uM0l1Ynj+q/Xs2n+U527sRvUqpf5zEJEKrFRb/GZ2F/AmUN+7/dPM7gxmYRJcZsbYIW3449COfLVmFzdOWKCreYmEidJ29dwO9HbOPeicexDoA/wseGVJebmlTzNeuLkHq3bs59rx89icfcjvkkQkyEob/AYUHvQlz5snlcCQDg1462e92XPoGFe/MJflW/f5XZKIBFFpg/9VYIGZjTOzccB8AtfTlUqiR7NY3h3dj6pRkVz/0jxmrNnld0kiEiSlCn7vYum3AbuBPcBtzrmng1iX+KBV/ZpM/UU/msXV4KeTUnl38Va/SxKRICgx+M2stncfC6QD/wTeADZ586SSSawdw5Q7+tC7RSxj/7WU5/+rY/1FKptTbfG/5d0vBlIL3QoeSyVUKyaaV2/txdCuDXl82lrGvLWEAxraWaTSKPHAbefc5d598/IpR0JFlagInrq+K22TavPo56tZm5HD+Ft60DKhpt+lichZKu1x/F+WZp5ULmbG6EEteeP23mQfPMZVz8/lPyt3+l2WiJylU/Xxx3h9+fFmVs/MYr1bMtCwXCoU3/VvFc9Hdw6gRUIN7nhjMY//Zw15+er3F6moTrXFfweB/vy23n3B7QPg78EtTUJJo7rVmHJHX65PacLzX63nttcWsefgMb/LEpEzYKU5YsPM7nTOPVcO9RQpJSXFpaZqX3KoeHvhZh76YCX1a1dl/M096Niojt8liUgRzGyxcy7l5PmlPY7/OTPraGY/NrMRBbeyL1MqguG9mjJldF/y8h3XvPC1jvcXqWBKu3P3IeA573Ye8ChwZRDrkhDXtUldPrpzAN2b1mPsv5byh/dXcCxXwzuLVASlHbLhWuACYKdz7jagC1A1aFVJhRBfsypv3N6LUQNb8Mb8Tdzw0jwy9h/xuywROYXSBv8R51w+kOudzbsLaBG8sqSiiIqM4P7L2vH3G7uzemcOP3p2Dgu+y/a7LBEpwSmD38wMWGZmdYEJBI7q+QZYGNzSpCL5Ueck3v9lf2rHRHHjywuYOGejhnoQCVGnDH4X+O/t6pzb65wbD1wEjPS6fEROOCexFu+P6c/5bevz/z7+lrsnp3HomIZ6EAk1pe3qmW9mPQGcc+nOuWVBrEkqsNox0bx4cw/uHdKGD5du5+p/fM2anTl+lyUihZQ2+M8D5pnZBjNbZmbLzUzhL0WKiDB+eV4rJt3Wi6wDR7ni+Tm8Mmcj+TrbVyQklPYErmZFzXfObSrzioqgE7gqrqwDR7nv38v4YtUu+reK4/HrupBUp5rfZYmEhbM9gWtTUbeyL1Mqm/iaVZkwIoW/XN2JbzbtZchTs/h42Xa/yxIJa6Xt6hE5Y2bG8F5N+fSuc2mRUJMxby3h15PT2H/kuN+liYQlBb+Um+bxNXh3dF/uvrA1Hy7dzqVPz2a+jvkXKXdBC34za2JmX5nZKjNbaWZ3efNjzWy6ma3z7usFqwYJPVGREdx94Tm8O7ov0ZHG8Anz+ctnqziam+d3aSJhI5hb/LnAb5xz7YA+wC/NrD1wH/Clc6418KX3WMJMt6b1+ORX53JDz6a8OPM7hv79a9Zm6LBPkfIQtOB3zu1wzn3jTecAq4BGwFXAJG+xScDQYNUgoa1G1Sj+cnUnXh6Rwq79R7j8OR32KVIeyqWP37tiVzdgAZDonNsBgZUDUL+Y54wys1QzS83MzCyPMsUnF7ZP5PO7B3Juq3j++PG3jJi4kJ37NNibSLAEPfjNrCbwb+Bu59z+0j7POfeScy7FOZeSkJAQvAIlJCTUqsrLI1P487BOLN60hyFP67BPkWAJavCbWTSB0H/TOTfVm51hZknez5MIjPQpgplxY+/AYZ/J8TUY89YS7n5niS7xKFLGgnlUjwGvAKucc08W+tGHwEhveiSB6/eKnFBw2OddF7Tm42U7uODJmfx78VaN9ilSRko1ZMMZvbDZAGA2sBwouDTT/QT6+acATYHNwHXOud0lvZaGbAhfq3fu5/6py/lm8176t4rjT0M70Ty+ht9liVQIxQ3ZELTgL0sK/vCWn+94c+FmHv1sNUfz8rnzvFbcMaglVaJ0/qFISc5qrB4RP0VEGLf0acaXvxnERe0SeWL6Wi57djaL0kv8oigixVDwS4VRv3YMf7+pOxNvTeHwsTyuGz+P301dxr5DGvNH5HQo+KXCOb9tItPvGciogS2YkrqVC56cwQdp27TzV6SUFPxSIVWvEsX9l7XjwzH9aVS3Gne9k8bIVxexOfuQ36WJhDwFv1RoHRrWYeov+jPuivYsTt/NxU/P5IUZGziel3/qJ4uEKQW/VHiREcat/ZvzxW8GMeicBP72+WqueG4O32ze43dpIiFJwS+VRlKdarx4Swov3dKDfYePc80LX/PAe8t15q/ISRT8Uulc3KEB0+8ZxK39knl74WYGPfYVL8/+jmO56v4RAQW/VFI1q0bx0BUd+PzugXRtWo8/fbKKIU/PYtrKnTr6R8Kegl8qtXMSa/H6T3rx6m09iYwwRr2xmBsnLGDl9n1+lybiGwW/hIXz2tTn87vO5Y9XdWD1zv1c/twc/u/dpezar3H/Jfwo+CVsREVGcEvfZGbcex4/HdCc95ZsY/DjM3juy3UcOa5r/kr4UPBL2KlTLZoHftSe6b8exMDWCTwxfS3nPz6D95ds02UfJSwo+CVsJcfXYPwtPXhnVB9ia1bh7slpDHvhaxZv0uBvUrkp+CXs9WkRx4e/HMDj13Vh577DXPPCPMa89Q1bdmv4B6mcFPwiBIZ+vrZHY74aO5hfXdCaL1ZlcMGTM/nrZ6s1+qdUOroQi0gRduw7zGOfr2Hqkm3UionipwNa8JMBydSKifa7NJFS0xW4RM7Aqh37eWr6WqZ9m0Hd6tGMGtiCkX2TqVE1yu/SRE5JwS9yFpZv3ceT09fw1ZpM4mpU4eeDW3Jzn2bEREf6XZpIsRT8ImVg8aY9PDV9LXPWZ1G/VlV+eV4rbujVhKpRWgFI6FHwi5ShBd9l88T0tSzcuJuGdWIYc35rrktpTHSkjpeQ0KHgFyljzjnmrs/mielrWLJ5L01iq/Gr81szrFsjorQCkBBQXPDrr1PkDJkZA1rHM/Xn/Xj11p7UqRbNve8u4+KnZvFB2jbydBawhCgFv8hZMjPOa1ufj8YM4MVbelAlKoK73knj0mdm8enyHRoGQkKOunpEylh+vuPTFTt4avpaNmQepEVCDUYPbMlV3RpqJ7CUK/Xxi5SzvHzHp8t3MH7mBlZu309i7arcPqA5w3s11YlgUi4U/CI+cc4xe10W42du4OsN2dSKiWJE32bc2q85CbWq+l2eVGIKfpEQsHTLXl6ctYHPVuwkOjKC63o0ZtTAFjSLq+F3aVIJKfhFQsh3mQeYMPs7/r14G7n5+VzWKYnRg1rSsVEdv0uTSkTBLxKCdu0/witzN/LW/M3kHM3l3NbxjB7Ukn4t4zAzv8uTCk7BLxLC9h85zpvzN/PKnI1kHThK58Z1GD2oJUM6NCAyQisAOTMKfpEK4MjxPKZ+s42XZm0gPfsQyXHVGdkvmWt7NNaRQHLaFPwiFUhevuPzFTuZMPs70rbspUaVSK7p0ZgRfZNpVb+m3+VJBaHgF6mglm7Zy6Sv0/l42Q6O5eVzbut4bu2XzOA29dUNJCVS8ItUcFkHjvL2gs38c8EmMvYfpWlsdUb0bcZ1KU2oU03dQPJDCn6RSuJ4Xj7/WbmTSV+nsyh9D9WiIxnWvRG39kvmnMRafpcnIUTBL1IJrdi2j9fnpfNB2naO5ubTt0UcI/slc1H7RHUDiYJfpDLbc/AY7yzawj/nb2Lb3sM0qluNm/s044aeTahXo4rf5YlPyj34zWwicDmwyznX0Zs3DvgZkOktdr9z7tNTvZaCX6R0cvPy+WLVLiZ9nc6877KpGhXBZZ2SuL5nE3o3j9VJYWHGj+AfCBwAXj8p+A845x4/nddS8IucvjU7c/jn/E28n7aNnCO5NI+vwY9TmnBNj0bUrxXjd3lSDnzp6jGzZOBjBb+Ifw4fy+OzFTt4Z9EWFm7cTWSEcUHb+tzQqwkDWyfoMpGVWHHBH+VDLWPMbASQCvzGObenqIXMbBQwCqBp06blWJ5I5VKtSiRXd2/M1d0bsyHzAFNSt/DvxVuZ9m0GDWrHcF1KY36c0oQmsdX9LlXKSXlv8ScCWYAD/ggkOed+cqrX0Ra/SNk6npfPl6t28c6izcxcm4lzMKBVPNf3bMLFHRJ1pbBKIiS2+J1zGYUKmgB8XJ7vLyIB0ZERXNKxAZd0bMD2vYf5V+pWpqRu4c63l1CvejRXd2/M9T2b6LyASqpcg9/MkpxzO7yHw4AV5fn+IvJDDetW464LWzPm/FbMXZ/F5EVbeH1eOq/M2Ui3pnW5untjLu+UpMNCK5FgHtXzNjAYiAcygIe8x10JdPWkA3cUWhEUS109IuUr+8BR3luyjSmpW1ibcYDoSGNwm/oM69aI89vWJyZaXUEVgU7gEpHT5pzj2x37eX/JNj5I286unKPUioniso5JDO3WiN7NY4nQGcIhS8EvImclL98xb0M2U5ds5T8rdnLwWB4N68RwVbdGDOvWSPsDQpCCX0TKzKFjuUz/NoP3l2xj1ros8vId7ZNqM6xbI67s2pDE2jpBLBQo+EUkKLIOHOXjpdt5b8k2lm7dR4RB/1bxDO3aiCEdG1Czqh+nCwko+EWkHGzIPMAHS7bxXto2tuw+TEx0BOe1qc9lnZI4v219amglUK4U/CJSbpxzfLN5D+8v2c5nK3aSdeCoVgI+UPCLiC/y8h2L0nfz6fIdfLZiJ5k5gZXA4HPqc1nnJC7QSiBoFPwi4ru8fEdq+m4+KbQSqBrlfRPQSqDMKfhFJKQUrAQKvgns8lYCg9skcFmnJC5ol6gdw2dJwS8iISsv37F40x4+Wbb9eyuBQeckcHGHBlzQtr6GjDgDCn4RqRDy8x2pm/Z43wR2kLH/KBEGPZNjuah9Ihe3b0DTOA0hXRoKfhGpcPLzHcu37WP6txlM/zaDNRk5ALRJrMVF7RO5qH0inRrV0bARxVDwi0iFtzn7ENO+3cn0bzNYlL6bfAeJtatyYbtELmyfSL+WcbqWQCEKfhGpVPYcPMZXa3Yx/dsMZq7N5NCxPGpUiWRQmwQuap/I+W0SqVM92u8yfaXgF5FK68jxPOZtyGbatxl8sSqDzJyjREYYvZJjOb9tfQa3SaBV/ZqYhVeXkIJfRMJCfr5j6da9TPdWAmszDgDQqG41BrdJ4Lw29enXKo7qVSr/oaIKfhEJS9v2Hmbmmky+WrOLueuzOHQsjyqREfRqHsvgNgkMblOflgk1KuW3AQW/iIS9o7l5pKbvYcaaXcxYk8m6XYFvA01iqzH4nECXUN+WlefbgIJfROQkW/ccYsaaTGas2cXc9dkcPp5HlagIejePZXCbwIqgRXzF/Tag4BcRKcHR3DwWbdzDV2t2MWPNLjZkHgQC+wYGtIqnf+t4+reMI65mVZ8rLT0Fv4jIadiy+xAz1mYyd10WX2/IYv+RXADaJ9Xm3Nbx9G8VT8/kWKpVCd3zBhT8IiJnKM87g3jOukzmrM9i8aY9HM9zVImKIKVZPfq3iufc1vF0aFiHyBA6i1jBLyJSRg4dy2Xhxt3MXZ/F7HVZrN4ZGEqibvVo+rWMo3+reAa0iqdZXA1f6ywu+CvHrmsRkXJUvUqUt/O3PgCZOUf5ekMWc9ZlMWd9Fp8u3wkEjhbq2yKOPt6tYd1qfpZ9grb4RUTKkHOO77IOMnd9YEWwYONu9h0+DkDT2Or0aRFbbisCdfWIiPggP9+xemcO87/LZv532cWuCHq3iKNRGa8IFPwiIiEgP9+xJuP7K4K9h4KzIlDwi4iEoJJWBE1iq/G3azrTr2X8Gb22du6KiISgiAijXVJt2iXV5rb+zX+wImhQO6bM31PBLyISQk5eEQTlPYLyqiIiErIU/CIiYUbBLyISZhT8IiJhRsEvIhJmFPwiImFGwS8iEmYU/CIiYaZCDNlgZpnAJr/rKEY8kOV3ESVQfWdH9Z0d1Xf2zqbGZs65hJNnVojgD2VmllrUWBihQvWdHdV3dlTf2QtGjerqEREJMwp+EZEwo+A/ey/5XcApqL6zo/rOjuo7e2Veo/r4RUTCjLb4RUTCjIJfRCTMKPhPg5k1MbOvzGyVma00s7u8+ePMbJuZpXm3y3ysMd3Mlnt1pHrzYs1supmt8+7r+VRbm0JtlGZm+83sbj/bz8wmmtkuM1tRaF6x7WVmvzOz9Wa2xsyG+FTfY2a22syWmdl7ZlbXm59sZocLteN4n+or9vMMkfabXKi2dDNL8+b70X7FZUpw/wadc7qV8gYkAd296VrAWqA9MA4Y63d9Xl3pQPxJ8x4F7vOm7wP+FgJ1RgI7gWZ+th8wEOgOrDhVe3mf9VKgKtAc2ABE+lDfxUCUN/23QvUlF17Ox/Yr8vMMlfY76edPAA/62H7FZUpQ/wa1xX8anHM7nHPfeNM5wCqgkb9VlcpVwCRvehIw1L9STrgA2OCc8/WMbOfcLGD3SbOLa6+rgHecc0edcxuB9UCv8q7POTfNOZfrPZwPNA5mDSUppv2KExLtV8DMDPgx8HYwayhJCZkS1L9BBf8ZMrNkoBuwwJs1xvvqPdGvrhSPA6aZ2WIzG+XNS3TO7YDAHxpQ37fq/ucGvv8PFyrtB8W3VyNgS6HltuL/iv8nwGeFHjc3syVmNtPMzvWrKIr+PEOt/c4FMpxz6wrN8639TsqUoP4NKvjPgJnVBP4N3O2c2w+8ALQEugI7CHx99Et/51x34FLgl2Y20MdaimRmVYArgX95s0Kp/UpiRczz7XhoM3sAyAXe9GbtAJo657oB9wBvmVltH0or7vMMqfYDhvP9jQ/f2q+ITCl20SLmnXYbKvhPk5lFE/iA3nTOTQVwzmU45/Kcc/nABIL89bUkzrnt3v0u4D2vlgwzSwLw7nf5VZ/nUuAb51wGhFb7eYprr61Ak0LLNQa2l3NtAJjZSOBy4Cbndf56X/+zvenFBPp/zynv2kr4PEOp/aKAq4HJBfP8ar+iMoUg/w0q+E+D1yf4CrDKOfdkoflJhRYbBqw4+bnlwcxqmFmtgmkCOwFXAB8CI73FRgIf+FFfId/b0gqV9iukuPb6ELjBzKqaWXOgNbCwvIszs0uA3wJXOucOFZqfYGaR3nQLr77vfKivuM8zJNrPcyGw2jm3tWCGH+1XXKYQ7L/B8tyDXdFvwAACX6uWAWne7TLgDWC5N/9DIMmn+loQ2OO/FFgJPODNjwO+BNZ597E+tmF1IBuoU2ieb+1HYAW0AzhOYGvq9pLaC3iAwJbgGuBSn+pbT6Cft+BvcLy37DXe574U+Aa4wqf6iv08Q6H9vPmvAaNPWtaP9isuU4L6N6ghG0REwoy6ekREwoyCX0QkzCj4RUTCjIJfRCTMKPhFRMKMgl/KlDfCYZkch29mg82sXymXTTez+FMsc6uZNSyj2hLMbI6ZrTCzoYXmf1Dce5jZaDMbURbvX97Ksu3Efwp+CWWDgVIFfyndCpRVeA0nMHhWX+BeADO7gsAZyUWeSemcG++ce/1s37jgJKNyditl13biMwW/BEOkmU3wxhefZmbVAMyspZl97g0gN9vM2nrzrzCzBd7gWF+YWaI3YNVo4Nfe2OjfGzDLzOK8115iZi/ijWFy8jcOMxtrgfHhrwVSgDe91/uRmb1XaLmLzGwqpXccqEZgeNx8bwiAu4HHinuCV8dYb3qGmf3NzBaa2dqC38/MIs3scQtcU2GZmd3pzU83swfNbA5wnZldbGbzzOwbM/uXN9ZLwXJ/9n6Wambdzew/ZrbBzEYXquVeM1vkvcfDhdpu1cmfXRFtV+002klCUbDPTNMtvG4ExjTPBbp6j6cAN3vTXwKtvenewH+96Xr87/rPPwWe8KbHUcw4/cCz/G8c9R8ROPsxnpPGVAfGAuO86RlAijdtwGogwXv8FqdxpiZQB/gESCUwxPSvgJGneM6J38erpeD3vAz4wpv+OYFxWwrG24/17tOB//Om44FZQA3v8W8LtUU68HNv+ikCZ4TWAhKAXd78iwlcwNsIbPx9TGDc+pI+uxNtp1vFv0UVsS4QOVsbnXNp3vRiINnbIu0H/CswPAkQ2FqGwEBTk70xXqoAG0vxHgMJDLKFc+4TM9tzOgU655yZvQHcbGavEuiyKXX/u3NuH4EVDhYYdvi3wNVmNoHAiuwJ59y8U7xMwTeMxQRCFwJjyIx33nj7zrnCY8kXDCjWh8AFOeZ6bVkFKPxeH3r3y4GaLjDOe46ZHbHA1bou9m5LvOVqEhjzZTNFfHan+B2kAlLwSzAcLTSdR6BLJALY65zrWsTyzwFPOuc+NLPBBLaMS6Oo8UZy+X4XZkwJz38V+Ag4AvzL/e/iJgCYWW/gRe/hg865Dynag8AjBPr9FxP49vABcN4p6i9opzz+979oFD/M7sFCy0x3zg0/xevm8/3PIt97HwP+4px7sfCTvO61oj47qWTUxy/lwgXGGN9oZtdBYFRCM+vi/bgOsM2bHlnoaTkEuimKMgu4yXutSwlsZQNkAPW9fQBVCQxdXOTrucBO2O3A7wkM2nVyzQucc129W5Ghb2atgYbOuZkEBqDLJxDcJa1wSjINGO3tM8DMYotYZj7Q38xaectUN7PTGT74P8BPCu0XaGRmp7o4T0mfhVQwCn4pTzcBt5tZweihV3nzxxHoApoNZBVa/iNgWFE7d4GHgYFm9g2BbovNAM6548D/I3AVo48J9OMXeA0Yf9IOyjeBLc65b8/wd3qEwIoDAiNB3kogmB8/w9d7mcDvssxrpxtPXsA5l+m9z9tmtsx7v7alfQPn3DQC30rmmdly4F1OHeqv8cO2kwpKo3NKWDOz54ElzrlX/K5FpLwo+CVsmdliAv3mFznnjp5qeZHKQsEvIhJm1McvIhJmFPwiImFGwS8iEmYU/CIiYUbBLyISZv4/VmrU8yxF1SoAAAAASUVORK5CYII=", "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 df43452b..c0852bbc 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): ) 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) @@ -919,7 +919,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() @@ -942,7 +942,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() @@ -965,7 +965,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() @@ -997,17 +997,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 8c0a3a93..2e0a0a7b 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 @@ -117,7 +117,7 @@ def _add_unit_models(self): inlet_list=["econ_lp", "Preheater"], ) self.drum_lp = HelmPhaseSeparator( - doc="Phase seperator for LP evaporator (parital evaporator)", + doc="Phase separator for LP evaporator (partial evaporator)", property_package=prop_water, ) self.evap_lp = HeatExchanger( diff --git a/idaes_examples/mod/power_gen/ngcc.py b/idaes_examples/mod/power_gen/ngcc.py index dc3b9912..49dfff98 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() @@ -496,7 +496,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/notebooks/_toc.yml b/idaes_examples/notebooks/_toc.yml index c6c6cdd0..f8b8fa0e 100644 --- a/idaes_examples/notebooks/_toc.yml +++ b/idaes_examples/notebooks/_toc.yml @@ -102,6 +102,9 @@ parts: sections: - file: docs/power_gen/supercritical/supercritical_power_plant_doc - file: docs/power_gen/supercritical/supercritical_steam_cycle_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_baseline.svg b/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_baseline.svg index 076158e0..f92b54ec 100644 --- a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_baseline.svg +++ b/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_baseline.svg @@ -192,7 +192,7 @@ t16 - - \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3039,7 +3039,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", @@ -3216,4 +3216,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} 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 index ecb2deef..d27944ab 100644 Binary files a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_init.json.gz 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 index 23411983..900511dc 100644 --- a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_test.ipynb +++ b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_test.ipynb @@ -189,7 +189,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", @@ -341,4 +341,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_usr.ipynb b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_usr.ipynb index 23411983..900511dc 100644 --- a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_usr.ipynb +++ b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_usr.ipynb @@ -189,7 +189,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", @@ -341,4 +341,4 @@ }, "nbformat": 4, "nbformat_minor": 3 -} \ No newline at end of file +} diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/steam_turbine_template.svg b/idaes_examples/notebooks/active/power_gen/ngcc/steam_turbine_template.svg index 7d1b06e5..49630870 100644 --- a/idaes_examples/notebooks/active/power_gen/ngcc/steam_turbine_template.svg +++ b/idaes_examples/notebooks/active/power_gen/ngcc/steam_turbine_template.svg @@ -1081,7 +1081,7 @@