!**************************************************************************** ! 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] end module !============================================================================ ! FDTD module !============================================================================ module fdtd ! ******** 波源情報 ******** real(8) :: freq ! ******** 時間ステップ ******** integer :: ntime real(8) :: time,dt ! ******** フィールド ******** integer,parameter :: mx=100,my=200,mz=100 integer :: nx,ny,nz real(8) :: dx,dy,dz real(8) :: ex(mx+1,my+1,mz+1),ey(mx+1,my+1,mz+1),ez(mx+1,my+1,mz+1) real(8) :: hx(mx+1,my+1,mz+1),hy(mx+1,my+1,mz+1),hz(mx+1,my+1,mz+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,mz) ! ******** フィールド更新係数 ******** real(8) :: cex0,cey0,cez0 real(8) :: cexry0,cexrz0, & ceyrz0,ceyrx0, & cezrx0,cezry0 real(8) :: chxry0,chxrz0, & chyrz0,chyrx0, & chzrx0,chzry0 real(8) :: cex(mmedia),cey(mmedia),cez(mmedia) real(8) :: cexry(mmedia),cexrz(mmedia), & ceyrz(mmedia),ceyrx(mmedia), & cezrx(mmedia),cezry(mmedia) real(8) :: chxry(mmedia),chxrz(mmedia), & chyrz(mmedia),chyrx(mmedia), & chzrx(mmedia),chzry(mmedia) 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 ! 磁界を更新 time=time+dt/2.0d0 end do call output close(1) end program ! ! End of file !