From 88db227b6301b8ebebd83501d9c7f38abacedeac Mon Sep 17 00:00:00 2001 From: Jordan Musser Date: Tue, 23 Jan 2024 14:43:22 -0500 Subject: [PATCH] Add changes --- docs/source_docs/conf.py | 2 +- .../user_guide/inputs/geometry.rst | 310 ++++++++++++++++-- .../inputs/images/geometry/EB_box_ex.png | Bin 0 -> 9707 bytes .../inputs/images/geometry/EB_cylinder_ex.png | Bin 0 -> 12051 bytes .../geometry/cylinder_geometry_inputs.png | Bin 0 -> 9736 bytes 5 files changed, 279 insertions(+), 33 deletions(-) create mode 100644 docs/source_docs/user_guide/inputs/images/geometry/EB_box_ex.png create mode 100644 docs/source_docs/user_guide/inputs/images/geometry/EB_cylinder_ex.png create mode 100644 docs/source_docs/user_guide/inputs/images/geometry/cylinder_geometry_inputs.png diff --git a/docs/source_docs/conf.py b/docs/source_docs/conf.py index b07a662..23ddcc2 100644 --- a/docs/source_docs/conf.py +++ b/docs/source_docs/conf.py @@ -105,7 +105,7 @@ html_theme_options = { # Toc options 'collapse_navigation': True, 'sticky_navigation': True, - 'navigation_depth': 3, + 'navigation_depth': 4, 'includehidden': True, 'titles_only': False } diff --git a/docs/source_docs/user_guide/inputs/geometry.rst b/docs/source_docs/user_guide/inputs/geometry.rst index cf6a04e..eb69e51 100644 --- a/docs/source_docs/user_guide/inputs/geometry.rst +++ b/docs/source_docs/user_guide/inputs/geometry.rst @@ -8,7 +8,10 @@ The following inputs are defined using the ``mfix`` prefix. +------------------------+-------------------------------------------------------------------+----------+---------------------+ | | Description | Type | Default | +========================+===================================================================+==========+=====================+ -| geometry | Select a predefined EB geometry | String | '' | +| geometry | Select a basic ``box`` or ``cylinder`` predefined EB geometry, or | String | '' | +| | the user-programed ``generic`` geometry. Details about these | | | +| | geometry options and associated additional inputs are provided | | | +| | in the following sections. | | | +------------------------+-------------------------------------------------------------------+----------+---------------------+ | geometry_filename | The CSG file that defines the EB geometry | String | '' | +------------------------+-------------------------------------------------------------------+----------+---------------------+ @@ -18,29 +21,256 @@ The following inputs are defined using the ``mfix`` prefix. Most simulations require a user to specify some kind of geometry. For example, the geometry could be a basic cylinder used to model flow inside a pipe, or it may be an irregularly shaped solid to study external flow around a bluff body, or the geometry -may be the proposed design of a complex, multi-stage chemical reactor undergoing performance assessment. In the following sections, -several options for specifying a geometry are described. +may be the proposed design of a complex, multi-stage chemical reactor undergoing performance assessment. In the following sections, several options for specifying a geometry are described. .. caution:: - Any domain extent that is not periodic or defined as a Dirichlet or Neumann :ref:`boundary condition` - must be fully covered. To state this another way, if a domain extent is not periodic or an inflow or outflow boundary condition, - then it should be excluded from (outside of) the domain by the embedded boundary geometry. + Any domain extent that is not periodic or defined as a Dirichlet or Neumann + :ref:`boundary condition` must be fully covered. + To state this another way, if a domain extent is not periodic or an inflow + or outflow boundary condition, then it should be excluded from (outside of) + the domain by the embedded boundary geometry. +.. _InputsGeometry_PredefinedEBs: -Pre-defined geometries +Predefined geometries ---------------------- -The ``mfix.geometry`` input is used to choose one of the basic pre-defined geometries, or to +The ``mfix.geometry`` input is used to choose one of the basic predefined geometries, or to select the option to use a user-defined geometry constructed from native AMReX implicit functions. -Constructive solid geometry ---------------------------- +``box`` geometry +^^^^^^^^^^^^^^^^ -Use the ``mfix.geometry_filename`` input to select a *constructive solid geometry (CSG)* that defines -the system geometry. +The following inputs are defined using the ``box`` prefix. + ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| | Description | Type | Default | ++========================+===================================================================+==========+=====================+ +| Lo | Low corner of the embedded boundary box | Reals | ``prob_lo`` | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| Hi | High corner of the embedded boundary box | Reals | ``prob_hi`` | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| internal_flow | Flag to indicate that flow is *inside* the box. | Bool | true | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| offset | Shift low side box walls by ``+offset`` and high side walls by | Real | 1.0e-15 | +| | ``-offset``. An example use of this input would be to define a | | | +| | a box with ``Lo`` and ``Hi`` equal to ``prob_lo`` and ``prob_hi``.| | | +| | The offset slightly shrinks the ``box`` so the walls do not | | | +| | coincide with the domain extents. | | | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ + +``box`` limitations +""""""""""""""""""" + +The predefined EB ``box`` geometry has several limitations: + +* The sides of the box should not coincide with the domain extents. +* A ``box`` is aligned with the coordinate axes and cannot be rotated in any direction. +* There can only be one ``box``. Multiple boxes cannot be defined and combined. + + +``box`` example +""""""""""""""" + +The domain is a :math:`2 \times 2 \times 8` cuboid where *X* and *Y* span :math:`[-1,1]`, +and *Z* spans :math:`[0,8]`. A :math:`10` meter long embedded boundary ``box`` with a +:math:`1 \times 1` cross-section runs lengthwise through the domain, centered about the +*Z* axis. The EB is shifted down the *Z* axis so that there is a :math:`-1` meter +overhang on the low and high *Z* domain faces. + +.. _inputs_box_geometry_ex: + +.. code-block:: bash + :caption: Snippet of intpus for predefined EB ``box`` geometry example. This is not a complete input file. + + # Define periodicity and domain extents + # ------------------------------------------------------------- + geometry.coord_sys = 0 # Cartesian coordinates + geometry.is_periodic = 0 0 1 # periodicity for each direction + geometry.prob_lo = -1. -1. 0 # lo corner of physical domain. + geometry.prob_hi = 1. 1. 8. # hi corner of physical domain + + # Select box geometry and specify settings + # ------------------------------------------------------------- + mfix.geometry = box + + box.Lo = -0.5 -0.5 -1.0 + box.Hi = 0.5 0.5 9.0 + + box.offset = 0. + box.internal_flow = true + + +:numref:`fig_box_geometry_ex` illustrates the (grey) domain and (blue) embedded +boundary ``box`` geometry. The left image is a 3D rendering of the setup, and +the center and right images are 2D slices along the *XZ* and *XY* planes, respectively. + + +.. _fig_box_geometry_ex: + +.. figure:: ./images/geometry/EB_box_ex.png + :width: 100% + :align: center + :alt: domain used with box embedded boundary + + Example of predefined embedded boundary ``box`` geometry with the EB colored blue and the domain colored grey. + Left: the domain and EB are rendered in 3D. + Center: a 2D slice showing the XZ plane. + Right: a 2D slice showing the XY plane. + + +This is an internal flow setup, therefore the sections of the domain that do not intersect +the EB ``box`` are *covered* and thereby excluded from run-time calculations. + +* No :ref:`boundary conditions` are needed for the low and high + domain faces in *X* and *Y* because they are fully covered. + +* The low and high *Z* domain faces remain uncovered, however no boundary conditions are + needed because the domain is periodic in *Z* + (*see* the :ref:`inputs snippet` for this example ). + + +---- + + +``cylinder`` geometry +^^^^^^^^^^^^^^^^^^^^^ + +The following inputs are defined using the ``cylinder`` prefix. + ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| | Description | Type | Default | ++========================+===================================================================+==========+=====================+ +| radius | Cylinder radius | Real | 0.0002 | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| height | Height (length) of cylinder. If the height is not defined (-1), | Real | -1 | +| | then the cylinder is made infinitely long to overhang the domain | | | +| | extents. | | | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| direction | Axis the cylinder runs along. | int | 0 | +| | (``0``: *X*, ``1``: *Y*, ``2``: *Z*) | | | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| center | Center of cylinder. For a cylinder with an undefined ``height``, | Reals | 0. 0. 0. | +| | the center value in the height ``direction`` can be any value. | | | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| rotation | Rotation angle in degrees of cylinder. | Real | 0. | +| | | | | +| | * Only cylinders with an undefined ``height`` (i.e., infinitely | | | +| | long) can be rotated. | | | +| | * Rotation is applied about the ``center`` of the cylinder. | | | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| rotation_axe | Axis to rotate the cylinder about. | int | 0 | +| | (``0``: *X*, ``1``: *Y*, ``2``: *Z*) | | | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ +| internal_flow | Flag to indicate that flow is *inside* the box. | Bool | true | ++------------------------+-------------------------------------------------------------------+----------+---------------------+ + +The inputs for the predefined ``cylinder`` embedded boundary geometry are illustrated in :numref:`fig_cylinder_geometry_inputs`. + +.. _fig_cylinder_geometry_inputs: + +.. figure:: ./images/geometry/cylinder_geometry_inputs.png + :width: 80% + :align: center + :alt: domain used with box embedded boundary + + Illustration of predefined embedded boundary ``cylinder`` geometry inputs where the cylinder geometry is + blue and the domain is grey. + + +``cylinder`` limitations +"""""""""""""""""""""""" + +The predefined EB ``cylinder`` geometry has several limitations: + +* The ends of the ``cylinder`` should not coincide with the domain extents. The ``cylinder`` should be shorter than the domain, + or sufficiently long that it overhangs the ends of the domain. +* Rotations are about a single axis. +* There can only be one ``cylinder``. Multiple cylinders cannot be defined and combined. + + +``cylinder`` example +"""""""""""""""""""" + +The domain is a :math:`4 \times 1 \times 1` cuboid where *Y* and *Z* span :math:`[0,1]`, +and *X* spans :math:`[0,4]`. An embedded boundary ``cylinder`` with :math:`0.45` radius +runs lengthwise through the domain, offset by :math:`[0.5]` in the *Y* and *Z*, respectively. +The cylinder is not assigned a length, therefore it runs past the low and high *X* domain faces. + +.. _inputs_cylinder_geometry_ex: + +.. code-block:: bash + :caption: Snippet of intpus for predefined EB ``cylinder`` geometry example. This is not a complete input file. + + # Define periodicity and domain extents + # ------------------------------------------------------------- + geometry.coord_sys = 0 # Cartesian coordinates + geometry.is_periodic = 0 0 0 # periodicity for each direction + geometry.prob_lo = 0. 0. 0 # lo corner of physical domain. + geometry.prob_hi = 4. 1. 1. # hi corner of physical domain + + # Select cylinder geometry and specify settings + # ------------------------------------------------------------- + mfix.geometry = cylinder + + cylinder.internal_flow = true + + cylinder.radius = 0.45 + + cylinder.direction = 0 + cylinder.center = 0.0 0.5 0.5 + + +:numref:`fig_cylinder_geometry_ex` illustrates the (grey) domain and (blue) embedded +boundary ``cylinder`` geometry. The left image is a 3D rendering of the setup, and +the center and right images are 2D slices along the *XZ* and *YZ* planes, respectively. + +.. _fig_cylinder_geometry_ex: + +.. figure:: ./images/geometry/EB_cylinder_ex.png + :width: 100% + :align: center + :alt: domain used with box embedded boundary + + Example of predefined embedded boundary ``cylinder`` geometry with the EB colored blue and the domain colored grey. + Left: the domain and EB are rendered in 3D. + Center: a 2D slice showing the XZ plane. + Right: a 2D slice showing the YZ plane. + + +This is an internal flow setup, therefore the sections of the domain that do not intersect +the EB ``cylinder`` are *covered* and thereby excluded from calculations. + +* No :ref:`boundary conditions` are needed for the low and high + domain faces in *Y* and *Z* because they are fully covered. + +* The low and high *X* domain faces remain uncovered, therefore boundary conditions are + needed to fully specify the problem. Example boundary conditions include a mass inflow + on the low *X* face and a pressure outflow on the *X* high face. + + +---- + + +``generic`` geometry +^^^^^^^^^^^^^^^^^^^^ + +The ``generic`` geometry option is used to select the user-programed embedded boundary geometry. + +* A custom embedded boundary geometry is programed by the user in ``src/eb/mfixeb_generic.cpp`` + using ``AMReX`` native implicit functions and operations. +* An executable containing the geometry modifications is compiled. +* The geometry is accessed using the ``generic`` input. + +.. note:: + A full description of this feature is beyond the scope of this section. A future update to + the documentation may include a tutorial to better demonstrate this capability. + + +.. _InputsGeometry_Regions_and_BCs: Regions and boundary conditions ------------------------------- @@ -57,32 +287,32 @@ in the ``regions`` section, then they are used to specify two no-slip wall bound :caption: Example geometry created using regions and boundary conditions. :name: define_geometry_with_regions - # Define periodicity and domain extents - # ------------------------------------------------------------- - geometry.coord_sys = 0 - geometry.is_periodic = 1 0 1 - geometry.prob_lo = 0. 0. 0. - geometry.prob_hi = 0.01 0.01 0.005 + # Define periodicity and domain extents + # ------------------------------------------------------------- + geometry.coord_sys = 0 + geometry.is_periodic = 1 0 1 + geometry.prob_lo = 0. 0. 0. + geometry.prob_hi = 0.01 0.01 0.005 - # Define two planar regions - # ------------------------------------------------------------- - mfix.regions = wall1 wall2 + # Define two planar regions + # ------------------------------------------------------------- + mfix.regions = wall1 wall2 - regions.wall1.lo = 0.000 1.25e-6 0.000 - regions.wall1.hi = 0.010 1.25e-6 0.005 + regions.wall1.lo = 0.000 1.25e-6 0.000 + regions.wall1.hi = 0.010 1.25e-6 0.005 - regions.wall2.lo = 0.000 9.99875e-3 0.000 - regions.wall2.hi = 0.010 9.99875e-3 0.005 + regions.wall2.lo = 0.000 9.99875e-3 0.000 + regions.wall2.hi = 0.010 9.99875e-3 0.005 - # Use the regions to define no-slip wall boundaries - # ------------------------------------------------------------- - bc.regions = wall1 wall2 + # Use the regions to define no-slip wall boundaries + # ------------------------------------------------------------- + bc.regions = wall1 wall2 - bc.wall1 = nsw - bc.wall1.normal = 0.0 1.0 0.0 + bc.wall1 = nsw + bc.wall1.normal = 0.0 1.0 0.0 - bc.wall2 = nsw - bc.wall2.normal = 0.0 -1.0 0.0 + bc.wall2 = nsw + bc.wall2.normal = 0.0 -1.0 0.0 .. caution:: @@ -90,3 +320,19 @@ in the ``regions`` section, then they are used to specify two no-slip wall bound boundaries. It is better to specify planes slightly offset from the domain as demonstrated in the :ref:`above example`. + +.. _InputsGeometry_CSG: + +Constructive solid geometry +--------------------------- + +Use the ``mfix.geometry_filename`` input to select a *constructive solid geometry (CSG)* that defines +the system geometry. + +* A constructive solid geometry can be created using OpenSCAD. +* This option requires that the executable be built with CSG support. + See the build documentation for for details. + +.. note:: + A full description of this feature is beyond the scope of this section. A future update to + the documentation may include a tutorial to better demonstrate this feature. diff --git a/docs/source_docs/user_guide/inputs/images/geometry/EB_box_ex.png b/docs/source_docs/user_guide/inputs/images/geometry/EB_box_ex.png new file mode 100644 index 0000000000000000000000000000000000000000..8437430885a5623b41623b6b42c4563c19116aae GIT binary patch literal 9707 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 DgL4OO literal 0 HcmV?d00001 -- GitLab