From c31c5e59effdbd9066c06939f0317ace301476d7 Mon Sep 17 00:00:00 2001 From: Mark Messner Date: Tue, 11 Oct 2022 13:55:09 -0500 Subject: [PATCH] Add a simple thermohydraulic solver (#30) Merges in new ceramic evaluation and thermohydraulic capabilities. Co-authored-by: Mark C. Messner Co-authored-by: BBarua Co-authored-by: Pawan Chaugule --- .pylintrc | 4 +- LICENSE | 2 +- doc/sphinx/source/conf.py | 4 +- doc/sphinx/source/installation.rst | 13 +- doc/sphinx/source/managers.rst | 65 ++- doc/sphinx/source/materials.rst | 53 +- doc/sphinx/source/overview.rst | 51 +- doc/sphinx/source/receiver.rst | 110 ++--- doc/sphinx/source/tutorial.rst | 371 ++++---------- .../SiC-demo/chlorideSalt-SiC_receiver.hdf5 | 3 - examples/SiC-demo/run_SiC_receiver.py | 96 ---- .../example-receiver.hdf5 | 0 .../Temperature_variable-flow.png | Bin 0 -> 79163 bytes .../run_example_variable_flow.py | 149 ++++++ examples/complete-expensive/run_complete.py | 76 --- examples/complete-small/example-small.hdf5 | 3 - examples/complete-small/run_complete.py | 89 ---- .../metallic-receiver/example-receiver.hdf5 | 3 + .../Temperature_constant-flow.png | Bin 0 -> 103089 bytes .../Temperature_variable-flow.png | Bin 0 -> 80850 bytes .../results_temperature/plot_flowpath.py | 66 +++ .../run_example_constant_flow.py | 144 ++++++ .../run_example_variable_flow.py | 142 ++++++ examples/tutorial/model.hdf5 | 4 +- examples/tutorial/run_problem.py | 94 ++-- examples/tutorial/setup_problem.py | 229 ++++----- requirements.txt | 1 + setup.py | 2 +- srlife/damage.py | 173 +++++-- srlife/data/damage/SiC.xml | 11 +- srlife/data/thermalfluid/32MgCl2-68KCl.xml | 9 + srlife/data/thermalfluid/sCO2.xml | 34 ++ srlife/library.py | 13 + srlife/managers.py | 75 ++- srlife/materials.py | 51 +- srlife/receiver.py | 268 ++++++++++- srlife/thermal.py | 455 ++++++++++++++++-- srlife/thermohydraulics/__init__.py | 0 srlife/thermohydraulics/flowpath.py | 452 +++++++++++++++++ srlife/thermohydraulics/thermalfluid.py | 235 +++++++++ srlife/writers.py | 2 + test/test_ceramic_damage.py | 24 +- test/test_material_library.py | 1 + test/test_materials.py | 14 +- test/thermohydraulics/__init__.py | 0 test/thermohydraulics/test_flowpath.py | 160 ++++++ test/thermohydraulics/test_thermalfluid.py | 45 ++ 47 files changed, 2839 insertions(+), 957 deletions(-) delete mode 100644 examples/SiC-demo/chlorideSalt-SiC_receiver.hdf5 delete mode 100755 examples/SiC-demo/run_SiC_receiver.py rename examples/{complete-expensive => ceramic-receiver}/example-receiver.hdf5 (100%) create mode 100644 examples/ceramic-receiver/results_temperature/Temperature_variable-flow.png create mode 100644 examples/ceramic-receiver/run_example_variable_flow.py delete mode 100755 examples/complete-expensive/run_complete.py delete mode 100644 examples/complete-small/example-small.hdf5 delete mode 100755 examples/complete-small/run_complete.py create mode 100644 examples/metallic-receiver/example-receiver.hdf5 create mode 100644 examples/metallic-receiver/results_temperature/Temperature_constant-flow.png create mode 100644 examples/metallic-receiver/results_temperature/Temperature_variable-flow.png create mode 100644 examples/metallic-receiver/results_temperature/plot_flowpath.py create mode 100755 examples/metallic-receiver/run_example_constant_flow.py create mode 100755 examples/metallic-receiver/run_example_variable_flow.py create mode 100644 srlife/data/thermalfluid/32MgCl2-68KCl.xml create mode 100644 srlife/data/thermalfluid/sCO2.xml create mode 100644 srlife/thermohydraulics/__init__.py create mode 100644 srlife/thermohydraulics/flowpath.py create mode 100644 srlife/thermohydraulics/thermalfluid.py create mode 100644 test/thermohydraulics/__init__.py create mode 100644 test/thermohydraulics/test_flowpath.py create mode 100644 test/thermohydraulics/test_thermalfluid.py diff --git a/.pylintrc b/.pylintrc index f063862..4e45e90 100644 --- a/.pylintrc +++ b/.pylintrc @@ -155,7 +155,9 @@ disable=print-statement, consider-using-f-string, consider-using-in, unnecessary-lambda-assignment, - implicit-str-concat + implicit-str-concat, + too-many-lines, + too-many-public-methods # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option diff --git a/LICENSE b/LICENSE index aa770da..f50600e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2021 UChicago Argonne, LLC +Copyright 2022 UChicago Argonne, LLC All Rights Reserved diff --git a/doc/sphinx/source/conf.py b/doc/sphinx/source/conf.py index 91fbe73..7d48dab 100644 --- a/doc/sphinx/source/conf.py +++ b/doc/sphinx/source/conf.py @@ -20,11 +20,11 @@ # -- Project information ----------------------------------------------------- project = 'srlife' -copyright = '2021, Argonne National Laboratory' +copyright = '2022, Argonne National Laboratory' author = 'Argonne National Laboratory' # The full version, including alpha/beta/rc tags -release = '1.2.1' +release = '2.0.0' # -- General configuration --------------------------------------------------- diff --git a/doc/sphinx/source/installation.rst b/doc/sphinx/source/installation.rst index 6ca88bb..da89ff6 100644 --- a/doc/sphinx/source/installation.rst +++ b/doc/sphinx/source/installation.rst @@ -5,23 +5,22 @@ srlife is available in the `pypi `_ package repository and can be installed with `pip`. srlife uses python3 and requires several additional python packages, all of which are available pypi. -srlife is compatible with python3 only, specifically python versions 3.6, 3.7, -3.8, and 3.9 +srlife is compatible with python3 only. Install using the pip package manager ------------------------------------- The easiest way to install the package is to use the `pip` package manager, installing srlife from pypi automatically. -Ubuntu Linux 18.04 -"""""""""""""""""" +Linux +""""" .. code-block:: console pip install srlife -MacOS Sierra 10.14 Mojave -""""""""""""""""""""""""" +MacOS +""""" It is easiest to install srlife using a homebrew version of python, not the default system python. @@ -45,7 +44,7 @@ to also obtain the tutorial, example, and test files you can install the package directly from `github `_. In addition to the, cmake, BLAS, and LAPACK requirements you will need git and, optionally, the nose package to automatically run the tests. -Ubuntu Linux 18.04 +Ubuntu Linux 20.04 """""""""""""""""" The following installs the prerequisites, downloads srlife, sets up the python package, and runs the automated test suite. diff --git a/doc/sphinx/source/managers.rst b/doc/sphinx/source/managers.rst index b2d6fc1..27e22cc 100644 --- a/doc/sphinx/source/managers.rst +++ b/doc/sphinx/source/managers.rst @@ -14,7 +14,7 @@ taking the basic input information: and providing the estimated life of the receiver as a number of repetitions of the daily cycle. -Once the manager class is constructed the user only needs to call the +Once the manager class is constructed for metallic materials the user only needs to call the .. code-block:: @@ -25,6 +25,13 @@ terms of the number of expected single-day repetitions. The calculation scales the results appropriately given the number of explicitly-defined `days` provided to the :py:class:`srlife.receiver.Receiver`. +For ceramic materials function instead returns the time independent +reliability of the design + +.. code-block:: + + reliability = manager.solve_life() + SolutionManager description ---------------------------- @@ -38,7 +45,8 @@ internal srlife subclasses. Specifically, the manager handles the process of: displacements. 3. Using the temperature and stress/strain information to solve for the damage in each tube. - 4. Finding the worst-case tube and calculating the estimated life. + 4. Finding the worst-case tube and calculating the estimated life or + estimated reliability. .. autoclass:: srlife.managers.SolutionManager :members: @@ -105,8 +113,44 @@ Global options | progress | bool | False | Provide progress bar in the command line | +----------+-----------+---------+----------------------------------------------+ -Thermal solver options -^^^^^^^^^^^^^^^^^^^^^^ +Coupled thermal solver options +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ++---------+--------------+---------+--------------------------------------------------------------+ +| Option | Data type | Default | Explanation | ++=========+==============+=========+==============================================================+ +| rtol | float | 1.0e-6 | Nonlinear solver relative tolerance | ++---------+--------------+---------+--------------------------------------------------------------+ +| atol | float | 1.0e-3 | Nonlinear solver absolute tolerance | ++---------+--------------+---------+--------------------------------------------------------------+ +| miter | int | 1000 | Maximum Picard solver iterations | ++---------+--------------+---------+--------------------------------------------------------------+ +| verbose | bool | False | Print debug information to the terminal | ++---------+--------------+---------+--------------------------------------------------------------+ +| eps | float | 1.0e-10 | Offset from zero for relative tolerance calculation | ++---------+--------------+---------+--------------------------------------------------------------+ +| solid | ParameterSet | empty | Parameters for the solid heat transfer solver | ++---------+--------------+---------+--------------------------------------------------------------+ +| fluid | ParameterSet | empty | Parameters for the thermohydraulic solver | ++---------+--------------+---------+--------------------------------------------------------------+ + +Panel thermalhydraulic solver options +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ++---------+-----------+---------+--------------------------------------------------------------+ +| Option | Data type | Default | Explanation | ++=========+===========+=========+==============================================================+ +| rtol | float | 1.0e-6 | Nonlinear solver relative tolerance | ++---------+-----------+---------+--------------------------------------------------------------+ +| atol | float | 1.0e-8 | Nonlinear solver absolute tolerance | ++---------+-----------+---------+--------------------------------------------------------------+ +| miter | int | 50 | Maximum nonlinear solver iterations | ++---------+-----------+---------+--------------------------------------------------------------+ +| verbose | bool | False | Print debug information to the terminal | ++---------+-----------+---------+--------------------------------------------------------------+ + +Solid temperature solver options +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +---------+-----------+---------+--------------------------------------------------------------+ | Option | Data type | Default | Explanation | @@ -158,8 +202,8 @@ Structural solver options | verbose | bool | False | Print debug information to the terminal | +---------+-----------+---------+-----------------------------------------+ -Damage model options -^^^^^^^^^^^^^^^^^^^^ +Metallic damage model options +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-------------+-----------+---------+-------------------------------------------------------------------+ | Option | Data type | Default | Explanation | @@ -169,6 +213,15 @@ Damage model options | order | int | 1 | Polynomial order to use in conjunction with the "poly" option | +-------------+-----------+---------+-------------------------------------------------------------------+ +Ceramic damage model options +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ++--------------+-----------+---------+----------------------------------------------------------------------+ +| Option | Data type | Default | Explanation | ++==============+===========+=========+======================================================================+ +| cares_cutoff | bool | true | Do not include large compressive stresses in reliability calculation | ++--------------+-----------+---------+----------------------------------------------------------------------+ + Class description ^^^^^^^^^^^^^^^^^ diff --git a/doc/sphinx/source/materials.rst b/doc/sphinx/source/materials.rst index a0a6383..32e3d59 100644 --- a/doc/sphinx/source/materials.rst +++ b/doc/sphinx/source/materials.rst @@ -26,6 +26,12 @@ on the source of data and reliability of the current model. +---------------------------+-----------+--------------------------------------------------------------------------+ | Alloy 282 Ni-based alloy | "A282" | Limited literature data, creep-fatigue properties preliminary | +---------------------------+-----------+--------------------------------------------------------------------------+ +| Silicon Carbide | "SiC" | Literature data for one specific batch of SiC material | ++---------------------------+-----------+--------------------------------------------------------------------------+ + +While the SiC failure data provided in the package is specific to one batch of material and would need to be +altered to reflect the actual properties of the material under consideration, the thermal and deformation +models should be applicable to most commercial monolithic SiC. The material system accommodates variants within each model type. The srlife package provides a `"base"` variant for all the materials. @@ -46,7 +52,7 @@ Material model descriptions Thermal materials ^^^^^^^^^^^^^^^^^ -The thermal material model provides the metal's conductivity and diffusivity as a function of temperature. +The thermal material model provides the material's conductivity and diffusivity as a function of temperature. Deformation materials ^^^^^^^^^^^^^^^^^^^^^ @@ -54,36 +60,39 @@ Deformation materials The deformation model system is a thin wrapper around the `neml `_ -- a nonlinear constitutive model system focused on high temperature materials developed by Argonne National Laboratory. The `"base"` models for each material are decoupled creep-plasticity models representing both rate independent plasticity and -rate dependent plasticity. These models are not as accurate as fully-coupled viscoplastic models, but are easily calibrated against +rate dependent plasticity (elasticity only for SiC). These models are not as accurate as fully-coupled viscoplastic models, but are easily calibrated against commonly-available experimental data. Damage (structural) materials ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The current version of srlife includes only one damage model: an ASME-type approach that uses Miner's rule, time-fraction creep damage, -and a creep-fatigue interaction diagram to determine creep-fatigue failure. -The damage material model provides the required data, including nominal strain-based fatigue curves, a creep rupture correlation, and -the interaction diagram. +The current version of srlife includes two damage models: -Fluid materials -^^^^^^^^^^^^^^^ +* An ASME-type approach that uses Miner's rule, time-fraction creep damage, a + and a creep-fatigue interaction diagram to determine creep-fatigue failure. + The damage material model provides the required data, including nominal strain-based fatigue curves, a creep rupture correlation, and + the interaction diagram. This model is suitable for metallic materials. +* A time-independent ceramic reliability models representing an extension to 3D of standard uniaxial Weibull failure statistics. + This model is suitable for ceramic materials. -The fluid material system is different than the other three materials. The model describes the convective heat transfer coefficient between the -base metal and a given fluid as a function of temperature. Note that this neglects the influence of flow rate, which may be incorporated into future -versions. Instead of being indexed against the tube material the fluid material systems indexes the models first against the coolant type. The table -below describes the options currently embedded in NEML. +Thermal fluid materials +^^^^^^^^^^^^^^^^^^^^^^^ -+----------------------+-----------+----------+ -| Fluid | String ID | Comments | -+======================+===========+==========+ -| Molten chloride salt | "salt" | | -+----------------------+-----------+----------+ +The fluid material system is different than the other three materials in that it relates to the receiver working fluid and not +the solid material. This system provides the physical properties (density, dynamic viscosity, heat capacity, and conductivity) +and thermohydraulic correlations (a Nusselt correlation) required to calculate heat transfer along a flow path, including +convective heat transfer between the tube material and the working fluid. -As with the metallic material models, the fluid material system also subdivides models with a variant specification. Again, srlife provides a -`"base"` variant and users could expand the system to other models. ++--------------------------------------------+--------------------+----------+ +| Fluid | String ID | Comments | ++============================================+====================+==========+ +| Magnesium-potassium eutectic chloride salt | "32MgCl2-68KCl" | | ++--------------------------------------------+--------------------+----------+ +| Supercritical carbon dioxide | "sCO2" | | ++--------------------------------------------+--------------------+----------+ -Convective heat transfer properties could vary both with the working fluid type and with the tube material. The fluid material system provides a -default option suitable for most metallic tube material and, where data is available available, also specializes the fluid model to specific materials. +As with the solid material models, the fluid material system also subdivides models with a variant specification. Again, srlife provides a +`"base"` variant and users could expand the system to other models. Loading material models ----------------------- @@ -95,4 +104,4 @@ models for a particular tube material: The second loads in data for a particular working fluid: -.. autofunction:: srlife.library.load_fluid +.. autofunction:: srlife.library.load_thermal_fluid diff --git a/doc/sphinx/source/overview.rst b/doc/sphinx/source/overview.rst index 178c99b..b1fcb42 100644 --- a/doc/sphinx/source/overview.rst +++ b/doc/sphinx/source/overview.rst @@ -2,26 +2,40 @@ An overview of srlife ===================== srlife is a package for estimating the life of high temperature solar receivers. -The package currently focuses on metallic, tubular, panel receivers somewhat -skewed towards new designs using molten chloride salt as the working fluid, -though the package includes data for evaluating different types of working -fluids and receiver materials. +The package currently focuses on tubular, panel receivers +though the package includes data for evaluating arbitrary high temperature +components if the user provides the corresponding analysis results. + +srlife provides life estimation approaches for both metallic and ceramic +materials. These approaches differ, as described elsewhere in the +documentation. The package provides a complete assessment of a receiver design starting from the thermal and mechanical boundary conditions applied to the individual tubes in the receiver. This means that the package requires input from additional simulations in order to generate the boundary conditions. Specifically, srlife would usually sit on top of a simulation of the -heliostat to calculate the indicant solar flux, simulations or -measurements of the effective absorption of the receiver tubes, and system-level -and detailed thermohydraulic simulations to determine the local -thermomechanical boundary conditions on each tube. +heliostat to calculate the indicant solar flux and simulations or +measurements of the effective absorption of the receiver tube. +The package, however, provides a simple thermohydraulic system solver for +tubular receivers which can find the fluid and tube temperatures along +each flow path if provided with the flow path inlet temperatures and +flow rates. Given this information, presented as time-dependent boundary conditions representing representative conditions on one or more thermal days, the package estimates the structural life of the receiver, providing this estimate as a number of repetitions of the -user-provided daily cycle(s). +user-provided daily cycle(s). For metallic materials the package +provides a best-estimate life prediction using average material properties. +For ceramic receivers the analysis is currently time independent and +reports simply the reliability of the system under the provided +thermomechanical conditions, i.e. the probability the design will +not fail. Future versions of the software will extend the +ceramic failure models to account for time dependent subcritical crack growth. +When these improvements are completed the ceramic models will report the reliability as +a function of time or, alternatively, the time until the receiver reliability falls +below some reliability metric. The package includes material information for a variety of receiver structural materials and working fluids. The user can @@ -33,17 +47,20 @@ base release. srlife provides modules to: 1. Define the receiver geometry and topology -- how panels are connected to each other and how tubes are connected within a panel. - 2. Provide thermomechanical boundary conditions, specifically options for: - a. Inner or outer diameter incident heat flux - b. Inner or outer diameter fixed temperature - c. Inner or outer diameter convective heat transfer - d. Inner pressure - 3. Finite difference, transient heat transfer solvers to convert the thermal boundary conditions into the receiver tube temperature fields. + 2. Provide thermomechanical boundary conditions on the receiver, specifically options for: + a. Outer diameter incident heat flux on each tube + b. Inner pressure in each tube + c. Collections of panels/tubes arranged in flow paths, giving: + i. The inlet temperature of each flow path as a function of time + ii. The flow path flow rate, again as a function of time + 3. A coupled finite difference, transient solid heat transfer code linked to a simple 1D thermohydraulic model for heat transfer through the receiver. The output of these solvers is both the fluid temperature as a function of + position along each flow path and time and the solid temperatures in each tube given as a function of position and time. 4. A full-scale finite element solver to take the tube temperatures and mechanical boundary conditions to the tube stress/strain/displacement fields. 5. Connections to a extensive nonlinear material model library `neml `_ to provide accurate inelastic constitutive models. 6. A receiver system solver that can account for connections between tubes in a panel and panels in a receiver, to accurately model the effect of structural connections with an abstract, numerically inexpensive representation. - 7. Damage solvers to estimate the level of creep-fatigue damage in a tube given the structural and thermal results. - 8. An extensive material property library covering common high temperature metallic receiver materials. + 7. Damage solvers to estimate the level of creep-fatigue damage in a tube given the structural and thermal results for metallic materials and ceramic reliability calculations that link the applied stresses and temperatures + to an expected reliability. + 8. An extensive material property library covering common high temperature metallic and ceramic receiver materials. Conventions ----------- diff --git a/doc/sphinx/source/receiver.rst b/doc/sphinx/source/receiver.rst index 88066d9..a9b262f 100644 --- a/doc/sphinx/source/receiver.rst +++ b/doc/sphinx/source/receiver.rst @@ -76,12 +76,10 @@ The inner pressure boundary condition :py:class:`srlife.receiver.PressureBC` hol defining the pressure at discrete times. The size of this 1D array must be :math:`n_{time}` and match the tube object. -The user has three options for thermal boundary conditions, which can -be specified on the inner diameter, outer diameter, or both: +The user has two options for outer diameter thermal boundary conditions: 1. Fixed flux boundary condition :py:class:`srlife.receiver.HeatFluxBC`. 2. Fixed temperature boundary condition :py:class:`srlife.receiver.FixedTempBC`. - 3. Convective heat transfer :py:class:`srlife.receiver.ConvectiveBC`. The data for the flux and temperature boundary conditions is an array of flux or temperature values of size @@ -93,14 +91,58 @@ flux or temperature values of size representing a fixed grid of points on either the tube inner or outer diameter. The user must provide the full 3D data. -Similarly, the data for the convective heat transfer boundary condition -is an array of fluid temperature data of size - -.. math:: - - n_{time} \times n_{z} - -Again, the user must always provide the full 3D information. +Inner tube thermal BCs +---------------------- + +By default, the inner boundary condition for each tube is a representation of heat transfer between the tubes and the working fluid. +Two separate solvers are used to balance heat transfer between the tube and the fluid: a finite difference, 1D/2D/3D +transient heat transfer solver for the solid temperatures and a 1D transient thermohydraulic solver for the fluid temperatures. +The boundary conditions for the finite difference solver are the outside diameter boundary condition specified by the user +for each tube (often the net incident flux) and convective heat transfer between the tube inner diameter and the fluid. +The input conditions for the thermohydraulic solver are the flow rate and inlet temperature along each flow path in the receiver, +given as a function of time throughout the user-provided load history. Heat then transfers along each flow path, with the fluid +absorbing heat from each tube in the path. + +These two solvers are coupled along the inner diameter of each tube. srlife solves for overall heat balance using Picard +iteration on the heat transfered from the tube into the fluid (equal to the heat transfered out of the fluid and into each tube). +This means that the solver starts with a guess at what this convective heat transfer will be, solves for the metal temperatures, +calculates the convective heat transfer into the fluid, solves for the fluid temperatures, and iterates to solve again for the +tube temperatures. This process repeats until both the fluid and tube temperatures no longer change. + +The previous section discusses specifying the tube outer diameter boundary conditions, which, again, are often the next +incident flux directed at each tube in the receiver. +The model divides up the panels in the receiver into one or more flow paths. Fluid flows into the +first panel, through the panel, into the next connected panel, and so on until it reaches the panel outlet. +The user specifies which panels in the receiver are connected with a method of the :py:class:`srlife.receiver.Receiver` +class + +.. code:: python + + receiver.add_flowpath(panels, times, flow_rate, inlet_temp) + +where the method takes as input a list of panels in the flow path, in the order the fluid flow through time, a +numpy array of times throughout the loading history for which the `flow_rate` and `inlet_temp` arrays provide the +corresponding inlet mass flow rates and inlet temperatures. + +Each panel in the receiver must belong to one and only one flow path. + +A model of a tubular panel receiver can explicitly represent fewer tubes than the actual number in each panel to +save computational cost. Because the structural damage and reliability models base the overall performance of +the receiver on the worst (most damaged/least reliable) tube, these models do not need any special modification to +accommodate models that use fewer than the full number of tubes to represent each panel. However, the +flow velocity through each tube depends on overall mass flow rate into a panel and the actual number of tubes +the flow divides into in that panel. Each :py:class:`srlife.receiver.Tube` in the :py:class:`srlife.receiver.Receiver` +has a `multiplier` property that the user can set to have the tube represent more than one tube in the actual panel +for the thermohydraulic calculation. For example, if there are 100 tubes in the actual panel and the user +represents only two tubes per panel in the actual thermal and structural model then this multiplier could be: + +.. code:: python + + for tube in panel.tubes: + tube.multiplier = 50 + +Defining the model +------------------ The user can provide the required input data in two ways: 1. The :ref:`python-receiver` @@ -158,8 +200,6 @@ temperature (FixedTempBC), and convection (ConvectiveBC). .. autoclass:: srlife.receiver.FixedTempBC -.. autoclass:: srlife.receiver.ConvectiveBC - .. _hdf-receiver: HDF5 file @@ -274,50 +314,6 @@ The user must always provide the full flux information (i.e. over the full 3D tu | data | dataset | dim: (ntime, nt, nz) | Discrete flux data | Fixed array over tube inner/outer surface | +-------+-----------+----------------------+---------------------------------+-------------------------------------------+ -FixedTempBC -^^^^^^^^^^^ - -The user must always provide the full temperature information (i.e. over the full 3D tube). - -+-------+-----------+----------------------+---------------------------------+-------------------------------------------+ -| Field | Type | Data type | Explanation | Notes | -+=======+===========+======================+=================================+===========================================+ -| type | attribute | string | Thermal BC type | Must be "FixedTemp" | -+-------+-----------+----------------------+---------------------------------+-------------------------------------------+ -| r | attribute | float | Radius of application | Must match tube inner or outer radius | -+-------+-----------+----------------------+---------------------------------+-------------------------------------------+ -| h | attribute | float | Tube height | Must match tube height | -+-------+-----------+----------------------+---------------------------------+-------------------------------------------+ -| nt | attribute | int | Number of circumferential nodes | | -+-------+-----------+----------------------+---------------------------------+-------------------------------------------+ -| nz | attribute | int | Number of axial nodes | | -+-------+-----------+----------------------+---------------------------------+-------------------------------------------+ -| times | dataset | dim: (ntime,) | Discrete times points | | -+-------+-----------+----------------------+---------------------------------+-------------------------------------------+ -| data | dataset | dim: (ntime, nt, nz) | Discrete temperature data | Fixed array over tube inner/outer surface | -+-------+-----------+----------------------+---------------------------------+-------------------------------------------+ - -ConvectiveBC -^^^^^^^^^^^^ - -The user must always provide the full fluid temperature information (i.e. over the full 3D tube). - -+-------+-----------+------------------+---------------------------------+---------------------------------------+ -| Field | Type | Data type | Explanation | Notes | -+=======+===========+==================+=================================+=======================================+ -| type | attribute | string | Thermal BC type | Must be "Convective" | -+-------+-----------+------------------+---------------------------------+---------------------------------------+ -| r | attribute | float | Radius of application | Must match tube inner or outer radius | -+-------+-----------+------------------+---------------------------------+---------------------------------------+ -| h | attribute | float | Tube height | Must match tube height | -+-------+-----------+------------------+---------------------------------+---------------------------------------+ -| nz | attribute | int | Number of axial nodes | | -+-------+-----------+------------------+---------------------------------+---------------------------------------+ -| times | dataset | dim: (ntime,) | Discrete times points | | -+-------+-----------+------------------+---------------------------------+---------------------------------------+ -| data | dataset | dim: (ntime, nz) | Discrete fluid temperature data | Fixed array over tube height | -+-------+-----------+------------------+---------------------------------+---------------------------------------+ - PressureBC ^^^^^^^^^^ diff --git a/doc/sphinx/source/tutorial.rst b/doc/sphinx/source/tutorial.rst index aa0522a..e2a28fc 100644 --- a/doc/sphinx/source/tutorial.rst +++ b/doc/sphinx/source/tutorial.rst @@ -54,7 +54,10 @@ The two tubes in each individual panel are rigidly connected through their top-surface displacements. The two panels are completely structurally disconnected. -The thermal boundary conditions are an incident flux on the tube outer diameter and convective heat transfer on the inner diameter. The tubes also +The thermal boundary conditions are an incident flux on the tube outer diameter and convective heat transfer on the inner diameter +resulting from heat transfer molten salt flowing through the receiver. +The two tubes per panel in the model represent 50 actual tubes (so 100 tubes per panel) in the receiver. +The tubes also experience a time varying inner pressure. The analysis encompasses a single, representative day of 24 hours. The @@ -100,20 +103,10 @@ incident flux for tube 0 at the peak flux (:math:`t=6` hours). :width: 800 :alt: Incident flux on the front face of tube 0. -For the internal convective heat transfer the four tubes all have the same -fluid temperature distribution, given by - -.. math:: - - T_{fluid}(t,z) = \Delta T O(t) \frac{z}{h} + T_{start} - -with :math:`\Delta T = 50` K and :math:`T_{start} = 823` K in this example. -The plot below shows the fluid temperature gradient in each tube at several -different times throughout the daily cycle: - -.. image:: tube-gradient.png - :width: 800 - :alt: Fluid temperature gradient in each tube at different times. +Heat transfers from the incident flux, through the receiver tubes, and into +molten salt flowing at a constant mass flow rate of 500 kg/s with an inlet +temperature of 550 C. The two panels are in a single flow path, salt flows +through one panel and then into the next. Finally, the internal pressure in all four tubes is the same and given by @@ -124,7 +117,7 @@ Finally, the internal pressure in all four tubes is the same and given by with :math:`p_{max} = 1` MPa. In the example the tube material is 316H stainless steel and the working fluid is -molten chloride salt. +32MgCL2-68KCl chloride salt. Defining the receiver geometry and loading conditions ----------------------------------------------------- @@ -202,10 +195,17 @@ in the previous section h_tube_2 = 0.6 h_tube_3 = 0.4 - # ID fluid temperature histories for each tube - delta_T = 50 # K - T_base = 550 + 273.15 # K - fluid_temp = lambda t, z: delta_T * onoff(t) * z/height + T_base + # Both panels are in the same flow path with constant mass flow rate + # of 500 kg/s and an inlet temperature of 550 C + mass_flow = 500 * 3600.0 + inlet_temp = 550.0 + 273.15 + + # Tubes start at 300 K + T_base = 300.0 + + # For the thermohydraulic calculation, each tube in the model represents + # 50 tubes in the actual receiver + tube_multiplier = 50 # ID pressure history p_max = 1.0 # MPa @@ -222,17 +222,14 @@ throughout the 24 hour cycle: # Time increments throughout the 24 hour day times = np.linspace(0,24,24*2+1) -Similarly, the spatial information about the flux and convective boundary +Similarly, the spatial information about the flux conditions must be defined over discrete grid points in cylindrical coordinates. srlife uses the `"ij"` indexing scheme defined in `numpy `_, where the individual coordinate arrays are indexed with a matrix scheme: .. code:: python - # Various meshes needed to define the boundary conditions - # 1) A mesh over the times and height (for the fluid temperatures) - time_h, z_h = np.meshgrid(times, np.linspace(0,height,nz), indexing='ij') - # 2) A surface mesh over the outer surface (for the flux) + # A surface mesh over the outer surface (for the flux) time_s, theta_s, z_s = np.meshgrid(times, np.linspace(0,2*np.pi,nt+1)[:nt], np.linspace(0,height,nz), indexing = 'ij') @@ -241,48 +238,44 @@ discretization, and boundary conditions. The first tube is defined like this: .. code:: python - # Setup each tube in turn and assign it to the correct panel - # Tube 0 - tube_0 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) - tube_0.set_times(times) - tube_0.set_bc(receiver.ConvectiveBC(r_outer-thickness, - height, nz, times, fluid_temp(time_h,z_h)), "inner") - tube_0.set_bc(receiver.HeatFluxBC(r_outer, height, - nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_0), "outer") - tube_0.set_pressure_bc(receiver.PressureBC(times, pressure(times))) + # Setup each tube in turn and assign it to the correct panel + # Tube 0 + tube_0 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) + tube_0.set_times(times) + tube_0.set_bc(receiver.HeatFluxBC(r_outer, height, + nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_0), "outer") + tube_0.set_pressure_bc(receiver.PressureBC(times, pressure(times))) + tube_0.multiplier_val = tube_multiplier The remainder of the tubes are defined similarly: .. code:: python - # Tube 1 - tube_1 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) - tube_1.set_times(times) - tube_1.set_bc(receiver.ConvectiveBC(r_outer-thickness, - height, nz, times, fluid_temp(time_h,z_h)), "inner") - tube_1.set_bc(receiver.HeatFluxBC(r_outer, height, - nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_1), "outer") - tube_1.set_pressure_bc(receiver.PressureBC(times, pressure(times))) - - # Tube 2 - tube_2 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) - tube_2.set_times(times) - tube_2.set_bc(receiver.ConvectiveBC(r_outer-thickness, - height, nz, times, fluid_temp(time_h,z_h)), "inner") - tube_2.set_bc(receiver.HeatFluxBC(r_outer, height, - nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_2), "outer") - tube_2.set_pressure_bc(receiver.PressureBC(times, pressure(times))) - - # Tube 3 - tube_3 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) - tube_3.set_times(times) - tube_3.set_bc(receiver.ConvectiveBC(r_outer-thickness, - height, nz, times, fluid_temp(time_h,z_h)), "inner") - tube_3.set_bc(receiver.HeatFluxBC(r_outer, height, - nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_3), "outer") - tube_3.set_pressure_bc(receiver.PressureBC(times, pressure(times))) - -Finally, each tube must be added to the relevant panel and the panels + # Tube 1 + tube_1 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) + tube_1.set_times(times) + tube_1.set_bc(receiver.HeatFluxBC(r_outer, height, + nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_1), "outer") + tube_1.set_pressure_bc(receiver.PressureBC(times, pressure(times))) + tube_1.multiplier_val = tube_multiplier + + # Tube 2 + tube_2 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) + tube_2.set_times(times) + tube_2.set_bc(receiver.HeatFluxBC(r_outer, height, + nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_2), "outer") + tube_2.set_pressure_bc(receiver.PressureBC(times, pressure(times))) + tube_2.multiplier_val = tube_multiplier + + # Tube 3 + tube_3 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) + tube_3.set_times(times) + tube_3.set_bc(receiver.HeatFluxBC(r_outer, height, + nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_3), "outer") + tube_3.set_pressure_bc(receiver.PressureBC(times, pressure(times))) + tube_3.multiplier_val = tube_multiplier + +Each tube must be added to the relevant panel and the panels to the receiver: .. code:: python @@ -299,6 +292,17 @@ to the receiver: model.add_panel(panel_0, "panel0") model.add_panel(panel_1, "panel1") +Finally, the single flow path through both panels must be defined + +.. code:: python + + # Assign each panel to the flow path with the appropriate inlet temperatures + # and mass flow rates + model.add_flowpath(["panel0", "panel1"], + times, + np.ones_like(times) * mass_flow, + np.ones_like(times) * inlet_temp) + At this point the :any:`srlife.receiver.Receiver` object is fully-defined and ready to be used in a life assessment. However, for this tutorial instead save the receiver to disk for later use: @@ -320,7 +324,7 @@ described above for later use. The key point of this rather lengthy script is that *actual users of the srlife should never have to write a script like this explictly defining the receiver boundary conditions.* Instead this information should be obtained from some -upstream thermohydraulic and (ultimately) heliostat analysis system. The +upstream plant and heliostat analysis systems. The user would then write interface code either directly in Python or using the HDF5 file format as an intermediary to transfer the information into srlife. @@ -359,7 +363,7 @@ be loaded from the this library for use in the analysis .. code:: python # Choose the material models - fluid_mat = library.load_fluid("salt", "base") # Generic chloride salt model + fluid_mat = library.load_thermal_fluid("32MgCl2-68KCl", "base") # Base 316H thermal and damage models, a simplified deformation model to # cut down on the run time of the 3D analysis thermal_mat, deformation_mat, damage_mat = library.load_material("316H", "base", "elastic_creep", "base") @@ -383,32 +387,27 @@ to make the resulting thermal/structural analysis run essentially instantaneousl for tube in panel.tubes.values(): tube.make_1D(tube.h/2, 0) -For now, srlife only provides a -single solver of each type and all the solution parameters have sensible -default values. However, the following code could be changed to use -a custom thermal, structural, or damage solver or to change how the module -solves the thermal and structural subproblems: +The follow then defines numerical solver parameters and the actual thermohydraulic, +structural, and damage solvers to use in the problem. .. code:: python - # Setup some solver parameters - params = solverparams.ParameterSet() - params['progress_bars'] = True # Print a progress bar to the screen as we solve - params['nthreads'] = 1 # Solve will run in multithreaded mode, set to number of available cores - params['system']['atol'] = 1.0e-4 # During the standby very little happens, lower the atol to accept this result - - # Choose the solvers, i.e. how we are going to solve the thermal, - # single tube, structural system, and damage calculation problems. - # Right now there is only one option for each - # Define the thermal solver to use in solving the heat transfer problem - thermal_solver = thermal.FiniteDifferenceImplicitThermalSolver( - params["thermal"]) - # Define the structural solver to use in solving the individual tube problems - structural_solver = structural.PythonTubeSolver(params["structural"]) - # Define the system solver to use in solving the coupled structural system - system_solver = system.SpringSystemSolver(params["system"]) - # Damage model to use in calculating life - damage_model = damage.TimeFractionInteractionDamage(params["damage"]) + # Setup some solver parameters + params = solverparams.ParameterSet() + params['progress_bars'] = True # Print a progress bar to the screen as we solve + params['nthreads'] = 4 # Solve will run in multithreaded mode, set to number of available cores + params['system']['atol'] = 1.0e-4 # During the standby very little happens, lower the atol to accept this result + + # Choose the solvers, i.e. how we are going to solve the thermal, + # single tube, structural system, and damage calculation problems. + # Define the thermal solver to use in solving the heat transfer problem + thermal_solver = thermal.ThermohydraulicsThermalSolver(params["thermal"]) + # Define the structural solver to use in solving the individual tube problems + structural_solver = structural.PythonTubeSolver(params["structural"]) + # Define the system solver to use in solving the coupled structural system + system_solver = system.SpringSystemSolver(params["system"]) + # Damage model to use in calculating life + damage_model = damage.TimeFractionInteractionDamage(params["damage"]) The user might consider changing the `params['nthreads']` parameter to match the number of cores on their machine, to speed up the analysis. @@ -422,14 +421,14 @@ Finally, the analysis can be run and the life of the receiver estimated: .. code:: python - # The solution manager - solver = managers.SolutionManager(model, thermal_solver, thermal_mat, fluid_mat, structural_solver, deformation_mat, damage_mat, system_solver, damage_model, pset = params) - - # Actually solve for life - life = solver.solve_life() - print("Best estimate life: %f daily cycles" % life) + # The solution manager + solver = managers.SolutionManager(model, thermal_solver, thermal_mat, fluid_mat, + structural_solver, deformation_mat, damage_mat, + system_solver, damage_model, pset = params) -*This solution will take a long time (up to an hour on some machines) to complete because it is using a full 3D analysis of each tube.* Running the problem with multiple threads will help decrease the required solution time. + # Actually solve for life + life = solver.solve_life() + print("Best estimate life: %f daily cycles" % life) If the `params['progress_bars']` parameter is kept as `True` then the program will print a status bar representing its progress along each individual step @@ -437,10 +436,10 @@ will print a status bar representing its progress along each individual step .. code:: console - Best estimate life: 9062.849331 daily cycles + Best estimate life: 7077.239061 daily cycles indicating that the module predicts this receiver to have a structural life of -9062 repetitions of the daily cycle, or about 25 years. +around 7000 repetitions of the daily cycle, or about 20 years. Visualizing tube results ------------------------ @@ -458,183 +457,3 @@ to a VTK file for additional postprocessing: This command produces a series of `VTK `_ files (one per tube per time step) containing the full thermal, structural, and damage results. These files can be visualized with a program like `ParaView `_. - -Complete example scripts ------------------------- - -`setup_problem.py` - -.. code:: python - - import numpy as np - - from srlife import receiver - - # Setup the base receiver - period = 24.0 # Loading cycle period, hours - days = 1 # Number of cycles represented in the problem - panel_stiffness = "disconnect" # Panels are disconnected from one another - - model = receiver.Receiver(period, days, panel_stiffness) - - # Setup each of the two panels - tube_stiffness = "rigid" - panel_0 = receiver.Panel(tube_stiffness) - panel_1 = receiver.Panel(tube_stiffness) - - # Basic receiver geometry - r_outer = 12.7 # mm - thickness = 1.0 # mm - height = 5000.0 # mm - - # Tube discretization - nr = 12 - nt = 20 - nz = 10 - - # Mathematical definition of the tube boundary conditions - # Function used to define daily operating cycle - onoff_base = lambda t: np.sin(np.pi*t/12.0) - onoff = lambda t: (1+np.sign(onoff_base(t)))/2 * onoff_base(t) - # Max flux - h_max = 0.6 # W/mm^2 (which is also MW/m^2) - # Flux circumferential component - h_circ = lambda theta: np.cos(theta) - # Flux axial component - h_axial = lambda z: (1+np.sin(np.pi*z/height))/2 - # Total flux function - h_flux = lambda time, theta, z: onoff(time) * h_max * h_circ(theta) * h_axial(z) - - # Flux multipliers for each tube - h_tube_0 = 1.0 - h_tube_1 = 0.8 - h_tube_2 = 0.6 - h_tube_3 = 0.4 - - # ID fluid temperature histories for each tube - delta_T = 50 # K - T_base = 550 + 273.15 # K - fluid_temp = lambda t, z: delta_T * onoff(t) * z/height + T_base - - # ID pressure history - p_max = 1.0 # MPa - pressure = lambda t: p_max * onoff(t) - - # Time increments throughout the 24 hour day - times = np.linspace(0,24,24*2+1) - - # Various meshes needed to define the boundary conditions - # 1) A mesh over the times and height (for the fluid temperatures) - time_h, z_h = np.meshgrid(times, np.linspace(0,height,nz), indexing='ij') - # 2) A surface mesh over the outer surface (for the flux) - time_s, theta_s, z_s = np.meshgrid(times, np.linspace(0,2*np.pi,nt+1)[:nt], - np.linspace(0,height,nz), indexing = 'ij') - - # Setup each tube in turn and assign it to the correct panel - # Tube 0 - tube_0 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) - tube_0.set_times(times) - tube_0.set_bc(receiver.ConvectiveBC(r_outer-thickness, - height, nz, times, fluid_temp(time_h,z_h)), "inner") - tube_0.set_bc(receiver.HeatFluxBC(r_outer, height, - nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_0), "outer") - tube_0.set_pressure_bc(receiver.PressureBC(times, pressure(times))) - - # Tube 1 - tube_1 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) - tube_1.set_times(times) - tube_1.set_bc(receiver.ConvectiveBC(r_outer-thickness, - height, nz, times, fluid_temp(time_h,z_h)), "inner") - tube_1.set_bc(receiver.HeatFluxBC(r_outer, height, - nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_1), "outer") - tube_1.set_pressure_bc(receiver.PressureBC(times, pressure(times))) - - # Tube 2 - tube_2 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) - tube_2.set_times(times) - tube_2.set_bc(receiver.ConvectiveBC(r_outer-thickness, - height, nz, times, fluid_temp(time_h,z_h)), "inner") - tube_2.set_bc(receiver.HeatFluxBC(r_outer, height, - nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_2), "outer") - tube_2.set_pressure_bc(receiver.PressureBC(times, pressure(times))) - - # Tube 3 - tube_3 = receiver.Tube(r_outer, thickness, height, nr, nt, nz, T0 = T_base) - tube_3.set_times(times) - tube_3.set_bc(receiver.ConvectiveBC(r_outer-thickness, - height, nz, times, fluid_temp(time_h,z_h)), "inner") - tube_3.set_bc(receiver.HeatFluxBC(r_outer, height, - nt, nz, times, h_flux(time_s, theta_s, z_s) * h_tube_3), "outer") - tube_3.set_pressure_bc(receiver.PressureBC(times, pressure(times))) - - # Assign to panel 0 - panel_0.add_tube(tube_0, "tube0") - panel_0.add_tube(tube_1, "tube1") - - # Assign to panel 1 - panel_1.add_tube(tube_2, "tube2") - panel_1.add_tube(tube_3, "tube3") - - # Assign the panels to the receiver - model.add_panel(panel_0, "panel0") - model.add_panel(panel_1, "panel1") - - # Save the receiver to an HDF5 file - model.save("model.hdf5") - -`run_problem.py` - -.. code:: python - - import numpy as np - - from srlife import receiver, solverparams, library, thermal, structural, system, damage, managers - - # Load the receiver we previously saved - model = receiver.Receiver.load("model.hdf5") - - # Choose the material models - fluid_mat = library.load_fluid("salt", "base") # Generic chloride salt model - # Base 316H thermal and damage models, a simplified deformation model to - # cut down on the run time of the 3D analysis - thermal_mat, deformation_mat, damage_mat = library.load_material("316H", "base", - "base", "base") - - # Cut down on run time for now by making the tube analyses 1D - # This is not recommended for actual design evaluation - for panel in model.panels.values(): - for tube in panel.tubes.values(): - tube.make_1D(tube.h/2, 0) - - # Setup some solver parameters - params = solverparams.ParameterSet() - params['progress_bars'] = True # Print a progress bar to the screen as we solve - params['nthreads'] = 4 # Solve will run in multithreaded mode, set to number of available cores - params['system']['atol'] = 1.0e-4 # During the standby very little happens, lower the atol to accept this result - - # Choose the solvers, i.e. how we are going to solve the thermal, - # single tube, structural system, and damage calculation problems. - # Right now there is only one option for each - # Define the thermal solver to use in solving the heat transfer problem - thermal_solver = thermal.FiniteDifferenceImplicitThermalSolver( - params["thermal"]) - # Define the structural solver to use in solving the individual tube problems - structural_solver = structural.PythonTubeSolver(params["structural"]) - # Define the system solver to use in solving the coupled structural system - system_solver = system.SpringSystemSolver(params["system"]) - # Damage model to use in calculating life - damage_model = damage.TimeFractionInteractionDamage(params["damage"]) - - # The solution manager - solver = managers.SolutionManager(model, thermal_solver, thermal_mat, fluid_mat, - structural_solver, deformation_mat, damage_mat, - system_solver, damage_model, pset = params) - - # Actually solve for life - life = solver.solve_life() - print("Best estimate life: %f daily cycles" % life) - - # Save the tube data out for additional visualization - for pi, panel in model.panels.items(): - for ti, tube in panel.tubes.items(): - tube.write_vtk("tube-%s-%s" % (pi, ti)) diff --git a/examples/SiC-demo/chlorideSalt-SiC_receiver.hdf5 b/examples/SiC-demo/chlorideSalt-SiC_receiver.hdf5 deleted file mode 100644 index 442335c..0000000 --- a/examples/SiC-demo/chlorideSalt-SiC_receiver.hdf5 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7930495e034a167365b7dd2e62d5938a5f75d47fb99bf0c231ed549702dcdcdf -size 1352152 diff --git a/examples/SiC-demo/run_SiC_receiver.py b/examples/SiC-demo/run_SiC_receiver.py deleted file mode 100755 index a78b310..0000000 --- a/examples/SiC-demo/run_SiC_receiver.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python3 - -import sys -sys.path.append('../..') - -from srlife import receiver, solverparams, spring, structural, thermal, system, library, managers, damage -import numpy as np -import math -def sample_parameters(): - params = solverparams.ParameterSet() - - params["nthreads"] = 2 - params["progress_bars"] = True - - params["thermal"]["rtol"] = 1.0e-6 - params["thermal"]["atol"] = 1.0e-8 - params["thermal"]["miter"] = 20 - params["thermal"]["substep"] = 5 - - params["structural"]["rtol"] = 1.0e-6 - params["structural"]["atol"] = 1.0e-8 - params["structural"]["miter"] = 50 - params["structural"]["verbose"] = False - params["structural"]["qorder"] = 1 - params["structural"]["dof_tol"] = 1.0e-6 - - params["system"]["rtol"] = 1.0e-6 - params["system"]["atol"] = 1.0e-8 - params["system"]["miter"] = 50 - params["system"]["verbose"] = False - # If true store results on disk (slower, but less memory) - params["page_results"] = True - - return params - -if __name__ == "__main__": - # Load the receiver datastructure containing the: - # Receiver topology - # Tube geometry - # Thermal boundary conditions - # Pressure boundary conditions - # Interconnect stiffnesses - model = receiver.Receiver.load("chlorideSalt-SiC_receiver.hdf5") - lengthlocs = 1000*np.array([16,5,16,5,16,5]) #max temp loc#np.array([16,5,16,5,16,5]) - # lengthlocs = 1000*np.array([5,16,16,16,16,16]) #max flux loc #np.array([5,16,16,16,16,16]) - # Cut down on run time for now - for (panel,lengthloc) in zip(model.panels.values(),lengthlocs): # uncomment for 1D analyses - for tube in panel.tubes.values(): # uncomment for 1D analyses - # tube.make_2D(lengthloc) # uncomment for 2D analyses - tube.make_1D(lengthloc, 0.0) # uncomment for 1D analyses - - # Load some customized solution parameters - # These are all optional, all the solvers have default values - # for parameters not provided by the user - params = sample_parameters() - - # Define the thermal solver to use in solving the heat transfer problem - thermal_solver = thermal.FiniteDifferenceImplicitThermalSolver(params["thermal"]) - # Define the structural solver to use in solving the individual tube problems - structural_solver = structural.PythonTubeSolver(params["structural"]) - # Define the system solver to use in solving the coupled structural system - system_solver = system.SpringSystemSolver(params["system"]) - # Damage model to use in calculating life - # damage_model = damage.PIAModel(params["damage"]) - # damage_model = damage.WNTSAModel(params["damage"]) - # damage_model = damage.MTSModelGriffithFlaw(params["damage"]) - # damage_model = damage.MTSModelPennyShapedFlaw(params["damage"]) - # damage_model = damage.CSEModelGriffithFlaw(params["damage"]) - # damage_model = damage.CSEModelPennyShapedFlaw(params["damage"]) - # damage_model = damage.SMMModelGriffithFlaw(params["damage"]) - damage_model = damage.SMMModelPennyShapedFlaw(params["damage"]) - - # Load the materials - fluid = library.load_fluid("salt_SiC", "base") - thermal, deformation, damage = library.load_material("SiC", "base","elastic_model", "base") - - # The solution manager - solver = managers.SolutionManager(model, thermal_solver, thermal, fluid, - structural_solver, deformation, damage, system_solver, damage_model, - pset = params) - - - # Heuristics would go here - - # Calculate reliability - reliability = solver.solve_life() - - print("Individual tube reliabilities:") - print(reliability["tube_reliability"]) - - print("Overall structure reliability:") - print(reliability["overall_reliability"]) - - for pi, panel in model.panels.items(): - for ti, tube in panel.tubes.items(): - tube.write_vtk("tube-%s-%s" % (pi, ti)) diff --git a/examples/complete-expensive/example-receiver.hdf5 b/examples/ceramic-receiver/example-receiver.hdf5 similarity index 100% rename from examples/complete-expensive/example-receiver.hdf5 rename to examples/ceramic-receiver/example-receiver.hdf5 diff --git a/examples/ceramic-receiver/results_temperature/Temperature_variable-flow.png b/examples/ceramic-receiver/results_temperature/Temperature_variable-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..a708b5c18f6047283aa95a48d50825942113be91 GIT binary patch literal 79163 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

$&;@!a`vPF6Uu)i561TM$`8P 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%0A5AEN*9y*OQWy#i~s9+2fL2KW)MmGQH4$ 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 3.0 + mod_prob = inc_prob.flatten() + mod_prob[remove] = 0.0 + inc_prob = mod_prob.reshape(inc_prob.shape) + # Return the sums as a function of time along with the field itself return np.sum(inc_prob, axis=1), np.transpose( np.stack((inc_prob, inc_prob)), axes=(1, 2, 0) @@ -130,14 +154,19 @@ def tube_log_reliability(self, tube, material, receiver): class CrackShapeIndependent(WeibullFailureModel): """ - Parent class for crack shape dependent models + Parent class for crack shape independent models + which include only PIA and WNTSA models + + Determines normal stress acting on crack """ def __init__(self, pset, *args, **kwargs): """ - Create a mesh grid for integration - Evaluate direction cosines using the mesh grid - only for PIA and WNTSA models which are crack shape independent + Create a mesh grid of angles that can represent crack orientations + Evaluate direction cosines using the angles + + Default values given to nalpha and nbeta which are the number of + segments in the mesh grid """ super().__init__(pset, *args, **kwargs) @@ -163,7 +192,8 @@ def __init__(self, pset, *args, **kwargs): def calculate_normal_stress(self, mandel_stress): """ - Calculate the normal stress given the Mandel vector + Use direction cosines to calculate the normal stress to + a crack given the Mandel vector """ # Principal stresses pstress = self.calculate_principal_stress(mandel_stress) @@ -179,13 +209,20 @@ def calculate_normal_stress(self, mandel_stress): class CrackShapeDependent(WeibullFailureModel): """ Parent class for crack shape dependent models + + Determines normal, shear, total and equivanlent stresses acting on cracks + + Calculates the element reliability using the equivalent stress from the + crack shape dependent models """ def __init__(self, pset, *args, **kwargs): """ - Create a mesh grid for integration - Evaluate direction cosines using the mesh grid - for fracture based models which are crack shape dependent + Create a mesh grid of angles that can represent crack orientations + Evaluate direction cosines using the angles + + Default values given to nalpha and nbeta which are the number of + segments in the mesh grid """ super().__init__(pset, *args, **kwargs) @@ -211,7 +248,8 @@ def __init__(self, pset, *args, **kwargs): def calculate_normal_stress(self, mandel_stress): """ - Calculate the normal stress given the Mandel vector + Use direction cosines to calculate the normal stress to + a crack given the Mandel vector """ # Principal stresses pstress = self.calculate_principal_stress(mandel_stress) @@ -257,6 +295,16 @@ def calculate_flattened_eq_stress( """ Calculate the integral of equivalent stresses given the material properties and integration limits + + Parameters: + mandel_stress: element stresses in Mandel convention + temperatures: element temperatures + material material model to use + + Additional Parameters: + A: mesh grid of vectorized angle values + dalpha: increment of angle alpha to be used in evaluating integral + dbeta: increment of angle beta to be used in evaluating integral """ self.temperatures = temperatures self.material = material @@ -268,7 +316,7 @@ def calculate_flattened_eq_stress( # Projected equivalent stresses sigma_e = self.calculate_eq_stress( - mandel_stress, self.mvals, self.temperatures, self.material + mandel_stress, self.temperatures, self.material ) # Suppressing warning given when negative numbers are raised to rational numbers @@ -302,7 +350,7 @@ def calculate_element_log_reliability( self, mandel_stress, temperatures, volumes, material ): """ - Calculate the element log reliability + Calculate the element log reliability given the equivalent stress Parameters: mandel_stress: element stresses in Mandel convention @@ -338,6 +386,9 @@ def calculate_element_log_reliability( class PIAModel(CrackShapeIndependent): """ Principal of independent action failure model + + Calculates reliability using only tensile stresses + that are assumed to act independently on cracks """ def calculate_element_log_reliability( @@ -350,7 +401,8 @@ def calculate_element_log_reliability( mandel_stress: element stresses in Mandel convention temperatures: element temperatures volumes: element volumes - material: material model object with required data + material: material model object with required data that includes + Weibull scale parameter (svals) and Weibull modulus (mvals) """ # Material parameters svals = material.strength(temperatures) @@ -370,13 +422,21 @@ class WNTSAModel(CrackShapeIndependent): """ Weibull normal tensile average failure model - Assigning default values for nalpha and nbeta + Evaluates an average normal tensile stress (acting on the cracks) integrated over the + area of a sphere, and uses it to calculate the element reliability """ - def calculate_avg_normal_stress(self, mandel_stress, mvals, temperatures, material): + def calculate_avg_normal_stress(self, mandel_stress, temperatures, material): """ - Calculate the average normal tensile stresses given the pricipal stresses + Calculate the average normal tensile stresses from the pricipal stresses + + Parameters: + mandel_stress: element stresses in Mandel convention + temperatures: element temperatures + material: material model object with required data """ + # Material parameters + mvals = material.modulus(temperatures) # Principal stresses pstress = self.calculate_principal_stress(mandel_stress) @@ -430,9 +490,7 @@ def calculate_element_log_reliability( # Average normal tensile stress raied to exponent mv avg_nstress = ( - self.calculate_avg_normal_stress( - mandel_stress, mvals, temperatures, material - ) + self.calculate_avg_normal_stress(mandel_stress, temperatures, material) ) ** (1 / mvals) return -kpvals * (avg_nstress**mvals) * volumes @@ -442,12 +500,13 @@ class MTSModelGriffithFlaw(CrackShapeDependent): """ Maximum tensile stess failure model with a Griffith flaw - Assigning default values for nalpha and nbeta + Evaluates an equivalent stress (acting on the cracks) using the normal and + shear stresses in the maximum tensile stress fracture criterion for a Griffith flaw """ - def calculate_eq_stress(self, mandel_stress, mvals, temperatures, material): + def calculate_eq_stress(self, mandel_stress, temperatures, material): """ - Calculate the equivalent stresses given the pricipal stresses + Calculate the equivalent stresses from the normal and shear stresses """ # Normal stress sigma_n = self.calculate_normal_stress(mandel_stress) @@ -463,12 +522,16 @@ class MTSModelPennyShapedFlaw(CrackShapeDependent): """ Maximum tensile stess failure model with a penny shaped flaw - Assigning default values for nalpha and nbeta + Evaluates an equivalent stress (acting on the cracks) using the normal and + shear stresses in the maximum tensile stress fracture criterion for a penny shaped flaw """ - def calculate_eq_stress(self, mandel_stress, mvals, temperatures, material): + def calculate_eq_stress(self, mandel_stress, temperatures, material): """ - Calculate the average normal tensile stresses given the pricipal stresses + Calculate the average normal tensile stresses from the normal and shear stresses + + Additional parameter: + nu: Poisson ratio """ # Material parameters @@ -486,12 +549,14 @@ class CSEModelGriffithFlaw(CrackShapeDependent): """ Coplanar strain energy failure model with a Griffith flaw - Assigning default values for nalpha and nbeta + Evaluates an equivalent stress (acting on the cracks) using the normal and + shear stresses in the coplanar strain energy fracture criterion + for a Griffith flaw """ - def calculate_eq_stress(self, mandel_stress, mvals, temperatures, material): + def calculate_eq_stress(self, mandel_stress, temperatures, material): """ - Calculate the equivalent stresses given the pricipal stresses + Calculate the equivalent stresses from the normal and shear stresses """ # Normal stress sigma_n = self.calculate_normal_stress(mandel_stress) @@ -507,12 +572,17 @@ class CSEModelPennyShapedFlaw(CrackShapeDependent): """ Coplanar strain energy failure model with a penny shaped flaw - Assigning default values for nalpha and nbeta + Evaluates an equivalent stress (acting on the cracks) using the normal and + shear stresses in the coplanar strain energy fracture criterion + for a penny shaped flaw """ - def calculate_eq_stress(self, mandel_stress, mvals, temperatures, material): + def calculate_eq_stress(self, mandel_stress, temperatures, material): """ - Calculate the equivalent stresses given the pricipal stresses + Calculate the equivalent stresses from the normal and shear stresses + + Additional parameter: + nu: Poisson ratio """ # Material parameters @@ -532,12 +602,17 @@ class SMMModelGriffithFlaw(CrackShapeDependent): """ Shetty mixed-mod failure model with a Griffith flaw - Assigning default values for nalpha and nbeta + Evaluates an equivalent stress (acting on the cracks) using the normal and + shear stresses in the Shetty mixed-mode fracture criterion + for a Griffith flaw """ - def calculate_eq_stress(self, mandel_stress, mvals, temperatures, material): + def calculate_eq_stress(self, mandel_stress, temperatures, material): """ - Calculate the equivalent stresses given the pricipal stresses + Calculate the equivalent stresses from the normal and shear stresses + + Additional parameters: + cbar: Emperical constant """ # Material parameters @@ -557,12 +632,18 @@ class SMMModelPennyShapedFlaw(CrackShapeDependent): """ Shetty mixed mode failure model with a penny shaped flaw - Assigning default values for nalpha and nbeta + Evaluates an equivalent stress (acting on the cracks) using the normal and + shear stresses in the Shetty mixed-mode fracture criterion + for a Griffith flaw """ - def calculate_eq_stress(self, mandel_stress, mvals, temperatures, material): + def calculate_eq_stress(self, mandel_stress, temperatures, material): """ - Calculate the equivalent stresses given the pricipal stresses + Calculate the equivalent stresses from the normal and shear stresses + + Additional parameters: + nu: Poisson ratio + cbar: Emperical constant """ # Material parameters diff --git a/srlife/data/damage/SiC.xml b/srlife/data/damage/SiC.xml index 478a807..d022cd0 100644 --- a/srlife/data/damage/SiC.xml +++ b/srlife/data/damage/SiC.xml @@ -1,11 +1,14 @@ - + - 25.0 800.0 1000.0 1200.0 1400.0 1500.0 - 507.0 467.0 528.0 570.0 476.0 471.0 + 298.15 1073.15 1273.15 1473.15 1673.15 1773.15 + 507.0 467.0 528.0 570.0 476.0 471.0 - 10.7 + + 298.15 1273.15 1773.15 + 10.7 10.7 10.7 + 1.5 0.16 diff --git a/srlife/data/thermalfluid/32MgCl2-68KCl.xml b/srlife/data/thermalfluid/32MgCl2-68KCl.xml new file mode 100644 index 0000000..d77553c --- /dev/null +++ b/srlife/data/thermalfluid/32MgCl2-68KCl.xml @@ -0,0 +1,9 @@ + + + + 2.90556e-05 0.254458 + -5.52e-10 2.0544788e-06 + 6.4224e-08 -0.000139846 0.087281 + -1e-07 0.000532015 + + diff --git a/srlife/data/thermalfluid/sCO2.xml b/srlife/data/thermalfluid/sCO2.xml new file mode 100644 index 0000000..d460c79 --- /dev/null +++ b/srlife/data/thermalfluid/sCO2.xml @@ -0,0 +1,34 @@ + + + + + 7.03948e-13 -2.58673e-09 3.53650e-06 -2.07319e-03 7.70504e-01 + 2.00326e-13 -4.63206e-10 3.39679e-07 + 1.06716e-07 4.53845e-05 + 6.895e-08 4.693279e-06 + + + 8.43396e-13 -3.10782e-09 4.27343e-06 -2.54474e-03 8.87998e-01 + 2.39882e-13 -5.51476e-10 4.00667e-07 + 1.03956e-07 4.87811e-05 + 6.76109e-08 6.341342e-06 + + + 9.77732e-13 -3.60657e-09 4.97511e-06 -2.99215e-03 9.99333e-01 + 2.79776e-13 -6.40181e-10 4.61593e-07 + 1.00917e-07 5.24813e-05 + 6.61234e-08 8.125005e-06 + + + 1.11219e-12 -4.10216e-09 5.66723e-06 -3.43019e-03 1.10754 + 3.19627e-13 -7.28582e-10 5.22099e-07 + 9.75921e-08 5.64921e-05 + 6.44985e-08 10.040558e-06 + + + 1.20828e-12 -4.46721e-09 6.19318e-06 -3.77406e-03 1.19555 + 3.58815e-13 -8.15512e-10 5.81636e-07 + 9.39921e-08 6.08074e-05 + 6.27524e-08 12.078258e-06 + + diff --git a/srlife/library.py b/srlife/library.py index f9681c3..ee74d9e 100644 --- a/srlife/library.py +++ b/srlife/library.py @@ -6,6 +6,7 @@ import xml.etree.ElementTree as ET from srlife import materials +from srlife.thermohydraulics import thermalfluid LIBRARY_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "data")) @@ -41,6 +42,18 @@ def load_fluid(name, model): return materials.FluidMaterial.load(filename, model) +def load_thermal_fluid(name, model): + """Load thermal fluid material properties + + Args: + name (str): name of the fluid (XML filename) + model (str): model variant to use + """ + fdir = os.path.join(LIBRARY_DIR, "thermalfluid") + filename = get_file(fdir, name) + return thermalfluid.ThermalFluidMaterial.load(filename, model) + + def load_material(name, thermal_model, deformation_model, damage_model): """Load solid material properties diff --git a/srlife/managers.py b/srlife/managers.py index bcf1aa3..bda2a04 100644 --- a/srlife/managers.py +++ b/srlife/managers.py @@ -137,7 +137,58 @@ def calculate_damage(self): decorator=self.progress_decorator, ) + def solve_reliability(self): + """User interface: solve everything and return receiver reliability + + The trigger for everything: solve the complete problem and report the + best-estimate reliability. + + Returns: + float: Reliability between 0 and 1 + """ + self.solve_heat_transfer() + self.solve_structural() + + return self.calculate_reliability() + + def calculate_reliability(self): + """Calculate reliability from the results + + Returns: + float: Reliability between 0 and 1 + """ + if self.progress: + print("Calculating reliability :") + return self.damage_model.determine_reliability( + self.receiver, + self.damage_material, + nthreads=self.nthreads, + decorator=self.progress_decorator, + ) + def solve_heat_transfer(self): + """Solve heat transfer for the receiver + + Adds thermal results in each tube + """ + if isinstance(self.thermal_solver, thermal.ThermohydraulicsThermalSolver): + if self.progress: + print("Running thermohydraulic analysis") + self.thermal_solver.solve_receiver( + self.receiver, + self.thermal_material, + self.fluid_material, + decorator=self.progress_decorator, + nthreads=self.nthreads, + **merge_dicts( + h.args_for_thermohydraulic_solver(self.receiver) + for h in self.heuristics + ) + ) + else: + self.solve_heat_transfer_tube() + + def solve_heat_transfer_tube(self): """Solve the heat transfer problem for each tube Adds the thermal results to each receiver.Tube object @@ -154,7 +205,7 @@ def solve_heat_transfer(self): self.thermal_material, self.fluid_material, **merge_dicts( - h.args_for_tube_thermal_solver(self.receiver, x) + h.args_for_thermal_solver(self.receiver, x) for h in self.heuristics ) ), @@ -203,6 +254,15 @@ def args_for_tube_thermal_solver(self, receiver, tube): """ return {} + def args_for_thermohydraulic_solver(self, receiver): + """Add tube solver args + + Args: + receiver (receiver.receiver): receiver object affected + + """ + return {} + class CycleResetHeuristic(Heuristic): """ @@ -221,3 +281,16 @@ def args_for_tube_thermal_solver(self, receiver, tube): ) return {"resetters": [resetter]} + + def args_for_thermohydraulic_solver(self, receiver): + """Add tube solver args + + Args: + receiver (receiver.receiver): receiver object affected + + """ + resetter = thermal.ReceiverResetter( + lambda t: np.isclose(t % receiver.period, 0) + ) + + return {"resetters": [resetter]} diff --git a/srlife/materials.py b/srlife/materials.py index d206c8e..4cd37aa 100644 --- a/srlife/materials.py +++ b/srlife/materials.py @@ -597,7 +597,9 @@ def make_piecewise(x, y): ydiff[:-1] = np.diff(y) / np.diff(x) ydiff[-1] = ydiff[-2] - return inter.interp1d(x, y), inter.interp1d(x, ydiff, kind="previous") + return inter.interp1d(x, y, fill_value=(ydiff[0], ydiff[-1])), inter.interp1d( + x, ydiff, kind="previous", fill_value=(0, 0) + ) def find_name(xmlfile, name): @@ -697,18 +699,30 @@ class StandardCeramicMaterial: Ceramic material where: 1) Weibull strength depends on temperature - 2) Weibull modulus is constant + 2) Weibull modulus depends on temperature 3) Constant c_bar parameter 4) Constant Poisson's ratio """ - def __init__(self, temperatures, strengths, modulus, c_bar, nu, *args, **kwargs): + def __init__( + self, + s_temperatures, + strengths, + m_temperatures, + modulus, + c_bar, + nu, + *args, + **kwargs + ): super().__init__(*args, **kwargs) - self.s0 = inter.interp1d(temperatures, strengths) - self.temperatures = temperatures + self.s0 = inter.interp1d(s_temperatures, strengths) + self.s_temperatures = s_temperatures self.strengths = strengths - self.m = modulus + self.m_temperatures = m_temperatures + self.mvals = modulus + self.m = inter.interp1d(m_temperatures, modulus) self.C = c_bar self.nu_val = nu @@ -722,10 +736,7 @@ def modulus(self, T): """ Weibull modulus as a function of temperature """ - if np.isscalar(T): - return self.m - else: - return self.m * np.ones(T.shape) + return self.m(T) def c_bar(self, T): """ @@ -755,15 +766,18 @@ def load(cls, node): """ strength = node.find("strength") c_bar = node.find("c_bar") - temps = strength.find("temperatures") - svals = strength.find("strengths") + s_temps = strength.find("temperatures") + svals = strength.find("values") m = node.find("modulus") + m_temps = m.find("temperatures") + mvals = m.find("values") nu = node.find("nu") return StandardCeramicMaterial( - np.array(list(map(float, temps.text.strip().split()))), + np.array(list(map(float, s_temps.text.strip().split()))), np.array(list(map(float, svals.text.strip().split()))), - float(m.text), + np.array(list(map(float, m_temps.text.strip().split()))), + np.array(list(map(float, mvals.text.strip().split()))), float(c_bar.text), float(nu.text), ) @@ -777,12 +791,15 @@ def save(self, fname, modelname): base = ET.SubElement(root, modelname, {"type": "StandardModel"}) strength = ET.SubElement(base, "strength") temps = ET.SubElement(strength, "temperatures") - temps.text = " ".join(map(str, self.temperatures)) - svals = ET.SubElement(strength, "strengths") + temps.text = " ".join(map(str, self.s_temperatures)) + svals = ET.SubElement(strength, "values") svals.text = " ".join(map(str, self.strengths)) m = ET.SubElement(base, "modulus") - m.text = str(self.m) + mtemps = ET.SubElement(m, "temperatures") + mtemps.text = " ".join(map(str, self.m_temperatures)) + mvals = ET.SubElement(m, "values") + mvals.text = " ".join(map(str, self.mvals)) c_bar = ET.SubElement(base, "c_bar") c_bar.text = str(self.C) diff --git a/srlife/receiver.py b/srlife/receiver.py index 501bc5f..2b9a50a 100644 --- a/srlife/receiver.py +++ b/srlife/receiver.py @@ -1,4 +1,4 @@ -# pylint: disable=too-many-lines +# pylint: disable=too-many-lines,too-many-branches """ This module define the data structures used as input and output to the analysis module. @@ -7,6 +7,7 @@ """ import itertools +from collections import OrderedDict import numpy as np import scipy.interpolate as inter @@ -41,9 +42,35 @@ def __init__(self, period, days, panel_stiffness): """Initialize a Receiver object""" self.period = period self.days = days - self.panels = {} + self.panels = OrderedDict() self.stiffness = panel_stiffness + self.flowpaths = OrderedDict() + + def add_flowpath(self, panels_in_path, times, mass_rate, inlet_temp, name=None): + """Add a flow path to the receiver model + + Args: + panels_in_path (list): list of panel names in the path + times (np.array): time data + mass_rate (np.array): mass flow rate data + inlet_temp (np.array): inlet temperature data + name (Optional[str]): optional flowpath name + """ + if not name: + name = next_name(self.flowpaths.keys()) + + for n in panels_in_path: + if n not in self.panels.keys(): + raise ValueError("Panel %s does not exist in the receiver!" % n) + + self.flowpaths[name] = { + "panels": panels_in_path, + "times": times, + "mass_flow": mass_rate, + "inlet_temp": inlet_temp, + } + def write_vtk(self, basename): """Write out the receiver as individual panels with names basename_panelname @@ -150,6 +177,14 @@ def save(self, fobj): sgrp = grp.create_group(name) panel.save(sgrp) + grp = fobj.create_group("flowpaths") + for name, path in self.flowpaths.items(): + sgrp = grp.create_group(name) + sgrp.create_dataset("panels", data=path["panels"]) + sgrp.create_dataset("times", data=path["times"]) + sgrp.create_dataset("mass_flow", data=path["mass_flow"]) + sgrp.create_dataset("inlet_temp", data=path["inlet_temp"]) + @classmethod def load(cls, fobj): """Load a Receiver from an HDF5 file @@ -172,6 +207,40 @@ def load(cls, fobj): for name in grp: res.add_panel(Panel.load(grp[name]), name) + if "flowpaths" in fobj: + grp = fobj["flowpaths"] + + for name in grp: + res.add_flowpath( + list( + map( + lambda x: x.decode(encoding="UTF-8"), + np.copy(grp[name]["panels"]), + ) + ), + np.copy(grp[name]["times"]), + np.copy(grp[name]["mass_flow"]), + np.copy(grp[name]["inlet_temp"]), + name=name, + ) + + if "flowpaths" in fobj: + grp = fobj["flowpaths"] + + for name in grp: + res.add_flowpath( + list( + map( + lambda x: x.decode(encoding="UTF-8"), + np.copy(grp[name]["panels"]), + ) + ), + np.copy(grp[name]["times"]), + np.copy(grp[name]["mass_flow"]), + np.copy(grp[name]["inlet_temp"]), + name=name, + ) + return res @@ -186,12 +255,12 @@ class Panel: names are sequential numbers. Args: - stiffness: manifold spring stiffness + stiffness: manifold spring stiffness """ - def __init__(self, stiffness): + def __init__(self, stiffness, ntubes_actual=None): """Initialize the panel""" - self.tubes = {} + self.tubes = OrderedDict() self.stiffness = stiffness def write_vtk(self, basename): @@ -231,6 +300,19 @@ def ntubes(self): """ return len(self.tubes) + @property + def ntubes_actual(self): + """Number of actual tubes in the panel + + Returns: + int: number of tubes in the full panel + """ + total = 0 + for t in self.tubes.values(): + total += t.multiplier + + return total + def add_tube(self, tube, name=None): """Add a tube object to the panel @@ -325,9 +407,21 @@ class Tube: nz (int): number of axial increments T0 (Optional[float]): initial temperature page (Optional[bool]): store results on disk if True + multiplier (Optional[int]): number of tubes represented by this actual model, defaults to 1 """ - def __init__(self, outer_radius, thickness, height, nr, nt, nz, T0=0.0, page=False): + def __init__( + self, + outer_radius, + thickness, + height, + nr, + nt, + nz, + T0=0.0, + page=False, + multiplier=1, + ): """Initialize the tube""" self.r = outer_radius self.t = thickness @@ -342,6 +436,7 @@ def __init__(self, outer_radius, thickness, height, nr, nt, nz, T0=0.0, page=Fal self.times = [] self.results = {} self.quadrature_results = {} + self.axial_results = {} self.outer_bc = None self.inner_bc = None @@ -351,6 +446,18 @@ def __init__(self, outer_radius, thickness, height, nr, nt, nz, T0=0.0, page=Fal self.page = page self.page_prefix = "" + self.multiplier_val = multiplier + + @property + def multiplier(self): + """ + Number of actual tubes represented by this model + + Returns: + int: tube multiplier + """ + return self.multiplier_val + def copy_results(self, other): """Copy the results fields from one tube to another @@ -359,6 +466,7 @@ def copy_results(self, other): """ self.results = other.results self.quadrature_results = other.quadrature_results + self.axial_results = other.axial_results def set_paging(self, page, i): """Set the value of the page parameter @@ -647,6 +755,28 @@ def add_blank_quadrature_results(self, name, shape): raise ValueError("Quadrature data must have time axis first!") self.quadrature_results[name] = self._setup_memmap(name + "_quad", shape) + def add_axial_results(self, name, data): + """Add a result distributed over the tube height at nz points + + Args: + name (str): results name + data (np.array): data to store + """ + if data.shape != (self.ntime, self.nz): + raise ValueError("Axial result field must have shape (ntime, nz)!") + self.axial_results[name] = self._setup_memmap(name + " _axial", data.shape) + self.axial_results[name][:] = data[:] + + def add_blank_axial_results(self, name): + """Add a blank axial results field + + Args: + name (str): name of field + """ + self.axial_results[name] = self._setup_memmap( + name + "_axial", (self.ntime, self.nz) + ) + def _setup_memmap(self, name, shape): """Map array to disk if required @@ -730,6 +860,10 @@ def save(self, fobj): fobj.attrs["nt"] = self.nt fobj.attrs["nz"] = self.nz + fobj.attrs["multiplier"] = self.multiplier_val + + fobj.attrs["multiplier"] = self.multiplier_val + fobj.attrs["abstraction"] = self.abstraction if self.abstraction == "2D" or self.abstraction == "1D": fobj.attrs["plane"] = self.plane @@ -746,6 +880,10 @@ def save(self, fobj): for name, result in self.quadrature_results.items(): grp.create_dataset(name, data=result) + grp = fobj.create_group("axial_results") + for name, result in self.axial_results.items(): + grp.create_dataset(name, data=result) + if self.outer_bc: grp = fobj.create_group("outer_bc") self.outer_bc.save(grp) @@ -767,6 +905,11 @@ def load(cls, fobj): Parameters: fobj (h5py.Group): h5py to load from """ + if "multiplier" in fobj.attrs: + mult = fobj.attrs["multiplier"] + else: + mult = 1 + res = cls( fobj.attrs["r"], fobj.attrs["t"], @@ -775,6 +918,7 @@ def load(cls, fobj): fobj.attrs["nt"], fobj.attrs["nz"], T0=fobj.attrs["T0"], + multiplier=mult, ) res.abstraction = fobj.attrs["abstraction"] @@ -793,6 +937,16 @@ def load(cls, fobj): for name in grp: res.add_quadrature_results(name, np.copy(grp[name])) + if "axial_results" in fobj: + grp = fobj["axial_results"] + for name in grp: + res.add_axial_results(name, np.copy(grp[name])) + + if "axial_results" in fobj: + grp = fobj["axial_results"] + for name in grp: + res.add_axial_results(name, np.copy(grp[name])) + if "outer_bc" in fobj: res.set_bc(ThermalBC.load(fobj["outer_bc"]), "outer") @@ -942,6 +1096,8 @@ def load(cls, fobj): return ConvectiveBC.load(fobj) elif fobj.attrs["type"] == "FixedTemp": return FixedTempBC.load(fobj) + elif fobj.attrs["type"] == "FilmCoefficientConvective": + return FilmCoefficientConvectiveBC.load(fobj) else: raise ValueError("Unknown BC type %s" % fobj.attrs["type"]) @@ -1210,6 +1366,106 @@ def close(self, other): ) +class FilmCoefficientConvectiveBC(ThermalBC): + """A convective BC on the ID of a tube, this version provides the film coefficient directly + + Args: + radius (float): radius of application + height (float): height of tube + nz (int): number of divisions along height + fluid_T (np.array): fluid temperature + film (np.array): film coefficient data + """ + + def __init__(self, radius, height, nz, fluid_T, film): + self.r = radius + self.h = height + + self.nz = nz + + self.fluid_T = fluid_T + self.film = film + + if fluid_T.shape != (nz,) or film.shape != (nz): + raise ValueError( + "Film coefficient and fluid temperature data must have size (nz,)" + ) + + zs = np.linspace(0, self.h, self.nz) + self.ifn_fluid = inter.interp1d(zs, fluid_T) + self.ifn_film = inter.interp1d(zs, film) + + def fluid_temperature(self, t, z): + """Return the fluid temperature at a given time and position + + Args: + t (float): time + z (float): height + """ + return self.ifn_fluid(z) + + def film_coefficient(self, t, z): + """Return the film coefficient at a given time and position + + Args: + t (float): time + z (float): height + + Return: + float: film coefficient at this location and time + """ + return self.ifn_film(z) + + def save(self, fobj): + """Save to an HDF5 file + + Args: + fobj (h5py.Group): h5py group to save to + """ + fobj.attrs["type"] = "FilmCoefficientConvective" + fobj.attrs["r"] = self.r + fobj.attrs["h"] = self.h + + fobj.attrs["nz"] = self.nz + + fobj.create_dataset("fluid_T", data=self.fluid_T) + fobj.create_dataset("film", data=self.film) + + @classmethod + def load(cls, fobj): + """Load from an HDF5 file + + Args: + fobj (h5py.Group): h5py group to load from + """ + return cls( + fobj.attrs["r"], + fobj.attrs["h"], + fobj.attrs["nz"], + np.copy(fobj["fluid_T"]), + np.copy(fobj["film"]), + ) + + def close(self, other): + """Check to see if two objects are nearly equal. + + Primarily used for testing + + Args: + other (ConvectiveBC): the object to compare against + + Returns: + bool: true if sufficiently similar + """ + return ( + np.isclose(self.r, other.r) + and np.isclose(self.h, other.h) + and (self.nz == other.nz) + and np.allclose(self.fluid_T, other.fluid_T) + and np.allclose(self.film, other.film) + ) + + class ConvectiveBC(ThermalBC): """A convective BC on the surface of a tube defined by a radius and height. diff --git a/srlife/thermal.py b/srlife/thermal.py index 06b7e91..9a11cbd 100644 --- a/srlife/thermal.py +++ b/srlife/thermal.py @@ -2,7 +2,7 @@ This module defines 1D, 2D, and 3D thermal solvers. """ -from abc import ABC, abstractmethod +import multiprocess import numpy as np import numpy.linalg as la @@ -10,52 +10,54 @@ import scipy.sparse.linalg as sla from srlife import receiver, solverparams +from srlife.thermohydraulics import flowpath -class ThermalSolver(ABC): +class TemperatureResetter: """ - When called this class takes as input: - 1) A Tube object - 2) A ThermalMaterial - 3) The FluidMaterial object - - The solver must read the Tube abstraction parameter and - return a 3D, 2D, or 1D analysis, as appropriate + Reset the tube temperatures to a fixed value every so often. """ - @abstractmethod - def solve(self, tube, material, fluid): + def __init__(self, trigger, vals): """ - Solve the thermal problem defined for a single tube + Setup the resetter Parameters: - tube the Tube object defining the geometry, loading, - and analysis abstraction - material the thermal material object describing the material - conductivity and diffusivity - fluid the fluid material object describing the convective - heat transfer coefficient + trigger function which triggers the reset + vals values to reset to """ - return + self.trigger = trigger + self.vals = vals + def apply(self, time, step, temps): + """ + Actually make the modification -class TemperatureResetter: + Parameters: + time current time + step current step + temps current temperatures + """ + if self.trigger(time): + temps[step] = self.vals + + +class ReceiverResetter: """ Reset the tube temperatures to a fixed value every so often. + This object works on the entire receiver at once """ - def __init__(self, trigger, vals): + def __init__(self, trigger): """ Setup the resetter Parameters: trigger function which triggers the reset - vals values to reset to """ self.trigger = trigger - self.vals = vals - def apply(self, time, step, temps): + def apply(self, time, step, model): """ Actually make the modification @@ -65,10 +67,332 @@ def apply(self, time, step, temps): temps current temperatures """ if self.trigger(time): - temps[step] = self.vals + for tube in model.tubes: + tube.quadrature_results["ghost_temperature"][step] = tube.T0 + + +class ThermohydraulicsThermalSolver: + """ + Solve the heat transfer problem by iterating between a simple + 1D thermal hydraulics model and a FiniteDifferenceImplicitThermalSolver. + """ + + def __init__(self, pset=solverparams.ParameterSet()): + self.rtol = pset.get_default("rtol", 1.0e-6) + self.atol = pset.get_default("atol", 1.0e-3) + self.miter = pset.get_default("miter", 1000) + self.verbose = pset.get_default("verbose", False) + self.eps = pset.get_default("epsilon", 1.0e-10) + + self.solid_params = pset.get_default("solid", solverparams.ParameterSet()) + self.thermo_params = pset.get_default("fluid", solverparams.ParameterSet()) + + def solve_receiver( + self, + model, + solid_material, + fluid_material, + decorator=None, + nthreads=1, + resetters=None, + ): + """Solve the entire receiver by splitting into independent flow paths + + Args: + model (Receiver): fully-populated receiver object + solid_material (ThermalMaterial): solid thermal properties + fluid_material (ThermalFluidMaterial): fluid thermal properties + decorator (Optional[decorator]): progress decorator + nthreads(Optional[int]): number of allowable threads to use + resetters(Optional[list]): resetting objects to apply + """ + if resetters is None: + resetters = [] + + # Setup + self.receiver = model + self.solid_material = solid_material + self.fluid_material = fluid_material + self.decorator = decorator + self.nthreads = nthreads + + # Stupid algorithm to decide on times + solve_times = self._determine_solve_times() + + # Add the result fields we'll need, specifically nodal temperatures + # and axial fluid temperatures + for tube in self.receiver.tubes: + tube.set_times(solve_times) + tube.add_blank_axial_results("fluid_temperature") + tube.add_blank_axial_results("fluid_velocity") + tube.add_blank_quadrature_results( + "ghost_temperature", (tube.ntime,) + tube_dim(tube) + ) + + # Check that we have enough information to solve the problem and + # setup the initial conditions for metal and fluid temperature + self._setup() + + # Loop over time and solve each time step + def do_stuff(x): + i = x[0] + 1 + time = x[1][0] + dt = x[1][1] + self.solve_step(i, time, dt) + + for resetter in resetters: + resetter.apply(time, i, self.receiver) + + list( + decorator( + map( + do_stuff, + enumerate(zip(solve_times[1:], solve_times[1:] - solve_times[:-1])), + ), + len(solve_times) - 1, + ) + ) + + # Add the unghosted temperature field + for tube in self.receiver.tubes: + tube.add_results("temperature", self._unghost(tube)) + + def _unghost(self, tube): + """Remove the ghost nodes from tube "ghost_temperature" results""" + T = tube.quadrature_results["ghost_temperature"] + # Don't return ghost values + if tube.abstraction == "3D": + return T[:, 1:-1, 1:-1, 1:-1] + elif tube.abstraction == "2D": + return T[:, 1:-1, 1:-1] + elif tube.abstraction == "1D": + return T[:, 1:-1] + else: + raise ValueError("Unknown abstraction %s" % tube.abstraction) + + def solve_step(self, i, time, dt): + """Solve timestep i at time time + + Args: + i (int): time step + time (float): actual time value + dt (float): time increment + """ + # Setup initial guesses for the metal and tube temperatures (use last step!) + for tube in self.receiver.tubes: + tube.quadrature_results["ghost_temperature"][i] = tube.quadrature_results[ + "ghost_temperature" + ][i - 1] + tube.axial_results["fluid_temperature"][i] = tube.axial_results[ + "fluid_temperature" + ][i - 1] + tube.axial_results["fluid_velocity"][i] = tube.axial_results[ + "fluid_velocity" + ][i - 1] + + # Iterate between solving the metal temperatures and solving the + # fluid temperatures until both are fairly stationary + if self.verbose: + print("Solving timestep %i, discrete time %f" % (i, time)) + for j in range(self.miter): + previous_temps = np.array( + [ + tube.quadrature_results["ghost_temperature"][i] + for panel in self.receiver.panels.values() + for tube in panel.tubes.values() + ] + ) + self.solve_metal(i, time, dt) + next_temps = np.array( + [ + tube.quadrature_results["ghost_temperature"][i] + for panel in self.receiver.panels.values() + for tube in panel.tubes.values() + ] + ) + temp_diff = np.abs(next_temps - previous_temps) + temp_max_diff = np.max(temp_diff) + temp_max_rel_diff = np.max(temp_diff / (previous_temps + self.eps)) + if self.verbose: + print( + "\tSolved metal temperatures for iteration %i, " + "absolute difference %e / relative difference %e" + % (j, temp_max_diff, temp_max_rel_diff) + ) + + previous_fluid_temps = np.array( + [ + tube.axial_results["fluid_temperature"][i] + for panel in self.receiver.panels.values() + for tube in panel.tubes.values() + ] + ) + self.solve_fluid(i, time, dt) + next_fluid_temps = np.array( + [ + tube.axial_results["fluid_temperature"][i] + for panel in self.receiver.panels.values() + for tube in panel.tubes.values() + ] + ) + fluid_diff = np.abs(next_fluid_temps - previous_fluid_temps) + fluid_max_diff = np.max(fluid_diff) + fluid_max_rel_diff = np.max(fluid_diff / (previous_fluid_temps + self.eps)) + if self.verbose: + print( + "\tSolved fluid temperatures for iteration %i, " + "absolute difference %e / relative difference %e" + % (j, fluid_max_diff, fluid_max_rel_diff) + ) + + if (fluid_max_diff < self.atol and temp_max_diff < self.atol) or ( + fluid_max_rel_diff < self.rtol and temp_max_rel_diff < self.rtol + ): + break + else: + raise RuntimeError( + "Picard iteration in the thermohydraulics solver did not converge" + ) + def solve_metal(self, i, time, dt): + """Setup and solve for the metal temperatures in each tube""" + # pylint: disable=no-member + # Setup the appropriate convective BCs on the ID of each tube + # This is the best use of threads as best I can tell + for tube in self.receiver.tubes: + tube.set_bc( + receiver.FilmCoefficientConvectiveBC( + tube.r - tube.t, + tube.h, + tube.nz, + tube.axial_results["fluid_temperature"][i], + self.fluid_material.film_coefficient( + tube.axial_results["fluid_temperature"][i], + tube.axial_results["fluid_velocity"][i], + tube.r - tube.t, + ), + ), + "inner", + ) + + def work(tube): + # Need to add params + tube_solver = FiniteDifferenceImplicitThermalProblem( + tube, + self.solid_material, + self.fluid_material, + **deparametrize_finite_difference(self.solid_params) + ) + # Solve... + return tube_solver.solve_step_substep( + tube.quadrature_results["ghost_temperature"][i - 1], time, dt + ) -class FiniteDifferenceImplicitThermalSolver(ThermalSolver): + with multiprocess.Pool(self.nthreads) as p: + data = list(p.map(work, self.receiver.tubes)) + + for tube, res in zip(self.receiver.tubes, data): + tube.quadrature_results["ghost_temperature"][i] = res + + def solve_fluid(self, i, time, dt): + """Setup and solve for the fluid temperatures in each tube""" + # Setup the thermohydraulic solver for each flow path + for path in self.receiver.flowpaths.values(): + # Add parameters + model = flowpath.FlowPath( + path["times"], + path["mass_flow"], + path["inlet_temp"], + **flowpath.deparameterize_flow_path(self.thermo_params) + ) + for panel_name in path["panels"]: + model.add_panel_from_object( + self.receiver.panels[panel_name], self.fluid_material + ) + + # Solve for the fluid temperatures + nodal_temps = model.solve(time) + + # Update the stored fluid temperature and flow velocities + flow_rates, tube_temperatures = model.recover_tube_results( + nodal_temps, time + ) + + for panel_name, panel_rates, panel_temps in zip( + path["panels"], flow_rates, tube_temperatures + ): + for k, tube in enumerate( + self.receiver.panels[panel_name].tubes.values() + ): + tube.axial_results["fluid_temperature"][i] = panel_temps[k] + tube.axial_results["fluid_velocity"][i] = panel_rates[k] + + def _setup(self): + """Setup for solve + + Sets initial conditions on the metal and fluid temperature and does some + checking to make sure the problem is fully-defined + """ + # Check that every panel is in exactly 1 flow path + panels_in_path = [] + for path in self.receiver.flowpaths.values(): + panels_in_path.extend(path["panels"]) + pset = set(panels_in_path) + if len(pset) != len(panels_in_path): + raise ValueError("There are panels in more than one flow path!") + if pset != set(self.receiver.panels.keys()): + raise ValueError("At least one panel is not in a flow path!") + + # Setup each tube + for path in self.receiver.flowpaths.values(): + for panel_name in path["panels"]: + panel = self.receiver.panels[panel_name] + for tube in panel.tubes.values(): + tube.quadrature_results["ghost_temperature"][0] = tube.T0 + tube.axial_results["fluid_temperature"][0] = path["inlet_temp"][0] + tube.axial_results["fluid_velocity"][ + 0 + ] = 100000000.0 # Need to provide IC? + + def _determine_solve_times(self): + """Determine which times to solve the temperatures for + + Dumb algorithm to determine times to solve at -- just look at a tube + """ + return list(list(self.receiver.panels.values())[0].tubes.values())[0].times + + +def tube_dim(tube): + """ + Figure out a tube's nodal field array size based on the discertization and + abstraction + """ + dim = (tube.nr + 2, tube.nt + 2, tube.nz + 2) + if tube.abstraction == "1D": + return dim[:1] + elif tube.abstraction == "2D": + return dim[:2] + elif tube.abstraction == "3D": + return dim + else: + raise ValueError("Unknown abstraction %s" % tube.abstraction) + + +def deparametrize_finite_difference(pset): + """ + Convert a ParameterSet to kwargs with defaults + """ + return { + "rtol": pset.get_default("rtol", 1.0e-6), + "atol": pset.get_default("atol", 1.0e-2), + "miter": pset.get_default("miter", 100), + "substep": pset.get_default("substep", 1), + "verbose": pset.get_default("verbose", False), + "steady": pset.get_default("steady", False), + } + + +class FiniteDifferenceImplicitThermalSolver: """ Solves the heat transfer problem using the finite difference method. @@ -178,8 +502,8 @@ def __init__( source=None, T0=None, fix_edge=None, - rtol=1.0e-6, - atol=1e-8, + rtol=1.0e-4, + atol=1e-2, miter=50, substep=1, verbose=False, @@ -301,13 +625,17 @@ def solve(self, resetters=None): for r in resetters: r.apply(time, i + 1, T) + return self._real_results(T) + + def _real_results(self, T): + """Helper that only returns the actual results, without the ghosts""" # Don't return ghost values if self.ndim == 3: - return T[:, 1:-1, 1:-1, 1:-1] + return T[..., 1:-1, 1:-1, 1:-1] elif self.ndim == 2: - return T[:, 1:-1, 1:-1] + return T[..., 1:-1, 1:-1] else: - return T[:, 1:-1] + return T[..., 1:-1] def solve_step_substep(self, T_n, time, dt): """ @@ -577,17 +905,26 @@ def _ID_BC_R(self, T, time, T_n): ) # Convection elif isinstance(self.tube.inner_bc, receiver.ConvectiveBC): + fluid_T = self.tube.inner_bc.fluid_temperature( + time, self.z[1, j, k] + )[0] R[self.dof(i, j, k)] = ( self.dr - * self.fluid.coefficient(self.material.name, T_n[1, j, k]) - * ( - T[1, j, k] - - self.tube.inner_bc.fluid_temperature( - time, self.z[1, j, k] - ) - ) + * self.fluid.coefficient(self.material.name, fluid_T) + * (T[1, j, k] - fluid_T) / self.k[1, j, k] ) + # Convection giving the film coefficient and fluid temperature + elif isinstance( + self.tube.inner_bc, receiver.FilmCoefficientConvectiveBC + ): + fluid_T = self.tube.inner_bc.fluid_temperature( + time, self.z[1, j, k] + ) + h = self.tube.inner_bc.film_coefficient(time, self.z[1, j, k]) + R[self.dof(i, j, k)] = ( + self.dr * h * (T[1, j, k] - fluid_T) / self.k[1, j, k] + ) else: raise ValueError("Unknown boundary condition!") return R @@ -610,11 +947,25 @@ def _d_ID_BC_R(self, T, time, T_n): for k in self.loop_z(): I.append(self.dof(i, j, k)) J.append(self.dof(1, j, k)) + fluid_T = self.tube.inner_bc.fluid_temperature( + time, self.z[1, j, k] + )[0] D.append( self.dr - * self.fluid.coefficient(self.material.name, T_n[1, j, k]) + * self.fluid.coefficient(self.material.name, fluid_T) / self.k[1, j, k] ) + elif isinstance(self.tube.inner_bc, receiver.FilmCoefficientConvectiveBC): + i = 0 + for j in self.loop_t(): + for k in self.loop_z(): + I.append(self.dof(i, j, k)) + J.append(self.dof(1, j, k)) + fluid_T = self.tube.inner_bc.fluid_temperature( + time, self.z[1, j, k] + ) + h = self.tube.inner_bc.film_coefficient(time, self.z[1, j, k]) + D.append(self.dr * h / self.k[1, j, k]) return sp.coo_matrix((D, (I, J)), shape=(self.ndof, self.ndof)) @@ -659,17 +1010,13 @@ def _OD_BC_R(self, T, time, T_n): ) # Convection elif isinstance(self.tube.outer_bc, receiver.ConvectiveBC): + fluid_T = self.tube.outer_bc.fluid_temperature( + time, self.z[self.nr - 2, j, k] + )[0] R[self.dof(i, j, k)] = ( self.dr - * self.fluid.coefficient( - self.material.name, T_n[self.nr - 2, j, k] - ) - * ( - T[self.nr - 2, j, k] - - self.tube.outer_bc.fluid_temperature( - time, self.z[self.nr - 2, j, k] - ) - ) + * self.fluid.coefficient(self.material.name, fluid_T) + * (T[self.nr - 2, j, k] - fluid_T) / self.k[self.nr - 2, j, k] ) else: @@ -694,11 +1041,12 @@ def _d_OD_BC_R(self, T, time, T_n): for k in self.loop_z(): I.append(self.dof(i, j, k)) J.append(self.dof(self.nr - 2, j, k)) + fluid_T = self.tube.outer_bc.fluid_temperature( + time, self.z[self.nr - 2, j, k] + )[0] D.append( self.dr - * self.fluid.coefficient( - self.material.name, T_n[self.nr - 2, j, k] - ) + * self.fluid.coefficient(self.material.name, fluid_T) / self.k[self.nr - 2, j, k] ) @@ -740,7 +1088,10 @@ def _ID_BC(self): J.append(self.dof(0, j, k)) D.append(-1.0) # Convection - elif isinstance(self.tube.inner_bc, receiver.ConvectiveBC): + elif isinstance( + self.tube.inner_bc, + (receiver.ConvectiveBC, receiver.FilmCoefficientConvectiveBC), + ): I.append(self.dof(i, j, k)) J.append(self.dof(1, j, k)) D.append(1.0) diff --git a/srlife/thermohydraulics/__init__.py b/srlife/thermohydraulics/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/srlife/thermohydraulics/flowpath.py b/srlife/thermohydraulics/flowpath.py new file mode 100644 index 0000000..4a6ec2a --- /dev/null +++ b/srlife/thermohydraulics/flowpath.py @@ -0,0 +1,452 @@ +# pylint: disable=wrong-import-position +""" + Simple 1D heat balance thermohydraulics solver +""" + +import numpy as np +import numpy.linalg as la +import scipy.interpolate as inter +import scipy.sparse as sp +import scipy.sparse.linalg as spla + +from jax.config import config + +config.update("jax_enable_x64", True) +import jax.numpy as jnp +from jax import jacfwd + + +class StartLink: + """Starting link in the chain, gives the first temperature""" + + def __init__(self, times, inlet_temperature, **kwargs): + """ + Parameters: + times (ntime,): discrete times + inlet_temperature (ntime,): inlet temperatures + """ + self.times = times + self.inlet_temperature = inlet_temperature + + self.inlet_ifn = inter.interp1d(self.times, self.inlet_temperature) + + # Fixed + self.size = 1 + + def T_inlet(self, t): + """Calculate the inlet temperature at a given time + + Parameters: + t: time + """ + return jnp.asarray(self.inlet_ifn(t)) + + def residual(self, T_start, T_end, t): + """Calculate the residual contribution + + Parameters: + T_start: inlet temperatures (null here) + T_end: outlet temperatures + t: time + """ + return T_end - self.T_inlet(t) + + +class PanelLink: + """Connection representing part of a panel""" + + def __init__(self, times, mass_flow, weights, **kwargs): + """ + Parameters: + times (ntime,): discrete times + mass_flow (ntime,): discrete flow rates + weights (ntube,): number of actual tube represented by each panel + """ + self.times = times + self.mass_flow = mass_flow + self.weights = jnp.asarray(weights) + + self.mass_ifn = inter.interp1d(self.times, self.mass_flow) + + def mass_flow_rate(self, t): + """ + Calculate the mass flow at a given time + """ + return jnp.asarray(self.mass_ifn(t)) + + @property + def ntube(self): + """Number of actual tubes in the panel""" + return jnp.sum(self.weights) + + +class ManifoldLink(PanelLink): + """Averages temperatures together at this node in the flow path""" + + def __init__(self, times, mass_flow, weights, **kwargs): + """ + Args: + times (ntime,): times for input + mass_flow (ntime,): mass flow rates + weights (ntube,): tube weights + """ + super().__init__(times, mass_flow, weights, **kwargs) + + # Fixed again... + self.size = 1 + + def residual(self, T_in, T_out, t): + """Residual equations + + Parameters: + T_in: inlet temperatures + T_out: outlet temperatures + t: time + """ + return jnp.sum(self.weights * T_in) / self.ntube - T_out + + +class SimplePanelLink(PanelLink): + """Very simple panel model for debugging""" + + def __init__( + self, times, mass_flow, weights, ri, h, metal_temp, material, **kwargs + ): + """ + Parameters: + times (ntime,): times for input + mass_flow (ntime,): panel mass flow rate + weights (ntube,): tube weights + ri: tube inner radius + h: tube height + metal_temp (ntime,ntube,nt,nz): tube metal temperatures, fixed grid + material: thermofluid model + """ + super().__init__(times, mass_flow, weights, **kwargs) + self.ri = ri + self.h = h + self.metal_temp = metal_temp + self.material = material + self.zs = np.linspace(0, self.h, self.metal_temp.shape[3]) + self.dtheta = 2.0 * np.pi / self.metal_temp.shape[2] + self.dz = self.h / self.metal_temp.shape[3] + + self.metal_ifn = inter.interp1d(self.times, self.metal_temp, axis=0) + + @property + def size(self): + """Number of explicitly-represented tubes""" + return len(self.weights) + + def residual(self, T_in, T_out, t): + """Residual equations + + Args: + T_in: inlet temperatures + T_out: outlet temperatures + t: time + """ + return self.Q_mass(T_in, T_out, t) - self.Q_conv(T_in, T_out, t) + + def mean_temperature(self, T_start, T_tube): + """ + Returns the mean temperature of each tube + """ + return (T_tube + T_start) / 2.0 + + def metal_temperature(self, t): + """ + Metal temperature field at a given time + """ + return jnp.asarray(self.metal_ifn(t)) + + def Q_mass(self, T_start, T_tube, t): + """ + Heat transfered out of the panel due to mass flow + + Parameters: + T_start (scalar): temperature at start of panel + T_tube (ntube,): temperature at end of tubes + t: time + """ + mdot = self.mass_flow_rate(t) + T_mean = self.mean_temperature(T_start, T_tube) + cp = self.material.cp(T_mean) + + return self.weights * mdot / self.ntube * cp * (T_tube - T_start) + + def Q_conv(self, T_start, T_tube, t): + """ + Heat transfered into the panel due to convection + + Parameters: + T_start (scalar): temperature at start of panel + T_tube (ntube,): temperature at end of tubes + t: time + """ + # Flow velocity + u = self.flow_rates(T_start, T_tube, t) + + # Convective heat transfer coefficient + # We could make this height dependent if we're using AD... + T_mean = self.mean_temperature(T_start, T_tube) + h = self.material.film_coefficient(T_mean, u, self.ri) + + # Integrate up the total contributions + fluid_temps = self.fluid_temperatures(T_start, T_tube, t) + T_metal = self.metal_temperature(t) + + flux = ( + self.weights[:, None, None] + * h[:, None, None] + * (T_metal - fluid_temps[:, None, :]) + ) + + return self.ri * self.dz * self.dtheta * jnp.sum(flux, axis=(1, 2)) + + def flow_rates(self, T_start, T_tube, t): + """Recover the flow rates for a given state + + Args: + T_start: inlet temperatures + T_tube: outlet temperatures + t: time + """ + mdot = self.mass_flow_rate(t) + T_mean = self.mean_temperature(T_start, T_tube) + rho = self.material.rho(T_mean) + return mdot / (self.ntube * np.pi * rho * self.ri**2.0) + + def fluid_temperatures(self, T_start, T_tube, t): + """Recover the fluid temperatures for a given state + + Args: + T_start: inlet temperatures + T_tube: outlet temperatures + t: time + """ + return ((T_tube - T_start) / self.h * self.zs[:, None] + T_start).T + + +def deparameterize_flow_path(pset): + """ + Convert parameter set to kwargs for FlowPath + """ + return { + "rtol": pset.get_default("rtol", 1e-6), + "atol": pset.get_default("atol", 1e-8), + "miter": pset.get_default("miter", 100), + "verbose": pset.get_default("verbose", False), + } + + +class FlowPath: + """Flow path data structure + + A simplified description of a flow path as chain. + """ + + def __init__( + self, + times, + mass_flow, + inlet_temperature, + rtol=1e-6, + atol=1e-8, + miter=50, + verbose=False, + **kwargs + ): + """ + Parameters: + times (ntime,): discrete times + mass_flow (ntime,): mass flow rate at each time + inlet_temperature (ntime,): inlet temperature at each time + """ + # Always start with the inlet node! + self.times = times + self.mass_flow = mass_flow + self.inlet_temperature = inlet_temperature + self.chain = [StartLink(times, inlet_temperature)] + + # Solver parameters + self.rtol = 1e-6 + self.atol = 1e-8 + self.miter = 100 + self.verbose = verbose + + def add_panel(self, weights, ri, h, metal_temp, material): + """ + Construct and add the standard panel -> manifold link + + Parameters: + weights: tube weights + ri: tube inner radius + h: tube height + metal_temp: metal temperatures + material: thermofluid material + """ + self.chain.append( + SimplePanelLink( + self.times, self.mass_flow, weights, ri, h, metal_temp, material + ) + ) + self.chain.append(ManifoldLink(self.times, self.mass_flow, weights)) + + def add_panel_from_object(self, panel, material): + """Same as add_panel, but use a panel object directly + + Args: + panel (receiver.Panel): panel object + material: fluid material properties + """ + weights = np.array([float(tube.multiplier) for tube in panel.tubes.values()]) + # Fix this, we should take variable radii and heights + ri = np.array([tube.r - tube.t for tube in panel.tubes.values()])[0] + h = np.array([tube.h for tube in panel.tubes.values()])[0] + + metal_temps = [] + for tube in panel.tubes.values(): + if tube.abstraction == "3D": + metal_temps.append( + tube.quadrature_results["ghost_temperature"][..., 1, 1:-1, 1:-1] + ) + elif tube.abstraction == "2D": + metal_temps.append( + np.broadcast_to( + tube.quadrature_results["ghost_temperature"][:, 1, 1:-1, None], + (tube.ntime, tube.nt, tube.nz), + ) + ) + elif tube.abstraction == "1D": + metal_temps.append( + np.broadcast_to( + tube.quadrature_results["ghost_temperature"][:, 1, None, None], + (tube.ntime, tube.nt, tube.nz), + ) + ) + else: + raise ValueError("Need to add") + + metal_temps = np.swapaxes(np.array(metal_temps), 0, 1) + + self.add_panel(weights, ri, h, metal_temps, material) + + def _setup(self): + """ + Setup the data structures needed to solve the current chain + """ + self.nvals = 0 + self.dof_map = [] + for obj in self.chain: + self.dof_map.append(list(range(self.nvals, self.nvals + obj.size))) + self.nvals += obj.size + + def solve(self, t): + """ + Solve for the current fluid temperatures + + Args: + t: time + """ + self._setup() + self.t = t + + # Significant decision... + T = np.zeros((self.nvals)) + + # Initial residual + R, J = self.RJ(T) + nr0 = la.norm(R) + + if self.verbose: + print("Iter.\t||R||\t\t||R||/||R0||") + print("%i\t%e" % (0, nr0)) + + for i in range(self.miter): + dT = spla.spsolve(J, R) + T -= dT + R, J = self.RJ(T) + nr = la.norm(R) + if np.isnan(nr): + raise RuntimeError("NaN detected!") + if self.verbose: + print("%i\t%e\t%e" % (i + 1, nr, nr / nr0)) + if (nr < self.atol) or (nr / nr0 < self.rtol): + break + else: + raise RuntimeError("Too many iterations in newton solver!") + + return T + + def recover_tube_results(self, T, t): + """Recover the tube flow rates and actual temperature fields + + Args: + T (np.array): temperatures + t (float): time + """ + flow_rates = [] + tube_temperatures = [] + dofs_prev = [] + for i, (obj, dofs) in enumerate(zip(self.chain, self.dof_map)): + # Panels are every other entry + T_prev = T[dofs_prev] + T_curr = T[dofs] + + if i % 2 == 1: + flow_rates.append(obj.flow_rates(T_prev, T_curr, t)) + tube_temperatures.append(obj.fluid_temperatures(T_prev, T_curr, t)) + dofs_prev = dofs + + return flow_rates, tube_temperatures + + def RJ(self, T): + """Formulate the residual and Jacobian for a given time + + Args: + T (np.array): nodal temperatures + """ + R = np.zeros((self.nvals,)) + I = [] + J = [] + vals = [] + + dofs_prev = [] + for obj, dofs in zip(self.chain, self.dof_map): + T_prev = jnp.asarray(T[dofs_prev]) + T_curr = jnp.asarray(T[dofs]) + + R[dofs] = obj.residual(T_prev, T_curr, self.t) + Jprev = jacfwd(obj.residual, argnums=0)(T_prev, T_curr, self.t) + + i, j, v = coo_entries(dofs, dofs_prev, Jprev) + I.extend(i) + J.extend(j) + vals.extend(v) + + Jcurr = jacfwd(obj.residual, argnums=1)(T_prev, T_curr, self.t) + i, j, v = coo_entries(dofs, dofs, Jcurr) + I.extend(i) + J.extend(j) + vals.extend(v) + + dofs_prev = dofs + + J = sp.coo_array((vals, (I, J)), shape=(self.nvals, self.nvals)) + return R, J.tocsr() + + +def coo_entries(row, col, jac): + """ + Provide flat list for the row indices, column indices, and entries + of a jacobian entry + + Args: + row (np.array): row indices + col (np.array): column indices + jac (np.array): actual matrix entries + """ + i, j = np.meshgrid(row, col) + + return list(i.flatten()), list(j.flatten()), list(jac.flatten()) diff --git a/srlife/thermohydraulics/thermalfluid.py b/srlife/thermohydraulics/thermalfluid.py new file mode 100644 index 0000000..eafceec --- /dev/null +++ b/srlife/thermohydraulics/thermalfluid.py @@ -0,0 +1,235 @@ +# pylint: disable=no-member, wrong-import-position +""" + Thermal-fluid specific material classes +""" +import xml.etree.ElementTree as ET + +from jax.config import config + +config.update("jax_enable_x64", True) +import jax.numpy as jnp + +from srlife import materials + + +class ThermalFluidMaterial: + """Thermal fluid material properties + + The goal of this class is to provide film coefficient as a function of + fluid velocity, temperature, and tube inner radius. + + The current implementation works from the + - Heat capacity (constant pressure) + - Density + - Dynamic viscosity + - Conductivity + + as a function of temperature (in K). + """ + + def __init__( + self, + film_min=1e-8, + T_max=2000.0, + T_min=0.0, + laminar_cutoff=2e3, + laminar_value=4.01, + ): + self.film_min = film_min + self.T_max = T_max + self.T_min = T_min + self.laminar_cutoff = laminar_cutoff + self.laminar_value = laminar_value + + def T_effective(self, T): + """ + Cutoff T to avoid issues with the correlations + """ + return jnp.maximum(jnp.minimum(T, self.T_max), self.T_min) + + @classmethod + def load(cls, fname, modelname): + """Load model from an XML file + + Parameters: + fname: XML filename + modelname: model name in the file + """ + tag, mtype = materials.find_name(fname, modelname) + data = materials.load_node(tag)[modelname] + + if mtype == "PolynomialThermalFluidMaterial": + return PolynomialThermalFluidMaterial.load(data) + else: + raise ValueError("Unknown ThermalFluidMaterial type %s" % mtype) + + def save(self, fname, modelname): + """Save model to an XML file + + Parameters: + fname: XML filename + modelname: model name in the file + """ + root = ET.Element("models") + + materials.save_node( + modelname, self.data(), root, attrib={"type": self.model_type} + ) + tree = ET.ElementTree(element=root) + tree.write(fname) + + def film_coefficient(self, T, u, r): + """Film coefficient + + Calculate the film coefficient as a function of + temperature, flow velocity, and tube diameter + + Parameters: + T: temperature, in K + u: flow velocity, in mm/hr + r: tube inner radius, in mm + """ + nu = self.nusselt(T, u, r) + + return jnp.maximum(nu * self.k(T) / (2.0 * r), self.film_min) + + def reynolds(self, T, u, r): + """Reynolds number + + Parameters: + T: temperature, in K + u: flow velocity, in mm/hr + r: tube inner radius, in mm + """ + return self.rho(T) * u * 2.0 * r / self.mu(T) + + def prandtl(self, T): + """Prandtl number + + Parameters: + T: temperature, in K + """ + return self.cp(T) * self.mu(T) / self.k(T) + + def nusselt(self, T, u, r): + """Nusselt number + + This is really where the work gets done in calculating the film + coefficient and different correlations are possible. + + Right now we use the Gnielinski correlation for turbulent flow + + Parameters: + T: temperature, in K + u: flow velocity, in m/s + r: tube inner radius, in mm + """ + re = self.reynolds(self.T_effective(T), u, r) + pr = self.prandtl(self.T_effective(T)) + f = (0.79 * jnp.log(re) - 1.64) ** -2.0 + + turbulent = ((f / 8.0) * (re - 1000.0) * pr) / ( + 1.0 + 12.7 * (f / 8.0) ** 0.5 * (pr ** (2.0 / 3.0) - 1.0) + ) + + turbulent.at[re < self.laminar_cutoff].set(self.laminar_value) + + return turbulent + + +class PolynomialThermalFluidMaterial(ThermalFluidMaterial): + """Thermal-fluid relations correlated with polynomials + + The polynomial definitions use C, the class handles converting K -> C + + Parameters: + cp_poly (array): coefficients for the heat capacity, in numpy order + rho_poly (array): coefficients for the density, in numpy order + mu_poly (array): coefficients for the viscosity, in numpy order + k_poly (array): coefficients for the conductivity, in numpy order + film_min (Optional[float]): lower cutoff on the value of the film coefficient + T_max (Optional[float]): upper cutoff on temperature used in finding values + T_min (Optional[float]): lower cutoff on temperature used in finding values + laminar_cutoff (Optional[float]): Reynolds number upper limit for laminar flow + laminar_value (Optional[float]): Nusslet number to use in laminar flow + """ + + def __init__(self, cp_poly, rho_poly, mu_poly, k_poly, **kwargs): + super().__init__(**kwargs) + self.cp_poly = jnp.asarray(cp_poly) + self.rho_poly = jnp.asarray(rho_poly) + self.mu_poly = jnp.asarray(mu_poly) + self.k_poly = jnp.asarray(k_poly) + + self.model_type = "PolynomialThermalFluidMaterial" + + def data(self): + """ + Reduce the class down to a dictionary of strings for + serialization + """ + return { + "cp_poly": materials.string_array(self.cp_poly), + "rho_poly": materials.string_array(self.rho_poly), + "mu_poly": materials.string_array(self.mu_poly), + "k_poly": materials.string_array(self.k_poly), + "film_min": str(self.film_min), + "T_max": str(self.T_max), + "T_min": str(self.T_min), + "laminar_cutoff": str(self.laminar_cutoff), + "laminar_value": str(self.laminar_value), + } + + @classmethod + def load(cls, values): + """Create from a dictionary + + Parameters: + values: dictionary of values + """ + # Assemble kwargs + kwargs = { + k: float(values[k]) + for k in ["film_min", "T_max", "T_min", "laminar_cutoff", "laminar_value"] + if k in values + } + + return cls( + materials.destring_array(values["cp_poly"]), + materials.destring_array(values["rho_poly"]), + materials.destring_array(values["mu_poly"]), + materials.destring_array(values["k_poly"]), + **kwargs + ) + + def cp(self, T): + """Heat capacity as a function of temperature in K + + Parameters: + T: temperature, in K + """ + return jnp.polyval(self.cp_poly, T) + + def rho(self, T): + """Density as a function of temperature in K + + Parameters: + T: temperature, in K + """ + return jnp.polyval(self.rho_poly, self.T_effective(T)) + + def mu(self, T): + """Dynamic viscosity, as a function of temperature in K + + Parameters: + T: temperature, in K + """ + return jnp.polyval(self.mu_poly, T) + + def k(self, T): + """Conductivity, as a function of temperature in K + + Parameters: + T: temperature, in K + """ + return jnp.polyval(self.k_poly, T) diff --git a/srlife/writers.py b/srlife/writers.py index b12b4d1..4cd3ecb 100644 --- a/srlife/writers.py +++ b/srlife/writers.py @@ -91,6 +91,8 @@ def _dump_point_data(self, grid, i): def _dump_element_data(self, grid, i): for field, data in self.tube.quadrature_results.items(): + if field.split("_")[0] == "ghost": + continue pdata = vtk.vtkFloatArray() pdata.SetNumberOfComponents(1) pdata.SetName(field) diff --git a/test/test_ceramic_damage.py b/test/test_ceramic_damage.py index c315072..a13b8cc 100644 --- a/test/test_ceramic_damage.py +++ b/test/test_ceramic_damage.py @@ -38,7 +38,8 @@ def setUp(self): self.material = materials.StandardCeramicMaterial( np.array([0, 1000.0]), np.array([self.s0, self.s0]), - self.m, + np.array([0, 1000.0]), + np.array([self.m, self.m]), self.c_bar, self.nu, ) @@ -114,7 +115,8 @@ def setUp(self): self.material = materials.StandardCeramicMaterial( np.array([0, 1000.0]), np.array([self.s0, self.s0]), - self.m, + np.array([0, 1000.0]), + np.array([self.m, self.m]), self.c_bar, self.nu, ) @@ -188,7 +190,8 @@ def setUp(self): self.material = materials.StandardCeramicMaterial( np.array([0, 1000.0]), np.array([self.s0, self.s0]), - self.m, + np.array([0, 1000.0]), + np.array([self.m, self.m]), self.c_bar, self.nu, ) @@ -262,7 +265,8 @@ def setUp(self): self.material = materials.StandardCeramicMaterial( np.array([0, 1000.0]), np.array([self.s0, self.s0]), - self.m, + np.array([0, 1000.0]), + np.array([self.m, self.m]), self.c_bar, self.nu, ) @@ -336,7 +340,8 @@ def setUp(self): self.material = materials.StandardCeramicMaterial( np.array([0, 1000.0]), np.array([self.s0, self.s0]), - self.m, + np.array([0, 1000.0]), + np.array([self.m, self.m]), self.c_bar, self.nu, ) @@ -410,7 +415,8 @@ def setUp(self): self.material = materials.StandardCeramicMaterial( np.array([0, 1000.0]), np.array([self.s0, self.s0]), - self.m, + np.array([0, 1000.0]), + np.array([self.m, self.m]), self.c_bar, self.nu, ) @@ -484,7 +490,8 @@ def setUp(self): self.material = materials.StandardCeramicMaterial( np.array([0, 1000.0]), np.array([self.s0, self.s0]), - self.m, + np.array([0, 1000.0]), + np.array([self.m, self.m]), self.c_bar, self.nu, ) @@ -558,7 +565,8 @@ def setUp(self): self.material = materials.StandardCeramicMaterial( np.array([0, 1000.0]), np.array([self.s0, self.s0]), - self.m, + np.array([0, 1000.0]), + np.array([self.m, self.m]), self.c_bar, self.nu, ) diff --git a/test/test_material_library.py b/test/test_material_library.py index 43cd3fa..cc1f872 100644 --- a/test/test_material_library.py +++ b/test/test_material_library.py @@ -4,6 +4,7 @@ fluids = ["salt"] alloys = ["316H", "800H", "A617", "740H", "A282", "A230"] +thermalfluids = ["32MgCl2-68KCl.xml"] class TestMaterials(unittest.TestCase): diff --git a/test/test_materials.py b/test/test_materials.py index 12f4609..3439fd0 100644 --- a/test/test_materials.py +++ b/test/test_materials.py @@ -244,12 +244,13 @@ class TestStandardCeramicMaterial(unittest.TestCase): def setUp(self): self.Ts = np.array([25.0, 800.0, 1000.0, 1200.0, 1400.0, 1500.0]) self.s0s = np.array([507.0, 467.0, 528.0, 570.0, 746.0, 461.0]) - self.m = 10.7 + self.mTs = np.array([25.0, 1500.0]) + self.ms = np.array([10.7, 9.2]) self.c_bar = 1.5 self.nu = 0.17 self.mat = materials.StandardCeramicMaterial( - self.Ts, self.s0s, self.m, self.c_bar, self.nu + self.Ts, self.s0s, self.mTs, self.ms, self.c_bar, self.nu ) def test_strength(self): @@ -262,10 +263,11 @@ def test_strength(self): self.assertAlmostEqual(a, b) def test_m(self): + ifn = inter.interp1d(self.mTs, self.ms) T = 1099.1 a = self.mat.modulus(T) - b = self.m + b = ifn(T) self.assertAlmostEqual(a, b) @@ -289,9 +291,11 @@ def test_store_receover(self): self.mat.save(tfile, "blah") test = materials.CeramicMaterial.load(tfile, "blah") - self.assertTrue(np.allclose(test.temperatures, self.Ts)) + self.assertTrue(np.allclose(test.s_temperatures, self.Ts)) self.assertTrue(np.allclose(test.strengths, self.s0s)) - self.assertTrue(np.isclose(test.m, self.m)) + self.assertTrue(np.allclose(test.m_temperatures, self.mTs)) + self.assertTrue(np.allclose(test.mvals, self.ms)) + self.assertTrue(np.isclose(test.C, self.c_bar)) self.assertTrue(np.isclose(test.nu_val, self.nu)) diff --git a/test/thermohydraulics/__init__.py b/test/thermohydraulics/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/thermohydraulics/test_flowpath.py b/test/thermohydraulics/test_flowpath.py new file mode 100644 index 0000000..a813e50 --- /dev/null +++ b/test/thermohydraulics/test_flowpath.py @@ -0,0 +1,160 @@ +import unittest +import tempfile + +from absl import logging + +logging.set_verbosity(logging.FATAL) + +import numpy as np +import numpy.random as ra +from srlife.thermohydraulics import thermalfluid, flowpath + + +class TestBasicSetup(unittest.TestCase): + def setUp(self): + self.cp = np.array([0.1046, 944.622]) + self.rho = np.array([-0.522, 1903.7]) + self.mu = np.array([1.784e-8, -2.91e-5, 1.4965e-2]) + self.k = np.array([-0.0001, 0.5047]) + + self.material = thermalfluid.PolynomialThermalFluidMaterial( + self.cp, self.rho, self.mu, self.k + ) + + self.times = np.array([0.0, 1.0, 2.0]) + self.mass_flow = np.array([10.0, 100.0, 10.0]) + self.weights = np.array([2.0, 4.0, 2.0]) + self.ri = 25.4 + self.h = 1000.0 + self.ntime = len(self.times) + self.ntube = len(self.weights) + self.nt = 12 + self.nz = 14 + self.metal_temp = ra.random((self.ntime, self.ntube, self.nt, self.nz)) + + self.panel1 = flowpath.SimplePanelLink( + self.times, + self.mass_flow, + self.weights, + self.ri, + self.h, + self.metal_temp, + self.material, + ) + + self.t = 1.2 + + def test_basic_balance(self): + T_start = np.array([100.0]) + T_end = np.array([120.0, 140.0, 110.0]) + + Q_mass = self.panel1.Q_mass(T_start, T_end, self.t) + self.assertEqual(Q_mass.shape, (self.ntube,)) + + Q_conv = self.panel1.Q_conv(T_start, T_end, self.t) + self.assertEqual(Q_conv.shape, (self.ntube,)) + + R = self.panel1.residual(T_start, T_end, self.t) + self.assertTrue(np.allclose(R, Q_mass - Q_conv)) + + +class TestIsothermal(unittest.TestCase): + def setUp(self): + self.cp = np.array([994.6]) + self.rho = np.array([1903.7]) + self.mu = np.array([1.5e-2]) + self.k = np.array([0.5]) + + self.material = thermalfluid.PolynomialThermalFluidMaterial( + self.cp, self.rho, self.mu, self.k + ) + + self.times = np.array([0.0, 1.0]) + self.mass_flow = np.array([0.0, 100.0]) + self.inlet_temperature = np.array([0.0, 50.0]) + + self.ntime = len(self.times) + self.nt = 12 + self.nz = 10 + + self.weights_1 = np.array([1.0, 1.0, 1.0]) + self.ri_1 = 25.4 + self.h_1 = 1000.0 + self.metal_1 = np.zeros((self.ntime, len(self.weights_1), self.nt, self.nz)) + + self.metal_1[1, 0] = 50.0 + self.metal_1[1, 1] = 50.0 + self.metal_1[1, 2] = 50.0 + + self.model = flowpath.FlowPath( + self.times, self.mass_flow, self.inlet_temperature + ) + self.model.add_panel( + self.weights_1, self.ri_1, self.h_1, self.metal_1, self.material + ) + + def test_no_heat_in(self): + T1 = self.model.solve(1.0) + self.assertTrue(np.isclose(T1[-1], self.inlet_temperature[-1])) + + +class TestAnalytic(unittest.TestCase): + def setUp(self): + self.cp = np.array([994.6]) + self.rho = np.array([1.9]) + self.mu = np.array([1.5e-6]) + self.k = np.array([0.5]) + + self.material = thermalfluid.PolynomialThermalFluidMaterial( + self.cp, self.rho, self.mu, self.k + ) + + self.times = np.array([0.0, 1.0]) + self.mass_flow = np.array([0.0, 10.0]) + self.inlet_temperature = np.array([0.0, 50.0]) + + self.ntime = len(self.times) + self.nt = 12 + self.nz = 10 + + self.weights_1 = np.array([2.0, 10.0, 2.0]) + self.ri_1 = 100.0 + self.h_1 = 1000.0 + self.metal_1 = np.zeros((self.ntime, len(self.weights_1), self.nt, self.nz)) + + self.metal_T = 100.0 + + self.metal_1[1, 0] = self.metal_T + self.metal_1[1, 1] = self.metal_T + self.metal_1[1, 2] = self.metal_T + + self.model = flowpath.FlowPath( + self.times, self.mass_flow, self.inlet_temperature + ) + self.model.add_panel( + self.weights_1, self.ri_1, self.h_1, self.metal_1, self.material + ) + + def test_no_heat_in(self): + T = self.model.solve(1.0) + Tnumer = T[-1] + u = self.mass_flow[1] / ( + self.rho * np.sum(self.weights_1) * np.pi * self.ri_1**2.0 + ) + h_film = self.material.film_coefficient( + np.array([100.0]), u, np.array([self.ri_1]) + )[0] + + mdot = self.mass_flow[-1] + cp = self.cp[0] + Ts = self.inlet_temperature[-1] + r = self.ri_1 + h = self.h_1 + Tm = self.metal_T + n = np.sum(self.weights_1) + + Tanal = ( + mdot * cp * Ts + n * 2.0 * np.pi * r * h * h_film * (Tm - 0.5 * Ts) + ) / (mdot * cp + n * 2.0 * np.pi * r * h * h_film * 0.5) + + self.assertAlmostEqual(Tanal, Tnumer) diff --git a/test/thermohydraulics/test_thermalfluid.py b/test/thermohydraulics/test_thermalfluid.py new file mode 100644 index 0000000..7ce9be9 --- /dev/null +++ b/test/thermohydraulics/test_thermalfluid.py @@ -0,0 +1,45 @@ +import unittest +import tempfile + +import numpy as np +from srlife.thermohydraulics import thermalfluid + + +class TestPolynomialThermalFluidMaterial(unittest.TestCase): + def setUp(self): + self.cp = np.array([0.0000290556, 0.254458]) + self.rho = np.array([-5.52e-10, 2.0544788e-6]) + self.mu = np.array([6.4224e-8, -0.000139846, 0.087281]) + self.k = np.array([-1e-7, 0.000532015]) + + self.model = thermalfluid.PolynomialThermalFluidMaterial( + self.cp, self.rho, self.mu, self.k + ) + self.T = np.array([100.0, 200.0, 300.0]) + 273.15 + self.u = np.array([1.0, 2.0, 3.0]) + self.r = np.array([5.0, 10.0, 15.0]) + + def test_definitions(self): + self.assertTrue(np.allclose(self.model.cp(self.T), np.polyval(self.cp, self.T))) + self.assertTrue( + np.allclose(self.model.rho(self.T), np.polyval(self.rho, self.T)) + ) + self.assertTrue(np.allclose(self.model.mu(self.T), np.polyval(self.mu, self.T))) + self.assertTrue(np.allclose(self.model.k(self.T), np.polyval(self.k, self.T))) + + def test_recover(self): + tfile = tempfile.mktemp() + self.model.save(tfile, "whatever") + + recover = thermalfluid.ThermalFluidMaterial.load(tfile, "whatever") + + self.assertTrue(np.allclose(recover.cp_poly, self.model.cp_poly)) + self.assertTrue(np.allclose(recover.rho_poly, self.model.rho_poly)) + self.assertTrue(np.allclose(recover.mu_poly, self.model.mu_poly)) + self.assertTrue(np.allclose(recover.k_poly, self.model.k_poly)) + + self.assertTrue(np.isclose(recover.film_min, self.model.film_min)) + self.assertTrue(np.isclose(recover.T_max, self.model.T_max)) + self.assertTrue(np.isclose(recover.T_min, self.model.T_min)) + self.assertTrue(np.isclose(recover.laminar_cutoff, self.model.laminar_cutoff)) + self.assertTrue(np.isclose(recover.laminar_value, self.model.laminar_value))