OGS
ProcessLib::TwoPhaseFlowWithPrho Namespace Reference

Classes

struct  IntegrationPointData
 
class  TwoPhaseFlowWithPrhoLocalAssemblerInterface
 
class  TwoPhaseFlowWithPrhoLocalAssembler
 
class  TwoPhaseFlowWithPrhoMaterialProperties
 
class  TwoPhaseFlowWithPrhoProcess
 A class to simulate the two-phase flow process with P-rho model in porous media. More...
 
struct  TwoPhaseFlowWithPrhoProcessData
 

Functions

std::unique_ptr< TwoPhaseFlowWithPrhoMaterialPropertiescreateTwoPhaseFlowPrhoMaterialProperties (BaseLib::ConfigTree const &config, MeshLib::PropertyVector< int > const *const material_ids, std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const &parameters)
 
std::unique_ptr< ProcesscreateTwoPhaseFlowWithPrhoProcess (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)
 

Variables

const unsigned NUM_NODAL_DOF = 2
 

Function Documentation

◆ createTwoPhaseFlowPrhoMaterialProperties()

std::unique_ptr< TwoPhaseFlowWithPrhoMaterialProperties > ProcessLib::TwoPhaseFlowWithPrho::createTwoPhaseFlowPrhoMaterialProperties ( BaseLib::ConfigTree const &  config,
MeshLib::PropertyVector< int > const *const  material_ids,
std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const &  parameters 
)
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__fluid
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__liquid_density
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__gas_density
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__liquid_viscosity
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__gas_viscosity
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__id
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__permeability
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__porosity
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__storage
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__capillary_pressure
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__relative_permeability
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__relative_permeability__relative_permeability
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__relative_permeability__relative_permeability__id

Definition at line 34 of file CreateTwoPhaseFlowPrhoMaterialProperties.cpp.

38 {
39  DBUG("Reading material properties of two-phase flow process.");
40 
42  auto const& fluid_config = config.getConfigSubtree("fluid");
43 
44  // Get fluid properties
46  auto const& rho_conf = fluid_config.getConfigSubtree("liquid_density");
47  auto _liquid_density =
50  auto const& rho_gas_conf = fluid_config.getConfigSubtree("gas_density");
51  auto _gas_density =
54  auto const& mu_conf = fluid_config.getConfigSubtree("liquid_viscosity");
55  auto _viscosity = MaterialLib::Fluid::createViscosityModel(mu_conf);
57  auto const& mu_gas_conf = fluid_config.getConfigSubtree("gas_viscosity");
58  auto _gas_viscosity = MaterialLib::Fluid::createViscosityModel(mu_gas_conf);
59 
60  // Get porous properties
61  std::vector<int> mat_ids;
62  std::vector<int> mat_krel_ids;
63  std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
64  _intrinsic_permeability_models;
65  std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
66  _porosity_models;
67  std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
68  _storage_models;
69  std::vector<
70  std::unique_ptr<MaterialLib::PorousMedium::CapillaryPressureSaturation>>
71  _capillary_pressure_models;
72  std::vector<
73  std::unique_ptr<MaterialLib::PorousMedium::RelativePermeability>>
74  _relative_permeability_models;
75 
77  auto const& poro_config = config.getConfigSubtree("porous_medium");
79  for (auto const& conf : poro_config.getConfigSubtreeList("porous_medium"))
80  {
82  auto const id = conf.getConfigAttributeOptional<int>("id");
83  mat_ids.push_back(*id);
84 
86  auto const& permeability_conf = conf.getConfigSubtree("permeability");
87  _intrinsic_permeability_models.emplace_back(
89  permeability_conf, parameters));
90 
92  auto const& porosity_conf = conf.getConfigSubtree("porosity");
94  parameters);
95  _porosity_models.emplace_back(std::move(n));
96 
98  auto const& storage_conf = conf.getConfigSubtree("storage");
100  _storage_models.emplace_back(std::move(beta));
101 
102  auto const& capillary_pressure_conf =
104  conf.getConfigSubtree("capillary_pressure");
106  capillary_pressure_conf);
107  _capillary_pressure_models.emplace_back(std::move(pc));
108 
109  auto const& krel_config =
111  conf.getConfigSubtree("relative_permeability");
112  for (
113  auto const& krel_conf :
115  krel_config.getConfigSubtreeList("relative_permeability"))
116  {
117  auto const krel_id =
119  krel_conf.getConfigAttributeOptional<int>("id");
120  mat_krel_ids.push_back(*krel_id);
121  auto krel_n =
123  krel_conf);
124  _relative_permeability_models.emplace_back(std::move(krel_n));
125  }
126  BaseLib::reorderVector(_relative_permeability_models, mat_krel_ids);
127  }
128 
129  BaseLib::reorderVector(_intrinsic_permeability_models, mat_ids);
130  BaseLib::reorderVector(_porosity_models, mat_ids);
131  BaseLib::reorderVector(_storage_models, mat_ids);
132 
133  return std::make_unique<TwoPhaseFlowWithPrhoMaterialProperties>(
134  material_ids, std::move(_liquid_density), std::move(_viscosity),
135  std::move(_gas_density), std::move(_gas_viscosity),
136  std::move(_intrinsic_permeability_models), std::move(_porosity_models),
137  std::move(_storage_models), std::move(_capillary_pressure_models),
138  std::move(_relative_permeability_models));
139 }
void DBUG(char const *fmt, Args const &... args)
Definition: Logging.h:27
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)

References MaterialPropertyLib::beta, MaterialLib::PorousMedium::createCapillaryPressureModel(), MaterialLib::Fluid::createFluidDensityModel(), MaterialLib::PorousMedium::createPermeabilityModel(), MaterialLib::PorousMedium::createPorosityModel(), MaterialLib::PorousMedium::createRelativePermeabilityModel(), MaterialLib::PorousMedium::createStorageModel(), MaterialLib::Fluid::createViscosityModel(), DBUG(), BaseLib::ConfigTree::getConfigAttributeOptional(), BaseLib::ConfigTree::getConfigSubtree(), and BaseLib::reorderVector().

Referenced by createTwoPhaseFlowWithPrhoProcess().

◆ createTwoPhaseFlowWithPrhoProcess()

std::unique_ptr< Process > ProcessLib::TwoPhaseFlowWithPrho::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 
)
Input File Parameter:
prj__processes__process__type
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__process_variables
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__process_variables__liquid_pressure
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__process_variables__overall_mass_density
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__specific_body_force
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__mass_lumping
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__diffusion_coeff_component_b
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__diffusion_coeff_component_a
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__temperature
Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__material_property

Definition at line 26 of file CreateTwoPhaseFlowWithPrhoProcess.cpp.

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 }
void INFO(char const *fmt, Args const &... args)
Definition: Logging.h:32
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::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)

References BaseLib::ConfigTree::checkConfigParameter(), ProcessLib::createSecondaryVariables(), createTwoPhaseFlowPrhoMaterialProperties(), DBUG(), ProcessLib::findProcessVariables(), BaseLib::ConfigTree::getConfigParameter(), BaseLib::ConfigTree::getConfigSubtree(), INFO(), MeshLib::materialIDs(), MaterialPropertyLib::name, and MathLib::toVector().

Referenced by ProjectData::parseProcesses().

Variable Documentation

◆ NUM_NODAL_DOF

const unsigned ProcessLib::TwoPhaseFlowWithPrho::NUM_NODAL_DOF = 2