Common module
commonモジュール(module common_module)内には、プログラム全体で共通性の高い定数や手続きがまとめられている。これらの定数や手続きが必要なときには、できる限り(自分で定義せずに)これらを使用することが望ましい。プログラムをメンテナンスする際に有効である。以下にその一覧を示すが、必要に応じてソースコードを参照のこと。
定数(単位はSI)
| kB: | ボルツマン定数 1.3806505d-23 |
|---|---|
| NA: | アボガドロ定数 6.0221415d23 |
| pi: | 円周率 3.141592… |
| qe: | 素電荷 1.6021176565d-19 |
| eps0: | 真空の誘電率 8.854187817d-12 |
| kc: | クーロン定数 1/(4*pi*eps0) |
| R: | 気体定数 kB*NA |
| i_unit: | 虚数単位 |
| BR: | 改行文字 |
| max_string_length: | |
| |
単位 (to SI: 掛け算、from SI: 割り算)
- e
- 電荷 原子単位 ― クーロン
- cal
- エネルギー カロリー ― ジュール
- angs
- 長さ オングストローム ― メートル
- degree
- 角度 度 ― ラジアン
- mol
- 個数 個 ― モル
- g
- 質量 グラム ― キログラム
- kcal
- エネルギー キロカロリー ― ジュール
添字計算
- LTM_index (i, j [,k])
- 2次元または3次元の下三角行列の添字のセットから、1次元化した添字を返す関数。
i, j, k(入力、整数): 下三角行列の添字のセット。行列の次元に応じて2個または3個指定する。i > j > kの条件が必要。
- omp_start_end_index (n, start, end)
- OpenMP並列計算時のループの開始番号及び終了番号を得るサブルーチン。
- n (入力):並列作業の全体の個数(全体のループ長)。
- start, end (出力):このサブルーチンを呼び出されたスレッドが実行する部分を示す。すなわち、1~n の作業のなかで、当該スレッドはstart ~ end の部分を受け持つ。(1 ≤ start ≤ end ≤ n)
- exchange (i, j)
- i と j の値を交換するサブルーチン。
- i, j(入出力、整数):
テキスト処理
- getword (line, word, separator)
- 文字列lineから初めの1単語を取り出すサブルーチン。
- line(入出力、文字列): 入出力の文字列。出力では、取り出した単語を除いた残りの文字列になって返される。
- word(出力、文字列): separator文字を区切りとして、上の文字列line中の初めの単語(空白文字を除く)を返す。
- separator(入力、1文字 optional): 単語の区切り文字。指定しないと空白文字 ” “。
separatorが空白文字の場合に限り、複数個の空白文字を1つの区切りとみなす。
出力の単語wordには、(separatorが空白でなくても)前後の空白文字は除かれる。
- skip_lines_until (key, unit[,condition])
- ファイルを key が出る行まで読み飛ばすサブルーチン。
- key(入力、文字列): 判定する文字列
- unit(入力、整数): ファイルの装置番号
- condition(入力、文字列):検索条件。 “all” のとき完全一致。
その他(指定しない)の場合、はじめの単語が一致。
上のgetwordのルールで、文字列keyが(空白を除いた)先頭の単語として現れるまで装置番号unitのファイルの行を読み飛ばす。keyが現れなければ、最後の行まで読む。rewindはしないので、必要なら自分で行うこと。
- remove_comment (line)
- 文字列line からコメント(#以降)を除去するサブルーチン。
- line(入出力、文字列): 入出力の文字列で、出力時に変更される。
- get_num_words (line, separator)
- 文字列line の単語数を返す関数。出力は整数。
- line(入力、文字列): 単語数を数える文字列。
- separator(入力、1文字 optional): 単語の区切り文字。指定しないと空白文字 “ “。
単語を数える際、文字列lineの前後の空白は無視する。
さらにseparatorが空白のときに限って、複数個の空白を1個の区切りとみなすため、separatorが空白かそれ以外かで単語数の数え方が違う点に注意。
separator=” “ のとき、 ” A B “ → 2個、” “ → 0個
separator=”&“ のとき、“ A & B “ → 2個、“ & A && B & “ → 5個、 “ & “ → 2個
- str (var [,format])
- 整数または実数の変数var をテキストに変換する関数。
- var(入力、整数または実数): 入力の変数型は内部で判定する。
- format(入力、文字列optional): テキストに変換するフォーマットを指定する文字列。指定しなければ、整数、実数でそれぞれ ”(i10)”, “(e20.10)” となる。
- s2i (var)
- character型の変数varをinteger型に変換する関数。
- s2d (var)
- character型の変数varをdouble precision型に変換する関数。
- is_integer (string)
- 文字列string が整数かどうかを判定する関数。出力は論理型。
- get_list (info, x_name, list)
- info で指定された条件で添字番号を得るサブルーチン。
- info (入力、文字列): 原子を指定する条件の文字列。
- x_name(入力、文字列の配列): 系全体の原子のリスト。
- list(出力、整数配列): 条件に当てはまる原子の番号。
infoで指定できるサイト情報には、以下の3通りのフォーマットが許される。
"OW" → サイト名 "OW" で指定した全サイト "1 2 3" → サイト番号 1,2,3 のサイト "1:100" → サイト番号 1 から 100 までのサイト
これらはスペースで区切って組み合わせが許される。例えば、”OW 1 2 3:8” など。
*** 個々のワードは1024字を超えないこと。
例として、
info = “OW 4:6”, x_name = (/ “OW”, “OW”, ”H”, ”S”, “N”, “H”, “O” /) ならば、
list = (/ 1, 2, 4, 5, 6 /) となる。
物理計算
- center (x [,box_size], w)
- 重心を計算する関数。
- x(入力、実数配列(1:3, 1:n)):粒子の座標のセット。[1]
- box_size(入力、実数配列(1:3) optional): 周期境界の場合のボックス長x, y, z。
これを指定すると、周期境界条件での重心を求める。
- w(入力、実数配列(1:n)):粒子の質量のセット。[1]
- center(出力、実数配列(1:3)):重心の座標。
- rotate (x, phi, theta, psi)
- 座標回転を行う関数。
- x(入力、実数配列(1:3, 1:n)): 回転する座標のセット。[1]
- phi, theta, psi(入力、実数): 3つのオイラー角
- rotate(出力、実数配列(1:3, 1:n)): 回転された座標のセット。
座標変換は、回転行列 (実験系から分子固定系への変換に対応)
の転置行列 (分子固定系から実験系への変換に対応)
をかけることによって行う。行列 の定義(転置ではないかどうか)に注意。
※ 行列Aの定義(オイラー角)は 「コンピュータ・シミュレーションの基礎第2版」岡崎進・吉井範行著 3章 p48-p51 に合わせてある。
- : z 軸の回転
- : x 軸の回転
- : z 軸の回転
- maxwell (v [,p], m, T)
- マクスウェル分布に従う速度を返すサブルーチン。
- v(出力、実数配列(1:3)): 速度。
- p(出力、実数配列(1:3) optional): 運動量。4つの引数を与えたときには、2番目の引数を運動量の出力として用いる。
- m(入力、実数): 質量。
- T(入力、実数): 温度。
乱数
- makeseed ([unit])
- 乱数のシードを決定するサブルーチン。
- unit(入力、整数optional): これを指定すると、決定された初期シードの値を装置番号unitのファイルに書き出す。
- rand ([min, max])
- 一様乱数を返す関数。min, max には整数、実数を指定できる。
- min, max(入力、実数または整数 optional):
引数がない場合は 0 から 1 の間の実数、
倍精度実数の引数を指定した場合,その範囲内の実数を返す。
整数の引数を指定した場合,その範囲内の整数を返す。
- grand ()
- 標準正規乱数(平均0、分散1)を返す関数。出力は実数。
入出力
- integer funciton newunit ([file]) result(unit)
- 新しい装置番号 unit を取得する関数。今までに使われていない装置番号で新たにファイルをオープンする際に用いる。
- file(入力、文字列 optional): ファイル名。これが指定された場合、新しい(使われていない)装置番号 newunit を取得して、さらに指定のファイルをその装置番号でオープンする。
- character(len=max_string_length) function getline(unit,iostat) result(line)
- 装置番号 unit で指定されるファイルから一行読み取り、テキストとして返す。
- この際、空行は無視、コメント部分(#以下)は除去される。
以下未編集
- warning (message, file, line [,unit]):
- error (message, file, line [,unit]):
- write_log (message [,unit]):
警告、エラー、ログ出力を行うサブルーチン。
- message(入力、文字列):出力するメッセージの文字列。
- file(入力、文字列):出力の際に一緒に示すファイル名。
- line(入力、整数):出力の際に一緒に示す行番号。
- unit(入力、整数 optional):出力先のファイル装置番号。指定しなければ、エラーと警告は標準エラー出力、ログは標準出力になる。
※ サブルーチンerrorが呼び出されたときには、プログラムは停止する。
※ fileやlineは、エラーや警告を起こしたソース上での場所を示すために用いられ、実引数としては通常それぞれ “__FILE__”, “__LINE__” を用いられる。[2]
- set_new_unit_start (unit)
- newunit で返す装置番号の初期値を指定するサブルーチン。
- unit(入力、整数):初期値として設定する装置番号。
何も指定しないとdefaultの初期値は10である。これ以降newunitが呼ばれることに1ずつ増えた値の装置番号を使用していく。MPI計算の際には初期値の変更が必要。
- set_warnunit (unit):
- set_errorunit (unit):
- set_logunit (unit):
警告、エラー、ログのデフォルトの出力先を指定するサブルーチン。それぞれのdefault(標準エラー出力 0、標準出力 6)を変更する際に用いる。
- isEOF (unit)
- ファイルが終了しているか判定する関数。 終了している場合 .true. を返す。 read 文による iostat の判定よりも事前に確認した方がエラー出力等の面で優れているため、終了判定ではこの関数を使用すること。
- unit(入力、整数): 装置番号
システム関連
- test (TF [,true, false, unit])
- ロジカル変数TFの真偽でそれに応じた出力を行うサブルーチン。主にデバッグ用。
- TF(入力、論理型):
true, false(入力、文字列 optional): TF= .true. の際には、文字列 ”T” および文字列trueを出力し、TF= .false. の際には、文字列 ”F” と文字列falseを出力する。この文字列を指定しないときには、単に ”T” または ”F” を出力する。
- unit(入力、整数 optional): 出力する装置番号。指定がなければ標準出力。
- stop ()
- プログラムを(エラー)終了するサブルーチン。 通常のstop文ではmpi実行時に問題がある場合があるので基本的にはこちらを使用すること。
- get_clock_time (time)
- 現在の日時・時刻をテキスト形式で返すサブルーチン。
- time(出力、文字列):
このサブルーチンを呼び出す実引数では、出力のテキストが収まるだけの文字列の長さが必要である。len=80程度を推奨する。
ソート
- sort (index, values)
- 配列values が小さい順にindexを並び替えるサブルーチン。
- index(入出力、整数配列(1:n)):
- values(入力、実数配列(1:n)):
このサブルーチン実行後に、
values(index(1)) ≤ values(index(2)) ≤ ... ≤ values(index(n))
となる。nの値は配列の大きさから自動で読み取られる。
- sort_string (info)
- info を並び替えるサブルーチン。
- info(入出力、文字列):この文字列として空白で仕切られた単語のセットを入力すると、単語ごとに「小さい順に(OKAY?)」並べ替えて空白で仕切った一つの文字列を返す。
行列計算
- inverse (A)
- 逆行列を計算する関数。
- det (A)
- 行列式を計算する関数。
これらの関数内では、Lapackライブラリが用いられている。
ベクトル計算
- vector_product(A,B)
- ベクトルの外積を計算する関数。出力は
- A, B(入力、実数配列(1:3)): 外積を計算させたい2つのベクトル