Source code for groundhog.deepfoundations.axialcapacity.negativeskinfriction

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'Bruno Stuyts'

# Native Python packages

# 3rd party packages
import numpy as np
from scipy.integrate import cumtrapz

# Project imports
from groundhog.general.validation import Validator


NEGATIVESKINFRICTION_PILEGROUP_ZEEVAERTDEBEER = {
    'depths': {'type': 'list', 'elementtype': 'float', 'order': 'ascending', 'unique': True, 'empty_allowed': False},
    'effective_unit_weights': {'type': 'list', 'elementtype': 'float', 'order': None, 'unique': False,
                               'empty_allowed': False},
    'lateral_earth_pressure_coefficients': {'type': 'list', 'elementtype': 'float', 'order': None, 'unique': False,
                                            'empty_allowed': False},
    'interface_friction_angles': {'type': 'list', 'elementtype': 'float', 'order': None, 'unique': False,
                                  'empty_allowed': False},
    'surcharge': {'type': 'float', 'min_value': 0.0, 'max_value': None},
    'diameter': {'type': 'float', 'min_value': 0.01, 'max_value': 10.0},
    'diameter_influence': {'type': 'float', 'min_value': 0.0, 'max_value': None},
}

NEGATIVESKINFRICTION_PILEGROUP_ZEEVAERTDEBEER_ERRORRETURN = {
    'virgin_effective_stress [kPa]': np.nan,
    'group_effective_stress [kPa]': np.nan,
    'negative_skin_friction_profile_single [kN]': np.nan,
    'negative_skin_friction_profile_group [kN]': np.nan,
    'negative_skin_friction [kN]': np.nan,
    'negative_skin_friction_group [kN]': np.nan,
}


[docs] @Validator(NEGATIVESKINFRICTION_PILEGROUP_ZEEVAERTDEBEER, NEGATIVESKINFRICTION_PILEGROUP_ZEEVAERTDEBEER_ERRORRETURN) def negativeskinfriction_pilegroup_zeevaertdebeer( depths, effective_unit_weights, lateral_earth_pressure_coefficients, interface_friction_angles, surcharge, diameter, diameter_influence, **kwargs): """ Calculates the negative skin friction for a pile in a pile group according to the method of Zeevaert en De Beer. To allow any unit weight profile, the differential equation is solved in finite difference form. :param depths: Array with depths used for the calculation (:math:`z`) [:math:`m`] - Elementtype: float, order: ascending, unique: True, empty entries allowed: False :param effective_unit_weights: Array with effective unit weights used for the calculation (:math:`\\gamma^{\\prime}`) [:math:`kN/m3`] - Elementtype: float, order: None, unique: False, empty entries allowed: False :param lateral_earth_pressure_coefficients: Array with lateral earth pressure coefficient at each depth (:math:`K_0`) [:math:`-`] - Elementtype: float, order: None, unique: False, empty entries allowed: False :param interface_friction_angles: Array with interface friction angles (:math:`\\delta^{\\prime}`) [:math:`deg`] - Elementtype: float, order: None, unique: False, empty entries allowed: False :param surcharge: Amount of stress applied on top of the soil mass (:math:`p_0^{\\prime}`) [:math:`kPa`] - Suggested range: surcharge >= 0.0 :param diameter: Pile diameter (:math:`D_p`) [:math:`m`] - Suggested range: 0.01 <= diameter <= 10.0 :param diameter_influence: Diameter of the zone of influence for negative skin friction (:math:`D_n`) [:math:`m`] - Suggested range: diameter_influence >= 0.0 .. math:: \\frac{d \\sigma_v^{\\prime}}{dz} = \\gamma^{\\prime} - \\tau \\cdot \\frac{O_s}{A} m = K_0 \\cdot \\tan \\delta^{\\prime} \\cdot \\frac{O_s}{A} \\frac{\\Delta \\sigma_{v,i+1}^{\\prime}}{\\Delta z} - \\gamma^{\\prime} + m \\cdot \\sigma_{v,i}^{\\prime} = 0 \\sigma_{v,0}^{\\prime} = p_0^{\\prime} O_s = \\pi \\cdot D_p A = \\frac{\\pi}{4} \\cdot \\left( D_n^2 - D_p^2 \\right) :returns: Dictionary with the following keys: - 'virgin_effective_stress [kPa]': Effective stress profile in the absence of surcharge (:math:`\\sigma_{vo}^{\\prime}`) [:math:`kPa`] - 'group_effective_stress [kPa]': Effective stress accounting for the effect of soil hanging on the pile (:math:`\\sigma_{v}^{\\prime}`) [:math:`kPa`] - 'negative_skin_friction_profile_single [kN]': Cumulative negative skin friction for a single pile (:math:`F_{n}`) [:math:`kN`] - 'negative_skin_friction_profile_group [kN]': Cumulative negative skin friction for pile in the group (:math:`F_{n, group}`) [:math:`kN`] - 'negative_skin_friction [kN]': Total value of negative skin friction for a single pile (:math:`F_{n,tot}`) [:math:`kN`] - 'negative_skin_friction_group [kN]': Total value of negative skin friction for a pile in a group (:math:`F_{n,tot,group}`) [:math:`kN`] .. figure:: images/negativeskinfriction_pilegroup_zeevaertdebeer_1.png :figwidth: 500.0 :width: 450.0 :align: center Pile group with contributing soil and equilibrium of infinitesimal soil slice Reference - Zeevaert - De Beer (1966) """ # Validation if diameter_influence < diameter: raise ValueError("Diameter of the zone of influence should be greated than the pile diameter") if len(depths) != len(effective_unit_weights) or len(depths) != len(lateral_earth_pressure_coefficients) or \ len(depths) != len(interface_friction_angles): raise ValueError("All array inputs should have equal lengths") area = 0.25 * np.pi * ((diameter_influence) ** 2 - diameter ** 2) circumference = np.pi * diameter m_values = np.array(lateral_earth_pressure_coefficients) * \ np.tan(np.radians(np.array(interface_friction_angles))) * \ (circumference / area) _virgin_effective_stress = np.append(0, cumtrapz( y=np.array(effective_unit_weights), x=np.array(depths))) + surcharge sigma_v_neg_fd = np.zeros(len(depths)) sigma_v_neg_fd[0] = surcharge for i, z in enumerate(depths): if i > 0: sigma_v_neg_fd[i] = np.diff(depths)[0] * ( effective_unit_weights[i] - m_values[i] * sigma_v_neg_fd[i - 1] + (sigma_v_neg_fd[i - 1] / np.diff(depths)[0])) _group_effective_stress = sigma_v_neg_fd _negative_skin_friction_profile_single = \ np.append(0, cumtrapz(_virgin_effective_stress, depths)) * \ np.pi * diameter * np.array(lateral_earth_pressure_coefficients) * \ np.tan(np.radians(np.array(interface_friction_angles))) _negative_skin_friction_profile_group = \ np.append(0, cumtrapz(sigma_v_neg_fd, depths)) * \ np.pi * diameter * np.array(lateral_earth_pressure_coefficients) * \ np.tan(np.radians(np.array(interface_friction_angles))) _negative_skin_friction = _negative_skin_friction_profile_single[-1] _negative_skin_friction_group = _negative_skin_friction_profile_group[-1] return { 'virgin_effective_stress [kPa]': _virgin_effective_stress, 'group_effective_stress [kPa]': _group_effective_stress, 'negative_skin_friction_profile_single [kN]': _negative_skin_friction_profile_single, 'negative_skin_friction_profile_group [kN]': _negative_skin_friction_profile_group, 'negative_skin_friction [kN]': _negative_skin_friction, 'negative_skin_friction_group [kN]': _negative_skin_friction_group, }