From 399eacc3ee7cad75b6e390414cdba4906e98d1e7 Mon Sep 17 00:00:00 2001 From: Florian Zill <florian.zill@ufz.de> Date: Thu, 23 Jan 2020 17:23:21 +0100 Subject: [PATCH] [HM] Linkage to MPL for now porosity and viscosity only, the rest follows later --- Applications/ApplicationsLib/ProjectData.cpp | 4 +- .../CreateHydroMechanicsProcess.cpp | 40 ++++++------- .../CreateHydroMechanicsProcess.h | 14 ++++- .../HydroMechanics/HydroMechanicsFEM-impl.h | 56 ++++++++++++++++--- .../HydroMechanicsProcessData.h | 10 ++-- 5 files changed, 81 insertions(+), 43 deletions(-) diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp index e9d3bc5bc60..1f52451511b 100644 --- a/Applications/ApplicationsLib/ProjectData.cpp +++ b/Applications/ApplicationsLib/ProjectData.cpp @@ -574,7 +574,7 @@ void ProjectData::parseProcesses(BaseLib::ConfigTree const& processes_config, std::move(jacobian_assembler), _process_variables, _parameters, _local_coordinate_system, integration_order, - process_config); + process_config, _media); break; case 3: process = @@ -583,7 +583,7 @@ void ProjectData::parseProcesses(BaseLib::ConfigTree const& processes_config, std::move(jacobian_assembler), _process_variables, _parameters, _local_coordinate_system, integration_order, - process_config); + process_config, _media); break; default: OGS_FATAL( diff --git a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp index 563c2393112..ea1b29bd97d 100644 --- a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp +++ b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp @@ -12,6 +12,9 @@ #include <cassert> +#include "MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h" +#include "MaterialLib/MPL/MaterialSpatialDistributionMap.h" + #include "MaterialLib/SolidModels/CreateConstitutiveRelation.h" #include "MaterialLib/SolidModels/MechanicsBase.h" #include "ParameterLib/Utils.h" @@ -27,15 +30,14 @@ namespace HydroMechanics { template <int DisplacementDim> std::unique_ptr<Process> createHydroMechanicsProcess( - std::string name, - MeshLib::Mesh& mesh, + 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, boost::optional<ParameterLib::CoordinateSystem> const& local_coordinate_system, - unsigned const integration_order, - BaseLib::ConfigTree const& config) + unsigned const integration_order, BaseLib::ConfigTree const& config, + std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "HYDRO_MECHANICS"); @@ -118,14 +120,6 @@ std::unique_ptr<Process> createHydroMechanicsProcess( DBUG("Use '%s' as intrinsic conductivity parameter.", intrinsic_permeability.name.c_str()); - // Fluid viscosity - auto& fluid_viscosity = ParameterLib::findParameter<double>( - config, - //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__fluid_viscosity} - "fluid_viscosity", parameters, 1, &mesh); - DBUG("Use '%s' as fluid viscosity parameter.", - fluid_viscosity.name.c_str()); - // Fluid density auto& fluid_density = ParameterLib::findParameter<double>( config, @@ -141,13 +135,6 @@ std::unique_ptr<Process> createHydroMechanicsProcess( DBUG("Use '%s' as Biot coefficient parameter.", biot_coefficient.name.c_str()); - // Porosity - auto& porosity = ParameterLib::findParameter<double>( - config, - //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__porosity} - "porosity", parameters, 1, &mesh); - DBUG("Use '%s' as porosity parameter.", porosity.name.c_str()); - // Solid density auto& solid_density = ParameterLib::findParameter<double>( config, @@ -174,6 +161,9 @@ std::unique_ptr<Process> createHydroMechanicsProcess( std::copy_n(b.data(), b.size(), specific_body_force.data()); } + auto media_map = + MaterialPropertyLib::createMaterialSpatialDistributionMap(media, mesh); + // Initial stress conditions auto const initial_stress = ParameterLib::findOptionalTagParameter<double>( //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__initial_stress} @@ -217,10 +207,10 @@ std::unique_ptr<Process> createHydroMechanicsProcess( } HydroMechanicsProcessData<DisplacementDim> process_data{ - materialIDs(mesh), std::move(solid_constitutive_relations), + materialIDs(mesh), std::move(media_map), + std::move(solid_constitutive_relations), initial_stress, intrinsic_permeability, - fluid_viscosity, fluid_density, - biot_coefficient, porosity, + fluid_density, biot_coefficient, solid_density, specific_body_force, fluid_compressibility, reference_temperature, specific_gas_constant, fluid_type}; @@ -245,7 +235,8 @@ template std::unique_ptr<Process> createHydroMechanicsProcess<2>( boost::optional<ParameterLib::CoordinateSystem> const& local_coordinate_system, unsigned const integration_order, - BaseLib::ConfigTree const& config); + BaseLib::ConfigTree const& config, + std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); template std::unique_ptr<Process> createHydroMechanicsProcess<3>( std::string name, @@ -256,7 +247,8 @@ template std::unique_ptr<Process> createHydroMechanicsProcess<3>( boost::optional<ParameterLib::CoordinateSystem> const& local_coordinate_system, unsigned const integration_order, - BaseLib::ConfigTree const& config); + BaseLib::ConfigTree const& config, + std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); } // namespace HydroMechanics } // namespace ProcessLib diff --git a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h index 3119ebd8d28..7fb0b496022 100644 --- a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h +++ b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h @@ -11,6 +11,7 @@ #pragma once #include <boost/optional.hpp> +#include <map> #include <memory> #include <vector> @@ -18,6 +19,10 @@ namespace BaseLib { class ConfigTree; } +namespace MaterialPropertyLib +{ +class Medium; +} namespace MeshLib { class Mesh; @@ -48,7 +53,8 @@ std::unique_ptr<Process> createHydroMechanicsProcess( boost::optional<ParameterLib::CoordinateSystem> const& local_coordinate_system, unsigned const integration_order, - BaseLib::ConfigTree const& config); + BaseLib::ConfigTree const& config, + std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); extern template std::unique_ptr<Process> createHydroMechanicsProcess<2>( std::string name, @@ -59,7 +65,8 @@ extern template std::unique_ptr<Process> createHydroMechanicsProcess<2>( boost::optional<ParameterLib::CoordinateSystem> const& local_coordinate_system, unsigned const integration_order, - BaseLib::ConfigTree const& config); + BaseLib::ConfigTree const& config, + std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); extern template std::unique_ptr<Process> createHydroMechanicsProcess<3>( std::string name, @@ -70,6 +77,7 @@ extern template std::unique_ptr<Process> createHydroMechanicsProcess<3>( boost::optional<ParameterLib::CoordinateSystem> const& local_coordinate_system, unsigned const integration_order, - BaseLib::ConfigTree const& config); + BaseLib::ConfigTree const& config, + std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); } // namespace HydroMechanics } // namespace ProcessLib diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h index 5d542a5f981..fe040e8db2b 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h @@ -14,6 +14,8 @@ #include "HydroMechanicsFEM.h" #include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h" +#include "MaterialLib/MPL/Medium.h" +#include "MaterialLib/MPL/Property.h" #include "MathLib/KelvinVector.h" #include "NumLib/Function/Interpolation.h" #include "ProcessLib/CoupledSolutionsForStaggeredScheme.h" @@ -180,6 +182,11 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, unsigned const n_integration_points = _integration_method.getNumberOfPoints(); + + auto const& medium = _process_data.media_map->getMedium(_element.getID()); + auto const& gas_phase = medium->phase("Gas"); + auto const& solid_phase = medium->phase("Solid"); + MaterialPropertyLib::VariableArray vars; for (unsigned ip = 0; ip < n_integration_points; ip++) { x_position.setIntegrationPoint(ip); @@ -206,9 +213,13 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, auto& eps = _ip_data[ip].eps; auto const& sigma_eff = _ip_data[ip].sigma_eff; + auto const mu = + gas_phase.property(MaterialPropertyLib::PropertyType::viscosity) + .template value<double>(vars, x_position, t); + double const K_over_mu = - _process_data.intrinsic_permeability(t, x_position)[0] / - _process_data.fluid_viscosity(t, x_position)[0]; + _process_data.intrinsic_permeability(t, x_position)[0] / mu; + auto const alpha = _process_data.biot_coefficient(t, x_position)[0]; auto const K_S = solid_material.getBulkModulus(t, x_position); auto const rho_sr = _process_data.solid_density(t, x_position)[0]; @@ -219,7 +230,9 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, : std::numeric_limits<double>::quiet_NaN(); double const rho_fr = _process_data.getFluidDensity(t, x_position, p_fr); double const beta_p = _process_data.getFluidCompressibility(p_fr); - auto const porosity = _process_data.porosity(t, x_position)[0]; + auto const porosity = + solid_phase.property(MaterialPropertyLib::PropertyType::porosity) + .template value<double>(vars, x_position, t); auto const& identity2 = MathLib::KelvinVector::Invariants< MathLib::KelvinVector::KelvinVectorDimensions< DisplacementDim>::value>::identity2; @@ -326,12 +339,21 @@ HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure, ParameterLib::SpatialPosition x_position; x_position.setElementID(_element.getID()); + + auto const& medium = _process_data.media_map->getMedium(_element.getID()); + auto const& gas_phase = medium->phase("Gas"); + MaterialPropertyLib::VariableArray vars; + for (unsigned ip = 0; ip < n_integration_points; ip++) { x_position.setIntegrationPoint(ip); + + auto const mu = + gas_phase.property(MaterialPropertyLib::PropertyType::viscosity) + .template value<double>(vars, x_position, t); + double const K_over_mu = - _process_data.intrinsic_permeability(t, x_position)[0] / - _process_data.fluid_viscosity(t, x_position)[0]; + _process_data.intrinsic_permeability(t, x_position)[0] / mu; auto const rho_fr = _process_data.fluid_density(t, x_position)[0]; auto const& b = _process_data.specific_body_force; @@ -391,6 +413,11 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, ParameterLib::SpatialPosition x_position; x_position.setElementID(_element.getID()); + auto const& medium = _process_data.media_map->getMedium(_element.getID()); + auto const& gas_phase = medium->phase("Gas"); + auto const& solid_phase = medium->phase("Solid"); + MaterialPropertyLib::VariableArray vars; + int const n_integration_points = _integration_method.getNumberOfPoints(); for (int ip = 0; ip < n_integration_points; ip++) { @@ -403,9 +430,12 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, auto const& N_p = _ip_data[ip].N_p; auto const& dNdx_p = _ip_data[ip].dNdx_p; + auto const mu = + gas_phase.property(MaterialPropertyLib::PropertyType::viscosity) + .template value<double>(vars, x_position, t); + double const K_over_mu = - _process_data.intrinsic_permeability(t, x_position)[0] / - _process_data.fluid_viscosity(t, x_position)[0]; + _process_data.intrinsic_permeability(t, x_position)[0] / mu; auto const alpha_b = _process_data.biot_coefficient(t, x_position)[0]; // TODO (FZill) get fluid properties from GPML double const p_fr = @@ -414,7 +444,9 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, : std::numeric_limits<double>::quiet_NaN(); double const rho_fr = _process_data.getFluidDensity(t, x_position, p_fr); double const beta_p = _process_data.getFluidCompressibility(p_fr); - auto const porosity = _process_data.porosity(t, x_position)[0]; + auto const porosity = + solid_phase.property(MaterialPropertyLib::PropertyType::porosity) + .template value<double>(vars, x_position, t); auto const K_S = solid_material.getBulkModulus(t, x_position); laplace.noalias() += dNdx_p.transpose() * K_over_mu * dNdx_p * w; @@ -477,6 +509,10 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, ParameterLib::SpatialPosition x_position; x_position.setElementID(_element.getID()); + auto const& medium = _process_data.media_map->getMedium(_element.getID()); + auto const& solid_phase = medium->phase("Solid"); + MaterialPropertyLib::VariableArray vars; + int const n_integration_points = _integration_method.getNumberOfPoints(); for (int ip = 0; ip < n_integration_points; ip++) { @@ -506,7 +542,9 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, auto const alpha = _process_data.biot_coefficient(t, x_position)[0]; auto const rho_sr = _process_data.solid_density(t, x_position)[0]; auto const rho_fr = _process_data.fluid_density(t, x_position)[0]; - auto const porosity = _process_data.porosity(t, x_position)[0]; + auto const porosity = + solid_phase.property(MaterialPropertyLib::PropertyType::porosity) + .template value<double>(vars, x_position, t); auto const& b = _process_data.specific_body_force; auto const& identity2 = MathLib::KelvinVector::Invariants< MathLib::KelvinVector::KelvinVectorDimensions< diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h b/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h index 66db57df0d8..7f1d59f54f9 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h @@ -18,6 +18,8 @@ #include <Eigen/Dense> +#include "MaterialLib/MPL/MaterialSpatialDistributionMap.h" + namespace MaterialLib { namespace Solids @@ -35,6 +37,9 @@ struct HydroMechanicsProcessData { MeshLib::PropertyVector<int> const* const material_ids = nullptr; + std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap> + media_map = nullptr; + /// The constitutive relation for the mechanical part. /// \note Linear elasticity is the only supported one in the moment. std::map< @@ -49,15 +54,10 @@ struct HydroMechanicsProcessData /// Permeability of the solid. A scalar quantity, /// ParameterLib::Parameter<double>. ParameterLib::Parameter<double> const& intrinsic_permeability; - /// Fluid's viscosity. A scalar quantity, ParameterLib::Parameter<double>. - ParameterLib::Parameter<double> const& fluid_viscosity; /// Fluid's density. A scalar quantity, ParameterLib::Parameter<double>. ParameterLib::Parameter<double> const& fluid_density; /// Biot coefficient. A scalar quantity, ParameterLib::Parameter<double>. ParameterLib::Parameter<double> const& biot_coefficient; - /// Porosity of the solid. A scalar quantity, - /// ParameterLib::Parameter<double>. - ParameterLib::Parameter<double> const& porosity; /// Solid's density. A scalar quantity, ParameterLib::Parameter<double>. ParameterLib::Parameter<double> const& solid_density; /// Specific body forces applied to solid and fluid. -- GitLab