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 
109  static void addSkipCoordCollapsingParam(InputParameters & params);
110 
112  bool hasFromMultiApp() const { return !(!_from_multi_app); }
113 
115  bool hasToMultiApp() const { return !(!_to_multi_app); }
116 
121  virtual void getAppInfo();
122 
123 protected:
127  static void addBBoxFactorParam(InputParameters & params);
128 
133  static void transformBoundingBox(libMesh::BoundingBox & box,
134  const MultiAppCoordTransform & transform);
135 
137  std::shared_ptr<MultiApp> _multi_app;
138 
139  std::vector<FEProblemBase *> _to_problems;
140  std::vector<FEProblemBase *> _from_problems;
141  std::vector<libMesh::EquationSystems *> _to_es;
142  std::vector<libMesh::EquationSystems *> _from_es;
143  std::vector<MooseMesh *> _to_meshes;
144  std::vector<MooseMesh *> _from_meshes;
145  std::vector<Point> _to_positions;
146  std::vector<Point> _from_positions;
147  std::vector<std::unique_ptr<MultiAppCoordTransform>> _to_transforms;
148  std::vector<std::unique_ptr<MultiAppCoordTransform>> _from_transforms;
149 
153 
158 
168 
170 
180  std::vector<libMesh::BoundingBox> getFromBoundingBoxes();
181  std::vector<libMesh::BoundingBox> getFromBoundingBoxes(BoundaryID boundary_id);
183 
188  std::vector<unsigned int> getFromsPerProc();
189 
194  libMesh::NumericVector<Real> & getTransferVector(unsigned int i_local, std::string var_name);
195 
197  std::vector<unsigned int> _to_local2global_map;
199  std::vector<unsigned int> _from_local2global_map;
200 
202  unsigned int getGlobalSourceAppIndex(unsigned int i_from) const;
204  unsigned int getGlobalTargetAppIndex(unsigned int i_to) const;
207  unsigned int getLocalSourceAppIndex(unsigned int i_from) const;
208 
210  virtual void checkSiblingsTransferSupported() const
211  {
212  mooseError("Siblings transfer not supported. You cannot transfer both from a multiapp to "
213  "another multiapp");
214  }
215 
223  void errorIfObjectExecutesOnTransferInSourceApp(const std::string & object_name) const;
224 
233  Point getPointInTargetAppFrame(const Point & p,
234  unsigned int local_i_to,
235  const std::string & phase) const;
236 
243  void checkMultiAppExecuteOn();
244 
253  void checkVariable(const FEProblemBase & fe_problem,
254  const VariableName & var_name,
255  const std::string & param_name = "") const;
256 
258  void extendBoundingBoxes(const Real factor, std::vector<libMesh::BoundingBox> & bboxes) const;
259 
260 private:
265  virtual bool usesMooseAppCoordTransform() const { return false; }
266 
268  std::shared_ptr<MultiApp> _from_multi_app;
269  std::shared_ptr<MultiApp> _to_multi_app;
270 
271  void getFromMultiAppInfo();
272  void getToMultiAppInfo();
273 
276  std::unique_ptr<MooseAppCoordTransform> _from_moose_app_transform;
277 
280  std::unique_ptr<MooseAppCoordTransform> _to_moose_app_transform;
281 };
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...
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...
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.
virtual const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:57
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.
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.
std::vector< unsigned int > _from_local2global_map
Given local app index, returns global app index.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
static void addBBoxFactorParam(InputParameters &params)
Add the bounding box factor parameter to the supplied input parameters.
const InputParameters & parameters() const
Get the parameters of the object.
static void addSkipCoordCollapsingParam(InputParameters &params)
Add the option to skip coordinate collapsing in coordinate transformation operations.
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