OpenSees Blog 日本語 目次

最初に「このブログをみるためのガイド」をご覧ください。

Update中OpenSees コマンド 日本語解説 の 目次 OpenSeesコマンド はじめての方は「ここから
このblogで使用しているOpenSeesコマンド集は「ここ」 Update中
OpenSees のソースコード 解析に挑戦してみる 目次最初のページは「ソースコードのダウンロードとビルド」
Appendix:C言語での 「有限要素法における平面トラスの解析」目次最初のページは「Microsoft Visual Studioの導入方法」







目次の中で、更新したページにはNewがついています

このブログ内の単語を検索したい場合は、左上OpenSeesロゴの上に検索窓から検索できます。


2014年10月16日木曜日

OpenSees Basic Examples (C3: 2階建てフレームでの固有値解析) 解説(固有値解析)



2)解析結果を記録するレコーダーの設定
Node(節点)について、解析結果を記録するためのファイル名、Node番号を設定します


ここでは、Recorder Node コマンドを使用して、

Node 1から6までの 3つの自由度の値を、1次固有モードから2次固有モードまで出力します。

解析したい固有値の数(numModes)は、2です。
そのため、変数K に 固有値の数を代入して、結果をファイル(modeディレクトリーの下にあるmode1.txt(1次)、mode2.txt(2次)に出力します。


# record eigenvectors
#----------------------

# kに初期値として1をセットし、recorder...部分のコマンドを 1 づつk ≦ 2になるまで kを増加させて実行します。
for { set k 1 } { $k <= $numModes } { incr k } {   
    recorder Node -file [format "modes/mode%i.txt" $k] -nodeRange 1 6 -dof 1 2 3  "eigen $k"
}


シンボル lambda に 解析したい固有値の数(numModes) 入れます

# perform eigen analysis
#-----------------------------
set lambda [eigen  $numModes];

 固有振動数ω 固有周期T  固有周波数 f
を下記式を使って求め、 それぞれの1次、2次の値を、omega[2], T[2], f[2] の行列の中に格納します。



# calculate frequencies and periods of the structure
#---------------------------------------------------
set omega {}
set f {}
set T {}
set pi 3.141593

foreach lam $lambda {
lappend omega [expr sqrt($lam)]
lappend f [expr sqrt($lam)/(2*$pi)]
lappend T [expr (2*$pi)/sqrt($lam)]
}

次に、
最初に、modeディレクトリの中にPeriods.txt というファイルを作成し
書き込みモード("w")で、ファイルをOpenします。
($periodのシンボルの中に、ファイル名が格納されています)

書き込むデータ領域は、 Periods[ ]です。
この領域に、先ほど 固有周期 T[ ] の中に格納した、1次、2次の固有周期を代入するとともに、ディスプレイ上で表示します。
(OpenSeesを起動したときに、プロンプトに表示されます ここ参照)
最後にファイルをCloseします。

puts "periods are $T"

# write the output file cosisting of periods
#--------------------------------------------
set period "modes/Periods.txt"
set Periods [open $period "w"]
foreach t $T {
puts $Periods " $t"
}
close $Periods

3) 振動モード形のグラフ表示

1次振動モード形を表示します。
振動モード形は、別Windowでグラフとして表示されます。

最初に、Windowsの大きさと位置とタイトルを設定します
recorder display [windowのタイトル] [Windowの左上のX位置]  [Windowの左上のY位置] [Windowの幅] [Windowの高さ] -wipe

# create display  for mode shapes
#---------------------------------
#                 $windowTitle $xLoc $yLoc $xPixels $yPixels

recorder display "Mode Shape 1"  10    10     500      500     -wipe  

# record eigenvectors の所で求めているRecorder Nodeの値からグラフを作成します

# projection reference point (prp); defines the center of projection (viewer eye)
prp $h $h 1;                             

vup  0  1 0;                               # view-up vector (vup) 
vpn  0  0 1;                               # view-plane normal (vpn)     
viewWindow -200 200 -200 200;   # coordinates of the window relative to prp  

# the 1st arg. is the tag for display mode (ex. -1 is for the first mode shape)
# the 2nd arg. is magnification factor for nodes, the 3rd arg. is magnif. factor of deformed shape
display -1 5 20;   

2次振動モード形を表示します。                      

recorder display "Mode Shape 2" 10 510 500 500 -wipe

prp $h $h 1;
vup  0  1 0;
vpn  0  0 1;
viewWindow -200 200 -200 200
display -2 5 20

4)OpenSeesで用意されているツールの設定
有限要素法で使用する連立方程式の解法を設定します。
ここで使用しているコマンドについての
参照ページは ここ 、 ここ と ここ 

# Convergence test で、Energy Increment Testを行っています
OpenSeesでの解説は、ここです。

# Run a one step gravity load with no loading (to record eigenvectors)
#-----------------------------------------------------------------------
integrator LoadControl 0 1 0 0

# Convergence test
#                     tolerance maxIter displayCode
test EnergyIncr       1.0e-10    100        0

# Solution algorithm
algorithm Newton

# DOF numberer
numberer RCM

# Constraint handler
constraints Transformation


# System of equations solver
system ProfileSPD

analysis Static


5) 固有ベクトル(固有振動モード)値の取得
analyze 1 で 1ステップ分OpenSeesを実行します

set res [analyze 1]
if {$res < 0} {
    puts "Modal analysis failed"
}

f11, f21, f12, f22 に 指定したnodeの固有ベクトル(固有振動モード)値をnodeEigenvectorを使って取得します。

nodeEigenvector [Nodeの値] [固有値] [対象となる自由度]

f11には、
Node3、X方向の1次固有ベクトル(固有振動モード)の値が入ります

f12には、
Node3、X方向の2次固有ベクトル(固有振動モード)の値が入ります


f21には
Node5、X方向の1次固有ベクトル(固有振動モード)の値が入ります

f22には
Node5、X方向の2次固有ベクトル(固有振動モード)の値が入ります

# get values of eigenvectors for translational DOFs
#---------------------------------------------------
set f11 [nodeEigenvector 3 1 1]
set f21 [nodeEigenvector 5 1 1]
set f12 [nodeEigenvector 3 2 1]
set f22 [nodeEigenvector 5 2 1]

また、1次、2次それぞれのNode3での固有ベクトルの比率(Node5での固有ベクトルとの)を求めます。

puts "eigenvector 1: [list [expr {$f11/$f21}] [expr {$f21/$f21}] ]"
puts "eigenvector 2: [list [expr {$f12/$f22}] [expr {$f22/$f22}] ]"


ちなみに f11, f21, f12, f22 の値は、上記のコマンドでは表示しませんが、下記の様になっています

f11 =             -0.80208062768966204000
f21 =             -1.60416125541353030000
f12 =             -1.13431330181963320000
f22 =              1.13431330179544520000

また、
Node3とNode5での固有ベクトルの比率をグラフ化すると以下のようになります。




6) これは追加
実際に、このTCLコマンドを実行すると、3)で表示させた振動モード形のグラフが、
あっと言う間に消えてしまうので、下記のコマンドを追加しました。
これは、次のコマンドの実行まで、10000msec 待つというコマンドです。

after 10000

次のページ →

Basic Examples Manual (2階建てフレームでの固有値解析) 
コマンドサマリ


Opensees コマンド 日本語解説 : 目次

5 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. はじめまして
    kindl版の説明書を購入させていただいたものです。

    現在、openseesで簡単な2質点系の固有値解析を試みています。

    プログラムの流れとしては、今回の2層フレームを2質点形に直して書いています。

    結果はモード表示画面が一瞬表示されエラーが出て強制終了となります。

    この2層フレーム問題と固有値計算の部分で違ってくるのでしょうか?

    set lambda [eigen $numModes] ;
    のところでエラーが出てしまいます。

    突然で大変申し訳ありませんが、何かお気づきの点があれば宜しくお願い致します。

    返信削除
  3. 荒井様
    set lambda [eigen $numModes] ;
    で、エラーになるということですが
    こちらは、lambda というシンボルに、何かしらの値をセットするという部分です
    ですので、これ自体がエラーを起こすことはないのではないか、と考えます。
    次に
    [eigen $numModes]
    の部分ですが、こちらは 固有値をnumModesという名前のシンボルの中に入っている値でセットする
    という意味です
    ここでは 最初にnumModesには
    set numModes 2
    と2をセットしていますので、
    [eigen 2]
    という意味に なります。

    荒井様の tclスクリプトが、上記のコマンドとして、値などのセットも含めて希望する形になっているかどうかを、ご確認されてはと思います。

    返信削除
    返信
    1. 早速のご返信ありがとうございます。

      エラーを探すためにプログラムのはじめからAなどのダミーを入力していったところ
      set lambda [eigen $numModes] ;
      で止まってしまいます。

      opensees ではフレーム解析ではなく単純な2質点系の固有値解析はできないのでしょうか

      勝手ながらエラーを載せさせていただきます。

      OpenSees > source c.tcl
      ArpackSolver::Error with _saupd info = -9999
      Could not build an Arnoldi factorization.IPARAM(5) the size of the current Arnol
      di factorization: is 2factorization. The user is advised to check thatenough wor
      kspace and array storage has been allocated.
      WARNING DirectIntegrationAnalysis::eigen() - EigenSOE failed in solve()
      invalid command name "X"

      なにかお気づきの点があれば教えていただきたいです。
      よろしくお願い致します。

      削除
  4. OpenSeesのすべてのソースコードを読んでいるわけではありませんので、フレーム解析以外、どの程度の網羅性ががあるのかは、調査しておりません。

    OpenSeesには、ユーザーのためのフォーラムが用意されています。
    こちらで質問されることをお勧めします
    http://opensees.berkeley.edu/community/viewforum.php?f=2

    返信削除