OGS
CreatePorousMediaProperties.cpp
Go to the documentation of this file.
1 
12 
13 #include "BaseLib/Algorithm.h"
14 #include "MeshLib/Mesh.h"
18 
19 namespace MaterialLib
20 {
21 namespace PorousMedium
22 {
24  MeshLib::Mesh& mesh, BaseLib::ConfigTree const& configs,
25  std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters)
26 {
27  DBUG("Create PorousMediaProperties.");
28 
29  auto const& porous_medium_configs =
31  configs.getConfigSubtree("porous_medium");
32 
33  std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
34  intrinsic_permeability_models;
35  std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
36  porosity_models;
37  std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
38  storage_models;
39 
40  std::vector<int> mat_ids;
41  for (auto const& porous_medium_config :
43  porous_medium_configs.getConfigSubtreeList("porous_medium"))
44  {
46  auto const id = porous_medium_config.getConfigAttribute<int>("id");
47  mat_ids.push_back(id);
48 
49  auto const& porosity_config =
51  porous_medium_config.getConfigSubtree("porosity");
52  porosity_models.emplace_back(
54  parameters));
55 
56  // Configuration for the intrinsic permeability (only one scalar per
57  // element, i.e., the isotropic case is handled at the moment)
58  auto const& permeability_config =
60  porous_medium_config.getConfigSubtree("permeability");
61  intrinsic_permeability_models.emplace_back(
63  permeability_config, parameters));
64 
65  // Configuration for the specific storage.
66  auto const& storage_config =
68  porous_medium_config.getConfigSubtree("storage");
69  storage_models.emplace_back(
71  }
72 
73  BaseLib::reorderVector(intrinsic_permeability_models, mat_ids);
74  BaseLib::reorderVector(porosity_models, mat_ids);
75  BaseLib::reorderVector(storage_models, mat_ids);
76 
77  auto const material_ids = materialIDs(mesh);
78  int const max_material_id =
79  !material_ids
80  ? 0
81  : *std::max_element(begin(*material_ids), end(*material_ids));
82 
83  if (max_material_id > static_cast<int>(mat_ids.size() - 1))
84  {
85  OGS_FATAL(
86  "The maximum value of MaterialIDs in mesh is {:d}. As the "
87  "given number of porous media definitions in the project file is "
88  "{:d}, the maximum value of MaterialIDs in mesh must be {:d} "
89  "(index starts with zero).",
90  max_material_id, mat_ids.size(), max_material_id - 1);
91  }
92 
93  if (max_material_id < static_cast<int>(mat_ids.size() - 1))
94  WARN(
95  "There are {:d} porous medium definitions in the project file but "
96  "only {:d} different values in the MaterialIDs vector/data_array "
97  "in the mesh.",
98  mat_ids.size(), max_material_id - 1);
99 
100  if (mat_ids.back() != static_cast<int>(mat_ids.size()) - 1)
101  {
102  OGS_FATAL(
103  "The ids in the porous media definitions in the project file have "
104  "to be sequential, starting with the id zero.");
105  }
106 
107  return PorousMediaProperties{std::move(porosity_models),
108  std::move(intrinsic_permeability_models),
109  std::move(storage_models), material_ids};
110 }
111 
112 } // namespace PorousMedium
113 } // namespace MaterialLib
#define OGS_FATAL(...)
Definition: Error.h:26
void DBUG(char const *fmt, Args const &... args)
Definition: Logging.h:27
void WARN(char const *fmt, Args const &... args)
Definition: Logging.h:37
Definition of the Mesh class.
T getConfigAttribute(std::string const &attr) const
ConfigTree getConfigSubtree(std::string const &root) const
Definition: ConfigTree.cpp:146
void reorderVector(std::vector< ValueType > &v, std::vector< IndexType > const &order)
Definition: Algorithm.h:232
PorousMediaProperties createPorousMediaProperties(MeshLib::Mesh &mesh, BaseLib::ConfigTree const &configs, std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const &parameters)
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)
PropertyVector< int > const * materialIDs(Mesh const &mesh)
Definition: Mesh.cpp:258