OpenSees Blog 日本語 目次

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

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







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

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


2014年12月24日水曜日

冬休みのお知らせ

OpenSeesファンの皆様

このブログを見ていただきましてありがとうございます。毎週1,2ページの投稿を目標にしておりますが、年末年始はお休みさせていただきます。

現在
OpenSees のソースコード解析に挑戦してみる
Appendix: 「有限要素法における平面トラスの解析」プログラムをC言語で書いてみる

について、同不順でアップしています。
Googleさんの統計によりますと
このブログを開設してから 約6か月、本日まで4400ビュー(*)、約300人ぐらいの方に見ていただいているようです。
また、日本ばかりでなく、アメリカ、ロシア、ドイツ、フランス、トルコ、台湾、ポーランド、ウクライナercの国の方も閲覧しているようです。ありがとうございます。

こちらのブログは、あくまで趣味として、まったりと追記しておりますが、
冬休み後も、同じ調子で進めていきますので、よろしくお願いします。

Innovativeな建物がたくさんできますように!

2014/12/24 Merry Christmas!
Satoko Toengawa

(*)Tonegawaが閲覧したビュー数、リダイレクトしたビュー数は除いた数字です

2014年12月22日月曜日

OpenSees Developer : プログラムの基本的な流れ(メモ)







このTclModelBuilderでは、
OpenSees の node, element, fix 等のデータも読み込んでいます。

<Opensees コマンド>

node 1   0.0  0.0
node 2 144.0  0.0
node 3 168.0  0.0
node 4  72.0 96.0

<Opensees コマンド>
fix 1 1 1
fix 2 1 1
fix 3 1 1

<Opensees コマンド>
element Truss 1 1 4 10.0 1
element Truss 2 2 4  5.0 1
element Truss 3 3 4  5.0 1

これらOpenSeesコマンドは、すべてTcl_CreateCommand( )ファンクションを起動することによって、
その内容を読み込んでいます。
読み込む作業を行っているファンクションも、Tcl_CreateCommand( )に下記の様に書かれています。


 Tcl_CreateCommand
(interp, "<Openseesコマンド>", 
<OpenSeesコマンドを読み込むファンクション>,
 (ClientData)NULL, NULL);



たとえば
Tcl_CreateCommand(interp, "node", TclCommand_addNode,  (ClientData)NULL, NULL);


は、 OpenSeesコマンドのnodeを読み込みますが、
読み込むファンクションは、TclCommand_addNode( )です。

このTclCommand_addNode( )の中で、
Nodeクラスに OpenSeesコマンドのNodeのデータをセットします。

--------------

他のコマンドも同じようにして、データをセットしていきます。

セットしたデータをつかっての構造計算は、
<Opensees コマンド> analyze 1
で、行いますが、これは、


C:\OpenSees-work\OpenSees5621\OpenSees\SRC\tcl\commands.cpp
または
tclプロジェクトのcommands.cpp
の中の
int OpenSeesAppInit(Tcl_Interp *interp)

の中で定義されていた

Tcl_CreateCommand(interp, "analyze", &analyzeModel,
     (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
における
&analyzeModel( )
で、計算が行われます。
(&がついているので、同じファイルの中に、ファンクションが定義されています)

----------------

そして

















C言語プログラムの構成



C言語で構成された”main.exe”を例とした、プログラム構成についての説明です。

Main.c : test.exeのメインプログラム

subA.c, sub.c : main.cから呼ばれるサブルーチンが入っているプログラム

stdio.h, string.h, math.h, malloc.h : MS-windowsに標準装備されているライブラリ(右にdllファイル)を使用するためのヘッダーファイル

    stdio.dll : 外部ファイルの読み書き等のファンクションが定義されている
    string.h : 文字列の取り扱いについてのファンクション定義されている
    math.h : sin, cos. ルート計算などの数値計算についてのファンクション定義されている
    malloc.h : 行列などで使用するメモリー使用についてののファンクション定義されている

Libx.h : 自分で作成したライブラリLibX.libを使用するためのヘッダーファイル

Image.h : 外部で公開されている(webなどで提供されているオープンソースなどで作成された)ライブラリ image.dllを使用するためのヘッダーファイル

「有限要素法における平面トラスの解析」プログラムは、main.c MS-windowsに標準装備されているライブラリを使用するためのヘッダーファイルで構成されています。

なお、
ライブラリには、拡張子(extension)lib dllの2種類があります。

Lib : static library 
mainプログラムのリンク時に、取り込まれます。そのため、main.exeが動作している時のみ、このライブラリを使用することができます

Dll : dynamic link library :
main.exe実行時に、このライブラリを呼んで動作します。そのため、どのアプリケーションが動作していても、このライブラリの内容を自由に使うことが可能です。



「有限要素法における平面トラスの解析」プログラムをC言語で書いてみる : 目次

2014年12月16日火曜日

Microsoft Visual Studioの使用方法 (4)



次に、デバッグ→ステップオーバー または F10を押します。



そうすると、黄色の矢印が
testC=(double)(testA + testB + TEST_CONSTANT);
の行に移り、かつ、ウオッチの中のtestAの数字が赤く21と表示されます。
これは、
testA++;
が計算され、testAに1が和されたためです。

ちなみに、もし途中停止している行がサブルーチンの実行を指示する行だった場合、デバッグ→ステップイン または F11を押すことによって、プログラムの表示がサブルーチンのプログラム行にうつります。
ステップオーバーもステップインもプログラムを1行ずつ実行するためのものです。

11) プログラムの終了
このままF10を押して、
Return 0;
のところまでプログラムを進めます。

そして、図4-17の赤で囲まれているDOSのコマンドプロンプトのwindowを表示させると、
testD=0.976591 と表示されています。
これは
pintf("testD=%f\n",testD);
の実行結果によっての表示です。

またウオッチの中のtestDを見ると 0.97659086794356575 と表示されています。
これは、DOSのコマンドプロンプトのwindowで表示されているtestDの値と同等であることがわります。




























F5を押して、プログラムを終了させます。
もし、プログラムを途中で終了したい場合は、デバッグ→デバッグの停止 または shift+F5を押します。

なお、” Visual Studio Express 2012 for Windows 8”は無料なので、持っているwindowsPCにいくつでもインストールできますが、作成途中のプロジェクト(ソリューション)を移植したい場合は、

指定した場所(フォルダー)の中に作成されている”test”のフォルダーをすべて、コピーすることによって、他のWindowsPCでのプログラム作成作業を行うことができます。
この”test”フォルダーの中の test.sln が プロジェクト(ソリューション)ファイルなので、これをクリックすることで、MS-VSでのプログラミング作業を継続することができます。
(または、MS-VS起動画面の“プロジェクトを開く“で、test.slnを選択しても良いです)



















 次のページ →


 C言語プログラムの構成

「有限要素法における平面トラスの解析」プログラムをC言語で書いてみる : 目次

2014年12月9日火曜日

Microsoft Visual Studioの使用方法(3)


10) プログラムのデバッグ
このプログラムを走らせて、デバッグ作業を行います。まず、
testA++;
の上で右クリックし、”ブレークポイントの挿入”をクリックします。



























testA++;
の行に赤丸がつきます(もし、これを消したい場合は、右クリックでブレークポイントの削除や無効を行います)












「デバッグ→デバッグ」の開始 または F5を押して、プログラムを走らせます。























testA++;

の行に黄色の矢印が表示され、プログラムはこの行の計算「前」で途中停止します。
























ここで、各シンボルの上にマウスポインタをかざすと、そのシンボルの中に入っている値を見ることができます。
たとえば、testBの上にかざすと”50”と表示されます。
下のエリアでは、”自動変数”、 ”ローカル(変数)”、”スレッド”、 ”モジュール”で、途中停止している現在の状態を見ることができます。

”ウオッチ”をクリックします。この”ウオッチ”では、自分が見たいシンボルを表示させることや、シンボルの中の数を変更することができます。

ここでば、”ウオッチ”に、testA と testD を キーボードで入力します。
testAは、testA++;の行の計算をまだ行っていないので20となっています。
testDは、まだ入力がなにも行われていないので、めちゃくちゃな値(testDに割り当てられたPC上のメモリにたまたま入っていた値)が表示されています。



 次のページ →

 Microsoft Visual Studioの使用方法 (4)


「有限要素法における平面トラスの解析」プログラムをC言語で書いてみる : 目次

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 のソースコード解析に挑戦してみる : 目次

Microsoft Visual Studioの使用方法(2)

<有限要素法> Microsoft Visual Studioの使用方法(1) の続きです

4) test.cppファイルを開いて、下記の様にプログラムを書いてみます





























下記表に各行の解説をしました。

#include "stdafx.h" プロジェクトが作成されると自動的にこれがついてくる。
Windowsプログラムで標準的につかうヘッダーを総称したもの。絶対消さないこと。
#include プログラムの中で使用するsin()ファンクション
を呼び出すためのヘッダーファイル
#define TEST_CONSTANT 100 定数の定義。
定数はすべて大文字で書くのがお作法
int _tmain(int argc, _TCHAR* argv[]) メインプログラム。引数のargcやargv[]は、
外部からの入力データがある
ときに使用。変更しないこと
aaa ファンクション
を呼び出すためのヘッダーファイル
aaa ファンクション
を呼び出すためのヘッダーファイル
{ プログラムの始まり
int testA; testA というシンボルを
integer で宣言
int testB = 50; testB というシンボルをinteger で
宣言しているが、ここでは
初期値として50も入れている
double testC; testC というシンボルをdouble で宣言
testA = 20; testA に20を代入している。
testAは20となる
testA++; testA=testA+1 と同じ。
testAは21となる
testC=(double)(testA + testB + TEST_CONSTANT); 右側の式は、testA.testB.TEST_CONSTANTを合算している。(171になる)
右側はすべてintegerで宣言されているので、integer形式になるが、答を代入したいtestCはdoubleで宣言されている。そのため、integerからdoubleへの変換をしなければいけないが、(double)と書くことによって、これを実現している。
double testD = sin(testC); プログラムの途中で、宣言をすることもできる。
ここではtestDをdoubleとして宣言。testCのsinを代入している
printf("testD=%f\n",testD); testDの結果をコンソール(コマンドプロンプト)に表示している
return 0; メインプログラムの戻り値
(ここでは、プログラムの実行結果がエラーではないので0を返している)
} プログラムの終了




















































integer宣言 : 宣言したシンボルは整数のみを取り扱う
double宣言 : 宣言したシンボルは小数点のつく数を取り扱う

5) プログラムをコンパイル、リンクします。
MS-VS上でのC(またはCPP)プログラムのコンパイル、リンクは、プロジェクトの中ですでに作成されているので、特に新たに書き起こす必要はありません。コンパイル、リンクのことを“ビルド(Build)”と言います。
ビルドは、「デバッグ→ソリューション」の「ビルド」をクリックすることによって行われます。
















もし、コンパイルエラー等がなかったら、“出力”部分にtest.exeが生成されたことが表示されます。















指定した場所(フォルダー)を見てみると、”test”のフォルダー中に”debug”フォルダーが生成され、その中にtest.exeが生成されているのがわかります。このtest.exeは次で説明するdebug情報が入っているので、最終的なexeプルグラムよりファイルサイズが大きくなっています。


















 次のページ → 

 Microsoft Visual Studioの使用方法(3)


「有限要素法における平面トラスの解析」プログラムをC言語で書いてみる : 目次