Source code for o3seespy.command.uniaxial_material.steel

from o3seespy.command.uniaxial_material.base_material import UniaxialMaterialBase



[docs]class Steel01(UniaxialMaterialBase): """ The Steel01 UniaxialMaterial Class This command is used to construct a uniaxial bilinear steel material object with kinematic hardening and optional isotropic hardening described by a non-linear evolution equation (REF: Fedeas). """ op_type = "Steel01" def __init__(self, osi, fy: float, e0: float, b: float, a1=None, a2=None, a3=None, a4=None): """ Initial method for Steel01 Parameters ---------- fy: float Yield strength e0: float Initial elastic tangent b: float Strain-hardening ratio (ratio between post-yield tangent and initial elastic tangent) a1: float Isotropic hardening parameter, increase of compression yield envelope as proportion of yield strength after a plastic strain of :math:`a_2*(f_y/e_0)` (optional) a2: float Isotropic hardening parameter a3: float Isotropic hardening parameter, increase of tension yield envelope as proportion of yield strength after a plastic strain of :math:`a_4*(f_y/e_0)`. (optional) a4: float Isotropic hardening parameter (see explanation """ self.osi = osi self.fy = float(fy) self.e0 = float(e0) self.b = float(b) self.a_values = [a1, a2, a3, a4] self.a1 = a1 self.a2 = a2 self.a3 = a3 self.a4 = a4 if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self.tag, self.fy, self.e0, self.b] for a in self.a_values: if a is None: break self._parameters.append(a) 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_b(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'b', value, ele, eles)
[docs] def set_a1(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a1', value, ele, eles)
[docs] def set_a2(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a2', value, ele, eles)
[docs] def set_a3(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a3', value, ele, eles)
[docs] def set_a4(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a4', value, ele, eles)
[docs]class Steel02(UniaxialMaterialBase): """ The Steel02 UniaxialMaterial Class This command is used to construct a uniaxial Giuffre-Menegotto-Pinto steel material object with isotropic strain hardening. """ op_type = 'Steel02' def __init__(self, osi, fy, e0, b, params, a1: float=None, a2=1.0, a3: float=None, a4=1.0, sig_init=0.0): r""" Initial method for Steel02 Parameters ---------- osi: o3seespy.OpenSeesInstance fy: float Yield strength e0: float Initial elastic tangent b: float Strain-hardening ratio (ratio between post-yield tangent and initial elastic tangent) params: list Parameters to control the transition from elastic to plastic branches. ``params=[r0,cr1,cr2]``. recommended values: r0=between 10 and 20, cr1=0.925, cr2=0.15 a1: float (default=True), optional Isotropic hardening parameter, increase of compression yield envelope as proportion of yield strength after a plastic strain of :math:`a_2*(f_y/e_0)` a2: float, optional Isotropic hardening parameter a3: float (default=True), optional Isotropic hardening parameter, increase of tension yield envelope as proportion of yield strength after a plastic strain of :math:`a_4*(f_y/e_0)`. a4: float, optional Isotropic hardening parameter (see explanation sig_init: float, optional Initial stress value (optional, default: 0.0) the strain is calculated from ``epsp=siginit/e`` :: if (siginit!= 0.0) { double epsinit = siginit/e; eps = trialstrain+epsinit; } else { eps = trialstrain; } Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.Steel02(osi, fy=1.0, e0=1.0, b=1.0, params=[15, 0.925, 0.15]) """ self.osi = osi self.fy = float(fy) self.e0 = float(e0) self.b = float(b) self.params = params if a1 is None: self.a1 = None else: self.a1 = float(a1) self.a2 = float(a2) if a3 is None: self.a3 = None else: self.a3 = float(a3) self.a4 = float(a4) self.sig_init = float(sig_init) if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fy, self.e0, self.b, *self.params] special_pms = ['a1', 'a2', 'a3', 'a4', 'sig_init'] packets = [False, 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_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_b(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'b', value, ele, eles)
[docs] def set_a1(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a1', value, ele, eles)
[docs] def set_a2(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a2', value, ele, eles)
[docs] def set_a3(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a3', value, ele, eles)
[docs] def set_a4(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a4', value, ele, eles)
[docs]class Hysteretic(UniaxialMaterialBase): """ The Hysteretic UniaxialMaterial Class This command is used to construct a uniaxial bilinear hysteretic material object with pinching of force and deformation, damage due to ductility and energy, and degraded unloading stiffness based on ductility. """ op_type = 'Hysteretic' def __init__(self, osi, p1, p2, p3=None, n1=None, n2=None, n3=None, pinch_x=1.0, pinch_y=1.0, damage1=0.0, damage2=0.0, beta=0.0): """ Initial method for Hysteretic Parameters ---------- osi: o3seespy.OpenSeesInstance p1: list ``p1=[s1p, e1p]``, stress and strain (or force & deformation) at first point of the envelope in the positive direction p2: list ``p2=[s2p, e2p]``, stress and strain (or force & deformation) at second point of the envelope in the positive direction p3: list (default=True), optional ``p3=[s3p, e3p]``, stress and strain (or force & deformation) at third point of the envelope in the positive direction n1: list ``n1=[s1n, e1n]``, stress and strain (or force & deformation) at first point of the envelope in the negative direction n2: list ``n2=[s2n, e2n]``, stress and strain (or force & deformation) at second point of the envelope in the negative direction n3: list (default=True), optional ``n3=[s3n, e3n]``, stress and strain (or force & deformation) at third point of the envelope in the negative direction pinch_x: float Pinching factor for strain (or deformation) during reloading pinch_y: float Pinching factor for stress (or force) during reloading damage1: float Damage due to ductility: d1(mu-1) damage2: float Damage due to energy: d2(eii/eult) beta: float, optional Power used to determine the degraded unloading stiffness based on ductility, mu-beta (optional, default=0.0) Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> p1 = [0.5, 0.5] >>> p2 = [1.0, 1.0] >>> p3 = [0, 1.5] >>> n1 = [-0.5, -0.5] >>> n2 = [-1.0, -1.0] >>> n3 = [0, -1.5] >>> o3.uniaxial_material.Hysteretic(osi, p1=p1, p2=p2, p3=p3, n1=n1, n2=n2, n3=n3, pinch_x=1, pinch_y=0, damage1=0, damage2=0) """ self.osi = osi self.p1 = p1 self.p2 = p2 self.p3 = p3 if n1 is None: self.n1 = [-p1[0], -p1[1]] else: self.n1 = n1 if n2 is None: self.n2 = [-p2[0], -p2[1]] else: self.n2 = n2 if n3 is None: if p3 is None: self.n3 = None else: self.n3 = [-p3[0], -p3[1]] else: self.n3 = n3 self.pinch_x = float(pinch_x) self.pinch_y = float(pinch_y) self.damage1 = float(damage1) self.damage2 = float(damage2) self.beta = float(beta) if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat if self.p3 is None: self._parameters = [self.op_type, self._tag, *self.p1, *self.p2, *self.n1, *self.n2] else: self._parameters = [self.op_type, self._tag, *self.p1, *self.p2, *self.p3, *self.n1, *self.n2, *self.n3] self._parameters += [self.pinch_x, self.pinch_y, self.damage1, self.damage2, self.beta] if osi is None: self.built = 0 if osi is not None: self.to_process(osi)
[docs]class ReinforcingSteelGABuck(UniaxialMaterialBase): """ The ReinforcingSteelGABuck UniaxialMaterial Class This command is used to construct a ReinforcingSteel uniaxial material object. This object is intended to be used in a reinforced concrete fiber section as the steel reinforcing material. """ op_type = 'ReinforcingSteel' def __init__(self, osi, fy, fu, es, esh, eps_sh, eps_ult, lsr, beta, r, gamma): """ Initial method for ReinforcingSteelGABuck Parameters ---------- osi: o3seespy.OpenSeesInstance fy: float Yield stress in tension fu: float Ultimate stress in tension es: float Initial elastic tangent esh: float Tangent at initial strain hardening eps_sh: float Strain corresponding to initial strain hardening eps_ult: float Strain at peak stress lsr: float Slenderness ratio beta: float Amplification factor for the buckled stress strain curve. r: float Buckling reduction factor r can be a real number between [0.0 and 1.0] r=1.0 full reduction (no buckling) r=0.0 no reduction 0.0<r<1.0 linear interpolation between buckled and unbuckled curves gamma: float Buckling constant Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.ReinforcingSteelGABuck(osi, fy=1.0, fu=1.0, es=1.0, esh=1.0, eps_sh=1.0, eps_ult=1.0, lsr=1.0, beta=1.0, r=1.0, gamma=1.0) """ self.osi = osi self.fy = float(fy) self.fu = float(fu) self.es = float(es) self.esh = float(esh) self.eps_sh = float(eps_sh) self.eps_ult = float(eps_ult) self.lsr = float(lsr) self.beta = float(beta) self.r = float(r) self.gamma = float(gamma) if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fy, self.fu, self.es, self.esh, self.eps_sh, self.eps_ult, '-GABuck', self.lsr, self.beta, self.r, self.gamma] if osi is None: self.built = 0 if osi is not None: self.to_process(osi)
[docs]class ReinforcingSteel(UniaxialMaterialBase): """ The ReinforcingSteelDMBuck UniaxialMaterial Class This command is used to construct a ReinforcingSteel uniaxial material object. This object is intended to be used in a reinforced concrete fiber section as the steel reinforcing material. """ op_type = 'ReinforcingSteel' def __init__(self, osi, fy, fu, e_mod, e_mod_sh, eps_sh, eps_ult, buck=None, cm_fatigue=None, mp_curve=None): """ Initial method for ReinforcingSteelDMBuck Parameters ---------- osi: o3seespy.OpenSeesInstance fy: float Yield stress in tension fu: float Ultimate stress in tension e_mod: float Initial elastic tangent e_mod_sh: float Tangent at initial strain hardening eps_sh: float Strain corresponding to initial strain hardening eps_ult: float Strain at peak stress lsr: float Slenderness ratio alpha: float, optional Coffin-manson constant a Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.ReinforcingSteelDMBuck(osi, fy=1.0, fu=1.0, e_mod=1.0, e_mod_sh=1.0, eps_sh=1.0, eps_ult=1.0, lsr_2=1, alpha=1.0) """ self.osi = osi self.fy = float(fy) self.fu = float(fu) self.e_mod = float(e_mod) self.e_mod_sh = float(e_mod_sh) self.eps_sh = float(eps_sh) self.eps_ult = float(eps_ult) if buck is None: self.buck_pms = [] else: self.buck_pms = [] # TODO: if cm_fatigue is None: self.cm_fatigue = None self.cm_params = [] else: self.cm_fatigue = cm_fatigue self.cm_params = ['-CMFatigue', cm_fatigue['cf'], cm_fatigue['alpha'], cm_fatigue['cd']] if mp_curve is None: self.mp_curve = None self.mp_params = [] else: self.mp_curve = mp_curve r1 = self.mp_curve.setdefault('r1', 0.333) r2 = self.mp_curve.setdefault('r2', 18) r3 = self.mp_curve.setdefault('r3', 4) self.mp_params = ['-MPCurveParams', r1, r2, r3] if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fy, self.fu, self.e_mod, self.e_mod_sh, self.eps_sh, self.eps_ult, *self.buck_pms, *self.cm_params, *self.mp_params] if osi is None: self.built = 0 if osi is not None: self.to_process(osi)
[docs]class ReinforcingSteelDMBuck(UniaxialMaterialBase): """ The ReinforcingSteelDMBuck UniaxialMaterial Class This command is used to construct a ReinforcingSteel uniaxial material object. This object is intended to be used in a reinforced concrete fiber section as the steel reinforcing material. """ op_type = 'ReinforcingSteel' def __init__(self, osi, fy, fu, e_mod, e_mod_sh, eps_sh, eps_ult, lsr, alpha=1.0, cm_fatigue=None, mp_curve=None): """ Initial method for ReinforcingSteelDMBuck Parameters ---------- osi: o3seespy.OpenSeesInstance fy: float Yield stress in tension fu: float Ultimate stress in tension e_mod: float Initial elastic tangent e_mod_sh: float Tangent at initial strain hardening eps_sh: float Strain corresponding to initial strain hardening eps_ult: float Strain at peak stress lsr: float Slenderness ratio alpha: float, optional Coffin-manson constant a Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.ReinforcingSteelDMBuck(osi, fy=1.0, fu=1.0, e_mod=1.0, e_mod_sh=1.0, eps_sh=1.0, eps_ult=1.0, lsr=1, alpha=1.0) """ self.osi = osi self.fy = float(fy) self.fu = float(fu) self.e_mod = float(e_mod) self.e_mod_sh = float(e_mod_sh) self.eps_sh = float(eps_sh) self.eps_ult = float(eps_ult) self.lsr = float(lsr) self.alpha = float(alpha) if cm_fatigue is None: self.cm_fatigue = None self.cm_params = [] else: self.cm_fatigue = cm_fatigue self.cm_params = ['-CMFatigue', cm_fatigue['cf'], cm_fatigue['alpha'], cm_fatigue['cd']] if mp_curve is None: self.mp_curve = None self.mp_params = [] else: self.mp_curve = mp_curve r1 = self.mp_curve.setdefault('r1', 0.333) r2 = self.mp_curve.setdefault('r2', 18) r3 = self.mp_curve.setdefault('r3', 4) self.mp_params = ['-MPCurveParams', r1, r2, r3] if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fy, self.fu, self.e_mod, self.e_mod_sh, self.eps_sh, self.eps_ult, '-DMBuck', self.lsr, self.alpha, *self.cm_params, *self.mp_params] if osi is None: self.built = 0 if osi is not None: self.to_process(osi)
[docs]class ReinforcingSteelCMFatigue(UniaxialMaterialBase): """ The ReinforcingSteelCMFatigue UniaxialMaterial Class This command is used to construct a ReinforcingSteel uniaxial material object. This object is intended to be used in a reinforced concrete fiber section as the steel reinforcing material. """ op_type = 'ReinforcingSteel' def __init__(self, osi, fy, fu, es, esh, eps_sh, eps_ult, cf, alpha_2, cd): """ Initial method for ReinforcingSteelCMFatigue Parameters ---------- osi: o3seespy.OpenSeesInstance fy: float Yield stress in tension fu: float Ultimate stress in tension es: float Initial elastic tangent esh: float Tangent at initial strain hardening eps_sh: float Strain corresponding to initial strain hardening eps_ult: float Strain at peak stress cf: float Coffin-manson constant c alpha_2: None cd: float Cyclic strength reduction constant Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.ReinforcingSteelCMFatigue(osi, fy=1.0, fu=1.0, es=1.0, esh=1.0, eps_sh=1.0, eps_ult=1.0, cf=1.0, alpha_2=1, cd=1.0) """ self.osi = osi self.fy = float(fy) self.fu = float(fu) self.es = float(es) self.esh = float(esh) self.eps_sh = float(eps_sh) self.eps_ult = float(eps_ult) self.cf = float(cf) self.alpha_2 = alpha_2 self.cd = float(cd) if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fy, self.fu, self.es, self.esh, self.eps_sh, self.eps_ult, '-CMFatigue', self.cf, self.alpha_2, self.cd] if osi is None: self.built = 0 if osi is not None: self.to_process(osi)
[docs]class ReinforcingSteelIsoHard(UniaxialMaterialBase): """ The ReinforcingSteelIsoHard UniaxialMaterial Class This command is used to construct a ReinforcingSteel uniaxial material object. This object is intended to be used in a reinforced concrete fiber section as the steel reinforcing material. """ op_type = 'ReinforcingSteel' def __init__(self, osi, fy, fu, es, esh, eps_sh, eps_ult, a1=4.3, limit=1.0): """ Initial method for ReinforcingSteelIsoHard Parameters ---------- osi: o3seespy.OpenSeesInstance fy: float Yield stress in tension fu: float Ultimate stress in tension es: float Initial elastic tangent esh: float Tangent at initial strain hardening eps_sh: float Strain corresponding to initial strain hardening eps_ult: float Strain at peak stress a1: float, optional Hardening constant (default = 4.3) limit: float, optional Limit for the reduction of the yield plateau. % of original plateau length to remain (0.01 < limit < 1.0 ) limit =1.0, then no reduction takes place (default =0.01) Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.ReinforcingSteelIsoHard(osi, fy=1.0, fu=1.0, es=1.0, esh=1.0, eps_sh=1.0, eps_ult=1.0, a1=4.3, limit=1.0) """ self.osi = osi self.fy = float(fy) self.fu = float(fu) self.es = float(es) self.esh = float(esh) self.eps_sh = float(eps_sh) self.eps_ult = float(eps_ult) self.a1 = float(a1) self.limit = float(limit) if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fy, self.fu, self.es, self.esh, self.eps_sh, self.eps_ult, '-IsoHard', self.a1, self.limit] if osi is None: self.built = 0 if osi is not None: self.to_process(osi)
[docs]class ReinforcingSteelMPCurveParams(UniaxialMaterialBase): """ The ReinforcingSteelMPCurveParams UniaxialMaterial Class This command is used to construct a ReinforcingSteel uniaxial material object. This object is intended to be used in a reinforced concrete fiber section as the steel reinforcing material. """ op_type = 'ReinforcingSteel' def __init__(self, osi, fy, fu, es, esh, eps_sh, eps_ult, r1=0.333, r2=18.0, r3=4.0): """ Initial method for ReinforcingSteelMPCurveParams Parameters ---------- osi: o3seespy.OpenSeesInstance fy: float Yield stress in tension fu: float Ultimate stress in tension es: float Initial elastic tangent esh: float Tangent at initial strain hardening eps_sh: float Strain corresponding to initial strain hardening eps_ult: float Strain at peak stress r1: float, optional (default = 0.333) r2: float, optional (default = 18) r3: float, optional (default = 4) Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.ReinforcingSteelMPCurveParams(osi, fy=1.0, fu=1.0, es=1.0, esh=1.0, eps_sh=1.0, eps_ult=1.0, r1=0.333, r2=18.0, r3=4.0) """ self.osi = osi self.fy = float(fy) self.fu = float(fu) self.es = float(es) self.esh = float(esh) self.eps_sh = float(eps_sh) self.eps_ult = float(eps_ult) self.r1 = float(r1) self.r2 = float(r2) self.r3 = float(r3) if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fy, self.fu, self.es, self.esh, self.eps_sh, self.eps_ult, '-MPCurveParams', self.r1, self.r2, self.r3] if osi is None: self.built = 0 if osi is not None: self.to_process(osi)
[docs]class DoddRestrepo(UniaxialMaterialBase): """ The DoddRestrepo UniaxialMaterial Class This command is used to construct a Dodd-Restrepo steel material """ op_type = 'Dodd_Restrepo' def __init__(self, osi, fy, fsu, esh, esu, youngs, eshi, fshi, omega_fac=1.0): """ Initial method for DoddRestrepo Parameters ---------- osi: o3seespy.OpenSeesInstance fy: float Yield strength fsu: float Ultimate tensile strength (uts) esh: float Tensile strain at initiation of strain hardening esu: float Tensile strain at the uts youngs: float Modulus of elasticity eshi: float Tensile strain for a point on strain hardening curve, recommended range of values for eshi: [ (esu + 5*esh)/6, (esu + 3*esh)/4] fshi: float Tensile stress at point on strain hardening curve corresponding to eshi omega_fac: float, optional Roundedness factor for bauschinger curve in cycle reversals from the strain hardening curve. range: [0.75, 1.15]. largest value tends to near a bilinear bauschinger curve. default = 1.0. Examples -------- >>> import o3seespy as o3 >>> # Example is currently not working >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.DoddRestrepo(osi, fy=1.0, fsu=1.0, esh=1.0, esu=1.0, youngs=1.0, eshi=1.0, fshi=1.0, omega_fac=1.0) """ self.osi = osi self.fy = float(fy) self.fsu = float(fsu) self.esh = float(esh) self.esu = float(esu) self.youngs = float(youngs) self.eshi = float(eshi) self.fshi = float(fshi) self.omega_fac = float(omega_fac) if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fy, self.fsu, self.esh, self.esu, self.youngs, self.eshi, self.fshi, self.omega_fac] if osi is None: self.built = 0 if osi is not None: self.to_process(osi)
[docs]class RambergOsgoodSteel(UniaxialMaterialBase): """ The RambergOsgoodSteel UniaxialMaterial Class This command is used to construct a Ramberg-Osgood steel material object. """ op_type = 'RambergOsgoodSteel' def __init__(self, osi, fy, e0, a, n): """ Initial method for RambergOsgoodSteel Parameters ---------- osi: o3seespy.OpenSeesInstance fy: float Yield strength e0: float Initial elastic tangent a: float "yield offset" and the commonly used value for a is 0.002 n: float Parameters to control the transition from elastic to plastic branches. and controls the hardening of the material by increasing the "n" hardening ratio will be decreased. commonly used values for n are ~5 or greater. Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.RambergOsgoodSteel(osi, fy=1.0, e0=1.0, a=1.0, n=1.0) """ self.osi = osi self.fy = float(fy) self.e0 = float(e0) self.a = float(a) self.n = float(n) if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fy, self.e0, self.a, self.n] if osi is None: self.built = 0 if osi is not None: self.to_process(osi)
[docs]class SteelMPF(UniaxialMaterialBase): """ The SteelMPF UniaxialMaterial Class This command is used to construct a uniaxialMaterial SteelMPF (Kolozvari et al., 2015), which represents the well-known uniaxial constitutive nonlinear hysteretic material model for steel proposed by Menegotto and Pinto (1973), and extended by Filippou et al. (1983) to include isotropic strain hardening effects. """ op_type = 'SteelMPF' def __init__(self, osi, fyp, fyn, e0, bp, bn, params, a1=0.0, a2=1.0, a3=0.0, a4=1.0): """ Initial method for SteelMPF Parameters ---------- osi: o3seespy.OpenSeesInstance fyp: float Yield strength in tension (positive loading direction) fyn: float Yield strength in compression (negative loading direction) e0: float Initial tangent modulus bp: float Strain hardening ratio in tension (positive loading direction) bn: float Strain hardening ratio in compression (negative loading direction) params: list Parameters to control the transition from elastic to plastic branches. ``params=[r0,cr1,cr2]``. recommended values: ``r0=20``, ``cr1=0.925``, ``cr2=0.15`` or ``cr2=0.0015`` a1: float, optional Isotropic hardening in compression parameter (optional, default = 0.0). shifts compression yield envelope by a proportion of compressive yield strength after a maximum plastic tensile strain of a2(fyp/e0) a2: float, optional Isotropic hardening in compression parameter (optional, default = 1.0). a3: float, optional Isotropic hardening in tension parameter (optional, default = 0.0). shifts tension yield envelope by a proportion of tensile yield strength after a maximum plastic compressive strain of a3(fyn/e0). a4: float, optional Isotropic hardening in tension parameter (optional, default = 1.0). see explanation of a3. Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.SteelMPF(osi, fyp=1.0, fyn=1.0, e0=1.0, bp=1.0, bn=1.0, params=[1.0, 1.0, 1.0], a1=0.0, a2=1.0, a3=0.0, a4=1.0) """ self.osi = osi self.fyp = float(fyp) self.fyn = float(fyn) self.e0 = float(e0) self.bp = float(bp) self.bn = float(bn) self.params = params self.a1 = float(a1) self.a2 = float(a2) self.a3 = float(a3) self.a4 = float(a4) if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fyp, self.fyn, self.e0, self.bp, self.bn, *self.params, self.a1, self.a2, self.a3, self.a4] if osi is None: self.built = 0 if osi is not None: self.to_process(osi)
[docs]class Steel01Thermal(UniaxialMaterialBase): """ The Steel01Thermal UniaxialMaterial Class """ op_type = 'Steel01Thermal' def __init__(self, osi, fy, e0, b, a1, a2, a3, a4): r""" Initial method for Steel01Thermal Parameters ---------- osi: o3seespy.OpenSeesInstance fy: float Yield strength e0: float Initial elastic tangent b: float Strain-hardening ratio (ratio between post-yield tangent and initial elastic tangent) a1: float Isotropic hardening parameter, increase of compression yield envelope as proportion of yield strength after a plastic strain of :math:`a_2*(f_y/e_0)` a2: float Isotropic hardening parameter a3: float Isotropic hardening parameter, increase of tension yield envelope as proportion of yield strength after a plastic strain of :math:`a_4*(f_y/e_0)`. a4: float Isotropic hardening parameter (see explanation Examples -------- >>> import o3seespy as o3 >>> osi = o3.OpenSeesInstance(ndm=2) >>> o3.uniaxial_material.Steel01Thermal(osi, fy=1.0, e0=1.0, b=1.0, a1=1.0, a2=1.0, a3=1.0, a4=1.0) """ self.osi = osi self.fy = float(fy) self.e0 = float(e0) self.b = float(b) self.a1 = float(a1) self.a2 = float(a2) self.a3 = float(a3) self.a4 = float(a4) if osi is not None: osi.n_mat += 1 self._tag = osi.n_mat self._parameters = [self.op_type, self._tag, self.fy, self.e0, self.b, self.a1, self.a2, self.a3, self.a4] 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_b(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'b', value, ele, eles)
[docs] def set_a1(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a1', value, ele, eles)
[docs] def set_a2(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a2', value, ele, eles)
[docs] def set_a3(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a3', value, ele, eles)
[docs] def set_a4(self, value, ele=None, eles=None): self.set_parameter(self.osi, 'a4', value, ele, eles)