マズローの欲求階層理論とマーケティング・コンセ …...マズローの欲求階層理論とマーケティング・コンセプト (35) 間は,欲求の階層(hierarchy
多圏間・階層間結合モデル カップラーの開発
-
Upload
cyrus-tyson -
Category
Documents
-
view
47 -
download
0
description
Transcript of 多圏間・階層間結合モデル カップラーの開発
多圏間・階層間結合モデルカップラーの開発
寺田直樹( NICT/JST )、深沢圭一郎( NICT )、
金田香織(京大理)、陣英克( NICT )、田中高史(九大)、品川裕之( NICT )
本研究の目的• 前回の検討会では、開発者ごとに異なるディレ
クトリでモデル(モジュール)開発を行い、ディレクトリを跨いでモデル結合を行う方法案を紹介した
• 今回の発表では、モデル結合の具体例、特にインターフェース部の紹介と説明を行う
個人作業 → 多人数での作業 まずはインターフェースの整備が必要
• 本研究の目的は”基盤部”の整備– 共有して初めて意味を成す
– 誰でも自由に利用して頂きたい (ボランティアベースで提供。× 特定グループのプロジェクト)
– 助言、批判、協力 大歓迎です
• 目標とするインターフェース– 多人数での作業が可能。加えて、個人のサイエンスを楽しむこ
とも可能– モデルの単なる結合から、究極コード(ブラソフ等)への連続
的移行が可能• 複数領域モデルの結合
• 計算エンジンの切り替え
• 便利ツールの共有化 ... などを自由に行える
– 並列化・非並列化コードを吸収• (ペタコンを狙うなら非並列は論外ですが。。)
• 本発表では、開発中のインターフェース部(カップラーと接合ルーチン)を紹介– 現在は近くの研究者と不定期に議論
– リソースを共有出来る場所を見つけて公開して行きたい
適用範囲例1: 宇宙天気モデル → 磁気嵐シ
ミュレータ
• 多くの開発要素• 一人のスーパーマン
から多人数での開発へ
[Toth et al., 2005]
適用範囲例2: HZs• G,M,K 型恒星放射スペ
クトル観測( I. Ribas, Spain )
• 恒星風 , CME モデル( M. Khodachenko, Austria )
• 惑星熱圏モデル( Y. Kulikov, Rusia )
• 惑星外圏モデル( H. Lammer, Austria )
• 惑星電磁圏モデル( N. Terada, Japan )
• 隕石デリバリー , 環境進化・気候モデル , ...
• ISSI チームプロポーザル( 2007- )
• Europlanet, ADAM&M
[Lammer et al., Astrobiology, 2007]
200 個以上の系外惑星が発見地球型も
今回、開発したカップラーによって結合した3モデル
QuickTime˛ Ç∆ÉVÉlÉpÉbÉN êLí£ÉvÉçÉOÉâÉÄ
ǙDZÇÃÉsÉNÉ`ÉÉÇ å©ÇÈÇΩÇflÇ…ÇÕïKóvÇ≈Ç∑ÅB
太陽風 -火星電離圏 MHD モデル[Terada et al.]
QuickTime˛ Ç∆ÉVÉlÉpÉbÉN êLí£ÉvÉçÉOÉâÉÄ
ǙDZÇÃÉsÉNÉ`ÉÉÇ å©ÇÈÇΩÇflÇ…ÇÕïKóvÇ≈Ç∑ÅB
外圏底より上側 粒子モデル[Kaneda et al.]
外圏底より下側 two-stream モデル[Kaneda et al.]
モデル結合方法簡易結合からソース公開まで、4段階の開発レベルを用意
– レベル1• カップラー(最上位ルーチン)とその接合部(接合ルーチン)の編集だ
けでモデル結合を実現。下位ルーチンはなるべく触らないで済むようにする
• 下位ルーチンは実行形式(静的ライブラリ)のみ公開• Grid converter はカップラー内で用意• 結合変数は、接合ルーチン内で MKS 単位系に変換
– レベル2• 結合変数の規格化量・規格化ルーチンを共有化
– レベル3• 下位ルーチンにおいてもプログラムの記述形式を統一• 下位ルーチンも汎用性のあるもの(引数で呼ぶ形)にする
– レベル4• 下位ルーチンも含めてソース公開
• カップラーと接合ルーチンの記述ルール– 気象庁・気象研究所で策定されたルールに準拠– 基本的には、電脳倶楽部 dcmodel のコーディング
ルールを踏襲させて頂く• 変数命名法、配列代入文の上下限指定の省略は廃止(可読性
はある程度犠牲にする)などが異なる
• 用意された“ひな形”を編集して結合を実現– カップラー
• exm3_couple.f90
– 接合ルーチン• pkm3_ntmism.f90, pkm3_kkexsp.f90,
pkm3_kfmgsm.f90, ...
– Makefile のひな形も各所に用意
exm: execution modulepkm: package modulecrm: constant reference modulevrm: variable reference module
ディレクトリ構成
kkexsp ntmism kfmgsm tuutlv couple
kkexsp_ntmism_kfmgsm kkexsp_kfmgsm ...
beta (開発中コード)
ディレクトリ構成
kkexsp ntmism kfmgsm tuutlv couple
kkexsp_ntmism_kfmgsm
Makefile_ar
Makefile
Makefile_couple
make.ink
beta (開発中コード)
exm3_local.f90
pkm3_kkexsp.f90
exm3_couple.f90
コード群( a.f90, b.f90, ... )
静的ライブラリlibkkexsp.a (← pkm3_kkexsp.o, a.o, b.o, ... )を作成・公開
Makefile静的ライブラリ(* .a )とexm3_couple.f90を結合
kkexsp_kfmgsm ...
ディレクトリ構成
kkexsp ntmism kfmgsm tuutlv couple
make.ink
beta (開発中コード)
静的ライブラリlibkkexsp.aを作成
変数は引数で渡す
計算エンジン部(ブラソフなど)便利ツール群 , ...
libtuutlv.a
Makefile_ar
コード/ツールを用いたら、そのディレクトリ開発者(と共同開発者)を共著に入れるルール⇒ 腕自慢の若手が活躍出来る場
Makefile_arpkm3_kkexsp.f90
コード群( a.f90, b.f90, ... )
ディレクトリ構成
kkexsp ntmism kfmgsm tuutlv couple
make.ink
beta (開発中コード)
静的ライブラリlibkkexsp.aを作成
変数は引数で渡す
計算エンジン部(ブラソフなど)便利ツール群 , ...
libtuutlv.a
Makefile_ar
領域モデルの結合⇒ 計算エンジンの切り替え 便利ツール群の共有化究極コードへの連続移行を視野に
Makefile_arpkm3_kkexsp.f90
コード群( a.f90, b.f90, ... )
結合の実践手順1. 手持ちのプログラムのメイン部分を以下の3つに分割 - init (初期値設定、ファイル読み込み部) - exe (メインループ部) - finalize (終了処理、ファイル書き出し部)2. 接合ルーチン( pkm3_ntmism.f90 など)の”ひな形”の
指定箇所に、分割したプログラムを挿入3. カップラー( exm3_couple.f90 )の”ひな形”のサブルー
チンコール部分と、結合変数に関する部分を書き換え4. 必要に応じて grid converter を作成 or書き換え
(あと、細かい変更箇所が数カ所、、)
exm: execution modulepkm: package modulecrm: constant reference modulevrm: variable reference module
カップラー( exm3_couple.f90)の説明( 1/5)
PROGRAM exm3_couple !--------------------------------------------------------------------- ! Execution module ! Coupler of 'kkexst', 'kkexsp', and 'ntmism' ! kkexst : Kaori Kaneda, Exosphere two-stream model (open file no.*) ! kkexsp : Kaori Kaneda, Exosphere particle tracing model (open file no.*) ! ntmism : Naoki Terada, Takashi Tanaka, and Hiroyuki Shinagawa, ! Magneto-ionosphere MHD model (open file no.*) !--------------------------------------------------------------------- USE vrm3_couple ! MPI変数や exm3_couple内で使う変数を宣言 USE pkm1_kkexst USE vrm1_kkexst ! kkexst の結合変数を宣言 USE pkm3_kkexsp USE vrm3_kkexsp ! kkexsp の結合変数を宣言 USE pkm3_ntmism USE vrm3_ntmism ! ntmism の結合変数を宣言 USE pkm3_ntmism2kkexsp IMPLICIT NONE
! ! Initialize !
! ! MPI initialize !
( MPI 初期化 , MPI_INIT, MPI_COMM_SIZE, MPI_COMM_RANK ) ( MPI 初期化 , MPI_SPLIT, MPI_COMM_SIZE, MPI_COMM_RANK )
カップラー( exm3_couple.f90 )つづき( 2/5 )
! ! kkexst initialize !
CALL pkm1_kkexst_init(引数 ) ! 引数には主に結合変数が入る
! ! kkexsp initialize !
CALL pkm3_kkexsp_init(引数 )
! ! ntmism initialize !
CALL pkm3_ntmism_init(引数 )
! ! Grid conversion initialize (@ ntmism master PE) !
CALL ntmism2kkexsp_gconv_init(引数 )
! ! Send to master PEs !
CALL MPI_BCAST(引数 )
カップラー( exm3_couple.f90 )つづき( 3/5 )
! ! Main loop !
tim0_couple_t = 0.0_npr0_r tim0_couple_dt = 1.0e-0_npr0_r ! in [s] nlp0_couple_lmax = 1000
DO nlp0_couple_loop = 1, nlp0_couple_lmax
! ! kkexst exe !
CALL pkm1_kkexst_exe(引数 ) ! 引数には主に結合変数が入る
! ! kkexsp exe !
CALL pkm3_kkexsp_exe(引数 )
! ! ntmism exe !
CALL pkm3_ntmism_exe(引数 )
カップラー( exm3_couple.f90 )つづき( 4/5 ) !
! Grid conversion (@ ntmism master PE) !
CALL ntmism2kkexsp_gconv_exe(引数 )
! ! Send to master PEs !
CALL MPI_BCAST(引数 )
! ! Advance coupling variable !
fld3_kkexsp_nhi(変数範囲 ) = fld3_kkexsp_nhi_adv(変数範囲 ) fld3_kkexsp_noi(変数範囲 ) = fld3_kkexsp_noi_adv(変数範囲 ) fld3_kkexsp_no2i(変数範囲 ) = fld3_kkexsp_no2i_adv(変数範囲 ) fld3_kkexsp_nco2i(変数範囲 ) = fld3_kkexsp_nco2i_adv(変数範囲 ) fld3_kkexst_phai_u(変数範囲 ) = fld3_kkexst_phai_u_adv(変数範囲 )
tim0_couple_t = tim0_couple_t + tim0_couple_dt END DO
! ! Finalize !
カップラー( exm3_couple.f90 )つづき( 5/5 )
! ! kkexst finalize !
CALL pkm1_kkexst_finalize(引数 ) ! ! kkexsp finalize !
CALL pkm3_kkexsp_finalize(引数 )
! ! ntmism finalize !
CALL pkm3_ntmism_finalize(引数 )
! ! MPI finalize !
CALL MPI_FINALIZE(引数 )
STOPEND PROGRAM exm3_couple
接合ルーチン( pkm3_ntmism.f90等)の説明
MODULE pkm3_kkexsp !--------------------------------------------------------------------- ! モジュールの説明 (open file no.*) ! 内部サブルーチンの簡単な説明 ! - pkm3_kkexsp_init : initialize calculation (public) ! - pkm3_kkexsp_exe : execute calculation (public) ! - pkm3_kkexsp_finalize : finalize calculation (public) !--------------------------------------------------------------------- IMPLICIT NONE PRIVATE ! private 宣言で閉じ込め PUBLIC :: pkm3_kkexsp_init, & & pkm3_kkexsp_exe, & & pkm3_kkexsp_finalize
INTEGER(KIND = 4), PARAMETER :: npr0_i = 4, & & npr0_r = 8, & & npr0_c = 1
! ! ここで kkexsp コード群に共通の定数や変数を宣言(もしくは宣言モジュールを USE する) ! 例えば、、、 !
INTEGER(KIND = npr0_i), PARAMETER :: natom = 100000000 REAL (KIND = npr0_r), SAVE :: vel(natom)
接合ルーチン( pkm3_ntmism.f90等)の説明
CONTAINS
SUBROUTINE pkm3_kkexsp_init(引数 ) ! 引数には主に結合変数が入る !------------------------------------------------------------------- ! 内部サブルーチンの説明 !------------------------------------------------------------------- IMPLICIT NONE
! ! ここで内部サブルーチンで用いる定数や変数を宣言 !
!------------------------------------------------------------------- ! Start main block !
! ! ここにプログラムの初期化部分を挿入 !
! ! End main block !-------------------------------------------------------------------
RETURN END SUBROUTINE pkm3_kkexsp_init !---------------------------------------------------------------------
接合ルーチン( pkm3_ntmism.f90等)の説明
SUBROUTINE pkm3_kkexsp_exe(引数 ) ! 引数には主に結合変数が入る !------------------------------------------------------------------- ! 内部サブルーチンの説明 !------------------------------------------------------------------- IMPLICIT NONE
! ! ここで内部サブルーチンで用いる定数や変数を宣言 !
!------------------------------------------------------------------- ! Start main block !
! ! ここにプログラムのメインループ部分を挿入 !
! ! End main block !-------------------------------------------------------------------
RETURN END SUBROUTINE pkm3_kkexsp_exe !---------------------------------------------------------------------
接合ルーチン( pkm3_ntmism.f90等)の説明
SUBROUTINE pkm3_kkexsp_finalize(引数 ) !------------------------------------------------------------------- ! 内部サブルーチンの説明 !------------------------------------------------------------------- IMPLICIT NONE
! ! ここで内部サブルーチンで用いる定数や変数を宣言 !
!------------------------------------------------------------------- ! Start main block !
! ! ここにプログラムの終了処理部分を挿入 !
! ! End main block !-------------------------------------------------------------------
RETURN END SUBROUTINE pkm3_kkexsp_finalize !---------------------------------------------------------------------
END MODULE pkm3_kkexsp
並列実行時のモデル間データ(結合変数)伝送
• MPI を用いて行う• 各モデルで master PE を定義
– 各モデルの接合ルーチン: master PE にデータを集める– カップラー: master PE 間でデータ通信– 必要に応じて新コミュニケータを作成(以下パターン2では必要)
• パターン1– 全てのモデルが MPI 非対応 (カップラーでのみMPI を利用)
• パターン2– いくつかのモデルが MPI対応
• パターン3– 全てのモデルが MPI対応 (ペタコンでは必須?)
モデル1モデル2 モデル3
BCAST (or SENDRECV)
モデル1モデル2 モデル3
BCAST (or SENDRECV)
GATHERV
モデル1 GATHERV
モデル2 GATHERV
モデル3 GATHERV
青:master PE
結合変数: 更新のタイミング
t=t0
t=t0+dtcouple
磁気圏モデル 電離圏モデル 熱圏モデル
結合変数nM
結合変数はt=t0 ~ t0+dtcouple の間は固定
更新
結合変数nI
結合変数nT
nM’ nI’ nT’
問題点、その他• 問題点
– MPI を理解している人が一人は必要 → 一人ぐらいいるでしょう
– 変数のネーミング → 検討中– grid converter の一般化は困難 → 個別対応– ファイル番号 → 開けたらすぐに閉める(例えば
ファイル番号 10-19 は一時的な開け閉め用とする)。開けっ放しのファイル番号はカップラーのコメント欄に明示
– 実数(整数 ? )の精度 → 結合変数に渡す際に double に統一
– grid conversion で保存則等は満たすべき → 将来の課題
問題点、その他
• その他– どれぐらいの手間と時間がかかったか
• 規格を決定してからは約 10日。今やれば 2〜 3日
– 苦労したところ• MPI が絡むところがやっかい(だった)
– 他モデル開発者とのやりとり• 金田さんからは A4 で3枚の説明書きをもらった• 格子情報は電話で確認