3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FortranAdvent Calendar 2022

Day 19

【FORTRAN】運動方程式を解く

Last updated at Posted at 2022-12-19

IMG_2685.jpeg

試しに、FORTRANで一質点の時刻歴応答解析を行うコードを書いてみようと思います

運動方程式

古典力学分野で解析系の研究をしていた人にとっては、馴染みの深い式かと思います。

m \frac{d^2 x}{dt^2} + c \frac{dx}{dt} + kx = -m\frac{d^2 x_0}{dt^2}

という形が一般的でしょうか。
(mは質量、cは粘性減衰定数、kはバネ剛性、右辺は地動加速度による外力項)
これを、

  • 一質点モデル、バネは弾性
  • 入力地震波は阪神大震災の観測波(JMA Kobe NS)
  • ニューマークのβ法は平均加速度法(β=1/4)

で、解いてみようかと思います。
また、減衰力を合わせた応答スペクトルを用いて、解析の妥当性を確認します。

FORTRANでコードを書く

早速、コードを書いてみようと思います。
まずは文字の定義から。

program equationOfMotion
implicit none
!---文字の定義------
integer :: i, n, step
real(8) :: ydd_EqNS(20000), ydd_EqEW(20000), ydd_EqUD(20000) !地震波(gal)
real(8) :: y(20000), yd(20000), ydd(20000), time(20000) !変位(m)、速度(m/s)、加速度(m/s/s)、時間(s)
real(8) :: beta, dt, omega, T, h, m, k, c, pi, delta_p,epsilon, delta_y

implicit none忘れずに書きましょうね。

平均加速度法なのでβ=1/4、減衰は5%で剛性比例型減衰としました。
ちなみに、一次固有周期は1.0sになるよう、質量とバネ剛性を決めました。

beta = 0.25                       !β法(平均加速度法なので1/4)
h = 0.05                          !減衰定数(5%の減衰を与える)
c = 2.0 * h * k / omega           !粘性係数(剛性比例型)

解析部分は以下のように記述しています。次ステップの変位を仮定して一度運動方程式を解き、その後、誤差が一定の値以下になるまで、収斂計算をしていきます。収斂計算の誤差はε以下として、

 \epsilon = 1.0 \times 10.0^{-5.0}

と設定しました。

!---次ステップの値を求める----------
do n = 1, step, 1
    y(n+1)   = y(n)                                                                                          !変位を仮定
    ydd(n+1) = (y(n+1) - y(n)) / (beta * dt**2) - yd(n) / (beta * dt) - ydd(n) * (1.0 / (2.0 * beta) - 1.0)  !加速度を求める
    yd(n+1)  = yd(n) + 0.50 * (ydd(n) + ydd(n+1)) * dt                                                       !速度を求める

    !---収れん判定(収れんしていない場合にはループの計算を続ける)---
    do
        delta_p = (-1.0) * m * ydd_EqNS(n+1) * 0.01 - (m*ydd(n+1) + c*yd(n+1) + k*y(n+1)) !不釣合力を計算
        
        if (abs(delta_p).lt.epsilon) exit
            delta_y = delta_p / (k + m / (beta * dt**2) + c /(2.0*beta*dt))
            y(n+1) = y(n+1) + delta_y                                                                               !変位修正
            ydd(n+1) = (y(n+1) - y(n)) / (beta * dt**2) - yd(n) / (beta * dt) - ydd(n) * (1.0 / (2.0 * beta) - 1.0) !加速度を求める
            yd(n+1)  = yd(n) + 0.50 * (ydd(n) + ydd(n+1)) * dt                                                      !速度を求める
    end do

解析結果

今回作ったモデルでの解析結果を以下に記します。

FORTRANでの解析結果
equationOfMotion.png
青線が入力地震動、赤線が応答値です。

最大応答加速度(絶対値):14.967(m/s/s)
となっており、かなり揺られていることがわかります。

加速度応答スペクトル
Sa_NS_JMAKobeWave.png
今回は一次固有周期1.0sなので、グラフからは 約15(m/s/s) と読み取れます。
これより解析モデルの妥当性が確認できました。

久しぶりにFORTRANでコードを書いたので、割と手こずりましたが、解析できるまでコーディングできたので良かったです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?