>> 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