| Class | gridset |
| In: |
setup/gridset.f90
|
引数に与えられた NAMELIST ファイルから, 格子点情報を取得し, 保管するための変数型モジュール
| Subroutine : | |
| cfgfile : | character(*), intent(in) |
NAMELIST から情報を得て, 格子点を計算する
This procedure input/output NAMELIST#gridset .
subroutine gridset_init(cfgfile)
!
!NAMELIST から情報を得て, 格子点を計算する
!
!モジュール読み込み
use DebugSet, only: DebugOn
use chemcalc, only: ChemCalcDim_init !配列の大きさの初期化
!暗黙の型宣言禁止
implicit none
!入力変数
character(*), intent(in) :: cfgfile
!内部変数
integer :: i, k
integer, parameter :: kind = 8 !精度を表す
!-----------------------------------------------------------------
! NAMELIST から情報を取得
!-----------------------------------------------------------------
NAMELIST /gridset/ NX, NZ, Xmin, Xmax, Zmin, Zmax, SpcNum
open (10, FILE=cfgfile)
read(10, NML=gridset)
close(10)
!-----------------------------------------------------------------
! 格子点間隔計算
!-----------------------------------------------------------------
DelX = (Xmax - Xmin) / real(NX, kind)
DelZ = (Zmax - Zmin) / real(NZ, kind)
!-----------------------------------------------------------------
! 物理的に意味のある領域の上限・下限を決める
!-----------------------------------------------------------------;
RegXMin = 0
RegXMax = NX
RegZMin = 0
RegZMax = NZ
!-----------------------------------------------------------------
! 配列の上限・下限を決める
!-----------------------------------------------------------------
DimXMin = RegXMin - MarginX
DimXMax = RegXMax + MarginX
DimZMin = RegZMin - MarginZ
DimZMax = RegZMax + MarginZ
!-----------------------------------------------------------------
! グリッドの設定
!-----------------------------------------------------------------
allocate( f_X(DimXMin:DimXMax), f_Z(DimZMin:DimZMax) )
do i = DimXMin, DimXMax
f_X(i) = Xmin + DelX * ( real(i, kind) - RegXMin )
end do
do k = DimZMin, DimZMax
f_Z(k) = Zmin + DelZ * ( real(k, kind) - RegZMin )
end do
!-----------------------------------------------------------------
! 半格子ずれたグリッドの設定. 等間隔を前提にしている.
!-----------------------------------------------------------------
allocate( s_X(DimXMin: DimXMax), s_Z(DimZMin: DimZMax) )
s_X(DimXMin+1:DimXMax) = ( f_X(DimXMin+1:DimXMax) + f_X(DimXMin:DimXMax-1) ) * 5.0d-1
s_X(DimXMin) = s_X(DimXMin+1) - DelX
s_Z(DimZMin+1:DimZMax) = ( f_Z(DimZMin+1:DimZMax) + f_Z(DimZMin:DimZMax-1) ) * 5.0d-1
s_Z(DimZMin) = s_Z(DimZMin+1) - DelZ
!-----------------------------------------------------------------
! デバッグモードか否かで, ファイル出力に用いる変数の大きさを変える
!-----------------------------------------------------------------
if (DebugOn) then
FileNX = size(f_X, 1)
FileNZ = size(f_Z, 1)
FileXMin = DimXMin
FileXMax = DimXMax
FileZMin = DimZMin
FileZMax = DimZMax
else
FileNX = NX
FileNZ = NZ
FileXMin = RegXMin + 1
FileXMax = RegXMax
FileZMin = RegZMin + 1
FileZMax = RegZMax
end if
!-----------------------------------------------------------------
! 確認
!-----------------------------------------------------------------
write(*,*) "gridset_init, XMin ", XMin
write(*,*) "gridset_init: XMax ", XMax
write(*,*) "gridset_init: ZMin ", ZMin
write(*,*) "gridset_init: ZMax ", ZMax
write(*,*) "gridset_init: DelX ", DelX
write(*,*) "gridset_init: DelZ ", DelZ
write(*,*) "gridset_init: NX ", NX
write(*,*) "gridset_init: NZ ", NZ
write(*,*) "gridset_init: SpcNum ", SpcNum
write(*,*) "gridset_init: MarginX", MarginX
write(*,*) "gridset_init: MarginZ", MarginZ
write(*,*) "gridset_init: DimXMin", DimXMin
write(*,*) "gridset_init: DimXMax", DimXMax
write(*,*) "gridset_init: DimZMin", DimZMin
write(*,*) "gridset_init: DimZMax", DimZMax
end subroutine gridset_init