モデル中の各ルーチンの interface 等の比較

負の水蒸気の除去 : 復習

現状

  • dcpam: 変化率を返すサブルーチンで計算
  • arare: 穴埋めされた予報変数値を返す関数で計算

モデルの大まかな構造 : 今回(2006-09-19) まずこれをやりましょう.

deepconv/arare

  • ソースコード先頭部分は以下のように書く.

    != Program Title              # 先頭の見出しは rdoc の書式に従い "=" を用いる
    !
    ! Authors:: hogehero
    ! Version:: $Id: $            # cvs のバージョン名を出力
    ! Tag Name:: $Name: $         # cvs の tag 名を出力
    ! Copyright:: Copyright (C) GFD Dennou Club, 2006-. All right reserved.
    ! License:: See COPYRIGHT[../../COPYRIGHT] 
    !                             # COPYRIGHT ファイルへの相対パスを記入
    !
    !
    ! 以下は必要に応じて記入. 見出しは "==" で書く.
  • コメントはどこまで書くべきか?
    • 最低限書かねばならないことは, 変数宣言とモジュール引用宣言
    • "implicit none" などの自明は宣言文のコメントはいらないだろう
  • コメントの書き方

    ex.1) この書き方を基本とする.

    !----- コメント -----
    !  詳細なコメントを追加したい場合は
    !  このように字下げをして書く
    call subroutine

    ex.2)

    !-----------------------------------
    !コメント
    !  詳細なコメントを追加したい場合は
    !  このように字下げをして書く
    !-----------------------------------
    call subroutine
  • メインプログラムの書き方
    • 手続きが抽象化されていて, use 文を書き換えるだけで計算内容の切替え ができるようになっていると嬉しい.
    • メインプログラム内に数式に対応する計算が全く現れないのも, 全て陽に記述されているのも難だ.
    • たぶん両者の中間がよいのだろう

      ex)

      ...
      !----- 温度の移流を計算 -----
      call dynamics_adv_scalar( pz_U,      & !(in) 水平速度
        &                       xr_W,      & !(in) 鉛直速度
        &                       xy_Temp,   & !(in) 温度
        &                       xy_Adv   ) & !(out)移流項
      
      !----- 温度の拡散を計算 -----
      call dynamics_diff_scalar( xy_Km,    & !(in) 拡散係数
        &                        xy_Temp,  & !(in) 温度
        &                        xy_Diff ) & !(out)乱流拡散項
      ...          
      
      !-----     時間積分     -----
      xy_Temp = xy_Temp + DelTime * (xy_ADV + xy_DIFF + ...) 

データ入出力 : 今回(2006-09-19) これをやっつけましょう.

  • コマンドライン引数で渡す NAMELIST ファイル名の取得は, dcargs を用いて以下のように行う. 詳細は http://www.gfd-dennou.org/library/gtool4/gt4f90io/gt4f90io_current/doc/code_reference/classes/dc_args.html を参照.

    ex.)

    use dc_args
    ....
    type(ARGS)                :: arg               ! ARGS 型の変数宣言
    character(TOKEN), pointer :: argv(:) => null() ! 文字型配列のポインター
    
    
    call Open(arg)       ! 変数 arg の初期化
    call Debug(arg)      ! デバッグオプションを自動設定
    call Help(arg)       ! ヘルプオプションを自動設定
    call Strict(arg)     ! 引数の数を返す
    
    call Get(arg, argv)  ! オプションでないものを argv に渡す
    do i = 1, size(argv) 
      write(*,*) argv(i)
    end do
    deallocate(argv)
    call Close(arg)
  • NAMELIST ファイルの読み込み時のエラー処理
    • deepconv/arare4 ではエラー処理がない
    • dcpam ではエラー処理あり. 引数でファイル名が指定されていない場合はデフォルト設定を読み込むようしている.
    • NAMELIST ファイルが指定されていなくても動作するべき
  • gt4f90io の subroutine の使い方
    • deepconv/arare4 : 出力変数決めうち, 出力は単一のファイルに行う
    • dcpam : 出力変数の変更が可能, , 出力は変数毎に異なるファイルに行う
    • deepconv/arare4 のようなシンプルな書き方にする.
      • dcpam で行っているような複雑な処理は gt4f90io に押しつけるようにする.
  • nc ファイルの内の変数名
    • nc ファイルの内の変数名は, プログラム内で用いられている変数名に一致させる.
    • プログラム内では "x_X", "p_X" のように区別していたが, 出力時には 区別する必要がなくなったものについては, 単に "X" などとする.
  • デフォルト初期値を与える際の注意
    • 宣言文で初期値を与えるとその変数は自動的に save 属性が付与される.

レイリー摩擦 : 後は時間の許す限り. 基本的に次回以降???

鉛直拡散

地表面フラックス

  • deepconv/arare にはまだ無い?

対流調節

放射モジュールのinterface : 8 月にちょっと話をした

2006-08-22 の石渡の提案

  • 「普通」の放射モジュールとニュートン冷却モジュールとは 別物として扱うことにしよう. 具体的には, 物理過程のメインモジュールで

    call physics_radiation
    …
    call physics_NewtonianCooling

    と 2 つの call 文を入れる.

  • 理由は
    • 出力が違うもの(放射フラックスと温度変化率)をまとめるのは やはり無理がある.
    • 放射とニュートン冷却の両方を入れたい場合もある.

放射過程モジュールのinterface 案 (まだ決まってない)

  • 入出力するべき項目

    入力は
      大気温度分布, 表面温度, 吸収物質分布, 座標情報
    出力は
      長波フラックス, 短波フラックス
  • これらの項目の中身はいろいろ変わり得る.
    • フラックスの波長依存性
      • 波長積分まで放射モジュールの中でやるかどうか?
    • 吸収物質の成分が増えた時にどのように対応するか?
      • 4 次元配列にすりゃあ良い. (AFES 方式, 杉山方式)
    • 座標情報はいろいろありえる.
      • T を与えるか Tm を与えるか, 両方与えるか?
      • sigma を与えるの? 圧力を与えるの?
      • よしゆき君のいじっているスキームだと gdp と gdpm の 両方が必要.
  • いろいろな設定は放射モジュールの中で良きにはからってもらうん だろうねえ.
    • 放射計算を間引くetc の設定
    • 時刻情報: 軌道要素を使って入射放射フラックス分布を決めるとか.

問題点

  • implicite のための情報はどう取り出すか?
    • 必ず出力するようにする?
      • これは依存関係が明らかというメリットがある.
    • 別サブルーチンで完全に別途に計算する?
    • 放射計算ルーチンの中で必要な情報(例: 透過関数)を save しておき 問い合わせサブルーチンで聞きにいく?
      • よしゆきコメント : これは便利であろうが, 依存関係がさっぱり わからなくなっちゃうのではなかろうか?
      • せめて, 放射スキームとしては必要な情報の計算方法の 詳細に立ち入ることはしたくない.

その他ものすごく細かいサブルーチン

  • 平均操作, ゼロリセット, 型変換etc
  • しかし, こんなことは subroutine ではやっていないか?