変更箇所スクリプトでgnuplotを使う場合、グラフがグラフが一瞬描かれた直後に終了してしまうという問題があった。-1と書く必要がある。以下のコンテンツではこの点に修正を加えた。プロセス間のMPI_SENDRECVによる通信の様子が分かりやすく表示された。このように人間の視覚を使って情報を引き出す操作を一般に可視化という。科学技術計算においては、可視化が様々な局面で重要な役割を果たす。データ可視化の身近な例は天気図であろう。各地の風向、風力、気圧などの数字をアナウンサーが次々に読み上げていくラジオ番組である。これをただ耳で聞いているだけでは何もわからない。低気圧や高気圧が図—天気図—としてあらわれる。明日の天気がだいたいわかる。ラジオのアナウンサーが読み上げる数値データに全て含まれているものである。明日の天気を知るのはほとんど不可能である。紙の上に天気図という図にしてみてはじめてデータに隠されていた情報を引き出すことができる。†データの可視化には可視化の目的や、対象データの種類の応じて様々な方法が開発されている。その中で、ここでは、スカラー場の可視化について簡単に説明する。†xのある関数f(x)を直感的に理解するためには、グラフを書くのが一番である。下のグラフを見ればわかる。†xとyの関数、つまり2次元の関数f(x,y)の形を理解するには、等高線を描くのがよい。地表面での大気の圧力pの分布p(x,y)の等高線は天気図でおなじみである。上の図では等高線の高さを色で表示してさらに分かりやすくしている。ここで等高線の描画アルゴリズムを紹介しよう。計算格子点上に定義されたデータから一本の等高線を描くには、下の図のように短い線分をつなげていけばよい。一つの線分は4つの計算格子点で定義された長方形領域(セル)の中で直線を描く。f(x,y)=1.0の値の等高線を描く場合を考えよう。あるセルの4つの頂点におけるfの値が全て1.0よりも大きいか、あるいは1.0未満であれば、f=1.0の等高線はこのセルを通らないのは明らかである。セルを周囲の4つの辺、それぞれの両端の頂点でのfの値が1.0を「挟めば」その辺を等高線が通る。辺上のどの位置を等高線が横切るかは、線形補間をすればよい。下の図はちょうど中点を通る例である。squaresと呼ばれる。等高線という曲線を見ることで理解する方法である。等値面の「3次元版」も考えられる。この場合は3次元空間中の曲面の形状を見ることで3次元空間に分布する関数f(x,y,z)の分布を理解する。下の図の白い矢印で示している物体は等値面の例である。これは核融合実験装置(LHD)内部のプラズマの圧力分布の等値面である。1985年に米国で特許となったが、20年を経過したので、現在では自由に利用できる。†このような可視化アルゴリズムを実装したソフトウェアは既に各種開発されており、可視化ソフトウェアとかグラフソフトなどと呼ばれる。この演習では、そのなかで無償で利用出来るgnuplotを利用する。(なお、gnuplotはGNUのソフトウェアではない。)/usr/bin/gnuplotまたは/mnt/nfs/usr/bin/gnuplotというコマンド打てばgnuplotが立ち上がる。sin(x)と打ち込んでみよう。sin関数がプロットされるはずである。x**xとすれば見える。gnuplotの終了はコマンドプロンプトでquitと打つ。gnuplotではこのように解析的に定義された関数をターミナルに打ち込んでそのグラフを描く機能がある。それに加えて、ファイルに書き込まれた離散データを読み込み、それをグラフにする機能もある。ヤコビ法によって次第に収束して行く様子を可視化してみよう。heat1.f90の出力(標準出力)をファイルtest.dataという名前に保存せよ。test.dataの中身を確認せよエディタで開くよりもheadコマンドやtailコマンドで見る方が早い。lpはlinespointsの略で、線(line)と点(point)を表示することを意味する。linespointsと書いてもよい。上の図の中で文字とグラフが重なって見にくいので、文字を消す。keyと入れ、それに続いてreplotと打て。縦軸の表示範囲を調整をする。[0:0.35]replotと打て。図全体のタイトルと、x軸、y軸の説明を入れる。"temperature"replotと打て。†heat1.f90で計算された最終的な平衡温度分布をgnuplotで見てみよう。正方形を真ん中で横に切るy=0.5の線上での温度のx分布をグラフにする。これからの演習でデータファイルを多数生成するので、データファイル出力先のディレクトリを用意しよう。../dataなどとしてdataディレクトリを作成すること。別の場所、名前でも構わないが、以後のサンプルコードではそれに応じて適宜dataディレクトリの名前を変更すること。いう名前のソースコードにコピーし、コンパイル・実行せよ。heat1_print_final_x_profディレクトリ../dataにtemp.final_profile_xという名前のファイルが出来ているはずである。†../data/temp.final_profile_xのデータをgnuplotでグラフにする。このデータの中身をエディタまたはheadコマンド、tailコマンドで確認せよ。gnuplotではコマンドプロンプトに入力する内容をスクリプトファイルから読み込ませることが出来る。以下の内容をheat1_print_final_x_prof.gpという名前のファイルに保存せよ。heat1_print_final_x_prof.gpと打て。ファイルheat1_print_final_x_prof.gpを自由に変更してグラフがどう変わるか試せ。gnuplotのヘルプはコマンドプロンプトでhelpと打てば得られる。次にアニメーションによって収束の様子を確認しよう。実行すればdataディレクトリに連番ファイルが出力される。†gnuplotのスクリプトを使えばアニメーションも簡単にできる。「gnuplotスクリプト自動生成プログラム」を作ったほうがよい。いうファイルに保存し、ソースコードの冒頭にあるUsageに従ってgnuplotによる可視化アニメーションを作れ。†1次元的な可視化(グラフ)はこのように簡単である。これ以降、次に正方形領域の温度場全体を表示する2次元的な可視化を行う。y方向のみの分割による並列化(1次元領域分割による並列化)よりももう少し実際的な2次元領域分割による並列化と、さらには、3次元熱伝導問題を解く問題にも挑戦したい。したがって、今後扱うコードは少しづつ複雑化していくので、ここでまずはheat2.f90(並列版コード)のリファクタリングをしておこう。以下のコードをthermal_diffusion.f90という名前で保存せよ。thermal_diffusion読みやすくなるように書き換えただけで、コードの内容は本質的にはheat2.f90と同じである。(変数名も一部変えている。temperature__output_2d_profileを二つ追加している。プログラムのdo-loopの中。)サブルーチンtemperature__output_1d_profileでは正方形を真ん中で縦に切る線上(x=1/2)での温度の分布を出力する。温度のデータは各プロセスが個別の持っている。それを集約してprof(:)という1次元配列(添字の範囲はj=0からMESH_SIZE+1まで)に収めている。ここでMPI_ALLREDUCE関数を利用している。thermal_diffusion.jsでscalarに投入できる。thermal_diffusion.f90コードを理解しておくこと。(レポート提出必要なし。今回の演習内容はどうでしたか?(どれか一つ、一度だけ押してください。「お名前」欄は空欄で可。コメントはありません。