diff --git a/MaterialLib/MPL/Properties/IdealGasLaw.cpp b/MaterialLib/MPL/Properties/IdealGasLaw.cpp index d362a23a1a63ccc93b756e51fb6f2f75e9fdab20..5ce307d36a2efd60c07a7c60aa280b36ce1e1c57 100644 --- a/MaterialLib/MPL/Properties/IdealGasLaw.cpp +++ b/MaterialLib/MPL/Properties/IdealGasLaw.cpp @@ -20,60 +20,53 @@ namespace MaterialPropertyLib { -double molarMass(std::variant<Medium*, Phase*, Component*> const scale, - VariableArray const& variable_array, - ParameterLib::SpatialPosition const& pos, double const t, - double const dt) -{ - return std::visit( - [&variable_array, &pos, t, dt](auto&& s) -> double { - return s->property(PropertyType::molar_mass) - .template value<double>(variable_array, pos, t, dt); - }, - scale); -} - IdealGasLaw::IdealGasLaw(std::string name) { name_ = std::move(name); } -PropertyDataType IdealGasLaw::value(VariableArray const& variable_array, - ParameterLib::SpatialPosition const& pos, - double const t, double const dt) const +PropertyDataType IdealGasLaw::value( + VariableArray const& variable_array, + ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/, + double const /*dt*/) const { const double gas_constant = MaterialLib::PhysicalConstant::IdealGasConstant; const double pressure = std::get<double>( variable_array[static_cast<int>(Variable::phase_pressure)]); const double temperature = std::get<double>( variable_array[static_cast<int>(Variable::temperature)]); - double molar_mass = molarMass(scale_, variable_array, pos, t, dt); + const double molar_mass = std::get<double>( + variable_array[static_cast<int>(Variable::molar_mass)]); const double density = pressure * molar_mass / gas_constant / temperature; return density; } -PropertyDataType IdealGasLaw::dValue(VariableArray const& variable_array, - Variable const primary_variable, - ParameterLib::SpatialPosition const& pos, - double const t, double const dt) const +PropertyDataType IdealGasLaw::dValue( + VariableArray const& variable_array, Variable const primary_variable, + ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/, + double const /*dt*/) const { const double gas_constant = MaterialLib::PhysicalConstant::IdealGasConstant; const double pressure = std::get<double>( variable_array[static_cast<int>(Variable::phase_pressure)]); const double temperature = std::get<double>( variable_array[static_cast<int>(Variable::temperature)]); - double molar_mass = molarMass(scale_, variable_array, pos, t, dt); + const double molar_mass = std::get<double>( + variable_array[static_cast<int>(Variable::molar_mass)]); + // todo: add molar mass derivatives if (primary_variable == Variable::temperature) { + // extend to take temperature-dependent molar mass into account return -pressure * molar_mass / gas_constant / temperature / temperature; } if (primary_variable == Variable::phase_pressure) { + // extend to take pressure-dependent molar mass into account return molar_mass / gas_constant / temperature; } @@ -84,29 +77,33 @@ PropertyDataType IdealGasLaw::dValue(VariableArray const& variable_array, return 0.; } -PropertyDataType IdealGasLaw::d2Value(VariableArray const& variable_array, - Variable const primary_variable1, - Variable const primary_variable2, - ParameterLib::SpatialPosition const& pos, - double const t, double const dt) const +PropertyDataType IdealGasLaw::d2Value( + VariableArray const& variable_array, Variable const primary_variable1, + Variable const primary_variable2, + ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/, + double const /*dt*/) const { const double gas_constant = MaterialLib::PhysicalConstant::IdealGasConstant; const double pressure = std::get<double>( variable_array[static_cast<int>(Variable::phase_pressure)]); const double temperature = std::get<double>( variable_array[static_cast<int>(Variable::temperature)]); - double molar_mass = molarMass(scale_, variable_array, pos, t, dt); + const double molar_mass = std::get<double>( + variable_array[static_cast<int>(Variable::molar_mass)]); + // todo: add molar mass derivatives if ((primary_variable1 == Variable::phase_pressure) && (primary_variable2 == Variable::phase_pressure)) { // d2rho_dp2 + // extend to take pressure-dependent molar mass into account return 0.; } if ((primary_variable1 == Variable::temperature) && (primary_variable2 == Variable::temperature)) { // d2rho_dT2 + // extend to take temperature-dependent molar mass into account return 2. * molar_mass * pressure / gas_constant / temperature / temperature / temperature; } @@ -116,6 +113,7 @@ PropertyDataType IdealGasLaw::d2Value(VariableArray const& variable_array, (primary_variable2 == Variable::phase_pressure))) { // d2rho_dpdT or d2rho_dTdp + // extend to take pressure-temperature-dependent molar mass into account return -molar_mass / gas_constant / temperature / temperature; } diff --git a/MaterialLib/MPL/Properties/IdealGasLaw.h b/MaterialLib/MPL/Properties/IdealGasLaw.h index 17739e1c2a3fb0db8de41b6159c328ca86ae6bc4..a981b38010399655829db43073c161ee11cfac1e 100644 --- a/MaterialLib/MPL/Properties/IdealGasLaw.h +++ b/MaterialLib/MPL/Properties/IdealGasLaw.h @@ -57,8 +57,9 @@ public: double const /*dt*/) const override; PropertyDataType d2Value(VariableArray const& variable_array, Variable const variable1, Variable const variable2, - ParameterLib::SpatialPosition const& pos, - double const t, double const dt) const override; + ParameterLib::SpatialPosition const& /*pos*/, + double const /*t*/, + double const /*dt*/) const override; }; } // namespace MaterialPropertyLib diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h index d264fefd36df11b4dc8d0b42f9851e5395231e77..052e58df7728b2acb8c7f99bf3f13bbab7532dd0 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h @@ -240,6 +240,18 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, auto const mu = fluid.property(MPL::PropertyType::viscosity) .template value<double>(vars, x_position, t, dt); + + // Quick workaround: If fluid density is described as ideal gas, then + // the molar mass must be passed to the MPL::IdealGasLaw via the + // varialbe_array and the fluid must have the property + // MPL::PropertyType::molar_mass. For other density models (e.g. + // Constant), it is not mandatory to specify the molar mass. + if (fluid.hasProperty(MPL::PropertyType::molar_mass)) + { + vars[static_cast<int>(MPL::Variable::molar_mass)] = + fluid.property(MPL::PropertyType::molar_mass) + .template value<double>(vars, x_position, t, dt); + } auto const rho_fr = fluid.property(MPL::PropertyType::density) .template value<double>(vars, x_position, t, dt); @@ -435,6 +447,17 @@ HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure, auto const mu = fluid.property(MPL::PropertyType::viscosity) .template value<double>(vars, x_position, t, dt); + // Quick workaround: If fluid density is described as ideal gas, then + // the molar mass must be passed to the MPL::IdealGasLaw via the + // varialbe_array and the fluid must have the property + // MPL::PropertyType::molar_mass. For other density models (e.g. + // Constant), it is not mandatory to specify the molar mass. + if (fluid.hasProperty(MPL::PropertyType::molar_mass)) + { + vars[static_cast<int>(MPL::Variable::molar_mass)] = + fluid.property(MPL::PropertyType::molar_mass) + .template value<double>(vars, x_position, t, dt); + } auto const rho_fr = fluid.property(MPL::PropertyType::density) .template value<double>(vars, x_position, t, dt); @@ -557,6 +580,17 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, auto const mu = fluid.property(MPL::PropertyType::viscosity) .template value<double>(vars, x_position, t, dt); + // Quick workaround: If fluid density is described as ideal gas, then + // the molar mass must be passed to the MPL::IdealGasLaw via the + // varialbe_array and the fluid must have the property + // MPL::PropertyType::molar_mass. For other density models (e.g. + // Constant), it is not mandatory to specify the molar mass. + if (fluid.hasProperty(MPL::PropertyType::molar_mass)) + { + vars[static_cast<int>(MPL::Variable::molar_mass)] = + fluid.property(MPL::PropertyType::molar_mass) + .template value<double>(vars, x_position, t, dt); + } auto const rho_fr = fluid.property(MPL::PropertyType::density) .template value<double>(vars, x_position, t, dt); @@ -683,6 +717,17 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, medium->property(MPL::PropertyType::porosity) .template value<double>(vars, x_position, t, dt); + // Quick workaround: If fluid density is described as ideal gas, then + // the molar mass must be passed to the MPL::IdealGasLaw via the + // varialbe_array and the fluid must have the property + // MPL::PropertyType::molar_mass. For other density models (e.g. + // Constant), it is not mandatory to specify the molar mass. + if (fluid.hasProperty(MPL::PropertyType::molar_mass)) + { + vars[static_cast<int>(MPL::Variable::molar_mass)] = + fluid.property(MPL::PropertyType::molar_mass) + .template value<double>(vars, x_position, t, dt); + } auto const rho_fr = fluid.property(MPL::PropertyType::density) .template value<double>(vars, x_position, t, dt); diff --git a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPLocalAssembler-impl.h b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPLocalAssembler-impl.h index c0e0f3861a367978a7af68785bd5dae9bf8f5a06..fa778769de14a49aedc9f51c787a2b5e461e9278 100644 --- a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPLocalAssembler-impl.h +++ b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPLocalAssembler-impl.h @@ -122,6 +122,9 @@ void TwoPhaseFlowWithPPLocalAssembler< pc_int_pt; variables[static_cast<int>(MPL::Variable::temperature)] = _process_data.temperature(t, pos)[0]; + variables[static_cast<int>(MPL::Variable::molar_mass)] = + gas_phase.property(MPL::PropertyType::molar_mass) + .template value<double>(variables, pos, t, dt); auto const rho_nonwet = gas_phase.property(MPL::PropertyType::density) diff --git a/Tests/MaterialLib/TestMPLIdealGasLaw.cpp b/Tests/MaterialLib/TestMPLIdealGasLaw.cpp index d23cf8a61f15114215b848668d93e2188f9bc61b..36855eb94edcc6f6a06dadc0a529be31aadad5f5 100644 --- a/Tests/MaterialLib/TestMPLIdealGasLaw.cpp +++ b/Tests/MaterialLib/TestMPLIdealGasLaw.cpp @@ -64,6 +64,8 @@ TEST(MaterialPropertyLib, IdealGasLawOfPurePhase) MaterialPropertyLib::Variable::phase_pressure)] = pressure_norm; variable_array[static_cast<int>( MaterialPropertyLib::Variable::temperature)] = temperature_norm; + variable_array[static_cast<int>( + MaterialPropertyLib::Variable::molar_mass)] = molar_mass_air; ParameterLib::SpatialPosition const pos; double const time = std::numeric_limits<double>::quiet_NaN();