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

  LINE  LEVEL( NO.): DIAGNOSTIC MESSAGE

    89  vec  (   3): Unvectorized loop.
   121  vec  (   1): Vectorized loop.
   151  vec  (   2): Partially vectorized loop.
Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:35:23 2011
FILE NAME: initialdata_toon2002.f90
PROGRAM NAME: initialdata_toon2002
TRANSFORMATION LIST

  LINE                   FORTRAN STATEMENT

     1  != Module BasicEnvInit
     2  !
     3  ! Authors::   SUGIYAMA Koichiro, ODAKA Masatsugu
     4  ! Version::   $Id: initialdata_toon2002.f90,v 1.2 2011-06-25 14:47:29 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_Toon2002
    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 gridset,  only: kmin,       &!配列の Z 方向の下限
    40      &                 kmax,       &!配列の Z 方向の上限
    41      &                 nz
    42    use axesset, only:  z_Z,        &!スカラー格子点での高度
    43      &                 z_dz         !Z 方向の格子点間隔
    44    use constants, only: &
    45      &                 GasRDry,       &!乾燥成分の定圧比熱
    46      &                 CpDry,         &!乾燥成分の定圧比熱
    47      &                 Grav,          &!重力加速度
    48      &                 TempSfc,       &!地表面温度
    49      &                 PressSfc        !地表面圧力
    50  
    51    !暗黙の型宣言禁止
    52    implicit none
    53  
    54    !デフォルトは private
    55    private
    56  
    57    real(DP), parameter  :: AntA    = 27.4d0
    58    real(DP), parameter  :: AntB    = 3103.0d0
    59    real(DP), parameter  :: TempLTP = 135.0d0
    60    real(DP), parameter  :: Dhight  = 6.0d2
    61  
    62    !初期化だけ公開
    63    public  initialdata_Toon2002_basic
    64  
    65  contains
    66  
    67  !!!------------------------------------------------------------------------------!!!
    68  
    69    subroutine initialdata_toon2002_basic( z_Temp, z_Press )
    70  
    71      implicit none
    72  
    73      real(DP), intent(out):: z_Press(kmin:kmax)           !圧力
    74      real(DP), intent(out):: z_Temp(kmin:kmax)            !温度
    75      real(DP)             :: TempLCL
    76      real(DP)             :: Temp_0,  Temp_1
    77      real(DP)             :: Press_0, Press_1
    78      real(DP)             :: Weight1, Weight2
    79      real(DP)             :: LCL, LTP
    80      integer              :: k
    81  
    82  
    83      ! 乾燥断熱線, 湿潤断熱線, 等温線が交わる高度を計算し,
    84      ! 各領域で成り立つ式を用いて温度, 圧力を計算
    85      ! 乾燥断熱線と湿潤断熱線が交わる高度(LCL)を反復法で計算
    86      !
    87      Press_0 = PressSfc
    88      Temp_0 = TempSfc
    89      do
    90        ! 飽和温度 (press0 に対する): 最初は地表面での飽和温度.
    91        ! ln(p) = A - B/T
    92        Temp_1 = AntB / (AntA - dlog(Press_0))
    93  
    94        ! 乾燥断熱的に決めた圧力
    95        !
    96        Press_1 = PressSfc * (Temp_1/TempSfc) **(CpDry / GasRDry)
    97  
    98        ! 絶対誤差が閾値より小さくなれば終了.
    99        !
   100        if (abs(Temp_1 - Temp_0) < epsilon(0.0d0)) then
   101          LCL = (TempSfc * CpDry) / Grav &
   102            & * (1.0d0 - (Press_1 / PressSfc)**(GasRDry / CpDry))
   103          TempLCL = temp_1
   104  
   105          exit
   106        else
   107          Temp_0 = Temp_1
   108          Press_0 = Press_1
   109        end if
   110      end do
   111  
   112  
   113      ! 湿潤断熱線と等温線が交わる高度(LTP)を計算
   114      !
   115      LTP = LCL + GasRDry * AntB / Grav * dlog(TempLCL / TempLTP)
   116  
   117      ! 温度圧力を決める.
   118      !
   119      z_Temp(1)  = TempSfc  - Grav * z_Z(1) / CpDry
   120      z_Press(1) = PressSfc - (Grav * PressSfc * z_dz(1) * 5.0d-1) / (GasRDry * TempSfc)
   121      do k = 2, nz
   122  
   123        !重みつけの関数を用意. tanh を用いる
   124        Weight1 = ( tanh( (z_Z(k) - LCL ) / Dhight ) + 1.0d0 ) * 5.0d-1
   125  
   126        !重みつけの関数を用意. tanh を用いる
   127        Weight2 = ( tanh( (z_Z(k) - LTP ) / Dhight ) + 1.0d0 ) * 5.0d-1
   128  
   129        !乾燥断熱
   130        if (z_z(k) < LCL) then
   131          z_Temp(k) = TempSfc - Grav * z_Z(k) / CpDry
   132  
   133        !湿潤断熱
   134        elseif (z_z(k) >= LCL .AND. z_z(k) < LTP) then
   135          Temp_0 = TempSfc - Grav * z_Z(k) / CpDry
   136          Temp_1 = TempLCL * exp(-Grav * (z_Z(k) - LCL) / (GasRDry * AntB))
   137          z_Temp(k) = Temp_0 * ( 1.0d0 - Weight1 ) + Temp_1 * Weight1
   138  !        z_Temp(k)  = TempLCL * exp(-Grav * (z_Z(k) - LCL) / (GasRDry * AntB))
   139  
   140        !等温
   141        elseif (z_z(k) >= LTP) then
   142          Temp_0 = TempLCL * exp(-Grav * (z_Z(k) - LCL) / (GasRDry * AntB))
   143          z_Temp(k) = Temp_0 * ( 1.0d0 - Weight2 ) + TempLTP * Weight2
   144  !        z_Temp(k) = TempLTP
   145  
   146        end if
   147      end do
     .        D1 = 1.D0/6.00000000000000e+002                                   
     .        D2 = 1.D0/6.00000000000000e+002                                   
     .  !CDIR NODEP                                                             
     .        do k = 1, nz - 1                                                  
     .           weight1 = (dtanh((z_z(1+k)-lcl)*D1)+1.00000000000000e+000)*    
     .       1      5.00000000000000e-001                                       
     .           weight2 = (dtanh((z_z(1+k)-ltp)*D2)+1.00000000000000e+000)*    
     .       1      5.00000000000000e-001                                       
     .           if (z_z(1+k) .lt. lcl) then                                    
     .              z_temp(1+k) = tempsfc - grav*z_z(1+k)/cpdry                 
     .           else                                                           
     .              if (z_z(1+k).ge.lcl .and. z_z(1+k).lt.ltp) then             
     .                 temp_0 = tempsfc - grav*z_z(1+k)/cpdry                   
     .                 temp_1 = templcl*dexp((-grav*(z_z(1+k)-lcl)/(gasrdry*    
     .       1            3.10300000000000e+003)))                              
     .                 z_temp(1+k) = temp_0*(1.00000000000000e+000 - weight1) + 
     .       1            temp_1*weight1                                        
     .              else                                                        
     .                 if (z_z(1+k) .ge. ltp) then                              
     .                    temp_0 = templcl*dexp((-grav*(z_z(1+k)-lcl)/(gasrdry* 
     .       1               3.10300000000000e+003)))                           
     .                    z_temp(1+k) = temp_0*(1.00000000000000e+000 - weight2)
     .       1                + 1.35000000000000e+002*weight2                   
     .                 endif                                                    
     .              endif                                                       
     .           endif                                                          
     .        end do                                                            
   148  
   149      ! 静水圧平衡から圧力を決める
   150      !
   151      do k = 2, nz
   152        z_Press(k) = z_Press(k-1) - (Grav * z_Press(k-1) * z_dz(k-1)) &
   153          & / ( GasRDry * z_Temp(k-1) )
   154      end do
   155  
   156  
   157    end subroutine initialdata_toon2002_basic
   158  
   159  end module initialdata_Toon2002
Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:35:23 2011
FILE NAME: initialdata_toon2002.f90
PROGRAM NAME: initialdata_toon2002
FORMAT LIST

  LINE    LOOP     FORTRAN STATEMENT

     1:            != Module BasicEnvInit
     2:            !
     3:            ! Authors::   SUGIYAMA Koichiro, ODAKA Masatsugu
     4:            ! Version::   $Id: initialdata_toon2002.f90,v 1.2 2011-06-25 14:47:29 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_Toon2002
    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 gridset,  only: kmin,       &!配列の Z 方向の下限
    40:                &                 kmax,       &!配列の Z 方向の上限
    41:                &                 nz
    42:              use axesset, only:  z_Z,        &!スカラー格子点での高度
    43:                &                 z_dz         !Z 方向の格子点間隔
    44:              use constants, only: &
    45:                &                 GasRDry,       &!乾燥成分の定圧比熱
    46:                &                 CpDry,         &!乾燥成分の定圧比熱
    47:                &                 Grav,          &!重力加速度
    48:                &                 TempSfc,       &!地表面温度
    49:                &                 PressSfc        !地表面圧力
    50:             
    51:              !暗黙の型宣言禁止
    52:              implicit none
    53:            
    54:              !デフォルトは private
    55:              private
    56:            
    57:              real(DP), parameter  :: AntA    = 27.4d0 
    58:              real(DP), parameter  :: AntB    = 3103.0d0
    59:              real(DP), parameter  :: TempLTP = 135.0d0
    60:              real(DP), parameter  :: Dhight  = 6.0d2
    61:            
    62:              !初期化だけ公開
    63:              public  initialdata_Toon2002_basic
    64:            
    65:            contains
    66:            
    67:            !!!------------------------------------------------------------------------------!!!
    68:            
    69:              subroutine initialdata_toon2002_basic( z_Temp, z_Press )
    70:            
    71:                implicit none
    72:                
    73:                real(DP), intent(out):: z_Press(kmin:kmax)           !圧力
    74:                real(DP), intent(out):: z_Temp(kmin:kmax)            !温度
    75:                real(DP)             :: TempLCL
    76:                real(DP)             :: Temp_0,  Temp_1
    77:                real(DP)             :: Press_0, Press_1
    78:                real(DP)             :: Weight1, Weight2
    79:                real(DP)             :: LCL, LTP
    80:                integer              :: k
    81:                
    82:            
    83:                ! 乾燥断熱線, 湿潤断熱線, 等温線が交わる高度を計算し,
    84:                ! 各領域で成り立つ式を用いて温度, 圧力を計算
    85:                ! 乾燥断熱線と湿潤断熱線が交わる高度(LCL)を反復法で計算
    86:                !
    87:                Press_0 = PressSfc
    88:                Temp_0 = TempSfc
    89: +------>       do
    90: |                ! 飽和温度 (press0 に対する): 最初は地表面での飽和温度.
    91: |                ! ln(p) = A - B/T
    92: |                Temp_1 = AntB / (AntA - dlog(Press_0))
    93: |                
    94: |                ! 乾燥断熱的に決めた圧力 
    95: |                !
    96: |                Press_1 = PressSfc * (Temp_1/TempSfc) **(CpDry / GasRDry)
    97: |          
    98: |                ! 絶対誤差が閾値より小さくなれば終了. 
    99: |                !
   100: |                if (abs(Temp_1 - Temp_0) < epsilon(0.0d0)) then
   101: |                  LCL = (TempSfc * CpDry) / Grav &
   102: |                    & * (1.0d0 - (Press_1 / PressSfc)**(GasRDry / CpDry))
   103: |                  TempLCL = temp_1
   104: |          
   105: |                  exit
   106: |                else
   107: |                  Temp_0 = Temp_1
   108: |                  Press_0 = Press_1
   109: |                end if
   110: +------        end do
   111:            
   112:            
   113:                ! 湿潤断熱線と等温線が交わる高度(LTP)を計算
   114:                !
   115:                LTP = LCL + GasRDry * AntB / Grav * dlog(TempLCL / TempLTP)
   116:              
   117:                ! 温度圧力を決める.
   118:                !
   119:                z_Temp(1)  = TempSfc  - Grav * z_Z(1) / CpDry 
   120:                z_Press(1) = PressSfc - (Grav * PressSfc * z_dz(1) * 5.0d-1) / (GasRDry * TempSfc)
   121: V------>       do k = 2, nz
   122: |          
   123: |                !重みつけの関数を用意. tanh を用いる
   124: |                Weight1 = ( tanh( (z_Z(k) - LCL ) / Dhight ) + 1.0d0 ) * 5.0d-1
   125: |          
   126: |                !重みつけの関数を用意. tanh を用いる
   127: |                Weight2 = ( tanh( (z_Z(k) - LTP ) / Dhight ) + 1.0d0 ) * 5.0d-1
   128: |          
   129: |                !乾燥断熱
   130: |                if (z_z(k) < LCL) then 
   131: |                  z_Temp(k) = TempSfc - Grav * z_Z(k) / CpDry 
   132: |          
   133: |                !湿潤断熱
   134: |                elseif (z_z(k) >= LCL .AND. z_z(k) < LTP) then 
   135: |                  Temp_0 = TempSfc - Grav * z_Z(k) / CpDry 
   136: |                  Temp_1 = TempLCL * exp(-Grav * (z_Z(k) - LCL) / (GasRDry * AntB))
   137: |                  z_Temp(k) = Temp_0 * ( 1.0d0 - Weight1 ) + Temp_1 * Weight1
   138: |          !        z_Temp(k)  = TempLCL * exp(-Grav * (z_Z(k) - LCL) / (GasRDry * AntB))
   139: |          
   140: |                !等温
   141: |                elseif (z_z(k) >= LTP) then 
   142: |                  Temp_0 = TempLCL * exp(-Grav * (z_Z(k) - LCL) / (GasRDry * AntB))
   143: |                  z_Temp(k) = Temp_0 * ( 1.0d0 - Weight2 ) + TempLTP * Weight2
   144: |          !        z_Temp(k) = TempLTP
   145: |          
   146: |                end if
   147: V------        end do
   148:            
   149:                ! 静水圧平衡から圧力を決める
   150:                !
   151: V------>       do k = 2, nz
   152: |       S        z_Press(k) = z_Press(k-1) - (Grav * z_Press(k-1) * z_dz(k-1)) &
   153: |                  & / ( GasRDry * z_Temp(k-1) )
   154: V------        end do
   155:            
   156:            
   157:              end subroutine initialdata_toon2002_basic
   158:              
   159:            end module initialdata_Toon2002
