パラメトリック四角形要素による FEM

●● 始めに ●●

四角形剛性要素の変移を横位置αと縦位置βの二つのパラメータで表現します。それを元に四角形剛性要素の剛性行列を Ke を導きます。全体を四角形要素に分解し、それぞれの剛性行列を足し合わせて全体の校正行列を導きます。

●● パラメトリック四角形要素の理論 ●●

まず最初に、一つの四角形要素に注目して、四つの頂点に加わっている力と歪と応力の関係式を導きます。

● パラメータと力と変移と応力

(x0,y0), (x1,y1), (x2,y2), (x3,y3) の位置に頂点をもつ四角形を考えます。その頂点に (fx0,fy0), (fx1,fy1), (fx2,fy2), (fx3,fy3) の力が加わったとの変移を (u0,v0), (u1,v1), (u2,v2), (u2,v2) とします。下に示す、変移と力の関係を表す、一つの四角形要素についての剛性行列 Ke を計算します。

                力                    ==  剛性行列 *            変移
< fx0,fy0, fx1,fy1, fx2,fy2, fx3,fy3> ==     Ke    * <u0,v0, u1,v1, u2,v2, u3,y3>

でも、trus のときのように棒ではなく、平面に分布している四角形に応力が分布していることによって発生する力を求めることになります。四角形の応力分布を求めることが必要になります。このためにα∈[-1,1) β∈[-1,1] のパラメータを使います。そして α、βパラメーターによる変移がもたらす応力分布の式を作ってやり、その式をαとβで積分してやることで、四角形に加わる力を計算できるようにします。

まず α、βの、二つのパラメータによって、(x0,y0),(x1,y1),(x2,y2),(x3,y3) の四点で囲まれる四角形の中の任意の点 (x,y) を下のように表現できます。

四角形の四つの頂点 (x0,y0), (x1,y1), (x2,y2), (x3,y3) が与えられたとき、α,б∈[-1,1] に対応する、四角形内の位置 (x,y) が下のように表されます。

//@@
x0 = 0, y0=0
x1 = 2, y1=0
x2 = 2, y2=1
x3 = 0, y3=1
#α= -1, β=-1
α= 1, β=1
x = 1/4((1-α)(1-β)x0 + (1+α)(1-β)x1 + (1+α)(1+β)x2 + (1-α)(1+β)x3) # α、β∈[-1,1]
y = 1/4((1-α)(1-β)y0 + (1+α)(1-β)y1 + (1+α)(1+β)y2 + (1-α)(1+β)y3)
//@@@
この (x,y) に対する α、βによる J: Jacobian は下の式になります。
∂(x,  y )  
-----------  = J: Jacobian 行列 
∂(α, β)  

J == 1/4( -(1-β)x0 + (1-β)x1 + (1+β)x2 - (1+β)x3), 1/4( -(1-β)y0 + (1-β)y1 + (1+β)y2 - (1+β)y3)
     1/4( -(1-α)x0 - (1-α)x1 + (1+α)x2 + (1+α)x3), 1/4( -(1-α)y0 - (1-α)y1 + (1+α)y2 + (1+α)y3)
位置 (x,y) と同様に、四角形内の変移 (u,v) も α、β のパラメータで表現されます
u = 1/4((1-α)(1-β)u0 + (1+α)(1-β)u1 + (1+α)(1+β)u2 + (1-α)(1+β)u3) # α、β∈[-1,1)
v = 1/4((1-α)(1-β)v0 + (1+α)(1-β)v1 + (1+α)(1+β)v2 + (1-α)(1+β)v3)
   ただし (uj,vj) j=0,1,2,3 は (xj,yj) の位置での変移とします。
(u,v) に対する α、βによる J4:Jacobian は下の式になります。
<∂u/∂α, ∂u/∂β> == J <∂u/∂x, ∂u/∂y>
<∂v/∂α, ∂v/∂β> == J <∂v/∂x, ∂v/∂y>

<∂u/∂α, ∂u/∂β,∂v/∂α, ∂v/∂β> ==  J4 <∂u/∂x, ∂u/∂y ,∂v/∂x, ∂v/∂y>
     ただし  J4 = |  J  , 0, 0 |
                  |       0, 0 |
                  | 0, 0,      |
                  | 0, 0,   J  |
より具体的な式にします
<∂u/∂α, ∂v/∂α, u/∂β, ∂v/∂β> == 

|-(1-β)/4,  0, (1-β)/4,  0, (1+β)/4,  0, -(1+β)/4,   0 |*<u0,v0, u1,v1, u2,v2, u3,v3>
| 0,   -(1-β)/4,  0, (1-β)/4,  0, (1+β)/4,  0, -(1+β)/4|
|-(1-α)/4,  0,-(1+α)/4,  0, (1+α)/4,  0,  (1-α)/4,   0 |
| 0,   -(1-α)/4,  0,-(1+α)/4,  0, (1+α)/4,  0,  (1-α)/4|

==                  Form_uv             *                <u0,v0, u1,v1, u2,v2, u3,v3>
==                  Form_uv             *                displacement

但し
    Form_uv ≡ |-(1-β)/4,  0, (1-β)/4,  0, (1+β)/4,  0, -(1+β)/4,   0 |
               | 0,   -(1-β)/4,  0, (1-β)/4,  0, (1+β)/4,  0, -(1+β)/4|
               |-(1-α)/4,  0,-(1+α)/4,  0, (1+α)/4,  0,  (1-α)/4,   0 |
               | 0,   -(1-α)/4,  0,-(1+α)/4,  0, (1+α)/4,  0,  (1-α)/4|

    displacement ≡ <u0,v0, u1,v1, u2,v2, u3,v3>

一方で平面応力を発生させる平面歪率:εx, εy, センダン歪率:εxy と変移率 ∂u/∂x, u/∂y, ∂v/∂x, ∂v/∂y には下の関係があります

<εx, εy, εxy> ==  εuv         <∂u/∂x, u/∂y, ∂v/∂x, ∂v/∂y>

            εuv ≡ | 1, 0, 0, 0 |
                   | 0, 0, 0, 1 |
                   | 0, 1, 1, 0 |

また平面応力:<σx, σy, σxy> と歪率 εx, εy, εxy は Young 率 E と Poisson 比 μ によって下のように関係付けられます

<σx, σy, σxy> ==    D       *       <εx, εy, εxy>

  但し
             D =  |  1, μ,       0  | E/(1-μ^2)
                  | μ,  1,       0  |
                  |  0,  0, (1-μ)/2 |

上に述べた行列 From_uv、εuv, D を使って、変移 displacement と四角形の四隅に加わる力を導きます。


● 四角形の四隅に加わる力

displacement = <u0,v0, u1,v1, u2,v2, u3,v3> の変移がある状態で α、β の位置にある dx dy の微小面積には、下に示す応力が発生しています。

<σx, σy, σxy>  = D εuv J4^-1 Form_uv displacement

この変移にさらに δuv = <δu0,δv0, δu1,δv1, δu2,δv2, δu3,δv3> の変移が加わると、 下のエネルギーが追加されます。

   <εuv J4^-1 Form_uv δuv | <σx, σy, σxy> > dx dy 
== <δuv |!dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv| displacement > dx dy 

この dx dy 微小領域に蓄えられたエネルギー全体、すなわち積分値と、四点に加わる力 F = <Fx0,Fy0, Fx1,Fy1, Fx2,Fy2, Fx3,Fy3> が四つの頂点で発生する変移によってなされる仕事は同じです。

<δuv| F>
    
==∫<δuv |!dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv| displacement > dx dy 
==∫<δuv |!dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv| displacement > !det(J) dα dβ  

δuv は任意ですから、下の式が成り立ちます。

F ==∫!dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv displacement !det(J) dα dβ  
≒ 
  !dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv displacement !det(J)
     (at α=-1/√3 β = -1/√3)
+ !dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv displacement !det(J)
     (at α=+1/√3 β = -1/√3)
+ !dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv displacement !det(J)
     (at α=-1/√3 β = +1/√3)
+ !dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv displacement !det(J)
     (at α=+1/√3 β = +1/√3)

== K * displacement
ただし K == 
  !dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv !det(J) (at α=-1/√3 β = -1/√3)         
+ !dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv !det(J) (at α=+1/√3 β = -1/√3)
+ !dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv !det(J) (at α=-1/√3 β = +1/√3)
+ !dggr(Form_uv)!dggr(J4^-1)!dggr(εuv) D εuv J4^-1 Form_uv !det(J) (at α=+1/√3 β = +1/√3)
上では「ガウスの積分公式」を使い面倒な積分計算を、四点の足し算で近似計算しています。

上の式によって、四角形要素の要素剛性行列 K を計算できるようになりました。この要素剛性行列を線形に足し合わせてやれば全体の剛性行列が出てきます。



●● 例題 1 ●●

まず、最初は下のような四角形の板が左側の壁で保持されているとし、その板に下向きの力が加わったときに発生する歪と汎力を計算してみます。
 |3              2
 |■-------------+
 |               |
 |               |1000mm
 |■-------------+
 |0  2000mm    1 ↓2000 kgf
                         
  t=1`mm, E=21000`Kg/`mm^2, μ=0.3 #Poisson ratio



● 剛性行列 Ke の計算

最初にパラメータ α、β に依存する J, J4:Jacobian と形状行列 From_uv の sf サブルーチン・ファイルを作っておきます。
//@@
@@subFile J
    _rt =[[2]]
    _rt[0,*] = <(-(1-β)x0 + (1-β)x1 + (1+β)x2 - (1+β)x3)/4
                    , (-(1-β)y0 + (1-β)y1 + (1+β)y2 - (1+β)y3)/4>
    _rt[1,*] = <(-(1-α)x0 - (1+α)x1 + (1+α)x2 + (1-α)x3)/4
                    , (-(1-α)y0 - (1+α)y1 + (1+α)y2 + (1-α)y3)/4>
@@endSubFile

@@subFile J4
    _rt = [[4]]
    _rt[<0+0*4, 2,1>] = (@J())[0,*]
    _rt[<0+1*4, 2,1>] = (@J())[1,*]
    _rt[<2+2*4, 2,1>] = (@J())[0,*]
    _rt[<2+3*4, 2,1>] = (@J())[1,*]
@@endSubFile

@@subFile Form_uv
    _rt = [[4,8]]
    _rt[0,*] = < -(1-β)/4,  0, (1-β)/4,  0, (1+β)/4,  0, -(1+β)/4,   0 >
    _rt[1,*] = <  0,   -(1-β)/4,  0, (1-β)/4,  0, (1+β)/4,  0, -(1+β)/4>
    _rt[2,*] = < -(1-α)/4,  0,-(1+α)/4,  0, (1+α)/4,  0,  (1-α)/4,   0 >
    _rt[3,*] = <  0,   -(1-α)/4,  0,-(1+α)/4,  0, (1+α)/4,  0,  (1-α)/4>
@@endSubFile
//@@@
後は、四つの頂点の位置、板厚 t, Youn 率 E、Poisson 比 μの値を与えて、εuv, D, 行列を作って理論をなぞって剛性行列を計算します。下のように計算します。
//@@
#    εuv @= [[3,4]]
    εuv = [[3,4]]
    εuv[0,*] = <1,0,0,0>
    εuv[1,*] = <0,0,0,1>
    εuv[2,*] = <0,1,1,0>


    t=1

    E = 21000
    μ = 0.3
    D=[[3]]
    D[0,*]=<1,μ,      0> E/(1-μ^2)
    D[1,*]=<μ,1,      0> E/(1-μ^2)
    D[2,*]=<0,0,(1-μ)/2> E/(1-μ^2)

    x0=0,    y0=0
    x1=2000, y1=0
    x2=2000, y2=1000
    x3=0   , y3=1000

    B=[[3,8]]

    α@=-0.57735, β@=-0.57735
    B = εuv @J4()^-1 @Form_uv()
    K00= !dggr(B) D B t !det(@J())

    α =+0.57735, β =-0.57735
    B = εuv @J4()^-1 @Form_uv()
    K10= !dggr(B) D B t !det(@J())

    α =+0.57735, β =+0.57735
    B = εuv @J4()^-1 @Form_uv()
    K11= !dggr(B) D B t !det(@J())

    α =-0.57735, β =+0.57735
    B = εuv @J4()^-1 @Form_uv()
    K01= !dggr(B) D B t !det(@J())

    Ke = K00 + K10 + K01 + K11
//@@@

剛性行列の計算結果は下のようになります

     sf command argment: Ke = K00 + K10 + K01 + K11
    <  5192.31,     3750, -3173.08, -288.462, -2596.16,    -3750,  576.924,  288.462 >
    <     3750,  20769.2,  288.462,   2307.7,    -3750, -10384.6, -288.462, -12692.3 >
    < -3173.08,  288.462,  5192.31,    -3750,  576.924, -288.462, -2596.16,     3750 >
    < -288.462,   2307.7,    -3750,  20769.2,  288.462, -12692.3,     3750, -10384.6 >
    < -2596.16,    -3750,  576.924,  288.462,  5192.31,     3750, -3173.08, -288.462 >
    <    -3750, -10384.6, -288.462, -12692.3,     3750,  20769.2,  288.462,   2307.7 >
    <  576.924, -288.462, -2596.16,     3750, -3173.08,  288.462,  5192.31,    -3750 >
    <  288.462, -12692.3,     3750, -10384.6, -288.462,   2307.7,    -3750,  20769.2 >

    Jacobi.exe Ke
    < -8.58628e-012, -1.21176e-012,  6.72659e-014,        5192.3,       10205.2,
           20192.3,       20769.2,       47487.1 >
Ke の固有値も、三つが 0 であり、物理的自由度の理屈に合っています。理論どおりに計算できたようです。

● 0 と 3 の位置を固定し、2 の位置で下向きに 2000 kgf の力を加えたときの変移と力

0 と 3 の位置を固定したときの剛性行列 K を作ります。
//@@
    K=Ke
    e0=<1,0,0,0, 0,0,0,0>
    K[0,*] = e0
    K[*,0] = e0

    K[1,*] = ~shift(e0,1)
    K[*,1] = ~shift(e0,1)
    
    K[6,*] = ~shift(e0,6)
    K[*,6] = ~shift(e0,6)
    K[7,*] = ~shift(e0,7)
    K[*,7] = ~shift(e0,7)
//@@@
    <        1,        0,        0,        0,        0,        0,        0,        0 >
    <        0,        1,        0,        0,        0,        0,        0,        0 >
    <        0,        0,  5192.31,    -3750,  576.924, -288.462,        0,        0 >
    <        0,        0,    -3750,  20769.2,  288.462, -12692.3,        0,        0 >
    <        0,        0,  576.924,  288.462,  5192.31,     3750,        0,        0 >
    <        0,        0, -288.462, -12692.3,     3750,  20769.2,        0,        0 >
    <        0,        0,        0,        0,        0,        0,        1,        0 >
    <        0,        0,        0,        0,        0,        0,        0,        1 >
出来上がった K の逆行列を使って 2000 kgf 負荷が、頂点 1 の位置に加わったときの変移 displacement を計算します。
    displacement = K^-1 <0,0, -2000 ,0, 0,0, 0,0>      # 力による変移量の計算
    <         0,         0, -0.569989,  -0.21171,  0.200382, -0.173475,         0,         0 >
逆に、変移:displacement と剛性行列:Ke から各頂点に加わる力:force を計算します。
    force = Ke  displacement
    <          2000,       397.059,         -2000, -4.54747e-013,  4.54747e-013,  4.54747e-013, -1.27187e-012,      -397.059 >

    !sum(force)
    < 3.97904e-013 >
頂点に加わる四つの力が釣り合っています。頂点四つの力の要素全部を足し合わせると、理屈どおりに 0 になっています。応力の表れ方をみても、物理的直感に一致します。剛性行列の計算に誤りは紛れ込んでいなようです。



●● 例題 2 ●●

例題 1 の問題をそのまま使います。ただしメッシュの切り方を二つの組み合わせにします。そのほかの Young 率、 Poisson 比、板圧は同じままです。
 |3      2       5
 |●------+------+
 |        |      |
 |       1|      |1000mm
 |●------+------+
 |0  1m     1m  4↓2000kgf

  t=1`mm, E=21000`Kg/`mm^2, μ=0.3 #Poisson ration

● 剛性行列 Ke の計算

例題 1 のときのサブルーチンファイルはそのまま使えます。こんどは 12x12 のサイズの下のような剛性行列の計算になります。
//@@
    x0@=0, y0@=0
    x1@=1000, y1@=0
    x2@=1000, y2@=1000
    x3@=0   , y3@=1000
    
    t@=1
    
    E @= 21000
    μ @= 0.3
    D=[[3]]
    D[0,*]=<1,μ,      0> E/(1-μ^2)
    D[1,*]=<μ,1,      0> E/(1-μ^2)
    D[2,*]=<0,0,(1-μ)/2> E/(1-μ^2)
    
    α@=-0.57735, β@=-0.57735
    B = εuv @J4()^-1 @Form_uv()
    K00= !dggr(B) D B t !det(@J())
    
    α =+0.57735, β =-0.57735
    B = εuv @J4()^-1 @Form_uv()
    K10= !dggr(B) D B t !det(@J())
    
    α =+0.57735, β =+0.57735
    B = εuv @J4()^-1 @Form_uv()
    K11= !dggr(B) D B t !det(@J())
    
    α =-0.57735, β =+0.57735
    B = εuv @J4()^-1 @Form_uv()
    K01= !dggr(B) D B t !det(@J())
    
    Ktemp = K00 + K10 + K01 + K11
    
    Ke=[[12]]
    Ke[<0*12+0,8,1>]=Ktemp[0,*]
    Ke[<1*12+0,8,1>]=Ktemp[1,*]
    Ke[<2*12+0,8,1>]=Ktemp[2,*]
    Ke[<3*12+0,8,1>]=Ktemp[3,*]
    Ke[<4*12+0,8,1>]=Ktemp[4,*]
    Ke[<5*12+0,8,1>]=Ktemp[5,*]
    Ke[<6*12+0,8,1>]=Ktemp[6,*]
    Ke[<7*12+0,8,1>]=Ktemp[7,*]
    
    #add 1, 2 node
    Ke[<2*12+2,2,1>]=Ke[<2*12+2,2,1>]+Ktemp[<0*8+0,2,1>], Ke[<2*12+4,2,1>]=Ke[<2*12+4,2,1>]+Ktemp[<0*8+6,2,1>]
    Ke[<2*12+8,4,1>]=Ke[<2*12+8,4,1>]+Ktemp[<0*8+2,4,1>], 

    Ke[<3*12+2,2,1>]=Ke[<3*12+2,2,1>]+Ktemp[<1*8+0,2,1>], Ke[<3*12+4,2,1>]=Ke[<3*12+4,2,1>]+Ktemp[<1*8+6,2,1>]
    Ke[<3*12+8,4,1>]=Ke[<3*12+8,4,1>]+Ktemp[<1*8+2,4,1>], 

    Ke[<4*12+2,2,1>]=Ke[<4*12+2,2,1>]+Ktemp[<6*8+0,2,1>], Ke[<4*12+4,2,1>]=Ke[<4*12+4,2,1>]+Ktemp[<6*8+6,2,1>]
    Ke[<4*12+8,4,1>]=Ke[<4*12+8,4,1>]+Ktemp[<6*8+2,4,1>], 

    Ke[<5*12+2,2,1>]=Ke[<5*12+2,2,1>]+Ktemp[<7*8+0,2,1>], Ke[<5*12+4,2,1>]=Ke[<5*12+4,2,1>]+Ktemp[<7*8+6,2,1>]
    Ke[<5*12+8,4,1>]=Ke[<5*12+8,4,1>]+Ktemp[<7*8+2,4,1>], 

    #add 4, 5 node
    Ke[<8*12+2,2,1>]=Ktemp[<2*8+0,2,1>], Ke[<8*12+4,2,1>]=Ktemp[<2*8+6,2,1>], Ke[<8*12+8,4,1>]=Ktemp[<2*8+2,4,1>]
    Ke[<9*12+2,2,1>]=Ktemp[<3*8+0,2,1>], Ke[<9*12+4,2,1>]=Ktemp[<3*8+6,2,1>], Ke[<9*12+8,4,1>]=Ktemp[<3*8+2,4,1>]
    Ke[<10*12+2,2,1>]=Ktemp[<4*8+0,2,1>], Ke[<10*12+4,2,1>]=Ktemp[<4*8+6,2,1>], Ke[<10*12+8,4,1>]=Ktemp[<4*8+2,4,1>]
    Ke[<11*12+2,2,1>]=Ktemp[<5*8+0,2,1>], Ke[<11*12+4,2,1>]=Ktemp[<5*8+6,2,1>], Ke[<11*12+8,4,1>]=Ktemp[<5*8+2,4,1>]
//@@@

計算された剛性行列は下の様になります

    sf "/zs 1e-11, Ke"
    <  10384.6,     3750, -6346.15, -288.462, -5192.31,    -3750,  1153.85,  288.462,        0,        0,        0,        0 >
    <     3750,  10384.6,  288.462,  1153.85,    -3750, -5192.31, -288.462, -6346.15,        0,        0,        0,        0 >
    < -6346.15,  288.462,  20769.2,        0,   2307.7,        0, -5192.31,     3750, -6346.15, -288.462, -5192.31,    -3750 >
    < -288.462,  1153.85,        0,  20769.2,        0, -12692.3,     3750, -5192.31,  288.462,  1153.85,    -3750, -5192.31 >
    < -5192.31,    -3750,   2307.7,        0,  20769.2,        0, -6346.15, -288.462, -5192.31,     3750, -6346.15,  288.462 >
    <    -3750, -5192.31,        0, -12692.3,        0,  20769.2,  288.462,  1153.85,     3750, -5192.31, -288.462,  1153.85 >
    <  1153.85, -288.462, -5192.31,     3750, -6346.15,  288.462,  10384.6,    -3750,        0,        0,        0,        0 >
    <  288.462, -6346.15,     3750, -5192.31, -288.462,  1153.85,    -3750,  10384.6,        0,        0,        0,        0 >
    <        0,        0, -6346.15,  288.462, -5192.31,     3750,        0,        0,  10384.6,    -3750,  1153.85, -288.462 >
    <        0,        0, -288.462,  1153.85,     3750, -5192.31,        0,        0,    -3750,  10384.6,  288.462, -6346.15 >
    <        0,        0, -5192.31,    -3750, -6346.15, -288.462,        0,        0,  1153.85,  288.462,  10384.6,     3750 >
    <        0,        0,    -3750, -5192.31,  288.462,  1153.85,        0,        0, -288.462, -6346.15,     3750,  10384.6 >

    Jacobi Ke
    < -8.95956e-012, -5.92362e-012, -4.07602e-013,        3531.1,       9796.23,       11277.1
           ,13295.4,       14906.8,         17815,       20453.6,       36439.3,       38639.1 >
頂点 0, 3 を固定した剛性行列 K を作ります
//@@
    K=Ke
    e=<1,0,0,0, 0,0,0,0, 0,0,0,0>
    K[0,*]=e
    K[*,0]=e
    K[1,*]=~shift(e,1*1)
    K[*,1]=~shift(e,1*1)
    K[3*2,*]=~shift(e,3*2)
    K[*,3*2]=~shift(e,3*2)
    K[3*2+1,*]=~shift(e,3*2+1)
    K[*,3*2+1]=~shift(e,3*2+1)
//@@@

    <        1,        0,        0,        0,        0,        0,        0,        0,        0,        0,        0,        0 >
    <        0,        1,        0,        0,        0,        0,        0,        0,        0,        0,        0,        0 >
    <        0,        0,  20769.2,        0,   2307.7,        0,        0,        0, -6346.15, -288.462, -5192.31,    -3750 >
    <        0,        0,        0,  20769.2,        0, -12692.3,        0,        0,  288.462,  1153.85,    -3750, -5192.31 >
    <        0,        0,   2307.7,        0,  20769.2,        0,        0,        0, -5192.31,     3750, -6346.15,  288.462 >
    <        0,        0,        0, -12692.3,        0,  20769.2,        0,        0,     3750, -5192.31, -288.462,  1153.85 >
    <        0,        0,        0,        0,        0,        0,        1,        0,        0,        0,        0,        0 >
    <        0,        0,        0,        0,        0,        0,        0,        1,        0,        0,        0,        0 >
    <        0,        0, -6346.15,  288.462, -5192.31,     3750,        0,        0,  10384.6,    -3750,  1153.85, -288.462 >
    <        0,        0, -288.462,  1153.85,     3750, -5192.31,        0,        0,    -3750,  10384.6,  288.462, -6346.15 >
    <        0,        0, -5192.31,    -3750, -6346.15, -288.462,        0,        0,  1153.85,  288.462,  10384.6,     3750 >
    <        0,        0,    -3750, -5192.31,  288.462,  1153.85,        0,        0, -288.462, -6346.15,     3750,  10384.6 >

4 の位置に 2000kgf の力を下向きに加えたときの変移:displacement と、力:force を計算します。
    displacement = K^-1<0,0,0,0,0,0,0,0, -2000,0, 0,0>
    <         0,         0, -0.284314, -0.209441,  0.100872, -0.175745
    ,         0,         0, -0.572654,  -0.78379,  0.197718, -0.756952 >

    /zs 1e-10, force = Ke displacement
    <     2000,  210.575,        0,        0,        0,        0
    ,        0, -210.575,    -2000,        0,        0,        0 >
Node 1, 2 の位置に加わる力は打ち消しあって 0 になっています。物理の理論どおりです。この計算も正しいと思われます。



●● 例題 3 ●●

例題 2 のメッシュをさらに細かく分割して 6 x 20 分割したものを考えます。物理緒言も変更して、Examples of 2-Dimensional Elastic Analysis にあるものにあわせます。(この Web page にある有限要素法の説明も役立ちます。説明のレベルは高いのですが、挑戦することを勧めます)。下にメッシュ分割の具体時な形を示します。
                                                                2 N /cm^2 の圧力
       ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓    ↓     ↓     
 |6     13     20     27     34     41     48     55     62     69     76     83     90     97    104    111    118    125    132    139    146 
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+3cm
 |  M:5   | M:11 | M:17 | M:23 | M:29 | M:35 | M:41 | M:47 | M:53 | M:59 | M:65 | M:71 | M:77 | M:83 | M:89 | M:95 | M:101| M:107| M:113| M:119|
 |5     12|    19|    26|    33|    40|    47|    54|    61|    68|    75|    82|    89|    96|   103|   110|   117|   124|   131|   138|   145|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+2.5cm
 |  M:4   | M:10 | M:16 | M:22 | M:28 | M:34 | M:40 | M:46 | M:52 | M:58 | M:64 | M:70 | M:76 | M:82 | M:88 | M:94 | M:100| M:106| M:112| M:118|
 |4     11|    18|    25|    32|    39|    46|    53|    60|    67|    74|    81|    88|    95|   102|   109|   116|   123|   130|   137|   144|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+2cm
 |  M:3   | M:9  | M:15 | M:21 | M:27 | M:33 | M:39 | M:45 | M:51 | M:57 | M:63 | M:69 | M:75 | M:81 | M:87 | M:93 | M:99 | M:105| M:111| M:117|
 |3     10|    17|    24|    31|    38|    45|    52|    59|    66|    73|    80|    87|    94|   101|   108|   115|   122|   129|   136|   143|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+1.5cm
 |  M:2   | M:8  | M:14 | M:20 | M:26 | M:31 | M:38 | M:44 | M:50 | M:55 | M:62 | M:68 | M:74 | M:80 | M:86 | M:92 | M:98 | M:104| M:110| M:116|
 |2      9|    16|    23|    30|    37|    44|    51|    58|    65|    72|    79|    86|    93|   100|   107|   114|   121|   128|   135|   142|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+1cm
 |  M:1   | M:7  | M:13 | M:19 | M:25 | M:31 | M:37 | M:43 | M:49e| M:55 | M:61 | M:67 | M:73 | M:79 | M:85 | M:91 | M:97 | M:103| M:109| M:115|
 |1      8|    15|    22|    29|    36|    43|    50|    57|    64|    71|    78|    85|    92|    99|   106|   113|   120|   127|   134|   141|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+0.5cm
 |  M:0   | M:6  | M:12 | M:18 | M:24 | M:30 | M:36 | M:42 | M:48 | M:54 | M:60 | M:66 | M:72 | M:78 | M:84 | M:90 | M:96 | M:102| M:108| M:114|
 |0      7|    14|    21|    28|    35|    42|    49|    56|    63|    70|    77|    84|    91|    98|   105|   112|   119|   126|   133|   140|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
 |  0cm   0.5cm  1cm    1.5cm  2cm    2.5cm  3cm    3.5cm  4cm    4.5cm  5cm    5.5cm  6cm    6.5cm  7cm    7.5cm  8cm    8.5cm  9cm    9.5cm  100cm

 t=1cm, E=300000 N/cm^2, Poisson ratio=0.2

● 剛性行列 Ke{120} の計算

全てが同じ大きさの四角形に分割したのですから、要素ごとの剛性行列は同じです。それを一つだけ求めて全体の剛性行例 Ke{120} に位置をずらしながら足し合わせていく方法もありえます。でも、四角形分割ほ任意に選択できる、より汎用的なメッシュ分割にも使えるやりかたを選択します。下のような Node、Mesh 行列データを作ります。それを使って全体の剛性行列を計算します。

下に Node 行列、 Mesh 行列の具体的な値を示します。

//@@
Node{0} =<0, 0>,Node{1} =<0, 0.5>,Node{2} =<0, 1.0>,Node{3} =<0, 1.5>,Node{4} =<0, 2.0>,Node{5} =<0, 2.5>,Node{6} =<0, 3.0>
Node{7} =<0.5, 0>,Node{8} =<0.5, 0.5>,Node{9} =<0.5, 1.0>,Node{10}=<0.5, 1.5>,Node{11}=<0.5, 2.0>,Node{12}=<0.5, 2.5>,Node{13}=<0.5, 3.0>
Node{14}=<1.0, 0>,Node{15}=<1.0, 0.5>,Node{16}=<1.0, 1.0>,Node{17}=<1.0, 1.5>,Node{18}=<1.0, 2.0>,Node{19}=<1.0, 2.5>,Node{20}=<1.0, 3.0>
Node{21}=<1.5, 0>,Node{22}=<1.5, 0.5>,Node{23}=<1.5, 1.0>,Node{24}=<1.5, 1.5>,Node{25}=<1.5, 2.0>,Node{26}=<1.5, 2.5>,Node{27}=<1.5, 3.0>
Node{28}=<2.0, 0>,Node{29}=<2.0, 0.5>,Node{30}=<2.0, 1.0>,Node{31}=<2.0, 1.5>,Node{32}=<2.0, 2.0>,Node{33}=<2.0, 2.5>,Node{34}=<2.0, 3.0>
Node{35}=<2.5, 0>,Node{36}=<2.5, 0.5>,Node{37}=<2.5, 1.0>,Node{38}=<2.5, 1.5>,Node{39}=<2.5, 2.0>,Node{40}=<2.5, 2.5>,Node{41}=<2.5, 3.0>
Node{42}=<3.0, 0>,Node{43}=<3.0, 0.5>,Node{44}=<3.0, 1.0>,Node{45}=<3.0, 1.5>,Node{46}=<3.0, 2.0>,Node{47}=<3.0, 2.5>,Node{48}=<3.0, 3.0>
Node{49}=<3.5, 0>,Node{50}=<3.5, 0.5>,Node{51}=<3.5, 1.0>,Node{52}=<3.5, 1.5>,Node{53}=<3.5, 2.0>,Node{54}=<3.5, 2.5>,Node{55}=<3.5, 3.0>
Node{56}=<4.0, 0>,Node{57}=<4.0, 0.5>,Node{58}=<4.0, 1.0>,Node{59}=<4.0, 1.5>,Node{60}=<4.0, 2.0>,Node{61}=<4.0, 2.5>,Node{62}=<4.0, 3.0>
Node{63}=<4.5, 0>,Node{64}=<4.5, 0.5>,Node{65}=<4.5, 1.0>,Node{66}=<4.5, 1.5>,Node{67}=<4.5, 2.0>,Node{68}=<4.5, 2.5>,Node{69}=<4.5, 3.0>
Node{70}=<5.0, 0>,Node{71}=<5.0, 0.5>,Node{72}=<5.0, 1.0>,Node{73}=<5.0, 1.5>,Node{74}=<5.0, 2.0>,Node{75}=<5.0, 2.5>,Node{76}=<5.0, 3.0>
Node{77}=<5.5, 0>,Node{78}=<5.5, 0.5>,Node{79}=<5.5, 1.0>,Node{80}=<5.5, 1.5>,Node{81}=<5.5, 2.0>,Node{82}=<5.5, 2.5>,Node{83}=<5.5, 3.0>
Node{84}=<6.0, 0>,Node{85}=<6.0, 0.5>,Node{86}=<6.0, 1.0>,Node{87}=<6.0, 1.5>,Node{88}=<6.0, 2.0>,Node{89}=<6.0, 2.5>,Node{90}=<6.0, 3.0>
Node{91}=<6.5, 0>,Node{92}=<6.5, 0.5>,Node{93}=<6.5, 1.0>,Node{94}=<6.5, 1.5>,Node{95}=<6.5, 2.0>,Node{96}=<6.5, 2.5>,Node{97}=<6.5, 3.0>
Node{98} =<7.0, 0>,Node{99} =<7.0, 0.5>,Node{100}=<7.0, 1.0>,Node{101}=<7.0, 1.5>,Node{102}=<7.0, 2.0>,Node{103}=<7.0, 2.5>,Node{104}=<7.0, 3.0>
Node{105}=<7.5, 0>,Node{106}=<7.5, 0.5>,Node{107}=<7.5, 1.0>,Node{108}=<7.5, 1.5>,Node{109}=<7.5, 2.0>,Node{110}=<7.5, 2.5>,Node{111}=<7.5, 3.0>
Node{112}=<8.0, 0>,Node{113}=<8.0, 0.5>,Node{114}=<8.0, 1.0>,Node{115}=<8.0, 1.5>,Node{116}=<8.0, 2.0>,Node{117}=<8.0, 2.5>,Node{118}=<8.0, 3.0>
Node{119}=<8.5, 0>,Node{120}=<8.5, 0.5>,Node{121}=<8.5, 1.0>,Node{122}=<8.5, 1.5>,Node{123}=<8.5, 2.0>,Node{124}=<8.5, 2.5>,Node{125}=<8.5, 3.0>
Node{126}=<9.0, 0>,Node{127}=<9.0, 0.5>,Node{128}=<9.0, 1.0>,Node{129}=<9.0, 1.5>,Node{130}=<9.0, 2.0>,Node{131}=<9.0, 2.5>,Node{132}=<9.0, 3.0>
Node{133}=<9.5, 0>,Node{134}=<9.5, 0.5>,Node{135}=<9.5, 1.0>,Node{136}=<9.5, 1.5>,Node{137}=<9.5, 2.0>,Node{138}=<9.5, 2.5>,Node{139}=<9.5, 3.0>
Node{140}=<10,  0>,Node{141}=<10,  0.5>,Node{142}=<10,  1.0>,Node{143}=<10,  1.5>,Node{144}=<10,  2.0>,Node{145}=<10,  2.5>,Node{146}=<10,  3.0>


MeshTemp = [[120,4]]
MeshTemp[0,*]=<0,7,8,1>,MeshTemp[1,*]=<1,8,9,2>,MeshTemp[2,*]=<2,9,10,3>,MeshTemp[3,*]=<3,10,11,4>,MeshTemp[4,*]=<4,11,12,5>,MeshTemp[5,*]=<5,12,13,6>
MeshTemp[6,*]=<7,14,15,8>,MeshTemp[7,*]=<8,15,16,9>,MeshTemp[8,*]=<9,16,17,10>,MeshTemp[9,*]=<10,17,18,11>,MeshTemp[10,*]=<11,18,19,12>,MeshTemp[11,*]=<12,19,20,13>
MeshTemp[12,*]=<14,21,22,15>,MeshTemp[13,*]=<15,22,23,16>,MeshTemp[14,*]=<16,23,24,17>,MeshTemp[15,*]=<17,24,25,18>,MeshTemp[16,*]=<18,25,26,19>,MeshTemp[17,*]=<19,26,27,20>
MeshTemp[18,*]=<21,28,29,22>,MeshTemp[19,*]=<22,29,30,23>,MeshTemp[20,*]=<23,30,31,24>,MeshTemp[21,*]=<24,31,32,25>,MeshTemp[22,*]=<25,32,33,26>,MeshTemp[23,*]=<26,33,34,27>
MeshTemp[24,*]=<28,35,36,29>,MeshTemp[25,*]=<29,36,37,30>,MeshTemp[26,*]=<30,37,38,31>,MeshTemp[27,*]=<31,38,39,32>,MeshTemp[28,*]=<32,39,40,33>,MeshTemp[29,*]=<33,40,41,34>
MeshTemp[30,*]=<35,42,43,36>,MeshTemp[31,*]=<36,43,44,37>,MeshTemp[32,*]=<37,44,45,38>,MeshTemp[33,*]=<38,45,46,39>,MeshTemp[34,*]=<39,46,47,40>,MeshTemp[35,*]=<40,47,48,41>
MeshTemp[36,*]=<42,49,50,43>,MeshTemp[37,*]=<43,50,51,44>,MeshTemp[38,*]=<44,51,52,45>,MeshTemp[39,*]=<45,52,53,46>,MeshTemp[40,*]=<46,53,54,47>,MeshTemp[41,*]=<47,54,55,48>
MeshTemp[42,*]=<49,56,57,50>,MeshTemp[43,*]=<50,57,58,51>,MeshTemp[44,*]=<51,58,59,52>,MeshTemp[45,*]=<52,59,60,53>,MeshTemp[46,*]=<53,60,61,54>,MeshTemp[47,*]=<54,61,62,55>
MeshTemp[48,*]=<56,63,64,57>,MeshTemp[49,*]=<57,64,65,58>,MeshTemp[50,*]=<58,65,66,59>,MeshTemp[51,*]=<59,66,67,60>,MeshTemp[52,*]=<60,67,68,61>,MeshTemp[53,*]=<61,68,69,62>
MeshTemp[54,*]=<63,70,71,64>,MeshTemp[55,*]=<64,71,72,65>,MeshTemp[56,*]=<65,72,73,66>,MeshTemp[57,*]=<66,73,74,67>,MeshTemp[58,*]=<67,74,75,68>,MeshTemp[59,*]=<68,75,76,69>
MeshTemp[60,*]=<70,77,78,71>,MeshTemp[61,*]=<71,78,79,72>,MeshTemp[62,*]=<72,79,80,73>,MeshTemp[63,*]=<73,80,81,74>,MeshTemp[64,*]=<74,81,82,75>,MeshTemp[65,*]=<75,82,83,76>
MeshTemp[66,*]=<77,84,85,78>,MeshTemp[67,*]=<78,85,86,79>,MeshTemp[68,*]=<79,86,87,80>,MeshTemp[69,*]=<80,87,88,81>,MeshTemp[70,*]=<81,88,89,82>,MeshTemp[71,*]=<82,89,90,83>
MeshTemp[72,*]=<84,91,92,85>,MeshTemp[73,*]=<85,92,93,86>,MeshTemp[74,*]=<86,93,94,87>,MeshTemp[75,*]=<87,94,95,88>,MeshTemp[76,*]=<88,95,96,89>,MeshTemp[77,*]=<89,96,97,90>
MeshTemp[78,*]=< 91,98, 99,  92>,MeshTemp[79,*]=< 92,99, 100, 93>,MeshTemp[80,*]=< 93,100,101, 94>,MeshTemp[81,*]=< 94,101,102, 95>,MeshTemp[82,*]=< 95,102,103, 96>,MeshTemp[83,*]=< 96,103,104, 97>
MeshTemp[84,*]=< 98,105,106, 99>,MeshTemp[85,*]=< 99,106,107,100>,MeshTemp[86,*]=<100,107,108,101>,MeshTemp[87,*]=<101,108,109,102>,MeshTemp[88,*]=<102,109,110,103>,MeshTemp[89,*]=<103,110,111,104>
MeshTemp[90,*]=<105,112,113,106>,MeshTemp[91,*]=<106,113,114,107>,MeshTemp[92,*]=<107,114,115,108>,MeshTemp[93,*]=<108,115,116,109>,MeshTemp[94,*]=<109,116,117,110>,MeshTemp[95,*]=<110,117,118,111>
MeshTemp[ 96,*]=<112,119,120,113>,MeshTemp[ 97,*]=<113,120,121,114>,MeshTemp[ 98,*]=<114,121,122,115>,MeshTemp[ 99,*]=<115,122,123,116>,MeshTemp[100,*]=<116,123,124,117>,MeshTemp[101,*]=<117,124,125,118>
MeshTemp[102,*]=<119,126,127,120>,MeshTemp[103,*]=<120,127,128,121>,MeshTemp[104,*]=<121,128,129,122>,MeshTemp[105,*]=<122,129,130,123>,MeshTemp[106,*]=<123,130,131,124>,MeshTemp[107,*]=<124,131,132,125>
MeshTemp[108,*]=<126,133,134,127>,MeshTemp[109,*]=<127,134,135,128>,MeshTemp[110,*]=<128,135,136,129>,MeshTemp[111,*]=<129,136,137,130>,MeshTemp[112,*]=<130,137,138,131>,MeshTemp[113,*]=<131,138,139,132>
MeshTemp[114,*]=<133,140,141,134>,MeshTemp[115,*]=<134,141,142,135>,MeshTemp[116,*]=<135,142,143,136>,MeshTemp[117,*]=<136,143,144,137>,MeshTemp[118,*]=<137,144,145,138>,MeshTemp[119,*]=<138,145,146,139>
Mesh = MeshTemp
//@@@

Mesh/Node での計算がしやすいように、 sf サブルーチン・ファイルも下のように修正します。

//@@
@@subFile   makeK       #(α,β) 引数
    α@= _prm{1}
    β@= _prm{2}

    J=[[2]]
    J[0,*] = <(-(1-β)Node{p}[0] + (1-β)Node{q}[0] + (1+β)Node{r}[0] - (1+β)Node{s}[0])/4
              (-(1-β)Node{p}[1] + (1-β)Node{q}[1] + (1+β)Node{r}[1] - (1+β)Node{s}[1])/4>
    J[1,*] = <(-(1-α)Node{p}[0] - (1+α)Node{q}[0] + (1+α)Node{r}[0] + (1-α)Node{s}[0])/4
              (-(1-α)Node{p}[1] - (1+α)Node{q}[1] + (1+α)Node{r}[1] + (1-α)Node{s}[1])/4>
    J4 = [[4]]
    J4[<0+0*4,2,1>]=J[0,*]
    J4[<0+1*4,2,1>]=J[1,*]
    J4[<2+2*4,2,1>]=J[0,*]
    J4[<2+3*4,2,1>]=J[1,*]

    Form_uv @=[[4,8]]
    Form_uv[0,*]=< -(1-β)/4,  0, (1-β)/4,  0, (1+β)/4,  0, -(1+β)/4,   0 >
    Form_uv[1,*]=<  0,   -(1-β)/4,  0, (1-β)/4,  0, (1+β)/4,  0, -(1+β)/4>
    Form_uv[2,*]=< -(1-α)/4,  0,-(1+α)/4,  0, (1+α)/4,  0,  (1-α)/4,   0 >
    Form_uv[3,*]=<  0,   -(1-α)/4,  0,-(1+α)/4,  0, (1+α)/4,  0,  (1-α)/4>

    B @= εuv J4^-1 Form_uv
    _rt = !dggr(B) D B t !det(J)
@@endSubFile

@@subFile SetKatKe
    _rt=0
    Ke[< 2 p N + 2 p, 2, 1>]    = Ke[< 2 p N + 2 p, 2, 1>]   +K[<0*8+0*2,2,1>]
    Ke[< 2 p N + 2 q, 2, 1>]    = Ke[< 2 p N + 2 q, 2, 1>]   +K[<0*8+1*2,2,1>]
    Ke[< 2 p N + 2 r, 2, 1>]    = Ke[< 2 p N + 2 r, 2, 1>]   +K[<0*8+2*2,2,1>]
    Ke[< 2 p N + 2 s, 2, 1>]    = Ke[< 2 p N + 2 s, 2, 1>]   +K[<0*8+3*2,2,1>]
    Ke[<(2 p+1) N + 2 p, 2, 1>] = Ke[<(2 p+1) N + 2 p, 2, 1>]+K[<1*8+0*2,2,1>]
    Ke[<(2 p+1) N + 2 q, 2, 1>] = Ke[<(2 p+1) N + 2 q, 2, 1>]+K[<1*8+1*2,2,1>]
    Ke[<(2 p+1) N + 2 r, 2, 1>] = Ke[<(2 p+1) N + 2 r, 2, 1>]+K[<1*8+2*2,2,1>]
    Ke[<(2 p+1) N + 2 s, 2, 1>] = Ke[<(2 p+1) N + 2 s, 2, 1>]+K[<1*8+3*2,2,1>]

    Ke[< 2 q N + 2 p, 2, 1>]    = Ke[< 2 q N + 2 p, 2, 1>]   +K[<2*8+0*2,2,1>]
    Ke[< 2 q N + 2 q, 2, 1>]    = Ke[< 2 q N + 2 q, 2, 1>]   +K[<2*8+1*2,2,1>]
    Ke[< 2 q N + 2 r, 2, 1>]    = Ke[< 2 q N + 2 r, 2, 1>]   +K[<2*8+2*2,2,1>]
    Ke[< 2 q N + 2 s, 2, 1>]    = Ke[< 2 q N + 2 s, 2, 1>]   +K[<2*8+3*2,2,1>]
    Ke[<(2 q+1) N + 2 p, 2, 1>] = Ke[<(2 q+1) N + 2 p, 2, 1>]+K[<3*8+0*2,2,1>]
    Ke[<(2 q+1) N + 2 q, 2, 1>] = Ke[<(2 q+1) N + 2 q, 2, 1>]+K[<3*8+1*2,2,1>]
    Ke[<(2 q+1) N + 2 r, 2, 1>] = Ke[<(2 q+1) N + 2 r, 2, 1>]+K[<3*8+2*2,2,1>]
    Ke[<(2 q+1) N + 2 s, 2, 1>] = Ke[<(2 q+1) N + 2 s, 2, 1>]+K[<3*8+3*2,2,1>]

    Ke[< 2 r N + 2 p, 2, 1>]    = Ke[< 2 r N + 2 p, 2, 1>]   +K[<4*8+0*2,2,1>]
    Ke[< 2 r N + 2 q, 2, 1>]    = Ke[< 2 r N + 2 q, 2, 1>]   +K[<4*8+1*2,2,1>]
    Ke[< 2 r N + 2 r, 2, 1>]    = Ke[< 2 r N + 2 r, 2, 1>]   +K[<4*8+2*2,2,1>]
    Ke[< 2 r N + 2 s, 2, 1>]    = Ke[< 2 r N + 2 s, 2, 1>]   +K[<4*8+3*2,2,1>]
    Ke[<(2 r+1) N + 2 p, 2, 1>] = Ke[<(2 r+1) N + 2 p, 2, 1>]+K[<5*8+0*2,2,1>]
    Ke[<(2 r+1) N + 2 q, 2, 1>] = Ke[<(2 r+1) N + 2 q, 2, 1>]+K[<5*8+1*2,2,1>]
    Ke[<(2 r+1) N + 2 r, 2, 1>] = Ke[<(2 r+1) N + 2 r, 2, 1>]+K[<5*8+2*2,2,1>]
    Ke[<(2 r+1) N + 2 s, 2, 1>] = Ke[<(2 r+1) N + 2 s, 2, 1>]+K[<5*8+3*2,2,1>]

    Ke[< 2 s N + 2 p, 2, 1>]    = Ke[< 2 s N + 2 p, 2, 1>]   +K[<6*8+0*2,2,1>]
    Ke[< 2 s N + 2 q, 2, 1>]    = Ke[< 2 s N + 2 q, 2, 1>]   +K[<6*8+1*2,2,1>]
    Ke[< 2 s N + 2 r, 2, 1>]    = Ke[< 2 s N + 2 r, 2, 1>]   +K[<6*8+2*2,2,1>]
    Ke[< 2 s N + 2 s, 2, 1>]    = Ke[< 2 s N + 2 s, 2, 1>]   +K[<6*8+3*2,2,1>]
    Ke[<(2 s+1) N + 2 p, 2, 1>] = Ke[<(2 s+1) N + 2 p, 2, 1>]+K[<7*8+0*2,2,1>]
    Ke[<(2 s+1) N + 2 q, 2, 1>] = Ke[<(2 s+1) N + 2 q, 2, 1>]+K[<7*8+1*2,2,1>]
    Ke[<(2 s+1) N + 2 r, 2, 1>] = Ke[<(2 s+1) N + 2 r, 2, 1>]+K[<7*8+2*2,2,1>]
    Ke[<(2 s+1) N + 2 s, 2, 1>] = Ke[<(2 s+1) N + 2 s, 2, 1>]+K[<7*8+3*2,2,1>]
@@endSubFile
//@@@
後は、上の Mesh/Node データを読み出しながら、上のサブルーチン・ファイル働かせて、要素剛性行列を計算し、全体剛性行列に足し合わせていきます。私の Athron 1800+ では 12 分程度かかりました。しばらくお待ちください。
//@@
    /s
    
    p@ ,q@ ,r@ ,s@
    
    εuv @=[[ 3,4]]
    εuv[0,*]=<1,0,0,0>
    εuv[1,*]=<0,0,0,1>
    εuv[2,*]=<0,1,1,0>
    
    
    NN@=20
    N@ = 7*(NN+1)*2
    Ke @= [[N]]     # temporary 変数にしておかないと何時間もの計算時間になってしまう
    
    t@=1    # 板厚 1cm
    
    E @= 300000     # Young 率
    μ @= 0.2       # Poisson 比
    D=[[3]]
    D[0,*]=<1,μ,      0> E/(1-μ^2)
    D[1,*]=<μ,1,      0> E/(1-μ^2)
    D[2,*]=<0,0,(1-μ)/2> E/(1-μ^2)
    
    <<0,6*NN,1@j|\
        dbgJ = j    # save  debug Indeex in dbgJ.val file
        p=Mesh[j,0],q=Mesh[j,1],r=Mesh[j,2],s=Mesh[j,3]
        K = @makeK(-0.57735, -0.57735) + @makeK(+0.57735, -0.57735) + @makeK(-0.57735, +0.57735) + @makeK(+0.57735, +0.57735)
        @SetKatKe()
    >>
    Ke{6*NN} = Ke
//@@@

    Jacobi Ke{120}
    < -1.4038e-010, 1.20301e-011,  1.4575e-010,      1245.34,      5675.14,      5710.46,        13912,        21699
    ,      23074.3,        27040,      28314.7,      31835.4,      34191.2,      46370.5,      48161.6,      50826.7
    ,      54232.9,        54782,      55236.2,      58779.7,      59404.6,      62073.9,      70836.4,      72195.9
    ,      72275.1,      85858.2,        85896,      87674.5,      96731.1,      98600.6,       102067,       103128
    ,       107890,       117027,       117238,       128525,       128557,       128931,       135684,       139085
    ,       147742,       153620,       156034,       162441,       164804,       166188,       169208,       169672
    ,       170721,       174975,       179717,       182119,       182563,       189383,       190212,       190286
    ,       193898,       200579,       203184,       203715,       210195,       210475,       213327,       220909
    ,       225324,       225779,       228925,       229043,       231148,       238241,       239826,       240028
    ,       242032,       244290,       251607,       253625,       256777,       258509,       259751,       261657
    ,       263270,       263709,       265319,       267391,       267903,       268587,       270010,       271231
    ,       276332,       279569,       279588,       289434,       290418,       296392,       301527,       302769
    ,       306001,       307474,       310910,       315765,       317834,       320119,       322708,       324055
    ,       324172,       332259,       333282,       336986,       340818,       341136,       342675,       348340
    ,       350584,       354793,       355028,       357063,       361234,       363090,       363952,       367771
    ,       367800,       370965,       373630,       378086,       379355,       380182,       384067,       385039
    ,       386772,       387757,       390999,       391979,       394910,       396682,       400988,       401107
    ,       403556,       405960,       406768,       409501,       412239,       414992,       415831,       416605
    ,       422446,       424559,       427681,       430184,       432094,       439577,       443316,       445113
    ,       448885,       457830,       465245,       465728,       468371,       470905,       474950,       475349
    ,       476931,       480064,       483155,       484053,       484549,       485845,       488465,       490144
    ,       494364,       495014,       496206,       497009,       498309,       500131,       503277,       505792
    ,       507656,       509388,       509885,       512097,       514061,       518678,       519472,       520631
    ,       520976,       526348,       530114,       534059,       536678,       537208,       541230,       541412
    ,       547696,       553198,       554275,       555170,       557623,       560782,       562644,       577525
    ,       582213,       584602,       594665,       603123,       607915,       614301,       629330,       635600
    ,       637288,       639234,       649256,       654690,       656911,       660119,       662563,       668712
    ,       672257,       673118,       686357,       686994,       697529,       701562,       702632,       706516
    ,       711061,       713399,       718906,       755391,       755607,       757384,       757475,       759408
    ,       760878,       762523,       763525,       764337,       764787,       765306,       768275,       778881
    ,       779669,       782313,       784800,       785163,       785875,       785903,       786751,       790459
    ,       820226,       822785,       829016,       829468,       841827,       846141,       855291,       860334
    ,       865589,       882145,       883007,       890569,       903967,       906572,       915546,       922734
    ,       926781,       936075,       939294,       941517,       948345,       950659,       960831,       979453
    ,       984673,       991824,       993740,       994608, 1.00562e+006,  1.0124e+006, 1.02671e+006, 1.03313e+006
    , 1.05711e+006, 1.06074e+006,  1.0712e+006, 1.08574e+006, 1.10101e+006, 1.10511e+006, 1.11112e+006, 1.13404e+006
    , 1.15452e+006, 1.15727e+006, 1.17427e+006, 1.18463e+006, 1.18627e+006, 1.20562e+006 >
全体の剛性行列の計算結果は表示するには多すぎるデータ量なので、表示しませんが、その固有値だけは上に示しておきます。ここでも三つの固有値が 0 になっており、計算結果は正しそうです。


● 片持ち梁状態での歪の計算

Node 0,1,2,3,4,5,6,7 のみが壁に固定されて、2N/cm^2 の圧力がかかっているときの歪を計算します。

Node 0,1,2,3,4,5,6,7 が固定されているときの剛性行列 K は下のように計算できます。

//@@
    /s # これを入れないと計算のするたびにコンソールに KTemp 行列値全部を表示するので、時間がかかる。
    KTemp@=Ke{120}  # Ke{120} が大きいので temporary 変数を介さないと処理に時間がかかる
    e1=<<(6+1)*(20+1)*2>>
    e1[0]=1

    #Node0,... Node 6 を固定して、対応する行列要素を 1 にします
    KTemp[0,*] =  e1
    KTemp[*,0] =  e1
    KTemp[1,*] =  ~shift(e1,1)
    KTemp[*,1] =  ~shift(e1,1)
    
    # Node 1
    KTemp[2,*] =  ~shift(e1,2)
    KTemp[*,2] =  ~shift(e1,2)
    KTemp[3,*] =  ~shift(e1,3)
    KTemp[*,3] =  ~shift(e1,3)
    
    # Node 2
    KTemp[4,*] =  ~shift(e1,4)
    KTemp[*,4] =  ~shift(e1,4)
    KTemp[5,*] =  ~shift(e1,5)
    KTemp[*,5] =  ~shift(e1,5)
    
    # Node 3
    KTemp[6,*] =  ~shift(e1,6)
    KTemp[*,6] =  ~shift(e1,6)
    KTemp[7,*] =  ~shift(e1,7)
    KTemp[*,7] =  ~shift(e1,7)
    
    # Node 4
    KTemp[8,*] =  ~shift(e1,8)
    KTemp[*,8] =  ~shift(e1,8)
    KTemp[9,*] =  ~shift(e1,9)
    KTemp[*,9] =  ~shift(e1,9)
    
    # Node 5
    KTemp[10,*] =  ~shift(e1,10)
    KTemp[*,10] =  ~shift(e1,10)
    KTemp[11,*] =  ~shift(e1,11)
    KTemp[*,11] =  ~shift(e1,11)
    
    # Node 6
    KTemp[12,*] =  ~shift(e1,12)
    KTemp[*,12] =  ~shift(e1,12)
    KTemp[13,*] =  ~shift(e1,13)
    KTemp[*,13] =  ~shift(e1,13)
    
    K = KTemp
//@@@

梁の上面からかかる 2N/cm\2 の圧力:force は下のように記述できます。

//@@
    force=<<(6+1)*(20+1)*2>>
    #force[<  6*2,2,1>]=<0,-1> # Note 6 は y 方向にも固定されており、外力は固定によりキャンセルされます
    force[< 13*2,2,1>]=<0,-2>
    force[< 20*2,2,1>]=<0,-2>
    force[< 27*2,2,1>]=<0,-2>
    force[< 34*2,2,1>]=<0,-2>
    force[< 41*2,2,1>]=<0,-2>
    force[< 48*2,2,1>]=<0,-2>
    force[< 55*2,2,1>]=<0,-2>
    force[< 62*2,2,1>]=<0,-2>
    force[< 69*2,2,1>]=<0,-2>
    force[< 76*2,2,1>]=<0,-2>
    force[< 83*2,2,1>]=<0,-2>
    force[< 90*2,2,1>]=<0,-2>
    force[< 97*2,2,1>]=<0,-2>
    force[<104*2,2,1>]=<0,-2>
    force[<111*2,2,1>]=<0,-2>
    force[<118*2,2,1>]=<0,-2>
    force[<125*2,2,1>]=<0,-2>
    force[<132*2,2,1>]=<0,-2>
    force[<139*2,2,1>]=<0,-2>
    force[<146*2,2,1>]=<0,-1>
//@@@
圧力:force による変移:displacement は下のようになります。
    displacement = K^-1 force

Node に displacement を足してやれば圧力による歪の具合がわかります。ただし、目視で解かりやすくするため、30 倍に拡大してやります。同時に gdspl.bat を使って gnuplot 表示させるために、displacement 実数ベクタを cplxDsplc 複素数ベクタ表示に変更します。

    #変移距離を 30 倍に拡大して表示させる
    M@=30, displayData = <<0,!size(displacement)/2,1@j|  >>
    #cplxDsplc データをgnuplot 向け表示データにする
    gdsp displayData
    # gnuplot.ini の行頭を plot "-" using 2:3 with line ==>    plot "-" using 2:3
    start wgnuplot
//@@

エディタを使って gnuplot.ini ファイルの 1 行目「plot "-" using 2:3 with line」 を「 plot "-" using 2:3」に変更し、"start \ap\gnuplot\wgnupl32.exe" を実行すれば、歪の様子を表示できます。




● ローラー指示を追加したたときの歪

右端にローラー指示を追加したたときの歪の計算してみます。
                                                                2 N /cm^2 の圧力
       ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓    ↓     ↓     
 |6     13     20     27     34     41     48     55     62     69     76     83     90     97    104    111    118    125    132    139    146 
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+3cm
 |  M:5   | M:11 | M:17 | M:23 | M:29 | M:35 | M:41 | M:47 | M:53 | M:59 | M:65 | M:71 | M:77 | M:83 | M:89 | M:95 | M:101| M:107| M:113| M:119|
 |5     12|    19|    26|    33|    40|    47|    54|    61|    68|    75|    82|    89|    96|   103|   110|   117|   124|   131|   138|   145|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+2.5cm
 |  M:4   | M:10 | M:16 | M:22 | M:28 | M:34 | M:40 | M:46 | M:52 | M:58 | M:64 | M:70 | M:76 | M:82 | M:88 | M:94 | M:100| M:106| M:112| M:118|
 |4     11|    18|    25|    32|    39|    46|    53|    60|    67|    74|    81|    88|    95|   102|   109|   116|   123|   130|   137|   144|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+2cm
 |  M:3   | M:9  | M:15 | M:21 | M:27 | M:33 | M:39 | M:45 | M:51 | M:57 | M:63 | M:69 | M:75 | M:81 | M:87 | M:93 | M:99 | M:105| M:111| M:117|
 |3     10|    17|    24|    31|    38|    45|    52|    59|    66|    73|    80|    87|    94|   101|   108|   115|   122|   129|   136|   143|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+1.5cm
 |  M:2   | M:8  | M:14 | M:20 | M:26 | M:31 | M:38 | M:44 | M:50 | M:55 | M:62 | M:68 | M:74 | M:80 | M:86 | M:92 | M:98 | M:104| M:110| M:116|
 |2      9|    16|    23|    30|    37|    44|    51|    58|    65|    72|    79|    86|    93|   100|   107|   114|   121|   128|   135|   142|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+1cm
 |  M:1   | M:7  | M:13 | M:19 | M:25 | M:31 | M:37 | M:43 | M:49e| M:55 | M:61 | M:67 | M:73 | M:79 | M:85 | M:91 | M:97 | M:103| M:109| M:115|
 |1      8|    15|    22|    29|    36|    43|    50|    57|    64|    71|    78|    85|    92|    99|   106|   113|   120|   127|   134|   141|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+0.5cm
 |  M:0   | M:6  | M:12 | M:18 | M:24 | M:30 | M:36 | M:42 | M:48 | M:54 | M:60 | M:66 | M:72 | M:78 | M:84 | M:90 | M:96 | M:102| M:108| M:114|
 |0      7|    14|    21|    28|    35|    42|    49|    56|    63|    70|    77|    84|    91|    98|   105|   112|   119|   126|   133|   140|
 |■------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
 |  0cm   0.5cm  1cm    1.5cm  2cm    2.5cm  3cm    3.5cm  4cm    4.5cm  5cm    5.5cm  6cm    6.5cm  7cm    7.5cm  8cm    8.5cm  9cm    9.5cm   100cm
                                                                                                                                      ローラー指示を右下に追加        

 t=1cm, E=300000 N/cm^2, Poisson ratio=0.2

node 140 の x 軸を固定するだけであり、先に作った剛性行列 K で、対応する縦、横成分を下のように置き換えてやります。

//@@
    /s
    # Node 140
    K[140*2+1,*] =  ~shift(e1,140*2+1)
    K[*,140*2+1] =  ~shift(e1,140*2+1)
//@@@
加える圧力は先に作った force をそのまま使えます。gnuplot で表示するまでの手続きは前回と殆ど同じです。ただし、今回は歪かたが小さいので 300 倍に拡大して表示させます。
    displacement = K^-1 force
    #変移距離を 300 倍に拡大して表示させる
    M@=300, displayData = <<0,!size(displacement)/2,1@j|  >>
    #cplxDsplc データを gnuplot 向け表示データにする
    gdsp displayData
    # gnuplot.ini の行頭を plot "-" using 2:3 with line ==>    plot "-" using 2:3
    start wgnuplot.exe

この程度の計算でも十分に実用的な実務分野も多くあるはずです。是非とも自分でも計算してみてください。


ホーム ページに戻る