今回考慮する部材の材料非線形性は下図に示すような1つの降伏点を有するバイリニアの材料非線形性とします。部材の降伏荷重sYや降伏後の部材剛性低下率αを定義することによって、部材の材料非線形性を解析において考慮できます。
今回は以下に示すパラメータを有する架空の材料を想定します。
ヤング係数: E = 3000
降伏荷重: sY=10
剛性低下率: α=0.05
OpenSeesPy上で上記の材料特性を記載すると、以下のようになります。
E=3000
sY = 10
alpha = 0.05
uniaxialMaterial("Steel01", 1, sY, E, alpha)
()内は部材タイプ、部材特性の番号、降伏荷重、ヤング係数、剛性低下率の順に記載します。上記のコマンドを入力することで、タグ1が定義されている部材全てにおいて、設定した非線形の材料特性が適用されます。
なお、「uniaxialMaterial」はトラスなどの軸方向のみ剛性を有する部材の材料特性を定義するコマンドです。今回導入するバイリニアの材料特性以外にも様々な部材タイプの材料特性が用意されています。それぞれの材料特性に対し設定すべきパラメータが定義されており、それらを設定することにより様々な材料特性を考慮した解析を行うことが可能です。詳しくは以下のリンク先をご覧ください。また、そのうち整理してみたいと思います。(コンクリートなどの材料特性を想定したモデルも用意されています。世界中の研究者が提案している最新の材料特性モデルなども多く揃えられています。)
https://openseespydoc.readthedocs.io/en/latest/src/uniaxialMaterial.html
基本的には上述したコマンドを加えるだけで解析モデルにおける材料非線形性が定義され、部材の材料非線形性を考慮した応力解析が可能です。さらに、今回はトラス構造物における各部材の降伏に伴う節点変位を追跡するため、設定した節点荷重に至るまでの各荷重係数(λ=0~1)を想定した場合の結果を出力する荷重増分解析を行います。そのため、解析実施部分のスクリプトを以下のように定義します。
integrator("LoadControl", 1.0/Nsteps)
integratorコマンドを入力することで静的荷重増分解析を行うことができます。増分解析を荷重制御にて行う場合,上記のように記述し解析の分割数Nsteps=100を想定します。また各stepにおける頂部節点変位と外力を出力するため、以下のようにfor文を記述することにより、解析の実施及び解析結果の出力を行います。
Nsteps=100
data = np.zeros((Nsteps+1,2))
for j in range(Nsteps):
analyze(1)
data[j+1,0] = -nodeDisp(2,2)
data[j+1,1] = getLoadFactor(1)*150
nodedispコマンドはnodeDisp(対象節点番号、変位方向)を入力することで各節点の変位を取得できます。また、getloadfactorコマンドでは各解析時の荷重係数をそれぞれ取得しています。結果リストをグラフ描画モデュールmatplotlibにより処理することで、以下のような荷重変位関係が取得できます。
グラフより節点の鉛直荷重(Vertical Load)が増加することにより、部材の降伏荷重に達し、その後節点の鉛直変形(Vertical Displacement)が大きく増加していることが確認できます。また、対象トラス構造物における部材1,3の降伏やその後の部材2の降伏を荷重増分解析により適切に追跡できていることが確認できます。
以下に、今回の検討に用いたソースコードを示します。基本は前回のソースコードと同様ですが、赤字が主に変更した部分になります。
from openseespy.opensees import *
# ------------------------------
# モデルの作成
# -----------------------------
# モデルの初期化
wipe()
# モデルの定義
model('basic', '-ndm', 2, '-ndf', 2)
# 節点の定義
node(1, 0.0, 0.0)
node(2, 4.0, 4.0)
node(3, 8.0, 0.0)
# 境界条件の定義
fix(1, 1, 1)
fix(3, 0, 1)
# 部材材料の定義
E=3000
sY = 10
alpha = 0.05
uniaxialMaterial("Steel01", 1, sY, E, alpha)
# 部材の定義
element("Truss",1,1,2,5.0,1)
element("Truss",2,1,3,5.0,1)
element("Truss",3,2,3,5.0,1)
# 時間に依存する荷重係数の定義
timeSeries("Linear", 1)
# 荷重パターンの定義
pattern("Plain", 1, 1)
# 節点荷重の定義
load(2, 0, -150)
# ------------------------------
# 解析条件の定義、解析実行
# ------------------------------
# create SOE
system("BandSPD")
# create DOF number
numberer("RCM")
# create constraint handler
constraints("Plain")
# create integrator
Nsteps = 100
integrator("LoadControl", 1.0/Nsteps)
# create algorithm
algorithm("Newton")
# create analysis object
analysis("Static")
# perform the analysis
data = np.zeros((Nsteps+1,2))
for j in range(Nsteps):
analyze(1)
data[j+1,0] = -nodeDisp(2,2)
data[j+1,1] = getLoadFactor(1)*150
# ------------------------------
# 解析結果のグラフ出力(Matplotlibによる)
# ------------------------------
plt.plot(data[:,0], data[:,1])
plt.xlabel('Vertical Displacement')
plt.ylabel('Vertical Load')
plt.show()