| Class | moistset_3d | 
| In: | 
                
                setup/moistset_3d.f90
                
         | 
モデルで利用する物理・化学的な定数を決めるための変数参照型モジュール
| Subroutine : | 
NameList ファイルから情報を取得する. このサブルーチン内で, 化学情報の初期化を行っている
計算に利用する凝縮成分の情報は basicset.f90 で定義される SpcWetSymbol と SpcWetID に保管されている
Symbol: H2O-g, NH3-g, H2S-g, H2O-l-Cloud, H2O-l-Rain, NH4SH-s-Cloud, NH4SH-s-Rain ID: 5, 8, 10, 7, 7, 11, 11
ID 番号(ChemData_SpcID)は ChemData.f90 で定義している
上記の情報を元に, このルーチンでは以下の情報を作る.
* 各カテゴリーに含まれる物質の数 GasNum = 3, CloudNum = 2, RainNum = 2 * 各カテゴリーの配列添え字. 気体だけに操作したい場合等々で利用する. IdxG = 1, 2, 3, 0, 0, 0, ... IdxC = 4, 6, 0, 0, 0, 0, ... IdxR = 5, 7, 0, 0, 0, 0, ... * 凝結(Condensation)を生じる物質の数と, それらの配列添え字. 上記の例では H2O の凝結のみが生じる CondNum = 1 IdxCG = 1, 0, 0, 0, 0, 0, ... IdxCC = 4, 0, 0, 0, 0, 0, ... IdxCR = 5, 0, 0, 0, 0, 0, ... * NH4SH の生成反応に関与する物質の配列添え字 IdxNH3 = 2 IdxH2S = 3 IdxNH4SHc = 6 IdxNH4SHr = 7
利用しない部分にはゼロを代入しておく.
  subroutine moistset_init( )
    !=概要
    !
    !NameList ファイルから情報を取得する.
    !このサブルーチン内で, 化学情報の初期化を行っている
    !
    !=凝縮成分の取り扱いについて
    !
    !計算に利用する凝縮成分の情報は basicset.f90 で定義される
    !SpcWetSymbol と SpcWetID に保管されている
    ! 
    ! Symbol:  H2O-g, NH3-g, H2S-g, H2O-l-Cloud, H2O-l-Rain, NH4SH-s-Cloud, NH4SH-s-Rain
    ! ID:      5,     8,     10,    7,           7,          11,            11
    !
    !ID 番号(ChemData_SpcID)は ChemData.f90 で定義している
    !
    !上記の情報を元に, このルーチンでは以下の情報を作る.  
    !
    !  * 各カテゴリーに含まれる物質の数
    !
    !    GasNum = 3,  CloudNum = 2, RainNum = 2
    !  
    !  * 各カテゴリーの配列添え字. 気体だけに操作したい場合等々で利用する.
    !
    !    IdxG = 1, 2, 3, 0, 0, 0, ...
    !    IdxC = 4, 6, 0, 0, 0, 0, ...
    !    IdxR = 5, 7, 0, 0, 0, 0, ...
    !
    !  * 凝結(Condensation)を生じる物質の数と, それらの配列添え字. 
    !    上記の例では H2O の凝結のみが生じる
    !
    !    CondNum = 1
    !    IdxCG = 1, 0, 0, 0, 0, 0, ...
    !    IdxCC = 4, 0, 0, 0, 0, 0, ...
    !    IdxCR = 5, 0, 0, 0, 0, 0, ...
    !
    !  * NH4SH の生成反応に関与する物質の配列添え字
    !
    !    IdxNH3    = 2
    !    IdxH2S    = 3
    !    IdxNH4SHc = 6
    !    IdxNH4SHr = 7
    !
    !利用しない部分にはゼロを代入しておく. 
    !
    
    !暗黙の型宣言禁止
    implicit none
      
    !変数定義
    integer                    :: s, s1, s2
    integer                    :: n1, n2, n3
    
    !-----------------------------------------------------------
    ! 初期化
    !-----------------------------------------------------------
    GasNum    = 0 
    CloudNum  = 0 
    RainNum   = 0 
    IdxG       = 0 
    IdxC     = 0 
    IdxR      = 0 
    CondNum   = 0 
    IdxCG     = 0 
    IdxCC     = 0 
    IdxCR     = 0 
    RactNum   = 0 
    IdxNH3       = 0 
    IdxH2S       = 0 
    IdxNH4SHc    = 0 
    IdxNH4SHr    = 0 
    !-----------------------------------------------------------
    ! 雲粒と気体の ID の組を作る
    !-----------------------------------------------------------      
    write(*,*) "moistset_3d: ", SpcNum
    write(*,*) "moistset_3d: ", SpcWetSymbol
    !蒸気, 雲, 雨とに分離する. 
    SelectCloud: do s = 1, SpcNum
      
      !'-g' という文字列が含まれるものの個数を数える
      n1 = index(SpcWetSymbol(s), '-g' )
      if (n1 /= 0) then
        GasNum        = GasNum + 1
        IdxG(GasNum)   = s
      end if
      
      !'Cloud' という文字列が含まれるものの個数を数える
      n2 = index(SpcWetSymbol(s), '-Cloud' )
      if (n2 /= 0) then
        CloudNum         = CloudNum + 1
        IdxC(CloudNum)  = s
      end if
      !'Rain' という文字列が含まれるものの個数を数える
      n3 = index(SpcWetSymbol(s), '-Rain' )
      if (n3 /= 0) then
        RainNum         = RainNum + 1
        IdxR(RainNum)   = s
      end if
    end do SelectCloud
    !凝結過程に対して, 蒸気と雲との対を作成する. 
    SelectCond: do s = 1, SpcNum
      
      ! NH4SH が存在する場合
      if ( trim(SpcWetSymbol(s)) == 'NH4SH-s-Cloud' ) then 
        RactNum           = 1
        cycle SelectCond
      end if
      
      !'Cloud' という文字列が含まれるものの個数を数える
      n2 = index(SpcWetSymbol(s), '-Cloud' )
      if (n2 /= 0) then
        CondNum          = CondNum  + 1
        IdxCC(CondNum)   = s
        do s1 = 1, SpcNum
          if ( trim(SpcWetSymbol(s1)) == trim(SpcWetSymbol(s)(1:n2-3)//'-g') ) then 
            IdxCG(CondNum)   = s1
          end if
        end do
        
        do s2 = 1, SpcNum
          if ( trim(SpcWetSymbol(s2)) == trim(SpcWetSymbol(s)(1:n2-1)//'-Rain') ) then 
            IdxCR(CondNum)   = s2
          end if
        end do
      end if
      
    end do SelectCond
    
    !-----------------------------------------------------------
    ! 硫化アンモニウム, およびアンモニアと硫化水素の ID を取得
    !-----------------------------------------------------------
    do s = 1, SpcNum
      if ( trim(SpcWetSymbol(s)) == 'NH4SH-s-Cloud' ) then 
        IdxNH4SHc = s
        do s1 = 1, SpcNum
          if ( trim(SpcWetSymbol(s1)) == 'NH3-g' ) then 
            IdxNH3 = s1
          end if
        end do
        do s2 = 1, SpcNum
          if ( trim(SpcWetSymbol(s2)) == 'H2S-g' ) then 
            IdxH2S = s2
          end if
        end do
      end if
      
      if ( trim(SpcWetSymbol(s)) == 'NH4SH-s-Rain' ) then 
        IdxNH4SHr = s
      end if
    end do
    
    !-----------------------------------------------------------
    ! 確認
    !-----------------------------------------------------------
!    if (cpurank == 0) then
      call MessageNotify( "M", "MoistSet_Init","GasNum   = %d", i=(/GasNum/)   )
      call MessageNotify( "M", "MoistSet_Init", "CloudNum = %d", i=(/CloudNum/) )    
      call MessageNotify( "M", "MoistSet_Init", "RainNum  = %d", i=(/RainNum/)  ) 
      call MessageNotify( "M", "MoistSet_Init", "CondNum  = %d", i=(/CondNum/)  )    
      call MessageNotify( "M", "MoistSet_Init", "RactNum  = %d", i=(/RactNum/)  ) 
      call MessageNotify( "M", "MoistSet_Init", "IdxNH3 = %d",   i=(/IdxNH3/)   )
      call MessageNotify( "M", "MoistSet_Init", "IdxH2S = %d",   i=(/IdxH2S/)   )
      call MessageNotify( "M", "MoistSet_Init", "IdxNH4SHc = %d", i=(/IdxNH4SHc/) )
      call MessageNotify( "M", "MoistSet_Init", "IdxNH4SHr = %d", i=(/IdxNH4SHr/) )
      write(*,*) "*** MESSAGE [MoistSet_Init] ***  IdxG  = ", IdxG
      write(*,*) "*** MESSAGE [MoistSet_Init] ***  IdxC  = ", IdxC
      write(*,*) "*** MESSAGE [MoistSet_Init] ***  IdxR  = ", IdxR
      write(*,*) "*** MESSAGE [MoistSet_Init] ***  IdxCG = ", IdxCG
      write(*,*) "*** MESSAGE [MoistSet_Init] ***  IdxCC = ", IdxCC
      write(*,*) "*** MESSAGE [MoistSet_Init] ***  IdxCR = ", IdxCR
!    end if
  end subroutine moistset_init