From 896302810e02d904c9dc602ef55bfa3c553b76e6 Mon Sep 17 00:00:00 2001 From: Jordan Musser Date: Thu, 20 Nov 2025 09:05:11 -0500 Subject: [PATCH 1/2] Initial update for eb temperature --- .../user_guide/inputs/boundary_conditions.rst | 55 ++++++++++++++++--- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/docs/source_docs/user_guide/inputs/boundary_conditions.rst b/docs/source_docs/user_guide/inputs/boundary_conditions.rst index ba98905..d7c69eb 100644 --- a/docs/source_docs/user_guide/inputs/boundary_conditions.rst +++ b/docs/source_docs/user_guide/inputs/boundary_conditions.rst @@ -138,13 +138,54 @@ Neumann boundary conditions are assumed by default. In the following table there is a list of the possible entries for EB boundary conditions. Each entry must be preceded by the prefix ``bc.[region_name]`` -+---------------------+-----------------------------------------------------------------------+-------------+-----------+ -| | Description | Type | Default | -+=====================+=======================================================================+=============+===========+ -| eb.temperature | Inhomogeneous Dirichlet BC value for temperature on EBs contained in | Real | 0.0 | -| | the (tridimensional) region [required if advect_enthalpy=1 and | | | -| | bc_region_type='eb']. | | | -+---------------------+-----------------------------------------------------------------------+-------------+-----------+ ++-------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| | Description | Type | Default | ++=========================+=======================================================================+=============+===========+ +| eb.temperature | Specify a wall temperature model for the embedded boundary. | String | adiabatic | +| | | | | +| | Options: | | | +| | | | | +| | * ``adiabatic`` - no heat flux through the wall | | | +| | * ``constant`` - impose a constant temperature along the EB. | | | +| | * ``CHT-1D`` - compute a temperature for the wall using the 1D | | | +| | conjugate heat transfer model. | | | +| | | | | ++-------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| eb.temperature.constant | Constant wall temperature. | Real | None | +| | A valid is required for ``constant`` EB temperature model. | | | ++-------------------------+-----------------------------------------------------------------------+-------------+-----------+ + + +The 1D conjugate heat transfer model settings are defined using the prefix ``bc.[region_name].eb.temperature.CHT-1D``: + +.. |avg_T| replace:: :math:`T = \varepsilon_f T_f + (1-\varepsilon_f) \overline{T}_p` + +.. |avg_Tp| replace:: :math:`\overline{T}_p = \left( {\sum_p^{N_p} T_p V_p} \right) / \left( {\sum_p^{N_p} V_p} \right)` + ++----------------------------+------------------------------------------------------------------------+-------------+-----------+ +| | Description | Type | Default | ++============================+========================================================================+=============+===========+ +| T_env | Environment temperature | Real | None | ++----------------------------+------------------------------------------------------------------------+-------------+-----------+ +| h_int | Internal heat transfer coefficient. | Real | None | ++----------------------------+------------------------------------------------------------------------+-------------+-----------+ +| h_ext | External heat transfer coefficient | Real | None | ++----------------------------+------------------------------------------------------------------------+-------------+-----------+ +| wall.conductivity | The thermal conductivity of the wall. | Real | None | ++----------------------------+------------------------------------------------------------------------+-------------+-----------+ +| wall.thickness | Wall thickness. | Real | None | ++----------------------------+------------------------------------------------------------------------+-------------+-----------+ +| phase_averaged_temperature | Use a phase averaged temperature for simulations containing particles. | Bool | false | +| | The phase averaged temperature is computed as the volume fraction | | | +| | weighted sum of the fluid and averaged particle temperatures. | | | +| | | | | +| | |avg_T| | | | +| | | | | +| | The averaged particle temperature is computed by depositing the | | | +| | volume-averaged particle temperature to the grid. | | | +| | | | | +| | |avg_Tp| | | | ++----------------------------+------------------------------------------------------------------------+-------------+-----------+ Below is an example for specifying boundary conditions for a fluid `myfluid`. -- GitLab From 26285ee409ef5e08437fcb70a09804428e5d9459 Mon Sep 17 00:00:00 2001 From: Jordan Musser Date: Fri, 21 Nov 2025 12:13:17 -0500 Subject: [PATCH 2/2] Updates for solids bcs --- .../user_guide/inputs/boundary_conditions.rst | 326 ++++++++++++------ .../user_guide/inputs/images/CHT-1D.png | Bin 0 -> 9300 bytes 2 files changed, 224 insertions(+), 102 deletions(-) create mode 100644 docs/source_docs/user_guide/inputs/images/CHT-1D.png diff --git a/docs/source_docs/user_guide/inputs/boundary_conditions.rst b/docs/source_docs/user_guide/inputs/boundary_conditions.rst index d7c69eb..322adba 100644 --- a/docs/source_docs/user_guide/inputs/boundary_conditions.rst +++ b/docs/source_docs/user_guide/inputs/boundary_conditions.rst @@ -34,13 +34,13 @@ The type of the boundary conditions in the BC region must be defined with the pr | | * ``pi`` - pressure inflow | | | | | * ``po`` - pressure outflow | | | | | * ``mi`` - mass inflow | | | -| | * ``nsw`` - no-slip wall | | | | | * ``eb`` - embedded boundary - for inhomogeneous Dirichlet BCs | | | | | of temperature or fluid velocity (mass inflow) on the | | | | | contained EBs | | | +---------------------+-----------------------------------------------------------------------+-------------+-----------+ + Fluid settings ~~~~~~~~~~~~~~ @@ -52,7 +52,6 @@ using the prefix ``bc.[region_name].[fluid_name]``: | | Description | Type | Default | +========================+========================================================================+=============+===========+ | volfrac | Volume fraction [required if bc type is ``mi``] | Real | 0 | -| | | | | +------------------------+------------------------------------------------------------------------+-------------+-----------+ | density | Fluid density [required if bc type is ``mi`` or ``pi``] | Real | 0 | +------------------------+------------------------------------------------------------------------+-------------+-----------+ @@ -97,6 +96,138 @@ Below is an example for specifying boundary conditions for fluid (``fluid``). bc.outflow.fluid.pressure = 0.0 +Below is an example for specifying a normal inflow velocity magnitude for a region `eb-flow`. + +.. code-block:: none + + bc.regions = eb-flow + + bc.eb-flow = eb + + bc.eb-flow.my_fluid.volfrac = 1.0 + bc.eb-flow.my_fluid.velocity = 0.1 + +Below is an example where only specific cells are imposed a velocity inflow in the x-direction. + +.. code-block:: none + + bc.regions = eb-flow + + bc.eb-flow = eb + + bc.eb-flow.eb.normal_tol = 3.0 + bc.eb-flow.eb.normal = 0.9848 0.0000 0.1736 # 10 deg + + bc.eb-flow.my_fluid.volfrac = 1.0 + bc.eb-flow.my_fluid.velocity = 0.1 0.0 0.0 + + +.. _InputsBCSolids: + +Solids settings +~~~~~~~~~~~~~~~ + +For each inflow boundary condition region, general solids inputs are defined using the prefix ``bc.[region_name]``: + ++----------------------+------------------------------------------------------------------+-------------+-----------+ +| | Description | Type | Default | ++======================+==================================================================+=============+===========+ +| solids | Name of solid type in BC region. Only one solid is allowed in | String | None | +| | an BC region. | | | ++----------------------+------------------------------------------------------------------+-------------+-----------+ + +.. warning:: + + Mass inflow boundary conditions, ``bc.[region_name] = mi``, only support PIC parcels. EB inflow boundary conditions, + ``bc.[region_name] = eb``, support DEM particles and PIC parcels. + +For inflow boundary conditions , the solid inputs are defined using the prefix ``bc.[region_name].[solid_name]``: +Note that diameter distributions must define a weighting type, +please refer to :ref:`ReferenceParticleDistributions `. + ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| | Description | Type | Default | ++========================+=======================================================================+=============+===========+ +| volfrac | Volume fraction | Real | 0 | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| temperature | Temperature | Real | 0 | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| species.[species_name] | Mass fraction of ``species_name`` | Real | 0 | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| velocity | Velocity components | Reals | 0 0 0 | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| volflow | Volumetric flow rate. | Real | 0 | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| massflow | Mass flow rate. | Real | 0 | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| diameter | Method to specify particle diameter in the IC region. This is | String | None | +| | only used for auto-generated particles. | | | +| | | | | +| | Options: | | | +| | | | | +| | * ``constant`` - specified constant | | | +| | * ``uniform`` - uniform distribution | | | +| | * ``normal`` - normal distribution | | | +| | * ``custom`` - user-defined distribution | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| type | Distribution weighting. | String | N/A | +| | | | | +| | Options: | | | +| | | | | +| | * ``number-weighted`` | | | +| | * ``volume-weighted`` | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| bins | Number of bins used when discretizing the distribution to approximate | Int | 64 | +| | the number of particles within an initial condition region. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| diameter.constant | Monodisperse (single valued) particle diameter. | Real | 0 | +| | Required for ``constant`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| diameter.mean | Distribution mean. | Real | 0 | +| | Required for ``normal`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| diameter.std | Distribution standard deviation. | Real | 0 | +| | Required for ``normal`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| diameter.min | Minimum diameter to clip distribution. | Real | 0 | +| | Required for ``normal`` distributions and ``uniform`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| diameter.max | Maximum diameter to clip distribution. | Real | 0 | +| | Required for ``normal`` distributions and ``uniform`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| diameter.custom | File name that specifies either the cumulative or probability | String | None | +| | distribution. Required for ``custom`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| density | Method to specify particle density in the IC region. This is | String | None | +| | only used for auto-generated particles. | | | +| | | | | +| | Options: | | | +| | | | | +| | * ``constant`` - specified constant | | | +| | * ``uniform`` - uniform distribution | | | +| | * ``normal`` - normal distribution | | | +| | * ``custom`` - user-defined distribution | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| density.constant | Monodisperse (single valued) particle density. | Real | 0 | +| | Required for ``constant`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| density.mean | Distribution mean. | Real | 0 | +| | Required for ``normal`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| density.std | Distribution standard deviation. | Real | 0 | +| | Required for ``normal`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| density.min | Minimum diameter to clip distribution. | Real | 0 | +| | Required for ``normal`` distributions and ``uniform`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| density.max | Maximum diameter to clip distribution. | Real | 0 | +| | Required for ``normal`` distributions and ``uniform`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ +| density.custom | File name that specifies either the cumulative or probability | String | None | +| | distribution. Required for ``custom`` distributions. | | | ++------------------------+-----------------------------------------------------------------------+-------------+-----------+ + + Transient boundary conditions ----------------------------- @@ -125,38 +256,82 @@ transient BCs. .. image:: ./images/transient-bc.png -Embedded boundary options -------------------------- - -In MFIX-Exa it is possible to set boundary conditions on the embedded -boundaries. For instance, it is possible to set inhomogeneous Dirichlet boundary -conditions for the fluid temperature variable on the subpart of the embedded -boundaries which is contained in the BC region (which in this case has to be -tridimensional). We recall that, on the remaining part of the EBs, homogeneous -Neumann boundary conditions are assumed by default. - -In the following table there is a list of the possible entries for EB boundary -conditions. Each entry must be preceded by the prefix ``bc.[region_name]`` - -+-------------------------+-----------------------------------------------------------------------+-------------+-----------+ -| | Description | Type | Default | -+=========================+=======================================================================+=============+===========+ -| eb.temperature | Specify a wall temperature model for the embedded boundary. | String | adiabatic | -| | | | | -| | Options: | | | -| | | | | -| | * ``adiabatic`` - no heat flux through the wall | | | -| | * ``constant`` - impose a constant temperature along the EB. | | | -| | * ``CHT-1D`` - compute a temperature for the wall using the 1D | | | -| | conjugate heat transfer model. | | | -| | | | | -+-------------------------+-----------------------------------------------------------------------+-------------+-----------+ -| eb.temperature.constant | Constant wall temperature. | Real | None | -| | A valid is required for ``constant`` EB temperature model. | | | -+-------------------------+-----------------------------------------------------------------------+-------------+-----------+ - - -The 1D conjugate heat transfer model settings are defined using the prefix ``bc.[region_name].eb.temperature.CHT-1D``: +Thermal boundary conditions +--------------------------- + +Boundary conditions can be applied to embedded boundaries (EBs). For example, a constant wall temperature can be +imposed on the entire EB or restricted to a specific region. + +To apply a boundary condition to only a portion of an EB, a face normal vector and tolerance can be specified. This +allows the condition to be applied only to EB faces whose normals align with the specified direction within a given +angular tolerance. The following inputs are defined using the prefix ``bc.[region_name].eb``: + ++--------------------+-----------------------------------------------------------------------+-------------+-----------+ +| | Description | Type | Default | ++====================+=======================================================================+=============+===========+ +| normal | [Optional] Specifies the target face normal direction. Only EB faces | Reals | 0 0 0 | +| | whose normals are parallel (within the specified tolerance) will have | | | +| | the boundary condition applied. | | | ++--------------------+-----------------------------------------------------------------------+-------------+-----------+ +| normal_tol | [Optional] Angular tolerance (in degrees) used with ``eb.normal`` to | Real | 0 | +| | select EB faces. A value of 0 requires exact alignment. | | | ++--------------------+-----------------------------------------------------------------------+-------------+-----------+ + + +The following table lists the thermal boundary condition options that can be applied to embedded boundaries (EBs), with +inputs defined using the prefix ``bc.[region_name].eb``. + ++----------------------+-----------------------------------------------------------------------+-------------+-----------+ +| | Description | Type | Default | ++======================+=======================================================================+=============+===========+ +| temperature | Specify a wall temperature model for the embedded boundary. | String | adiabatic | +| | | | | +| | Options: | | | +| | | | | +| | * ``adiabatic`` - no heat flux through the wall | | | +| | * ``constant`` - impose a constant temperature along the EB. | | | +| | * ``CHT-1D`` - compute a temperature for the wall using the 1D | | | +| | conjugate heat transfer model. | | | +| | | | | ++----------------------+-----------------------------------------------------------------------+-------------+-----------+ +| temperature.constant | Constant wall temperature. | Real | None | +| | A valid is required for ``constant`` EB temperature model. | | | ++----------------------+-----------------------------------------------------------------------+-------------+-----------+ + +The conjugate heat transfer model approximates heat transfer through the embedded boundary using one-dimensional, +steady-state conduction. The external environment is treated as a thermal reservoir with a constant temperature +in both space and time. This approach is illustrated in :numref:`fig_conjugate_heat_transfer_bc`, where heat flows +through a series of thermal resistances: from the fluid to the inner wall surface, through the wall, and finally +to the environment. The direction of heat transfer---into or out of the system---is governed by the temperature +gradient between the fluid and the surroundings. + +.. _fig_conjugate_heat_transfer_bc: + +.. figure:: ./images/CHT-1D.png + :height: 2in + :align: center + :alt: Schematic of the conjugate heat transfer boundary condition. + + Schematic of the conjugate heat transfer boundary condition. + +An effective resistance is calculated based on the convective heat transfer coefficient between the fluid +and wall, :math:`h_{int}`, conduction through the wall with thickness :math:`L_w` and thermal conductivity +:math:`\kappa_w`, and convective heat transfer from the exterior wall to the environment :math:`h_{ext}`. + +.. math:: + + R_{eff} = \left( \frac{1}{h_{int}} + \frac{L_w}{\kappa_w} + \frac{1}{h_{ext}} \right)^{-1} + +The interior wall temperature is determined by balancing the heat flux contributions from internal +convection, wall conduction, and external convection, resulting in a closed-form expression based +on the effective thermal resistance of the system. + +.. math:: + + T_{w,int} = T_f - \frac{1}{h_{int}}\left[ \frac{T_f - T_{\infty}}{R_{eff}} \right] + + +The model settings are defined using the prefix ``bc.[region_name].eb.temperature.CHT-1D``: .. |avg_T| replace:: :math:`T = \varepsilon_f T_f + (1-\varepsilon_f) \overline{T}_p` @@ -167,9 +342,18 @@ The 1D conjugate heat transfer model settings are defined using the prefix ``bc. +============================+========================================================================+=============+===========+ | T_env | Environment temperature | Real | None | +----------------------------+------------------------------------------------------------------------+-------------+-----------+ -| h_int | Internal heat transfer coefficient. | Real | None | +| h_int | Heat Transfer Coefficient (fluid–wall, internal) | Real | None | +| | | | | +| | Specifies the convective heat transfer coefficient [W/m² K] between | | | +| | the fluid and adjacent solid walls (EBs) located within the interior | | | +| | of the computational domain. | | | +| | | | | +----------------------------+------------------------------------------------------------------------+-------------+-----------+ -| h_ext | External heat transfer coefficient | Real | None | +| h_ext | Heat Transfer Coefficient (wall-environment, external) | Real | None | +| | | | | +| | Specifies the convective heat transfer coefficient [W/m² K] between | | | +| | the wall and the external environment. | | | +| | | | | +----------------------------+------------------------------------------------------------------------+-------------+-----------+ | wall.conductivity | The thermal conductivity of the wall. | Real | None | +----------------------------+------------------------------------------------------------------------+-------------+-----------+ @@ -187,75 +371,13 @@ The 1D conjugate heat transfer model settings are defined using the prefix ``bc. | | |avg_Tp| | | | +----------------------------+------------------------------------------------------------------------+-------------+-----------+ -Below is an example for specifying boundary conditions for a fluid `myfluid`. + +Below is an example for specifying a constant temperature boundary condition in the ``hot-walls`` region. .. code-block:: none bc.regions = hot-wall bc.hot-walls = eb - bc.hot-walls.eb.temperature = 800 - -In addition to the temperature, it is possible to set an inflow condition for fluid -on an embedeed boundary. We recall that, on the remaining part of the EBs, -no slip velocity conditions are assumed by default. - -In the following table is a list of the possible entries for inflow EB boundary -conditions. Each entry must be preceded by the prefix ``bc.[region_name]``. Like traditional mass -inflows, the fluid temperature, pressure, and species composition must be -provided when appropriate. - -+-----------------------+-----------------------------------------------------------------------+-------------+-----------+ -| | Description | Type | Default | -+=======================+=======================================================================+=============+===========+ -| [fluid_name].velocity | [Required if not `volflow` or `massflow`] | | | -| | Inflow fluid velocity on EB faces | Reals | 0 0 0 | -| | contained in the (tridimensional) region. | | | -| | Note that if only one value is specified, that is assumed to | | | -| | be the magnitude in the direction of the EB face's normal. | | | -+-----------------------+-----------------------------------------------------------------------+-------------+-----------+ -| [fluid_name].volflow | [Required if not `velocity` or `massflow`] | | | -| | Inflow BC for fluid volumetric flow | Real | 0 | -| | rate in the (tridimensional) region. The flow is assumed to be | | | -| | normal to the EB surface in the region. | | | -+-----------------------+-----------------------------------------------------------------------+-------------+-----------+ -| [fluid_name].massflow | [Required if not `velocity` or `volflow`] | | | -| | Inflow BC for fluid mass flow rate in the (tridimensional) region. | Real | 0 | -| | The flow is assumed to be normal to the EB surface in the region. | | | -+-----------------------+-----------------------------------------------------------------------+-------------+-----------+ -| [fluid_name].volfrac | [Required] Volume fraction. | Real | 0 | -+-----------------------+-----------------------------------------------------------------------+-------------+-----------+ -| eb.normal | [Optional] When specified, only cells with EB face normal that is | Reals | 0 0 0 | -| | parallel and opposite in direction to the specified values | | | -| | are imposed with the inflow velocity. | | | -+-----------------------+-----------------------------------------------------------------------+-------------+-----------+ -| eb.normal_tol | [Optional] Used in conjunction with `eb.normal`. It determines the | Real | 0 | -| | tolerance (in degrees) for choosing cells with a specific normal. | | | -+-----------------------+-----------------------------------------------------------------------+-------------+-----------+ - -Note that only one of ``velocity`` or ``volflow`` or ``massflow`` should be specified. - -Below is an example for specifying a normal inflow velocity magnitude for a region `eb-flow`. - -.. code-block:: none - - bc.regions = eb-flow - - bc.eb-flow = eb - - bc.eb-flow.my_fluid.volfrac = 1.0 - bc.eb-flow.my_fluid.velocity = 0.1 - -Below is an example where only specific cells are imposed a velocity in the x-direction. - -.. code-block:: none - - bc.regions = eb-flow - - bc.eb-flow = eb - - bc.eb-flow.eb.normal_tol = 3.0 - bc.eb-flow.eb.normal = 0.9848 0.0000 0.1736 # 10 deg - - bc.eb-flow.my_fluid.volfrac = 1.0 - bc.eb-flow.my_fluid.velocity = 0.1 0.0 0.0 + bc.hot-walls.eb.temperature = constant + bc.hot-walls.eb.temperature.constant = 800 diff --git a/docs/source_docs/user_guide/inputs/images/CHT-1D.png b/docs/source_docs/user_guide/inputs/images/CHT-1D.png new file mode 100644 index 0000000000000000000000000000000000000000..4e428ba55cb180854e7a86505498d8bbd8b14414 GIT binary patch literal 9300 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 L`njxgN@xNA!1enx literal 0 HcmV?d00001 -- GitLab