import openseespy.opensees as ops class SMABearing: """ 新型 SMA 自复位隔震支座本构模板 (Python 类实现) 特点:无需编译,直接在 Python 脚本中运行 """ def __init__(self, tag, E_elastic, fy_forward, beta=0.6): self.tag = tag self.E = E_elastic# 初始弹性刚度 self.fy_f = fy_forward # 正向相变力(屈服力) self.beta = beta # 能量耗散系数(决定旗帜形状的宽度) # --- 核心状态变量 --- self.t_strain = 0.0 # Trial: 当前步试算应变 self.t_stress = 0.0 # Trial: 当前步试算应力 self.t_tangent = E_elastic self.c_strain = 0.0 # Committed: 上一步收敛应变 self.c_stress = 0.0 # Committed: 上一步收敛应力 def setTrialStrain(self, strain, strainRate=0.0): """ 核心本构逻辑逻辑:每步迭代时 OpenSees 会自动调用 """ self.t_strain = strain delta_strain = self.t_strain - self.c_strain # 简化版 Flag-shaped 逻辑示例 trial_stress = self.E * self.t_strain # 根据加载/卸载分支判定应力和切线刚度 # 这里可以植入你推导的任何数学公式、微分方程甚至 AI 模型 if abs(trial_stress) > self.fy_f: self.t_stress = self.fy_f + 0.02 * self.E * (self.t_strain - self.fy_f/self.E) self.t_tangent = 0.02 * self.E else: self.t_stress = trial_stress self.t_tangent = self.E return 0 def getStress(self): return self.t_stress def getTangent(self): return self.t_tangent def commitState(self): """当迭代收敛,将 Trial 状态固化为 Committed 状态""" self.c_strain = self.t_strain self.c_stress = self.t_stress return 0 # --- 在 OpenSeesPy 中调用 --- # 1. 实例化 Python 对象 sma_logic = SMABearing(tag=101, E_elastic=2000.0, fy_forward=50.0) # 2. 注入接口:这行代码代替了传统的 C++ 编译插件 ops.uniaxialMaterial('Python', 101, sma_logic) # 3. 之后像正常材料一样使用 # ops.element('zeroLength', 1, iNode, jNode, '-mat', 101, '-dir', 1) |