c---------------------------------------------------------------------|
c FDTD3dp.f ( Maxwell Equation Simulator ) |
c |
c FDTD法によるスラブ座標系(x,y,z)でのプラズマ中における |
c マクスウェル方程式の2次元数値計算 |
c サブルーチン:PLASMA |
c 位置(x,y,z)での密度 F ,磁場 GX, GY, GZ,減衰率 dmp を与える |
c サブルーチン:YUDENTAI |
c 位置(x,y,z)を与えて,比誘電率(Sr, Si), 比透磁率 Qr を与える |
c サブルーチン:REISIN |
c x=Xminでの入射波形の時間分布を与える |
c サブルーチン:PROFILE |
c x=Xminでの入射波形のz方向分布を与える |
c x=Xmin, x=Xmax, z=Zmin, z=ZmaxでMurの2次吸収境界条件を用いる |
c プログラム作成者: 北條仁士, 筑波大学 2003年 1月 |
c---------------------------------------------------------------------|
implicit real*8(a-h,o-z)
dimension BX(1001,201,201), BY(1001,201,201), BZ(1001,201,201)
dimension EX(1001,201,201), EY(1001,201,201), EZ(1001,201,201)
dimension PX(1001,201,201), PY(1001,201,201), PZ(1001,201,201)
dimension EX1(1001,201,201),EY1(1001,201,201),EZ1(1001,201,201)
common /BLK1/w0,B0,OMEGA,R0
pi = 3.141592654d0
c---------------------------------------------------------------------|
c 数値計算パラメータの設定 |
c w0 = 3.0d11 のとき,長さの規格化 c/w0 = 1 mm , dx=dz= 0.1 mm |
c---------------------------------------------------------------------|
w0 = 3.0d10
B0 = 1.0d0
R0 = 4.0d0
dt = 0.05d0
dx = 0.1d0
dy = 0.1d0
dz = 0.1d0
wx = dt / dx
wy = dt / dy
wz = dt / dz
c---------------------------------------------------------------------|
c システムパラメータの設定 |
c 入力周波数:OMEGA は GHz で表示 |
c システム長:Xmin, Zmin, Xmax, Zmax はミリ単位で表示 |
c---------------------------------------------------------------------|
itmax = 3200
OMEGA = 2.45d0
Xmin = 0.0d0
Ymin = -5.0d0 + 1.0d-3
Zmin = -5.0d0
Xmax = 20.0d0
Ymax = 5.0d0
Zmax = 5.0d0
IMX = idint( (Xmax - Xmin) / dx + 0.5d0 )
JMX = idint( (Ymax - Ymin) / dy + 0.5d0 )
KMX = idint( (Zmax - Zmin) / dz + 0.5d0 )
IMDX = IMX / 200
JMDY = JMX / 100
KMDZ = KMX / 100
c---------------------------------------------------------------------|
c 電磁場の初期値の設定 |
c---------------------------------------------------------------------|
do 100 k=1,KMX+1
do 100 j=1,JMX+1
do 100 i=1,IMX+1
BX(i,j,k) = 0.0d0
BY(i,j,k) = 0.0d0
BZ(i,j,k) = 0.0d0
EX(i,j,k) = 0.0d0
EY(i,j,k) = 0.0d0
EZ(i,j,k) = 0.0d0
PX(i,j,k) = 0.0d0
PY(i,j,k) = 0.0d0
PZ(i,j,k) = 0.0d0
100 continue
do 110 k=1,KMX+1
do 110 j=1,JMX+1
do 110 i=1,IMX+1
EX1(i,j,k) = 0.0d0
EY1(i,j,k) = 0.0d0
EZ1(i,j,k) = 0.0d0
110 continue
c---------------------------------------------------------------------|
c 計算のスタート:時間 : time = ( it ) * dt |
c---------------------------------------------------------------------|
it = 0
20 continue
it = it + 1
c---------------------------------------------------------------------|
c z=Zminで励起する入射波の条件設定 |
c---------------------------------------------------------------------|
time = dt * dfloat(it)
do k=2,KMX
do j=2,JMX
z = dfloat(k-1)*dz + Zmin
y = dfloat(j-1)*dy + Ymin
R = dsqrt( z*z + y*y )
IF( R<=R0 ) THEN
EX(1,j,k) = (1.0d0 - R/R0)**2*dsin( 2.0d9*pi*OMEGA/w0 * time )
ELSE
EX(1,j,k) = 0.0d0
END IF
end do
end do
c---------------------------------------------------------------------|
c 電磁場の磁場成分 BX, BY, BZ の計算 |
c---------------------------------------------------------------------|
do 200 k=1,KMX
do 200 j=1,JMX
do 200 i=1,IMX
x = dfloat(i-1)*dx + Xmin + dx/2.d0
y = dfloat(j-1)*dy + Ymin + dy/2.d0
z = dfloat(k-1)*dz + Zmin + dz/2.d0
CALL YUDENTAI( x, y, z, Sr, Si, Qr )
BX(i,j,k) = BX(i,j,k) + wz*( EY(i,j,k+1) - EY(i,j,k) ) / Qr
BX(i,j,k) = BX(i,j,k) - wy*( EZ(i,j+1,k) - EZ(i,j,k) ) / Qr
BY(i,j,k) = BY(i,j,k) + wx*( EZ(i+1,j,k) - EZ(i,j,k) ) / Qr
BY(i,j,k) = BY(i,j,k) - wz*( EX(i,j,k+1) - EX(i,j,k) ) / Qr
BZ(i,j,k) = BZ(i,j,k) + wy*( EX(i,j+1,k) - EX(i,j,k) ) / Qr
BZ(i,j,k) = BZ(i,j,k) - wx*( EY(i+1,j,k) - EY(i,j,k) ) / Qr
200 continue
c---------------------------------------------------------------------|
c 誘起電流成分 PX, PY, PZ の計算 |
c---------------------------------------------------------------------|
do 250 k=2,KMX
do 250 j=2,JMX
do 250 i=2,IMX
x = dfloat(i-1)*dx + Xmin
y = dfloat(j-1)*dy + Ymin
z = dfloat(k-1)*dz + Zmin
CALL PLASMA( x, y, z, dmp, F, A, GX, GY, GZ )
C1 = ( 1.d0 - dmp*dt/2.d0 ) / ( 1.d0 + dmp*dt/2.d0)
D1 = 1.d0 / ( 1.d0 + dmp*dt/2.d0)
PX(i,j,k) = C1*PX(i,j,k) + D1*dt*F*EX(i,j,k)
PX(i,j,k) = PX(i,j,k) - D1*dt*A*( PY(i,j,k)*GZ - PZ(i,j,k)*GY )
PY(i,j,k) = C1*PY(i,j,k) + D1*dt*F*EY(i,j,k)
PY(i,j,k) = PY(i,j,k) - D1*dt*A*( PZ(i,j,k)*GX - PX(i,j,k)*GZ )
PZ(i,j,k) = C1*PZ(i,j,k) + D1*dt*F*EZ(i,j,k)
PZ(i,j,k) = PZ(i,j,k) - D1*dt*A*( PX(i,j,k)*GY - PY(i,j,k)*GX )
250 continue
c---------------------------------------------------------------------|
c 電磁場の電場成分 EX, EY, EZ の計算 |
c---------------------------------------------------------------------|
do 300 k=2,KMX
do 300 j=2,JMX
do 300 i=2,IMX
x = dfloat(i-1)*dx + Xmin
y = dfloat(j-1)*dy + Ymin
z = dfloat(k-1)*dz + Zmin
CALL YUDENTAI( x, y, z, Sr, Si, Qr )
V = ( OMEGA*2.0d9*pi/w0 ) * Si / Sr
C = ( 1.d0 - V*dt/2.d0 ) / ( 1.d0 + V*dt/2.d0)
D = 1.d0 / Sr / ( 1.d0 + V*dt/2.d0)
EX(i,j,k) = C*EX(i,j,k) - D*dt*PX(i,j,k)
EX(i,j,k) = EX(i,j,k) + D*wy*( BZ(i,j,k) - BZ(i,j-1,k) )
EX(i,j,k) = EX(i,j,k) - D*wz*( BY(i,j,k) - BY(i,j,k-1) )
EY(i,j,k) = C*EY(i,j,k) - D*dt*PY(i,j,k)
EY(i,j,k) = EY(i,j,k) + D*wz*( BX(i,j,k) - BX(i,j,k-1) )
EY(i,j,k) = EY(i,j,k) - D*wx*( BZ(i,j,k) - BZ(i-1,j,k) )
EZ(i,j,k) = C*EZ(i,j,k) - D*dt*PZ(i,j,k)
EZ(i,j,k) = EZ(i,j,k) + D*wx*( BY(i,j,k) - BY(i-1,j,k) )
EZ(i,j,k) = EZ(i,j,k) - D*wy*( BX(i,j,k) - BX(i,j-1,k) )
300 continue
c---------------------------------------------------------------------|
c YZ面(x=Xmin)でのHigdonの1次の吸収境界条件 |
c---------------------------------------------------------------------|
ux = ( wx - 1.d0 )/( wx + 1.d0 )
uy = ( wy - 1.d0 )/( wy + 1.d0 )
uz = ( wz - 1.d0 )/( wz + 1.d0 )
d1 = 0.005d0
ds = 1.d0 - d1
do 400 k=1,KMX+1
do 400 j=1,JMX+1
EY(1,j,k)= ds*EY1(2,j,k) + ux*(EY(2,j,k)-EY1(1,j,k))
EZ(1,j,k)= ds*EZ1(2,j,k) + ux*(EZ(2,j,k)-EZ1(1,j,k))
400 continue
c---------------------------------------------------------------------|
c YZ面(x=Xmax)でのHigdonの1次の吸収境界条件 |
c---------------------------------------------------------------------|
do 410 k=1,KMX+1
do 410 j=1,JMX+1
EY(IMX+1,j,k)= ds*EY1(IMX,j,k) + ux*(EY(IMX,j,k)-EY1(IMX+1,j,k))
EZ(IMX+1,j,k)= ds*EZ1(IMX,j,k) + ux*(EZ(IMX,j,k)-EZ1(IMX+1,j,k))
410 continue
c---------------------------------------------------------------------|
c XZ面(y=Ymax)でのHigdonの1次の吸収境界条件 |
c---------------------------------------------------------------------|
do 420 k=1,KMX+1
do 420 i=1,IMX+1
EX(i,JMX+1,k)= ds*EX1(i,JMX,k) + uy*(EX(i,JMX,k)-EX1(i,JMX+1,k))
EZ(i,JMX+1,k)= ds*EZ1(i,JMX,k) + uy*(EZ(i,JMX,k)-EZ1(i,JMX+1,k))
420 continue
c---------------------------------------------------------------------|
c XZ面(y=Ymin)でのHigdonの1次の吸収境界条件 |
c---------------------------------------------------------------------|
do 430 k=1,KMX+1
do 430 i=1,IMX+1
EX(i,1,k)= ds*EX1(i,2,k) + uy*(EX(i,2,k)-EX1(i,1,k))
EZ(i,1,k)= ds*EZ1(i,2,k) + uy*(EZ(i,2,k)-EZ1(i,1,k))
430 continue
c---------------------------------------------------------------------|
c XY面(z=Zmax)でのHigdonの1次の吸収境界条件 |
c---------------------------------------------------------------------|
do 440 j=1,JMX+1
do 440 i=1,IMX+1
EX(i,j,KMX+1)= ds*EX1(i,j,KMX) + uz*(EX(i,j,KMX)-EX1(i,j,KMX+1))
EY(i,j,KMX+1)= ds*EY1(i,j,KMX) + uz*(EY(i,j,KMX)-EY1(i,j,KMX+1))
440 continue
c---------------------------------------------------------------------|
c XY面(z=Zmin)でのHigdonの1次の吸収境界条件 |
c---------------------------------------------------------------------|
do 450 j=1,JMX+1
do 450 i=1,IMX+1
EX(i,j,1)= ds*EX1(i,j,2) + uz*(EX(i,j,2)-EX1(i,j,1))
EY(i,j,1)= ds*EY1(i,j,2) + uz*(EY(i,j,2)-EY1(i,j,1))
450 continue
c----------------------------------------------------------------------
do 490 k=1,KMX+1
do 490 j=1,JMX+1
do 490 i=1,IMX+1
EX1(i,j,k) = EX(i,j,k)
EY1(i,j,k) = EY(i,j,k)
EZ1(i,j,k) = EZ(i,j,k)
490 continue
c---------------------------------------------------------------------|
c 電磁場の十分に小さい値はゼロで置き換える |
c it = itmax になれば,計算を終了する |
c---------------------------------------------------------------------|
do 500 k=1,KMX+1
do 500 j=1,JMX+1
do 500 i=1,IMX+1
if( dabs(EX(i,j,k)) .lt. 1.0d-80 ) EX(i,j,k) = 0.d0
if( dabs(EY(i,j,k)) .lt. 1.0d-80 ) EY(i,j,k) = 0.d0
if( dabs(EZ(i,j,k)) .lt. 1.0d-80 ) EZ(i,j,k) = 0.d0
if( dabs(BX(i,j,k)) .lt. 1.0d-80 ) BX(i,j,k) = 0.d0
if( dabs(BY(i,j,k)) .lt. 1.0d-80 ) BY(i,j,k) = 0.d0
if( dabs(BZ(i,j,k)) .lt. 1.0d-80 ) BZ(i,j,k) = 0.d0
500 continue
if( it.eq.itmax ) go to 600
go to 20
c---------------------------------------------------------------------|
c 電磁場の値のデータファイルを作る |
c---------------------------------------------------------------------|
600 continue
open( 11, FILE='exdata1', STATUS='unknown' )
do j=1,JMX+1,JMDY
write(11,911) (EX(61,j,k),k=1,KMX+1,KMDZ)
911 format(1h , e15.5, 100(2x, e15.5) )
end do
close(11)
open( 12, FILE='exdata2', STATUS='unknown' )
do j=1,JMX+1,JMDY
write(12,912) (EX(81,j,k),k=1,KMX+1,KMDZ)
912 format(1h , e15.5, 100(2x, e15.5) )
end do
close(12)
open( 13, FILE='exdata3', STATUS='unknown' )
do j=1,JMX+1,JMDY
write(13,913) (EX(101,j,k),k=1,KMX+1,KMDZ)
913 format(1h , e15.5, 100(2x, e15.5) )
end do
close(13)
open( 14, FILE='exdata4', STATUS='unknown' )
do i=1,IMX+1,IMDX
write(14,914) (EX(i,51,k),k=1,KMX+1,KMDZ)
914 format(1h , e15.5, 100(2x, e15.5) )
end do
close(14)
c open( 15, FILE='xbunpu', STATUS='unknown' )
c do i=1,IMX+1
c x = dfloat(i-1)*dx + Xmin
c write(15,915) x, EY(i,51,51)
c 915 format(1h , e15.5, 2x, e15.5 )
c end do
c close(15)
c---------------------------------------------------------------------|
c メインプログラムの終了 |
c---------------------------------------------------------------------|
9999 stop
end
c---------------------------------------------------------------------|
c サブルーチン:PLASMA |
c 位置(x,z)での密度 F ,磁場 GX, GY, GZ,減衰率 dmp を与える |
c 最大密度 :DENTY は cm-3 で表示 |
c 磁場 :B0, BEX0 は Tesla で表示 |
c---------------------------------------------------------------------|
SUBROUTINE PLASMA( x, y, z, dmp, F, A, GX, GY, GZ )
implicit real*8(a-h, o-z)
common /BLK1/w0,B0,OMEGA
pai = 3.141592654d0
DENTY = 2.0d11
BEX0 = 0.0d0
dmp = 0.0d0
F0 = 3.181d9 * DENTY / ( w0*w0 )
A = 1.76d11 * B0 / w0
FNC = ( 1.d0 + dtanh((x-10.d0)/3.d0) )/2.d0
F = F0*FNC
c IF( x .GE. 10.d0 ) F = F0*( x - 10.d0 )/10.d0
c IF( x .LT. 10.d0 ) F = 0.d0
GX = 0.0d0
GZ = 0.0d0
GY = BEX0 / B0
return
end
c---------------------------------------------------------------------|
c サブルーチン:YUDENTAI |
c 位置(x,z)での比誘電率(Sr, Si), 比透磁率 Qrを与える |
c---------------------------------------------------------------------|
SUBROUTINE YUDENTAI( x, y, z, Sr, Si, Qr )
implicit real*8(a-h,o-z)
common /BLK1/w0,B0,OMEGA,R0
pi = 3.141592654d0
Sr = 1.d0
Si = 0.d0
Qr = 1.d0
R = dsqrt( z*z + y*y )
IF( R>=R0 ) THEN
Sr = 1.d0
Si = 0.d0
END IF
999 return
end
c---------------------------------------------------------------------|
c サブルーチン:REISIN |
c x=Xminでの入射波の波形の時間分布を与える |
c---------------------------------------------------------------------|
c SUBROUTINE REISIN( time, Bunpt )
c implicit real*8(a-h,o-z)
c common /BLK1/w0,B0,OMEGA
c pai = 3.141592654d0
c Freq = 2.0d9*pai*OMEGA / w0
c Bunpt = dsin( Freq * time )
c return
c end
c---------------------------------------------------------------------|
c サブルーチン:PROFILE |
c x=Xexcでの入射波の波形のz方向分布を与える |
c---------------------------------------------------------------------|
c SUBROUTINE PROFILE( y, z, Bunp )
c implicit real*8(a-h,o-z)
c pai = 3.141592654d0
c yy = y - 5.d0
c zz = z - 5.d0
c R = dsqrt( yy**2 + zz**2 )
c Bunp = dexp( - ( R / 2.0d0 )**2 )
c IF( R.LE.2.d0 ) Bunp = ( 1.d0 - (R/2.d0)**2 )**2
c IF( R.GT.2.d0 ) Bunp = 0.d0
c return
c end