!**************************************************************************** ! FDTD (Finite Difference Time Domain) method ! by TAKUICHI HIRANO ! 言語: FORTRAN90 ! コンパイル環境: Compaq Visual Fortran ! 参考文献: 宇野亨, 「FDTD法による電磁界およびアンテナ解析」, コロナ社, 1998 !**************************************************************************** !============================================================================ ! 物理定数 !============================================================================ module consts real(8),parameter :: pi=3.141592653589793d0 ! 円周率 π real(8),parameter :: c=2.998d8 ! 光速 c [m/sec] real(8),parameter :: epsilon0=8.854d-12 ! 真空の誘電率 [F/m] real(8),parameter :: mu0=4.0d-7*pi ! 真空の透磁率 [H/m] real(8),parameter :: z0=376.734309182110d0 ! 真空の界インピーダンス sqrt(μ0/ε0) [Ω] end module !============================================================================ ! FDTD module !============================================================================ module fdtd ! ******** 波源情報 ******** real(8) :: freq ! ******** 時間ステップ ******** integer :: ntime real(8) :: time,dt ! ******** フィールド ******** integer,parameter :: mx=100,my=100 integer :: nx,ny real(8) :: dx,dy real(8) :: ex(mx+1,my+1),ey(mx+1,my+1),hz(mx+1,my+1) ! ******** 媒質定数 ******** integer,parameter :: mmedia=10 integer :: nmedia ! 媒質の数 real(8) :: eps(mmedia) ! 誘電率ε [F/m] real(8) :: mu(mmedia) ! 透磁率μ [H/m] real(8) :: sig(mmedia) ! 導電率σ [S/m] integer :: media_id(mx,my) ! ******** フィールド更新係数 ******** real(8) :: cex0,cey0 real(8) :: cexry0,ceyrx0 real(8) :: chzry0,chzrx0 real(8) :: cex(mmedia),cey(mmedia) real(8) :: cexry(mmedia),ceyrx(mmedia) real(8) :: chzry(mmedia),chzrx(mmedia) ! ******** 吸収境界条件の過去の値の保存変数 ******** real(8) :: mur1_cx,mur1_cy real(8) :: hzx1(4,my+1),hzy1(4,mx+1) end module !**************************************************************************** ! メインルーチン !**************************************************************************** program main use fdtd implicit none integer :: n open(1,file='test.txt') call init ! 初期化 time=0.0d0 do n=1,ntime call electric_field ! 電界を更新 call electric_boundary_condition ! セルがずれるための補正境界条件 call ecur_source ! 電流源による励振 time=time+dt/2.0d0 call magnetic_field ! 磁界を更新 call magnetic_boundary_condition ! セルがずれるための補正境界条件 call absorbing_boundary_condition ! 吸収境界条件 time=time+dt/2.0d0 end do call output close(1) end program ! ! End of file !