Raw File
StrainDependentPermeability.h
/**
 * \file
 * \copyright
 * Copyright (c) 2012-2021, OpenGeoSys Community (http://www.opengeosys.org)
 *            Distributed under a Modified BSD License.
 *              See accompanying file LICENSE.txt or
 *              http://www.opengeosys.org/project/license
 *
 * Created on November 10, 2020, 8:49 AM
 */

#pragma once

#include "MaterialLib/MPL/Property.h"
#include "MaterialLib/MPL/VariableType.h"

namespace ParameterLib
{
struct CoordinateSystem;
template <typename T>
struct Parameter;
}  // namespace ParameterLib

namespace MaterialPropertyLib
{
/**
 * \brief A strain dependent intrinsic permeability model.
 *
 *  The model was proposed
 *  in \cite xu2011simulation and it was further investigated
 *  in \cite xu2013coupled .
 *
 *   The model takes the form of
 *  \f[ \mathbf{k} =f(\epsilon_v) e^{b_1  {\bar\epsilon}^p}\mathbf{k}_0
 *  \f]
 *  with
 *  \f[ f(\epsilon_v)=
 *      \begin{cases}
 *       10^{b_2  \epsilon_v}, & \epsilon_v <=0\\
 *      10^{b_3  \epsilon_v}, & \epsilon_v >0
 *      \end{cases}
 *  \f]
 *   where
 *   <table>
 *   <tr><td>\f$ \epsilon_v \f$  <td> the volumetric strain,
 *   <tr><td> \f$ {\bar\epsilon}^p\f$ <td> the equivalent plastic
 *    strain,
 *   <tr><td>\f$\mathbf{k}_0\f$  <td> the initial intrinsic permeability,
 *   <tr><td>\f$b_1,\,b_2,\,b_3\f$  <td> the three parameters.
 * </table>
 *
 *  * Note: In \cite xu2011simulation  and \cite xu2013coupled ,
 * from the point of view of experiment of permeability change, the symbols of
 * \f$ \Delta \epsilon_v \f$ and \f$\Delta {\bar\epsilon}^p\f$  are used for \f$
 * \epsilon_v \f$ and \f$
 * {\bar\epsilon}^p\f$, respectively. That means that the symbols of
 * \f$ \Delta \epsilon_v \f$ and \f$\Delta {\bar\epsilon}^p\f$
 *  refer to the increment of the volumetric strain and the increment of the
 * equivalent plastic strain, respectively, from the beginning of the
 * experiment.
 */
template <int DisplacementDim>
class StrainDependentPermeability final : public Property
{
public:
    StrainDependentPermeability(
        std::string name, ParameterLib::Parameter<double> const& k0,
        double const b1, double const b2, double const b3,
        double const minimum_permeability, double const maximum_permeability,
        ParameterLib::CoordinateSystem const* const local_coordinate_system);

    void checkScale() const override;

    PropertyDataType value(VariableArray const& variable_array,
                           ParameterLib::SpatialPosition const& pos,
                           double const t, double const dt) const override;
    PropertyDataType dValue(VariableArray const& variable_array,
                            Variable const variable,
                            ParameterLib::SpatialPosition const& pos,
                            double const t, double const dt) const override;

private:
    /// Initial intrinsic permeability.
    ParameterLib::Parameter<double> const& k0_;
    double const b1_;
    double const b2_;
    double const b3_;
    double const minimum_permeability_;
    double const maximum_permeability_;
    ParameterLib::CoordinateSystem const* const local_coordinate_system_;
};

extern template class StrainDependentPermeability<2>;
extern template class StrainDependentPermeability<3>;

}  // namespace MaterialPropertyLib
back to top