Class gridset
In: src/setup/gridset.f90

Methods

Included Modules

dc_trace debugset

Public Instance methods

cfgfile :character(*), intent(in)
: Input

[Source]

  subroutine gridset_init(cfgfile)

    !=== Dependency


    !=== Input
    character(*), intent(in) :: cfgfile
                                                                 !=end    
    !=== 内部変数の定義
    integer            :: i, k
                                                                 !=begin    
    !=== NAMELIST 
    NAMELIST /gridset/  NX, NZ, Xmin, Xmax, Zmin, Zmax
                                                                 !=end

    call BeginSub("gridset_init",                  fmt="%c",                        c1="Initialize grid point and interval. ")
    
    open (10, FILE=cfgfile)
    read(10, NML=gridset)
    close(10)

    !==== 格子点間隔計算
    DelX = (Xmax - Xmin) / real(NX, kind)
    DelZ = (Zmax - Zmin) / real(NZ, kind)

    !==== 平均格子点間隔
    DelXZ = sqrt( DelX * DelZ )
    
    !==== 物理的に意味のある領域の上限・下限を決める
    RegXMin = 0
    RegXMax = NX
    RegZMin = 0
    RegZMax = NZ

    !==== 配列の上限・下限を決める
    DimXMin = RegXMin - Margin
    DimXMax = RegXMax + Margin
    DimZMin = RegZMin - Margin
    DimZMax = RegZMax + Margin

    !==== グリッドの設定
    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(*,*) "Xmin, Xmax", Xmin, Xmax
!    write(*,*) "Zmin, Zmax", Zmin, Zmax
!    write(*,*) "DelX, DelZ", DelX, DelZ
!    write(*,*) "DelXZ", DelXZ
!    write(*,*) "NX, NZ", NX, NZ
!    write(*,*) "DimXMin, DimXMax", DimXMin, DimXMax
!    write(*,*) "DimZMin, DimZMax", DimZMin, DimZMax
!    write(*,*) "RegXMin, RegXMax", RegXMin, RegXMax
!    write(*,*) "RegZMin, RegZMax", RegZMin, RegZMax
!    write(*,*) "FileNX, FileNZ", FileNX, FileNZ
!    write(*,*) "FileXMin, FileXMax", FileXMin, FileXMax
!    write(*,*) "FileZMin, FileZMax", FileZMin, FileZMax
!    write(*,*) "Margin", Margin
!    write(*,*) "kind", kind
!    write(*,*) "s_X", s_X
!    write(*,*) "f_X", f_X
!    write(*,*) "s_Z", s_Z
!    write(*,*) "f_Z", f_Z

    call EndSub("gridset_init")

  end subroutine gridset_init

[Validate]