Python♪FEM:平面トラスプログラムの変数名について

特にFEMのような比較的長いプログラムでは、変数名の付け方によって読みやすさが大きく変わります。しかし、本を調べても変数名はバラバラですし、命名理由も書かれていません。そこで、この記事では私が公開した平面トラスプログラムの変数命名メモを紹介ます。

Python♪FEM:平面トラスの有限要素法サンプルコード

変数名の付け方には正解はありません。しかし、プログラムの命名法に一貫した考え方がなければ、他の人には読みにくいですし、自分自身も忘れてしまいます。

長く、大切にしたいプログラムは面倒でも変数名の付け方を記録しておくことをお勧めします。

0. FEMなど数値解析シリーズ

この記事は「FEMなど数値解析シリーズ」の記事です。一連の記事は、以下のリンク集を参照してください。

Python♪FEMなど数値解析シリーズ

1.変数名の命名方針

変数名が長いほど意味は明解になります。しかし、長い計算式に長い変数名を使うと式全体を見渡すことができず、読みにくいコードになります。バランスが難しい・・・

そこで私は以下の方針で変数名を決めました。

  • 変数名はできるだけ3文字以内の半角英数字を「_」でつないだ文字とします。
  • クラス化も視野に入れ、関係のある変数の頭には同じ文字をつけました。例えば部材に関係する変数は「mem_」を頭につける。
  • for文で変化させる変数は外側から「i, j, k, l, m, n」とするのが一般的です。ただ、i, j, k, l, m, nだけでは変数の意味が分かりにくいので、「i_nn」「j_nn」のようにアンダーバーの後ろに変数の意味を付け加えました。
  • 慣例的にクラス名の最初を大文字にするので、変数名の最初を大文字にしない。

2.変数名一覧

以下、「def 関数名」「global変数、引数で渡した変数、returnで返した変数」「def 関数のlocal変数」にわけて、変数名を紹介したいと思います。

(1) def 関数名

input_data: [INPUT][DATA]
output_data(): [OUTPUT][DATA]
bc_index(): [Boundary Condition][INDEX]
ek_global(): [Element K(stiffness matrix)][GLObal coordinate system]
mem_len_rotation(): [MEMber][LENgth][ROTATION]
set_gk(): [SET][Globally assembled K(stiffness matrix)]
set_nodal_load(): [SET][NODAL][LOAD]
gk_reaction_force():[Globally assembled K(stiffness matrix)][REACTION][FORCE]
del_fix_gk_nl(): [DELete][FIX][Globally assembled K(stiffness matrix)]
               [Nodal Load]
node_displacement(): [NODE][DISPLACEMENT]  
stress():[STRESS]
reaction_force(): [REACTION][FORCE]
output_result(): [OUTPUT][RESULT]

(2) global変数、引数、return

bc_ff[i, j]: [Boundary Condition][Fix or Free]
  :fixの方向:0, freeの方向:1(j=0:x方向, J=1:y方向)
bc_nn[i]: [Boundary Condition][Node Number]
  :境界条件を与えられている節点番号
bc_tn: [Boundary Condition][Total Number]
  :境界条件を与える節点の数
dis_fre_v: [DISplacement vector][FREe][Vector]
  :節点変位のベクトル(freeの部分)
ek_glo: [Element K(stiffness matrix)][GLObal coordinate system]
  :要素剛性マトリクス(全体座標系)
mem_are[i]: [MEMber][AREa]
  :i部材の断面積
mem_len: [MEMber][LENgth]
  :部材長
mem_nn[i, j]: [MEMber][Node Number]
  :i部材を構成する節点番号(j=0, 1)
mem_rot: [MEMber][ROTation]
  :部材座標系に変換する回転行列
mem_str: [MEMber][STRess]
  :i部材の軸力(引張側正)
mem_tn: [MEMber][Total Number]
  :総部材数
mem_ym: [MEMber][Young's Modulus]
  :ヤング係数
gk: [Globally assembled K(stiffness matrix)]
  :全体剛性マトリクス  ※def del_fix_gk_nl()前後で使用範囲が変わる
gk_rfix: [Globally assembled K(stiffness matrix)][REACTION][FORCE]
  :反力算定用の剛性マトリクス(fix行、free列の抜き出し)
i_g_mn: [I][GLObal variables][Menber Number]
  :要素番号を示す変数 
ind_fix: [INDex][FIX]
  :fix部分の通し番号と節点番号の対応表
ind_fre: [INDex][FREe]
  :free部分の通し番号と節点番号の対応表
nl_mag[i, j]: [Nodal Load][MAGnitude]
  :外力の大きさ(j=0:x方向, J=1:y方向)
nl_nn[i]: [Nodal Load][Node Number]
  :外力が作用する節点番号
nl_tn: [Nodal Load][Total Number]
  :外力が作用する節点の数
nl_v: [Nodal Load][Vector]
  :荷重ベクトル  ※def del_fix_gk_nl()前後で使用範囲が変わる
nod_coo[i, j]: [NODe][COOrdinate]
  :i節点の座標(j=0:x方向, j=1:y方向)
nod_tn: [NODe][Total Number]
  :総節点数
rf_v[i]: [Reaction Force][Vector]
  :反力 (i:反力の通し番号)
rf_nn[i]:[Reaction Force][Node Number]
  :反力の通し番号に対応する反力の節点番号 ※リスト
rf_der[i]:[Reaction Force][DERection
  :反力の通し番号に対応する反力の方向の記号 ※リスト
   (j=0:反力の節点番号, j=1:反力の向き(x:0, y:1),  j=2:反力)
rf_nn_der: [Reaction Force][Node Number][DERection]
  :反力の節点番号と方向(i=0:節点番号、i=1:方向) ※リスト
siz_fix: [SIZe][FIX]
  :全自由度の中で境界条件がfixの部分の数
siz_fre: [SIZe][FREe]
  :全自由度の中で境界条件がfreeの部分の数
siz_tot: [SIZe][TOTal]
  :節点の全自由度の総数 (= 節点数(nod_tn) * 自由度(siz_nod))
siz_nod: [SIZe][degrees of freedom of NODes]
  :節点の自由度(x、y方向変位の2種類)
var_max: [VARiable][MAX] 
  :節点番号、要素番号などで指定した変数の型が取り得る最大値
    uint16→0~65535、unit36→0~4294967295、unit64→0~18446744073709551615

(3) ローカル変数

def input_data_1():、def input_data_2():

ローカル変数なし

def output_data():

i_bcn: [I][Boundary Condition Number]
  :境界条件番号
i_mn: [I][Menber Number]
  :部材番号
i_nln: [I][Nodal Load Number]
  :節点荷重番号
i_nn: [I][Node Number]
  :節点番号

def bc_index():

i_bcn: [I][Boundary Condition Number]
  :境界条件番号
ind_1st: [INDex][1ST(the first)]
  :指定する節点の最初の番号(節点番号×節点の自由度)
j_dof: [J][Degrees Of Freedom of node]
  :節点の自由度
tmp_fix: [TeMPorary][Sum][FIX]
  :ind_fix生成のための一時的な作業用変数
tmp_fre: [TeMPorary][FREe]
  :ind_fre生成のための一時的な作業用変数

def ek_global():

ek_loc: [Element K(stiffness matrix)][LOCal coordinate system]
  :要素剛性マトリクス(部材座標系)
mem_len: [MEMber][LENgth]
  :部材長
mem_rot: [MEMber][ROTation]
  :部材座標系に変換する回転行列

def mem_len_rotation():

c:[Cos]
  :cos(θ) 反時計回りを正
dis_x: [X][DIFerence]
  :部材0端と1端のx座標の差
dis_y: [Y][DIFerence]
  :部材0端と1端のy座標の差
mem_0_nn: [MEMber][0端][Node Number]
  :部材0端の節点番号
mem_1_nn: [MEMber][1端][Node Number]
  :部材1端の節点番号
s:[Sin]
  :sin(θ) 反時計回りを正

def set_gk():

be_tn: [Both Ends][Total Number]
  :材端の数=2(0端、1端)
ek_col:[Element K(stiffness matrix)][COLumn number]
  :要素剛性マトリクスでの列番号
ek_col_1st:[Element K(stiffness matrix)][COLumn number][1ST(the first)]
  :要素剛性マトリクスのスタート列番号
ek_row:[Element K(stiffness matrix)][ROW number]
  :要素剛性マトリクスでの行番号
ek_row_1st:[Element K(stiffness matrix)][ROW number][1ST(the first)]
  :要素剛性マトリクスでの最初の行番号
gk_col:[Globally assembled K(stiffness matrix)][COLumn number]
  :全体剛性マトリクスでの列番号
gk_col_1st:[Globally assembled K(stiffness matrix)][COLumn number][the first]
  :全体剛性マトリクスのスタート列番号
gk_row:[Globally assembled K(stiffness matrix)][ROW number]
  :全体剛性マトリクスでの行番号
gk_row_1st:[Globally assembled K(stiffness matrix)][ROW number][the first]
  :全体剛性マトリクスでの最初の行番号
i_ben: [I][Both Ends Number]
  :材端番号(0端、1端)
j_ben: [J][Both Ends Number]
  :材端番号(0端、1端)
k_dof: [K][Degrees Of Freedom of node]
  :節点の自由度(x、y方向変位の2種類)
l_dof: [L][Degrees Of Freedom of node]
  :節点の自由度(x、y方向変位の2種類)

def set_nodal_load():

i_nln: [I][Nodal Load Number]
  :節点荷重番号
j_dof: [J][Degrees Of Freedom of node]
  :節点の自由度(x、y方向変位の2種類)
nl_1st:[Nodal Load][1ST(the first)]
  :指定する節点の最初の番号(節点番号×節点の自由度)

def gk_reaction_force():

gk_col_fre:[Globally assembled K(stiffness matrix)][COLumn number][FREe]
  :全体剛性マトリクスのfree部分の列番号
gk_row_fix:[Globally assembled K(stiffness matrix)][ROW number][FIX]
  :全体剛性マトリクスのfix部分の行番号
i_fix: [I][FIX nunber]
  :fix部分の通し番号
j_fre: [J][FREe number]
  :free部分の通し番号

def del_fix_gk_nl():

gk_col_fre: [Globally assembled K(stiffness matrix)][COLumn number][FREe]
  :全体剛性マトリクスのfree部分の行番号
gk_row_fre: [Globally assembled K(stiffness matrix)][ROW number][FREe]
  :全体剛性マトリクスのfree部分の行番号
i_fre: [I][FREe nunber]
  :free部分の通し番号
j_fre: [J][FREe number]
  :free部分の通し番号

def node_displacement():

dof: [Degrees Of Freedom of node]
  :節点の自由度
nn: [Node Number]
  :節点番号
nod_dis: [NODe][DISplacement]
  :節点変位の大きさ(x,y方向考慮)
nod_dis_x: [NODe][DISplacement][X]
  :x方向節点変位
nod_dis_y: [NODe][DISplacement][Y]
  :y方向節点変位
i_fre: [I][FREe nunber]
  :fix部分の通し番号
i_nn: [I][Node Number]
  :節点番号

def stress():

be_tn: [Both Ends][Total Number]
  :材端の数=2(0端、1端)
dis_1st: [DISplacement number][1ST(the first)]
  :指定する節点の最初の番号(材端番号×節点の自由度)
dis_be_glo: [DISplacement][Both Ends][GLObal coordinate system]
  :部材両端の節点変位(全体座標系)
dis_be_loc:[DISplacement][Both Ends][LOCal coordinate system]
  :部材両端の節点変位(部材座標系)
i_mn: [I][Menber Number]
  :部材番号
j_ben: [J][Both Ends Number]
  :材端番号(0端、1端)
k_dof: [K][Degrees Of Freedom of node]
  :節点の自由度(x、y方向変位の2種類)

def reaction_force():

i_fix: [I][FIX nunber]
  :fix部分の通し番号

def output_result():

i_bcn: [I][Boundary Condition Number]
  :境界条件番号
i_fix: [I][FIX nunber]
  :fix部分の通し番号
i_mn: [I][Menber Number]
  :部材番号
i_nln: [I][Nodal Load Number]
  :節点荷重番号
i_nn: [I][Node Number]
  :節点番号

私が実際に購入した教材のご紹介

以下、私が実際に購入したPythonの教材をまとめてみました。 Pythonを学習する上で、少しでもお役に立つことができればうれしいです。

Python♪私が購入したPythonの書籍のレビュー
UdemyのPythonの動画講座を書籍を買う感覚で購入してみた

その他

Twitterへのリンクです。SNSもはじめました♪

液晶ペンタブレットを買いました
 (1) モバイルディスプレイを買うつもりだったのに激安ペンタブレット購入

以下、私が光回線を導入した時の記事一覧です。
 (1) 2020年「光回線は値段で選ぶ」では後悔する ←宅内工事の状況も説明しています。
 (2) NURO光の開通までWiFiルーターを格安レンタルできる
 (3) NURO光の屋外工事の状況をご紹介。その日に開通!
 (4) 光回線開通!実測するとNURO光はやっぱり速かった
 (5) ネット上のNURO光紹介特典は個人情報がもれないの?