で、作成されたプログラムを、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 : プログラムの全体的な流れ
TclModelBuilderの constructor は
C:\OpenSees-work\OpenSees5621\OpenSees\SRC\modelbuilder\tcl\TclModelBuilder.cpp
または
tclプロジェクトのTclModelBuilder.cpp
にあります。
次のページ →
OpenSees Developer : プログラムの全体的な流れ
OpenSees のソースコード解析に挑戦してみる : 目次 |
0 件のコメント:
コメントを投稿