OpenSees Blog 日本語 目次

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

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







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

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


2014年12月2日火曜日

OpenSees Developer : プログラムの基本的な流れ(modelコマンドまで)

OpenSees Developer : ソースコードのダウンロードとビルド
で、作成されたプログラムを、Debugモードで走らせてみます。

使用するtcl スクリプトファイルは、OpenSees Basic Examples (基本的なトラス解析) 
です。

メインプログラムは、ここにあります。
OpenSees\SRC\tcl\tclAppInit.cpp
または
OpenSeesプロジェクトのtclAppInit.cpp











main(int argc, char **argv)

から、プログラムは走り始めますが、
argcには、 Opensees.exe の引数の数、 ** argvには、引数の文字列が入ります

ここで 使用している文字列は、
Opensees C:\\OpenSees-work\\OpenSees5621\\truss-test.tcl
ですので、
argcには 2
argv[0] には Opensees
argv[1] には C:\\OpenSees-work\\OpenSees5621\\truss-test.tcl
が 入っています。

これらの引数は、同じ main( ) の中で呼ばれている

 g3TclMain(argc, argv, TCL_LOCAL_APPINIT, 0, 1);

に引き継がれます。

このg3TclMain( )は

OpenSees\SRC\tcl\tclmain.cpp
または
OpenSeesプロジェクトのtclmain.cpp
にあります。

この
tclmain.cpp ファイルの中で

Tcl_FindExecutable(argv[0]);

など、Tcl_xxxx で始まるファンクションは、tcl の dynamic link library の中のファンクションです。

tclのソースコードは無いため、このラインまでプログラムが走ってきたとき、F11キー、または「ステップ イン」を行っても、tclmain.cpp ファイルの次の行へ移るだけです。

g3TclMain( )
の中の、

numParam = OpenSeesParseArgv(argc, argv);

は、構造計算に使うコマンド(model や node など)以外のコマンドがOpenseesの引数として指定された時の処理を行っています。

次に
tclStartupScriptFileName
のシンボルの中に、構造計算するためのコマンドが保存されているファイル、tclスクリプトファイル(Openseesの引数)
C:\\OpenSees-work\\OpenSees5621\\truss-test.tcl
が代入されます。




g3TclMain( ) の中の
赤丸部分
 if ((*appInitProc)(interp) != TCL_OK) {

で、tclAppInit.cpp の中の
int Tcl_AppInit(Tcl_Interp *interp)

に、移ります。

さらに
 if (OpenSeesAppInit(interp) < 0)

で、
C:\OpenSees-work\OpenSees5621\OpenSees\SRC\tcl\commands.cpp

または
tclプロジェクトのcommands.cpp
の中の


int OpenSeesAppInit(Tcl_Interp *interp)
に、移ります。

この中では、tclスクリプトファイルの中にかかれている tclスクリプト(OpenSeesのコマンド)を
解析しています。
まず、
"wipe"
"print"
"analyze"
など、(まだ、ここまでの所では、セットされていませんが)構造計算のためのデータがセットされたのち、実際にOpenSeesが起動するためのコマンドが、順に中身を解析していったtclスクリプトファイルの中にあった場合、ここから実際のOpenSeesが起動されます 
詳細については、(それ以外のコマンドについて)を参照

それ以外のコマンドは
return myCommands(interp);

により、

C:\OpenSees-work\OpenSees5621\OpenSees\SRC\modelbuilder\tcl\myCommands.cpp

または
tclプロジェクトのmyCommands.cpp
の中の

int myCommands(Tcl_Interp *interp)
に移ります。

ここで、

 Tcl_CreateCommand(interp, "model", specifyModelBuilder,
     (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
により、
specifyModelBuilder
が指定されます。

このspecifyModelBuilder( )の中で、model コマンドが解析されます。

specifyModelBuilder( )
myCommands.cpp にありますが、


このファンクションを呼んでいる場所は
上記図の 緑丸部分

code = Tcl_EvalFile(interp, tclStartupScriptFileName);

です。

なお、

tcl スクリプトファイル の model コマンドは、以下の様に指定されています。

<Opensees コマンド> model BasicBuilder -ndm 2 -ndf 2

ここ specifyModelBuilder( ) では、
次元数と、自由度数を OpenSeesのプログラムに読み込む
つまり、 Model 用の クラス
class TclModelBuilder
に、データ(次元数と、自由度数)をセットすることが目的です。

specifyModelBuilder( )で
最初に、

model BasicBuilder -ndm 2 -ndf 2
のコマンドのストリング(文字列)を読み込み、解析した後、

数字が間違っていないか、
例えば、ndm が 0にセットされていたり等
をチェックした後、

class TclModelBuilder
の中の

private:
    int ndm; // space dimension of the mesh
    int ndf; // number of degrees of freedom per node

にそれぞれ、2 と 2 が セットされます。

このclassへのセットは
 TclModelBuilder *theTclBuilder = new TclModelBuilder(theDomain, interp, ndm, ndf);

で行われています。

TclModelBuilderの constructor は


C:\OpenSees-work\OpenSees5621\OpenSees\SRC\modelbuilder\tcl\TclModelBuilder.cpp
または
tclプロジェクトのTclModelBuilder.cpp

にあります。

 次のページ → 
OpenSees Developer : プログラムの全体的な流れ


OpenSees のソースコード解析に挑戦してみる : 目次

0 件のコメント:

コメントを投稿