200 likes | 265 Views
三角形要素の有限要素法計算. 2013 年 9 月 17 日 後 保範. 対象方程式. 2. 三角形要素と要素行列. 要素行列 ( 対称 ). (x3,y3). 右辺 ベクトル. (x2,y2). (x1,y1). 要素行列の計算1. 要素 行列の計算2. 境界要素と右辺ベクトル. l. (x1,y1). (x1,y1). P1. P2. 節点 P1,P2 の値を g として , 対応する右辺ベクトへ. を計算. 境界要素右辺ベクトル計算. l. (x2,y2). (x1,y1). 入力データ1(三角形要素).
E N D
三角形要素の有限要素法計算 2013年9月17日 後 保範
対象方程式 2
三角形要素と要素行列 要素行列(対称) (x3,y3) 右辺 ベクトル (x2,y2) (x1,y1)
境界要素と右辺ベクトル l (x1,y1) (x1,y1) P1 P2 節点P1,P2の値をgとして,対応する右辺ベクトへ を計算
境界要素右辺ベクトル計算 l (x2,y2) (x1,y1)
入力データ1(三角形要素) Element[m][5] Ktbl[] Ftbl[] 配列には 持たない Node[n][3]
入力データ2(節点) XY[n][2] Node[n] 配列には 持たない Fix[] 0は未知数となる節点
出力データ1(要素行列) ElMat[m][3][3]: double m ElB[m]: double --- 右辺ベクトル用
出力データ2(密行列) = x A b Aの形は各種 今回は密行列 作成
共通領域の確保例(Java) public int Element[][] = new int[1000][5]; public int Node[] = new int[1000]; public double XY[][] = new double[1000][2]; public double ElMat[][][] = new double[1000][3][3]; public double ElB[] = new double[1000]; public double Ktbl[] = new double[100]; public double Ftbl[] = new double[100]; public double Fix[] = new double[100]; public double A[][] = new double[1000][1000]; public double B[] = new double[1000];
要素行列の計算1(全体) public void SetElM(int m) { int k, nd1, nd2, nd3; double x1,y1, x2,y2, x3, y3, S; double kv, fv; for (k=0; k<m; k++) { 準備計算(節点番号、座標、面積、物性値(k,f)) 要素行列の計算(ElMat[k][][], ElB[k]) } }
要素行列の計算2(準備計算) nd1 = Element[k][0]; nd2 = Element[k][1]; nd3 = Element[k][2]; kv = Ktbl[Element[k][3]]; fv = Ftbl[Element[k][4]]; x1 = XY[nd1][0]; y1 = XY[nd1][1]; x2 = XY[nd2][0]; y2 = XY[nd2][1]; x3 = XY[nd3][0]; y3 = XY[nd3][1]; S = Math.abs(x1*y2 + x2*y3 + x3*y1 - x2*y1 - x3*y2 - x1*y3);//面積*2
要素行列の計算3(要素行列) kv = kv / (2.0*S); ElMat[k][0][0] = kv*( (x3-x2)*(x3-x2) + (y2-y3)*(y2-y3) ); ElMat[k][1][1] = kv*( (x1-x3)*(x1-x3) + (y3-y1)*(y3-y1) ); ElMat[k][2][2] = kv*( (x2-x1)*(x2-x1) + (y1-y2)*(y1-y2) ); ElMat[k][0][1] = kv*( (x3-x2)*(x1-x3) + (y2-y3)*(y3-y1) ); ElMat[k][0][2] = kv*( (x3-x2)*(x2-x1) + (y2-y3)*(y1-y2) ); ElMat[k][1][2] = kv*( (x1-x3)*(x2-x1) + (y3-y1)*(y1-y2) ); ElB[k] = fv*S/6.0; ElMat[k][1][0] = ElMat[k][0][1]; //対称なの以下は ElMat[k][2][0] = ElMat[k][0][2]; //省略可能 ElMat[k][2][1] = ElMat[k][1][2];
密行列作成1(全体) public void SetAB(int m, int n) { inti, j, k, IP, JP, IFX, JFX; 行列A,右辺ベクトルのクリア for (k=0; k<m; k++) { for (i=0; i<3; i++) { IP = Element[k][i]; IFX = Node[IP]; if (IFX == 0) {i節点は未知数処理 } } } }
密行列作成2(i節点は未知数) B[IP] += ElB[k]; // Set B[IP] by f for (j=0; j<3; j++) { JP = Element[k][j]; JFX = Node[JP]; if (JFX == 0) //共に未知数なら行列へ { A[IP][JP] += ElMat[k][i][j]; } else //一方が既知数ならbへ { B[IP] -= Fix[JFX]*ElMat[k][i][j]; } }
対称帯行列の作成 j M+1 A[i][j]: 密行列 A[i][j-i]: 帯行列 i public double A[][] = new double[1000][1000]; 100: (m+1)以上
行列作成2(対称帯行列用) B[IP] += ElB[k]; // Set B[IP] by f for (j=i; j<3; j++) j=0をj=iに変更 { JP = Element[k][j]; JFX = Node[JP]; A[IP][JP]をA[IP][JP-IP]に変更 if (JFX == 0) //共に未知数なら行列へ { A[IP][JP-IP] += ElMat[k][i][j]; } else//他方が既知数ならbへ { B[IP] -= Fix[JFX]*ElMat[k][i][j]; } }
入力データ3(境界要素) Bound[l][3] 配列には 持たない Node[n][3] Alph[]