固体力学 大学院工学研究科機械工学専攻 固体力学(2単位) 004D 有限要素法(要素マトリックス計算プログラム) 構成 シミュレーション 計算機としてのPC シミュレーションのための計算機環境 ハードウエア ソフトウエア シミュレーションのための計算法 有限要素法 メッシュ 連立一次方程式の解法 可視化 参考書 有限要素法概説 有限要素法 O.C.Zienkiewicz and K.Morgan, Dover Finite Element Implementation 矢川元基・吉村忍著,培風館 Finite Elements & Approximation 菊地文雄著,サイエンス社 Y.K.Cheung, S.H.Lo, A.Y.T.Leung, Blackwell Numerical Computation C.W.Ueberhuber, Springer シミュレーションのための計算法 有限要素法 1.2次元定常熱伝導問題 2.2次元応力解析 3.数値積分法 有限要素法(入力データ1) (2.0, 2.0, 2.0) 25 26 27 y x 23 22 z 24 19 20 5 21 18 6 15 10 11 1 12 2 9 6 1 (0.0, 0.0, 0.0) 2 3 要素数:8 節点数:27 有限要素法(入力データ2) 13 10 14 1 11 1 14 11 10 20 14 11 11 21 14 13 23 26 23 17 14 9 6 26 7 15 5 25 15 18 4 8 5 22 12 17 14 4 24 6 17 3 6 23 20 16 13 3 23 5 12 2 22 19 2 5 2 15 14 27 8 24 18 15 有限要素法(入力データ3) 要素データ 1 2 3 4 5 6 7 8 8 8 8 8 8 8 8 8 1 1 1 1 1 1 1 1 1 2 5 2 3 6 4 5 8 5 6 9 10 11 11 12 13 14 14 15 4 10 11 14 13 5 11 12 15 14 7 13 14 17 16 8 14 15 18 17 14 13 19 20 23 15 14 20 21 24 17 16 22 23 26 18 17 23 24 27 22 23 25 26 各行の構成 要素番号,要素タイプ,材料番号,節点番号xN 有限要素法(入力データ4) 節点データ 1 0.0 0.0 0.0 2 1.0 0.0 0.0 3 2.0 0.0 0.0 4 0.0 1.0 0.0 5 1.0 1.0 0.0 6 2.0 1.0 0.0 ・・・・・・・ 25 0.0 2.0 2.0 26 1.0 2.0 2.0 27 2.0 2.0 2.0 各行の構成 節点番号,x座標,y座標,z座標 有限要素法(入力データ5) 材料データ 1 1 2.0e11 0.3 2 1 7.0e10 0.35 各行の構成 材料物性番号,材料タイプ,縦弾性係数,ポアソン比 要素マトリックス計算コード 8 6面体1次要素 7 5 1 N , , 1 i 1 i 1 i 8 e i 6 1 節点数:8 要素あたり自由度:24 要素マトリックス:24x24 3 2 要素マトリックス計算(全体フロー) 入力データ読み込み,変数(配列)初期化 形状(基底)関数値(微分)計算 積 分 点 ル ー プ Bマトリックス算出 DBマトリックス算出 BDBマトリックス算出 要素マトリックスにBDBを加算 終了 要素マトリックス計算(入出力データ) void elmlib_03_Dynamic( element_data element, node_data *node, mate_data mate, double **esm, int ngauss, double *gc, double *gw, int nfpn) { 1節点あたりの自由度 (入力データ) 要素を構成する節点の番号を格納した 1次元配列(入力データ) 全節点の座標を格納した1次元配列 (入力データ) 要素の物性値を格納した1次元配列 (入力データ) 要素マトリックス(演算結果)を格納 する2次元配列(出力データ) ガウス積分の1軸あたり積分点数 (入力データ) ガウス積分の座標値(gc)および重 み(gw)を格納した1次元配列(入力 データ) 要素マトリックス計算(変数・配列) int i,j,k,ii,jj,kk,counter,necm=6, ndeg=8, nnpe=8, kdim=24; double e,v,ro,th,ee,coord[8][3], ja[3][3], invja[3][3], d[6][6], s,t,u,ra, rs,sa,ss,ua,us,n[8][7], b[6][24], db[6][24], dtmp01, ra2,rs2, ssus,ssua,saus,saua, det,invdet; Dマトリックスのサイズ 要素あたり節点数 要素あたり自由度 節点座標 ヤコビアン行列および その逆行列 Dマトリックス 基底関数(微分値) Bマトリックス DBマトリックス ヤコビアン行列の行列式 およびその逆数 要素マトリックス計算(配列初期化) for(i=0;i<nnpe;i++){ ii = element.node[i]; for(j=0;j<nfpn;j++) coord[i][j] = node[ii].f[j]; } e v = mate.d[0]; = mate.d[1]; for(i=0;i<6;i++) for(j=0;j<24;j++) b[i][j] = 0.0; for(i=0;i<6;i++) for(j=0;j<6;j++) d[i][j] = 0.0; for(ii=0;ii<kdim;ii++){ for(jj=0;jj<kdim;jj++) esm[ii][jj] = 0.0; 節点番号 全節点の座標値配列node から当該要素8節点の座標 値をcoordにコピー 縦弾性係数 ポアソン比 Bマトリックス初期化 (ゼロクリア) Dマトリックス初期化 (ゼロクリア) 要素マトリックス初期化 (ゼロクリア) 要素マトリックス計算(Dマトリックス) ee = e*(1.0 - v)/(1.0 + v)/(1.0 - 2.0*v); d[0][0] d[1][1] d[2][2] d[3][3] d[4][4] d[5][5] = = = = = = ee; ee; ee; ee*(1.0 - 2.0*v)/2.0/(1.0 - v); d[3][3]; d[3][3]; 1 v d[0][1] = ee*v/(1.0 - v); v d[0][2] = d[0][1]; v d[1][2] = d[0][1]; E 0 d[1][0] = d[0][1]; 1 v 1 2v d[2][0] = d[0][2]; 0 d[2][1] = d[1][2]; 0 Dマトリックス設定 v v 0 0 v 0 v 1 v 0 0 0 0 0 1 2v 2 0 0 0 1 2v 2 0 0 0 0 1 v 0 0 0 0 0 0 1 2v 2 要素マトリックス計算(積分点ループ) for(i=0;i<ngauss;i++){ s = gc[i]; for(j=0;j<ngauss;j++){ t = gc[j]; for(k=0;k<ngauss;k++){ u = gc[k]; ra rs sa ss ua us = = = = = = ssus saus ssua saua (1.0 (1.0 (1.0 (1.0 (1.0 (1.0 = = = = + + + - s)*0.5; s)*0.5; t)*0.5; t)*0.5; u)*0.5; u)*0.5; ss*us; sa*us; ss*ua; sa*ua; 積分点ループ s, t , u , , 1 ra 1 2 1 us 1 2 1 saus 1 1 4 要素マトリックス計算(基底関数の微分値 1) n[0][0] = -0.5*ssus; n[1][0] = 0.5*ssus; n[2][0] = 0.5*saus; n[3][0] = -0.5*saus; n[4][0] = -0.5*ssua; n[5][0] = 0.5*ssua; n[6][0] = 0.5*saua; n[7][0] = -0.5*saua; rs2 = 0.5*rs; ra2 = 0.5*ra; n[0][1] = -rs2*us; n[1][1] = -ra2*us; n[2][1] = ra2*us; n[3][1] = rs2*us; n[4][1] = -rs2*ua; n[5][1] = -ra2*ua; n[6][1] = ra2*ua; n[7][1] = rs2*ua; N i N i N1 , , 1 1 1 1 8 N1 , , 1 1 1 8 N1 , , 1 1 1 8 N1 , , 1 1 1 8 要素マトリックス計算(基底関数の微分値 2) n[0][2] n[1][2] n[2][2] n[3][2] n[4][2] n[5][2] n[6][2] n[7][2] = = = = = = = = -rs2*ss; -ra2*ss; -ra2*sa; -rs2*sa; rs2*ss; ra2*ss; ra2*sa; rs2*sa; n[0][6] n[1][6] n[2][6] n[3][6] n[4][6] n[5][6] n[6][6] n[7][6] = = = = = = = = rs*ssus; ra*ssus; ra*saus; rs*saus; rs*ssua; ra*ssua; ra*saua; rs*saua; N i N1 , , 1 1 1 8 1 N1 , , 1 1 1 8 Ni 要素マトリックス計算(ヤコビアン行列) for(ii=0;ii<nfpn;ii++){ for(jj=0;jj<nfpn;jj++){ ja[ii][jj] = 0.0; for(kk=0;kk<ndeg;kk++) ja[ii][jj] += n[kk][ii]*coord[kk][jj]; } } x x J x y y y z N i xi z N i xi z N i xi N i yi N i yi N i yi N i zi N i xi N i zi N i xi N i zi N i xi N i yi N i yi N i yi N i zi N i zi N i zi 要素マトリックス計算(ヤコビアン行列式) det = + + - ja[0][0]*ja[1][1]*ja[2][2] ja[0][1]*ja[1][2]*ja[2][0] ja[0][2]*ja[1][0]*ja[2][1] ja[0][0]*ja[1][2]*ja[2][1] ja[0][1]*ja[1][0]*ja[2][2] ja[0][2]*ja[1][1]*ja[2][0] ; invdet = 1.0/det ; a b c d e f a g h i e f h i d b c h i g b c e f 要素マトリックス計算(行列式) a11 a1n sgn P a1 p1 a2 p2 a3 p3 anpn an1 ann P 1 2 n P pn p1 p2 1 sgn P 1 P : even permutatio n P : odd permutatio n 要素マトリックス計算(ヤコビアン逆行列) invja[0][0] invja[0][1] invja[0][2] invja[1][0] invja[1][1] invja[1][2] invja[2][0] invja[2][1] invja[2][2] = = = = = = = = = (ja[1][1]*ja[2][2] (ja[0][2]*ja[2][1] (ja[0][1]*ja[1][2] (ja[1][2]*ja[2][0] (ja[0][0]*ja[2][2] (ja[1][0]*ja[0][2] (ja[1][0]*ja[2][1] (ja[0][1]*ja[2][0] (ja[0][0]*ja[1][1] A 1 i, j - 1 ja[1][2]*ja[2][1])*invdet; ja[0][1]*ja[2][2])*invdet; ja[1][1]*ja[0][2])*invdet; ja[1][0]*ja[2][2])*invdet; ja[0][2]*ja[2][0])*invdet; ja[0][0]*ja[1][2])*invdet; ja[1][1]*ja[2][0])*invdet; ja[0][0]*ja[2][1])*invdet; ja[0][1]*ja[1][0])*invdet; i j A ~ A j ,i 要素マトリックス計算(逆行列) a11 a1n A a a nn n1 余因子 i j a~ij 1 Dij 余因子行列 a11 a i 1,1 Dij ai 1,1 a n ,1 a~11 a~21 a~n1 ~ ~ ~ an 2 ~ a12 a22 A ~ ~ a~ a a 2n nn 1n a1, j 1 a1, j 1 ai 1, j 1 ai 1, j 1 ai 1, j 1 ai 1, j 1 an , j 1 an , j 1 a1n ai 1,n ai 1,n an ,n 1 ~ A A A 1 要素マトリックス計算(基底関数の微分値) for(ii=0;ii<ndeg;ii++){ n[ii][3] = 0.0; n[ii][4] = 0.0; n[ii][5] = 0.0; for(jj=0;jj<3;jj++){ n[ii][3] += invja[0][jj]*n[ii][jj]; n[ii][4] += invja[1][jj]*n[ii][jj]; n[ii][5] += invja[2][jj]*n[ii][jj]; } } N i x N i x N i x N i y N i z N i x x y z N i y N i z N i x x y z N i y N i z N i x x y z y y y N ii n[ii][3] x N ii n[ii][4] y N ii n[ii][5] z z N i N i x x z N i N i J y y N z N i i z z 要素マトリックス計算(Bマトリックス) for(ii=0;ii<ndeg;ii++) jj = ii*nfpn; b[0][jj] = n[ii][3]; b[1][1+jj] = n[ii][4]; b[2][2+jj] = n[ii][5]; b[3][jj] b[3][1+jj] b[4][1+jj] b[4][2+jj] b[5][jj] b[5][2+jj] } = = = = = = n[ii][4]; n[ii][3]; n[ii][5]; n[ii][4]; n[ii][5]; n[ii][3]; x 0 0 B y 0 z 0 y 0 x z 0 0 0 N 0 N8 0 0 1 0 z 0 N 0 0 N 0 1 8 0 0 0 N1 0 0 N 8 N 8 y N1 0 0 0 x x N 8 N1 x 0 0 0 y y N1 0 0 0 0 z N N N 8 N 8 1 1 0 y x y x N 8 N1 N1 0 0 z y z N1 N 8 N1 0 0 x z z 0 0 N 8 z 0 N 8 y N 8 x 要素マトリックス計算(DBマトリックス) for(ii=0;ii<necm;ii++){ for(jj=0;jj<kdim;jj++){ db[ii][jj] = 0.0; for(kk=0;kk<necm;kk++) db[ii][jj] += d[ii][kk]*b[kk][jj]; } } 1 v v v E 0 D 1 v 1 2v 0 0 v v 0 0 v 0 v 1 v 0 0 0 0 0 1 2v 2 0 0 0 1 2v 2 0 0 0 0 1 v 0 0 0 0 0 0 1 2v 2 N1 x 0 0 B N 1 y 0 N1 z 0 0 N1 y 0 0 N1 x N1 z 0 N1 z 0 N 8 x 0 0 N 8 y 0 0 N 8 y N 8 x N 8 z N1 0 y N 8 N1 x z 0 0 0 N 8 z 0 N 8 y N 8 x 要素マトリックス計算(ガウス積分の重み) dtmp01 = gw[i]*gw[j]*gw[k]*det; X (1,1) f x, y dv 1 1 f , J dd 1 1 f , , ddd f , , H 1 1 1 n m l i j k i i 1 j 1 k 1 e e 1 1 1 Y (1,1) H j Hk 要素マトリックス計算(要素マトリックス) for(ii=0;ii<kdim;ii++){ for(jj=0;jj<kdim;jj++){ for(kk=0;kk<necm;kk++) esm[ii][jj]+=b[kk][ii]*db[kk][jj]*dtmp01; } } e e e N1 x 0 t BDBd e N pe x 0 0 N y e 1 0 N pe y N1 y e N N1e 1 x x D 0 e N p N1e y N pe y x N pe 0 N y N1e x e 1 x 0 N pe y 0 e N p d y N pe x 全体剛性マトリックス構築 for(ii=0;ii<nnpe;ii++){ ig = element.node[ii] ; for(jj=0;jj<nnpe;jj++){ jg = element.node[jj] ; for(i=0;i<nfpn;i++){ for(j=0;j<nfpn;j++){ gsm[ig*nfpn+i][jg*nfpn+j] += esm[ii*nfpn+i][jj*nfpn+j]; } } } }
© Copyright 2024 Paperzz