OpenSees Blog 日本語 目次

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

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







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

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


2015年2月24日火曜日

<有限要素法>要素剛性マトリクス算出


各要素剛性マトリクスを算出し、最終的に全体の剛性マトリクス算出するまでのプログラムの説明です。

全体の剛性マトリクスは、各要素(element)から算出された要素剛性マトリクスを全体の剛性マトリクスに加えこんで行くことにより、作成されます。

そのため要素剛性マトリクスは、入力された要素(element)分の回数、作成すること、つまり、

for (element_index = 0; element_index < element_num; element_index++) {
      :
      :
      :

のfor文の中で、各要素剛性マトリクスを算出し、また全体の剛性マトリクスに加えこんで行く形になります。
element_num: 入力される要素の数


最初に、各要素から算出される要素剛性マトリクスは、以下の様に作成されます。

まず、各要素の長さ:element_point_lenを計算します



// Calculate element_point_len
element_point_len_x = (double) (point_x[element_point_1[element_index]] - point_x[element_point_2[element_index]]);
element_point_len_y = (double) (point_y[element_point_1[element_index]] - point_y[element_point_2[element_index]]);

element_point_len = sqrt(pow(element_point_len_x,2.0) + pow(element_point_len_y,2.0));



部品座標系での要素剛性マトリクスのための係数k(ESmatrix_GK_k)は、各要素でのヤング率(element_young)と断面積element_areaの積をelement_point_lenで割ったものです。
このkから部品座標系での要素剛性マトリクス[GK}(ESmatrix_GK)は以下の様になります。





ESmatrix_GK_k = element_young[element_index] * element_area[element_index] / element_point_len;


// Set ESmatrix_GK
for (int i = 0; i < ESM_NUM; i++)
{
for (int j = 0; j < ESM_NUM; j++)
{
ESmatrix_GK[i][j]=0.0;
}
}

ESmatrix_GK[0][0]=ESmatrix_GK_k;
ESmatrix_GK[2][2]=ESmatrix_GK_k;
ESmatrix_GK[0][2]=-1*ESmatrix_GK_k;
ESmatrix_GK[2][0]=-1*ESmatrix_GK_k;


次に、部品座標系から全体座標系への座標変換マトリクス[T] (tranGtoE)を求めます。





cos_points = (double)(element_point_len_x/element_point_len);
sin_points = (double)(element_point_len_y/element_point_len);


// Set tranGtoE
for (int i = 0; i < ESM_NUM; i++)
{
for (int j = 0; j < ESM_NUM; j++)
{
ESmatrix_GK[i][j]=0.0;
}
}


       tranGtoE[element_index][0][0]=cos_points;
tranGtoE[element_index][1][1]=cos_points;
tranGtoE[element_index][2][2]=cos_points;
tranGtoE[element_index][3][3]=cos_points;
tranGtoE[element_index][0][1]=sin_points;
tranGtoE[element_index][1][0]=sin_points * -1;
tranGtoE[element_index][2][3]=sin_points;
tranGtoE[element_index][3][2]=sin_points * -1;




以上より全体座標系での要素剛性マトリクス[K] (ESmatrix_EK)は、以下の式から求められます。



//  Set ESmatrix_EK
double output_matrix[ESM_NUM][ESM_NUM];
bool ret=MxM(ESmatrix_GK, tranGtoE[element_index], output_matrix, ESM_NUM);
ret=WxM(tranGtoE[element_index], output_matrix, ESmatrix_EK[element_index], ESM_NUM);

ここでESM_NUMは、(プログラムの最初に定義していますが)

#define ESM_NUM 4  // 要素剛性マトリックスの成分の数 (2次元のため)


です。

これをすべての要素に対して算出し、最終的に全体の剛性マトリクスに加えこんで行くことにより、全体の剛性マトリクス(all_ESmatrix_EK)が作成されます。


なお
上記で使用している MxM( ), WxM( ) のファンクションについては
<有限要素法>マトリクス計算のファンクション
を参照してください。


    //--------------------------
// 全体の剛性マトリクス算出
//--------------------------
int all_element_point[ESM_NUM];
all_element_point[0] = element_point_1[element_index]*2;
all_element_point[1] = element_point_1[element_index]*2+1;
all_element_point[2] = element_point_2[element_index]*2;
all_element_point[3] = element_point_2[element_index]*2+1;

for (int i=0; i<ESM_NUM; i++) {
for (int j=0; j<ESM_NUM; j++) {
all_ESmatrix_EK[all_element_point[i]][all_element_point[j]]
=all_ESmatrix_EK[all_element_point[i]][all_element_point[j]]  +     ESmatrix_EK[element_index][i][j];
}
}

次のページ→

<有限要素法>要素剛性マトリクス算出 (まとめ)


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



2015年2月18日水曜日

C言語での特徴 - dimension

C言語での特徴  2) dimension について

CとFORTRANで注意しなければいけない点として、FORTRAN は1が基準点だが、C 0が基準点となる、ということがあります。


そのため

N列の1次元行列では
FORTRANでは A(1), A(2), A(3) ….. A(n)
Cでは A[0], A[1], A[2] …..A[N-1]

MN列の2次元行列では
FORTRANでは A(1,1) A(1,2) …..A(2,1), A(2,2) …..A(M,N)
Cでは A[0][0], A[0][1]….A[1][0], A[1][1]….A[M-1][N-1]

となります。

プログラミングでは以下のような違いが出てきます































次のページ →

C言語での特徴 - function、structure


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

2015年2月9日月曜日

OpenSees Developer : 計算結果表示例(静的・線形解析)



Basic exampleの中の 基本的なトラス解析 で使用したOpenSeesのtcl スクリプトファイル(ここ)で使用している、Node 4 の X, Y 方向の変位(displacement)  を例として、計算結果の表示についての説明です。

表示は、以下のOpenSeesのコマンドで、指示されます。

# Print  the current state at node 4 and at all elements
puts "node 4 displacement: [nodeDisp 4]"



ここで、”nodeDisp”コマンドを実行しているファンクションは、


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


int nodeDisp(ClientData clientData, Tcl_Interp *interp, int argc, TCL_Char **argv)


で実行されます。


すでに、計算結果は、Domain クラスの子クラスの一つであるNodeクラスにありますので、
上記のオレンジの行の部分で、Disp(変位)の値を取ってきます。



また、
表示自身を行っているところは、上記オレンジの行です。
theDataに、Node 4 X方向の変位の計算結果が入っています。
また、theDataのメモリの隣のメモリに、Node 4 X方向の変位の計算結果が入っています。
(theData+1)と「ウオッチ」タブに入力すると、その中の値をみることができます)




その値を buffer に文字列として、入れる事によって、下記の様に表示されることになります。




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

2015年2月3日火曜日

OpenSees Developer :構造計算(静的・線形解析)2



C:\OpenSees-work\OpenSees5621\OpenSees\SRC\analysis\analysis\StaticAnalysis.cpp
または
analysis\analysisプロジェクトのStaticAnalysis.cpp
の中の


result = theStaticAnalysis->analyze(numIncr);
に、
平面トラスの剛性マトリクス作成

実対称正定値帯連立一次方程式を解く
工程があります。

下記が theStaticAnalysis->analyze のソースコードです。



(1) のnumStepsには
analyze 1
と、tcl コマンドでセットした 1 の数字、アナライズしたい数がnumStepsに入っています。

例えば、時系列で10こ分解析をしたい場合は、
analyze 10
と、書きますが、この時numStepsには10が入ることになり、このループを10回分まわすことによって、変位の計算などを行うことになります。

(2) では、この tcl スクリプトの最初の方でセットしている、初期値としてのNodeやElementの値が入っているメモリのポインタを呼び出しています。

(3)では、 
変位の計算の結果、Nodeなどの値が変化しますが、これがcommit( )で許容できるまで、
Domain(Node や Elementの値)を変位に沿って変化させています。



(4) のtheAlgorithm->solveCurrentStep() で、

平面トラスの剛性マトリクス作成


実対称正定値帯連立一次方程式を解くこと
を行っています。

このtheAlgorithm->solveCurrentStep()は、
C:\OpenSees-work\OpenSees5621\OpenSees\SRC\analysis\algorithm\equiSolnAlgo\Linear.cpp

または
aanalysis\algorithm\equiSolnAlgoプロジェクトのLinear.cpp
の中にあります


(5)の部分で、平面トラスの剛性マトリクスの作成
(6)の部分で、実対称正定値帯連立一次方程式を解く

を行っています。

次のページ →
OpenSees Developer :構造計算(静的・線形解析)3


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