- boundaryThe list of boundary IDs from the mesh where this object appliesC++ Type:std::vector<BoundaryName> Controllable:No Description:The list of boundary IDs from the mesh where this object applies 
ReflectRayBC
A RayBC that reflects a Ray in a specular manner on a boundary.
It can properly handle reflections at domain corners/edges that are reflecting on all boundaries at the corner/edge (see Hitting Multiple Boundaries for more information).
It achieves the reflection by changing the direction of the Ray:
void
ReflectRayBC::onBoundary(const unsigned int num_applying)
{
  if (_warn_non_planar && _study.sideIsNonPlanar(_current_elem, _current_intersected_side))
    mooseWarning("A Ray is being reflected on a non-planar side.\n\n",
                 "Ray tracing on elements with non-planar faces is an approximation.\n\n",
                 "The normal used to compute the reflected direction is computed at\n",
                 "the side centroid and may not be valid for a non-planar side.\n\n",
                 "To disable this warning, set RayKernels/",
                 name(),
                 "/warn_non_planar=false.\n\n",
                 currentRay()->getInfo());
  // No need to do anything if the Ray's gonna die anyway
  if (!currentRay()->shouldContinue())
    return;
  // The direction this Ray reflects off this boundary
  const auto & normal = _study.getSideNormal(_current_elem, _current_intersected_side, _tid);
  const auto reflected_direction = reflectedDirection(currentRay()->direction(), normal);
  // Change it! Note here the usage of num_applying: if we are at a corner with a reflecting
  // boundary condition on both sides, we want to allow both boundary conditions to reflect the Ray.
  // Therefore, we skip the check that another RayBC has changed the Ray's trajectory when we are
  // applying multiple of the same ReflectRayBC at different boundaries at the same point to allow
  // this. Note that this double (or triple in 3D) reflection will only be allowed when the same
  // ReflectRayBC object is on both boundaries.
  changeRayDirection(reflected_direction, /* skip_changed_check = */ num_applying > 1);
}
Per the specularly reflected direction (static and available for other RayBCs to use):
Point
ReflectRayBC::reflectedDirection(const Point & direction, const Point & normal)
{
  mooseAssert(MooseUtils::absoluteFuzzyEqual(direction.norm(), 1.), "Direction not normalized");
  mooseAssert(MooseUtils::absoluteFuzzyEqual(normal.norm(), 1.), "Normal not normalized");
  Point reflected_direction = direction;
  reflected_direction -= 2.0 * (reflected_direction * normal) * normal;
  return reflected_direction / reflected_direction.norm();
}
Input Parameters
- depends_onOther RayBCs that this RayBC depends onC++ Type:std::vector<std::string> Controllable:No Description:Other RayBCs that this RayBC depends on 
- raysThe name of the Rays associated with this object; only used if Ray registration is enabled within the study. If no Rays are supplied, this object will be applied to all Rays.C++ Type:std::vector<std::string> Controllable:No Description:The name of the Rays associated with this object; only used if Ray registration is enabled within the study. If no Rays are supplied, this object will be applied to all Rays. 
- studyThe RayTracingStudy associated with this object. If none provided, this will default to the one study that exists.C++ Type:UserObjectName Controllable:No Description:The RayTracingStudy associated with this object. If none provided, this will default to the one study that exists. 
- warn_non_planarTrueWhether or not to emit a warning if a Ray is being reflected on a non-planar sideDefault:True C++ Type:bool Controllable:No Description:Whether or not to emit a warning if a Ray is being reflected on a non-planar side 
Optional Parameters
- control_tagsAdds user-defined labels for accessing object parameters via control logic.C++ Type:std::vector<std::string> 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 Controllable:No Description:Set the enabled status of the MooseObject. 
Advanced Parameters
Input Files
- (modules/heat_transfer/test/tests/view_factors_symmetry/cavity_with_pillars_symmetry_bc.i)
- (modules/ray_tracing/test/tests/raybcs/reflect_ray_bc/reflect_ray_bc.i)
- (modules/ray_tracing/test/tests/traceray/internal_sidesets/internal_sidesets_1d.i)
- (modules/ray_tracing/test/tests/traceray/internal_sidesets/internal_sidesets_2d.i)
- (modules/ray_tracing/test/tests/userobjects/cone_ray_study/cone_ray_study.i)
- (modules/ray_tracing/test/tests/userobjects/repeatable_ray_study/max_distance.i)
- (modules/ray_tracing/test/tests/raybcs/reflect_ray_bc/reflect_ray_bc_nonplanar.i)
- (modules/ray_tracing/test/tests/traceray/internal_sidesets/internal_sidesets_3d.i)