Raw File
CohesiveZoneModeI.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
 */

#pragma once

#include <Eigen/Eigen>
#include <utility>

#include "ParameterLib/Parameter.h"

#include "FractureModelBase.h"

namespace MaterialLib
{
namespace Fracture
{
namespace CohesiveZoneModeI
{
/// Variables specific to the material model
struct MaterialPropertiesParameters
{
    using P = ParameterLib::Parameter<double>;
    using X = ParameterLib::SpatialPosition;

    MaterialPropertiesParameters(P const& normal_stiffness_,
                                 P const& shear_stiffness_,
                                 P const& fracture_toughness_,
                                 P const& peak_normal_traction_)
        : normal_stiffness(normal_stiffness_),
          shear_stiffness(shear_stiffness_),
          fracture_toughness(fracture_toughness_),
          peak_normal_traction(peak_normal_traction_)
    {
    }

    /// Assuming initially stress-free state.
    double fracture_opening_at_peak_traction(double const t, X const& x) const
    {
        return peak_normal_traction(t, x)[0] / normal_stiffness(t, x)[0];
    }

    /// Assuming initially stress-free state.
    double fracture_opening_at_residual_traction(double const t,
                                                 X const& x) const
    {
        if (peak_normal_traction(t, x)[0] == 0.0)
        {
            return 0.0;
        }

        return 2 * fracture_toughness(t, x)[0] / peak_normal_traction(t, x)[0];
    }

    /// Normal stiffness given in units of stress per length.
    P const& normal_stiffness;
    /// Shear stiffness given in units of stress per length.
    P const& shear_stiffness;

    /// Fracture toughness/critical energy release rate given in of stress times
    /// lengths.
    ///
    /// The fracture toughness \f$G_{c}\f$ denotes the total energy dissipation
    /// to resist a fracture. Graphically, its value equals to the total area
    /// below the bilinear curve.
    P const& fracture_toughness;
    /// Peak normal traction given in units of stress per length.
    ///
    /// The peak tensile normal traction \f$t_{n,p}\f$ denotes the maximum
    /// normal traction in the linear elastic phase. The corresponding normal
    /// fracture opening \f$w_{n,p}\f$ then comes out according to the Hooke's
    /// law. With the proceeding of delamination over this opening threshold,
    /// damage takes place so that the bearing loading of the material linearly
    /// drops down.
    P const& peak_normal_traction;
};

/// Evaluated MaterialPropertiesParameters container, see its documentation for
/// details.
struct MaterialProperties final
{
    MaterialProperties(double const t, ParameterLib::SpatialPosition const& x,
                       MaterialPropertiesParameters const& mp)
        : Kn(mp.normal_stiffness(t, x)[0]),
          Ks(mp.shear_stiffness(t, x)[0]),
          Gc(mp.fracture_toughness(t, x)[0]),
          t_np(mp.peak_normal_traction(t, x)[0]),
          w_np(mp.fracture_opening_at_peak_traction(t, x)),
          w_nf(mp.fracture_opening_at_residual_traction(t, x))
    {
    }

    double const Kn;
    double const Ks;
    double const Gc;
    double const t_np;
    double const w_np;
    double const w_nf;
};

template <int DisplacementDim>
struct StateVariables
    : public FractureModelBase<DisplacementDim>::MaterialStateVariables
{
    void setInitialConditions() { damage = damage_prev; }

    void pushBackState() override { damage_prev = damage; }

    double damage;  ///< damage part of the state.

    // Initial values from previous timestep
    double damage_prev;  ///< \copydoc damage
};

/// The cohesive zone delamination model for mode I fracture introduced herein
/// follows a bilinear traction-separation law which is characterized by four
/// basic parameters: the initial normal and shear stiffness \f$K_n\f$,
/// \f$K_s\f$, the fracture toughness \f$G_c\f$ (also referred to as critical
/// energy release rate), and the peak tensile normal traction \f$t_{n,p}\f$.
template <int DisplacementDim>
class CohesiveZoneModeI final : public FractureModelBase<DisplacementDim>
{
public:
    std::unique_ptr<
        typename FractureModelBase<DisplacementDim>::MaterialStateVariables>
    createMaterialStateVariables() override
    {
        return std::make_unique<StateVariables<DisplacementDim>>();
    }

public:
public:
    explicit CohesiveZoneModeI(double const penalty_aperture_cutoff,
                               bool const tension_cutoff,
                               MaterialPropertiesParameters material_properties)
        : _penalty_aperture_cutoff(penalty_aperture_cutoff),
          _tension_cutoff(tension_cutoff),
          _mp(std::move(material_properties))
    {
    }

    /**
     * Computation of the constitutive relation for the Cohesive Zone Mode I
     * model.
     *
     * @param t           current time
     * @param x           current position in space
     * @param aperture0   initial fracture's aperture
     * @param sigma0      initial stress
     * @param w_prev      fracture displacement at previous time step
     * @param w           fracture displacement at current time step
     * @param sigma_prev  stress at previous time step
     * @param sigma       stress at current time step
     * @param C           tangent matrix for stress and fracture displacements
     * @param material_state_variables   material state variables
     */
    void computeConstitutiveRelation(
        double const t,
        ParameterLib::SpatialPosition const& x,
        double const aperture0,
        Eigen::Ref<Eigen::VectorXd const>
            sigma0,
        Eigen::Ref<Eigen::VectorXd const>
            w_prev,
        Eigen::Ref<Eigen::VectorXd const>
            w,
        Eigen::Ref<Eigen::VectorXd const>
            sigma_prev,
        Eigen::Ref<Eigen::VectorXd>
            sigma,
        Eigen::Ref<Eigen::MatrixXd>
            C,
        typename FractureModelBase<DisplacementDim>::MaterialStateVariables&
            material_state_variables) override;

    MaterialProperties evaluatedMaterialProperties(
        double const t, ParameterLib::SpatialPosition const& x) const
    {
        return MaterialProperties(t, x, _mp);
    }

private:
    /// Compressive normal displacements above this value will not enter the
    /// computation of the normal stiffness modulus of the fracture.
    /// \note Setting this to the initial aperture value allows negative
    /// apertures.
    double const _penalty_aperture_cutoff;

    /// If set no resistance to open the fracture over the initial aperture is
    /// opposed.
    bool const _tension_cutoff;

    MaterialPropertiesParameters _mp;
};

}  // namespace CohesiveZoneModeI
}  // namespace Fracture
}  // namespace MaterialLib

namespace MaterialLib
{
namespace Fracture
{
namespace CohesiveZoneModeI
{
extern template class CohesiveZoneModeI<2>;
extern template class CohesiveZoneModeI<3>;
}  // namespace CohesiveZoneModeI
}  // namespace Fracture
}  // namespace MaterialLib
back to top