■概要 |
2次元・有限要素法による応力解析にて ガウス積分点を4点とする応力値が算出されているとし、この応力値を4個の節点数に割当てる。 基本処理としては、荷重作用点以外では、連続で平滑な応力分布になるよう応力値を並び替え・配設するとする。さらに追加の処理が必要 であり、荷重作用点での応力値の配置を修正する手順、及びせん断応力値の割当て配置の手順を下記に述べる。プログラムの紹介をする。 |
■手順 |
[基本処理] @〜H n=要素No, j=要素節点No, s=節点No, k=積分点Noとして、s = NodNo[(n-1)*4 + j]、応力σx値 = σx[(n-1)*4+k]、 応力σxについて、要素nの値 = σx_av[n] を用いて、隣接要素B,C の応力に対し平滑連続な分布となるよう、要素Aの応力σx値を 配設する。同様に応力σy,τxyを配設する。 参照→「節点・応力値の配置(大小順位)」 [追加処理] J外部荷重により、節点に作用する内力 fx,fy が求められているとする。例えば、s=節点No として、fx値 = fx[s] K内力の作用する節点は 要素内で応力値が最大または最小となるよう配置修正する。例えば、 要素の右端節点に正値のfx(右方向)が作用の場合は、その節点に引張応力が作用しσxが正値であり、最大値が作用する。 要素の左端節点に正値のfx(右方向)が作用の場合は、その節点に圧縮応力が作用しσxが負値であり、最小値が作用する。 なお、その節点は、両要素で引張と圧縮との2つの値が存在し、応力分布は不連続となっている。 Lせん断応力τの算出は、応力σx,σyの配設の算出後、σx,σyよりτ大小関係を算出し配設する。 即ち、x方向及y方向で、σx,σy,τの合計が零となる条件で、隣接要素B側方向にτが増加か減少かを算出。 同様に隣接要素C側方向のを算出。これより要素内の節点に対する、τの大小関係の配置が定まり、τ値を割当てる。 |
■Javascriptによるプログラム |
<html><head> <title>節点応力-HP</title> <SCRIPT Language='JavaScript'> <!--- //----条件データ例----- //配列値の説明:節点番号=i、n=要素番号、k=四角形要素内の節点番号=kとすれば //節点i=NodNo[(n-1)*4+k]、応力=σx_org[(n-1)*4+k]、x方向内力=fx[i]、x位置 = x[i] //本例での単位:位置[m]、内力[ton]、応力[ton/m2]、但し部材厚を1m とする //@節点番号 (Array最初の0はダミー、要素No1の節点Noは1,2,5,4) NodNo = new Array(0,1,2,5,4,2,3,6,5,4,5,8,7,5,6,9,8); NELT = 4;//要素の総数 x = [0,0,1,2,0,1,2,0,1,2]; y = [0,0,0,0,1,1,1,2,2,2]; //節点位置 //A処理前の節点応力値 σx_org = new Array(0,-21,-34,-11,2,34,21,-2,11,6,3,25,29,-3,-6,-29,-25); σy_org = new Array(0,79,16,20,83,-16,-79,-83,-20,24,7,11,29,-7,-24,-29,-11); τxy_org = new Array(0,33,42,17,8,42,33,8,17,24,33,26,17,33,24,17,26); //並び換え処理の応力 σx = new Array(); σy = new Array(); τxy = new Array(); for(k=1;k<=(NELT*4);k++){σx[k] = σx_org[k]; σy[k] = σy_org[k]; τxy[k] = τxy_org[k]; } //J節点に作用する内力 (条件データの追加分) fx = new Array(0,0,-50,0,0,0,0,0,50,0); fy = new Array(0,-50,0,50,0,0,0,0,0,0); var thr= 2;//thresholdを通販プログラムでは1e-6 としている。
//----以下、計算処理 ---------------------- function Node_Stress(){ //B要素についての応力(積分点4か所の応力の平均) σx_av = new Array(); σy_av = new Array(); τxy_av = new Array(); for( ne=1;ne<=NELT;ne++){ sigx = 0; sigy = 0; tauxy = 0; for( kk=1;kk<=4;kk++){ sigx += σx[(ne-1)*4+kk]/4; sigy += σy[(ne-1)*4+kk]/4; tauxy += τxy[(ne-1)*4+kk]/4; } σx_av[ne] = sigx; σy_av[ne] = sigy; τxy_av[ne] = tauxy; } |
![]() |
kaN = new Array();//節点重なり数 for(i=1;i<=NODT;i++){ kaN[i] = 0;} for( ne=1;ne<=NELT;ne++){for( k=1;k<=4;k++){kaN[NodNo[(ne-1)*4+k]] += 1;}} //C隣接する要素の抽出-------内の基本C部分と差替え------- for( ne=1;ne<=NELT;ne++){ n1 = 0; n2 = 0; aN = 1; j11 = 0; j12 = 0; j21 = 0; j22 = 0; j31 = 0; j32 = 0; j41 = 0; j42 = 0; s11 = 0; s12 = 0; s21 = 0; s22 = 0; s31 = 0; s32 = 0; s41 = 0; s42 = 0; ne1 = ne; for(nee=1;nee<=NELT;nee++){ nee1 = nee;nee2 = nee; if(nee1!=ne1){ for(j=1;j<=4;j++){ j1 = j; j2 = j+1; if(j1==4){j2 = 1;} s1 = NodNo[(ne-1)*4+j]; s2 = NodNo[(ne-1)*4+j2]; for(i=1;i<=4;i++){ i1 = i; i2 = i+1; if(i1==4){i2 = 1;} s3 = NodNo[(nee-1)*4+i]; s4 = NodNo[(nee-1)*4+i2]; if((s1==s3 && s2==s4)||(s1==s4 && s2==s3)){ cc = aN; if(cc==1){ aN = 2; j11 = j1; j12 = j2;//A,B n1 = nee;s11 = s1; s12 = s2;//B } if(cc==2&& (j12==j1||j11==j2)){ aN = 3;j21 = j1; j22 = j2; //A,B,C n2 = nee; s21 = s1; s22 = s2;//C } else if(cc==3&& (j12==j1||j11==j2)){ j31 = j1; j32 = j2; //D n3 = nee; s31 = s1; s32 = s2; } else if(cc>=2){ j41 = j1; j42 = j2; //E n4 = nee; s41 = s1; s42 = s2; } } } } } } if(aN>=2){ //CAに対する隣接要素B,C,D,E、(なお、D,Eは省略可) //E応力σxについて ne1 = ne; aA = σx_av[ne]; aB = σx_av[n1]; aC = σx_av[n2]; aD = σx_av[n3]; aE = σx_av[n4]; aAB = aB- aA; aAC = aC -aA; for(i=1;i<=4;i++){g1[(i-1)] = σx[(ne-1)*4+i]; } MaxA(); //F j23 = j22 +1; if(j22>3){j23 = j22 +1-4;} j13 = j12 +1; if(j12>3){j13 = j12 +1-4;} j14 = j12 +2; if(j12>2){j14 = j12 +2-4;} if(n3>0&&((j11==j22&&j21==j32)||(j12==j21&&j22==j31))){aAB = (aB-aD)/2; } if(n4>0&&((j11==j22&&j21==j42)||(j12==j21&&j22==j41))){aAB = (aB-aE)/2; } if(n3>0&&((j11==j22&&j12==j31)||(j12==j21&&j11==j32))){aAC = (aC-aD)/2; } if(n4>0&&((j11==j22&&j12==j41)||(j12==j21&&j11==j42))){aAC = (aC-aE)/2; } //G 図表らん(2) aCC = 0;if(Math.abs(aAB) < Math.abs(aAC)-1e-10){aCC = 1;} //G 図表らん(1)上 if( (j12==j21 && 0>=aAC) || (j11==j22 && 0<=aAC) ){ if(aAB>=0){aa = 1; k1 = 0; k2 = 1; k3 = 3; k4 = 2; if(aCC==1){k2 = 2; k4 = 1;}} if(aAB<0) {aa = 2; k1 = 2; k2 = 3; k3 = 1; k4 = 0; if(aCC==1){k1 = 1; k3 = 2;}} } //G 図表らん(1)下 if( (j12==j21 && 0<aAC) || (j11==j22 && 0>aAC) ){ if(aAB>0){k1 = 1; k2 = 0; k3 = 2; k4 = 3; if(aCC==1){ k1 = 2; k3 = 1;}} if(aAB<0){k1 = 3; k2 = 2; k3 = 0; k4 = 1; if(aCC==1){ k2 = 1; k4 = 2;}} } //H大小関係・図表の順位に並び換え σx[(ne-1)*4+j11] = g2[k1]; σx[(ne-1)*4+j12] = g2[k2]; σx[(ne-1)*4+j13] = g2[k3]; σx[(ne-1)*4+j14] = g2[k4]; //K荷重点の有無と方向とσx並び換え if(Math.abs(x[s11]-x[s12])<Math.abs(y[s11]-y[s12]) ){ j3 = j12 + 1; j4 = j12 + 2; if(j12==3){j4 = 1;} if(j12==4){j3 = 1;j4 = 2;} s3 = NodNo[(ne-1)*4+j3]; s4 = NodNo[(ne-1)*4+j4]; if( Math.abs(fx[s4]) < Math.abs(fx[s11]) ){bb = 0;cc = σx[(ne-1)*4+j4];jm1 = j11; dd = σx[(ne-1)*4+jm1]; if ( fx[s11]> 1e-6){bb = 1; if(x[s11]<x[s4]){bb = -1;}} if ( fx[s11]<-1e-6){bb = 1; if(x[s11]>x[s4]){bb = -1;}} if((bb== 1 && cc>dd)||(bb==-1 && cc<dd )){ σx[(ne-1)*4+j4] = dd; σx[(ne-1)*4+jm1] = cc;} } if( Math.abs(fx[s3])< Math.abs(fx[s12]) ){bb = 0; cc = σx[(ne-1)*4+j3];jm1 = j12; dd = σx[(ne-1)*4+jm1]; if ( fx[s12]> 1e-6){bb = 1; if(x[s12]<x[s3]){bb = -1;}} if ( fx[s12]<-1e-6){bb = 1; if(x[s12]>x[s3]){bb = -1;}} if((bb== 1 && cc>dd)||(bb==-1 && cc<dd )){ σx[(ne-1)*4+j3] = dd; σx[(ne-1)*4+jm1] = cc;} } } //荷重点の他の方向(x[s12]-x[s11]),(x[s31]-x[s32]),(x[s41]-x[s42]) //同様にσx並び換え、記述省略 //Kせん断応力τの配設------------------------------------------------------------------ for(i=1;i<=4;i++){ g1[(i-1)] = τxy[(ne-1)*4+i]; } MaxA(); j23 = j22 +1; if(j22>3){j23 = j22 +1-4;} j24 = j22 +2; if(j22>2){j24 = j22 +2-4;} j13 = j12 +1; if(j12>3){j13 = j12 +1-4;} j14 = j12 +2; if(j12>2){j14 = j12 +2-4;} s13 = NodNo[(ne-1)*4+j13]; s14 = NodNo[(ne-1)*4+j14]; s23 = NodNo[(ne-1)*4+j23]; s24 = NodNo[(ne-1)*4+j24]; bb = 1; d1 = Math.abs(x[s12]-x[s11])-Math.abs(y[s12]-y[s11]); if(d1<0){//AB左右 b2 = (fy[s11]/kaN[s11] + fy[s12]/kaN[s12] + fy[s13] /kaN[s13] +fy[s14]/kaN[s14]); if(y[s12]-y[s11]<0){b2 = -b2;} b1 = (σy[(ne-1)*4+j11] - σy[(ne-1)*4+j12] - (σy[(ne-1)*4+j13] - σy[(ne-1)*4+j14])); if(b1<-thr){bb = -1;} if(b1> thr){bb = 1;} if(Math.abs(b1)0){bb = 1;} else{bb = -1;} } } if(d1>=0){//AB上下 b2 = (fx[s11]/kaN[s11] + fx[s12]/kaN[s12] + fx[s13] /kaN[s13] +fx[s14]/kaN[s14]); b1 = (σx[(ne-1)*4+j12] - σx[(ne-1)*4+j11] - (σx[(ne-1)*4+j14] - σx[(ne-1)*4+j13])); if(x[s11]-x[s12]<0){b2 = -b2;} if(b1<-thr){bb = -1;} if(b1> thr){bb = 1;} if(Math.abs(b1) 0){bb = 1;} else{bb = -1;} } } aCC = 0;c2 = null; a2 = σy[(ne-1)*4+j21] - σy[(ne-1)*4+j22];a1 = σx[(ne-1)*4+j21] -σx[(ne-1)*4+j22]; cc = 1;k1 = x[s22]-x[s21]; k2 = y[s22]-y[s21]; d1 = Math.abs(k1)-Math.abs(k2); if(d1<0){//B c2 = (fy[s21]/kaN[s21] + fy[s22]/kaN[s22] + fy[s23] /kaN[s23] +fy[s24]/kaN[s24]); c1 = (σy[(ne-1)*4+j21] - σy[(ne-1)*4+j22] - (σy[(ne-1)*4+j23] - σy[(ne-1)*4+j24])); if(y[s22]-y[s21]<0){c2 = -c2;} if(c1<-thr){cc = -1;} if(c1> thr){cc = 1;} if(Math.abs(c1) 0){cc = 1;} else{cc = -1;} } } if(d1>=0){//C c2 = (fx[s21]/kaN[s21] + fx[s22]/kaN[s22] + fx[s23] /kaN[s23] +fx[s24]/kaN[s24]); if(x[s21]-x[s22]<0){c2 = -c2;} c1 = ( σx[(ne-1)*4+j22] -σx[(ne-1)*4+j21] ) - (σx[(ne-1)*4+j24] - σx[(ne-1)*4+j23]); if(c1<-thr){cc = -1;} if(c1> thr){cc = 1;} if(Math.abs(c1) 0){cc = 1;} else{cc = -1;} } } d1 = Math.abs(c1)-Math.abs(b1); if(d1>1e-6){aCC = 1;} if( (j12==j21 && cc==-1) || (j11==j22 && cc==1) ){ if(bb==1 ){ k1 = 0; k2 = 1; k3 = 3; k4 = 2; if(aCC==1){k2 = 2; k4 = 1;}} if(bb==-1){ k1 = 2; k2 = 3; k3 = 1; k4 = 0; if(aCC==1){k1 = 1; k3 = 2;}} } if( (j12==j21 && cc==1) || (j11==j22 && cc==-1) ){ if(bb==1 ){ k1 = 1; k2 = 0; k3 = 2; k4 = 3; if(aCC==1){ k1 = 2; k3 = 1;}} if(bb==-1){ k1 = 3; k2 = 2; k3 = 0; k4 = 1; if(aCC==1){ k2 = 1; k4 = 2;}} } τxy[(ne-1)*4+j11] = g2[k1]; τxy[(ne-1)*4+j12] = g2[k2]; τxy[(ne-1)*4+j13] = g2[k3]; τxy[(ne-1)*4+j14] = g2[k4]; } //for( ne=1;ne<=NELT;ne++)の終わり } //結果出力のスクリプト(記述省略)----- //(function Node_Stress()の終)----------- } g1 = new Array(3); g2 = new Array(3); function MaxA(){ //F 応力値:g1[n]、但しn=0〜3。この4個の応力値a,b,c,dを大の順にソート、その順位の応力値=g2[順位] //プログラム基本構想を参照 }
■計算結果 (上記モデル要素数4の場合の結果。 但し、数値精度には要素数100以上必要。) |
要素-(k) 節点 | 処理前 σx σy τxy |
処理後 σx σy τxy |
1 - (1) 1 1 - (2) 2 1 - (3) 5 1 - (4) 4 |
-21.0 79.00 33.00 -34.0 16.00 42.00 -11.0 20.00 17.00 2.000 83.00 8.000 |
-11.0 83.00 17.00 -34.0 20.00 42.00 2.000 16.00 33.00 -21.0 79.00 8.000 |
2 - (1) 2 2 - (2) 3 2 - (3) 6 2 - (4) 5 |
34.00 -16.0 42.00 21.00 -79.0 33.00 -2.00 -83.0 8.000 11.00 -20.0 17.00 |
34.00 -20.0 42.00 11.00 -83.0 17.00 21.00 -79.0 8.000 -2.00 -16.0 33.00 |
3 - (1) 4 3 - (2) 5 3 - (3) 8 3 - (4) 7 |
6.000 24.00 24.00 3.000 7.000 33.00 25.00 11.00 26.00 29.00 29.00 17.00 |
6.000 29.00 17.00 3.000 11.00 26.00 29.00 7.000 33.00 25.00 24.00 24.00 |
4 - (1) 5 4 - (2) 6 4 - (3) 9 4 - (4) 8 |
-3.00 -7.00 33.00 -6.00 -24.0 24.00 -29.0 -29.0 17.00 -25.0 -11.0 26.00 |
-3.00 -11.0 26.00 -6.00 -29.0 17.00 -25.0 -24.0 24.00 -29.0 -7.00 33.00 |