Comments
Description
Transcript
RS2行列
固体力学 大学院工学研究科機械工学専攻 固体力学(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]; } } } }