2009/06/03 の dcmodel ネットミーティングのメモ書き

参加者

  • 神戸
    • 林 祥介, 高橋 芳幸, 西澤 誠也, 納多 哲史, 島津 通, 北野 太朗, 今関 翔, 辻野 智紀
  • 北大
    • 石渡 正樹, 杉山 耕一朗, 山下 達也, 馬場 健聡
  • 九大
    • 中島 健介

次回日程

  • 日時
    • 06 月 10 日(水) 14:00 - 16:00
  • 場所
    • 神戸大: 自然科学 3 号館 508
    • 北大 : 理学部 8 号館コスモスタジオ
    • 九大 : 理学部 3 号館 3605

モデルでの時刻管理に関して

  • 現状
    • モデルの中ではおそらくいくつか整数(morikawa integer)を持っており, 何桁もの足し算を正確に行える
    • deepconv, dcpam ではそれらの整数を用いてタイムステップが何時何秒に 対応しているのかを計算している
  • 議論
    • リスタート計算するときに開始時刻を正確に復元できる(桁落ちしない)よ うな時間単位を選ぶ必要がある
    • リスタート計算をするときには基本的に以前と同じ計算をしたいわけなの で, 内部表現での時刻を使うことは不可避である
    • リスタート計算においては人間に対する可読性よりも機械に対する可読性 を優先すべきである
    • morikawa integer を使わないと困るケースは存在するかどうか?
      • morikawa integer をリスタートファイルに埋め込むと汎用性が無くなる のであまり嬉しくない
    • モデルの時刻がどこに書かれているのか分からない状態が第一の問題
    • モデルでどのような時計を持つことにするかを考えるのは第二の問題
    • fortran90 で最も精度良い型は何か?
    • いずれにせよ計算する人はスタート地点を知っておく必要がある
    • 経過時間と時刻は分けて考える必要がある
      • 経過時間については morikawa integer ではなく, 倍精度実数を用いる
      • 時刻を知りたい場合にはカレンダーをセットし, 時刻を返す関数などを 使う
        • 時刻については各モデルでオプショナルとする
      • リスタートデータには経過時間・開始時刻・終了時刻・使用したカレン ダーが書き込まれる
    • モデルがネームリストを読んで終了時刻を取得するのが望ましい形
  • 作戦
    • gtool5 にカレンダー・時刻に関する関数を新たに導入する
    • 下にプログラム構造案を載せる.
    • しばらく下のプログラム構造案の実現可能性を各自/定例ミーティングで議論しながら 考えてみる.
    • 実際のコーディングは, 西澤, 高橋, ... あたりでできる人が行うことになるだろう.

      プログラム案 ---

      program main

      real(DP):: TimeB, TimeN, TimeA
      type(...):: CalendarInfo
      
      
      ! case 1:
      call SetCalendar( CalendarInfo, 'Gregorian' )
      
      ! case 2:
      CalendarInfo % SecOfYear = ...
      
      call SetCalendar( CalendarInfo, Year, Day, .true./.false., ... )
      ! CalendarInfo に
      ! * 年の長さ (day?, sec?)
      ! * 日の長さ (sec)
      ! * leap year or not
      ! * Time = 0.0d0 はいつか? (Year?, Day of year? sec of year?)
      ! を設定
      
      
      read( ??, namelist )
      ! namelist を読んで, 開始時刻, 終了時刻 (年月日秒?) もしくは積分時間を取り出す.
      
      ! リスタート時
      call GetCalendarFromFile( CalendarInfo, RestartFileName )
      
      ! InitTime = Date2Sec( CalendarInfo, InitYYYY, InitMM, InitDD, InitSS )
      ! 開始時刻 (年月日秒?) を秒に変換.
      ! 開始時刻はリスタートファイルから取得することになるのかな.
      ! ほんとの最初の計算は InitTime = 0.0d0 で良いが.
      
      EndTime = Date2Sec( CalendarInfo, EndYYYY, EndMM, EndDD, EndSS )
      ! 終了時刻 (年月日秒?) を秒に変換.
      EndTime = InitTime + <積分時間 (sec)>
      ! 積分時間 (sec) を持っているとき.
      EndTime = InitTime + Year2Sec(CalendarInfo, <積分時間 (year)>)
      ! 積分時間 (year) を持っているとき.
      EndTime = InitTime + Day2Sec(CalendarInfo, <積分時間 (day)>)
      ! 積分時間 (day) を持っているとき.
      
      
      time_loop: do while( EndTime < TimeN ? B? )
        TimeA = TimeN + Dt
      
      
        ! 各種演算
      
      
        SecOfYear    = XXX( CalendarInfo, TimeN  )
        ! TimeN の時刻の second of year
        DayOfYear    = XXX( CalendarInfo, TimeN  )
        ! TimeN の時刻の day of year
        FlagLeapYear = XXX( CalendarInfo, TimeN  )
        ! TimeN は leap year かどうか?
      
      
        ! 各種演算
      
      
        call HistoryPut( CalendarInfo, TimeN, xyz_Temp )
        ! or
        call HistoryPut( TimeN, xyz_Temp, CalendarInfo )
      
      
        TimeB = TimeN
        TimeN = TimeA
      end do time_loop

      end program main

deepconv/arare の定式化

  • 主成分凝結系でも微量成分凝結系でも乾燥系でも全て取り扱える定式化を目 指す
    • 微量成分系では凝結成分に関する物理量として混合比を用いていた
    • 主成分凝結系では凝結成分に関する物理量として雲密度を用いていた
    • 凝結成分を比湿に相当する物理量で記述することにし, 時間発展の式を作 った
      • 数式の上でもプログラムの上でも問題はなさそう
    • 次なる課題は運動方程式・圧力方程式・熱の式の書き換え
  • プログラムの書き換え・テスト計算は一通り定式化のチェックが済んでから