Skip to content
Snippets Groups Projects
TRMHeatStorageAndFlux.cpp 3.08 KiB
Newer Older
  • Learn to ignore specific revisions
  •  * Copyright (c) 2012-2024, OpenGeoSys Community (http://www.opengeosys.org)
    
     *            Distributed under a Modified BSD License.
     *              See accompanying file LICENSE.txt or
     *              http://www.opengeosys.org/project/license
     *
     */
    
    #include "TRMHeatStorageAndFlux.h"
    
    #include "MaterialLib/MPL/Utils/FormEigenTensor.h"
    
    namespace ProcessLib::ThermoRichardsMechanics
    {
    template <int DisplacementDim>
    void TRMHeatStorageAndFluxModel<DisplacementDim>::eval(
        SpaceTimeData const& x_t, MediaData const& media_data,
        LiquidDensityData const& rho_L_data, SolidDensityData const& rho_S_data,
        SaturationData const& S_L_data, SaturationDataDeriv const& dS_L_data,
    
        PorosityData const& poro_data, LiquidViscosityData const& mu_L_data,
    
        PermeabilityData<DisplacementDim> const& perm,
        TemperatureData<DisplacementDim> const& T_data,
        DarcyLawData<DisplacementDim> const& darcy_data,
        TRMHeatStorageAndFluxData<DisplacementDim>& out) const
    {
        namespace MPL = MaterialPropertyLib;
        MPL::VariableArray variables;
    
        variables.temperature = T_data.T;
        variables.porosity = poro_data.phi;
        variables.liquid_saturation = S_L_data.S_L;
    
    
        auto const& liquid_phase = media_data.liquid;
        auto const& solid_phase = media_data.solid;
    
        auto const specific_heat_capacity_fluid =
            liquid_phase.property(MaterialPropertyLib::specific_heat_capacity)
                .template value<double>(variables, x_t.x, x_t.t, x_t.dt);
    
        auto const specific_heat_capacity_solid =
            solid_phase
                .property(MaterialPropertyLib::PropertyType::specific_heat_capacity)
                .template value<double>(variables, x_t.x, x_t.t, x_t.dt);
    
        double const phi = poro_data.phi;
    
        // TODO real vs. "non-real" values
        double const volumetric_heat_capacity_liquid =
            rho_L_data.rho_LR * specific_heat_capacity_fluid;
    
        // NOTE: Gas phase is not included.
        double const volumetric_heat_capacity_liquid_and_solid =
            rho_S_data.rho_SR * specific_heat_capacity_solid * (1 - phi) +
            S_L_data.S_L * phi * volumetric_heat_capacity_liquid;
    
        out.M_TT_X_NTN = volumetric_heat_capacity_liquid_and_solid;
    
        out.K_TT_Laplace = MaterialPropertyLib::formEigenTensor<DisplacementDim>(
            media_data.medium
                .property(MaterialPropertyLib::PropertyType::thermal_conductivity)
                .value(variables, x_t.x, x_t.t, x_t.dt));
    
        // Unit is J / m^2 / s / K. It's not a heat flux, but related.
        out.advective_heat_flux_contribution_to_K_liquid =
    
            volumetric_heat_capacity_liquid * darcy_data();
    
    
        //
        // temperature equation, pressure part
        //
    
        out.K_Tp_NT_V_dN = -volumetric_heat_capacity_liquid * perm.k_rel /
    
                           mu_L_data() * (perm.Ki.transpose() * T_data.grad_T);
    
        out.K_Tp_X_NTN = -volumetric_heat_capacity_liquid *
    
                         darcy_data().dot(T_data.grad_T) / perm.k_rel *
    
                         perm.dk_rel_dS_L * dS_L_data.dS_L_dp_cap;
    }
    
    template struct TRMHeatStorageAndFluxModel<2>;
    template struct TRMHeatStorageAndFluxModel<3>;
    }  // namespace ProcessLib::ThermoRichardsMechanics