2020/03/29

OpenSeesPyによる静定トラスの解析(材料非線形性の考慮)

通常、構造物の材料は材料非線形性を有しており、部材荷重がある降伏荷重を超えると、部材が降伏することで部材の荷重増加率が低減し、部材の変形が大きく増加する状態になります(降伏現象)。Openseesではこうした部材の材料非線形性を考慮した応力解析が可能です。今回は前回と同形状の静定トラスを対象として、その部材が材料非線形性を考慮したモデルを題材とし、各部材の降伏を追跡した応力解析による検討を行います。

今回考慮する部材の材料非線形性は下図に示すような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()

2020/03/28

OpenSeesPyによる静定トラスの解析

今回は図に示すように、静定トラスの頂部に静的な荷重が加わった場合の応力解析をOpenSeesPyを用いて行っていきます。


・解析モデルの設定
modelコマンドにて全体の解析モデルを定義します。
ndmは解析モデルの次元数、ndfは自由度数です。
今回は2次元の静定トラスを想定するので、いずれも2に設定します。

model('basic', '-ndm', 2, '-ndf', 2)

・トラスの節点座標の設定
nodeコマンドにて解析モデル各節点の座標を定義します。
2次元モデルの場合、node(節点番号、x座標、y座標)のように定義します。

・固定されている節点の境界条件の設定
fixコマンドにて解析モデルの各節点の境界条件を定義します。
2次元モデルの場合、fix(節点番号、x方向の境界条件、y方向の境界条件(いずれも0:フリー,1:固定)と定義します。

・トラス部材の材料の条件を設定
今回は弾性のトラス部材を想定するため、UniaxialMaterialコマンドにて部材のヤング係数のみを定義します。

・トラス部材を設定
elementコマンドにて各部材の特性を定義します。
トラス部材の場合、以下のように定義できます。
element(elementtype、部材番号、部材端部の節点番号、断面積、定義した材料番号)

・外力を設定
節点に生じる外力をloadコマンドにて以下のように定義します。
load(設定する節点番号、x方向の外力、y方向の外力)

上記が対象とする問題を想定した場合の主な解析モデル、荷重条件の設定項目になり、解析に関する種々の条件を定義したうえでanalyzeコマンドを実行すると、応力解析が実行されます。解析結果は「Output Commands」に用意されている各種コマンドを用いて確認することができます。例えば、確認したい項目が、節点変位であればnodeDispコマンド、部材応力であればbasicForceコマンドの結果をprintすることで確認できます。今回の場合、basicForceコマンドにより出力された値が手計算の値と一致することから、正しく解析が行われていることが確認できました。



以下、今回の検討に用いたソースコードを示します。


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)

# 部材材料の定義
uniaxialMaterial("Elastic", 1, 3000.0)

# 部材の定義
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, -50)

# ------------------------------
# 解析条件の定義、解析実行
# ------------------------------

# create SOE
system("BandSPD")

# create DOF number
numberer("RCM")

# create constraint handler
constraints("Plain")

# create integrator
integrator("LoadControl", 1.0)

# create algorithm
algorithm("Linear")

# create analysis object
analysis("Static")

# perform the analysis
analyze(1)

# ------------------------------
# 解析結果の確認
# ------------------------------

N1=basicForce(1)
N2=basicForce(2)
N3=basicForce(3)

print("N1=",N1,"N2=",N2,"N3=",N3)

OpenSeesPyの導入②

今回は、実際にpythonにおいてOpenSeesPyを扱う上で必要なポイントについて説明したいと思います。

・Pythonプログラムの作成環境
前回インストールしたopensees anacondaにはプログラムエディタとして、JupyterNotebookとSpyderが付属しています。

・JupiterNotebook
Webブラウザ上で動作し実行結果がすぐにみられる対話型実行環境。

・Spyder
科学者、エンジニア向けにデザインされたPythonの統合開発環境。テキストエディタ形式でプログラムの編集および実行が可能。


Pythonはコンパイルを不要とするインタプリタ言語であるため、いずれもプログラム記述後すぐに実行結果がみられます。本ブログの検討では基本的にSpyderをベースとした環境にてプログラムを構築していきます。

・Pythonプログラム上でのOpenSeesPyのインポート
Pythonプログラムには様々な機能を提供する標準モジュールが「ライブラリ」として用意されており、それらを自身の作成プログラムにimportすることにより、シンプルなコーディングで様々な機能を有するプログラムを作成することが可能になります。「OpenSeesPy」もそうしたライブラリの一つであり、プログラムの冒頭で以下のようにimportすることにより、使用が可能になります。


・OpenSeesの単位系について
OpenSeesはアメリカ合衆国のPacific Earthquake Engineering Research Center (PEER) によって開発されたため、基本的にヤードポンド法をベースとしており、使用の際にはSI単位系に換算したパラメータを用いる必要があります。 

2020/03/22

OpenSeesPyの導入①

Openseesはアメリカ合衆国のPacific Earthquake Engineering Research Center (PEER) が開発したオープンソース型の構造解析ツールです。オープンソースであることから、全てのコードは公開されています。またその内容は世界中のエンジニアの手で日々更新されており、更新履歴は全てweb上で公開されています。
静的な応力を対象とした構造解析に加え、地震波を入力した時刻歴応答解析などが可能で、全てフリーで使えることから世界中の研究者が解析ツールとして利用しています。詳細は以下をご覧ください。

https://opensees.berkeley.edu/

近年、pythonなどが気軽に使えるプログラムとして台頭しており、openseesもpythonプログラム上で導入可能なpythonモジュール「OpenSeesPy」として公開されています。
各コマンドの機能を解説したマニュアルについても、英語版は下記リンク先にて公開されています。

今回はまずその導入方法を紹介したいと思います。

①pythonを導入
pythonの主要なモデュールを含んだanacondaを以下ページより導入します。

https://www.anaconda.com/distribution/#download-section

開いたページの「Download」をクリックします。

②Jupyter Notebookを起動
Jupyter Notebookはpythonコードを書くと、その実行結果がすぐにみられるツールです。同ツールを開き、ツール上でそれぞれの場合において以下のコードを記述します。


・新規インストール
python -m pip install openseespy
python -m pip install --user openseespy
・ソフトウェアの更新
python -m pip install --upgrade openseespy
python -m pip install --user --upgrade openseespy
上記のように入力すると自動的にモデュールのインストールが始まります。

③pythonコード上にモデュールをインポート
以下のコードをPythonコードの冒頭に記載することで、python上でOpenSeesPyモデュールの使用が可能となります。

import openseespy.opensees as ops

上記の操作により、Pythonコーディング上でOpenseesの構造解析、時刻歴応答解析ツールを動かすための環境構築が終了しました。次は、Python上でOpenseesを動かす方法について紹介していきたいと思います。