!= Program ArareInitData
!
! Authors::   SUGIYAMA Ko-ichiro (杉山耕一朗), ODAKA Masatsugu (小高正嗣)
! Version::   $Id: arare_init-data.f90,v 1.1 2011-03-02 01:37:18 sugiyama Exp $
! Tag Name::  $Name:  $
! Copyright:: Copyright (C) GFD Dennou Club, 2006. All rights reserved.
! License::   See COPYRIGHT[link:../../COPYRIGHT]
!
!== Overview 
!
! 非静力学モデル deepconv/arare. 
!
!== Error Handling
!
!== Known Bugs
!
!== Note
!
!  * 方程式系は準圧縮系.
!
!== Future Plans
!
!

program ArareInitData
  !
  !非静力学モデル deepconv/arare. 
  !

  !----- モジュール読み込み ------

  !-----   型宣言, 文字列処理   ----
  use dc_types,       only : STRING
  use dc_string,      only : StoA

  !-----   メッセージ出力   -----
  use dc_message,     only: MessageNotify

  !  コマンドライン引数解釈
  use argset,        only : argset_init  

  !-----    管理モジュール   -----
  !  化学量計算モジュール
  use ChemCalc, only: ChemCalc_init
  use chemdata, only: chemdata_init

  !  MPI の初期化
  use mpiset,        only : mpii_init, mpii_end, myrank

  !  入出力ファイル名管理モジュール
  use filesetmpi,    only : fileset_init, &
    &                       InitFile

  !  デバッグ出力管理モジュール
  use debugset,      only : debugset_init

  !  時間管理モジュール
  use timeset,       only : timeset_init, &
    &                       NstepLong, NstepShort, DelTimeLong, DelTimeShort, &
    &                       NstepDisp

  !  格子点管理モジュール 
  use gridset,       only : gridset_init, &
    &                       DimXMin, DimXMax, DimZMin, DimZMax, SpcNum

  !  基本場設定モジュール
  use basicset,      only : basicset_init, &
    &                       xz_DensBasicZ, xza_MixRtBasicZ, xz_PotTempBasicZ, &
    &                       xz_VelSoundBasicZ

  !  積算値管理モジュール
  use StorePotTemp,      only : StorePotTemp_init, StorePotTempClean, &
    &                           StorePotTempCond
  use StoreMixRt,        only : StoreMixRt_init, StoreMixRtClean, &
    &                           StoreMixRtCond, StoreMixRtFill1, StoreMixRtFill2
  use StoreBuoy,         only : StoreBuoy_init, StoreBuoyClean
  use StoreStab,         only : StoreStab_init, StoreStabClean
  use StoreMom,          only : StoreMom_Init, StoreMomClean

  !  湿潤ルーチン設定モジュール
  use moistset,      only: moistset_init

  !-----    下請けモジュール   -----
  !  数値摩擦計算モジュール 
  use damping,       only : damping_init, & 
    &                        DampSponge_xz, DampSponge_pz, DampSponge_xr

  !  時間積分フィルターモジュール
  use timefilter,    only : AsselinFilter_xz, AsselinFilter_xr, &
    &                        AsselinFilter_pz, AsselinFilter_xza

  !  境界条件適用モジュール
  use boundarympi,    only : BoundaryXCyc_xz, BoundaryZSym_xz,     &
    &                      BoundaryXCyc_xza, BoundaryZSym_xza,   &
    &                      BoundaryXCyc_pz, BoundaryZSym_pz,     &
    &                      BoundaryXCyc_xr, BoundaryZAntiSym_xr

  !  CFL 条件確認モジュール
  use cflcheck,      only : CFLCheckTimeShort, &
    &                       CFLCheckTimeLongVelX, CFLCheckTimeLongVelZ

  !  負の湿潤量の補填計算モジュール
  use fillnegative,  only : FillNegative_init, xza_FillNegative_xza

  !-----    入出力モジュール   -----
  !  リスタートファイル入出力モジュール
  use RestartFileIOmpi, only : ReStartFile_Open, ReStartFile_OutPut, &
    &                       ReStartFile_Close, ReStartFile_Get, ReStartFile_Get2

  !  ヒストリファイル入出力モジュール
  use HistoryFileIOmpi, only : HistoryFile_Open, HistoryFile_OutPut, &
    &                       HistoryFile_Close

  !-----       力学過程        -----
  !  力学過程計算用関数モジュール
  use DynFunc,       only : xz_AdvScalar, xz_AdvKm, xza_AdvScalar, pz_AdvVelX, &
    &                       xr_Buoy, xr_AdvVelZ, pz_GradPi
  
  !  力学過程陰解法計算用関数モジュール
  use DynImpFunc,    only : xz_Exner_init, xz_Exner, xr_GradPi
  
  !-----       物理過程        -----
  !  数値拡散計算用モジュール
  use NumDiffusion,  only : NumDiffusion_Init, xz_NumDiffScalar, xz_NumDiffKm, &
    &                       xza_NumDiffScalar, pz_NumDiffVelX, xr_NumDiffVelZ

  !  乱流拡散計算用モジュール
  use Turbulence,   only : Turbulence_Init, &
    &                      xz_TurbScalar, xza_TurbScalar, pz_TurbVelX, &
    &                      xr_TurbVelZ  , xz_ShearKm    , xz_DispKm,   &
    &                      xz_DispHeat
  
  !  放射強制計算用モジュール
  use Radiation,    only : Radiation_init,  &
    &                      xz_RadHeatConst  
  
  !  地表フラックス計算用モジュール
!  use HeatFlux,     only : xz_HeatFluxBulk, xz_MixRtFluxBulk
  use HeatFlux,     only : xz_HeatFluxDiff, xza_MixRtFluxDiff

  !  湿潤飽和調節法計算用モジュール
  use MoistAdjust,  only : MoistAdjustSvapPress, MoistAdjustNH4SH

  !  雲物理パラメタリゼーション
  use WarmRainPrm,  only : WarmRainPrm_Init, xz_Rain2GasHeat, xza_Rain2Gas, &
    &                      xza_Rain2GasNH4SH, xz_Rain2GasHeatNH4SH,         &
    &                      xza_Cloud2Rain, xza_FallRain

  !  湿潤気塊の浮力計算用モジュール
  use MoistBuoyancy,only : MoistBuoy_Init, xz_BuoyMoistKm, xr_BuoyMolWt, &
    &                      xr_BuoyDrag

  !  安定度の計算
  use ECCM, only: ECCM_Stab

  !暗黙の型宣言禁止
  implicit none

  !内部変数
  character(80) :: cfgfile
  real(8), allocatable :: pz_VelXBl(:,:)
  real(8), allocatable :: xr_VelZBl(:,:)
  real(8), allocatable :: xz_ExnerBl(:,:)
  real(8), allocatable :: xz_PotTempBl(:,:)
  real(8), allocatable :: xz_KmBl(:,:)
  real(8), allocatable :: xz_KhBl(:,:)
  real(8), allocatable :: xza_MixRtBl(:,:,:)
  real(8)              :: Time

  !コマンドライン引数の解釈
  call mpii_init

  !NAMELIST ファイル名の読み込み
  if (myrank == 0) then 
    call MessageNotify( "M", "main", "Namelist file is '%c'", c1=trim(cfgfile) )
  end if
  call argset_init(cfgfile)

  !デバッグ設定
  call debugset_init(cfgfile, myrank)

  !物質特性の初期化
  call chemdata_init()

  !時刻に関する設定の初期化
  !  NAMELIST から必要な情報を読み取り, 時間関連の変数の設定を行う. 
  call timeset_init(cfgfile)

  !格子点情報の初期化
  !  NAMELIST から情報を得て, 格子点を計算する
  call gridset_init(cfgfile)

  !化学計算ルーチンの初期化
  call chemcalc_init()
  
  !基本場の情報の初期化
  !  NAMELIST から情報を得て, 基本場を設定する.
  call basicset_init(cfgfile)
  
  !I/O ファイル名の初期化
  !  NAMELIST ファイル名を指定し, deepconv/arare の
  !  出力ファイル名を NAMELIST から得る
  call fileset_init(cfgfile)

  !湿潤ルーチンの共有変数の初期化
  call moistset_init()

  !積算値を保管するためのモジュールの初期化
  !  NAMELIST から情報を得て, 基本場を設定する.
  call StorePotTemp_init( )
  call StoreMixRt_init( )
  call StoreBuoy_init( )  
  call StoreStab_init( )  
  call StoreMom_init( )  

  !内部変数の初期化. とりあえずゼロを入れて値を確定させておく. 
  call ArareAlloc

  !デフォルト設定の基本場, 擾乱場を作成する. 
  call BasicEnv()  
  call DisturbEnvMPI(cfgfile,                         &
    & xz_PotTempBl, xz_ExnerBl, pz_VelXBl, xr_VelZBl, &
    & xza_MixRtBl,  xz_KmBl,    xz_KhBl               )
  
!  !----------------------------------------------------------------------
!  ! パッケージ型モジュールの初期化
!  !   デフォルトの値から変更する必要のあるルーチンのみ初期化
!  !----------------------------------------------------------------------
!  call Damping_Init( cfgfile )      !波の減衰係数の初期化
!!  call NumDiffusion_Init3( cfgfile ) !数値拡散項の初期化
!  call NumDiffusion_Init()          !数値拡散項の初期化
!  call Turbulence_Init()            !乱流計算の初期化
!  call WarmRainPrm_Init( cfgfile )  !暖かい雨のパラメタリゼーションの初期化
!  call FillNegative_Init( xza_MixRtBasicZ, xz_DensBasicZ)
!  call Radiation_Init( cfgfile )    !放射強制の初期化
!  call MoistBuoy_Init()             !分子量に対する浮力計算ルーチンの初期化!
!  call xz_Exner_Init()              !陰解法の初期化  
       
  !----------------------------------------------------------------
  ! リスタートファイルの作成
  !----------------------------------------------------------------
  call ReStartFile_Open( )
  call ReStartFile_OutPut(                            &
    & Time,                                           &
    & xz_PotTempBl, xz_ExnerBl, pz_VelXBl, xr_VelZBl, &
    & xza_MixRtBl,  xz_KmBl,    xz_KhBl               )
  call ReStartFile_Close
    
contains

  subroutine ArareAlloc
    !
    !初期化として, 配列を定義し, 値としてゼロを代入する.
    !

    !暗黙の型宣言禁止
    implicit none

    !配列割り当て
    allocate(                                                  &
      & pz_VelXBl(DimXMin:DimXMax, DimZMin:DimZMax),           &
      & xr_VelZBl(DimXMin:DimXMax, DimZMin:DimZMax),           &
      & xz_ExnerBl(DimXMin:DimXMax, DimZMin:DimZMax),          &
      & xz_PotTempBl(DimXMin:DimXMax, DimZMin:DimZMax),        &
      & xz_KmBl(DimXMin:DimXMax, DimZMin:DimZMax),             &
      & xz_KhBl(DimXMin:DimXMax, DimZMin:DimZMax),             &
      & xza_MixRtBl(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum), &
      & DelTimeLFrog(NstepLong), NStepEular(NStepLong)         ) 

    pz_VelXBl = 0.0d0
    xr_VelZBl = 0.0d0
    xz_ExnerBl = 0.0d0
    xz_KmBl = 0.0d0
    xz_KhBl = 0.0d0
    xz_PotTempBl = 0.0d0
    xza_MixRtBl = 0.0d0
  end subroutine ArareAlloc
    
end program ArareInitData
