https://mooseframework.inl.gov
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Static Protected Member Functions | Protected Attributes | List of all members
SCMSolutionTransfer Class Reference

Transfers subchannel and pin solutions from a SubChannel mesh onto a visualization mesh. More...

#include <SCMSolutionTransfer.h>

Inheritance diagram for SCMSolutionTransfer:
[legend]

Public Types

enum  DIRECTION
 
typedef DataFileName DataFileParameterType
 

Public Member Functions

 SCMSolutionTransfer (const InputParameters &parameters)
 
virtual void execute () override
 
void initialSetup () override
 
void variableIntegrityCheck (const AuxVariableName &var_name, bool is_from_multiapp) const
 
const std::shared_ptr< MultiAppgetMultiApp () const
 
const std::shared_ptr< MultiAppgetFromMultiApp () const
 
const std::shared_ptr< MultiAppgetToMultiApp () const
 
std::string getFromName () const
 
std::string getToName () const
 
bool hasFromMultiApp () const
 
bool hasToMultiApp () const
 
virtual void getAppInfo ()
 
const MultiMooseEnumdirections ()
 
void setCurrentDirection (const int direction)
 
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 haveParameter (const std::string &name) 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 timestepSetup ()
 
virtual void jacobianSetup ()
 
virtual void residualSetup ()
 
virtual void subdomainSetup ()
 
virtual void customSetup (const ExecFlagType &)
 
const ExecFlagEnumgetExecuteOnEnum () const
 
PerfGraphperfGraph ()
 
MooseEnum direction ()
 
MooseEnum direction ()
 
MooseEnum currentDirection ()
 
MooseEnum currentDirection ()
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () 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 void addSkipCoordCollapsingParam (InputParameters &params)
 
static libMesh::Systemfind_sys (libMesh::EquationSystems &es, const std::string &var_name)
 
static std::string possibleDirections ()
 

Public Attributes

 TO_MULTIAPP
 
 FROM_MULTIAPP
 
 BETWEEN_MULTIAPP
 
 usingCombinedWarningSolutionWarnings
 
const ConsoleStream _console
 

Static Public Attributes

static const libMesh::Number OutOfMeshValue
 
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

void transferToMultiApps ()
 
void transferVarsToApp (unsigned int app_idx)
 
void transferNodalVars (unsigned int app_idx)
 
void validateVariableLocations (const SubChannelMesh &from_mesh, FEProblemBase &to_problem)
 
Node * getFromNode (const SubChannelMesh &from_mesh, const Point &src_node)
 
std::vector< unsigned intgetFromsPerProc ()
 
libMesh::NumericVector< Real > & getTransferVector (unsigned int i_local, std::string var_name)
 
unsigned int getGlobalSourceAppIndex (unsigned int i_from) const
 
unsigned int getGlobalTargetAppIndex (unsigned int i_to) const
 
unsigned int getLocalSourceAppIndex (unsigned int i_from) const
 
virtual void checkSiblingsTransferSupported () const
 
void checkParentAppUserObjectExecuteOn (const std::string &object_name) const
 
void errorIfObjectExecutesOnTransferInSourceApp (const std::string &object_name) const
 
Point getPointInTargetAppFrame (const Point &p, unsigned int local_i_to, const std::string &phase) const
 
Point getPointInSourceAppFrame (const Point &p, unsigned int local_i_from, const std::string &phase) const
 
void checkMultiAppExecuteOn ()
 
void checkVariable (const FEProblemBase &fe_problem, const VariableName &var_name, const std::string &param_name="") const
 
void extendBoundingBoxes (const Real factor, std::vector< libMesh::BoundingBox > &bboxes) const
 
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
 
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
 
std::vector< libMesh::BoundingBoxgetFromBoundingBoxes ()
 
std::vector< libMesh::BoundingBoxgetFromBoundingBoxes (BoundaryID boundary_id)
 
std::vector< libMesh::BoundingBoxgetFromBoundingBoxes ()
 
std::vector< libMesh::BoundingBoxgetFromBoundingBoxes (BoundaryID boundary_id)
 

Static Protected Member Functions

static void addUserObjectExecutionCheckParam (InputParameters &params)
 
static void addBBoxFactorParam (InputParameters &params)
 
static void transformBoundingBox (libMesh::BoundingBox &box, const MultiAppCoordTransform &transform)
 

Protected Attributes

const std::vector< AuxVariableName > & _var_names
 Variable names to transfer. More...
 
const bool _pin_transfer
 Whether pin fields should be transferred instead of subchannel fields. More...
 
std::shared_ptr< MultiApp_multi_app
 
std::vector< FEProblemBase *> _to_problems
 
std::vector< FEProblemBase *> _from_problems
 
std::vector< libMesh::EquationSystems *> _to_es
 
std::vector< libMesh::EquationSystems *> _from_es
 
std::vector< MooseMesh *> _to_meshes
 
std::vector< MooseMesh *> _from_meshes
 
std::vector< Point > _to_positions
 
std::vector< Point > _from_positions
 
std::vector< std::unique_ptr< MultiAppCoordTransform > > _to_transforms
 
std::vector< std::unique_ptr< MultiAppCoordTransform > > _from_transforms
 
const bool _skip_coordinate_collapsing
 
bool _displaced_source_mesh
 
bool _displaced_target_mesh
 
Real _bbox_factor
 
std::vector< unsigned int_to_local2global_map
 
std::vector< unsigned int_from_local2global_map
 
SubProblem_subproblem
 
FEProblemBase_fe_problem
 
SystemBase_sys
 
THREAD_ID _tid
 
MultiMooseEnum _directions
 
const bool & _enabled
 
MooseApp_app
 
Factory_factory
 
ActionFactory_action_factory
 
const std::string & _type
 
const std::string & _name
 
const InputParameters_pars
 
const ExecFlagEnum_execute_enum
 
const ExecFlagType_current_execute_flag
 
MooseApp_restartable_app
 
const std::string _restartable_system_name
 
const THREAD_ID _restartable_tid
 
const bool _restartable_read_only
 
MooseApp_pg_moose_app
 
const std::string _prefix
 
MooseEnum _direction
 
MooseEnum _current_direction
 
const Parallel::Communicator & _communicator
 

Detailed Description

Transfers subchannel and pin solutions from a SubChannel mesh onto a visualization mesh.

Definition at line 20 of file SCMSolutionTransfer.h.

Constructor & Destructor Documentation

◆ SCMSolutionTransfer()

SCMSolutionTransfer::SCMSolutionTransfer ( const InputParameters parameters)

Definition at line 55 of file SCMSolutionTransfer.C.

57  _var_names(getParam<std::vector<AuxVariableName>>("variable")),
59  getParam<MooseEnum>("transfer_type") == "pin" ||
60  (!parameters.isParamSetByUser("transfer_type") && isDeprecatedPinTransferType(parameters)))
61 {
63  paramError("from_multiapp", "This transfer works only into multi-app.");
64 }
void paramError(const std::string &param, Args... args) const
const T & getParam(const std::string &name) const
const InputParameters & parameters() const
MultiAppTransfer(const InputParameters &parameters)
const std::vector< AuxVariableName > & _var_names
Variable names to transfer.
bool contains(const std::string &value) const
const bool _pin_transfer
Whether pin fields should be transferred instead of subchannel fields.
bool isParamSetByUser(const std::string &name) const
MultiMooseEnum _directions

Member Function Documentation

◆ execute()

void SCMSolutionTransfer::execute ( )
overridevirtual

Implements MultiAppTransfer.

Definition at line 94 of file SCMSolutionTransfer.C.

95 {
96  TIME_SECTION(
97  "MultiAppDetailedSolutionBaseTransfer::execute()", 5, "Transferring subchannel solutions");
98  getAppInfo();
99 
100  switch (_current_direction)
101  {
102  case TO_MULTIAPP:
103  case BETWEEN_MULTIAPP:
105  break;
106 
107  default:
108  break;
109  }
110 }
MooseEnum _current_direction
virtual void getAppInfo()

◆ getFromNode()

Node * SCMSolutionTransfer::getFromNode ( const SubChannelMesh from_mesh,
const Point &  src_node 
)
protected

Definition at line 233 of file SCMSolutionTransfer.C.

Referenced by transferNodalVars().

234 {
235  unsigned int sch_idx =
236  _pin_transfer ? from_mesh.pinIndex(src_node) : from_mesh.channelIndex(src_node);
237  unsigned iz = from_mesh.getZIndex(src_node);
238  return _pin_transfer ? from_mesh.getPinNode(sch_idx, iz) : from_mesh.getChannelNode(sch_idx, iz);
239 }
virtual unsigned int pinIndex(const Point &p) const =0
virtual Node * getPinNode(unsigned int i_pin, unsigned int iz) const =0
Get the pin mesh node for a given pin index and elevation index.
virtual Node * getChannelNode(unsigned int i_chan, unsigned int iz) const =0
Get the subchannel mesh node for a given channel index and elevation index.
const bool _pin_transfer
Whether pin fields should be transferred instead of subchannel fields.
virtual unsigned int channelIndex(const Point &point) const =0
virtual unsigned int getZIndex(const Point &point) const
Get axial index of point.

◆ initialSetup()

void SCMSolutionTransfer::initialSetup ( )
overridevirtual

Reimplemented from MultiAppTransfer.

Definition at line 67 of file SCMSolutionTransfer.C.

68 {
70  for (std::size_t var_index = 0; var_index < _var_names.size(); ++var_index)
71  {
72  if (_to_problems.empty())
73  continue;
74 
76  0, _var_names[var_index], Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY);
77  const auto & fe_type = from_var.feType();
78 
79  if (fe_type.family != LAGRANGE || fe_type.order != FIRST)
80  paramError("variable",
81  "This transfer requires a first order Lagrange variable for the source variable");
82 
83  MooseVariableFieldBase & to_var = _to_problems[0]->getVariable(
84  0, _var_names[var_index], Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY);
85  const auto & fe_type_target = to_var.feType();
86 
87  if (fe_type_target.family != LAGRANGE || fe_type_target.order != FIRST)
88  paramError("variable",
89  "This transfer requires a first order Lagrange variable for the source variable");
90  }
91 }
const libMesh::FEType & feType() const
void paramError(const std::string &param, Args... args) const
const std::vector< AuxVariableName > & _var_names
Variable names to transfer.
std::vector< FEProblemBase *> _to_problems
void initialSetup() override
virtual const MooseVariableFieldBase & getVariable(const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type=Moose::VarKindType::VAR_ANY, Moose::VarFieldType expected_var_field_type=Moose::VarFieldType::VAR_FIELD_ANY) const=0
SubProblem & _subproblem

◆ transferNodalVars()

void SCMSolutionTransfer::transferNodalVars ( unsigned int  app_idx)
protected

Definition at line 135 of file SCMSolutionTransfer.C.

Referenced by transferVarsToApp().

136 {
138 
139  FEProblemBase & to_problem = getToMultiApp()->appProblemBase(app_idx);
140  MooseMesh * mesh = NULL;
141  if (_displaced_target_mesh && to_problem.getDisplacedProblem())
142  mesh = &to_problem.getDisplacedProblem()->mesh();
143  else
144  mesh = &to_problem.mesh();
145 
146  const SubChannelMesh & from_mesh = dynamic_cast<SubChannelMesh &>(*_from_meshes[0]);
147  FEProblemBase & from_problem = *_from_problems[0];
148  validateVariableLocations(from_mesh, to_problem);
149 
150  for (auto & node : mesh->getMesh().local_node_ptr_range())
151  {
152  if (processor_id() != 0)
153  continue;
154  Node * from_node = getFromNode(from_mesh, *node);
155 
156  for (auto & var_name : _var_names)
157  {
158  System * to_sys = find_sys(to_problem.es(), var_name);
159  unsigned int to_sys_num = to_sys->number();
160  unsigned int to_var_num = to_sys->variable_number(var_name);
161 
162  if (node->n_dofs(to_sys_num, to_var_num) > 0)
163  {
164  System * from_sys = find_sys(from_problem.es(), var_name);
165  unsigned int from_sys_num = from_sys->number();
166  unsigned int from_var_num = from_sys->variable_number(var_name);
167 
168  // Return to parent app MPI communicator to get solution dof
169  swapper.forceSwap();
170  NumericVector<Real> * from_solution = from_sys->solution.get();
171  dof_id_type from_dof = from_node->dof_number(from_sys_num, from_var_num, 0);
172  Real from_value = (*from_solution)(from_dof);
173  swapper.forceSwap();
174 
175  NumericVector<Real> & to_solution = getToMultiApp()->appTransferVector(app_idx, var_name);
176  dof_id_type to_dof = node->dof_number(to_sys_num, to_var_num, 0);
177  to_solution.set(to_dof, from_value);
178  }
179  }
180  }
181 
182  for (auto & var_name : _var_names)
183  {
184  getToMultiApp()->appTransferVector(app_idx, var_name).close();
185  find_sys(to_problem.es(), var_name)->update();
186  }
187 }
const std::vector< AuxVariableName > & _var_names
Variable names to transfer.
MeshBase & mesh
const Parallel::Communicator & comm() const
void validateVariableLocations(const SubChannelMesh &from_mesh, FEProblemBase &to_problem)
const std::shared_ptr< MultiApp > getToMultiApp() const
bool _displaced_target_mesh
unsigned int number() const
std::vector< MooseMesh *> _from_meshes
Node * getFromNode(const SubChannelMesh &from_mesh, const Point &src_node)
virtual libMesh::EquationSystems & es() override
static libMesh::System * find_sys(libMesh::EquationSystems &es, const std::string &var_name)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual std::shared_ptr< const DisplacedProblem > getDisplacedProblem() const
virtual MooseMesh & mesh() override
Base class for subchannel meshes.
processor_id_type processor_id() const
std::vector< FEProblemBase *> _from_problems
uint8_t dof_id_type

◆ transferToMultiApps()

void SCMSolutionTransfer::transferToMultiApps ( )
protected

Definition at line 113 of file SCMSolutionTransfer.C.

Referenced by execute().

114 {
115  mooseAssert(_from_meshes.size() == 1, "Only one source mesh can be active in this transfer.");
116  auto * from_mesh = dynamic_cast<SubChannelMesh *>(_from_meshes[0]);
117  if (from_mesh == nullptr)
118  mooseError("This transfer works only with SubChannelMesh classes.");
119  if (_pin_transfer && !from_mesh->pinMeshExist())
120  mooseError(
121  "This transfer was configured for pin variables, but the source mesh has no pin mesh.");
122 
123  for (unsigned int i = 0; i < getToMultiApp()->numGlobalApps(); i++)
124  if (getToMultiApp()->hasLocalApp(i))
126 }
void transferVarsToApp(unsigned int app_idx)
const std::shared_ptr< MultiApp > getToMultiApp() const
std::vector< MooseMesh *> _from_meshes
const bool _pin_transfer
Whether pin fields should be transferred instead of subchannel fields.
void mooseError(Args &&... args) const
Base class for subchannel meshes.

◆ transferVarsToApp()

void SCMSolutionTransfer::transferVarsToApp ( unsigned int  app_idx)
protected

Definition at line 129 of file SCMSolutionTransfer.C.

Referenced by transferToMultiApps().

130 {
131  transferNodalVars(app_idx);
132 }
void transferNodalVars(unsigned int app_idx)

◆ validateVariableLocations()

void SCMSolutionTransfer::validateVariableLocations ( const SubChannelMesh from_mesh,
FEProblemBase to_problem 
)
protected

Definition at line 190 of file SCMSolutionTransfer.C.

Referenced by transferNodalVars().

192 {
193  if (processor_id() != 0)
194  return;
195 
196  Node * from_node = _pin_transfer ? from_mesh.getPinNode(0, 0) : from_mesh.getChannelNode(0, 0);
197  mooseAssert(from_node, "The representative source node must be non-null.");
198 
199  FEProblemBase & from_problem = *_from_problems[0];
200  const auto transfer_type = _pin_transfer ? "pin" : "subchannel";
201  const auto other_transfer_type = _pin_transfer ? "subchannel" : "pin";
202  const auto expected_block = _pin_transfer ? "fuel_pins" : "subchannel";
203  const auto source_block_id = from_mesh.getSubdomainID(expected_block);
204  const auto target_block_id = to_problem.mesh().getSubdomainID(expected_block);
205 
206  for (const auto & var_name : _var_names)
207  {
208  MooseVariableFieldBase & from_var = from_problem.getVariable(
209  0, var_name, Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY);
210  MooseVariableFieldBase & to_var = to_problem.getVariable(
211  0, var_name, Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY);
212  System * from_sys = find_sys(from_problem.es(), var_name);
213  const auto from_sys_num = from_sys->number();
214  const auto from_var_num = from_sys->variable_number(var_name);
215 
216  if (!from_var.activeOnSubdomain(source_block_id) ||
217  !to_var.activeOnSubdomain(target_block_id) ||
218  from_node->n_dofs(from_sys_num, from_var_num) == 0)
219  paramError("variable",
220  "The variable '",
221  var_name,
222  "' does not have DOFs on ",
223  transfer_type,
224  " nodes. Use a separate SCMSolutionTransfer with transfer_type = '",
225  other_transfer_type,
226  "' for variables centered on ",
227  other_transfer_type,
228  " nodes.");
229  }
230 }
void paramError(const std::string &param, Args... args) const
virtual Node * getPinNode(unsigned int i_pin, unsigned int iz) const =0
Get the pin mesh node for a given pin index and elevation index.
const std::vector< AuxVariableName > & _var_names
Variable names to transfer.
virtual const MooseVariableFieldBase & getVariable(const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type=Moose::VarKindType::VAR_ANY, Moose::VarFieldType expected_var_field_type=Moose::VarFieldType::VAR_FIELD_ANY) const override
unsigned int number() const
virtual libMesh::EquationSystems & es() override
static libMesh::System * find_sys(libMesh::EquationSystems &es, const std::string &var_name)
virtual Node * getChannelNode(unsigned int i_chan, unsigned int iz) const =0
Get the subchannel mesh node for a given channel index and elevation index.
const bool _pin_transfer
Whether pin fields should be transferred instead of subchannel fields.
virtual MooseMesh & mesh() override
bool activeOnSubdomain(SubdomainID subdomain) const
processor_id_type processor_id() const
std::vector< FEProblemBase *> _from_problems
SubdomainID getSubdomainID(const SubdomainName &subdomain_name) const

◆ validParams()

InputParameters SCMSolutionTransfer::validParams ( )
static

Definition at line 41 of file SCMSolutionTransfer.C.

42 {
44  params.addRequiredParam<std::vector<AuxVariableName>>("variable",
45  "The auxiliary variables to transfer.");
46  MooseEnum transfer_type("subchannel pin", "subchannel");
47  params.addParam<MooseEnum>("transfer_type",
48  transfer_type,
49  "Whether to transfer subchannel-centered or pin-centered fields.");
50  params.addClassDescription(
51  "Transfers subchannel or pin solutions from a SubChannel mesh onto a visualization mesh.");
52  return params;
53 }
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addRequiredParam(const std::string &name, const std::string &doc_string)
static InputParameters validParams()
void addClassDescription(const std::string &doc_string)

Member Data Documentation

◆ _pin_transfer

const bool SCMSolutionTransfer::_pin_transfer
protected

Whether pin fields should be transferred instead of subchannel fields.

Definition at line 39 of file SCMSolutionTransfer.h.

Referenced by getFromNode(), transferToMultiApps(), and validateVariableLocations().

◆ _var_names

const std::vector<AuxVariableName>& SCMSolutionTransfer::_var_names
protected

Variable names to transfer.

Definition at line 36 of file SCMSolutionTransfer.h.

Referenced by initialSetup(), transferNodalVars(), and validateVariableLocations().


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