!= Module BasicEnvInit
!
! Authors::   SUGIYAMA Koichiro, ODAKA Masatsugu
! Version::   $Id: basicenvmpi.f90,v 1.3 2009-08-24 03:50:12 sugiyama Exp $
! Tag Name::  $Name:  $
! Copyright:: Copyright (C) GFD Dennou Club, 2006. All rights reserved.
! License::   See COPYRIGHT[link:../../COPYRIGHT]
!
!== Overview 
!
!デフォルトの基本場を設定するための変数参照型モジュール
!   * BasicEnvFile_init: 基本場の値を netCDF ファイルから取得
!   * BasicEnvCalc_Init: 基本場の情報を Namelist から取得して値を計算
!
!== Error Handling
!
!== Known Bugs
!
!== Note
!
!== Future Plans
!
subroutine BasicEnvInit_upper(Humidity, TempStrat, Dhight, z_TempBasicZ, z_PressBasicZ)
  !
  !
  !デフォルトの基本場を設定するためのサブルーチン. 
  !基本場を計算し, BasicSet モジュールの値を初期化する. 
  !
  !コンパイルの順序の問題から, 基本場の値(hogeBasicZ な変数)を
  !計算する部分をBasicSet モジュールから切り離している. 
  !ECCM 始め, BasicSet 自体に依存するが hogeBasicZ は use しない
  !外部サブルーチンを利用するためである. 
  !
  use gridset,  only: DimZMin,       &!配列の Z 方向の下限
    &                 RegZMin,       &!配列の Z 方向の下限
    &                 DimZMax,       &!配列の Z 方向の上限
    &                 s_Z,           &!スカラー格子点での高度
    &                 DelZ            !Z 方向の格子点間隔
  use basicset, only: &
    &                 MolWtDry,      &!乾燥成分の分子量
    &                 Grav,          &!重力加速度
    &                 Tropopause,    &!対流圏界面高度
    &                 GasRUniv        !気体定数

  implicit none

  integer :: k
  real(8), intent(in)    :: Humidity      !基本場の相対湿度
  real(8), intent(in)    :: TempStrat     !成層圏の温度 [k]
  real(8), intent(in)    :: Dhight        !重み関数のパラメータ [m]
  real(8), intent(inout) :: z_TempBasicZ(DimZMin:DimZMax)
  real(8), intent(inout) :: z_PressBasicZ(DimZMin:DimZMax)
  real(8) :: z_DTempDZ(DimZMin:DimZMax)
  real(8) :: DTempDZ
  real(8) :: Weight


  do k = RegZMin+1, DimZMax-1     
     z_DTempDZ(k) = (z_TempBasicZ(k) - z_TempBasicZ(k-1)) / DelZ
  end do
  
  ! 対流圏界面より上の扱い
  !   圏界面より上は等温大気とする. 等温位大気から等温大気への遷移は 
  !   tanh を用いてなめらかにつなぐ
  do k = RegZMin+1, DimZMax
    
    !重みつけの関数を用意. tanh を用いる
    Weight = ( tanh( (s_Z(k) - tropopause ) / Dhight ) + 1.0d0 ) * 5.0d-1
    
    !仮値として温度を計算する. 圏界面より上では TempStrat の等温大気に近づける
    z_TempBasicZ(k) = z_TempBasicZ(k) * ( 1.0d0 - Weight ) + TempStrat * Weight
    
    !温度減率が断熱温度減率より小さくならないように
    DTempDZ = &
      & max( z_DTempDZ(k), (z_TempBasicZ(k) - z_TempBasicZ(k-1)) / DelZ )

    !基本場の温度を決める
    z_TempBasicZ(k) = z_TempBasicZ(k-1) + DTempDZ * DelZ 
    
    !圧力を静水圧平衡から計算
    z_PressBasicZ(k) =                                                    &
      &  z_PressBasicZ(k-1) * ( ( z_TempBasicZ(k-1) / z_TempBasicZ(k) )   &
      &    ** (Grav * MolWtDry / ( DTempDZ * GasRUniv ) ) )
  end do

end subroutine BasicEnvInit_upper

