LCOV - code coverage report
Current view: top level - src/physics - CoupledInjectionProductionPhysics.C (source / functions) Hit Total Coverage
Test: idaholab/moose porous_flow: #32971 (54bef8) with base c6cf66 Lines: 71 72 98.6 %
Date: 2026-05-29 20:38:56 Functions: 9 9 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.14