all kinds of writing

all kinds of writing
***いつか整理***
自動配列(あらかじめサイズを宣言)はスタック領域を使用する場合が多く、ヒープ領域を使用することが多いallocatable配列よりも割り付けが高速な事が多い。ただし、逆に言うとスタックサイズを気にする必要がある。
----
#ifdef xxx
#if defined(xxx)
#ifndef xxx
#if .not. defined(xxx)
#if ! defined(xxx)
#if defined(xxx) || defined(yyy)
#if defined(xxx) && defined(yyy)
#if defined(xxx && yyy) <=ダメ?
-Dxxx=2等、特定の値を渡す
#if xxx==2
print *,”xxx=2”
#endif
プリプロセッサ用オプション名は、コンパイルに含めたfunction内の引数であってもプログラム内で定義された変数名と重複してはいけないようなので注意が必要.
-----
LAPACK等の外部サブルーチンを使うときは,引数として与えた配列等が上書きされてしまう事があるので注意. 元の配列を残したいときはdummy配列を作成する必要あり. 特に,自作サブルーチンでこのような事をする場合はメモリの無駄をなくすためにdummy配列はallocatableとし,用が済んだらdeallocateするように気をつける.
-----
++配列サイズに関する重要なコンパイラバグ++
intel compilerでは
例えば
allocate(x(2,5))
という配列を用意した場合でも、
x(2,6)=3.0
というような配列の割当をはみ出して操作する事ができてしまう。
何故かrun time errorにもならないので、重大なバグの温床になりかねないので細心の注意が必要。allocateではなく、配列の宣言時にサイズを明示した場合でも同様のバグ。
**その他、FX10で使用されている富士通コンパイラでも同様の症状を確認。
**gfortranはきちんとエラーをはいてくれる。恐らくgfortranはfortranのオリジナルのルールにより厳格に則っている一方、商用コンパイラは自由度を高めているのだろう。正直今回の点に関してはクレームもののバグだと思うが。。gfortranでは-fbounds-checkというデバッグ用オプションもあるみたい。
-----
現在いちいちコンパイルしている自作サブルーチン群は、スタティックライブラリにしてしまうのが良いかもしれない。
+ 必要なプログラムをいちいち確認する必要なし。makefileを作っておけば更新もさほど手間ではない。
ビルドに関しては以下のURL参照(#そのうち自分用に中身をコピー)。
ちなみに、当然ながらライブラリ内に同一名のサブルーチンを含めることはできない。ただし、以下の例のように、コンパイル時にライブラリとオブジェクトファイルが同一名のサブルーチンを持つ事は許容される。
my_lib.aとsub.f90がともにsubroutine hogeを含んでいるとし、main.f90がcall hogeをする。
$ ifort -o exe sub.o main.f90 my_lib.a
により生成されるexeを実行すると、sub.oのhogeがcallされる。つまり、ライブラリのsubroutineのほうが優先度が低いようである。コンパイルの順番依存もなさそう。ただし、コンパイル時に重複を怒られる場合もあったが、どういうケースがいけないのかは調べていないので不明。
Fortran関連