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  // Check source variable on regular subchannel problem
40  0, _var_names[var_index], Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY);
41  System & from_sys = from_var.sys().system();
42  const auto & fe_type = from_sys.variable_type(from_var.number());
43 
44  if (fe_type.family != LAGRANGE || fe_type.order != FIRST)
45  paramError("variable",
46  "This transfer requires a first order Lagrange variable for the source variable");
47 
48  // Check target variable in visualization mesh
49  MooseVariableFieldBase & to_var = _to_problems[0]->getVariable(
50  0, _var_names[var_index], Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY);
51 
52  System & to_sys = to_var.sys().system();
53  const auto & fe_type_target = to_sys.variable_type(to_var.number());
54 
55  if (fe_type_target.family != LAGRANGE || fe_type_target.order != FIRST)
56  paramError("variable",
57  "This transfer requires a first order Lagrange variable for the source variable");
58  }
59 }
60 
61 void
63 {
64  TIME_SECTION(
65  "MultiAppDetailedSolutionBaseTransfer::execute()", 5, "Transferring subchannel solutions");
66  getAppInfo();
67 
68  switch (_current_direction)
69  {
70  case TO_MULTIAPP:
72  break;
73 
74  default:
75  break;
76  }
77 }
78 
79 void
81 {
82  mooseAssert(_from_meshes.size() == 1, "Only one source mesh can be active in this transfer.");
83  if (dynamic_cast<SubChannelMesh *>(_from_meshes[0]) == nullptr)
84  mooseError("This transfer works only with SubChannelMesh classes.");
85 
86  for (unsigned int i = 0; i < getToMultiApp()->numGlobalApps(); i++)
87  if (getToMultiApp()->hasLocalApp(i))
89 }
90 
91 void
93 {
94  transferNodalVars(app_idx);
95 }
96 
97 void
99 {
101 
102  FEProblemBase & to_problem = getToMultiApp()->appProblemBase(app_idx);
103  MooseMesh * mesh = NULL;
104  if (_displaced_target_mesh && to_problem.getDisplacedProblem())
105  mesh = &to_problem.getDisplacedProblem()->mesh();
106  else
107  mesh = &to_problem.mesh();
108 
109  const SubChannelMesh & from_mesh = dynamic_cast<SubChannelMesh &>(*_from_meshes[0]);
110  FEProblemBase & from_problem = *_from_problems[0];
111 
112  for (auto & node : mesh->getMesh().local_node_ptr_range())
113  {
114  Node * from_node = getFromNode(from_mesh, *node);
115 
116  for (auto & var_name : _var_names)
117  {
118  System * to_sys = find_sys(to_problem.es(), var_name);
119  unsigned int to_sys_num = to_sys->number();
120  unsigned int to_var_num = to_sys->variable_number(var_name);
121 
122  if (node->n_dofs(to_sys_num, to_var_num) > 0)
123  {
124  System * from_sys = find_sys(from_problem.es(), var_name);
125  unsigned int from_sys_num = from_sys->number();
126  unsigned int from_var_num = from_sys->variable_number(var_name);
127 
128  swapper.forceSwap();
129  NumericVector<Real> * from_solution = from_sys->solution.get();
130  dof_id_type from_dof = from_node->dof_number(from_sys_num, from_var_num, 0);
131  Real from_value = (*from_solution)(from_dof);
132  swapper.forceSwap();
133 
134  NumericVector<Real> & to_solution = getToMultiApp()->appTransferVector(app_idx, var_name);
135  dof_id_type to_dof = node->dof_number(to_sys_num, to_var_num, 0);
136  to_solution.set(to_dof, from_value);
137  }
138  }
139  }
140 
141  for (auto & var_name : _var_names)
142  {
143  getToMultiApp()->appTransferVector(app_idx, var_name).close();
144  find_sys(to_problem.es(), var_name)->update();
145  }
146 }
LAGRANGE
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)
void paramError(const std::string &param, Args... args) const
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 transferVarsToApp(unsigned int app_idx)
Transfer variables into the sub-app.
void mooseError(Args &&... args) const
Base class for subchannel meshes.
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