OGS
CreateTwoPhaseFlowMaterialProperties.cpp
Go to the documentation of this file.
1 
11 
12 #include "BaseLib/Algorithm.h"
13 #include "BaseLib/Logging.h"
20 #include "MeshLib/Mesh.h"
21 #include "MeshLib/PropertyVector.h"
22 #include "ParameterLib/Parameter.h"
25 
26 namespace MaterialLib
27 {
28 namespace TwoPhaseFlowWithPP
29 {
30 std::tuple<std::unique_ptr<TwoPhaseFlowWithPPMaterialProperties>,
33  BaseLib::ConfigTree const& config,
34  MeshLib::PropertyVector<int> const* material_ids,
35  std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters)
36 {
37  DBUG("Reading material properties of two-phase flow process.");
38 
40  auto fluid_config = config.getConfigSubtree("fluid");
41 
42  // Get fluid properties
44  auto const& rho_conf = fluid_config.getConfigSubtree("liquid_density");
45  auto liquid_density = MaterialLib::Fluid::createFluidDensityModel(rho_conf);
47  auto const& rho_gas_conf = fluid_config.getConfigSubtree("gas_density");
48  auto gas_density =
51  auto const& mu_conf = fluid_config.getConfigSubtree("liquid_viscosity");
52  auto liquid_viscosity = MaterialLib::Fluid::createViscosityModel(mu_conf);
54  auto const& mu_gas_conf = fluid_config.getConfigSubtree("gas_viscosity");
55  auto gas_viscosity = MaterialLib::Fluid::createViscosityModel(mu_gas_conf);
56 
57  // Get porous properties
58  std::vector<int> mat_ids;
59  std::vector<int> mat_krel_ids;
60  std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
61  intrinsic_permeability_models;
62  std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
63  porosity_models;
64  std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
65  storage_models;
66  std::vector<
67  std::unique_ptr<MaterialLib::PorousMedium::CapillaryPressureSaturation>>
68  capillary_pressure_models;
69  std::vector<
70  std::unique_ptr<MaterialLib::PorousMedium::RelativePermeability>>
71  relative_permeability_models;
72 
74  auto const& poro_config = config.getConfigSubtree("porous_medium");
76  for (auto const& conf : poro_config.getConfigSubtreeList("porous_medium"))
77  {
79  auto const id = conf.getConfigAttributeOptional<int>("id");
80  mat_ids.push_back(*id);
81 
83  auto const& permeability_conf = conf.getConfigSubtree("permeability");
84  intrinsic_permeability_models.emplace_back(
86  permeability_conf, parameters));
87 
89  auto const& porosity_conf = conf.getConfigSubtree("porosity");
91  parameters);
92  porosity_models.emplace_back(std::move(n));
93 
95  auto const& storage_conf = conf.getConfigSubtree("storage");
97  storage_models.emplace_back(std::move(beta));
98 
99  auto const& capillary_pressure_conf =
101  conf.getConfigSubtree("capillary_pressure");
103  capillary_pressure_conf);
104  capillary_pressure_models.emplace_back(std::move(pc));
105 
106  auto const& krel_config =
108  conf.getConfigSubtree("relative_permeability");
109  for (
110  auto const& krel_conf :
112  krel_config.getConfigSubtreeList("relative_permeability"))
113  {
114  auto const krel_id =
116  krel_conf.getConfigAttributeOptional<int>("id");
117  mat_krel_ids.push_back(*krel_id);
118  auto krel_n =
120  krel_conf);
121  relative_permeability_models.emplace_back(std::move(krel_n));
122  }
123  BaseLib::reorderVector(relative_permeability_models, mat_krel_ids);
124  }
125 
126  BaseLib::reorderVector(intrinsic_permeability_models, mat_ids);
127  BaseLib::reorderVector(porosity_models, mat_ids);
128  BaseLib::reorderVector(storage_models, mat_ids);
129 
130  return std::forward_as_tuple(
131  std::make_unique<TwoPhaseFlowWithPPMaterialProperties>(
132  material_ids, std::move(liquid_density),
133  std::move(liquid_viscosity), std::move(gas_density),
134  std::move(gas_viscosity), std::move(intrinsic_permeability_models),
135  std::move(porosity_models), std::move(storage_models),
136  std::move(capillary_pressure_models),
137  std::move(relative_permeability_models)),
138  std::move(fluid_config));
139 }
140 
141 } // namespace TwoPhaseFlowWithPP
142 } // namespace MaterialLib
void DBUG(char const *fmt, Args const &... args)
Definition: Logging.h:27
Definition of the Mesh class.
Definition of the PiecewiseLinearInterpolation class.
ConfigTree getConfigSubtree(std::string const &root) const
Definition: ConfigTree.cpp:146
std::optional< T > getConfigAttributeOptional(std::string const &attr) const
void reorderVector(std::vector< ValueType > &v, std::vector< IndexType > const &order)
Definition: Algorithm.h:232
std::unique_ptr< FluidProperty > createFluidDensityModel(BaseLib::ConfigTree const &config)
std::unique_ptr< FluidProperty > createViscosityModel(BaseLib::ConfigTree const &config)
std::unique_ptr< RelativePermeability > createRelativePermeabilityModel(BaseLib::ConfigTree const &config)
std::unique_ptr< CapillaryPressureSaturation > createCapillaryPressureModel(BaseLib::ConfigTree const &config)
std::unique_ptr< Permeability > createPermeabilityModel(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const &parameters)
std::unique_ptr< Porosity > createPorosityModel(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const &parameters)
std::unique_ptr< Storage > createStorageModel(BaseLib::ConfigTree const &config)
std::tuple< std::unique_ptr< TwoPhaseFlowWithPPMaterialProperties >, BaseLib::ConfigTree > createTwoPhaseFlowMaterialProperties(BaseLib::ConfigTree const &config, MeshLib::PropertyVector< int > const *material_ids, std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const &parameters)