https://mooseframework.inl.gov
CoupledInjectionProductionPhysics.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 
13 registerMooseAction("PorousFlowApp", CoupledInjectionProductionPhysics, "add_dirac_kernel");
14 registerMooseAction("PorousFlowApp", CoupledInjectionProductionPhysics, "add_postprocessor");
15 registerMooseAction("PorousFlowApp", CoupledInjectionProductionPhysics, "add_transfer");
16 
19 {
21 
22  params.addRequiredParam<std::vector<Point>>("injection_points", "List of injection points [m]");
23  params.addRequiredParam<std::vector<Point>>("production_points", "List of production points [m]");
24  params.addParam<MultiAppName>("multi_app", "MultiApp to transfer to and from");
25 
26  params.addClassDescription(
27  "Adds objects to perform hydrodynamic coupling at injection and production points.");
28 
29  return params;
30 }
31 
33  const InputParameters & parameters)
34  : PhysicsBase(parameters),
35  _injection_points(getParam<std::vector<Point>>("injection_points")),
36  _production_points(getParam<std::vector<Point>>("production_points"))
37 {
39  _points.insert(_points.end(), _production_points.begin(), _production_points.end());
40 
41  for (const auto i : index_range(_injection_points))
42  _labels.push_back("inj" + std::to_string(i + 1));
43  for (const auto i : index_range(_production_points))
44  _labels.push_back("pro" + std::to_string(i + 1));
45 }
46 
47 void
49 {
50  for (const auto i : index_range(_points))
51  {
52  addPPSourceDiracKernel(_points[i], "porepressure", "mass_rate_" + _labels[i]);
53  addPPSourceDiracKernel(_points[i], "temperature", "energy_rate_" + _labels[i]);
54  }
55 }
56 
57 void
59 {
60  for (const auto i : index_range(_points))
61  {
62  addPointValuePostprocessor("porepressure", _points[i], "p_" + _labels[i]);
63  addPointValuePostprocessor("temperature", _points[i], "T_" + _labels[i]);
64  addReceiverPostprocessor("mass_rate_" + _labels[i]);
65  addReceiverPostprocessor("energy_rate_" + _labels[i]);
66  }
67 }
68 
69 void
71 {
72  if (isParamValid("multi_app"))
73  for (const auto i : index_range(_points))
74  {
75  addPostprocessorTransfer("p_" + _labels[i], false);
76  addPostprocessorTransfer("T_" + _labels[i], false);
77  addPostprocessorTransfer("mass_rate_" + _labels[i], true);
78  addPostprocessorTransfer("energy_rate_" + _labels[i], true);
79  }
80 }
81 
82 void
84  const NonlinearVariableName & var,
85  const PostprocessorName & pp_name)
86 {
87  const std::string class_name = "PorousFlowPointSourceFromPostprocessor";
88  auto params = _factory.getValidParams(class_name);
89  params.set<NonlinearVariableName>("variable") = var;
90  params.set<Point>("point") = point;
91  params.set<PostprocessorName>("mass_flux") = pp_name;
92  getProblem().addDiracKernel(class_name, "dirac_" + pp_name, params);
93 }
94 
95 void
97 {
98  const std::string class_name = "Receiver";
99  auto params = _factory.getValidParams(class_name);
100  getProblem().addPostprocessor(class_name, pp_name, params);
101 }
102 
103 void
105  const Point & point,
106  const PostprocessorName & pp_name)
107 {
108  const std::string class_name = "PointValue";
109  auto params = _factory.getValidParams(class_name);
110  params.set<VariableName>("variable") = var;
111  params.set<Point>("point") = point;
112  params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
113  getProblem().addPostprocessor(class_name, pp_name, params);
114 }
115 
116 void
118  bool from_multi_app)
119 {
120  const std::string class_name = "MultiAppPostprocessorTransfer";
121  auto params = _factory.getValidParams(class_name);
122  if (from_multi_app)
123  params.set<MultiAppName>("from_multi_app") = getParam<MultiAppName>("multi_app");
124  else
125  params.set<MultiAppName>("to_multi_app") = getParam<MultiAppName>("multi_app");
126  params.set<PostprocessorName>("from_postprocessor") = pp_name;
127  params.set<PostprocessorName>("to_postprocessor") = pp_name;
128  params.set<MooseEnum>("reduction_type") = "average";
129  params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
130  getProblem().addTransfer(class_name, pp_name + "_transfer", params);
131 }
std::vector< std::string > _labels
Label for each point.
virtual void addTransfer(const std::string &transfer_name, const std::string &name, InputParameters &parameters)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
Factory & _factory
T & set(const std::string &name, bool quiet_mode=false)
const std::vector< Point > & _injection_points
Injection points.
CoupledInjectionProductionPhysics(const InputParameters &parameters)
InputParameters getValidParams(const std::string &name) const
const ExecFlagType EXEC_TIMESTEP_END
Adds objects to perform hydrodynamic coupling at injection and production points. ...
void addPointValuePostprocessor(const VariableName &var, const Point &point, const PostprocessorName &pp_name)
Adds a PointValue.
void addReceiverPostprocessor(const PostprocessorName &pp_name)
Adds a Receiver.
void addRequiredParam(const std::string &name, const std::string &doc_string)
virtual FEProblemBase & getProblem()
virtual void addPostprocessor(const std::string &pp_name, const std::string &name, InputParameters &parameters)
void addPostprocessorTransfer(const PostprocessorName &pp_name, bool from_multi_app)
Adds a MultiAppPostprocessorTransfer.
std::vector< Point > _points
Injection and production points.
registerPhysicsBaseTasks("PorousFlowApp", CoupledInjectionProductionPhysics)
const std::vector< Point > & _production_points
Production points.
void addPPSourceDiracKernel(const Point &point, const NonlinearVariableName &var, const PostprocessorName &pp_name)
Adds a PorousFlowPointSourceFromPostprocessor.
static InputParameters validParams()
void addClassDescription(const std::string &doc_string)
bool isParamValid(const std::string &name) const
registerMooseAction("PorousFlowApp", CoupledInjectionProductionPhysics, "add_dirac_kernel")
auto index_range(const T &sizable)
virtual void addDiracKernel(const std::string &kernel_name, const std::string &name, InputParameters &parameters)
const ExecFlagType EXEC_INITIAL