エクセルで2次元熱伝導方程式を解く

プログラム
Pocket

どうもYukiです。
エクセルで1次元熱伝導方程式を解くについて書いてきましたが、今回はエクセルを使って実際に2次元熱伝導方程式を解いていきたいと思います。

計算条件

まず、熱伝導方程式を解くために計算条件を設定します。
定常計算、発熱あり 、2次元の熱伝導方程式、境界条件は左側1000[K]、上側800[K] 、下側400[K]で縛り、右側はフリーにします。

熱伝導率k = 80.3 [W/m・K]、ΔX = 1 [m]、発熱は中央のみ(1000[W])初期温度は0[K]、計算点数は5×5点で中心差分法を使用します。

0 = k(∂²T/∂x² +∂²T/∂y² ) + q′v… 2次元の熱伝導方程式

計算手順

条件をプロットするとこのようになります。

1 2 3 4 5
1 800 800 800
2 1000 Free
3 1000 発熱 Free
4 1000 Free
5 400 400 400

プロットするとこのような表になると思います。

言葉で詳しく説明すると、境界条件(一番端っこの所)より1 , 5点目に1000 , 800 , 400を入力します。
右側はfree(吹き抜け)設定、中央は発熱するので発熱設定です。

片側差分法

Free条件にするために片側差分法というものを使います。
前回の記事に中心差分法について書きました。
この差分法は求めたい場所の前後を使って計算します。
片側差分法は求めたい場所の前後どちらかを使って求めます。
差分式は

dƒ/dx    = (ƒ(i) – ƒ(i-1)) / 2Δx

d²ƒ/dx² = (ƒ(i) – 2ƒ(i-1) + ƒ(i-2)) / Δx²

dƒ/dx    = (ƒ(i) – ƒ(i+1)) / 2Δx

d²ƒ/dx² = (ƒ(i) – 2ƒ(i+1) + ƒ(i+2)) / Δx²

です。

表でにすると

ここ ここ Free

ここの値を使ってFreeを求めます。

補足

二次元なのでFreeの部分も2次元(縦方向)にも差分を取らないといけないが、収束しなかったので1次元の片側差分法を使いました。

この問題なら外挿(四点目)の値をFreeの部分(5点目)にそのまま挿入する方法のあります。

計算手順2

次に2~4点目に中心差分をした2次元の熱伝導方程式を入れます。

1 2 3 4 5
1 800 800 800
2 1000 841 757 700 642
3 1000 806 690 600 509
4 1000 694 571 500 428
5 400 400 400

となるはずです。

もう少し詳しく説明すると差分を入れた、2次元の熱伝導方程式は

T(i,j) = 0.5(T(i-1,j) + T(i+1,j) +

T(i,j-1) + T(i,j+1))

になります。

 T(i,j+1)
T(i-1,j) T(i,j) T(i+1,j)
T(i,j-1)

表にするとこんな風に求めることが出来ます。

これで2次元熱伝導方程式が解けるはずです。

グラフの作り方

2次元熱伝導方程式のグラフの作り方、正直面倒くさいです。

等高線図を使えば何とか、それらしい物が出来ます。

こんな感じで作れます。
これを作るのに2,3時間位かかりました。

そこで、グラフではありませんが、条件式書式によってセルに色を塗り、温度分布を表現しようと思います。

まず、色を付けたいセルを選択し、ホーム条件式書式の中の新しいルールをクリックします。

すると下の図のような画面が出ると思います。

書式スタイルを三色スケールにし中間値の種類を数値にし、値を任意に入れます。(下図では450)

入れ終わったら、OKを押します。

すると下の図になります。

このようにして、グラフに近いものが出来ました。
数字が邪魔な場合はセルを小さくする等工夫すると消えます。

これが一番簡単に温度分布を表す方法だと思います。

まとめ

今回は一つの境界条件がFreeなので片側差分法と中心差分法を併用しました。

Freeが入っているので条件設定では、発散する場合があります(1回発散しました(笑))

気を付けましょう

Fortranのプログラムコードも載せておきます。

プログラムコード

PROGRAM MAIN
INCLUDE ‘implicit.for’
C———————————————— Global Variable —–
REAL*4 X_T(ISSS:IEEE,JSSS:JEEE)        !— Position X-component
REAL*4 Y_T(ISSS:IEEE,JSSS:JEEE)        !— Position Y-component
REAL*4 T(ISSS:IEEE,JSSS:JEEE)          !— Thermal
REAL*4 T0 (ISSS:IEEE,JSSS:JEEE) !— Temperature for Meomory
REAL*4 T1                       !— Upeer Temperature
REAL*4 T2                       !— Left Temperature
REAL*4 T3                     !— Bottom Temperature
C———————————————————————-

C
INTEGER I0, I1, J0, J1 ,N0 ,N1   !— Mesh Size
INTEGER S0, S1                   !— Mesh Size

C
REAL*4 RES_P                     !— Residual P
REAL*4 RES_PP                    !— Residual PP
REAL*4 RES_PPP                   !— Residual PPP
REAL*4 RES_T                     !— Residual T
REAL*4 RES_E                     !— Residual E
C
REAL*4 DELY_T                     !— deltaY T
C
INTEGER NMAX_P, NMAX_T, NMAX_Y  ,ALL ,NMAX_E

C————————————————- Local Variable —–
REAL*4  DX , DY
INTEGER I,J,S ,BB
INTEGER N
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
110 FORMAT(A)
WRITE(*,110) ‘**************************************************’
WRITE(*,110) ‘************                          ************’
WRITE(*,110) ‘************     Main Program         ************’
WRITE(*,110) ‘************      Start !!!     ************’
WRITE(*,110) ‘************                          ************’
WRITE(*,110) ‘**************************************************’
WRITE(*,110) ‘ ‘
C
111 FORMAT(A,E16.8E3,A)
116 FORMAT(A,I5,10X,I4)
C
WRITE(*,110) ‘———– Reading Parameter of Mesh ————‘
OPEN  (11,FILE=’./para_mesh.txt’,STATUS=’unknown’)
READ(11,*) I0
READ(11,*) I1
READ(11,*) J0
READ(11,*) J1
READ(11,*) S0
READ(11,*) S1
CLOSE (11)
WRITE(*,110) ‘———————————— has done. —‘
WRITE(*,110) ‘ ‘
WRITE(*,110) ‘>>> Grid Parameter — start ——- end ———-‘
WRITE(*,116) ‘    I-Direction :   ‘,I0,I1
WRITE(*,116) ‘    J-Direction :   ‘,J0,J1
WRITE(*,110) ‘                                                 ‘
c      GOTO 999

NMAX_T = 10000
C—————————–Position X,Y——————————-
DO J = J0, J1
DO I = I0, I1
X_T(I,J) = 5/ 5 * REAL(I)
Y_T(I,J) = 5/ 5 * REAL(J)
END DO
END DO

C—————————–initial——————————-
T1= 800
T2= 1000
T3= 400
DO I = I0+1, I1-1
DO J = J0+1, J1-1
T(I,J) = 500
END DO
END DO
C
DO J=J0,J1
DO I=I0,I1
T(I,J0) = T3
T(I0,J) = T2
T(I,J1)= T1
END DO
END DO
C

C—– Computation of Thermal Eq. ————————————
DO BB = 1 , NMAX_T
CALL MEM_T   (I0,I1,J0,J1,T,T0)
C
CAll CAL_T   (I0,I1,J0,J1,T,T0,X_T,Y_T)
C
write(*,*)’T(2,2)’,T(2,2)
CAll BOU_T   (I0,I1,J0,J1,T,T1,T2,T3)
C
CAll CAL_R_T (I0,I1,J0,J1,T,T0,RES_T)

CALL OUTPUT_T1 (I0,I1,J0,J1,X_T,Y_T,T)
C
END DO

WRITE(*,110) ‘**************************************************’
WRITE(*,110) ‘************                          ************’
WRITE(*,110) ‘************      Main Program        ************’
WRITE(*,110) ‘************       End !!!      ************’
WRITE(*,110) ‘************                          ************’
WRITE(*,110) ‘**************************************************’
WRITE(*,110) ‘ ‘
C
999 STOP
END PROGRAM
C *********************************************************************
SUBROUTINE MEM_T (I0,I1,J0,J1,T,T0)
INCLUDE ‘implicit.for’
C———————————————— Global Variable —–
REAL*4 T(ISSS:IEEE,JSSS:JEEE)          !— Thermal
REAL*4 T0 (ISSS:IEEE,JSSS:JEEE) !— Temperature for Meomory
INTEGER I0, I1, J0, J1           !— Mesh Size
C————————————————- Local Variable —–
INTEGER I,J
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DO J = J0, J1
DO I = I0, I1
T0(I,J) = T(I,J)
END DO
END DO
C
999 RETURN
END
C
C
C
C *********************************************************************
SUBROUTINE CAL_T (I0,I1,J0,J1,T,T0,X_T,Y_T)
INCLUDE ‘implicit.for’
C———————————————— Global Variable —–
REAL*4 T(ISSS:IEEE,JSSS:JEEE)          !— Thermal
REAL*4 T0 (ISSS:IEEE,JSSS:JEEE) !— Temperature for Meomory
REAL*4 X_T(ISSS:IEEE,JSSS:JEEE)  !— Position X-component
REAL*4 Y_T(ISSS:IEEE,JSSS:JEEE)  !— Position Y-component
INTEGER I0, I1, J0, J1           !— Mesh Size

C————————————————- Local Variable —–
INTEGER I,J,S
REAL*4 DX, DY
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C
DX = X_T(1,0) – X_T(0,0)
DY = Y_T(0,0) – Y_T(0,1)
C
DO J = J0+1, J1-1
DO I = I0+1, I1-1
T(I,J) = 0.5 / (DX**2+DY**2)
&         *(T0(I-1,J)+T0(I+1,J)+T0(I,J-1)+T0(I,J+1))
C
END DO
END DO
C
DO J = J0, J1
T(I1,J) = T0(I1-1,J)
END DO

999 RETURN
END
C
C
C
C *********************************************************************
SUBROUTINE BOU_T(I0,I1,J0,J1,T,T1,T2,T3)
INCLUDE ‘implicit.for’
C———————————————— Global Variable —–
REAL*4 T(ISSS:IEEE,JSSS:JEEE)          !— Thermal
REAL*4 T1                              !— Upeer Temperature
REAL*4 T2                              !— Left Temperature
REAL*4 T3                            !— Bottom Temperature
INTEGER I0, I1, J0, J1           !— Mesh Size
C————————————————- Local Variable —–
INTEGER I,J
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

C
DO J=J0,J1
DO I=I0,I1
T(I,J0) = T3
T(I0,J) = T2
T(I,J1)= T1
END DO
END DO
C
999 RETURN
END
C
C
C
C *********************************************************************
SUBROUTINE CAL_R_T (I0,I1,J0,J1,T,T0,RES_T)
INCLUDE ‘implicit.for’
C———————————————— Global Variable —–
REAL*4 T(ISSS:IEEE,JSSS:JEEE)          !— Thermal
REAL*4 T0 (ISSS:IEEE,JSSS:JEEE) !— Temperature for Meomory
INTEGER I0, I1, J0, J1           !— Mesh Size
REAL*4 RES_T                     !— Residual T
C————————————————- Local Variable —–
INTEGER I , J
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C
RES_T=-1.0E+10

DO J=J0+1,J1-1
DO I=I0+1,I1-1
RES_T = AMAX1( RES_T , ABS(T(I,J)-T0(I,J)) )
END DO
END DO
C
999 RETURN
END
C
CC**********************************************************************
SUBROUTINE OUTPUT_T1 (I0,I1,J0,J1,X_T,Y_T,T)
INCLUDE ‘implicit.for’
C———————————————— Global Variable —–
REAL*4 X_T(ISSS:IEEE,JSSS:JEEE)        !— Position X-component
REAL*4 Y_T(ISSS:IEEE,JSSS:JEEE)        !— Position Y-component
REAL*4 T(ISSS:IEEE,JSSS:JEEE)          !— Thermal
INTEGER I0, I1, J0, J1           !— Mesh Size
C————————————————- Local Variable —–
INTEGER I,J
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C
112 FORMAT(2(E16.8E3,1X))
113 FORMAT(3(E16.8E3,1X))
114 FORMAT(4(E16.8E3,1X))
C
OPEN (11,FILE=’./data/temp.dat’,STATUS=’unknown’)
DO J=J0,J1
DO I=I0,I1
WRITE(11,113) X_T(I,J), Y_T(I,J) , T(I,J)
END DO
END DO
CLOSE(11)
C
RETURN
END
C
C