- boundaryThe list of boundaries where view factors are desired
C++ Type:std::vector<BoundaryName>
Unit:(no unit assumed)
Controllable:No
Description:The list of boundaries where view factors are desired
ViewFactorRayStudy
This ray study is used to compute view factors in cavities with obstruction. It sends out rays from surfaces bounding the radiation cavity into a set of directions determined by an angular quadrature. The rays are tracked and view factors are computed by determining the surface where the ray dies.
Description
ViewFactorRayStudy
computes view factors in a cavity enclosed by sidesets. The view factors are computed by sending out rays from a sidesets along directions determined by an angular quadrature. Rays are followed and traced through the cavity until they hit any sideset that is not declared a "symmetry sideset". The view factor between the sending and receiving sidesets is computed from the number of rays starting from one and ending on the other side.
ViewFactorRayStudy
uses ray tracing for computing view factors in two-dimensional and three-dimensional cavities. It does not impose any restrictions on the geometry of the cavity; in particular it allows non-planar surfaces in radiative exchange, non-convex cavities, and obstruction of view between two surfaces by a third surface.
Theory
The central idea for computing view factors using ray tracing is to transform the integral over the target area into an integral over angular direction (i.e., an integral over the field of view of any infinitesimal element on the starting surface). An angular quadrature is used to numerically approximate the angular integral. To this end, the ray tracing module is used to follow rays along the directions of the angular quadrature and determine which surface they intersect first. The ray is terminated on that surface and the contribution to the view factor between the surface of origin and this surface is incremented.
The view factor, , is defined as a double integral over patches and . In 3D geometries, the view factor, , is computed by: (1) where the integral is taken over points on and on on patches and . For each combination of points and , we define:
where is the normal vector on patch pointing into the cavity and is the corresponding counterpart on patch .
To facilitate the computation of view factors, we change the integration variable from to angular direction . The infinitesimal element becomes: where and is the azimuthal angle of measured in a plane orthogonal to with respect to an arbitrarily chosen vector in that plane. The view factor is then computed by: where are all angular directions (starting from ) that intersect before intersecting any other radiation patch. We define and finally obtain: (2)
Before discretizing Eq. (2), we rewrite it slightly by introducing the function which is if a ray starting from location into direction makes its first intersection with surface . Then Eq. (2) becomes
(3)
The integral in Eq. (3) is discretized using a spatial quadrature over the area and an angular quadrature over :
(4)
where enumerates the spatial quadrature points, enumerates the angular directions, is the location of spatial quadrature point , is the normal at spatial quadrature point , and is the k-th angular direction. The role of ray tracing in Eq. (4) is to evaluate .
ViewFactorRayStudy
uses Gaussian product quadratures for integrals in space, and a half-range Gauss-Chebyshev quadrature in angle. The selected angular quadrature is a half-range Gauss-Legendre-Chebyshev quadrature adopted from (Walters, 1987) by first restricting the polar range to and rotating the angular directions so that the polar angle is measured with respect to instead of .
Symmetry surfaces require special treatment. The difference between surfaces that participate in the radiative transfer and symmetry surfaces is that view factors are not computed for symmetry surfaces (i.e. if either surface or in is a symmetry surface, the view factor is not computed). Rays neither start nor end on symmetry surfaces. Instead, rays are specularly reflected off of symmetry surfaces. This is facilitated by the ray tracing module by using the ReflectRayBC.
Example Input syntax
[GlobalParams]
view_factor_object_name = unobstructed_vf
[]
[Mesh]
type = GeneratedMesh
dim = 2
xmin = 0
xmax = 2
ymin = 0
ymax = 1
nx = 2
ny = 2
[]
[UserObjects]
active = 'unobstructed_vf'
[unobstructed_vf]
type = UnobstructedPlanarViewFactor
boundary = 'top left right bottom'
execute_on = INITIAL
[]
[vf_study]
type = ViewFactorRayStudy
execute_on = initial
boundary = 'left right bottom top'
face_order = TENTH
polar_quad_order = 80
[]
[rt_vf]
type = RayTracingViewFactor
boundary = 'left right bottom top'
execute_on = INITIAL
normalize_view_factor = false
ray_study_name = vf_study
[]
[]
##
## Reference: bottom -> left/right = 0.19098
## bottom -> top = 0.61803
## Result at spatial order 20, angular order 200 & -r2
## bottom -> left/right = 0.1911
## bottom -> top = 0.6177
##
## For convenience, the "view_factor_object_name" for these
## PPs are set in global params for switching between methods
##
[Postprocessors]
[left_right]
type = ViewFactorPP
from_boundary = left
to_boundary = right
[]
[left_top]
type = ViewFactorPP
from_boundary = left
to_boundary = top
[]
[left_bottom]
type = ViewFactorPP
from_boundary = left
to_boundary = bottom
[../]
[bottom_left]
type = ViewFactorPP
from_boundary = bottom
to_boundary = left
[]
[bottom_right]
type = ViewFactorPP
from_boundary = bottom
to_boundary = right
[]
[bottom_top]
type = ViewFactorPP
from_boundary = bottom
to_boundary = top
[]
[]
[Problem]
solve = false
[]
[Executioner]
type = Steady
[Quadrature] # higher order quadrature for unobstructed
order = SECOND
[]
[]
[Outputs]
csv = true
[]
(moose/modules/heat_transfer/test/tests/view_factors/view_factor_2d.i)Input Parameters
- azimuthal_quad_order8Order of the azimuthal quadrature per quadrant [azimuthal angle is measured in a plane perpendicular to the normal].
Default:8
C++ Type:unsigned int
Unit:(no unit assumed)
Controllable:No
Description:Order of the azimuthal quadrature per quadrant [azimuthal angle is measured in a plane perpendicular to the normal].
- execute_onTIMESTEP_ENDThe list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html.
Default:TIMESTEP_END
C++ Type:ExecFlagEnum
Unit:(no unit assumed)
Controllable:No
Description:The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html.
- face_orderCONSTANTThe face quadrature rule order
Default:CONSTANT
C++ Type:MooseEnum
Unit:(no unit assumed)
Controllable:No
Description:The face quadrature rule order
- face_typeGRIDThe face quadrature type
Default:GRID
C++ Type:MooseEnum
Unit:(no unit assumed)
Controllable:No
Description:The face quadrature type
- internal_conventionpositiveThe convention for spawning rays from internal sidesets; denotes the sign of the dot product between a ray and the internal sideset side normal
Default:positive
C++ Type:MooseEnum
Unit:(no unit assumed)
Controllable:No
Description:The convention for spawning rays from internal sidesets; denotes the sign of the dot product between a ray and the internal sideset side normal
- polar_quad_order16Order of the polar quadrature [polar angle is between ray and normal]. Must be even.
Default:16
C++ Type:unsigned int
Unit:(no unit assumed)
Controllable:No
Description:Order of the polar quadrature [polar angle is between ray and normal]. Must be even.
- prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
- ray_distance1.79769e+308The maximum distance all Rays can travel
Default:1.79769e+308
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:The maximum distance all Rays can travel
- tolerate_failureFalseWhether or not to tolerate a ray tracing failure
Default:False
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not to tolerate a ray tracing failure
- use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Default:False
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Optional Parameters
- allow_duplicate_execution_on_initialFalseIn the case where this UserObject is depended upon by an initial condition, allow it to be executed twice during the initial setup (once before the IC and again after mesh adaptivity (if applicable).
Default:False
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:In the case where this UserObject is depended upon by an initial condition, allow it to be executed twice during the initial setup (once before the IC and again after mesh adaptivity (if applicable).
- allow_new_work_during_executionTrueWhether or not to allow the addition of new work to the work buffer during execution
Default:True
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not to allow the addition of new work to the work buffer during execution
- buffer_growth_multiplier2How much to grow a SendBuffer by if the buffer completely fills and dumps. Will max at send_buffer_size
Default:2
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:How much to grow a SendBuffer by if the buffer completely fills and dumps. Will max at send_buffer_size
- buffer_shrink_multiplier0.5Multiplier (between 0 and 1) to apply to the current buffer size if it is force dumped. Will stop at min_buffer_size.
Default:0.5
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Multiplier (between 0 and 1) to apply to the current buffer size if it is force dumped. Will stop at min_buffer_size.
- chunk_size100The number of objects to process at one time during execution
Default:100
C++ Type:unsigned int
Unit:(no unit assumed)
Controllable:No
Description:The number of objects to process at one time during execution
- clicks_per_communication10Iterations to wait before communicating
Default:10
C++ Type:unsigned int
Unit:(no unit assumed)
Controllable:No
Description:Iterations to wait before communicating
- clicks_per_receive1Iterations to wait before checking for new objects
Default:1
C++ Type:unsigned int
Unit:(no unit assumed)
Controllable:No
Description:Iterations to wait before checking for new objects
- clicks_per_root_communication10Iterations to wait before communicating with root
Default:10
C++ Type:unsigned int
Unit:(no unit assumed)
Controllable:No
Description:Iterations to wait before communicating with root
- control_tagsAdds user-defined labels for accessing object parameters via control logic.
C++ Type:std::vector<std::string>
Unit:(no unit assumed)
Controllable:No
Description:Adds user-defined labels for accessing object parameters via control logic.
- enableTrueSet the enabled status of the MooseObject.
Default:True
C++ Type:bool
Unit:(no unit assumed)
Controllable:Yes
Description:Set the enabled status of the MooseObject.
- execution_order_group0Execution order groups are executed in increasing order (e.g., the lowest number is executed first). Note that negative group numbers may be used to execute groups before the default (0) group. Please refer to the user object documentation for ordering of user object execution within a group.
Default:0
C++ Type:int
Unit:(no unit assumed)
Controllable:No
Description:Execution order groups are executed in increasing order (e.g., the lowest number is executed first). Note that negative group numbers may be used to execute groups before the default (0) group. Please refer to the user object documentation for ordering of user object execution within a group.
- force_postauxFalseForces the UserObject to be executed in POSTAUX
Default:False
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Forces the UserObject to be executed in POSTAUX
- force_preicFalseForces the UserObject to be executed in PREIC during initial setup
Default:False
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Forces the UserObject to be executed in PREIC during initial setup
- methodsmartThe algorithm to use
Default:smart
C++ Type:MooseEnum
Unit:(no unit assumed)
Controllable:No
Description:The algorithm to use
- min_buffer_sizeThe initial size of the SendBuffer and the floor for shrinking it. This defaults to send_buffer_size if not set (i.e. the buffer won't change size)
C++ Type:unsigned int
Unit:(no unit assumed)
Controllable:No
Description:The initial size of the SendBuffer and the floor for shrinking it. This defaults to send_buffer_size if not set (i.e. the buffer won't change size)
- send_buffer_size100The size of the send buffer
Default:100
C++ Type:unsigned int
Unit:(no unit assumed)
Controllable:No
Description:The size of the send buffer
- use_displaced_meshFalseWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.
Default:False
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.
- work_buffer_typecircularThe work buffer type to use
Default:circular
C++ Type:MooseEnum
Unit:(no unit assumed)
Controllable:No
Description:The work buffer type to use
Advanced Parameters
- always_cache_tracesFalseWhether or not to cache the Ray traces on every execution, primarily for use in output. Warning: this can get expensive very quick with a large number of rays!
Default:False
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not to cache the Ray traces on every execution, primarily for use in output. Warning: this can get expensive very quick with a large number of rays!
- aux_data_on_cache_tracesFalseWhether or not to also cache the Ray's aux data when caching its traces
Default:False
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not to also cache the Ray's aux data when caching its traces
- data_on_cache_tracesFalseWhether or not to also cache the Ray's data when caching its traces
Default:False
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not to also cache the Ray's data when caching its traces
- segments_on_cache_tracesTrueWhether or not to cache individual segments when trace caching is enabled. If false, we will instead cache a segment for each part of the trace where the direction is the same. This minimizes the number of segments requied to represent the Ray's path, but removes the ability to show Ray field data on each segment through an element.
Default:True
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not to cache individual segments when trace caching is enabled. If false, we will instead cache a segment for each part of the trace where the direction is the same. This minimizes the number of segments requied to represent the Ray's path, but removes the ability to show Ray field data on each segment through an element.
Trace Cache Parameters
- verify_raysFalseWhether or not to verify the generated Rays. This includes checking their starting information and the uniqueness of Rays before and after execution. This is also used by derived studies for more specific verification.
Default:False
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not to verify the generated Rays. This includes checking their starting information and the uniqueness of Rays before and after execution. This is also used by derived studies for more specific verification.
- verify_trace_intersectionsTrueWhether or not to verify the trace intersections in devel and dbg modes. Trace intersections are not verified regardless of this parameter in optimized modes (opt, oprof).
Default:True
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not to verify the trace intersections in devel and dbg modes. Trace intersections are not verified regardless of this parameter in optimized modes (opt, oprof).
Checks And Verifications Parameters
- warn_non_planarTrueWhether or not to produce a warning if any element faces are non-planar.
Default:True
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not to produce a warning if any element faces are non-planar.
- warn_subdomain_hmaxTrueWhether or not to warn if the approximated hmax (constant on subdomain) varies significantly for an element
Default:True
C++ Type:bool
Unit:(no unit assumed)
Controllable:No
Description:Whether or not to warn if the approximated hmax (constant on subdomain) varies significantly for an element
Tracing Warnings Parameters
References
- W F Walters.
Use of the chebyshev-legendre quadrature set in discrete-ordinate codes.
In Conference: Computational methods in high temperature physics. 1987.[BibTeX]