OGS
CreateTwoPhaseFlowWithPrhoProcess.cpp
Go to the documentation of this file.
1 
11 
12 #include <cassert>
13 
14 #include "ParameterLib/Utils.h"
21 
22 namespace ProcessLib
23 {
24 namespace TwoPhaseFlowWithPrho
25 {
26 std::unique_ptr<Process> createTwoPhaseFlowWithPrhoProcess(
27  std::string name,
28  MeshLib::Mesh& mesh,
29  std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
30  std::vector<ProcessVariable> const& variables,
31  std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
32  unsigned const integration_order,
33  BaseLib::ConfigTree const& config,
34  std::map<std::string,
35  std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
36  curves)
37 {
39  config.checkConfigParameter("type", "TWOPHASE_FLOW_PRHO");
40 
41  DBUG("Create TwoPhaseFlowProcess with Prho model.");
43  auto const pv_config = config.getConfigSubtree("process_variables");
44 
45  auto per_process_variables = findProcessVariables(
46  variables, pv_config,
47  {
48  "liquid_pressure",
50  "overall_mass_density"});
51  std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
52  process_variables;
53  process_variables.push_back(std::move(per_process_variables));
54 
55  SecondaryVariableCollection secondary_variables;
56 
57  ProcessLib::createSecondaryVariables(config, secondary_variables);
58  // Specific body force
59  std::vector<double> const b =
61  config.getConfigParameter<std::vector<double>>("specific_body_force");
62  assert(!b.empty() && b.size() < 4);
63  Eigen::VectorXd specific_body_force(b.size());
64  bool const has_gravity = MathLib::toVector(b).norm() > 0;
65  if (has_gravity)
66  {
67  std::copy_n(b.data(), b.size(), specific_body_force.data());
68  }
69 
71  auto const mass_lumping = config.getConfigParameter<bool>("mass_lumping");
72  // diffusion coeff
73  auto const& diff_coeff_b = ParameterLib::findParameter<double>(
74  config,
76  "diffusion_coeff_component_b", parameters, 1, &mesh);
77  auto const& diff_coeff_a = ParameterLib::findParameter<double>(
78  config,
80  "diffusion_coeff_component_a", parameters, 1, &mesh);
81  auto const& temperature = ParameterLib::findParameter<double>(
82  config,
84  "temperature", parameters, 1, &mesh);
85 
87  auto const& mat_config = config.getConfigSubtree("material_property");
88 
89  auto const material_ids = materialIDs(mesh);
90  if (material_ids != nullptr)
91  {
92  INFO("The twophase flow is in heterogeneous porous media.");
93  }
94  else
95  {
96  INFO("The twophase flow is in homogeneous porous media.");
97  }
98 
99  std::unique_ptr<TwoPhaseFlowWithPrhoMaterialProperties> material =
100  createTwoPhaseFlowPrhoMaterialProperties(mat_config, material_ids,
101  parameters);
102 
103  TwoPhaseFlowWithPrhoProcessData process_data{
104  specific_body_force, has_gravity, mass_lumping, diff_coeff_b,
105  diff_coeff_a, temperature, std::move(material)};
106 
107  return std::make_unique<TwoPhaseFlowWithPrhoProcess>(
108  std::move(name), mesh, std::move(jacobian_assembler), parameters,
109  integration_order, std::move(process_variables),
110  std::move(process_data), std::move(secondary_variables), mat_config,
111  curves);
112 }
113 
114 } // namespace TwoPhaseFlowWithPrho
115 } // namespace ProcessLib
void INFO(char const *fmt, Args const &... args)
Definition: Logging.h:32
void DBUG(char const *fmt, Args const &... args)
Definition: Logging.h:27
void checkConfigParameter(std::string const &param, T const &value) const
T getConfigParameter(std::string const &param) const
ConfigTree getConfigSubtree(std::string const &root) const
Definition: ConfigTree.cpp:146
Handles configuration of several secondary variables from the project file.
Eigen::Map< const Vector > toVector(std::vector< double > const &data, Eigen::VectorXd::Index size)
Creates an Eigen mapped vector from the given data vector.
PropertyVector< int > const * materialIDs(Mesh const &mesh)
Definition: Mesh.cpp:258
std::unique_ptr< TwoPhaseFlowWithPrhoMaterialProperties > createTwoPhaseFlowPrhoMaterialProperties(BaseLib::ConfigTree const &config, MeshLib::PropertyVector< int > const *const material_ids, std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const &parameters)
std::unique_ptr< Process > createTwoPhaseFlowWithPrhoProcess(std::string name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< ProcessVariable > const &variables, std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const &parameters, unsigned const integration_order, BaseLib::ConfigTree const &config, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation >> const &curves)
std::vector< std::reference_wrapper< ProcessVariable > > findProcessVariables(std::vector< ProcessVariable > const &variables, BaseLib::ConfigTree const &pv_config, std::initializer_list< std::string > tags)
void createSecondaryVariables(BaseLib::ConfigTree const &config, SecondaryVariableCollection &secondary_variables)