https://mooseframework.inl.gov
SCMSolutionTransferBase.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 #include "MultiApp.h"
12 #include "FEProblemBase.h"
13 #include "DisplacedProblem.h"
14 #include "SubChannelMesh.h"
15 
18 {
20  params.addRequiredParam<std::vector<AuxVariableName>>("variable",
21  "The auxiliary variables to transfer.");
22  return params;
23 }
24 
26  : MultiAppTransfer(parameters), _var_names(getParam<std::vector<AuxVariableName>>("variable"))
27 {
29  paramError("from_multiapp", "This transfer works only into multi-app.");
30 }
31 
32 void
34 {
36  for (std::size_t var_index = 0; var_index < _var_names.size(); ++var_index)
37  {
38  // No local app, we cannot examine the target variable
39  if (_to_problems.empty())
40  continue;
41 
42  // Check source variable on regular subchannel problem
44  0, _var_names[var_index], Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY);
45  System & from_sys = from_var.sys().system();
46  const auto & fe_type = from_sys.variable_type(from_var.number());
47 
48  if (fe_type.family != LAGRANGE || fe_type.order != FIRST)
49  paramError("variable",
50  "This transfer requires a first order Lagrange variable for the source variable");
51 
52  // Check target variable in visualization mesh
53  MooseVariableFieldBase & to_var = _to_problems[0]->getVariable(
54  0, _var_names[var_index], Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY);
55 
56  System & to_sys = to_var.sys().system();
57  const auto & fe_type_target = to_sys.variable_type(to_var.number());
58 
59  if (fe_type_target.family != LAGRANGE || fe_type_target.order != FIRST)
60  paramError("variable",
61  "This transfer requires a first order Lagrange variable for the source variable");
62  }
63 }
64 
65 void
67 {
68  TIME_SECTION(
69  "MultiAppDetailedSolutionBaseTransfer::execute()", 5, "Transferring subchannel solutions");
70  getAppInfo();
71 
72  switch (_current_direction)
73  {
74  case TO_MULTIAPP:
76  break;
77 
78  default:
79  break;
80  }
81 }
82 
83 void
85 {
86  mooseAssert(_from_meshes.size() == 1, "Only one source mesh can be active in this transfer.");
87  if (dynamic_cast<SubChannelMesh *>(_from_meshes[0]) == nullptr)
88  mooseError("This transfer works only with SubChannelMesh classes.");
89 
90  for (unsigned int i = 0; i < getToMultiApp()->numGlobalApps(); i++)
91  if (getToMultiApp()->hasLocalApp(i))
93 }
94 
95 void
97 {
98  transferNodalVars(app_idx);
99 }
100 
101 void
103 {
105 
106  FEProblemBase & to_problem = getToMultiApp()->appProblemBase(app_idx);
107  MooseMesh * mesh = NULL;
108  if (_displaced_target_mesh && to_problem.getDisplacedProblem())
109  mesh = &to_problem.getDisplacedProblem()->mesh();
110  else
111  mesh = &to_problem.mesh();
112 
113  const SubChannelMesh & from_mesh = dynamic_cast<SubChannelMesh &>(*_from_meshes[0]);
114  FEProblemBase & from_problem = *_from_problems[0];
115 
116  for (auto & node : mesh->getMesh().local_node_ptr_range())
117  {
118  // No local data to send
119  if (processor_id() != 0)
120  continue;
121  Node * from_node = getFromNode(from_mesh, *node);
122 
123  for (auto & var_name : _var_names)
124  {
125  System * to_sys = find_sys(to_problem.es(), var_name);
126  unsigned int to_sys_num = to_sys->number();
127  unsigned int to_var_num = to_sys->variable_number(var_name);
128 
129  if (node->n_dofs(to_sys_num, to_var_num) > 0)
130  {
131  System * from_sys = find_sys(from_problem.es(), var_name);
132  unsigned int from_sys_num = from_sys->number();
133  unsigned int from_var_num = from_sys->variable_number(var_name);
134 
135  swapper.forceSwap();
136  NumericVector<Real> * from_solution = from_sys->solution.get();
137  dof_id_type from_dof = from_node->dof_number(from_sys_num, from_var_num, 0);
138  Real from_value = (*from_solution)(from_dof);
139  swapper.forceSwap();
140 
141  NumericVector<Real> & to_solution = getToMultiApp()->appTransferVector(app_idx, var_name);
142  dof_id_type to_dof = node->dof_number(to_sys_num, to_var_num, 0);
143  to_solution.set(to_dof, from_value);
144  }
145  }
146  }
147 
148  for (auto & var_name : _var_names)
149  {
150  getToMultiApp()->appTransferVector(app_idx, var_name).close();
151  find_sys(to_problem.es(), var_name)->update();
152  }
153 }
LAGRANGE
void paramError(const std::string &param, Args... args) const
MooseEnum _current_direction
unsigned int number() const
FIRST
virtual void execute() override
virtual libMesh::System & system()=0
const std::vector< AuxVariableName > & _var_names
Variable names to transfer.
MeshBase & mesh
std::vector< FEProblemBase *> _to_problems
SCMSolutionTransferBase(const InputParameters &parameters)
const Parallel::Communicator & comm() const
const std::shared_ptr< MultiApp > getToMultiApp() const
void transferNodalVars(unsigned int app_idx)
void addRequiredParam(const std::string &name, const std::string &doc_string)
bool _displaced_target_mesh
bool contains(const std::string &value) const
unsigned int number() const
std::vector< MooseMesh *> _from_meshes
void initialSetup() override
virtual libMesh::EquationSystems & es() override
static libMesh::System * find_sys(libMesh::EquationSystems &es, const std::string &var_name)
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
static InputParameters validParams()
void transferToMultiApps()
Do the transfer into the sub-app.
SubProblem & _subproblem
static InputParameters validParams()
const FEType & variable_type(const unsigned int i) const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual std::shared_ptr< const DisplacedProblem > getDisplacedProblem() const
MultiMooseEnum _directions
virtual MooseMesh & mesh() override
void mooseError(Args &&... args) const
void transferVarsToApp(unsigned int app_idx)
Transfer variables into the sub-app.
Base class for subchannel meshes.
processor_id_type processor_id() const
virtual void getAppInfo()
SystemBase & sys()
virtual Node * getFromNode(const SubChannelMesh &from_mesh, const Point &src_node)=0
Find node on computational mesh given the visualization point.
std::vector< FEProblemBase *> _from_problems
uint8_t dof_id_type