OGS
ProcessLib::TwoPhaseFlowWithPrho Namespace Reference

Classes

struct  IntegrationPointData
 
class  TwoPhaseFlowWithPrhoLocalAssembler
 
class  TwoPhaseFlowWithPrhoLocalAssemblerInterface
 
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 const &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 35 of file CreateTwoPhaseFlowPrhoMaterialProperties.cpp.

39{
40 DBUG("Reading material properties of two-phase flow process.");
41
43 auto const& fluid_config = config.getConfigSubtree("fluid");
44
45 // Get fluid properties
47 auto const& rho_conf = fluid_config.getConfigSubtree("liquid_density");
48 auto _liquid_density =
51 auto const& rho_gas_conf = fluid_config.getConfigSubtree("gas_density");
52 auto _gas_density =
55 auto const& mu_conf = fluid_config.getConfigSubtree("liquid_viscosity");
56 auto _viscosity = MaterialLib::Fluid::createViscosityModel(mu_conf);
58 auto const& mu_gas_conf = fluid_config.getConfigSubtree("gas_viscosity");
59 auto _gas_viscosity = MaterialLib::Fluid::createViscosityModel(mu_gas_conf);
60
61 // Get porous properties
62 std::vector<int> mat_ids;
63 std::vector<int> mat_krel_ids;
64 std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
65 _intrinsic_permeability_models;
66 std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
67 _porosity_models;
68 std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
69 _storage_models;
70 std::vector<
71 std::unique_ptr<MaterialLib::PorousMedium::CapillaryPressureSaturation>>
72 _capillary_pressure_models;
73 std::vector<
74 std::unique_ptr<MaterialLib::PorousMedium::RelativePermeability>>
75 _relative_permeability_models;
76
78 auto const& poro_config = config.getConfigSubtree("porous_medium");
80 for (auto const& conf : poro_config.getConfigSubtreeList("porous_medium"))
81 {
83 auto const id = conf.getConfigAttributeOptional<int>("id");
84 mat_ids.push_back(*id);
85
87 auto const& permeability_conf = conf.getConfigSubtree("permeability");
88 _intrinsic_permeability_models.emplace_back(
90 permeability_conf, parameters));
91
93 auto const& porosity_conf = conf.getConfigSubtree("porosity");
95 parameters);
96 _porosity_models.emplace_back(std::move(n));
97
99 auto const& storage_conf = conf.getConfigSubtree("storage");
100 auto beta = MaterialLib::PorousMedium::createStorageModel(storage_conf);
101 _storage_models.emplace_back(std::move(beta));
102
103 auto const& capillary_pressure_conf =
105 conf.getConfigSubtree("capillary_pressure");
107 capillary_pressure_conf);
108 _capillary_pressure_models.emplace_back(std::move(pc));
109
110 auto const& krel_config =
112 conf.getConfigSubtree("relative_permeability");
113 for (
114 auto const& krel_conf :
116 krel_config.getConfigSubtreeList("relative_permeability"))
117 {
118 auto const krel_id =
120 krel_conf.getConfigAttributeOptional<int>("id");
121 mat_krel_ids.push_back(*krel_id);
122 auto krel_n =
124 krel_conf);
125 _relative_permeability_models.emplace_back(std::move(krel_n));
126 }
127 BaseLib::reorderVector(_relative_permeability_models, mat_krel_ids);
128 }
129
130 BaseLib::reorderVector(_intrinsic_permeability_models, mat_ids);
131 BaseLib::reorderVector(_porosity_models, mat_ids);
132 BaseLib::reorderVector(_storage_models, mat_ids);
133
134 return std::make_unique<TwoPhaseFlowWithPrhoMaterialProperties>(
135 material_ids, std::move(_liquid_density), std::move(_viscosity),
136 std::move(_gas_density), std::move(_gas_viscosity),
137 std::move(_intrinsic_permeability_models), std::move(_porosity_models),
138 std::move(_storage_models), std::move(_capillary_pressure_models),
139 std::move(_relative_permeability_models));
140}
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition: Logging.h:30
void reorderVector(std::vector< ValueType > &v, std::vector< IndexType > const &order)
Definition: Algorithm.h:188
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< Permeability > createPermeabilityModel(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
std::unique_ptr< CapillaryPressureSaturation > createCapillaryPressureModel(BaseLib::ConfigTree const &config)
std::unique_ptr< Storage > createStorageModel(BaseLib::ConfigTree const &config)
std::unique_ptr< Porosity > createPorosityModel(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)

References 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 const &  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

Process Variables

Input File Parameter:
prj__processes__process__TWOPHASE_FLOW_PRHO__process_variables

Primary process variables as they appear in the global component vector:

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

Process Parameters

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.");
42
44
46 auto const pv_config = config.getConfigSubtree("process_variables");
47
49 auto per_process_variables = findProcessVariables(
50 variables, pv_config,
51 {
52 "liquid_pressure",
54 "overall_mass_density"});
55 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
56 process_variables;
57 process_variables.push_back(std::move(per_process_variables));
58
59 SecondaryVariableCollection secondary_variables;
60
61 ProcessLib::createSecondaryVariables(config, secondary_variables);
63 // Specific body force
64 std::vector<double> const b =
66 config.getConfigParameter<std::vector<double>>("specific_body_force");
67 assert(!b.empty() && b.size() < 4);
68 Eigen::VectorXd specific_body_force(b.size());
69 bool const has_gravity = MathLib::toVector(b).norm() > 0;
70 if (has_gravity)
71 {
72 std::copy_n(b.data(), b.size(), specific_body_force.data());
73 }
74
76 auto const mass_lumping = config.getConfigParameter<bool>("mass_lumping");
77 // diffusion coeff
78 auto const& diff_coeff_b = ParameterLib::findParameter<double>(
79 config,
81 "diffusion_coeff_component_b", parameters, 1, &mesh);
82 auto const& diff_coeff_a = ParameterLib::findParameter<double>(
83 config,
85 "diffusion_coeff_component_a", parameters, 1, &mesh);
86 auto const& temperature = ParameterLib::findParameter<double>(
87 config,
89 "temperature", parameters, 1, &mesh);
90
92 auto const& mat_config = config.getConfigSubtree("material_property");
93
94 auto const material_ids = materialIDs(mesh);
95 if (material_ids != nullptr)
96 {
97 INFO("The twophase flow is in heterogeneous porous media.");
98 }
99 else
100 {
101 INFO("The twophase flow is in homogeneous porous media.");
102 }
103
104 std::unique_ptr<TwoPhaseFlowWithPrhoMaterialProperties> material =
105 createTwoPhaseFlowPrhoMaterialProperties(mat_config, material_ids,
106 parameters);
107
108 TwoPhaseFlowWithPrhoProcessData process_data{
109 specific_body_force, has_gravity, mass_lumping, diff_coeff_b,
110 diff_coeff_a, temperature, std::move(material)};
111
112 return std::make_unique<TwoPhaseFlowWithPrhoProcess>(
113 std::move(name), mesh, std::move(jacobian_assembler), parameters,
114 integration_order, std::move(process_variables),
115 std::move(process_data), std::move(secondary_variables), mat_config,
116 curves);
117}
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition: Logging.h:35
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.
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(), and MathLib::toVector().

Referenced by ProjectData::parseProcesses().

Variable Documentation

◆ NUM_NODAL_DOF

const unsigned ProcessLib::TwoPhaseFlowWithPrho::NUM_NODAL_DOF = 2