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

  LINE  LEVEL( NO.): DIAGNOSTIC MESSAGE

   139  opt  (  11): Fused array assignments. :line 139 - 140
   139  vec  (   6): Unvectorized array expression.
   150  vec  (   6): Unvectorized array expression.
   150  vec  (   4): Vectorized array expression.
   159  vec  (   3): Unvectorized loop.
   171  vec  (   3): Unvectorized loop.
   176  vec  (   1): Vectorized loop.
   185  vec  (   3): Unvectorized loop.
   226  vec  (   3): Unvectorized loop.
   232  vec  (   3): Unvectorized loop.
   249  vec  (   3): Unvectorized loop.
   255  vec  (   3): Unvectorized loop.
   273  vec  (   1): Vectorized loop.
   301  vec  (   4): Vectorized array expression.
   302  vec  (   4): Vectorized array expression.
   303  vec  (   4): Vectorized array expression.
   304  vec  (   4): Vectorized array expression.
   305  vec  (   4): Vectorized array expression.
   306  vec  (   4): Vectorized array expression.
   307  vec  (   4): Vectorized array expression.
   308  vec  (   4): Vectorized array expression.
   310  vec  (   3): Unvectorized loop.
Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:33:37 2011
FILE NAME: composition.f90
PROGRAM NAME: composition
TRANSFORMATION LIST

  LINE                   FORTRAN STATEMENT

     1  != Module Composition
     2  !
     3  ! Authors::   SUGIYAMA Ko-ichiro
     4  ! Version::   $Id: composition.f90,v 1.4 2011-06-21 07:24:22 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  !
    13  !== Error Handling
    14  !
    15  !== Known Bugs
    16  !
    17  !== Note
    18  !
    19  !== Future Plans
    20  !
    21  
    22  module composition
    23    !
    24    ! モデルで利用する物理・化学的な定数を決めるための変数参照型モジュール
    25    !
    26  
    27    !モジュール読み込み
    28    use dc_types,   only: DP, STRING
    29    use dc_iounit,  only: FileOpen
    30    use dc_message, only: MessageNotify
    31    use mpi_wrapper,only: myrank
    32    use ChemData,   only: ChemData_OneSpcID, &!化学種の ID
    33      &                   ChemData_MolWt      !分子量
    34    use gridset,    only: ncmax  !化学種の数
    35    use namelist_util, only: namelist_filename
    36  
    37    !暗黙の型宣言禁止
    38    implicit none
    39  
    40    !属性
    41    private
    42  
    43    !変数定義
    44    integer, save, public :: GasNum       = 0   ! 気相の数
    45    integer, save, public :: CloudNum     = 0   ! 雲の数
    46    integer, save, public :: RainNum      = 0   ! 雨の数
    47    integer, save, public :: IdxG(10)     = 0   ! 気体の配列添え字
    48    integer, save, public :: IdxC(10)     = 0   ! 雲の配列添え字
    49    integer, save, public :: IdxR(10)     = 0   ! 雨の配列添え字
    50    integer, save, public :: CondNum      = 0   ! 凝結過程の数
    51    integer, save, public :: IdxCG(10)    = 0   ! 凝結過程(気体)の配列添え字
    52    integer, save, public :: IdxCC(10)    = 0   ! 凝結過程(雲)の配列添え字
    53    integer, save, public :: IdxCR(10)    = 0   ! 凝結過程(雨)の配列添え字
    54    integer, save, public :: RactNum      = 0   ! 化学反応の数
    55    integer, save, public :: IdxNH3       = 0   ! NH3 (気体)の配列添え字
    56    integer, save, public :: IdxH2S       = 0   ! H2S (気体)の配列添え字
    57    integer, save, public :: IdxNH4SHc    = 0   ! NH4SH (雲)の配列添え字
    58    integer, save, public :: IdxNH4SHr    = 0   ! NH4SH (雨)の配列添え字
    59  !  integer, save, public :: ncmax           = 1   ! 凝結物の数
    60    integer, allocatable  :: SpcWetID(:)        !湿潤成分の化学種のID
    61    real(DP), allocatable :: MolWtWet(:)        !湿潤成分の分子量
    62    real(DP)              :: SpcWetMolFr(10)    !湿潤成分の化学種の存在度
    63    character(STRING)     :: SpcWetSymbol(10)   !湿潤成分の化学種名
    64  
    65    integer, allocatable  :: IDGas(:)           !蒸気の化学種のID
    66    integer, allocatable  :: IDCloud(:)         !雲の化学種のID
    67    integer, allocatable  :: IDRain(:)          !雨の化学種のID
    68  
    69    save   SpcWetID, MolWtWet, SpcWetMolFr, SpcWetSymbol
    70    save   IDGas, IDCloud, IDRain
    71    public SpcWetID, MolWtWet, SpcWetMolFr, SpcWetSymbol
    72    public IDGas, IDCloud, IDRain
    73    public composition_init
    74  
    75  contains
    76  
    77    subroutine composition_init
    78      !=概要
    79      !
    80      !NameList ファイルから情報を取得する.
    81      !このサブルーチン内で, 化学情報の初期化を行っている
    82      !
    83      !=凝縮成分の取り扱いについて
    84      !
    85      !計算に利用する凝縮成分の情報は basicset.f90 で定義される
    86      !SpcWetSymbol と SpcWetID に保管されている
    87      !
    88      ! Symbol:  H2O-g, NH3-g, H2S-g, H2O-l-Cloud, H2O-l-Rain, NH4SH-s-Cloud, NH4SH-s-Rain
    89      ! ID:      5,     8,     10,    7,           7,          11,            11
    90      !
    91      !ID 番号(ChemData_SpcID)は ChemData.f90 で定義している
    92      !
    93      !上記の情報を元に, このルーチンでは以下の情報を作る.
    94      !
    95      !  * 各カテゴリーに含まれる物質の数
    96      !
    97      !    GasNum = 3,  CloudNum = 2, RainNum = 2
    98      !
    99      !  * 各カテゴリーの配列添え字. 気体だけに操作したい場合等々で利用する.
   100      !
   101      !    IdxG = 1, 2, 3, 0, 0, 0, ...
   102      !    IdxC = 4, 6, 0, 0, 0, 0, ...
   103      !    IdxR = 5, 7, 0, 0, 0, 0, ...
   104      !
   105      !  * 凝結(Condensation)を生じる物質の数と, それらの配列添え字.
   106      !    上記の例では H2O の凝結のみが生じる
   107      !
   108      !    CondNum = 1
   109      !    IdxCG = 1, 0, 0, 0, 0, 0, ...
   110      !    IdxCC = 4, 0, 0, 0, 0, 0, ...
   111      !    IdxCR = 5, 0, 0, 0, 0, 0, ...
   112      !
   113      !  * NH4SH の生成反応に関与する物質の配列添え字
   114      !
   115      !    IdxNH3    = 2
   116      !    IdxH2S    = 3
   117      !    IdxNH4SHc = 6
   118      !    IdxNH4SHr = 7
   119      !
   120      !利用しない部分にはゼロを代入しておく.
   121      !
   122  
   123      !暗黙の型宣言禁止
   124      implicit none
   125  
   126      !変数定義
   127      character(20), allocatable   :: Symbol(:)   !作業配列
   128      integer                      :: SpcWetNum   !湿潤成分の化学種の数
   129      integer                      :: s, s1, s2
   130      integer                      :: n1, n2, n3
   131      integer                      :: unit
   132      integer                      :: num
   133  
   134      !-----------------------------------------------------------------
   135      ! NAMELIST から情報を取得
   136      !
   137      NAMELIST /composition_nml/ SpcWetSymbol, SpcWetMolFr
   138  
   139      SpcWetSymbol = ''
   140      SpcWetMolFr  = 0.0d0
   141  
   142      call FileOpen(unit, file=namelist_filename, mode='r')
   143      read(unit, NML=composition_nml)
   144      close(unit)
   145  
   146      !----------------------------------------------------------
   147      ! 湿潤成分の ID を得る
   148      !
   149      !湿潤成分の個数を数える
   150      SpcWetNum = count(SpcWetSymbol /= "")
   151      if (SpcWetNum /= ncmax) then
   152        call MessageNotify( "E", "basicset: ", "SpcWetNum is not equal to ncmax." )
   153      end if
   154  
   155      !配列の割り当て
   156      allocate(SpcWetID(SpcWetNum), Symbol(SpcWetNum), MolWtWet(SpcWetNum))
   157  
   158      !SpcWetSymbol の文字列から, -Rain, -Cloud を除いたものを Symbol として保管
   159      do s = 1, SpcWetNum
   160        n1 = index(SpcWetSymbol(s), '-Cloud' )
   161        n2 = index(SpcWetSymbol(s), '-Rain' )
   162        n3 = max(n1, n2)
   163        if (n3 == 0) then
   164          Symbol(s) = SpcWetSymbol(s)
   165        else
   166          Symbol(s) = SpcWetSymbol(s)(1:n3-1)
   167        end if
   168      end do
   169  
   170      !化学種の ID を取得
   171      do s =1, SpcWetNum
   172        SpcWetID(s) = ChemData_OneSpcID( Symbol(s) )
   173      end do
   174  
   175      !分子量を保管
   176      do s = 1, SpcWetNum
   177        MolWtWet(s) = ChemData_MolWt(SpcWetID(s))
   178      end do
   179  
   180  
   181      !-----------------------------------------------------------
   182      ! 雲粒と気体の ID の組を作る
   183      !
   184      !蒸気, 雲, 雨とに分離する.
   185      SelectCloud: do s = 1, ncmax
   186  
   187        !'-g' という文字列が含まれるものの個数を数える
   188        n1 = index(SpcWetSymbol(s), '-g' )
   189        if (n1 /= 0) then
   190          GasNum        = GasNum + 1
   191          IdxG(GasNum)   = s
   192        end if
   193  
   194        !'Cloud' という文字列が含まれるものの個数を数える
   195        n2 = index(SpcWetSymbol(s), '-Cloud' )
   196        if (n2 /= 0) then
   197          CloudNum         = CloudNum + 1
   198          IdxC(CloudNum)  = s
   199        end if
   200  
   201        !'Rain' という文字列が含まれるものの個数を数える
   202        n3 = index(SpcWetSymbol(s), '-Rain' )
   203        if (n3 /= 0) then
   204          RainNum         = RainNum + 1
   205          IdxR(RainNum)   = s
   206        end if
   207  
   208      end do SelectCloud
   209  
   210  
   211      !凝結過程に対して, 蒸気と雲との対を作成する.
   212      SelectCond: do s = 1, ncmax
   213  
   214        ! NH4SH が存在する場合
   215        if ( trim(SpcWetSymbol(s)) == 'NH4SH-s-Cloud' ) then
   216          RactNum           = 1
   217          cycle SelectCond
   218        end if
   219  
   220        !'Cloud' という文字列が含まれるものの個数を数える
   221        n2 = index(SpcWetSymbol(s), '-Cloud' )
   222        if (n2 /= 0) then
   223          CondNum          = CondNum  + 1
   224          IdxCC(CondNum)   = s
   225  
   226          do s1 = 1, ncmax
   227            if ( trim(SpcWetSymbol(s1)) == trim(SpcWetSymbol(s)(1:n2-3)//'-g') ) then
   228              IdxCG(CondNum)   = s1
   229            end if
   230          end do
   231  
   232          do s2 = 1, ncmax
   233            if ( trim(SpcWetSymbol(s2)) == trim(SpcWetSymbol(s)(1:n2-1)//'-Rain') ) then
   234              IdxCR(CondNum)   = s2
   235            end if
   236          end do
   237        end if
   238  
   239      end do SelectCond
   240  
   241      !-----------------------------------------------------------
   242      ! 硫化アンモニウム, およびアンモニアと硫化水素の ID を取得
   243      !
   244      do s = 1, ncmax
   245        if ( trim(SpcWetSymbol(s)) == 'NH4SH-s-Cloud' ) then
   246  
   247          IdxNH4SHc = s
   248  
   249          do s1 = 1, ncmax
   250            if ( trim(SpcWetSymbol(s1)) == 'NH3-g' ) then
   251              IdxNH3 = s1
   252            end if
   253          end do
   254  
   255          do s2 = 1, ncmax
   256            if ( trim(SpcWetSymbol(s2)) == 'H2S-g' ) then
   257              IdxH2S = s2
   258            end if
   259          end do
   260  
   261        end if
   262  
   263        if ( trim(SpcWetSymbol(s)) == 'NH4SH-s-Rain' ) then
   264          IdxNH4SHr = s
   265        end if
   266  
   267      end do
   268  
   269      !-----------------------------------------------------------
   270      ! ID の組を作る
   271      !
   272      allocate(IDGas(CondNum), IDCloud(CondNum), IDRain(CondNum))
   273      do s = 1, CondNum
   274        IDGas(s)   = SpcWetID(IdxCG(s))
   275        IDCloud(s) = SpcWetID(IdxCC(s))
   276        IDRain(s)  = SpcWetID(IdxCR(s))
   277      end do
   278  
   279      !-----------------------------------------------------------
   280      ! 確認
   281      !
   282      if (myrank == 0) then
   283        call MessageNotify( "M", &
   284          &  "composition_init","GasNum   = %d", i=(/GasNum/)   )
   285        call MessageNotify( "M", &
   286          & "composition_init", "CloudNum = %d", i=(/CloudNum/) )
   287        call MessageNotify( "M", &
   288          & "composition_init", "RainNum  = %d", i=(/RainNum/)  )
   289        call MessageNotify( "M", &
   290          & "composition_init", "CondNum  = %d", i=(/CondNum/)  )
   291        call MessageNotify( "M", &
   292          & "composition_init", "RactNum  = %d", i=(/RactNum/)  )
   293        call MessageNotify( "M", &
   294          & "composition_init", "IdxNH3 = %d",   i=(/IdxNH3/)   )
   295        call MessageNotify( "M", &
   296          & "composition_init", "IdxH2S = %d",   i=(/IdxH2S/)   )
   297        call MessageNotify( "M", &
   298          & "composition_init", "IdxNH4SHc = %d", i=(/IdxNH4SHc/) )
   299        call MessageNotify( "M", &
   300          & "composition_init", "IdxNH4SHr = %d", i=(/IdxNH4SHr/) )
   301        Num = count(IdxG /= 0)
   302        write(*,*) "*** MESSAGE [composition_init] ***  IdxG  = ", IdxG(1:Num)
   303        write(*,*) "*** MESSAGE [composition_init] ***  IdxC  = ", IdxC(1:Num)
   304        write(*,*) "*** MESSAGE [composition_init] ***  IdxR  = ", IdxR(1:Num)
   305        Num = count(IdxCG /= 0)
   306        write(*,*) "*** MESSAGE [composition_init] ***  IdxCG = ", IdxCG(1:Num)
   307        write(*,*) "*** MESSAGE [composition_init] ***  IdxCC = ", IdxCC(1:Num)
   308        write(*,*) "*** MESSAGE [composition_init] ***  IdxCR = ", IdxCR(1:Num)
   309  
   310        do s = 1, SpcWetNum
   311          call MessageNotify( "M", &
   312            & "composition_init", "SpcWetID = %d",     i=(/SpcWetID(s)/) )
   313          call MessageNotify( "M", &
   314            & "composition_init", "SpcWetSymbol = %c", c1=trim(SpcWetSymbol(s)) )
   315          call MessageNotify( "M", &
   316            & "composition_init", "SpcWetMolFr = %f",  d=(/SpcWetMolFr(s)/) )
   317          call MessageNotify( "M", &
   318            & "composition_init", "MolWtWet = %f",     d=(/MolWtWet(s)/) )
   319        end do
   320      end if
   321    end subroutine composition_init
   322  
   323  end module composition
Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:33:37 2011
FILE NAME: composition.f90
PROGRAM NAME: composition
FORMAT LIST

  LINE    LOOP     FORTRAN STATEMENT

     1:            != Module Composition
     2:            !
     3:            ! Authors::   SUGIYAMA Ko-ichiro
     4:            ! Version::   $Id: composition.f90,v 1.4 2011-06-21 07:24:22 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:            !
    13:            !== Error Handling
    14:            !
    15:            !== Known Bugs
    16:            !
    17:            !== Note
    18:            !
    19:            !== Future Plans
    20:            !
    21:            
    22:            module composition
    23:              !
    24:              ! モデルで利用する物理・化学的な定数を決めるための変数参照型モジュール
    25:              !
    26:              
    27:              !モジュール読み込み
    28:              use dc_types,   only: DP, STRING
    29:              use dc_iounit,  only: FileOpen
    30:              use dc_message, only: MessageNotify
    31:              use mpi_wrapper,only: myrank
    32:              use ChemData,   only: ChemData_OneSpcID, &!化学種の ID
    33:                &                   ChemData_MolWt      !分子量
    34:              use gridset,    only: ncmax  !化学種の数
    35:              use namelist_util, only: namelist_filename
    36:            
    37:              !暗黙の型宣言禁止
    38:              implicit none
    39:              
    40:              !属性
    41:              private
    42:            
    43:              !変数定義
    44:              integer, save, public :: GasNum       = 0   ! 気相の数
    45:              integer, save, public :: CloudNum     = 0   ! 雲の数  
    46:              integer, save, public :: RainNum      = 0   ! 雨の数
    47:              integer, save, public :: IdxG(10)     = 0   ! 気体の配列添え字
    48:              integer, save, public :: IdxC(10)     = 0   ! 雲の配列添え字
    49:              integer, save, public :: IdxR(10)     = 0   ! 雨の配列添え字  
    50:              integer, save, public :: CondNum      = 0   ! 凝結過程の数
    51:              integer, save, public :: IdxCG(10)    = 0   ! 凝結過程(気体)の配列添え字
    52:              integer, save, public :: IdxCC(10)    = 0   ! 凝結過程(雲)の配列添え字
    53:              integer, save, public :: IdxCR(10)    = 0   ! 凝結過程(雨)の配列添え字
    54:              integer, save, public :: RactNum      = 0   ! 化学反応の数
    55:              integer, save, public :: IdxNH3       = 0   ! NH3 (気体)の配列添え字
    56:              integer, save, public :: IdxH2S       = 0   ! H2S (気体)の配列添え字
    57:              integer, save, public :: IdxNH4SHc    = 0   ! NH4SH (雲)の配列添え字
    58:              integer, save, public :: IdxNH4SHr    = 0   ! NH4SH (雨)の配列添え字
    59:            !  integer, save, public :: ncmax           = 1   ! 凝結物の数
    60:              integer, allocatable  :: SpcWetID(:)        !湿潤成分の化学種のID
    61:              real(DP), allocatable :: MolWtWet(:)        !湿潤成分の分子量  
    62:              real(DP)              :: SpcWetMolFr(10)    !湿潤成分の化学種の存在度
    63:              character(STRING)     :: SpcWetSymbol(10)   !湿潤成分の化学種名  
    64:            
    65:              integer, allocatable  :: IDGas(:)           !蒸気の化学種のID
    66:              integer, allocatable  :: IDCloud(:)         !雲の化学種のID
    67:              integer, allocatable  :: IDRain(:)          !雨の化学種のID
    68:            
    69:              save   SpcWetID, MolWtWet, SpcWetMolFr, SpcWetSymbol
    70:              save   IDGas, IDCloud, IDRain
    71:              public SpcWetID, MolWtWet, SpcWetMolFr, SpcWetSymbol
    72:              public IDGas, IDCloud, IDRain
    73:              public composition_init
    74:              
    75:            contains
    76:              
    77:              subroutine composition_init
    78:                !=概要
    79:                !
    80:                !NameList ファイルから情報を取得する.
    81:                !このサブルーチン内で, 化学情報の初期化を行っている
    82:                !
    83:                !=凝縮成分の取り扱いについて
    84:                !
    85:                !計算に利用する凝縮成分の情報は basicset.f90 で定義される
    86:                !SpcWetSymbol と SpcWetID に保管されている
    87:                ! 
    88:                ! Symbol:  H2O-g, NH3-g, H2S-g, H2O-l-Cloud, H2O-l-Rain, NH4SH-s-Cloud, NH4SH-s-Rain
    89:                ! ID:      5,     8,     10,    7,           7,          11,            11
    90:                !
    91:                !ID 番号(ChemData_SpcID)は ChemData.f90 で定義している
    92:                !
    93:                !上記の情報を元に, このルーチンでは以下の情報を作る.  
    94:                !
    95:                !  * 各カテゴリーに含まれる物質の数
    96:                !
    97:                !    GasNum = 3,  CloudNum = 2, RainNum = 2
    98:                !  
    99:                !  * 各カテゴリーの配列添え字. 気体だけに操作したい場合等々で利用する.
   100:                !
   101:                !    IdxG = 1, 2, 3, 0, 0, 0, ...
   102:                !    IdxC = 4, 6, 0, 0, 0, 0, ...
   103:                !    IdxR = 5, 7, 0, 0, 0, 0, ...
   104:                !
   105:                !  * 凝結(Condensation)を生じる物質の数と, それらの配列添え字. 
   106:                !    上記の例では H2O の凝結のみが生じる
   107:                !
   108:                !    CondNum = 1
   109:                !    IdxCG = 1, 0, 0, 0, 0, 0, ...
   110:                !    IdxCC = 4, 0, 0, 0, 0, 0, ...
   111:                !    IdxCR = 5, 0, 0, 0, 0, 0, ...
   112:                !
   113:                !  * NH4SH の生成反応に関与する物質の配列添え字
   114:                !
   115:                !    IdxNH3    = 2
   116:                !    IdxH2S    = 3
   117:                !    IdxNH4SHc = 6
   118:                !    IdxNH4SHr = 7
   119:                !
   120:                !利用しない部分にはゼロを代入しておく. 
   121:                !
   122:                
   123:                !暗黙の型宣言禁止
   124:                implicit none
   125:                  
   126:                !変数定義
   127:                character(20), allocatable   :: Symbol(:)   !作業配列
   128:                integer                      :: SpcWetNum   !湿潤成分の化学種の数
   129:                integer                      :: s, s1, s2
   130:                integer                      :: n1, n2, n3
   131:                integer                      :: unit
   132:                integer                      :: num
   133:            
   134:                !-----------------------------------------------------------------
   135:                ! NAMELIST から情報を取得
   136:                !
   137:                NAMELIST /composition_nml/ SpcWetSymbol, SpcWetMolFr
   138:            
   139: +------>       SpcWetSymbol = '' 
   140: +------        SpcWetMolFr  = 0.0d0
   141:                
   142:                call FileOpen(unit, file=namelist_filename, mode='r')
   143:                read(unit, NML=composition_nml)
   144:                close(unit)
   145:            
   146:                !----------------------------------------------------------
   147:                ! 湿潤成分の ID を得る
   148:                !
   149:                !湿潤成分の個数を数える
   150: V======        SpcWetNum = count(SpcWetSymbol /= "")
   151:                if (SpcWetNum /= ncmax) then 
   152:                  call MessageNotify( "E", "basicset: ", "SpcWetNum is not equal to ncmax." )
   153:                end if
   154:                
   155:                !配列の割り当て
   156:                allocate(SpcWetID(SpcWetNum), Symbol(SpcWetNum), MolWtWet(SpcWetNum))
   157:            
   158:                !SpcWetSymbol の文字列から, -Rain, -Cloud を除いたものを Symbol として保管
   159: +------>       do s = 1, SpcWetNum
   160: |                n1 = index(SpcWetSymbol(s), '-Cloud' )
   161: |                n2 = index(SpcWetSymbol(s), '-Rain' )
   162: |                n3 = max(n1, n2)
   163: |                if (n3 == 0) then
   164: |                  Symbol(s) = SpcWetSymbol(s)
   165: |                else
   166: |                  Symbol(s) = SpcWetSymbol(s)(1:n3-1)
   167: |                end if
   168: +------        end do
   169:                
   170:                !化学種の ID を取得
   171: +------>       do s =1, SpcWetNum
   172: |                SpcWetID(s) = ChemData_OneSpcID( Symbol(s) )
   173: +------        end do
   174:                
   175:                !分子量を保管
   176: V------>       do s = 1, SpcWetNum
   177: |                MolWtWet(s) = ChemData_MolWt(SpcWetID(s))
   178: V------        end do
   179:            
   180:            
   181:                !-----------------------------------------------------------
   182:                ! 雲粒と気体の ID の組を作る
   183:                !
   184:                !蒸気, 雲, 雨とに分離する. 
   185: +------>       SelectCloud: do s = 1, ncmax
   186: |                
   187: |                !'-g' という文字列が含まれるものの個数を数える
   188: |                n1 = index(SpcWetSymbol(s), '-g' )
   189: |                if (n1 /= 0) then
   190: |                  GasNum        = GasNum + 1
   191: |                  IdxG(GasNum)   = s
   192: |                end if
   193: |                
   194: |                !'Cloud' という文字列が含まれるものの個数を数える
   195: |                n2 = index(SpcWetSymbol(s), '-Cloud' )
   196: |                if (n2 /= 0) then
   197: |                  CloudNum         = CloudNum + 1
   198: |                  IdxC(CloudNum)  = s
   199: |                end if
   200: |          
   201: |                !'Rain' という文字列が含まれるものの個数を数える
   202: |                n3 = index(SpcWetSymbol(s), '-Rain' )
   203: |                if (n3 /= 0) then
   204: |                  RainNum         = RainNum + 1
   205: |                  IdxR(RainNum)   = s
   206: |                end if
   207: |          
   208: +------        end do SelectCloud
   209:            
   210:            
   211:                !凝結過程に対して, 蒸気と雲との対を作成する. 
   212: +------>       SelectCond: do s = 1, ncmax
   213: |                
   214: |                ! NH4SH が存在する場合
   215: |                if ( trim(SpcWetSymbol(s)) == 'NH4SH-s-Cloud' ) then 
   216: |                  RactNum           = 1
   217: |                  cycle SelectCond
   218: |                end if
   219: |                
   220: |                !'Cloud' という文字列が含まれるものの個数を数える
   221: |                n2 = index(SpcWetSymbol(s), '-Cloud' )
   222: |                if (n2 /= 0) then
   223: |                  CondNum          = CondNum  + 1
   224: |                  IdxCC(CondNum)   = s
   225: |          
   226: |+----->           do s1 = 1, ncmax
   227: ||                   if ( trim(SpcWetSymbol(s1)) == trim(SpcWetSymbol(s)(1:n2-3)//'-g') ) then 
   228: ||                     IdxCG(CondNum)   = s1
   229: ||                   end if
   230: |+-----            end do
   231: |                  
   232: |+----->           do s2 = 1, ncmax
   233: ||                   if ( trim(SpcWetSymbol(s2)) == trim(SpcWetSymbol(s)(1:n2-1)//'-Rain') ) then 
   234: ||                     IdxCR(CondNum)   = s2
   235: ||                   end if
   236: |+-----            end do
   237: |                end if
   238: |                
   239: +------        end do SelectCond
   240:                
   241:                !-----------------------------------------------------------
   242:                ! 硫化アンモニウム, およびアンモニアと硫化水素の ID を取得
   243:                !
   244: +------>       do s = 1, ncmax
   245: |                if ( trim(SpcWetSymbol(s)) == 'NH4SH-s-Cloud' ) then 
   246: |          
   247: |                  IdxNH4SHc = s
   248: |          
   249: |+----->           do s1 = 1, ncmax
   250: ||                   if ( trim(SpcWetSymbol(s1)) == 'NH3-g' ) then 
   251: ||                     IdxNH3 = s1
   252: ||                   end if
   253: |+-----            end do
   254: |          
   255: |+----->           do s2 = 1, ncmax
   256: ||                   if ( trim(SpcWetSymbol(s2)) == 'H2S-g' ) then 
   257: ||                     IdxH2S = s2
   258: ||                   end if
   259: |+-----            end do
   260: |          
   261: |                end if
   262: |                
   263: |                if ( trim(SpcWetSymbol(s)) == 'NH4SH-s-Rain' ) then 
   264: |                  IdxNH4SHr = s
   265: |                end if
   266: |          
   267: +------        end do
   268:                    
   269:                !-----------------------------------------------------------
   270:                ! ID の組を作る
   271:                !
   272:                allocate(IDGas(CondNum), IDCloud(CondNum), IDRain(CondNum))
   273: V------>       do s = 1, CondNum
   274: |                IDGas(s)   = SpcWetID(IdxCG(s))
   275: |                IDCloud(s) = SpcWetID(IdxCC(s))
   276: |                IDRain(s)  = SpcWetID(IdxCR(s))
   277: V------        end do
   278:            
   279:                !-----------------------------------------------------------
   280:                ! 確認
   281:                !
   282:                if (myrank == 0) then
   283:                  call MessageNotify( "M", &
   284:                    &  "composition_init","GasNum   = %d", i=(/GasNum/)   )
   285:                  call MessageNotify( "M", &
   286:                    & "composition_init", "CloudNum = %d", i=(/CloudNum/) )    
   287:                  call MessageNotify( "M", &
   288:                    & "composition_init", "RainNum  = %d", i=(/RainNum/)  ) 
   289:                  call MessageNotify( "M", &
   290:                    & "composition_init", "CondNum  = %d", i=(/CondNum/)  )    
   291:                  call MessageNotify( "M", &
   292:                    & "composition_init", "RactNum  = %d", i=(/RactNum/)  ) 
   293:                  call MessageNotify( "M", &
   294:                    & "composition_init", "IdxNH3 = %d",   i=(/IdxNH3/)   )
   295:                  call MessageNotify( "M", &
   296:                    & "composition_init", "IdxH2S = %d",   i=(/IdxH2S/)   )
   297:                  call MessageNotify( "M", &
   298:                    & "composition_init", "IdxNH4SHc = %d", i=(/IdxNH4SHc/) )
   299:                  call MessageNotify( "M", &
   300:                    & "composition_init", "IdxNH4SHr = %d", i=(/IdxNH4SHr/) )
   301: V======          Num = count(IdxG /= 0)
   302: V======          write(*,*) "*** MESSAGE [composition_init] ***  IdxG  = ", IdxG(1:Num)
   303: V======          write(*,*) "*** MESSAGE [composition_init] ***  IdxC  = ", IdxC(1:Num)
   304: V======          write(*,*) "*** MESSAGE [composition_init] ***  IdxR  = ", IdxR(1:Num)
   305: V======          Num = count(IdxCG /= 0)
   306: V======          write(*,*) "*** MESSAGE [composition_init] ***  IdxCG = ", IdxCG(1:Num)
   307: V======          write(*,*) "*** MESSAGE [composition_init] ***  IdxCC = ", IdxCC(1:Num)
   308: V======          write(*,*) "*** MESSAGE [composition_init] ***  IdxCR = ", IdxCR(1:Num)
   309:                  
   310: +------>         do s = 1, SpcWetNum
   311: |                  call MessageNotify( "M", &
   312: |                    & "composition_init", "SpcWetID = %d",     i=(/SpcWetID(s)/) )
   313: |                  call MessageNotify( "M", &
   314: |                    & "composition_init", "SpcWetSymbol = %c", c1=trim(SpcWetSymbol(s)) )
   315: |                  call MessageNotify( "M", &
   316: |                    & "composition_init", "SpcWetMolFr = %f",  d=(/SpcWetMolFr(s)/) )
   317: |                  call MessageNotify( "M", &
   318: |                    & "composition_init", "MolWtWet = %f",     d=(/MolWtWet(s)/) )
   319: +------          end do
   320:                end if
   321:              end subroutine composition_init
   322:            
   323:            end module composition
