Source code for liquepy.trigger.volumetric_strain

import numbers
import numpy as np
from liquepy.exceptions import deprecation


[docs]def calc_volumetric_strain_zhang_2004(factor_of_safety, q_c1n_cs): """ Calculates the Volumetric strain according to Zhang et al. (2002) Note: strain is not as a percentage doi: 10.1139/t02-047 :param factor_of_safety: float or array, factor of safety against liquefaction triggering :param q_c1n_cs: float, or array, corrected normalised clean sand cone tip resistance :return: strain as decimal (not percentage) """ if isinstance(factor_of_safety, numbers.Real) and isinstance(q_c1n_cs, numbers.Real): return _calc_single_volumetric_strain(factor_of_safety, q_c1n_cs) elif not isinstance(q_c1n_cs, numbers.Real) and not isinstance(factor_of_safety, numbers.Real): assert len(factor_of_safety) == len(q_c1n_cs) out_values = [] for i in range(len(factor_of_safety)): fs_value = factor_of_safety[i] ev_value = _calc_single_volumetric_strain(factor_of_safety[i], q_c1n_cs[i]) out_values.append(ev_value) return np.array(out_values) else: raise ValueError("Factor of safety and q_c1n_cs must be the same length")
[docs]def calc_volumetric_strain(factor_of_safety, q_c1n_cs): deprecation("Use calc_volumetric_strain_zhang_2004, note that new function returns strain not in percentage!") return None
[docs]def calculate_volumetric_strain(factor_of_safety, q_c1n_cs): deprecation("Use calc_volumetric_strain_zhang_2004, note that new function returns strain not in percentage!") return None
def _calc_single_volumetric_strain(factor_of_safety, q_c1n_cs): """ Determines the volumetric strain for a single value by interpolation of the equations by Zhang et al. (2002). Note: strain is not as a percentage :param factor_of_safety: :param q_c1n_cs: :return: """ fs_values = [0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 2, 300.] for i in range(len(fs_values)): if factor_of_safety < fs_values[i]: if i == 0: low_fs = fs_values[0] else: low_fs = fs_values[i - 1] high_fs = fs_values[i] ev_low = _calc_fixed_factor_safety_volumetric_strain(low_fs, q_c1n_cs) ev_high = _calc_fixed_factor_safety_volumetric_strain(high_fs, q_c1n_cs) ev_actual = np.interp(factor_of_safety, [low_fs, high_fs], [ev_low, ev_high]) return ev_actual def _calc_fixed_factor_safety_volumetric_strain(factor_of_safety, q_c1n_cs): """ Implementation of the equations from Zhang et al. (2002) Note ==== Must have the exact factor of safety :param factor_of_safety: :param q_c1n_cs: :return: """ if q_c1n_cs < 33: q_c1n_cs = 33. if q_c1n_cs > 200: q_c1n_cs = 200.0 if factor_of_safety == 0.5: e_v = 102 * q_c1n_cs ** -0.82 elif factor_of_safety == 0.6: if q_c1n_cs <= 147: e_v = 102 * q_c1n_cs ** -0.82 else: e_v = 2411 * q_c1n_cs ** -1.45 elif factor_of_safety == 0.7: if q_c1n_cs <= 110: e_v = 102 * q_c1n_cs ** -0.82 else: e_v = 1701 * q_c1n_cs ** -1.42 elif factor_of_safety == 0.8: if q_c1n_cs <= 80: e_v = 102 * q_c1n_cs ** -0.82 else: e_v = 1609 * q_c1n_cs ** -1.46 elif factor_of_safety == 0.9: if q_c1n_cs <= 60: e_v = 102 * q_c1n_cs ** -0.82 else: e_v = 1403 * q_c1n_cs ** -1.48 elif factor_of_safety == 1.0: e_v = 64 * q_c1n_cs ** -0.93 elif factor_of_safety == 1.1: e_v = 11 * q_c1n_cs ** -0.65 elif factor_of_safety == 1.2: e_v = 9.7 * q_c1n_cs ** -0.69 elif factor_of_safety == 1.3: e_v = 7.6 * q_c1n_cs ** -0.71 elif factor_of_safety == 2.0: e_v1p3 = 7.6 * q_c1n_cs ** -0.71 e_v = e_v1p3 - (e_v1p3 / 0.7) * (factor_of_safety - 1.3) # linear interpolate elif factor_of_safety > 2.0: e_v = 0 else: raise ValueError return e_v / 1e2