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
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)
 
bool executeAfterSiblingSourceApp () 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 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.
 
const bool _pin_transfer
 Whether pin fields should be transferred instead of subchannel fields.
 
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 _exec_after_source_app_exec
 
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
 

Private Member Functions

virtual bool usesMooseAppCoordTransform () const
 
Point mapBackWithoutCollapsing (MultiAppCoordTransform &transform, const Point &p, const std::string &phase) const
 
void getFromMultiAppInfo ()
 
void getToMultiAppInfo ()
 
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
 

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

std::shared_ptr< MultiApp_from_multi_app
 
std::shared_ptr< MultiApp_to_multi_app
 
std::unique_ptr< MooseAppCoordTransform_from_moose_app_transform
 
std::unique_ptr< MooseAppCoordTransform_to_moose_app_transform
 
const ParallelParamObject_parent
 
const MooseBase_si_moose_base
 
const FEProblemBase_si_problem
 
ExecFlagEnum _empty_execute_enum
 
const RestartableDataMapName _metaname
 
std::string _restartable_name
 

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}
bool isParamSetByUser(const std::string &name) const
const InputParameters & parameters() const
void paramError(const std::string &param, Args... args) const
const T & getParam(const std::string &name) const
bool contains(const std::string &value) const
const bool _pin_transfer
Whether pin fields should be transferred instead of subchannel fields.
const std::vector< AuxVariableName > & _var_names
Variable names to transfer.
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}
virtual void getAppInfo()
MooseEnum _current_direction

◆ getFromNode()

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

Definition at line 233 of file SCMSolutionTransfer.C.

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 channelIndex(const Point &point) const =0
virtual unsigned int pinIndex(const Point &p) const =0
virtual unsigned int getZIndex(const Point &point) const
Get axial index of point.
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.
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.

Referenced by transferNodalVars().

◆ 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 initialSetup() override
std::vector< FEProblemBase * > _to_problems
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.

136{
138
139 FEProblemBase & to_problem = getToMultiApp()->appProblemBase(app_idx);
140 MooseMesh * mesh = NULL;
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}
virtual libMesh::EquationSystems & es() override
virtual std::shared_ptr< const DisplacedProblem > getDisplacedProblem() const
virtual MooseMesh & mesh() override
std::vector< MooseMesh * > _from_meshes
std::vector< FEProblemBase * > _from_problems
bool _displaced_target_mesh
const std::shared_ptr< MultiApp > getToMultiApp() const
Node * getFromNode(const SubChannelMesh &from_mesh, const Point &src_node)
void validateVariableLocations(const SubChannelMesh &from_mesh, FEProblemBase &to_problem)
Base class for subchannel meshes.
static libMesh::System * find_sys(libMesh::EquationSystems &es, const std::string &var_name)
processor_id_type processor_id() const
const Parallel::Communicator & comm() const
virtual void update()
MeshBase & mesh
T & getMesh(MooseMesh &mesh)
function to cast mesh
Definition SCM.h:35
uint8_t dof_id_type
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

Referenced by transferVarsToApp().

◆ transferToMultiApps()

void SCMSolutionTransfer::transferToMultiApps ( )
protected

Definition at line 113 of file SCMSolutionTransfer.C.

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())
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 mooseError(Args &&... args) const
void transferVarsToApp(unsigned int app_idx)

Referenced by execute().

◆ transferVarsToApp()

void SCMSolutionTransfer::transferVarsToApp ( unsigned int  app_idx)
protected

Definition at line 129 of file SCMSolutionTransfer.C.

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

Referenced by transferToMultiApps().

◆ validateVariableLocations()

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

Definition at line 190 of file SCMSolutionTransfer.C.

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}
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
SubdomainID getSubdomainID(const SubdomainName &subdomain_name) const
bool activeOnSubdomain(SubdomainID subdomain) const

Referenced by transferNodalVars().

◆ 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.");
51 "Transfers subchannel or pin solutions from a SubChannel mesh onto a visualization mesh.");
52 return params;
53}
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
static InputParameters validParams()

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: