from o3seespy.command.nd_material.base_material import NDMaterialBase
[docs]class PressureIndependMultiYield(NDMaterialBase):
op_type = "PressureIndependMultiYield"
def __init__(self, osi, nd, rho, g_mod_ref, bulk_mod_ref, cohesion, peak_strain, phi=0.,
p_ref=100., d=0., n_surf=20, strains=None, ratios=None):
r"""
PressureIndependMultiYield material
Parameters
==========
matTag: int
integer tag identifying material
nd: float
Number of dimensions, 2 for plane-strain, and 3 for 3D analysis.
rho: float
Saturated soil mass density.
g_mod_ref, float
(:math:`G_0`) Reference low-strain shear modulus,
specified at a reference mean effective confining pressure (`p_ref`).
bulk_mod_ref: float
(:math:`B_r`) Reference bulk modulus,
specified at a reference mean effective confining pressure (`p_ref`)).
cohesion: float
(:math:`c`) Apparent cohesion at zero effective confinement.
peak_strain: float
(:math:`\gamma_{max}`) An octahedral shear strain at
which the maximum shear strength is reached,
specified at a reference mean effective confining
pressure refPress of p'r (see below).
phi: float
(:math:`phi`) Friction angle at peak shear
strength in degrees, optional (default is 0.0).
p_ref: float
(:math:`p'_ref`) Reference mean effective confining pressure at which
:math:`G_r`, :math:`B_r`, and :math:`\gamma_{max}`
are defined, optional (default is 100. kPa).
d: float
(:math:`d`) A positive constant defining variations
of :math:`G` and :math:`B` as a function of
instantaneous effective
confinement :math:`p'` (default is 0.0)
:math:`G=G_r(\frac{p'}{p'_ref})^d`
:math:`B=B_r(\frac{p'}{p'_ref})^d`
If :math:`\phi=0`, :math:`d` is reset to 0.0.
n_surf: float, optional
Number of yield surfaces, optional (must be less
than 40, default is 20). The surfaces are generated
based on the hyperbolic relation.
strains: list
Instead of automatic surfaces generation,
you can define yield surfaces directly based on
desired shear modulus reduction curve.
provide a list of shear strains and corresponding shear modulus reduction ratios (`ratios`)
ratios: list
Instead of automatic surfaces generation,
you can define yield surfaces directly based on
desired shear modulus reduction curve.
provide a list of shear strains and corresponding shear modulus reduction ratios (`ratios`)
"""
self.osi = osi
self.nd = nd
self.rho = float(rho)
self.g_mod_ref = float(g_mod_ref)
self.bulk_mod_ref = float(bulk_mod_ref)
self.cohesion = float(cohesion)
self.peak_strain = float(peak_strain)
self.phi = float(phi)
self.p_ref = float(p_ref)
self.d = float(d)
if strains is not None:
assert len(strains) == len(ratios)
yield_surf = []
for i in range(len(strains)):
yield_surf.append(strains[i])
yield_surf.append(ratios[i])
self.yield_surf = yield_surf
n_surf = -len(strains) # from docs 'add a minus sign in front of noYieldSurf'
else:
self.yield_surf = None
assert abs(n_surf) < 40
self.n_surf = int(n_surf)
if osi is not None:
osi.n_mat += 1
self._tag = osi.n_mat
self._parameters = [self.op_type, self._tag, self.nd, self.rho, self.g_mod_ref, self.bulk_mod_ref,
self.cohesion, self.peak_strain, self.phi, self.p_ref, self.d]
if self.yield_surf is not None:
self._parameters.append(self.n_surf)
self._parameters += list(self.yield_surf)
else:
# self._keyword_args['noYieldSurf'] = self.no_yield_surf
self._parameters.append(self.n_surf)
if osi is None:
self.built = 0
if osi is not None:
self.to_process(osi)
[docs] def update_to_nonlinear(self):
from o3seespy import update_material_stage
update_material_stage(self.osi, self, 1)
[docs] def update_to_linear(self):
from o3seespy import update_material_stage
update_material_stage(self.osi, self, 0)
[docs] def set_nu(self, nu, ele=None, eles=None, adj_g_mod=False):
if adj_g_mod:
g_mod = 3 * self.bulk_mod_ref * (1 - 2 * nu) / (2 * (1 + nu))
self.set_parameter(self.osi, 'shearModulus', g_mod, ele, eles)
else:
bulk_mod = 2 * self.g_mod_ref * (1 + nu) / (3 * (1 - 2 * nu))
self.set_parameter(self.osi, 'bulkModulus', bulk_mod, ele, eles)
@property
def nu(self):
return (3 * self.bulk_mod_ref - 2 * self.g_mod_ref) / (2 * (3 * self.bulk_mod_ref + self.g_mod_ref))
[docs]class PressureDependMultiYield(NDMaterialBase):
"""
The PressureDependMultiYield NDMaterial Class
PressureDependMultiYield material is an elastic-plastic material for simulating the essential response
characteristics of pressure sensitive soil materials under general loading conditions. Such
characteristics include dilatancy (shear-induced volume contraction or dilation) and
non-flow liquefaction (cyclic mobility), typically exhibited in sands or silts during monotonic or cyclic loading.
"""
op_type = 'PressureDependMultiYield'
def __init__(self, osi, nd, rho, g_mod_ref, bulk_mod_ref, phi, peak_strain, p_ref,
d, pt_ang, con_rate, dil_rates, liquefac, n_surf=20.0, strains=None, ratios=None,
e_init=0.6, cs_params=None, c=0.3):
r"""
Initial method for PressureDependMultiYield
Parameters
----------
osi: o3seespy.OpenSeesInstance
nd: int
Number of dimensions, 2 for plane-strain, and 3 for 3d analysis.
rho: float
Saturated soil mass density.
g_mod_ref, float
(:math:`G_0`) Reference low-strain shear modulus,
specified at a reference mean effective confining pressure (`p_ref`).
bulk_mod_ref: float
(:math:`B_r`) Reference bulk modulus,
specified at a reference mean effective confining pressure (`p_ref`)).
phi: float
(:math:`phi`) friction angle at peak shear strength in degrees, optional (default is 0.0).
peak_strain: float
(:math:`\\gamma_{max}`) An octahedral shear strain at
which the maximum shear strength is reached,
specified at a reference mean effective confining
pressure refPress of p'r (see below).
p_ref: float
(:math:`p'_r`) reference mean effective confining pressure at which :math:`g_r`, :math:`b_r`, and
:math:`\gamma_{max}` are defined, optional (default is 100. kpa).
d: float
(:math:`d`) a positive constant defining variations of :math:`g` and :math:`b` as a function of
instantaneous effective confinement :math:`p'` (default is 0.0) :math:`g=g_r(\frac{p'}{p'_r})^d`
:math:`b=b_r(\frac{p'}{p'_r})^d` if :math:`\phi=0`, :math:`d` is reset to 0.0.
pt_ang: float
(:math:`\phi_{pt}`) phase transformation angle, in degrees.
con_rate: float
A non-negative constant defining the rate of shear-induced volume decrease (contraction) or pore pressure
buildup. a larger value corresponds to faster contraction rate.
dil_rates: list
Non-negative constants defining the rate of shear-induced volume increase (dilation). larger values
correspond to stronger dilation rate. ``dil_rates = [dilat1, dilat2]``.
liquefac: list
Parameters controlling the mechanism of liquefaction-induced perfectly plastic shear strain accumulation,
i.e., cyclic mobility. set ``liquefac[0] = 0`` to deactivate this mechanism altogether. ``liquefac[0]`` defines the
effective confining pressure (e.g., 10 kpa in si units or 1.45 psi in english units) below which the mechanism is
in effect. smaller values should be assigned to denser sands. ``liquefac[1]`` defines the maximum amount of
perfectly plastic shear strain developed at zero effective confinement during each loading phase. smaller
values should be assigned to denser sands. ``liquefac[2]`` defines the maximum amount of biased
perfectly plastic shear strain :math:`\gamma_b` accumulated at each loading phase under biased
shear loading conditions, as :math:`\gamma_b=liquefac[1]\times liquefac[2]`. typically,
:math:`liquefac[2]` takes a value between 0.0 and 3.0. smaller values should be
assigned to denser sands. see the references listed at the end of this chapter for more information.
n_surf: int, optional
Number of yield surfaces, optional (must be less than 40, default is 20). the surfaces are generated based
on the hyperbolic relation defined in note 2 below.
strains: list
Instead of automatic surfaces generation,
you can define yield surfaces directly based on
desired shear modulus reduction curve.
provide a list of shear strains and corresponding shear modulus reduction ratios (`ratios`)
ratios: list
Instead of automatic surfaces generation,
you can define yield surfaces directly based on
desired shear modulus reduction curve.
provide a list of shear strains and corresponding shear modulus reduction ratios (`ratios`)
e_init: float, optional
Initial void ratio, optional (default is 0.6).
cs_params: list (default=[0.9, 0.02, 0.7, 101.0]), optional
``params=[cs1, cs2, cs3, pa]`` defining a straight critical-state line ec in e-p' space. if cs3=0, ec =
cs1-cs2 log(p'/pa) else (li and wang, jgge, 124(12)), ec = cs1-cs2(p'/pa)cs3 where pa is atmospheric pressure for
normalization (typically 101 kpa in si units, or 14.65 psi in english units). all four constants are optional
c: float, optional
Numerical constant (default value = 0.3 kPa)
"""
self.osi = osi
self.nd = int(nd)
self.rho = float(rho)
self.g_mod_ref = float(g_mod_ref)
self.bulk_mod_ref = float(bulk_mod_ref)
self.peak_strain = float(peak_strain)
self.phi = float(phi)
self.p_ref = float(p_ref)
self.d = float(d)
self.pt_ang = float(pt_ang)
self.con_rate = float(con_rate)
self.dil_rates = dil_rates
self.liquefac = liquefac
assert n_surf < 40
self.n_surf = int(n_surf)
if strains is not None:
assert len(strains) == len(ratios)
yield_surf = []
for i in range(len(strains)):
yield_surf.append(ratios[i])
yield_surf.append(strains[i])
self.yield_surf = yield_surf
else:
self.yield_surf = None
self.e_init = float(e_init)
self.cs_params = cs_params
self.c = float(c)
if osi is not None:
osi.n_mat += 1
self._tag = osi.n_mat
self._parameters = [self.op_type, self._tag, self.nd, self.rho, self.g_mod_ref, self.bulk_mod_ref,
self.phi, self.peak_strain, self.p_ref, self.d, self.pt_ang,
self.con_rate, *self.dil_rates, *self.liquefac, self.n_surf]
if self.yield_surf is not None:
self._parameters += list(self.yield_surf)
special_pms = ['e_init', 'cs_params', 'c']
packets = [False, True, False]
for i, pm in enumerate(special_pms):
if getattr(self, pm) is not None:
if packets[i]:
self._parameters += [*getattr(self, pm)]
else:
self._parameters += [getattr(self, pm)]
else:
break
if osi is None:
self.built = 0
if osi is not None:
self.to_process(osi)
[docs] def update_to_nonlinear(self):
from o3seespy import update_material_stage
update_material_stage(self.osi, self, 1)
[docs] def set_nu(self, nu, ele=None, eles=None, adj_g_mod=False):
if adj_g_mod:
g_mod = 3 * self.bulk_mod_ref * (1 - 2 * nu) / (2 * (1 + nu))
self.set_parameter(self.osi, 'shearModulus', g_mod, ele, eles)
else:
bulk_mod = 2 * self.g_mod_ref * (1 + nu) / (3 * (1 - 2 * nu))
self.set_parameter(self.osi, 'bulkModulus', bulk_mod, ele, eles)
@property
def nu(self):
return (3 * self.bulk_mod_ref - 2 * self.g_mod_ref) / (2 * (3 * self.bulk_mod_ref + self.g_mod_ref))
[docs]class PressureDependMultiYield02(NDMaterialBase):
r"""
The PressureDependMultiYield02 NDMaterial Class
PressureDependMultiYield02 material is modified from PressureDependMultiYield material, with:#. additional
parameters (``contrac[2]`` and ``dilat[2]``) to account for :math:`K_{\sigma}` effect,#. a parameter to
account for the influence of previous dilation history on subsequent contraction phase
(``contrac[1]``), and#. modified logic related to permanent shear strain accumulation
(``liquefac[0]`` and ``liquefac[1]``).
"""
op_type = 'PressureDependMultiYield02'
def __init__(self, osi, nd, rho, g_mod_ref, bulk_mod_ref, phi, peak_strain, p_ref,
d, pt_ang, con_rates, dil_rates, liquefac=(1., 0.), n_surf=20.0, strains=None, ratios=None,
e_init=0.6, cs_params=None, c=0.1):
r"""
Initial method for PressureDependMultiYield02
Parameters
----------
osi: o3seespy.OpenSeesInstance
nd: int
Number of dimensions, 2 for plane-strain, and 3 for 3d analysis.
rho: float
Saturated soil mass density.
g_mod_ref, float
(:math:`G_0`) Reference low-strain shear modulus,
specified at a reference mean effective confining pressure (`p_ref`).
bulk_mod_ref: float
(:math:`B_r`) Reference bulk modulus,
specified at a reference mean effective confining pressure (`p_ref`)).
phi: float
(:math:`phi`) friction angle at peak shear strength in degrees, optional (default is 0.0).
peak_strain: float
(:math:`\\gamma_{max}`) An octahedral shear strain at
which the maximum shear strength is reached,
specified at a reference mean effective confining
pressure refPress of p'r (see below).
p_ref: float
(:math:`p'_r`) reference mean effective confining pressure at which :math:`g_r`, :math:`b_r`, and
:math:`\gamma_{max}` are defined, optional (default is 100. kpa).
d: float
(:math:`d`) a positive constant defining variations of :math:`g` and :math:`b` as a function of
instantaneous effective confinement :math:`p'` (default is 0.0) :math:`g=g_r(\frac{p'}{p'_r})^d`
:math:`b=b_r(\frac{p'}{p'_r})^d` if :math:`\phi=0`, :math:`d` is reset to 0.0.
pt_ang: float
(:math:`\phi_{pt}`) phase transformation angle, in degrees.
con_rates: list
A list of constants defining contraction behaviour `[contrac1, contrac2, contrac3]`.
`contrac1`: non-negative constant defining the rate of shear-induced volume decrease (contraction)
or pore pressure buildup. a larger value corresponds to faster contraction rate.
`contrac2`: A non-negative constant reflecting dilation history on contraction tendency.
`contrac3`: A non-negative constant reflecting Kσ effect.
dil_rates: list
A list of constants defining contraction behaviour `[dilat1, dilat2, dilat3]`.
`dilat1` and `dilat2`: Non-negative constants defining the rate of shear-induced volume
increase (dilation). larger values correspond to stronger dilation rate.
`dilat3`: A non-negative constant reflecting Kσ effect.
liquefac: list
Parameters controlling the mechanism of liquefaction-induced perfectly plastic shear strain accumulation,
i.e., cyclic mobility. [`liquefac1`, `liquefac2`]. NOTE: Different from `PressureDependMultiYield`.
`liquefac1`: Damage parameter to define accumulated permanent shear strain as a function of
dilation history.
`liquefac2`: Damage parameter to define biased accumulation of permanent shear strain as a
function of load reversal history.
n_surf: int, optional
Number of yield surfaces, optional (must be less than 40, default is 20). the surfaces are generated based
on the hyperbolic relation defined in note 2 below.
strains: list
Instead of automatic surfaces generation,
you can define yield surfaces directly based on
desired shear modulus reduction curve.
provide a list of shear strains and corresponding shear modulus reduction ratios (`ratios`)
ratios: list
Instead of automatic surfaces generation,
you can define yield surfaces directly based on
desired shear modulus reduction curve.
provide a list of shear strains and corresponding shear modulus reduction ratios (`ratios`)
e_init: float, optional
Initial void ratio, optional (default is 0.6).
cs_params: list (default=[0.9, 0.02, 0.7, 101.0]), optional
``params=[cs1, cs2, cs3, pa]`` defining a straight critical-state line ec in e-p' space. if cs3=0, ec =
cs1-cs2 log(p'/pa) else (li and wang, jgge, 124(12)), ec = cs1-cs2(p'/pa)cs3 where pa is atmospheric pressure for
normalization (typically 101 kpa in si units, or 14.65 psi in english units). all four constants are optional
c: float, optional
Numerical constant (default value = 0.1 kPa)
"""
self.osi = osi
self.nd = int(nd)
self.rho = float(rho)
self.g_mod_ref = float(g_mod_ref)
self.bulk_mod_ref = float(bulk_mod_ref)
self.peak_strain = float(peak_strain)
self.phi = float(phi)
self.p_ref = float(p_ref)
self.d = float(d)
self.pt_ang = float(pt_ang)
self.con_rates = con_rates
contrac1 = con_rates[0]
contrac2 = con_rates[1]
contrac3 = con_rates[2]
self.dil_rates = dil_rates
dilat1 = dil_rates[0]
dilat2 = dil_rates[1]
dilat3 = dil_rates[2]
self.liquefac = liquefac
assert n_surf < 40
self.n_surf = int(n_surf)
if strains is not None:
assert len(strains) == len(ratios)
yield_surf = []
for i in range(len(strains)):
yield_surf.append(ratios[i])
yield_surf.append(strains[i])
self.yield_surf = yield_surf
else:
self.yield_surf = None
self.e_init = float(e_init)
self.cs_params = cs_params
self.c = float(c)
if osi is not None:
osi.n_mat += 1
self._tag = osi.n_mat
self._parameters = [self.op_type, self._tag, self.nd, self.rho, self.g_mod_ref, self.bulk_mod_ref,
self.phi, self.peak_strain, self.p_ref, self.d, self.pt_ang,
contrac1, contrac3, dilat1, dilat3, self.n_surf]
if self.yield_surf is not None:
self._parameters += list(self.yield_surf)
self._parameters += [contrac2, dilat2]
special_pms = ['liquefac', 'e_init', 'cs_params', 'c']
packets = [True, False, True, False]
for i, pm in enumerate(special_pms):
if getattr(self, pm) is not None:
if packets[i]:
self._parameters += [*getattr(self, pm)]
else:
self._parameters += [getattr(self, pm)]
else:
break
if osi is None:
self.built = 0
if osi is not None:
self.to_process(osi)
[docs] def update_to_nonlinear(self):
from o3seespy import update_material_stage
update_material_stage(self.osi, self, 1)
[docs] def set_nu(self, nu, ele=None, eles=None, adj_g_mod=False):
if adj_g_mod:
g_mod = 3 * self.bulk_mod_ref * (1 - 2 * nu) / (2 * (1 + nu))
self.set_parameter(self.osi, 'shearModulus', g_mod, ele, eles)
else:
bulk_mod = 2 * self.g_mod_ref * (1 + nu) / (3 * (1 - 2 * nu))
self.set_parameter(self.osi, 'bulkModulus', bulk_mod, ele, eles)
@property
def nu(self):
return (3 * self.bulk_mod_ref - 2 * self.g_mod_ref) / (2 * (3 * self.bulk_mod_ref + self.g_mod_ref))
[docs]class PressureDependMultiYield03(NDMaterialBase):
"""
The PressureDependMultiYield03 NDMaterial Class
The reference for PressureDependMultiYield03 material: Khosravifar, A., Elgamal, A., Lu, J., and Li, J. [2018]. "A
3D model for earthquake-induced liquefaction triggering and post-liquefaction response." Soil Dynamics and Earthquake
Engineering, 110, 43-52)PressureDependMultiYield03 is modified from PressureDependMultiYield02 material to comply
with the established guidelines on the dependence of liquefaction triggering to the number of loading cycles,
effective overburden stress (Kσ), and static shear stress (Kα).The explanations of parametersSee `notes
<http://opensees.berkeley.edu/wiki/index.php/PressureDependMultiYield02_Material>`_
"""
op_type = 'PressureDependMultiYield03'
def __init__(self, osi, nd, rho, ref_shear_modul, ref_bulk_modul, friction_ang, peak_shear_stra, ref_press, press_depend_coe, pt_ang, ca, cb, cc, cd, ce, da, db, dc, no_yield_surf=20.0, yield_surf: float=None, liquefac1=1, liquefac2=0., pa=101, s0=1.73):
"""
Initial method for PressureDependMultiYield03
Parameters
----------
osi: o3seespy.OpenSeesInstance
nd: None
rho: None
ref_shear_modul: None
ref_bulk_modul: None
friction_ang: None
peak_shear_stra: None
ref_press: None
press_depend_coe: None
pt_ang: None
ca: None
cb: None
cc: None
cd: None
ce: None
da: None
db: None
dc: None
no_yield_surf: None, optional
yield_surf: None (default=True), optional
liquefac1: None, optional
liquefac2: None, optional
pa: None, optional
s0: None, optional
"""
self.osi = osi
self.nd = nd
self.rho = rho
self.ref_shear_modul = ref_shear_modul
self.ref_bulk_modul = ref_bulk_modul
self.friction_ang = friction_ang
self.peak_shear_stra = peak_shear_stra
self.ref_press = ref_press
self.press_depend_coe = press_depend_coe
self.pt_ang = pt_ang
self.ca = ca
self.cb = cb
self.cc = cc
self.cd = cd
self.ce = ce
self.da = da
self.db = db
self.dc = dc
self.no_yield_surf = no_yield_surf
self.yield_surf = yield_surf
self.liquefac1 = liquefac1
self.liquefac2 = liquefac2
self.pa = pa
self.s0 = s0
if osi is not None:
osi.n_mat += 1
self._tag = osi.n_mat
self._parameters = [self.op_type, self._tag, self.nd, self.rho, self.ref_shear_modul, self.ref_bulk_modul, self.friction_ang, self.peak_shear_stra, self.ref_press, self.press_depend_coe, self.pt_ang, self.ca, self.cb, self.cc, self.cd, self.ce, self.da, self.db, self.dc, self.no_yield_surf]
special_pms = ['yield_surf', 'liquefac1', 'liquefac2', 'pa', 's0']
packets = [True, False, False, False, False]
for i, pm in enumerate(special_pms):
if getattr(self, pm) is not None:
if packets[i]:
self._parameters += [*getattr(self, pm)]
else:
self._parameters += [getattr(self, pm)]
else:
break
if osi is None:
self.built = 0
if osi is not None:
self.to_process(osi)
[docs] def set_update_material_stage(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'updateMaterialStage', value, ele, eles)
[docs] def set_g_mod(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'shearModulus', value, ele, eles)
[docs] def set_bulk_mod(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'bulkModulus', value, ele, eles)
[docs] def set_friction_angle(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'updateMaterialStage', value, ele, eles)
[docs] def set_cohesion(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'shearModulus', value, ele, eles)