Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:35:25 2011
FILE NAME: initialdata_takemi2007.f90
PROGRAM NAME: initialdata_takemi2007
DIAGNOSTIC LIST

  LINE  LEVEL( NO.): DIAGNOSTIC MESSAGE

   228  vec  (   1): Vectorized loop.
   276  opt  (  11): Fused array assignments. :line 276 - 279
   276  vec  (   4): Vectorized array expression.
   280  vec  (   4): Vectorized array expression.
   287  vec  (   1): Vectorized loop.
   298  opt  (  11): Fused array assignments. :line 298 - 300
   298  vec  (   4): Vectorized array expression.
   306  vec  (   1): Vectorized loop.
   324  vec  (   3): Unvectorized loop.
   343  vec  (   3): Unvectorized loop.
   398  vec  (   4): Vectorized array expression.
   400  vec  (   3): Unvectorized loop.
   402  vec  (   4): Vectorized array expression.
   402  vec  (   4): Vectorized array expression.
   404  vec  (   4): Vectorized array expression.
Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:35:25 2011
FILE NAME: initialdata_takemi2007.f90
PROGRAM NAME: initialdata_takemi2007
TRANSFORMATION LIST

  LINE                   FORTRAN STATEMENT

     1  != Module BasicEnvInit
     2  !
     3  ! Authors::   SUGIYAMA Koichiro, ODAKA Masatsugu
     4  ! Version::   $Id: initialdata_takemi2007.f90,v 1.6 2011-06-21 06:14:51 sugiyama Exp $
     5  ! Tag Name::  $Name: arare5-20111010 $
     6  ! Copyright:: Copyright (C) GFD Dennou Club, 2006. All rights reserved.
     7  ! License::   See COPYRIGHT[link:../../COPYRIGHT]
     8  !
     9  !== Overview
    10  !
    11  !デフォルトの基本場を設定するための変数参照型モジュール
    12  !   * BasicEnvFile_init: 基本場の値を netCDF ファイルから取得
    13  !   * BasicEnvCalc_Init: 基本場の情報を Namelist から取得して値を計算
    14  !
    15  !== Error Handling
    16  !
    17  !== Known Bugs
    18  !
    19  !== Note
    20  !
    21  !== Future Plans
    22  !
    23  module initialdata_takemi2007
    24    !
    25    !デフォルトの基本場を設定するためのサブルーチン.
    26    !基本場を計算し, BasicSet モジュールの値を初期化する.
    27    !
    28    !コンパイルの順序の問題から, 基本場の値(hogeBasicZ な変数)を
    29    !計算する部分をBasicSet モジュールから切り離している.
    30    !ECCM 始め, BasicSet 自体に依存するが hogeBasicZ は use しない
    31    !外部サブルーチンを利用するためである.
    32    !
    33  
    34    !モジュール読み込み
    35    use dc_types,   only: STRING, DP
    36    use dc_iounit,   only : FileOpen
    37    use dc_message, only: MessageNotify
    38    use mpi_wrapper, only: myrank
    39    use namelist_util, only: namelist_filename
    40    use gridset,  only: imin,       &!配列の X 方向の下限
    41      &                 imax,       &!配列の X 方向の上限
    42      &                 jmin,       &!配列の Y 方向の下限
    43      &                 jmax,       &!配列の Y 方向の上限
    44      &                 kmin,       &!配列の Z 方向の下限
    45      &                 kmax,       &!配列の Z 方向の上限
    46      &                 ncmax,      &!凝縮成分の数
    47      &                 nz
    48    use axesset, only:  z_Z,        &!スカラー格子点での高度
    49      &                 z_dz         !Z 方向の格子点間隔
    50    use constants, only: &
    51      &                 PressBasis,    &!温位の基準圧力
    52      &                 GasRDry,       &!乾燥成分の定圧比熱
    53      &                 CpDry,         &!乾燥成分の定圧比熱
    54      &                 Grav,          &!重力加速度
    55      &                 TempSfc,       &!地表面温度
    56      &                 PressSfc,      &!地表面圧力
    57      &                 MolWtDry
    58    use composition, only: MolWtWet
    59    use chemcalc, only: SvapPress       !
    60  
    61    !暗黙の型宣言禁止
    62    implicit none
    63  
    64    !デフォルトは private
    65    private
    66  
    67    real(DP), parameter :: PressSfcTakemi = 1.0d5   ! 地表の圧力
    68    real(DP), parameter :: PTempSfcTakemi = 300.0d0 ! 地表の温位
    69    real(DP), parameter :: AltTr    = 1.2d4   ! 対流圏界面高度
    70    real(DP), parameter :: HumMin   = 0.25d0  ! 混合比一定な高度
    71    integer,  parameter :: SpcID = 6          ! 水の番号
    72    real(DP), save      :: QMixSfc            ! 地表面でのモル比
    73    real(DP), save      :: VelXSfc            ! 地表の速度
    74    real(DP), save      :: PTempTr = 0.0d0    !
    75    real(DP), save      :: DryFact = 0.0d0    !
    76    real(DP), save      :: Alt1    = 0.0d0    !
    77    real(DP), save      :: Alt2    = 0.0d0    !
    78    integer,  save      :: amin, amax
    79  
    80  
    81    !初期化だけ公開
    82    public  initialdata_takemi2007_init
    83    public  initialdata_takemi2007_basic
    84    public  initialdata_takemi2007_wind
    85  
    86  contains
    87  
    88  !!!------------------------------------------------------------------------------!!!
    89    subroutine initialdata_takemi2007_init
    90      !
    91      !設定ファイルから出力ファイルに記載する情報を読み込む
    92      !
    93  
    94      !暗黙の型宣言禁止
    95      implicit none
    96  
    97      !内部変数
    98      real(DP)            :: Alt     !高度
    99      integer             :: unit     !設定ファイル用装置番号
   100      integer             :: k
   101      integer  :: ID_BasicZ = 0
   102      integer  :: ID_Wind   = 0
   103      integer, parameter  :: ID_MidLat_Q10     = 1
   104      integer, parameter  :: ID_MidLat_Q12     = 2
   105      integer, parameter  :: ID_MidLat_Q14     = 3
   106      integer, parameter  :: ID_MidLat_Q16     = 4
   107      integer, parameter  :: ID_MidLat_Q16DRY1 = 5
   108      integer, parameter  :: ID_MidLat_Q16DRY2 = 6
   109      integer, parameter  :: ID_MidLat_Q18     = 7
   110      integer, parameter  :: ID_Tropic_Q18     = 8
   111      integer, parameter  :: ID_Tropic_Q18DRY1 = 9
   112      integer, parameter  :: ID_Tropic_Q18DRY2 = 10
   113      integer, parameter  :: ID_Tropic_Q18DRY3 = 11
   114      integer, parameter  :: ID_Wind_LowLevel    = 1
   115      integer, parameter  :: ID_Wind_MiddleLevel = 2
   116      integer, parameter  :: ID_Wind_HighLevel   = 3
   117  
   118      character(STRING)  :: FlagEnv = ""
   119      character(STRING)  :: FlagWind = ""
   120  
   121  
   122      !設定ファイルから読み込む出力ファイル情報
   123      NAMELIST /initialdata_takemi2007_nml/ FlagEnv, FlagWind, VelXSfc
   124  
   125      !設定ファイルから出力ファイルに記載する情報を読み込む
   126      call FileOpen(unit, file=namelist_filename, mode='r')
   127      read(unit, NML=initialdata_takemi2007_nml)
   128      close(unit)
   129  
   130      ! 確認. 地表面温度・圧力を指定するのは別モジュールなので.
   131      !
   132      if (myrank == 0) then
   133        if (     PressBasis /= PressSfcTakemi &
   134          & .OR. PressSfc /= PressSfcTakemi   &
   135          & .OR. TempSfc  /= PTempSfcTakemi  ) then
   136  
   137          call MessageNotify( "E", "initaldata_takemi2007_init", &
   138            & "Constants are wrong. please PressSfc = 1.0d5, TempSfc = 300.0d0")
   139        end if
   140      end if
   141  
   142      if (myrank == 0) then
   143        call MessageNotify( "M", "initaldata_takemi2007_init", &
   144          & "VelXSfc= %f", d=(/VelXSfc/) )
   145      end if
   146  
   147  
   148      !基本場の選択
   149      !
   150      if (FlagEnv == "MidLat_Q10") then
   151        ID_BasicZ = ID_MidLat_Q10
   152      elseif (FlagEnv == "MidLat_Q12") then
   153        ID_BasicZ = ID_MidLat_Q12
   154      elseif (FlagEnv == "MidLat_Q14") then
   155        ID_BasicZ = ID_MidLat_Q14
   156      elseif (FlagEnv == "MidLat_Q16") then
   157        ID_BasicZ = ID_MidLat_Q16
   158      elseif (FlagEnv == "MidLat_Q16DRY1") then
   159        ID_BasicZ = ID_MidLat_Q16DRY1
   160      elseif (FlagEnv == "MidLat_Q16DRY2") then
   161        ID_BasicZ = ID_MidLat_Q16DRY2
   162      elseif (FlagEnv == "MidLat_Q18") then
   163        ID_BasicZ = ID_MidLat_Q18
   164      elseif (FlagEnv == "Tropic_Q18") then
   165        ID_BasicZ = ID_Tropic_Q18
   166      elseif (FlagEnv == "Tropic_Q18DRY1") then
   167        ID_BasicZ = ID_Tropic_Q18DRY1
   168      elseif (FlagEnv == "Tropic_Q18DRY2") then
   169        ID_BasicZ = ID_Tropic_Q18DRY2
   170      elseif (FlagEnv == "Tropic_Q18DRY3") then
   171        ID_BasicZ = ID_Tropic_Q18DRY3
   172      end if
   173  
   174      ! 速度場の選択
   175      !
   176      if (FlagWind == "LowLevel") then
   177        ID_Wind = ID_Wind_LowLevel
   178      elseif (FlagWind == "MiddleLevel") then
   179        ID_Wind = ID_Wind_MiddleLevel
   180      elseif (FlagWind == "HighLevel") then
   181        ID_Wind = ID_Wind_HighLevel
   182      end if
   183  
   184      ! 温位場
   185      !
   186      select case (ID_BasicZ)
   187      case (ID_MidLat_Q10:ID_MidLat_Q18)
   188        PTempTr = 343.0d0
   189      case (ID_Tropic_Q18:ID_Tropic_Q18DRY3)
   190        PTempTr = 358.0d0
   191      end select
   192  
   193      ! 混合比
   194      !
   195      select case (ID_BasicZ)
   196      case (ID_MidLat_Q10)
   197        QMixSfc = 0.010d0
   198      case (ID_MidLat_Q12)
   199        QMixSfc = 0.012d0
   200      case (ID_MidLat_Q14)
   201        QMixSfc = 0.014d0
   202      case (ID_MidLat_Q16:ID_MidLat_Q16DRY2)
   203        QMixSfc = 0.016d0
   204      case (ID_MidLat_Q18:ID_Tropic_Q18DRY3)
   205        QMixSfc = 0.018d0
   206      end select
   207  
   208      ! 湿度変化
   209      !
   210      select case (ID_BasicZ)
   211      case (ID_MidLat_Q16DRY1)
   212        DryFact = - 0.13d0
   213        Alt = 2.5d3
   214      case (ID_MidLat_Q16DRY2)
   215        DryFact = - 0.30d0
   216        Alt = 2.5d3
   217      case (ID_Tropic_Q18DRY1)
   218        DryFact = - 0.20d0
   219        Alt = 2.5d3
   220      case (ID_Tropic_Q18DRY2)
   221        DryFact = - 0.20d0
   222        Alt = 5.0d3
   223      case (ID_Tropic_Q18DRY3)
   224        DryFact = - 0.20d0
   225        Alt = 7.5d3
   226      end select
   227  
   228      do k = 1, nz
   229        if (z_Z(k) < AltTr .AND. AltTr <= z_Z(k+1)) then
   230          amax = k
   231        end if
   232        if (z_Z(k) < Alt .AND. Alt <= z_Z(k+1)) then
   233          amin = k
   234        end if
   235      end do
   236  
   237      ! 水平風速
   238      !
   239      select case (ID_Wind)
   240      case (ID_Wind_LowLevel)
   241        Alt1 = 0.0d0
   242        Alt2 = 2.5d3
   243      case (ID_Wind_MiddleLevel)
   244        Alt1 = 2.5d3
   245        Alt2 = 5.0d3
   246      case (ID_Wind_HighLevel)
   247        Alt1 = 5.0d3
   248        Alt2 = 7.5d3
   249      end select
   250  
   251    end subroutine initialdata_takemi2007_init
   252  
   253  
   254  !!!------------------------------------------------------------------------------!!!
   255    subroutine  initialdata_takemi2007_basic( z_Temp, z_Press, zf_MolFr )
   256      !
   257      !== 概要
   258      ! * deepconv の地球用のテスト計算としてTakemi(2007)の再現計算を
   259      !   するための湿度の基本場を作成する
   260      !   * 基本場の温度の式が温位で与えられているため, 温度に変換する必要がある
   261      !
   262  
   263      implicit none
   264  
   265      real(DP), intent(out):: z_Press(kmin:kmax)           !圧力
   266      real(DP), intent(out):: z_Temp(kmin:kmax)            !温度
   267      real(DP), intent(out):: zf_MolFr(kmin:kmax, 1:ncmax) !モル比
   268      real(DP) :: z_Hum(kmin:kmax)                         ! 相対湿度
   269      real(DP) :: z_PTemp(kmin:kmax)                       ! 温位
   270      real(DP) :: QMix
   271      integer  :: k
   272  
   273      !-------------------------------------------
   274      ! 初期化
   275      !
   276      z_Temp   = 1.0d-60
   277      z_PTemp  = 1.0d-60
   278      z_Press  = 1.0d-60
   279      z_Hum    = 0.0d0
   280      zf_MolFr = 0.0d0
     .  !CDIR    NODEP                                                          
     .  !CDIR NOASSUME                                                          
     .        do t273 = 1, ncmax*(kmax + 1 - kmin)                              
     .           zf_molfr(t32+t273-1,1) = 0.0000000000000000e+000               
     .        end do                                                            
   281  
   282  
   283      !----------------------------------------------
   284      ! 湿度
   285      !   論文中の式 (2) より計算
   286      !
   287      do k = 1, nz
   288        if (z_Z(k) <= AltTr) then
   289          z_Hum(k) = 1.0d0 - 0.75d0 * (z_Z(k) / AltTr) ** 1.25
   290        elseif (z_Z(k) > AltTr) then
   291          z_Hum(k) = HumMin
   292        end if
   293      end do
   294  
   295      ! Fig.2b は明らかに相対湿度が 95% 程度で打ち止めになっているので,
   296      ! 上限値を設けてみた
   297      !
   298      where (z_Hum > 0.95d0)
   299        z_Hum = 0.95d0
   300      end where
   301  
   302      ! DRY ケースの場合.
   303      !   DRY 以外では, DryFact = 0.0 になっている.
   304      !   相対湿度の下限値を下回らないよう調整している.
   305      !
   306      do k = 1, nz
   307        if (amin < k .AND. k <= amax) then
   308          z_Hum(k) = z_Hum(k) + DryFact
   309          if (z_Hum(k) <= HumMin) then
   310            z_Hum(k) = HumMin
   311          end if
   312        end if
   313      end do
   314  
   315      !----------------------------------------------
   316      ! 温位, 圧力, 温度
   317      !   温位は, 論文中の式 (1) より計算
   318      !
   319      !
   320      z_PTemp(1) = TempSfc + (PTempTr - TempSfc) * ((z_Z(1) / AltTr) ** 1.25)
   321      z_Press(1) = PressSfc - (Grav * PressSfc * z_dz(1) * 5.0d-1) / (GasRDry * TempSfc)
   322      z_Temp(1)  = z_PTemp(1) * (z_Press(1) / PressBasis) ** (GasRDry / CpDry)
   323  
   324      do k = 2, nz
   325        if (k <= amax) then
   326          z_PTemp(k) = TempSfc + (PTempTr - TempSfc) * ((z_Z(k) / AltTr) ** 1.25)
   327        elseif (k > amax) then
   328          z_PTemp(k) = z_PTemp(amax) * exp( Grav * (z_Z(k) - AltTr) / (CpDry * z_Temp(amax)))
   329        end if
   330  
   331        z_Press(k) = z_Press(k-1) - (Grav * z_Press(k-1) * z_dz(k-1)) / (GasRDry * z_Temp(k-1))
   332  
   333        z_Temp(k)  = z_PTemp(k) * ((z_Press(k) / PressBasis) ** (GasRDry / CpDry))
   334      end do
   335  
   336      !----------------------------------------------
   337      ! モル比
   338      !   論文中には, in the lowest 1.5km depth で混合比の値を設定するという
   339      !   記述があったが, Fig2b から判断するに, 式 (2) で与えられる相対湿度から
   340      !   混合比を計算し, それが地表での混合比 (nml で与える) を超えたら,
   341      !   地表での混合比と同じとしているのだろう.
   342      !
   343      do k = 1, nz
   344        zf_MolFr(k,1) = SvapPress(SpcID, z_Temp(k)) * z_Hum(k) / z_Press(k)
   345        QMix = zf_MolFr(k,1) / MolWtDry * MolWtWet(1)
   346  
   347        if (QMix > QMixSfc) then
   348          zf_MolFr(k,1) = QMixSfc * MolWtDry / MolWtWet(1)
   349        end if
   350      end do
   351  
   352    end subroutine Initialdata_takemi2007_basic
   353  
   354  
   355    subroutine initialdata_takemi2007_wind(pyz_VelX)
   356  
   357      !-------------------------------------------------------------!
   358      ! シアーの設定 (Takemi,2007)                                  !
   359      !-------------------------------------------------------------!
   360      !
   361      != 概要
   362      !* case "Takemi2007" での計算時に鉛直シアーのある風を与える時に使用する
   363      !* 風の与え方には, 以下のようなバリエーションがある
   364      !  (1) シアーを与える高度を変える
   365      !  (2) シアーのある風の最大風速 (U_s) を変える
   366      !
   367      !  (1) については, (a) 0 - 2.5 km, (b) 2.5 - 5.0 km, (c) 5.0 - 7.5 km の
   368      !  三パターンがある
   369      !  (2) については, Takemi (2007) では熱帯場と中緯度場の温度場毎に
   370      !  異なる値を設定している
   371      !
   372      !  その強度(Us)は, 以下の通り
   373      !  <熱帯場>   (1) 5 m/s, (2) 10 m/s, (3) 15 m/s
   374      !  <中緯度場> (1) 10 m/s, (2) 15 m/s, (3) 20 m/s
   375      !
   376      !* シアーの形の模式図 (Takemi, 2007)   |
   377      !                                     /| 7.5 km
   378      !                                    / |
   379      !                                   /  |
   380      !                                  / ←|
   381      !                                 ｜  /| 5.0 km
   382      !                                 ｜ / |
   383      !                                 ｜/  |
   384      !                                  / ←|
   385      !                                 ｜  /| 2.5 km
   386      !                                 ｜ / |
   387      !                                 ｜/  |
   388      !                                  / ←|
   389      !---------------------------------+------------- 0.0 km
   390      !                                Us (m/s)
   391      !
   392      implicit none
   393  
   394      real(DP), intent(out) :: pyz_VelX(imin:imax,jmin:jmax,kmin:kmax)
   395      integer :: k
   396  
   397      !初期化
   398      pyz_VelX = 0.0d0
     .  !CDIR    NODEP                                                          
     .  !CDIR NOASSUME                                                          
     .        do t99 = 1, (kmax + 1 - kmin)*(jmax + 1 - jmin)*(imax + 1 - imin) 
     .           pyz_velx(t6+t99-1,t8,t10) = 0.0000000000000000e+000            
     .        end do                                                            
   399  
   400      do k = 1, nz
   401        if (z_Z(k) <= Alt1) then
   402          pyz_VelX(:,:,k) = - VelXSfc
     .        if (jmax + 1 - jmin .gt. 0) then                                  
     .           J1 = and(jmax + 1 - jmin,3)                                    
     .  !CDIR    NODEP                                                          
     .           do t114 = 1, J1                                                
     .  !CDIR       NODEP                                                       
     .              do t116 = 1, imax - imin + 2 - min0(1,imax - imin + 1)      
     .                 pyz_velx(t6+t116-1,t114-1+t8,k) = -velxsfc               
     .              end do                                                      
     .           end do                                                         
     .  !CDIR    NODEP                                                          
     .           do t114 = J1 + 1, jmax + 1 - jmin, 4                           
     .  !CDIR       NODEP                                                       
     .              do t116 = 1, imax - imin + 2 - min0(1,imax - imin + 1)      
     .                 pyz_velx(t6+t116-1,t114-1+t8,k) = -velxsfc               
     .                 pyz_velx(t6+t116-1,t114+t8,k) = -velxsfc                 
     .                 pyz_velx(t6+t116-1,t114+1+t8,k) = -velxsfc               
     .                 pyz_velx(t6+t116-1,t114+2+t8,k) = -velxsfc               
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
     .        go to 10012                                                       
   403        elseif (z_Z(k) > Alt1 .AND. z_Z(k) <= Alt2) then
   404          pyz_VelX(:,:,k) = - VelXSfc + (VelXSfc / (Alt2 - Alt1)) * (z_Z(k) - Alt1)
     .  !CDIR NODEP                                                             
     .  !CDIR NOASSUME                                                          
     .        do t108 = 1, (jmax + 1 - jmin)*(imax + 1 - imin)                  
     .           pyz_velx(t6+t108-1,t8,k) = velxsfc/(alt2 - alt1)*(z_z(k)-alt1) 
     .       1       - velxsfc                                                  
     .        end do                                                            
   405        end if
   406      end do
   407      write(*,*) VelXSfc, Alt1, Alt2
   408  
   409    end subroutine initialdata_takemi2007_wind
   410  
   411  end module initialdata_takemi2007
Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:35:25 2011
FILE NAME: initialdata_takemi2007.f90
PROGRAM NAME: initialdata_takemi2007
FORMAT LIST

  LINE    LOOP     FORTRAN STATEMENT

     1:            != Module BasicEnvInit
     2:            !
     3:            ! Authors::   SUGIYAMA Koichiro, ODAKA Masatsugu
     4:            ! Version::   $Id: initialdata_takemi2007.f90,v 1.6 2011-06-21 06:14:51 sugiyama Exp $
     5:            ! Tag Name::  $Name: arare5-20111010 $
     6:            ! Copyright:: Copyright (C) GFD Dennou Club, 2006. All rights reserved.
     7:            ! License::   See COPYRIGHT[link:../../COPYRIGHT]
     8:            !
     9:            !== Overview 
    10:            !
    11:            !デフォルトの基本場を設定するための変数参照型モジュール
    12:            !   * BasicEnvFile_init: 基本場の値を netCDF ファイルから取得
    13:            !   * BasicEnvCalc_Init: 基本場の情報を Namelist から取得して値を計算
    14:            !
    15:            !== Error Handling
    16:            !
    17:            !== Known Bugs
    18:            !
    19:            !== Note
    20:            !
    21:            !== Future Plans
    22:            !
    23:            module initialdata_takemi2007
    24:              !
    25:              !デフォルトの基本場を設定するためのサブルーチン. 
    26:              !基本場を計算し, BasicSet モジュールの値を初期化する. 
    27:              !
    28:              !コンパイルの順序の問題から, 基本場の値(hogeBasicZ な変数)を
    29:              !計算する部分をBasicSet モジュールから切り離している. 
    30:              !ECCM 始め, BasicSet 自体に依存するが hogeBasicZ は use しない
    31:              !外部サブルーチンを利用するためである. 
    32:              !
    33:            
    34:              !モジュール読み込み
    35:              use dc_types,   only: STRING, DP
    36:              use dc_iounit,   only : FileOpen      
    37:              use dc_message, only: MessageNotify
    38:              use mpi_wrapper, only: myrank         
    39:              use namelist_util, only: namelist_filename
    40:              use gridset,  only: imin,       &!配列の X 方向の下限
    41:                &                 imax,       &!配列の X 方向の上限
    42:                &                 jmin,       &!配列の Y 方向の下限
    43:                &                 jmax,       &!配列の Y 方向の上限
    44:                &                 kmin,       &!配列の Z 方向の下限
    45:                &                 kmax,       &!配列の Z 方向の上限
    46:                &                 ncmax,      &!凝縮成分の数
    47:                &                 nz
    48:              use axesset, only:  z_Z,        &!スカラー格子点での高度
    49:                &                 z_dz         !Z 方向の格子点間隔
    50:              use constants, only: &
    51:                &                 PressBasis,    &!温位の基準圧力
    52:                &                 GasRDry,       &!乾燥成分の定圧比熱
    53:                &                 CpDry,         &!乾燥成分の定圧比熱
    54:                &                 Grav,          &!重力加速度
    55:                &                 TempSfc,       &!地表面温度
    56:                &                 PressSfc,      &!地表面圧力
    57:                &                 MolWtDry  
    58:              use composition, only: MolWtWet
    59:              use chemcalc, only: SvapPress       !
    60:             
    61:              !暗黙の型宣言禁止
    62:              implicit none
    63:            
    64:              !デフォルトは private
    65:              private
    66:            
    67:              real(DP), parameter :: PressSfcTakemi = 1.0d5   ! 地表の圧力
    68:              real(DP), parameter :: PTempSfcTakemi = 300.0d0 ! 地表の温位
    69:              real(DP), parameter :: AltTr    = 1.2d4   ! 対流圏界面高度
    70:              real(DP), parameter :: HumMin   = 0.25d0  ! 混合比一定な高度
    71:              integer,  parameter :: SpcID = 6          ! 水の番号
    72:              real(DP), save      :: QMixSfc            ! 地表面でのモル比
    73:              real(DP), save      :: VelXSfc            ! 地表の速度
    74:              real(DP), save      :: PTempTr = 0.0d0    ! 
    75:              real(DP), save      :: DryFact = 0.0d0    ! 
    76:              real(DP), save      :: Alt1    = 0.0d0    ! 
    77:              real(DP), save      :: Alt2    = 0.0d0    ! 
    78:              integer,  save      :: amin, amax
    79:            
    80:            
    81:              !初期化だけ公開
    82:              public  initialdata_takemi2007_init
    83:              public  initialdata_takemi2007_basic
    84:              public  initialdata_takemi2007_wind
    85:            
    86:            contains
    87:            
    88:            !!!------------------------------------------------------------------------------!!!
    89:              subroutine initialdata_takemi2007_init
    90:                !
    91:                !設定ファイルから出力ファイルに記載する情報を読み込む
    92:                !
    93:                
    94:                !暗黙の型宣言禁止
    95:                implicit none
    96:                
    97:                !内部変数
    98:                real(DP)            :: Alt     !高度
    99:                integer             :: unit     !設定ファイル用装置番号  
   100:                integer             :: k
   101:                integer  :: ID_BasicZ = 0
   102:                integer  :: ID_Wind   = 0
   103:                integer, parameter  :: ID_MidLat_Q10     = 1
   104:                integer, parameter  :: ID_MidLat_Q12     = 2
   105:                integer, parameter  :: ID_MidLat_Q14     = 3
   106:                integer, parameter  :: ID_MidLat_Q16     = 4
   107:                integer, parameter  :: ID_MidLat_Q16DRY1 = 5
   108:                integer, parameter  :: ID_MidLat_Q16DRY2 = 6
   109:                integer, parameter  :: ID_MidLat_Q18     = 7
   110:                integer, parameter  :: ID_Tropic_Q18     = 8
   111:                integer, parameter  :: ID_Tropic_Q18DRY1 = 9
   112:                integer, parameter  :: ID_Tropic_Q18DRY2 = 10
   113:                integer, parameter  :: ID_Tropic_Q18DRY3 = 11
   114:                integer, parameter  :: ID_Wind_LowLevel    = 1
   115:                integer, parameter  :: ID_Wind_MiddleLevel = 2
   116:                integer, parameter  :: ID_Wind_HighLevel   = 3
   117:            
   118:                character(STRING)  :: FlagEnv = ""
   119:                character(STRING)  :: FlagWind = ""
   120:            
   121:            
   122:                !設定ファイルから読み込む出力ファイル情報
   123:                NAMELIST /initialdata_takemi2007_nml/ FlagEnv, FlagWind, VelXSfc
   124:                
   125:                !設定ファイルから出力ファイルに記載する情報を読み込む
   126:                call FileOpen(unit, file=namelist_filename, mode='r')
   127:                read(unit, NML=initialdata_takemi2007_nml)
   128:                close(unit)
   129:            
   130:                ! 確認. 地表面温度・圧力を指定するのは別モジュールなので. 
   131:                !
   132:                if (myrank == 0) then 
   133:                  if (     PressBasis /= PressSfcTakemi &
   134:                    & .OR. PressSfc /= PressSfcTakemi   &
   135:                    & .OR. TempSfc  /= PTempSfcTakemi  ) then 
   136:            
   137:                    call MessageNotify( "E", "initaldata_takemi2007_init", &
   138:                      & "Constants are wrong. please PressSfc = 1.0d5, TempSfc = 300.0d0")
   139:                  end if
   140:                end if
   141:            
   142:                if (myrank == 0) then 
   143:                  call MessageNotify( "M", "initaldata_takemi2007_init", &
   144:                    & "VelXSfc= %f", d=(/VelXSfc/) ) 
   145:                end if
   146:            
   147:            
   148:                !基本場の選択
   149:                !
   150:                if (FlagEnv == "MidLat_Q10") then 
   151:                  ID_BasicZ = ID_MidLat_Q10
   152:                elseif (FlagEnv == "MidLat_Q12") then 
   153:                  ID_BasicZ = ID_MidLat_Q12
   154:                elseif (FlagEnv == "MidLat_Q14") then 
   155:                  ID_BasicZ = ID_MidLat_Q14
   156:                elseif (FlagEnv == "MidLat_Q16") then 
   157:                  ID_BasicZ = ID_MidLat_Q16
   158:                elseif (FlagEnv == "MidLat_Q16DRY1") then 
   159:                  ID_BasicZ = ID_MidLat_Q16DRY1
   160:                elseif (FlagEnv == "MidLat_Q16DRY2") then 
   161:                  ID_BasicZ = ID_MidLat_Q16DRY2
   162:                elseif (FlagEnv == "MidLat_Q18") then 
   163:                  ID_BasicZ = ID_MidLat_Q18
   164:                elseif (FlagEnv == "Tropic_Q18") then 
   165:                  ID_BasicZ = ID_Tropic_Q18
   166:                elseif (FlagEnv == "Tropic_Q18DRY1") then 
   167:                  ID_BasicZ = ID_Tropic_Q18DRY1
   168:                elseif (FlagEnv == "Tropic_Q18DRY2") then 
   169:                  ID_BasicZ = ID_Tropic_Q18DRY2
   170:                elseif (FlagEnv == "Tropic_Q18DRY3") then 
   171:                  ID_BasicZ = ID_Tropic_Q18DRY3
   172:                end if
   173:            
   174:                ! 速度場の選択
   175:                !
   176:                if (FlagWind == "LowLevel") then 
   177:                  ID_Wind = ID_Wind_LowLevel
   178:                elseif (FlagWind == "MiddleLevel") then 
   179:                  ID_Wind = ID_Wind_MiddleLevel
   180:                elseif (FlagWind == "HighLevel") then 
   181:                  ID_Wind = ID_Wind_HighLevel
   182:                end if
   183:            
   184:                ! 温位場
   185:                !
   186:                select case (ID_BasicZ)
   187:                case (ID_MidLat_Q10:ID_MidLat_Q18)
   188:                  PTempTr = 343.0d0
   189:                case (ID_Tropic_Q18:ID_Tropic_Q18DRY3)
   190:                  PTempTr = 358.0d0
   191:                end select
   192:            
   193:                ! 混合比
   194:                !
   195:                select case (ID_BasicZ)
   196:                case (ID_MidLat_Q10) 
   197:                  QMixSfc = 0.010d0
   198:                case (ID_MidLat_Q12) 
   199:                  QMixSfc = 0.012d0
   200:                case (ID_MidLat_Q14) 
   201:                  QMixSfc = 0.014d0
   202:                case (ID_MidLat_Q16:ID_MidLat_Q16DRY2) 
   203:                  QMixSfc = 0.016d0
   204:                case (ID_MidLat_Q18:ID_Tropic_Q18DRY3)
   205:                  QMixSfc = 0.018d0
   206:                end select
   207:            
   208:                ! 湿度変化
   209:                !
   210:                select case (ID_BasicZ)
   211:                case (ID_MidLat_Q16DRY1)
   212:                  DryFact = - 0.13d0
   213:                  Alt = 2.5d3
   214:                case (ID_MidLat_Q16DRY2)
   215:                  DryFact = - 0.30d0
   216:                  Alt = 2.5d3
   217:                case (ID_Tropic_Q18DRY1)
   218:                  DryFact = - 0.20d0
   219:                  Alt = 2.5d3
   220:                case (ID_Tropic_Q18DRY2)
   221:                  DryFact = - 0.20d0
   222:                  Alt = 5.0d3
   223:                case (ID_Tropic_Q18DRY3)
   224:                  DryFact = - 0.20d0
   225:                  Alt = 7.5d3
   226:                end select
   227:            
   228: V------>       do k = 1, nz
   229: |                if (z_Z(k) < AltTr .AND. AltTr <= z_Z(k+1)) then 
   230: |                  amax = k
   231: |                end if
   232: |                if (z_Z(k) < Alt .AND. Alt <= z_Z(k+1)) then 
   233: |                  amin = k
   234: |                end if
   235: V------        end do
   236:            
   237:                ! 水平風速
   238:                !
   239:                select case (ID_Wind)
   240:                case (ID_Wind_LowLevel) 
   241:                  Alt1 = 0.0d0
   242:                  Alt2 = 2.5d3
   243:                case (ID_Wind_MiddleLevel)
   244:                  Alt1 = 2.5d3
   245:                  Alt2 = 5.0d3
   246:                case (ID_Wind_HighLevel)
   247:                  Alt1 = 5.0d3
   248:                  Alt2 = 7.5d3
   249:                end select
   250:            
   251:              end subroutine initialdata_takemi2007_init
   252:            
   253:            
   254:            !!!------------------------------------------------------------------------------!!!
   255:              subroutine  initialdata_takemi2007_basic( z_Temp, z_Press, zf_MolFr )
   256:                !
   257:                !== 概要
   258:                ! * deepconv の地球用のテスト計算としてTakemi(2007)の再現計算を
   259:                !   するための湿度の基本場を作成する
   260:                !   * 基本場の温度の式が温位で与えられているため, 温度に変換する必要がある
   261:                !
   262:                
   263:                implicit none
   264:            
   265:                real(DP), intent(out):: z_Press(kmin:kmax)           !圧力
   266:                real(DP), intent(out):: z_Temp(kmin:kmax)            !温度
   267:                real(DP), intent(out):: zf_MolFr(kmin:kmax, 1:ncmax) !モル比
   268:                real(DP) :: z_Hum(kmin:kmax)                         ! 相対湿度
   269:                real(DP) :: z_PTemp(kmin:kmax)                       ! 温位
   270:                real(DP) :: QMix
   271:                integer  :: k
   272:            
   273:                !-------------------------------------------
   274:                ! 初期化
   275:                !
   276: V------>       z_Temp   = 1.0d-60
   277: |              z_PTemp  = 1.0d-60
   278: |              z_Press  = 1.0d-60
   279: V------        z_Hum    = 0.0d0
   280: W*=====        zf_MolFr = 0.0d0
   281:            
   282:            
   283:                !----------------------------------------------
   284:                ! 湿度
   285:                !   論文中の式 (2) より計算
   286:                !    
   287: V------>       do k = 1, nz
   288: |                if (z_Z(k) <= AltTr) then 
   289: |                  z_Hum(k) = 1.0d0 - 0.75d0 * (z_Z(k) / AltTr) ** 1.25
   290: |                elseif (z_Z(k) > AltTr) then 
   291: |                  z_Hum(k) = HumMin
   292: |                end if
   293: V------        end do
   294:            
   295:                ! Fig.2b は明らかに相対湿度が 95% 程度で打ち止めになっているので, 
   296:                ! 上限値を設けてみた
   297:                !
   298: V------>       where (z_Hum > 0.95d0) 
   299: V------          z_Hum = 0.95d0
   300:                end where
   301:                
   302:                ! DRY ケースの場合. 
   303:                !   DRY 以外では, DryFact = 0.0 になっている. 
   304:                !   相対湿度の下限値を下回らないよう調整している.
   305:                !
   306: V------>       do k = 1, nz
   307: |                if (amin < k .AND. k <= amax) then
   308: |                  z_Hum(k) = z_Hum(k) + DryFact
   309: |                  if (z_Hum(k) <= HumMin) then 
   310: |                    z_Hum(k) = HumMin
   311: |                  end if
   312: |                end if
   313: V------        end do
   314:            
   315:                !----------------------------------------------
   316:                ! 温位, 圧力, 温度
   317:                !   温位は, 論文中の式 (1) より計算
   318:                !
   319:                !    
   320:                z_PTemp(1) = TempSfc + (PTempTr - TempSfc) * ((z_Z(1) / AltTr) ** 1.25)
   321:                z_Press(1) = PressSfc - (Grav * PressSfc * z_dz(1) * 5.0d-1) / (GasRDry * TempSfc)
   322:                z_Temp(1)  = z_PTemp(1) * (z_Press(1) / PressBasis) ** (GasRDry / CpDry)
   323:            
   324: +------>       do k = 2, nz
   325: |                if (k <= amax) then 
   326: |                  z_PTemp(k) = TempSfc + (PTempTr - TempSfc) * ((z_Z(k) / AltTr) ** 1.25)
   327: |                elseif (k > amax) then 
   328: |                  z_PTemp(k) = z_PTemp(amax) * exp( Grav * (z_Z(k) - AltTr) / (CpDry * z_Temp(amax)))
   329: |                end if
   330: |          
   331: |                z_Press(k) = z_Press(k-1) - (Grav * z_Press(k-1) * z_dz(k-1)) / (GasRDry * z_Temp(k-1))
   332: |                
   333: |                z_Temp(k)  = z_PTemp(k) * ((z_Press(k) / PressBasis) ** (GasRDry / CpDry))
   334: +------        end do
   335:                
   336:                !----------------------------------------------
   337:                ! モル比
   338:                !   論文中には, in the lowest 1.5km depth で混合比の値を設定するという
   339:                !   記述があったが, Fig2b から判断するに, 式 (2) で与えられる相対湿度から
   340:                !   混合比を計算し, それが地表での混合比 (nml で与える) を超えたら, 
   341:                !   地表での混合比と同じとしているのだろう. 
   342:                !
   343: +------>       do k = 1, nz
   344: |                zf_MolFr(k,1) = SvapPress(SpcID, z_Temp(k)) * z_Hum(k) / z_Press(k)
   345: |                QMix = zf_MolFr(k,1) / MolWtDry * MolWtWet(1)
   346: |                
   347: |                if (QMix > QMixSfc) then 
   348: |                  zf_MolFr(k,1) = QMixSfc * MolWtDry / MolWtWet(1)
   349: |                end if
   350: +------        end do
   351:                
   352:              end subroutine Initialdata_takemi2007_basic
   353:            
   354:            
   355:              subroutine initialdata_takemi2007_wind(pyz_VelX)
   356:            
   357:                !-------------------------------------------------------------!
   358:                ! シアーの設定 (Takemi,2007)                                  !
   359:                !-------------------------------------------------------------!
   360:                !
   361:                != 概要
   362:                !* case "Takemi2007" での計算時に鉛直シアーのある風を与える時に使用する
   363:                !* 風の与え方には, 以下のようなバリエーションがある
   364:                !  (1) シアーを与える高度を変える
   365:                !  (2) シアーのある風の最大風速 (U_s) を変える
   366:                !
   367:                !  (1) については, (a) 0 - 2.5 km, (b) 2.5 - 5.0 km, (c) 5.0 - 7.5 km の
   368:                !  三パターンがある
   369:                !  (2) については, Takemi (2007) では熱帯場と中緯度場の温度場毎に
   370:                !  異なる値を設定している
   371:                !
   372:                !  その強度(Us)は, 以下の通り
   373:                !  <熱帯場>   (1) 5 m/s, (2) 10 m/s, (3) 15 m/s
   374:                !  <中緯度場> (1) 10 m/s, (2) 15 m/s, (3) 20 m/s
   375:                !
   376:                !* シアーの形の模式図 (Takemi, 2007)   |
   377:                !                                     /| 7.5 km
   378:                !                                    / |
   379:                !                                   /  |
   380:                !                                  / ←|
   381:                !                                 ｜  /| 5.0 km
   382:                !                                 ｜ / |
   383:                !                                 ｜/  |
   384:                !                                  / ←|
   385:                !                                 ｜  /| 2.5 km
   386:                !                                 ｜ / |
   387:                !                                 ｜/  |
   388:                !                                  / ←|
   389:                !---------------------------------+------------- 0.0 km
   390:                !                                Us (m/s)
   391:                !
   392:                implicit none
   393:            
   394:                real(DP), intent(out) :: pyz_VelX(imin:imax,jmin:jmax,kmin:kmax)
   395:                integer :: k
   396:                
   397:                !初期化
   398: W**====        pyz_VelX = 0.0d0
   399:                
   400: +------>       do k = 1, nz
   401: |                if (z_Z(k) <= Alt1) then 
   402: |+V====            pyz_VelX(:,:,k) = - VelXSfc
   403: |                elseif (z_Z(k) > Alt1 .AND. z_Z(k) <= Alt2) then 
   404: |W*====            pyz_VelX(:,:,k) = - VelXSfc + (VelXSfc / (Alt2 - Alt1)) * (z_Z(k) - Alt1)
   405: |                end if
   406: +------        end do
   407:                write(*,*) VelXSfc, Alt1, Alt2
   408:                
   409:              end subroutine initialdata_takemi2007_wind
   410:              
   411:            end module initialdata_takemi2007
