module subroutine Dynamic_HeVI




contains

  subroutine VelX_AcousticMode
    pz_AccelVelXNl =                                    &
         & + pz_AdvVelX(pz_VelXNl, xr_VelZNl)              &
         & + pz_TurbVelX(xz_KmBl,   pz_VelXBl, xr_VelZBl)  &
         & + pz_NumDiffVelX(pz_VelXBl)
    
  end subroutine VelX_AcousticMode
      

  subroutine VelZ_AcousticMode
    !
    ! Buoyancy を取り替え可能にする必要がある. 
    !   * Dry の時
    !   * 凝結成分が存在する時
    !     * 凝結と化学反応を区別する必要なし
    !

    xr_AccelVelZNl =                                    &
         & + xr_AdvVelZ(xr_VelZNl, pz_VelXNl)              &
         & + xr_Buoy(xz_PotTempNl)                         &    
         & + xr_BuoyMolWt(xza_MixRtNl)                     &
         & + xr_BuoyDrag(xza_MixRtNl)                      &
         & + xr_TurbVelZ(xz_KmBl,   pz_VelXBl, xr_VelZBl)  &
         & + xr_NumDiffVelZ(xr_VelZBl)                        
    
  end subroutine VelZ_AcousticMode
  

  subroutine VelX_AcousticMode

    pz_VelXAs =                                               &
         & pz_VelXNs                                          &
         &  + DelTimeEular                                    &
         &    * (                                             &
         &     - pz_GradPi(xz_ExnerNs, pz_VelXNs, xr_VelZNs)  &
         &     + pz_AccelVelXNl                               &
         &     )

  end subroutine VelX_AcousticMode


  subroutine Exner_AcousticMode
    !
    ! 中で利用する行列演算パッケージを取り替え可能にする必要がある
    !   * Lapack
    !   * Matrix
    ! あとは境界ルーチンの作り込みが問題  
    !
    ! すぐに思いつくやり方
    !   * case 文分岐  
    !     * DCPAM ではこの方法
    !     * プログラム中に case 文が多用されていると最適化を阻害しないか？
    !     * 細かい関数群を変更するときはどうするんだ？いちいち case 文を書いていられない
    !   * interface 文
    !     * これを自動的に生成できると良いのだが... 
    !       * プリプロセッサを使うのが現実的か...
    !       * interface だけのモジュールを自動で作るのはどうだろう. 
    !         * この場合, ファイルが分かれてしまうことが問題. 
    !           しかし, 構造化をうまく行えば, そこまで読みにくくはならないのでは. 
    !   * use 文のコメントアウト
    !     * 整合的になるよう他プログラムも改変する必要があるだろう 
    !     * プリプロセッサを使うのが最も現実的か...

!    use Dynamic_HEVI_Matrix_lapack, only: Matrix_init, Matrix_Resolv, Matrix_Solv
#ifdef MATMPP
    use Dynamic_HEVI_Matrix_matmpp, only: Matrix_init, Matrix_Resolv, Matrix_Solv
#endif
    xz_ExnerAs = xz_Exner(    &
         & xr_AccelVelZNl,    &
         & pz_VelXNs,         &
         & pz_VelXAs,         &
         & xr_VelZNs,         &
         & xz_ExnerNs)
    
  end subroutine Exner_AcousticMode

  
  subroutine VelZ_AcousticMode
    
    xr_VelZAs =                                                       &
         & xr_VelZNs                                                  &
         &  + DelTimeEular                                            &
         &    * (                                                     &
         &     - xr_GradPi(xz_ExnerAs,xz_ExnerNs,pz_VelXNs,xr_VelZNs) &
         &     + xr_AccelVelZNl                                       &
         &     )
    
  end subroutine VelZ_AcousticMode
  


end module subroutine
