from o3seespy.command.uniaxial_material.base_material import UniaxialMaterialBase
[docs]class Elastic(UniaxialMaterialBase):
"""
The Elastic UniaxialMaterial Class
This command is used to construct an elastic uniaxial material object.
"""
op_type = 'Elastic'
def __init__(self, osi, e_mod, eta=0.0, eneg: float=None):
"""
Initial method for Elastic
Parameters
----------
osi: o3seespy.OpenSeesInstance
e_mod: float
Tangent
eta: float, optional
Damping tangent (optional, default=0.0)
eneg: float (default=True), optional
Tangent in compression (optional, default=e)
Examples
--------
>>> import o3seespy as o3
>>> osi = o3.OpenSeesInstance(ndm=2)
>>> o3.uniaxial_material.Elastic(osi, e_mod=1.0, eta=0.0, eneg=None)
"""
self.osi = osi
self.e_mod = float(e_mod)
self.eta = float(eta)
if eneg is None:
self.eneg = None
else:
self.eneg = float(eneg)
if osi is not None:
osi.n_mat += 1
self._tag = osi.n_mat
self._parameters = [self.op_type, self._tag, self.e_mod, self.eta]
special_pms = ['eneg']
packets = [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_e_mod(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'E', value, ele, eles)
[docs] def set_epos(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'Epos', value, ele, eles)
[docs] def set_eneg(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'Eneg', value, ele, eles)
[docs] def set_eta(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'eta', value, ele, eles)
[docs]class ElasticPP(UniaxialMaterialBase):
"""
The ElasticPP UniaxialMaterial Class
This command is used to construct an elastic perfectly-plastic uniaxial material object.
"""
op_type = 'ElasticPP'
def __init__(self, osi, e_mod, epsy_p, epsy_n: float=None, eps0=0.0):
"""
Initial method for ElasticPP
Parameters
----------
osi: o3seespy.OpenSeesInstance
e_mod: float
Tangent
epsy_p: float
Strain or deformation at which material reaches plastic state in tension
epsy_n: float (default=True), optional
Strain or deformation at which material reaches plastic state in compression. (optional, default is tension
value)
eps0: float, optional
Initial strain (optional, default: zero)
Examples
--------
>>> import o3seespy as o3
>>> osi = o3.OpenSeesInstance(ndm=2)
>>> o3.uniaxial_material.ElasticPP(osi, e_mod=1.0, epsy_p=1.0, epsy_n=None, eps0=0.0)
"""
self.osi = osi
self.e_mod = float(e_mod)
self.epsy_p = float(epsy_p)
if epsy_n is None:
self.epsy_n = None
else:
self.epsy_n = float(epsy_n)
self.eps0 = float(eps0)
if osi is not None:
osi.n_mat += 1
self._tag = osi.n_mat
self._parameters = [self.op_type, self._tag, self.e_mod, self.epsy_p]
special_pms = ['epsy_n', 'eps0']
packets = [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_fy(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'Fy', value, ele, eles)
[docs] def set_e_mod(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'E', value, ele, eles)
[docs] def set_ep(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'ep', value, ele, eles)
[docs]class ElasticPPGap(UniaxialMaterialBase):
"""
The ElasticPPGap UniaxialMaterial Class
This command is used to construct an elastic perfectly-plastic gap uniaxial material object.
"""
op_type = 'ElasticPPGap'
def __init__(self, osi, e_mod, fy, gap, eta=0.0, damage='noDamage'):
"""
Initial method for ElasticPPGap
Parameters
----------
osi: o3seespy.OpenSeesInstance
e_mod: float
Tangent
fy: float
Stress or force at which material reaches plastic state
gap: float
Initial gap (strain or deformation)
eta: float, optional
Hardening ratio (=eh/e), which can be negative
damage: str, optional
An optional string to specify whether to accumulate damage or not in the material. with the default
re-center on load reversal. is provided this recentering will not occur and gap will grow.
Examples
--------
>>> import o3seespy as o3
>>> osi = o3.OpenSeesInstance(ndm=2)
>>> o3.uniaxial_material.ElasticPPGap(osi, e_mod=1.0, fy=1.0, gap=1.0, eta=0.0, damage='noDamage')
"""
self.osi = osi
self.e_mod = float(e_mod)
self.fy = float(fy)
self.gap = float(gap)
self.eta = float(eta)
self.damage = damage
if osi is not None:
osi.n_mat += 1
self._tag = osi.n_mat
self._parameters = [self.op_type, self._tag, self.e_mod, self.fy, self.gap, self.eta, self.damage]
if osi is None:
self.built = 0
if osi is not None:
self.to_process(osi)
[docs]class ENT(UniaxialMaterialBase):
"""
The ENT UniaxialMaterial Class
This command is used to construct a uniaxial elastic-no tension material object.
"""
op_type = 'ENT'
def __init__(self, osi, e_mod):
"""
Initial method for ENT
Parameters
----------
osi: o3seespy.OpenSeesInstance
e_mod: float
Tangent
Examples
--------
>>> import o3seespy as o3
>>> osi = o3.OpenSeesInstance(ndm=2)
>>> o3.uniaxial_material.ENT(osi, e_mod=1.0)
"""
self.osi = osi
self.e_mod = float(e_mod)
if osi is not None:
osi.n_mat += 1
self._tag = osi.n_mat
self._parameters = [self.op_type, self._tag, self.e_mod]
if osi is None:
self.built = 0
if osi is not None:
self.to_process(osi)
[docs] def set_e_mod(self, value, ele=None, eles=None):
self.set_parameter(self.osi, 'E', value, ele, eles)
[docs]class Parallel(UniaxialMaterialBase):
"""
The Parallel UniaxialMaterial Class
This command is used to construct a parallel material object made up of an arbitrary number of
previously-constructed UniaxialMaterial objects.
"""
op_type = 'Parallel'
def __init__(self, osi, mats, factor_args: list=None):
"""
Initial method for Parallel
Parameters
----------
osi: o3seespy.OpenSeesInstance
mats: list
Identification objects of materials making up the material model
factor_args: list, optional
Factors to create a linear combination of the specified materials. factors can be negative to subtract one
material from an other. (optional, default = 1.0)
Examples
--------
>>> import o3seespy as o3
>>> osi = o3.OpenSeesInstance(ndm=2)
>>> mats = [o3.uniaxial_material.Elastic(osi, e_mod=1.0, eta=0.0, eneg=None),
>>> o3.uniaxial_material.Elastic(osi, e_mod=1.0, eta=0.0, eneg=None)]
>>> factor_args = [1.0, 1.0]
>>> o3.uniaxial_material.Parallel(osi, mats=mats, factor_args=factor_args)
"""
self.osi = osi
self.mats = [x.tag for x in mats]
self.factor_args = factor_args
if osi is not None:
osi.n_mat += 1
self._tag = osi.n_mat
self._parameters = [self.op_type, self._tag, *self.mats]
if getattr(self, 'factor_args') is not None:
self._parameters += ['-factors', *self.factor_args]
if osi is None:
self.built = 0
if osi is not None:
self.to_process(osi)
[docs]class Series(UniaxialMaterialBase):
"""
The Series UniaxialMaterial Class
This command is used to construct a series material object made up of an arbitrary number of previously-constructed
UniaxialMaterial objects.
"""
op_type = 'Series'
def __init__(self, osi, mats):
"""
Initial method for Series
Parameters
----------
osi: o3seespy.OpenSeesInstance
mats: list
Identification objects of materials making up the material model
Examples
--------
>>> import o3seespy as o3
>>> osi = o3.OpenSeesInstance(ndm=2)
>>> mats = [o3.uniaxial_material.Elastic(osi, e_mod=1.0, eta=0.0, eneg=None),
>>> o3.uniaxial_material.Elastic(osi, e_mod=1.0, eta=0.0, eneg=None)]
>>> o3.uniaxial_material.Series(osi, mats=mats)
"""
self.osi = osi
self.mats = mats
self.mat_tags = [x.tag for x in mats]
if osi is not None:
osi.n_mat += 1
self._tag = osi.n_mat
self._parameters = [self.op_type, self._tag, *self.mat_tags]
if osi is None:
self.built = 0
if osi is not None:
self.to_process(osi)