前回はFortranで2次元の熱伝導方程式を解いて、gnuplotを使って温度場の分布のアニメーションを作成したのです。
前回の記事で示したアニメーションはこんな感じ
今回は、2次元の熱伝導方程式をFortranで解いて、温度場の分布のアニメーションはparaviewで可視化したいと思います。
2次元の熱伝導方程式をFortranで解いて温度場の分布のアニメーションをparaviewで可視化する。
↓paraviewで可視化した温度場分布のアニメーションはこちら。
※FortranのコードはFortran90/95の書き方にしているつもりですが正確に書けているかは不明です。
※FortranはWSLを使ってインストールしています。
※paraviewはこちらのサイトよりダウンロードしてお使いください。
解くべき方程式
まずは解くべき方程式を明らかにしておきましょう。
Fortranで2次元熱伝導方程式をFortranで解く
偏微分方程式の離散化の方法は様々あるかと思いますが、ここでは離散化の方法にはこだわっていません。
主目的は「vtkファイル」をFortranで出力してparaviewで読み込むことです。
2次元熱伝導方程式の離散化
- 時間微分の項(左辺)は陽解法
- 空間微分の項(右辺)は2次精度
で離散化で進めていきましょう。
\kappa dt\frac{T^{n}(x_{i},y_{j}+\Delta y)-2T^{n}(x_{i},y_{j})-T^{n}(x_{i},y_{j}-\Delta y)}{\Delta y^2}\end{align*}
Fortranで解く
離散化された方程式をFortranで解くためのプログラムを書いていきましょう。
このプログラムの中にvtkファイル形式で温度分布データを出力させる記述があります。
以下がプログラム全体です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
module constants implicit none integer::i,j,nt integer, parameter :: imax = 100,jmax=imax,ntmax = 25 real(8):: T(0:imax,0:jmax),xmax,ymax,x,y,dx,dy,dt,kp integer,parameter :: SP = kind(1.0) integer,parameter :: DP = selected_real_kind(2*precision(1.0_SP)) end module constants module print use constants implicit none contains subroutine print__profile(step,f) real(DP), dimension(0:imax,0:jmax), intent(in) :: f integer,intent(in) :: step character(len=40) filename write(filename,"(a,i5.5,a)") "data/temp",int(step),".vtk" open(10,file=filename) write(10,"('# vtk DataFile Version 3.0')") write(10,"('test')") write(10,"('ASCII ')") write(10,"('DATASET STRUCTURED_GRID')") write(10,"('DIMENSIONS ',3(1x,i3))") imax+1, jmax+1, 1 write(10,"('POINTS ',i9,' float')") (imax+1)*(jmax+1)*1 do j=0,jmax do i=0,imax write(10,"(3(f9.4,1x))") i*dx, j*dy, 0.d0 end do end do write(10,"('POINT_DATA ',i9)") (imax+1)*(jmax+1)*1 !date input write(10,"('SCALARS temp float')") write(10,"('LOOKUP_TABLE default')") do j=0,jmax do i=0,imax write(10,*) T(i,j) end do end do close(10) end subroutine print__profile end module print program thermal_explicit use constants use print implicit none dt = 0.004 kp = 1 xmax = 10 ymax=xmax dx = xmax/imax dy = ymax/jmax open(10,file="initial.txt") open(11,file="final.txt") !initial state do j=0,jmax do i = 0, imax x = dx*i y = dy*j if (i < imax/2) then T(i,j) = x else T(i,j) = xmax - x endif write(10,*) ,x,y,T(i,j) end do end do call print__profile(nt,T(:,:)) !Time step do nt = 1, ntmax do j=1,jmax-1 do i = 1, imax-1 T(i,j) = T(i,j) + kp*dt/(dx*dx)*(T(i+1,j)- 2*T(i,j) +T(i-1,j)) & + kp*dt/(dy*dx)*(T(i,j+1)- 2*T(i,j) +T(i,j-1)) end do end do if (mod(nt,1)==0) call print__profile(nt,T(:,:)) write(*,*)nt end do !Final state do j=0,jmax do i = 0, imax x = dx*i y = dy*j write(11,*) x,y,T(i,j) end do end do end program thermal_explicit |
2次元の熱伝導方程式をFortranで解く部分の解説は、下記の記事に詳しく乗っているので順にお読みください。
1 2 |
gfortran 2D_Thermal_Eq.f90 ./a.out |
そうすると「data」というディレクトリの中に以下のような大量のvtkファイルが出力されているのが確認できます(^^)/
↑これをparaviewで読み込めば温度分布のアニメーションを見ることができます(^^)
paraviewで温度分布のアニメーションを確認
ではparaviewを起動して温度分布を確認してみます。
vtkファイル形式として出力する部分の記述
vtkファイル形式で出力する部分はモジュールとして以下のように書いています。
Fortran:vtkファイル形式の出力部分
出力されたvtkの中身の基本構造は以下です。
ご興味ある方は下記の記事を参考に色々と遊んでみてださい(^^)/
paraviewでvtkファイルを読み込んでみよう
ここからはparaviewを起動してFortranで解いた2次元熱伝導方程式による温度分布のアニメーションを見てみましょう。
↓paraviewによる基本的な操作は動画にしています。
こんな感じでFortranで解いた問題をvtkファイル形式に出力してアニメーションを見ることができます(^^)/
まとめ
色々と説明を書きましたが、以下のzipを解凍して自身の環境でお試しください(^^)/
以下のコマンドでFortranを実行
1 2 |
gfortran 2D_Thermal_Eq.f90 ./a.out |
paraviewの操作は「paraviewでvtkファイルを読み込んでみよう」の章を参考にしてください(^^)/
[…] 出力に関してもカマキリさんの記事を参考にコードを書きました。 下記にコードを載せておきますが、詳細はこちらの記事を参考にしてください! […]
大学院でfortranやってます。同じようなことをしているので参考にしました。