https://mooseframework.inl.gov
MultiAppTransfer.h
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 
10 #pragma once
11 
12 // MOOSE includes
13 #include "Transfer.h"
14 #include "MultiMooseEnum.h"
15 #include "MultiApp.h"
16 #include "MooseAppCoordTransform.h"
17 
18 #include "libmesh/bounding_box.h"
19 
20 class MooseMesh;
21 
31 class MultiAppTransfer : public Transfer
32 {
33 public:
35 
37 
41  void variableIntegrityCheck(const AuxVariableName & var_name, bool is_from_multiapp) const;
42 
43  void initialSetup() override;
44 
48  const std::shared_ptr<MultiApp> getMultiApp() const
49  {
51  mooseError("Unclear which app you want to retrieve from Transfer ", name());
52  else if (_from_multi_app)
53  return _from_multi_app;
54  else if (_to_multi_app)
55  return _to_multi_app;
56  else if (_multi_app)
57  return _multi_app;
58  else
59  mooseError("Should not get here, there should be a multiapp");
60  }
61 
63  const std::shared_ptr<MultiApp> getFromMultiApp() const
64  {
65  if (!_from_multi_app)
66  mooseError(
67  "A from_multiapp was requested but is unavailable. Check the from_multi_app parameter");
68  else
69  return _from_multi_app;
70  }
71 
73  const std::shared_ptr<MultiApp> getToMultiApp() const
74  {
75  if (!_to_multi_app)
76  mooseError(
77  "A to_multiapp was requested but is unavailable. Check the to_multi_app parameter");
78  else
79  return _to_multi_app;
80  }
81 
86  std::string getFromName() const
87  {
88  if (_from_multi_app)
89  return _from_multi_app->name();
90  else
91  return "Parent";
92  }
93 
98  std::string getToName() const
99  {
100  if (_to_multi_app)
101  return _to_multi_app->name();
102  else
103  return "Parent";
104  }
105 
107  bool hasFromMultiApp() const { return !(!_from_multi_app); }
108 
110  bool hasToMultiApp() const { return !(!_to_multi_app); }
111 
116  virtual void getAppInfo();
117 
122  static void addSkipCoordCollapsingParam(InputParameters & params);
123 
124 protected:
129 
133  static void addBBoxFactorParam(InputParameters & params);
134 
139  static void transformBoundingBox(libMesh::BoundingBox & box,
140  const MultiAppCoordTransform & transform);
141 
143  std::shared_ptr<MultiApp> _multi_app;
144 
145  std::vector<FEProblemBase *> _to_problems;
146  std::vector<FEProblemBase *> _from_problems;
147  std::vector<libMesh::EquationSystems *> _to_es;
148  std::vector<libMesh::EquationSystems *> _from_es;
149  std::vector<MooseMesh *> _to_meshes;
150  std::vector<MooseMesh *> _from_meshes;
151  std::vector<Point> _to_positions;
152  std::vector<Point> _from_positions;
153  std::vector<std::unique_ptr<MultiAppCoordTransform>> _to_transforms;
154  std::vector<std::unique_ptr<MultiAppCoordTransform>> _from_transforms;
155 
159 
164 
174 
176 
186  std::vector<libMesh::BoundingBox> getFromBoundingBoxes();
187  std::vector<libMesh::BoundingBox> getFromBoundingBoxes(BoundaryID boundary_id);
189 
194  std::vector<unsigned int> getFromsPerProc();
195 
200  libMesh::NumericVector<Real> & getTransferVector(unsigned int i_local, std::string var_name);
201 
203  std::vector<unsigned int> _to_local2global_map;
205  std::vector<unsigned int> _from_local2global_map;
206 
208  unsigned int getGlobalSourceAppIndex(unsigned int i_from) const;
210  unsigned int getGlobalTargetAppIndex(unsigned int i_to) const;
213  unsigned int getLocalSourceAppIndex(unsigned int i_from) const;
214 
216  virtual void checkSiblingsTransferSupported() const
217  {
218  mooseError("Siblings transfer not supported. You cannot transfer both from a multiapp to "
219  "another multiapp");
220  }
221 
225  void checkParentAppUserObjectExecuteOn(const std::string & object_name) const;
226 
234  void errorIfObjectExecutesOnTransferInSourceApp(const std::string & object_name) const;
235 
244  Point getPointInTargetAppFrame(const Point & p,
245  unsigned int local_i_to,
246  const std::string & phase) const;
247 
254  void checkMultiAppExecuteOn();
255 
264  void checkVariable(const FEProblemBase & fe_problem,
265  const VariableName & var_name,
266  const std::string & param_name = "") const;
267 
269  void extendBoundingBoxes(const Real factor, std::vector<libMesh::BoundingBox> & bboxes) const;
270 
271 private:
276  virtual bool usesMooseAppCoordTransform() const { return false; }
277 
279  std::shared_ptr<MultiApp> _from_multi_app;
280  std::shared_ptr<MultiApp> _to_multi_app;
281 
282  void getFromMultiAppInfo();
283  void getToMultiAppInfo();
284 
287  std::unique_ptr<MooseAppCoordTransform> _from_moose_app_transform;
288 
291  std::unique_ptr<MooseAppCoordTransform> _to_moose_app_transform;
292 };
libMesh::NumericVector< Real > & getTransferVector(unsigned int i_local, std::string var_name)
If we are transferring to a multiapp, return the appropriate solution vector.
std::vector< std::unique_ptr< MultiAppCoordTransform > > _to_transforms
std::vector< libMesh::EquationSystems * > _to_es
std::unique_ptr< MooseAppCoordTransform > _to_moose_app_transform
The moose coordinate transformation object describing rotations, scaling, and coordinate system of th...
static void transformBoundingBox(libMesh::BoundingBox &box, const MultiAppCoordTransform &transform)
Transform a bounding box according to the transformations in the provided coordinate transformation o...
const std::shared_ptr< MultiApp > getFromMultiApp() const
Get the MultiApp to transfer data from.
const bool _skip_coordinate_collapsing
Whether to skip coordinate collapsing (transformations of coordinates between applications using diff...
void variableIntegrityCheck(const AuxVariableName &var_name, bool is_from_multiapp) const
Utility to verify that the variable in the destination system exists.
unsigned int getLocalSourceAppIndex(unsigned int i_from) const
Return the local app index from the global index in the "from-multiapp" transfer direction We use the...
static void addUserObjectExecutionCheckParam(InputParameters &params)
Add the execution order check parameter (to skip the warning if needed)
const InputParameters & parameters() const
Get the parameters of the object.
Definition: MooseBase.h:127
void checkMultiAppExecuteOn()
Helper method for checking the &#39;check_multiapp_execute_on&#39; flag.
std::shared_ptr< MultiApp > _from_multi_app
The MultiApps this Transfer is transferring data to or from.
MultiAppTransfer(const InputParameters &parameters)
std::vector< libMesh::BoundingBox > getFromBoundingBoxes()
Return the bounding boxes of all the "from" domains, including all the domains not local to this proc...
std::vector< FEProblemBase * > _to_problems
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
void checkParentAppUserObjectExecuteOn(const std::string &object_name) const
Checks the execute_on flags for user object transfers with user objects on the source app which is al...
const std::shared_ptr< MultiApp > getToMultiApp() const
Get the MultiApp to transfer data to.
std::vector< Point > _from_positions
std::shared_ptr< MultiApp > _multi_app
Deprecated class attribute for compatibility with the apps.
bool hasFromMultiApp() const
Whether the transfer owns a non-null from_multi_app.
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
Point getPointInTargetAppFrame(const Point &p, unsigned int local_i_to, const std::string &phase) const
Get the target app point from a point in the reference frame.
std::vector< unsigned int > _to_local2global_map
Given local app index, returns global app index.
void checkVariable(const FEProblemBase &fe_problem, const VariableName &var_name, const std::string &param_name="") const
Helper for checking a problem for a variable.
unsigned int getGlobalTargetAppIndex(unsigned int i_to) const
Return the global app index from the local index in the "to-multiapp" transfer direction.
bool _displaced_target_mesh
True if displaced mesh is used for the target mesh, otherwise false.
virtual bool usesMooseAppCoordTransform() const
Whether this transfer handles non-translation-based transformations, e.g.
const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:99
std::vector< libMesh::EquationSystems * > _from_es
std::vector< MooseMesh * > _from_meshes
void errorIfObjectExecutesOnTransferInSourceApp(const std::string &object_name) const
Error if executing this MooseObject on EXEC_TRANSFER in a source multiapp (from_multiapp, e.g.
void initialSetup() override
Method called at the beginning of the simulation for checking integrity or doing one-time setup...
boundary_id_type BoundaryID
std::unique_ptr< MooseAppCoordTransform > _from_moose_app_transform
The moose coordinate transformation object describing rotations, scaling, and coordinate system of th...
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition: MooseMesh.h:88
std::vector< unsigned int > getFromsPerProc()
Return the number of "from" domains that each processor owns.
unsigned int getGlobalSourceAppIndex(unsigned int i_from) const
Return the global app index from the local index in the "from-multiapp" transfer direction.
std::shared_ptr< MultiApp > _to_multi_app
static InputParameters validParams()
std::string getFromName() const
Get the name of thing being transferred from.
std::string getToName() const
Get the name of thing being transferred to.
std::vector< Point > _to_positions
const std::shared_ptr< MultiApp > getMultiApp() const
Use this getter to obtain the MultiApp for transfers with a single direction.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Base class for all MultiAppTransfer objects.
Real _bbox_factor
Extend (or contract) bounding box by a factor in all directions Greater than one values of this membe...
std::vector< std::unique_ptr< MultiAppCoordTransform > > _from_transforms
bool hasToMultiApp() const
Whether the transfer owns a non-null to_multi_app.
bool _displaced_source_mesh
True if displaced mesh is used for the source mesh, otherwise false.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
Definition: MooseBase.h:267
std::vector< unsigned int > _from_local2global_map
Given local app index, returns global app index.
static void addBBoxFactorParam(InputParameters &params)
Add the bounding box factor parameter to the supplied input parameters.
static void addSkipCoordCollapsingParam(InputParameters &params)
Add the option to skip coordinate collapsing in coordinate transformation operations Note: this is us...
void extendBoundingBoxes(const Real factor, std::vector< libMesh::BoundingBox > &bboxes) const
Extends bounding boxes to avoid missing points.
virtual void checkSiblingsTransferSupported() const
Whether the transfer supports siblings transfer.
virtual void getAppInfo()
This method will fill information into the convenience member variables (_to_problems, _from_meshes, etc.)
std::vector< FEProblemBase * > _from_problems
std::vector< MooseMesh * > _to_meshes
This class contains transformation information that only exists in a context in which there are multi...
Base class for all Transfer objects.
Definition: Transfer.h:36