>> FORTRANによるフラグメントセパレータ

>>って何?

定磁場中での荷電粒子の運動が、比電荷に比例する曲率半径の円運動であることを利用して、 原子核を比電荷により分別する手法。

以後ひとくちメモ。

>> FORTRANのif文

条件の後に実行したい文が1行なら、条件節に続けて書くことで end if を省略できる。

>> FORTRANのif文 Reloaded

条件節のカッコ内は真理値が true/false でさえあれば何でもよい。 たとえば、式 : left .eq. right は、 .true. または .false.(二つまとめて"ブール値")を返す2項関数 .eq.(left, right)と同様な働きをする。 従って、変数 condition が .true. または .false. を取るとき、 if (condition .eq. .true.) は if (condition) と同値な書き方。
ついでに言うと、カッコ内に数値を書いても、それがゼロでなければ .true.、ゼロであれば .false. と判断される。 つまり、 if(0) は常に無視されるが、 if(9073407) は常にOKとなる。もちろん変数を書いても良。 ただし、実数型は避けた方がいいかしんない。

>> 静的な変数とBox-Müller法

関数とかサブルーチンの中で宣言した変数は、それが終わる(endなりreturnなりに達する)と破棄される。 しかし、宣言した後で save 文をつけておくと、その変数は関数やサブルーチンが終わっても、 メインプログラムが終わるまでずっと値を保持しつづける(静的な変数)。 例えば、
real function counter()
real stacks
save stacks
stacks = stacks + 1
return stacks
end
とすると、 counter() は最初に呼んだときには1、次に呼んだときには2を返す(はず。試してない)。
save文の行を削除してみると、今度は何回呼んでも1しか返ってこない何が返ってくるかはまったく保証されない。 save文で指定した変数は、最初に宣言した瞬間にゼロに初期化されるだけだが、 そうでない場合は宣言しただけだと「箱だけ」確保された状態、つまり中に何が入っているか一切判らない状態になる。
save文を使うと、Box-Müller法で作った正規乱数が効率良く使える。 Box-Müller法では、1回につき2つの一様乱数を一度に用いて2つの正規乱数を得られる。 しかし、乱数を一度に2つ取り出して利用するのはすごく面倒くさい。 そこで、save文をうまく使えば、「2回に1回だけ乱数生成を行い、生成しないときは前回返さなかった方の乱数を返す」、 という動きをする関数を作ることができる。 これで効率は単純に2倍となる。

accend->works->labnote->index page