https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
RayTracingExodus Class Reference

#include <RayTracingExodus.h>

Inheritance diagram for RayTracingExodus:
[legend]

Public Types

typedef DataFileName DataFileParameterType
 

Public Member Functions

 RayTracingExodus (const InputParameters &parameters)
 
virtual void outputMesh () override
 Output the mesh - to be overridden.
 
virtual std::string filename () override
 
void output () override
 
void setFileBase (const std::string &file_base)
 
void setFileNumber (unsigned int num)
 
unsigned int getFileNumber ()
 
virtual Real time () override
 
virtual Real timeOld ()
 
virtual Real dt ()
 
virtual Real dtOld ()
 
virtual int timeStep ()
 
const unsigned intinterval () const
 
const MultiMooseEnumexecuteOn () const
 
bool isAdvanced ()
 
virtual const OutputOnWarehouseadvancedExecuteOn () const
 
void allowOutput (bool state)
 
virtual void outputStep (const ExecFlagType &type)
 
const std::set< Real > & getSyncTimes ()
 
virtual bool supportsMaterialPropertyOutput () const
 
virtual bool enabled () const
 
std::shared_ptr< MooseObjectgetSharedPtr ()
 
std::shared_ptr< const MooseObjectgetSharedPtr () const
 
bool isKokkosObject () const
 
MooseAppgetMooseApp () const
 
const std::string & type () const
 
const std::string & name () const
 
std::string typeAndName () const
 
MooseObjectParameterName uniqueParameterName (const std::string &parameter_name) const
 
MooseObjectName uniqueName () const
 
const InputParametersparameters () const
 
const hit::Node * getHitNode () const
 
bool hasBase () const
 
const std::string & getBase () const
 
const TgetParam (const std::string &name) const
 
std::vector< std::pair< T1, T2 > > getParam (const std::string &param1, const std::string &param2) const
 
const TqueryParam (const std::string &name) const
 
const TgetRenamedParam (const std::string &old_name, const std::string &new_name) const
 
T getCheckedPointerParam (const std::string &name, const std::string &error_string="") const
 
bool isParamValid (const std::string &name) const
 
bool isParamSetByUser (const std::string &name) const
 
void connectControllableParams (const std::string &parameter, const std::string &object_type, const std::string &object_name, const std::string &object_parameter) const
 
void paramError (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramInfo (const std::string &param, Args... args) const
 
std::string messagePrefix (const bool hit_prefix=true) const
 
std::string errorPrefix (const std::string &) const
 
void mooseError (Args &&... args) const
 
void mooseDocumentedError (const std::string &repo_name, const unsigned int issue_num, Args &&... args) const
 
void mooseErrorNonPrefixed (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecatedNoTrace (Args &&... args) const
 
void mooseInfo (Args &&... args) const
 
void callMooseError (std::string msg, const bool with_prefix, const hit::Node *node=nullptr, const bool show_trace=true) const
 
std::string getDataFileName (const std::string &param) const
 
std::string getDataFileNameByName (const std::string &relative_path) const
 
std::string getDataFilePath (const std::string &relative_path) const
 
virtual void meshChanged ()
 
virtual void initialSetup ()
 
virtual void timestepSetup ()
 
virtual void jacobianSetup ()
 
virtual void residualSetup ()
 
virtual void subdomainSetup ()
 
virtual void customSetup (const ExecFlagType &)
 
const ExecFlagEnumgetExecuteOnEnum () const
 
const FunctiongetFunction (const std::string &name) const
 
const FunctiongetFunctionByName (const FunctionName &name) const
 
bool hasFunction (const std::string &param_name) const
 
bool hasFunctionByName (const FunctionName &name) const
 
Moose::Kokkos::Function getKokkosFunction (const std::string &name) const
 
const TgetKokkosFunction (const std::string &name) const
 
Moose::Kokkos::Function getKokkosFunctionByName (const FunctionName &name) const
 
const TgetKokkosFunctionByName (const FunctionName &name) const
 
bool hasKokkosFunction (const std::string &param_name) const
 
bool hasKokkosFunctionByName (const FunctionName &name) const
 
bool isDefaultPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
bool hasPostprocessor (const std::string &param_name, const unsigned int index=0) const
 
bool hasPostprocessorByName (const PostprocessorName &name) const
 
std::size_t coupledPostprocessors (const std::string &param_name) const
 
const PostprocessorName & getPostprocessorName (const std::string &param_name, const unsigned int index=0) const
 
const VectorPostprocessorValuegetVectorPostprocessorValue (const std::string &param_name, const std::string &vector_name) const
 
const VectorPostprocessorValuegetVectorPostprocessorValue (const std::string &param_name, const std::string &vector_name, bool needs_broadcast) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueByName (const VectorPostprocessorName &name, const std::string &vector_name, bool needs_broadcast) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueOld (const std::string &param_name, const std::string &vector_name) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueOld (const std::string &param_name, const std::string &vector_name, bool needs_broadcast) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueOldByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueOldByName (const VectorPostprocessorName &name, const std::string &vector_name, bool needs_broadcast) const
 
const ScatterVectorPostprocessorValuegetScatterVectorPostprocessorValue (const std::string &param_name, const std::string &vector_name) const
 
const ScatterVectorPostprocessorValuegetScatterVectorPostprocessorValueByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
const ScatterVectorPostprocessorValuegetScatterVectorPostprocessorValueOld (const std::string &param_name, const std::string &vector_name) const
 
const ScatterVectorPostprocessorValuegetScatterVectorPostprocessorValueOldByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
bool hasVectorPostprocessor (const std::string &param_name, const std::string &vector_name) const
 
bool hasVectorPostprocessor (const std::string &param_name) const
 
bool hasVectorPostprocessorByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
bool hasVectorPostprocessorByName (const VectorPostprocessorName &name) const
 
const VectorPostprocessorName & getVectorPostprocessorName (const std::string &param_name) const
 
PerfGraphperfGraph ()
 
const PostprocessorValuegetPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOld (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOld (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOlder (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOlder (const std::string &param_name, const unsigned int index=0) const
 
virtual const PostprocessorValuegetPostprocessorValueByName (const PostprocessorName &name) const
 
virtual const PostprocessorValuegetPostprocessorValueByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOldByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOldByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOlderByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOlderByName (const PostprocessorName &name) const
 
bool isVectorPostprocessorDistributed (const std::string &param_name) const
 
bool isVectorPostprocessorDistributed (const std::string &param_name) const
 
bool isVectorPostprocessorDistributedByName (const VectorPostprocessorName &name) const
 
bool isVectorPostprocessorDistributedByName (const VectorPostprocessorName &name) const
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 
UserObjectName getUserObjectName (const std::string &param_name) const
 
const TgetUserObject (const std::string &param_name, bool is_dependency=true) const
 
const TgetUserObjectByName (const UserObjectName &object_name, bool is_dependency=true) const
 
const UserObjectBasegetUserObjectBase (const std::string &param_name, bool is_dependency=true) const
 
const UserObjectBasegetUserObjectBaseByName (const UserObjectName &object_name, bool is_dependency=true) const
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 

Static Public Member Functions

static InputParameters validParams ()
 
static void callMooseError (MooseApp *const app, const InputParameters &params, std::string msg, const bool with_prefix, const hit::Node *node, const bool show_trace=true)
 
static ExecFlagEnum getDefaultExecFlagEnum ()
 
static void addDeprecatedInputParameters (InputParameters &params)
 

Public Attributes

 usingCombinedWarningSolutionWarnings
 
const ConsoleStream _console
 

Static Public Attributes

static const std::string type_param
 
static const std::string name_param
 
static const std::string unique_name_param
 
static const std::string app_param
 
static const std::string moose_base_param
 
static const std::string kokkos_object_param
 

Protected Member Functions

virtual std::string fileExtension () const override
 Return the file extension.
 
virtual bool shouldOutput () override
 
bool checkFilename ()
 
virtual void setFileBaseInternal (const std::string &file_base)
 
bool inNonlinearTimeWindow ()
 
bool inLinearTimeWindow ()
 
virtual Real getOutputTime ()
 
virtual bool onInterval ()
 
void setWallTimeIntervalFromCommandLineParam ()
 
void flagInvalidSolutionInternal (const InvalidSolutionID invalid_solution_id) const
 
InvalidSolutionID registerInvalidSolutionInternal (const std::string &message, const bool warning) const
 
TdeclareRestartableData (const std::string &data_name, Args &&... args)
 
ManagedValue< TdeclareManagedRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
const TgetRestartableData (const std::string &data_name) const
 
TdeclareRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
TdeclareRecoverableData (const std::string &data_name, Args &&... args)
 
TdeclareRestartableDataWithObjectName (const std::string &data_name, const std::string &object_name, Args &&... args)
 
TdeclareRestartableDataWithObjectNameWithContext (const std::string &data_name, const std::string &object_name, void *context, Args &&... args)
 
std::string restartableName (const std::string &data_name) const
 
virtual void addPostprocessorDependencyHelper (const PostprocessorName &) const
 
virtual void addVectorPostprocessorDependencyHelper (const VectorPostprocessorName &) const
 
const ReporterContextBasegetReporterContextBaseByName (const ReporterName &reporter_name) const
 
const ReporterNamegetReporterName (const std::string &param_name) const
 
virtual void addReporterDependencyHelper (const ReporterName &)
 
PerfID registerTimedSection (const std::string &section_name, const unsigned int level) const
 
PerfID registerTimedSection (const std::string &section_name, const unsigned int level, const std::string &live_message, const bool print_dots=true) const
 
std::string timedSectionName (const std::string &section_name) const
 
const TgetReporterValue (const std::string &param_name, const std::size_t time_index=0)
 
const TgetReporterValue (const std::string &param_name, ReporterMode mode, const std::size_t time_index=0)
 
const TgetReporterValue (const std::string &param_name, const std::size_t time_index=0)
 
const TgetReporterValue (const std::string &param_name, ReporterMode mode, const std::size_t time_index=0)
 
const TgetReporterValueByName (const ReporterName &reporter_name, const std::size_t time_index=0)
 
const TgetReporterValueByName (const ReporterName &reporter_name, ReporterMode mode, const std::size_t time_index=0)
 
const TgetReporterValueByName (const ReporterName &reporter_name, const std::size_t time_index=0)
 
const TgetReporterValueByName (const ReporterName &reporter_name, ReporterMode mode, const std::size_t time_index=0)
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
virtual void addUserObjectDependencyHelper (const UserObjectBase &) const
 

Static Protected Member Functions

static PetscErrorCode petscNonlinearOutput (SNES, PetscInt its, PetscReal fnorm, void *void_ptr)
 
static PetscErrorCode petscLinearOutput (KSP, PetscInt its, PetscReal fnorm, void *void_ptr)
 

Protected Attributes

const RayTracingStudy_study
 The RayTracingStudy.
 
const bool _output_data
 Whether or not to output all of the Ray's data.
 
const std::vector< std::string > *const _output_data_names
 Specific Ray data to output.
 
const bool _output_data_nodal
 Whether or not to output the Ray's data in a nodal, linear sense.
 
const bool _output_aux_data
 Whether or not to output the Ray's aux data.
 
const std::vector< std::string > *const _output_aux_data_names
 Specific Ray Aux data to output.
 
std::unique_ptr< MeshBase > _segment_mesh
 The mesh that contains the segments.
 
std::unique_ptr< libMesh::EquationSystems_es
 The EquationSystems.
 
libMesh::ExplicitSystem_sys
 The system that stores the field data.
 
unsigned int_file_num
 
unsigned int _padding
 
std::vector< std::string > _output_if_base_contains
 
std::string _file_base
 
Real _norm
 
PetscInt _nonlinear_iter
 
PetscInt _linear_iter
 
bool _on_linear_residual
 
bool _on_nonlinear_residual
 
FEProblemBase_problem_ptr
 
bool _transient
 
bool _use_displaced
 
libMesh::EquationSystems_es_ptr
 
MooseMesh_mesh_ptr
 
bool _sequence
 
ExecFlagEnum _execute_on
 
ExecFlagType _current_execute_flag
 
Real & _time
 
Real & _time_old
 
int_t_step
 
Real & _dt
 
Real & _dt_old
 
unsigned int _num
 
const bool _time_step_interval_set_by_addparam
 
unsigned int _time_step_interval
 
const Real _min_simulation_time_interval
 
Real _wall_time_interval
 
std::set< Real > _sync_times
 
const Times *const _sync_times_object
 
Real _start_time
 
Real _end_time
 
int _start_step
 
int _end_step
 
Real _t_tol
 
bool _sync_only
 
bool _allow_output
 
bool _is_advanced
 
OutputOnWarehouse _advanced_execute_on
 
Real & _last_output_simulation_time
 
std::chrono::time_point< std::chrono::steady_clock > _last_output_wall_time
 
Real _wall_time_since_last_output
 
const bool & _enabled
 
MooseApp_app
 
Factory_factory
 
ActionFactory_action_factory
 
const std::string & _type
 
const std::string & _name
 
const InputParameters_pars
 
MooseApp_restartable_app
 
const std::string _restartable_system_name
 
const THREAD_ID _restartable_tid
 
const bool _restartable_read_only
 
FEProblemBase_mci_feproblem
 
const ExecFlagEnum_execute_enum
 
MooseApp_pg_moose_app
 
const std::string _prefix
 
PetscOutput_petsc_output
 
const Parallel::Communicator & _communicator
 

Private Member Functions

void buildBoundingBoxes ()
 Build the inflated neighbor bounding boxes stored in _inflated_neighbor_bboxes for the purposes of identifying processors that may contain nodes that we need to decide on ownership for.
 
void buildIDMap ()
 Builds a map for each Ray to starting element and node ID for the EDGE2 mesh that will represent said Ray.
 
void buildSegmentMesh ()
 Build the mesh that contains the ray tracing segments.
 
void setupEquationSystem ()
 Setup the equation system that stores the segment-wise field data.
 
void fillFields ()
 Fill the Ray field data.
 
dof_id_type neededNodes (const TraceData &trace_data) const
 Gets the number of nodes needed to represent a given trace.
 
void startingIDs (const TraceData &trace_data, dof_id_type &start_node_id, dof_id_type &start_elem_id) const
 Gets the starting node and element IDs in the EDGE2 mesh for a given trace.
 
void solveSetup () override
 
RestartableDataValueregisterRestartableDataOnApp (std::unique_ptr< RestartableDataValue > data, THREAD_ID tid) const
 
void registerRestartableNameWithFilterOnApp (const std::string &name, Moose::RESTARTABLE_FILTER filter)
 
RestartableData< T > & declareRestartableDataHelper (const std::string &data_name, void *context, Args &&... args) const
 
const Moose::FunctionBasegetKokkosFunctionByNameHelper (const FunctionName &name) const
 
const PostprocessorName & getPostprocessorNameInternal (const std::string &param_name, const unsigned int index, const bool allow_default_value=true) const
 
bool isDefaultPostprocessorValueByName (const PostprocessorName &name) const
 
PostprocessorValue getDefaultPostprocessorValueByName (const PostprocessorName &name) const
 
void checkParam (const std::string &param_name, const unsigned int index=std::numeric_limits< unsigned int >::max()) const
 
bool postprocessorsAdded () const
 
const VectorPostprocessorValuegetVectorPostprocessorByNameHelper (const VectorPostprocessorName &name, const std::string &vector_name, bool broadcast, std::size_t t_index) const
 
const VectorPostprocessorContext< VectorPostprocessorValue > & getVectorPostprocessorContextByNameHelper (const VectorPostprocessorName &name, const std::string &vector_name) const
 
bool vectorPostprocessorsAdded () const
 
bool reportersAdded () const
 
void possiblyCheckHasReporter (const ReporterName &reporter_name, const std::string &param_name="") const
 
const PostprocessorValuegetPostprocessorValueInternal (const std::string &param_name, unsigned int index, std::size_t t_index) const
 
const PostprocessorValuegetPostprocessorValueInternal (const std::string &param_name, unsigned int index, std::size_t t_index) const
 
const PostprocessorValuegetPostprocessorValueByNameInternal (const PostprocessorName &name, std::size_t t_index) const
 
const PostprocessorValuegetPostprocessorValueByNameInternal (const PostprocessorName &name, std::size_t t_index) const
 
void possiblyCheckHasVectorPostprocessor (const std::string &param_name, const std::string &vector_name) const
 
void possiblyCheckHasVectorPostprocessor (const std::string &param_name, const std::string &vector_name) const
 
void possiblyCheckHasVectorPostprocessorByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
void possiblyCheckHasVectorPostprocessorByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
const UserObjectBasegetUserObjectFromFEProblem (const UserObjectName &object_name, const THREAD_ID tid=0) const
 
const TcastUserObject (const UserObjectBase &uo_base, const std::string &param_name="") const
 
void mooseObjectError (const std::string &param_name, std::stringstream &oss) const
 
const std::string & userObjectType (const UserObjectBase &uo) const
 
const std::string & userObjectName (const UserObjectBase &uo) const
 

Static Private Member Functions

static const hit::Node * getHitNode (const InputParameters &params)
 
static std::string messagePrefix (const InputParameters &params, const bool hit_prefix)
 

Private Attributes

unsigned int _ray_id_var
 The variable index in _sys for the Ray's ID (if any)
 
unsigned int _intersections_var
 The variable index in _sys for the intersection ID (if any)
 
unsigned int _pid_var
 The variable index in _sys for the Ray's processor id (if any)
 
unsigned int _processor_crossings_var
 The variable index in _sys for the Ray's processor crossings (if any)
 
unsigned int _trajectory_changes_var
 The variable index in _sys for the Ray's trajectory changes (if any)
 
std::vector< std::pair< RayDataIndex, unsigned int > > _data_vars
 The ray data index -> variable index map.
 
std::vector< std::pair< RayDataIndex, unsigned int > > _aux_data_vars
 The ray aux data index -> variable index map.
 
BoundingBox _bbox
 The bounding box for this processor.
 
std::vector< BoundingBox > _inflated_bboxes
 The inflated bounding boxes for all processors.
 
std::vector< std::pair< processor_id_type, BoundingBox > > _inflated_neighbor_bboxes
 Inflated bounding boxes that are neighboring to this processor (pid : bbox for each entry)
 
std::unordered_map< RayID, std::pair< dof_id_type, dof_id_type > > _ray_starting_id_map
 The map from RayID to the starting element and node ID of the mesh element for said Ray.
 
dof_id_type _max_node_id
 The max node ID for the ray tracing mesh for creating unique elem IDs.
 
bool _segmented_rays
 Whether or not we have segmented rays.
 
Real _nonlinear_time
 
Real _nonlinear_dt
 
Real _linear_time
 
Real _linear_dt
 
Real _nonlinear_dt_divisor
 
Real _linear_dt_divisor
 
Real _nonlinear_start_time
 
Real _linear_start_time
 
Real _nonlinear_end_time
 
Real _linear_end_time
 
const ParallelParamObject_parent
 
const MooseBase_si_moose_base
 
const FEProblemBase_si_problem
 
const RestartableDataMapName _metaname
 
std::string _restartable_name
 
ExecFlagEnum _empty_execute_enum
 
const MooseObject_fni_object
 
const InputParameters_fni_params
 
FEProblemBase_fni_feproblem
 
const THREAD_ID _fni_tid
 
const MooseObject_ppi_moose_object
 
const InputParameters_ppi_params
 
const FEProblemBase_ppi_feproblem
 
std::map< PostprocessorName, std::unique_ptr< PostprocessorValue > > _default_values
 
const bool _broadcast_by_default
 
const MooseObject_vpi_moose_object
 
const FEProblemBase_vpi_feproblem
 
const THREAD_ID _vpi_tid
 
const InputParameters_ri_params
 
FEProblemBase_ri_fe_problem_base
 
const ReporterData_ri_reporter_data
 
const MooseObject_ri_moose_object
 
const MooseObject_uoi_moose_object
 
const FEProblemBase_uoi_feproblem
 
const THREAD_ID _uoi_tid
 

Detailed Description

Definition at line 14 of file RayTracingExodus.h.

Constructor & Destructor Documentation

◆ RayTracingExodus()

RayTracingExodus::RayTracingExodus ( const InputParameters parameters)

Definition at line 32 of file RayTracingExodus.C.

32: RayTracingMeshOutput(params) {}
Base class for outputting Ray data in a mesh format, where EDGE2 elems represent the individual Ray s...

Member Function Documentation

◆ buildBoundingBoxes()

void RayTracingMeshOutput::buildBoundingBoxes ( )
privateinherited

Build the inflated neighbor bounding boxes stored in _inflated_neighbor_bboxes for the purposes of identifying processors that may contain nodes that we need to decide on ownership for.

Definition at line 653 of file RayTracingMeshOutput.C.

654{
655 TIME_SECTION("buildBoundingBoxes", 3, "Building Bounding Boxes for RayTracing Mesh Output");
656
657 // Not used in the one proc case
658 if (_communicator.size() == 1)
659 return;
660
661 // Local bounding box
663
664 // Gather the bounding boxes of all processors
665 std::vector<std::pair<Point, Point>> bb_points = {static_cast<std::pair<Point, Point>>(_bbox)};
666 _communicator.allgather(bb_points, true);
668 for (processor_id_type pid = 0; pid < _communicator.size(); ++pid)
669 {
670 BoundingBox pid_bbox = static_cast<BoundingBox>(bb_points[pid]);
671 pid_bbox.scale(0.01);
672 _inflated_bboxes[pid] = pid_bbox;
673 }
674
675 // Find intersecting (neighbor) bounding boxes
677 for (processor_id_type pid = 0; pid < _communicator.size(); ++pid)
678 if (pid != processor_id())
679 {
680 // Insert if the searched processor's bbox intersects my bbox
681 const auto & pid_bbox = _inflated_bboxes[pid];
682 if (_bbox.intersects(pid_bbox))
683 _inflated_neighbor_bboxes.emplace_back(pid, pid_bbox);
684 }
685}
MeshBase & getMesh()
MooseMesh * _mesh_ptr
std::vector< BoundingBox > _inflated_bboxes
The inflated bounding boxes for all processors.
std::vector< std::pair< processor_id_type, BoundingBox > > _inflated_neighbor_bboxes
Inflated bounding boxes that are neighboring to this processor (pid : bbox for each entry)
BoundingBox _bbox
The bounding box for this processor.
processor_id_type size() const
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
bool intersects(const BoundingBox &) const
void scale(const Real factor)
const Parallel::Communicator & _communicator
processor_id_type processor_id() const
libMesh::BoundingBox create_local_bounding_box(const MeshBase &mesh)
uint8_t processor_id_type

Referenced by RayTracingMeshOutput::output().

◆ buildIDMap()

void RayTracingMeshOutput::buildIDMap ( )
privateinherited

Builds a map for each Ray to starting element and node ID for the EDGE2 mesh that will represent said Ray.

Definition at line 150 of file RayTracingMeshOutput.C.

151{
152 TIME_SECTION("buildIDMap", 3, "Building RayTracing ID Map");
153
154 // Build the maximum number of nodes required to represent each one of my local Rays
155 std::map<RayID, dof_id_type> local_ray_needed_nodes;
156 for (const auto & trace_data : _study.getCachedTraces())
157 {
158 const auto find = local_ray_needed_nodes.find(trace_data._ray_id);
159 if (find == local_ray_needed_nodes.end())
160 local_ray_needed_nodes[trace_data._ray_id] = neededNodes(trace_data);
161 else
162 {
163 auto & value = find->second;
164 value = std::max(value, neededNodes(trace_data));
165 }
166 }
167
168 // Fill all of my local Ray maxima to be sent to processor 0
169 std::map<processor_id_type, std::vector<std::pair<RayID, dof_id_type>>> send_needed_nodes;
170 if (local_ray_needed_nodes.size())
171 {
172 auto & root_entry = send_needed_nodes[0];
173 for (const auto & id_nodes_pair : local_ray_needed_nodes)
174 root_entry.emplace_back(id_nodes_pair);
175 }
176
177 // The global map of ray -> required nodes needed to be filled on processor 0
178 std::map<RayID, dof_id_type> global_needed_nodes;
179 // Keep track of what Ray IDs we received from what processors so we know who to send back to
180 std::unordered_map<processor_id_type, std::set<RayID>> pid_received_ids;
181 // Take the required nodes for each Ray and determine on processor 0 the global maximum
182 // nodes needed to represent each Ray
183 const auto append_global_max =
184 [&global_needed_nodes, &pid_received_ids](
185 processor_id_type pid, const std::vector<std::pair<RayID, dof_id_type>> & pairs)
186 {
187 auto & pid_received_entry = pid_received_ids[pid];
188 for (const auto & id_max_pair : pairs)
189 {
190 const RayID ray_id = id_max_pair.first;
191 const dof_id_type max = id_max_pair.second;
192
193 const auto find = global_needed_nodes.find(ray_id);
194 if (find == global_needed_nodes.end())
195 global_needed_nodes.emplace(ray_id, max);
196 else
197 {
198 auto & current_max = find->second;
199 current_max = std::max(current_max, max);
200 }
201
202 pid_received_entry.insert(ray_id);
203 }
204 };
205 Parallel::push_parallel_vector_data(comm(), send_needed_nodes, append_global_max);
206
207 // Decide on the starting representative starting node and elem ID for each Ray
208 std::map<RayID, std::pair<dof_id_type, dof_id_type>> global_ids;
209 dof_id_type current_node_id = 0;
210 dof_id_type current_elem_id = 0;
211 for (auto & pair : global_needed_nodes)
212 {
213 const RayID ray_id = pair.first;
214 const dof_id_type max_nodes = pair.second;
215
216 global_ids.emplace(ray_id, std::make_pair(current_node_id, current_elem_id));
217
218 current_node_id += max_nodes;
219 if (max_nodes > 1)
220 current_elem_id += max_nodes - 1;
221 else // stationary
222 current_elem_id += 1;
223 }
224
225 // Share the max node IDs so that we have a starting point for unique IDs for elems
226 _max_node_id = current_node_id;
228
229 // Fill the starting ID information to each processor that needs it from processor 0
230 std::unordered_map<processor_id_type, std::vector<std::tuple<RayID, dof_id_type, dof_id_type>>>
231 send_ids;
232 for (auto & pid_ids_pair : pid_received_ids)
233 {
234 const processor_id_type pid = pid_ids_pair.first;
235 const std::set<RayID> & ray_ids = pid_ids_pair.second;
236
237 auto & pid_send = send_ids[pid];
238 for (const RayID ray_id : ray_ids)
239 {
240 const auto & global_entry = global_ids.at(ray_id);
241 const dof_id_type node_id = global_entry.first;
242 const dof_id_type elem_id = global_entry.second;
243 pid_send.emplace_back(ray_id, node_id, elem_id);
244 }
245 }
246
247 // Take the starting ID information from processor 0 and store it locally
248 const auto append_ids =
250 const std::vector<std::tuple<RayID, dof_id_type, dof_id_type>> & tuples)
251 {
252 for (const auto & tuple : tuples)
253 {
254 const RayID ray_id = std::get<0>(tuple);
255 const dof_id_type node_id = std::get<1>(tuple);
256 const dof_id_type elem_id = std::get<2>(tuple);
257 _ray_starting_id_map.emplace(ray_id, std::make_pair(node_id, elem_id));
258 }
259 };
260
261 _ray_starting_id_map.clear();
262 Parallel::push_parallel_vector_data(comm(), send_ids, append_ids);
263}
unsigned long int RayID
Type for a Ray's ID.
Definition Ray.h:44
dof_id_type neededNodes(const TraceData &trace_data) const
Gets the number of nodes needed to represent a given trace.
const RayTracingStudy & _study
The RayTracingStudy.
std::unordered_map< RayID, std::pair< dof_id_type, dof_id_type > > _ray_starting_id_map
The map from RayID to the starting element and node ID of the mesh element for said Ray.
dof_id_type _max_node_id
The max node ID for the ray tracing mesh for creating unique elem IDs.
void max(const T &r, T &o, Request &req) const
const Parallel::Communicator & comm() const
auto max(const L &left, const R &right)
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
uint8_t dof_id_type

Referenced by RayTracingMeshOutput::buildSegmentMesh().

◆ buildSegmentMesh()

void RayTracingMeshOutput::buildSegmentMesh ( )
privateinherited

Build the mesh that contains the ray tracing segments.

Definition at line 266 of file RayTracingMeshOutput.C.

267{
268 TIME_SECTION("buildSegmentMesh", 3, "Building RayTracing Mesh Output");
269
270 _segmented_rays = false;
271
272 // Tally nodes and elems for the local mesh ahead of time so we can reserve
273 // Each segment requires an element, and we need one more node than elems
274 dof_id_type num_nodes = 0;
275 dof_id_type num_elems = 0;
276 for (const auto & entry : _study.getCachedTraces())
277 {
278 const auto num_segments = entry.numSegments();
279 num_nodes += num_segments + 1;
280 if (num_segments >= 1)
281 {
282 _segmented_rays = true;
283 num_elems += num_segments;
284 }
285 else if (entry.stationary())
286 num_elems += 1;
287 }
288
290
291 // Build the segment mesh
292 mooseAssert(!_segment_mesh, "Not cleared");
293 if (_communicator.size() == 1)
294 _segment_mesh = std::make_unique<ReplicatedMesh>(_communicator, _mesh_ptr->dimension());
295 else
296 {
297 _segment_mesh = std::make_unique<DistributedMesh>(_communicator, _mesh_ptr->dimension());
298 _segment_mesh->set_distributed();
299 }
300 // We set neighbor links
301 _segment_mesh->allow_find_neighbors(false);
302 // Don't renumber so that we can remain consistent between processor counts
303 _segment_mesh->allow_renumbering(false);
304 // As we're building segments for just this partiton, we're partitioning on our own
305 _segment_mesh->skip_partitioning(true);
306 // Reserve nodes and elems
307 _segment_mesh->reserve_nodes(num_nodes);
308 _segment_mesh->reserve_elem(num_elems);
309
310 buildIDMap();
311
312 // Decide on a starting ID for each processor
313 // Build a mesh segment for each local Ray segment
314 // Each one of these objects represents a single Ray's path through this processor
315 for (const auto & trace_data : _study.getCachedTraces())
316 {
317 // If we have no segments, this is a trace that skimmed the corner of a processor boundary and
318 // didn't contribute anything
319 if (trace_data.numSegments() == 0 && !trace_data.stationary())
320 continue;
321
322 dof_id_type node_id, elem_id;
323 startingIDs(trace_data, node_id, elem_id);
324
325 // Add the start point
326 mooseAssert(!_segment_mesh->query_node_ptr(node_id), "Node already exists");
327 Node * last_node =
328 _segment_mesh->add_point(trace_data._point_data[0]._point, node_id, processor_id());
329 last_node->set_unique_id(node_id++);
330
331 // Stationary, add a NodeElem
332 if (trace_data.stationary())
333 {
334 mooseAssert(!_segment_mesh->query_elem_ptr(elem_id), "Elem already exists");
335 auto elem = _segment_mesh->add_elem(Elem::build_with_id(NODEELEM, elem_id));
336 elem->processor_id(processor_id());
337 elem->set_unique_id(_max_node_id + elem_id++);
338 elem->set_node(0, last_node);
339 }
340 // Not stationary; add a point and element for each segment
341 else
342 {
343 Elem * last_elem = nullptr;
344
345 for (std::size_t i = 1; i < trace_data._point_data.size(); ++i)
346 {
347 const auto & point = trace_data._point_data[i]._point;
348
349 // Add next point on the trace
350 mooseAssert(!_segment_mesh->query_node_ptr(node_id), "Node already exists");
351 Node * node = _segment_mesh->add_point(point, node_id, processor_id());
352 node->set_unique_id(node_id++);
353
354 // Build a segment from this point to the last
355 mooseAssert(!_segment_mesh->query_elem_ptr(elem_id), "Elem already exists");
356 Elem * elem = _segment_mesh->add_elem(Elem::build_with_id(EDGE2, elem_id));
357 elem->processor_id(processor_id());
358 elem->set_unique_id(_max_node_id + elem_id++);
359 elem->set_node(0, last_node);
360 elem->set_node(1, node);
361
362 // Set neighbor links
363 if (last_elem)
364 {
365 elem->set_neighbor(0, last_elem);
366 last_elem->set_neighbor(1, elem);
367 }
368
369 last_elem = elem;
370 last_node = node;
371 }
372 }
373 }
374
375 // If the mesh is replicated, everything that follows is unnecessary. Prepare and be done.
376 if (_segment_mesh->is_replicated())
377 {
378 _segment_mesh->prepare_for_use();
379 return;
380 }
381
382 // Find the Nodes on processor boundaries that we need to decide on owners for. Also set up
383 // remote_elem links for neighbors we clearly don't have. We don't build the neighbor maps at
384 // all, so all we have are nullptr and remote_elem. We can only do all of this after the mesh is
385 // built because the mesh isn't necessarily built in the order Rays are traced
386 std::vector<Node *> need_node_owners;
387 for (const auto & trace_data : _study.getCachedTraces())
388 {
389 const auto num_segments = trace_data.numSegments();
390
391 if (num_segments == 0)
392 continue;
393
394 dof_id_type start_node_id, start_elem_id;
395 startingIDs(trace_data, start_node_id, start_elem_id);
396
397 // Another part of the trace for this Ray happened before this one
398 if ((_study.segmentsOnCacheTraces() ? trace_data._intersections
399 : (unsigned long int)(trace_data._processor_crossings +
400 trace_data._trajectory_changes)) != 0)
401 {
402 // The element before start_elem (may be nullptr, meaning it didn't trace on this proc)
403 Elem * previous_elem = _segment_mesh->query_elem_ptr(start_elem_id - 1);
404
405 // We don't have the previous element segment, so it exists on another processor
406 // Set the remote_elem and mark that we need to find out who owns the first node on this
407 // trace
408 if (!previous_elem)
409 {
410 Elem * start_elem = _segment_mesh->elem_ptr(start_elem_id);
411 start_elem->set_neighbor(0, const_cast<RemoteElem *>(remote_elem));
412 start_elem->node_ptr(0)->invalidate_processor_id();
413 need_node_owners.push_back(start_elem->node_ptr(0));
414 }
415 }
416
417 // If you have multiple sets of segments on a single processor, it is possible
418 // to have part of the trace on another processor within the segments we know about.
419 // In this case, we have to do some magic to the neighbor links so that the mesh
420 // doesn't fail in assertions.
421 if (!trace_data._last)
422 {
423 // The element after end_elem (may be nullptr, meaning it didn't happen on this proc)
424 Elem * next_elem = _segment_mesh->query_elem_ptr(start_elem_id + num_segments);
425
426 // We have the next element from another trace, set neighbors as we own both
427 if (!next_elem)
428 {
429 Elem * end_elem = _segment_mesh->elem_ptr(start_elem_id + num_segments - 1);
430 end_elem->set_neighbor(1, const_cast<RemoteElem *>(remote_elem));
431 end_elem->node_ptr(1)->invalidate_processor_id();
432 need_node_owners.push_back(end_elem->node_ptr(1));
433 }
434 }
435 }
436
437 // Sort through the neighboring bounding boxes and prepare requests to each processor that /may/
438 // also have one of the nodes that we need to decide on an owner for
439 std::unordered_map<processor_id_type, std::vector<dof_id_type>> need_node_owners_sends;
440 for (const Node * node : need_node_owners)
441 for (const auto & neighbor_pid_bbox_pair : _inflated_neighbor_bboxes)
442 {
443 const auto neighbor_pid = neighbor_pid_bbox_pair.first;
444 const auto & neighbor_bbox = neighbor_pid_bbox_pair.second;
445 if (neighbor_bbox.contains_point(*node))
446 need_node_owners_sends[neighbor_pid].push_back(node->id());
447 }
448
449 // Functor that takes in a set of incoming node IDs from a processor and decides on an owner.
450 // For every node that we need an owner for, this should be called for said node on both
451 // processors. Therefore, just pick the minimum processor ID as the owner. This should never
452 // happen more than once for a single node because we're building 1D elems and we can only ever
453 // have two procs that touch a node.
454 std::unordered_map<processor_id_type, std::vector<dof_id_type>> confirm_node_owners_sends;
455 auto decide_node_owners_functor =
456 [this, &confirm_node_owners_sends](processor_id_type pid,
457 const std::vector<dof_id_type> & incoming_node_ids)
458 {
459 auto & confirm_pid = confirm_node_owners_sends[pid];
460 for (const auto & node_id : incoming_node_ids)
461 {
462 Node * node = _segment_mesh->query_node_ptr(node_id);
463 if (node)
464 {
465 mooseAssert(!node->valid_processor_id(), "Should be invalid");
466 node->processor_id() = std::min(pid, processor_id());
467 confirm_pid.push_back(node_id);
468 }
469 }
470 };
471
472 // Ship the nodes that need owners for and pick an owner when we receive
473 Parallel::push_parallel_vector_data(
474 _communicator, need_node_owners_sends, decide_node_owners_functor);
475
476 // At this point, any nodes that we actually need ghosts for should have their processor_ids
477 // satisfied. Anything that is left isn't actually ghosted and is ours. Therefore, set
478 // everything left that is invalid to be owned by this proc.
479 for (Node * node : need_node_owners)
480 if (!node->valid_processor_id())
481 node->processor_id() = processor_id();
482
483 // We're done!
484 _segment_mesh->prepare_for_use();
485}
for(PetscInt i=0;i< nvars;++i)
void ErrorVector unsigned int
virtual unsigned int dimension() const
bool _segmented_rays
Whether or not we have segmented rays.
std::unique_ptr< MeshBase > _segment_mesh
The mesh that contains the segments.
void startingIDs(const TraceData &trace_data, dof_id_type &start_node_id, dof_id_type &start_elem_id) const
Gets the starting node and element IDs in the EDGE2 mesh for a given trace.
void buildIDMap()
Builds a map for each Ray to starting element and node ID for the EDGE2 mesh that will represent said...
bool segmentsOnCacheTraces() const
Whether or not to cache individual element segments when _cache_traces = true.
void invalidate_processor_id()
processor_id_type processor_id() const
bool valid_processor_id() const
dof_id_type id() const
void set_unique_id(unique_id_type new_id)
virtual Node *& set_node(const unsigned int i)
void set_neighbor(const unsigned int i, Elem *n)
const Node * node_ptr(const unsigned int i) const
if(subdm)
const RemoteElem * remote_elem

Referenced by RayTracingMeshOutput::output().

◆ fileExtension()

virtual std::string RayTracingExodus::fileExtension ( ) const
inlineoverrideprotectedvirtual

Return the file extension.

Implements RayTracingMeshOutput.

Definition at line 24 of file RayTracingExodus.h.

24{ return ".e"; }

◆ filename()

std::string RayTracingMeshOutput::filename ( )
overridevirtualinherited

Reimplemented from FileOutput.

Definition at line 102 of file RayTracingMeshOutput.C.

103{
104 // Append the file extension on the base file name
105 std::ostringstream output;
107
108 // Add the _000x extension to the file
109 if (_file_num > 0)
110 output << "-s" << std::setw(_padding) << std::setprecision(0) << std::setfill('0') << std::right
111 << _file_num;
112
113 // Return the filename
114 return output.str();
115}
unsigned int _padding
std::string _file_base
unsigned int & _file_num
virtual std::string fileExtension() const =0
Return the file extension.

Referenced by outputMesh(), and RayTracingNemesis::outputMesh().

◆ fillFields()

void RayTracingMeshOutput::fillFields ( )
privateinherited

Fill the Ray field data.

Definition at line 574 of file RayTracingMeshOutput.C.

575{
576 TIME_SECTION("fillFields", 3, "Filling RayTracing MeshOutput Fields");
577
578 // Helper for setting the solution (if enabled)
579 const auto set_solution =
580 [this](const DofObject * const dof, const unsigned int var, const Real value)
581 {
582 mooseAssert(dof, "Nullptr dof");
583 if (var != invalid_uint)
584 {
585 const auto dof_number = dof->dof_number(_sys->number(), var, 0);
586 _sys->solution->set(dof_number, value);
587 }
588 };
589
590 // Helper for filling data and aux data (if enabled)
591 const auto fill_data =
592 [&set_solution](const DofObject * const dof, const auto & vars, const auto & data)
593 {
594 mooseAssert(dof, "Nullptr dof");
595 for (const auto & [data_index, var_num] : vars)
596 set_solution(dof, var_num, data[data_index]);
597 };
598
599 for (const auto & trace_data : _study.getCachedTraces())
600 {
601 auto intersection = trace_data._intersections;
602
603 // No segments and not stationary; means this ray bounced off
604 // this processor and never actually moved on this processor
605 if (!trace_data.numSegments() && !trace_data.stationary())
606 continue;
607
608 dof_id_type node_id, elem_id;
609 startingIDs(trace_data, node_id, elem_id);
610
611 const Elem * elem = _segment_mesh->elem_ptr(elem_id);
612
613 // Fill first node's nodal data if we need it; the loop that follows will handle
614 // the rest of the nodes
615 if (_output_data_nodal && _study.hasRayData() && !trace_data.stationary())
616 fill_data(elem->node_ptr(0), _data_vars, trace_data._point_data[0]._data);
617
618 const std::size_t start = trace_data.stationary() ? 0 : 1;
619 for (const auto i : make_range(start, trace_data._point_data.size()))
620 {
621 mooseAssert(elem, "Nullptr elem");
622
623 // Elemental ID and pid
624 set_solution(elem, _ray_id_var, trace_data._ray_id);
625 set_solution(elem, _pid_var, processor_id());
626 // Elemental properties that only apply to segments
627 if (!trace_data.stationary())
628 {
629 set_solution(elem, _intersections_var, intersection++);
630 set_solution(elem, _processor_crossings_var, trace_data._processor_crossings);
631 set_solution(elem, _trajectory_changes_var, trace_data._trajectory_changes);
632 }
633 const auto & point_data = trace_data._point_data[i];
634 // Data fields
635 if (_output_data_nodal && !trace_data.stationary())
636 fill_data(elem->node_ptr(1), _data_vars, point_data._data);
637 else
638 fill_data(elem, _data_vars, point_data._data);
639 // Aux data fields
640 fill_data(elem, _aux_data_vars, point_data._aux_data);
641
642 // Advance to the next element
643 if (!trace_data.stationary())
644 elem = elem->neighbor_ptr(1);
645 }
646 }
647
648 _sys->solution->close();
649 _sys->update();
650}
char ** vars
unsigned int _intersections_var
The variable index in _sys for the intersection ID (if any)
unsigned int _ray_id_var
The variable index in _sys for the Ray's ID (if any)
unsigned int _pid_var
The variable index in _sys for the Ray's processor id (if any)
const bool _output_data_nodal
Whether or not to output the Ray's data in a nodal, linear sense.
unsigned int _processor_crossings_var
The variable index in _sys for the Ray's processor crossings (if any)
libMesh::ExplicitSystem * _sys
The system that stores the field data.
std::vector< std::pair< RayDataIndex, unsigned int > > _data_vars
The ray data index -> variable index map.
unsigned int _trajectory_changes_var
The variable index in _sys for the Ray's trajectory changes (if any)
std::vector< std::pair< RayDataIndex, unsigned int > > _aux_data_vars
The ray aux data index -> variable index map.
bool hasRayData() const
Whether or not any Ray data are registered.
dof_id_type dof_number(const unsigned int s, const unsigned int var, const unsigned int comp) const
const Elem * neighbor_ptr(unsigned int i) const
std::unique_ptr< NumericVector< Number > > solution
virtual void update()
unsigned int number() const
void fill_data(std::map< processor_id_type, std::vector< std::set< unsigned int > > > &data, int M)
const unsigned int invalid_uint
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)

Referenced by RayTracingMeshOutput::output().

◆ neededNodes()

dof_id_type RayTracingMeshOutput::neededNodes ( const TraceData trace_data) const
privateinherited

Gets the number of nodes needed to represent a given trace.

Definition at line 706 of file RayTracingMeshOutput.C.

707{
709 return trace_data._intersections + trace_data._point_data.size();
710 return trace_data._processor_crossings + trace_data._trajectory_changes +
711 trace_data._point_data.size();
712}
std::vector< TracePointData > _point_data
The data for each point along the track.
Definition TraceData.h:78
const unsigned int _processor_crossings
Number of processor crossings thus far.
Definition TraceData.h:72
const unsigned long int _intersections
The number of intersections thus far.
Definition TraceData.h:70
const unsigned int _trajectory_changes
Number of trajectory changes thus far.
Definition TraceData.h:74

Referenced by RayTracingMeshOutput::buildIDMap().

◆ output()

void RayTracingMeshOutput::output ( )
overridevirtualinherited

Implements FileOutput.

Definition at line 118 of file RayTracingMeshOutput.C.

119{
120 // Do we even have any traces?
121 auto num_segments = _study.getCachedTraces().size();
122 _communicator.sum(num_segments);
123 if (!num_segments)
124 mooseError("No cached trace segments were found in the study '", _study.name(), "'.");
125
126 // Build the _inflated_neighbor_bboxes
128
129 // Build the _segment_mesh
131
132 // Setup the system to store the Ray field data
134
135 // Fill the field data
136 fillFields();
137
138 // And output
139 outputMesh();
140
141 // Done with these
142 // We don't necessarily need to create a new mesh every time, but it's easier than
143 // checking if the Rays have changed from last time we built a mesh
144 _es = nullptr;
145 _sys = nullptr;
146 _segment_mesh = nullptr;
147}
const std::string & name() const
void mooseError(Args &&... args) const
void buildBoundingBoxes()
Build the inflated neighbor bounding boxes stored in _inflated_neighbor_bboxes for the purposes of id...
std::unique_ptr< libMesh::EquationSystems > _es
The EquationSystems.
void fillFields()
Fill the Ray field data.
void setupEquationSystem()
Setup the equation system that stores the segment-wise field data.
void buildSegmentMesh()
Build the mesh that contains the ray tracing segments.
virtual void outputMesh()=0
Output the mesh - to be overridden.
const std::vector< TraceData > & getCachedTraces() const
Get the cached trace data structure.

Referenced by RayTracingMeshOutput::filename().

◆ outputMesh()

void RayTracingExodus::outputMesh ( )
overridevirtual

Output the mesh - to be overridden.

Implements RayTracingMeshOutput.

Definition at line 35 of file RayTracingExodus.C.

36{
37 TIME_SECTION("outputMesh", 3, "Writing Ray Mesh");
38
40 eio.set_hdf5_writing(false);
41
42 // With nodal data, we need to output these variables in write_timestep
44 eio.set_output_variables(_study.rayDataNames());
45 // Otherwise, there's no variables to write in write_timestep
46 else
47 eio.set_output_variables(std::vector<std::string>());
48 // Write the timestep, which is the mesh + nodal vars (if any)
49 eio.write_timestep(filename(), *_es, 1, time() + _app.getGlobalTimeOffset());
50
51 // This will default to write_element_data getting all available elemental vars
52 eio.set_output_variables(std::vector<std::string>());
53 // Write the elemental variables, which are the variables with the constant Ray field data
54 eio.write_element_data(*_es);
55
56 // We write a new file every time as we don't keep track of whether or not the rays change
57 ++_file_num;
58}
Real getGlobalTimeOffset() const
MooseApp & _app
virtual Real time() override
virtual std::string filename() override
const std::vector< std::string > & rayDataNames() const
The Ray data names.

◆ setupEquationSystem()

void RayTracingMeshOutput::setupEquationSystem ( )
privateinherited

Setup the equation system that stores the segment-wise field data.

Definition at line 488 of file RayTracingMeshOutput.C.

489{
490 TIME_SECTION("setupEquationSystem", 3, "Setting Up Ray Tracing MeshOutput Equation System");
491
492 _es = std::make_unique<EquationSystems>(*_segment_mesh);
493 _sys = &_es->add_system<libMesh::ExplicitSystem>("sys");
495 _aux_data_vars.clear();
496
497 // Add variables for the basic properties if enabled
503 for (auto & prop : _pars.get<MultiMooseEnum>("output_properties"))
504 switch (prop)
505 {
506 case 0: // ray_id (stationary and segments)
508 break;
509 case 1: // intersections (segments only)
510 if (_segmented_rays)
512 break;
513 case 2: // pid (stationary and segments)
515 break;
516 case 3: // processor_crossings (segments only)
517 if (_segmented_rays)
518 _processor_crossings_var = _sys->add_variable("processor_crossings", CONSTANT, MONOMIAL);
519 break;
520 case 4: // trajectory_changes (segments only)
521 if (_segmented_rays)
522 _trajectory_changes_var = _sys->add_variable("trajectory_changes", CONSTANT, MONOMIAL);
523 break;
524 default:
525 mooseError("Invalid property");
526 }
527
528 const auto get_data_vars = [this](const bool aux)
529 {
530 // The data index -> variable result
531 std::vector<std::pair<RayDataIndex, unsigned int>> vars;
532
533 const auto from_names =
535 : (_output_data ? &_study.rayDataNames() : _output_data_names);
536
537 // Nothing to output
538 if (!from_names)
539 return vars;
540
541 const auto output_data_nodal = aux ? false : _output_data_nodal;
542
543 for (const auto & name : *from_names)
544 {
545 const auto data_index =
547 if (data_index == Ray::INVALID_RAY_DATA_INDEX)
548 {
549 const std::string names_param = aux ? "output_aux_data_names" : "output_data_names";
550 const std::string data_prefix = aux ? "aux " : "";
551 paramError(names_param, "The ray ", data_prefix, "data '", name, "' is not registered");
552 }
553
554 const std::string var_prefix = aux ? "aux_" : "";
555 if (output_data_nodal)
556 _sys->add_variable(var_prefix + name, FIRST, LAGRANGE);
557 else
558 _sys->add_variable(var_prefix + name, CONSTANT, MONOMIAL);
559 const auto var_num = _sys->variable_number(var_prefix + name);
560 vars.emplace_back(data_index, var_num);
561 }
562
563 return vars;
564 };
565
566 _data_vars = get_data_vars(false);
567 _aux_data_vars = get_data_vars(true);
568
569 // All done
570 _es->init();
571}
void paramError(const std::string &param, Args... args) const
const InputParameters & _pars
const std::vector< std::string > *const _output_aux_data_names
Specific Ray Aux data to output.
const bool _output_aux_data
Whether or not to output the Ray's aux data.
const bool _output_data
Whether or not to output all of the Ray's data.
const std::vector< std::string > *const _output_data_names
Specific Ray data to output.
const std::vector< std::string > & rayAuxDataNames() const
The Ray aux data names.
RayDataIndex getRayDataIndex(const std::string &name, const bool graceful=false) const
Gets the index associated with a registered value in the Ray data.
RayDataIndex getRayAuxDataIndex(const std::string &name, const bool graceful=false) const
Gets the index associated with a registered value in the Ray aux data.
static const RayDataIndex INVALID_RAY_DATA_INDEX
Invalid index into a Ray's data.
Definition Ray.h:212
virtual void clear() override
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
unsigned int variable_number(std::string_view var) const
const Elem & get(const ElemType type_in)

Referenced by RayTracingMeshOutput::output().

◆ startingIDs()

void RayTracingMeshOutput::startingIDs ( const TraceData trace_data,
dof_id_type start_node_id,
dof_id_type start_elem_id 
) const
privateinherited

Gets the starting node and element IDs in the EDGE2 mesh for a given trace.

Definition at line 688 of file RayTracingMeshOutput.C.

691{
692 const auto [begin_node_id, begin_elem_id] = _ray_starting_id_map.at(trace_data._ray_id);
693
694 const auto offset =
695 trace_data.stationary()
696 ? 1
698 ? trace_data._intersections
699 : (trace_data._processor_crossings + trace_data._trajectory_changes));
700
701 start_node_id = begin_node_id + offset;
702 start_elem_id = begin_elem_id + offset;
703}
bool stationary() const
Definition TraceData.h:59
const RayID _ray_id
The Ray ID.
Definition TraceData.h:68

Referenced by RayTracingMeshOutput::buildSegmentMesh(), and RayTracingMeshOutput::fillFields().

◆ validParams()

InputParameters RayTracingExodus::validParams ( )
static

Definition at line 25 of file RayTracingExodus.C.

26{
28 params.addClassDescription("Outputs ray segments and data as segments using the Exodus format.");
29 return params;
30}
static InputParameters validParams()

Member Data Documentation

◆ _aux_data_vars

std::vector<std::pair<RayDataIndex, unsigned int> > RayTracingMeshOutput::_aux_data_vars
privateinherited

The ray aux data index -> variable index map.

Definition at line 122 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::fillFields(), and RayTracingMeshOutput::setupEquationSystem().

◆ _bbox

BoundingBox RayTracingMeshOutput::_bbox
privateinherited

The bounding box for this processor.

Definition at line 125 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::buildBoundingBoxes().

◆ _data_vars

std::vector<std::pair<RayDataIndex, unsigned int> > RayTracingMeshOutput::_data_vars
privateinherited

The ray data index -> variable index map.

Definition at line 120 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::fillFields(), and RayTracingMeshOutput::setupEquationSystem().

◆ _es

std::unique_ptr<libMesh::EquationSystems> RayTracingMeshOutput::_es
protectedinherited

◆ _inflated_bboxes

std::vector<BoundingBox> RayTracingMeshOutput::_inflated_bboxes
privateinherited

The inflated bounding boxes for all processors.

Definition at line 127 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::buildBoundingBoxes().

◆ _inflated_neighbor_bboxes

std::vector<std::pair<processor_id_type, BoundingBox> > RayTracingMeshOutput::_inflated_neighbor_bboxes
privateinherited

Inflated bounding boxes that are neighboring to this processor (pid : bbox for each entry)

Definition at line 129 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::buildBoundingBoxes(), and RayTracingMeshOutput::buildSegmentMesh().

◆ _intersections_var

unsigned int RayTracingMeshOutput::_intersections_var
privateinherited

The variable index in _sys for the intersection ID (if any)

Definition at line 112 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::fillFields(), and RayTracingMeshOutput::setupEquationSystem().

◆ _max_node_id

dof_id_type RayTracingMeshOutput::_max_node_id
privateinherited

The max node ID for the ray tracing mesh for creating unique elem IDs.

Definition at line 134 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::buildIDMap(), and RayTracingMeshOutput::buildSegmentMesh().

◆ _output_aux_data

const bool RayTracingMeshOutput::_output_aux_data
protectedinherited

Whether or not to output the Ray's aux data.

Definition at line 63 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::RayTracingMeshOutput(), and RayTracingMeshOutput::setupEquationSystem().

◆ _output_aux_data_names

const std::vector<std::string>* const RayTracingMeshOutput::_output_aux_data_names
protectedinherited

Specific Ray Aux data to output.

Definition at line 65 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::RayTracingMeshOutput(), and RayTracingMeshOutput::setupEquationSystem().

◆ _output_data

const bool RayTracingMeshOutput::_output_data
protectedinherited

Whether or not to output all of the Ray's data.

Definition at line 57 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::RayTracingMeshOutput(), and RayTracingMeshOutput::setupEquationSystem().

◆ _output_data_names

const std::vector<std::string>* const RayTracingMeshOutput::_output_data_names
protectedinherited

Specific Ray data to output.

Definition at line 59 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::RayTracingMeshOutput(), and RayTracingMeshOutput::setupEquationSystem().

◆ _output_data_nodal

const bool RayTracingMeshOutput::_output_data_nodal
protectedinherited

◆ _pid_var

unsigned int RayTracingMeshOutput::_pid_var
privateinherited

The variable index in _sys for the Ray's processor id (if any)

Definition at line 114 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::fillFields(), and RayTracingMeshOutput::setupEquationSystem().

◆ _processor_crossings_var

unsigned int RayTracingMeshOutput::_processor_crossings_var
privateinherited

The variable index in _sys for the Ray's processor crossings (if any)

Definition at line 116 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::fillFields(), and RayTracingMeshOutput::setupEquationSystem().

◆ _ray_id_var

unsigned int RayTracingMeshOutput::_ray_id_var
privateinherited

The variable index in _sys for the Ray's ID (if any)

Definition at line 110 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::fillFields(), and RayTracingMeshOutput::setupEquationSystem().

◆ _ray_starting_id_map

std::unordered_map<RayID, std::pair<dof_id_type, dof_id_type> > RayTracingMeshOutput::_ray_starting_id_map
privateinherited

The map from RayID to the starting element and node ID of the mesh element for said Ray.

Definition at line 132 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::buildIDMap(), and RayTracingMeshOutput::startingIDs().

◆ _segment_mesh

std::unique_ptr<MeshBase> RayTracingMeshOutput::_segment_mesh
protectedinherited

◆ _segmented_rays

bool RayTracingMeshOutput::_segmented_rays
privateinherited

Whether or not we have segmented rays.

Definition at line 136 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::buildSegmentMesh(), and RayTracingMeshOutput::setupEquationSystem().

◆ _study

const RayTracingStudy& RayTracingMeshOutput::_study
protectedinherited

◆ _sys

libMesh::ExplicitSystem* RayTracingMeshOutput::_sys
protectedinherited

The system that stores the field data.

Definition at line 72 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::fillFields(), RayTracingMeshOutput::output(), and RayTracingMeshOutput::setupEquationSystem().

◆ _trajectory_changes_var

unsigned int RayTracingMeshOutput::_trajectory_changes_var
privateinherited

The variable index in _sys for the Ray's trajectory changes (if any)

Definition at line 118 of file RayTracingMeshOutput.h.

Referenced by RayTracingMeshOutput::fillFields(), and RayTracingMeshOutput::setupEquationSystem().


The documentation for this class was generated from the following files: