Source code for liquepy.element.models

import numpy as np
from liquepy import functions
import eqsig


[docs]class ShearTest(object): _stress = None _strain = None _pp = None _esig_v0 = None _i_liq = None _i_liq_strain = None _i_liq_pp = None _n_points = 0 _n_cycles = None _ru_limit = None _da_strain = None def __init__(self, stress, strain, esig_v0=1, sl=None, pp=None, n_cycles=None): self._strain = np.array(strain) self._stress = np.array(stress) self.sl = sl self._pp = pp if esig_v0 is not None: self._esig_v0 = esig_v0 self._n_points = len(stress) self._n_cycles = n_cycles @property def pp(self): return self._pp @property def stress(self): return self._stress @property def strain(self): return self._strain @property def esig_v0(self): return self._esig_v0 @property def i_liq(self): return self._i_liq @property def i_liq_strain(self): return self._i_liq_strain @property def i_liq_pp(self): return self._i_liq_pp @property def n_points(self): return self._n_points @property def n_cycles(self): return self._n_cycles @esig_v0.setter def esig_v0(self, value): self._esig_v0 = value @property def csr(self): try: return self.stress / self.esig_v0 except ValueError: return None @property def epp(self): try: return self.pp - self.pp[0] except ValueError: return None @property def ru(self): try: return self.epp / self.esig_v0 except ValueError: return None @n_cycles.setter def n_cycles(self, values): self._n_cycles = values
[docs] def set_pp_via_ru(self, ru, hydrostatic): epp = np.array(ru) * self.esig_v0 self._pp = epp + hydrostatic
[docs] def set_i_liq(self, ru_limit=None, esig_v_limit=None, strain_limit=None, da_strain_limit=None, or_none=True): if ru_limit is not None: self._ru_limit = ru_limit self._i_liq_pp = functions.determine_t_liq_index(self.ru, ru_limit, return_none=or_none) elif esig_v_limit is not None: ru_limit = 1 - esig_v_limit / self.esig_v0 self._ru_limit = ru_limit self._i_liq_pp = functions.determine_t_liq_index(self.ru, ru_limit, return_none=or_none) elif strain_limit is None: pass # print("No limit set for set_i_liq") if strain_limit is not None: self._i_liq_strain = functions.determine_t_liq_index(abs(self.strain), strain_limit, return_none=or_none) elif da_strain_limit is not None: pinds = eqsig.get_switched_peak_array_indices(self.strain) da_strains = self.get_da_strain_series() dind = np.where(da_strains > 0.05) if len(dind[0]): self._i_liq_strain = dind[0][0] if self._i_liq_pp is None: self._i_liq = self._i_liq_strain elif self._i_liq_strain is None: self._i_liq = self._i_liq_pp else: self._i_liq = min(self._i_liq_pp, self._i_liq_strain)
@property def ru_limit(self): return self._ru_limit @property def av_stress(self): average_stress = (self.stress[1:] + self.stress[:-1]) / 2 average_stress = np.insert(average_stress, 0, self.stress[0]) # Include first value return average_stress @property def delta_strain(self): # TODO: cache this parameter delta_strain = np.diff(self.strain) delta_strain = np.insert(delta_strain, 0, 0) return delta_strain
[docs] def get_da_strain_series(self): if self._da_strain is not None: return np.array(self._da_strain) pinds = eqsig.get_switched_peak_array_indices(self.strain) if pinds[-1] != len(self.strain) - 1: pinds = np.insert(pinds, len(pinds), len(self.strain) - 1) da_strains = [0] for j in range(len(pinds) - 1): curr_p_strain = self.strain[pinds[j]] sgn = np.sign(curr_p_strain) if sgn == 0 and j == 0: sgn = -1 * np.sign(self.strain[pinds[j + 1]]) da_strains += list(sgn * -1 * (self.strain[pinds[j] + 1: pinds[j + 1] + 1] - curr_p_strain)) self._da_strain = np.array(da_strains) return np.array(self._da_strain)