東京大学地震研究所地震火山情報センター

付録



omplaceコマンドの-cオプション

$ omplace -np 4 -nt 6 -c 0-23:bs=4+st=6 ./a.out
bs= : 1つのMPIから生成されるスレッドの数
st= : MPIプロセスから隣のMPIプロセスまでのストライド数
例)
-cオプションの指定プロセス/スレッドが配置されるCPUコア
0-0,1,2, ... MAXCPU
1-:st=2all odd CPUs
0-70,1,2, ... 7
0,1,1-40,1,1,2,3,4
0-6:st=2,1-7:st=20,2,4,6,1,3,5,7
16-31:bs=2+st=416,17,20,21,...28,29


Topへ戻る

バイナリ変換のための環境変数

Fortranプログラムにおけるバイナリデータファイルの入出力を対象とした、エンディアンの変換方法を説明します。eic計算機(x86_64)システムではバイナリデータの形式としてリトルエンディアンを採用しています。旧システムと同じです。
ビッグエンディアン形式を採用しているシステムからのプログラムの移植を行うときなど、
エンディアン形式変換機能を使って、ビッグエンディアン形式のファイルを読み込む、あるいはビッグエンディアン形式のファイルを書き出すといった処理が可能です。
READ/WRITE時に変換が行なわれます:
  • READ文の実行でビッグエンディアンからリトルエンディアンへ変換
  • WRITE文の実行でリトルエンディアンからビッグエンディアンへ変換
次の6つの変換方法があります。優先順位の高いものから記述しています。(*)OPTIONS文はHP Fortran90の拡張機能です。

FORT_CONVERTn

環境変数 FORT_CONVERTnnに該当ファイルのユニット番号を指定し、環境変数の値として
  • BIG_ENDIAN
  • LITTLE_ENDIAN
を設定して下さい。このユニット番号のファイルを処理するREAD/WRITE文が変換を行います。他のREAD/WRITE文は変換を行いません。
ユニット番号28からビッグエンディアンデータを読み、ユニット番号29へリトルエンディアンデータを書き込む例。

$export FORT_CONVERT28=BIG_ENDIAN
$export FORT_CONVERT29=LITTLE_ENDIAN<--省略可

FORT_CONVERT.extまたはFORT_CONVERT_ext

*.datファイルからビッグエンディアンデータを読み、*.dataファイルへリトルエンディアンデータを書き込む例。

$export FORT_CONVERT.DAT=BIG_ENDIAN

環境変数としてドット(.)が使えないときには、FORT_CONVERT_extをお使い下さい。両方を指定すると、FORT_CONVERT.extが優先されます。

F_UFMTENDIAN

該当ファイルのユニット番号を環境変数 F_UFMTENDIAN に設定してください。このユニット番号のファイルを処理するREAD/WRITE文が変換を行います。他のREAD/WRITE文は変換を行いません。
環境変数の設定(空白は不可)

F_UFMTENDIAN|[MODE;]EXCEPTION
MODE=big|little
EXCEPTION=big:ユニット番号|little:ユニット番号

MODEはファイルの形式を指定します。littleを指定すると変換を行いません。
bigを指定すると変換を行います。省略するとlittleが設定されます。
EXCEPTIONにはMODE以外の形式を持つファイルを指定します。
例1)全てのファイルを変換したいとき

F_UFMTENDIAN=big

READ文によって入力ファイルはビッグ-リトル変換が行われ、WRITE文によってリトル-ビッグ変換が行われます。
例2)ユニット番号10と19のファイルだけを変換したいとき

F_UFMTENDIAN=”little;big:10,19”

F_UFMTENDIAN=10,19

全てのファイルはリトルエンディアン形式であることが前提で、10と19だけがビッグエンディアン形式を採用するということを設定しています。ユニット番号10と19のファイルはREAD/WRITE文によって変換されます。
例3)ユニット番号8のファイルだけ変換したくないとき

F_UFMTENDIAN=”big;little:8”

MODEでbigが指定されているので、全てのファイルについて変換されます。しかし、ユニット番号8のファイルだけは変換が行われません。
例4)ユニット番号10から19のファイルを変換したいとき

F_UFMTENDIAN=10-19

CONVERT

ユニット番号15のファイルを変換したいとき

OPEN(15,FILE='example.dat',FORM='UNFORMATTED',CONVERT='BIG_ENDIAN')

OPTIONS文

ビッグエンディアンデータを読み、ビッグエンディアンデータを書き込む例。ルーチンの外で指定する。
OPTIONS/CONVERT=BIG_ENDIAN
SUBROUTINEsub(a,b,n)
.....

コンパイルオプション-convert

ビッグエンディアンデータを読み、ビッグエンディアンデータを書き込む例。プログラムの全てのファイルが対象。

$ ifort  -convert  big_endiansample.f

Topへ戻る

FortranプログラムからCルーチンを呼び出す

Cルーチンを定義するときに、その名前の末尾に"_"(アンダースコア)を付けます。

例)
呼び出されるCルーチン(引数は"アドレス渡し"です)

% cat   add1.c

float  add1.c_(float*  px)
{
      return *px+1;
}


add1ルーチンを呼び出すFortranプログラム

% cat  main.f

        program   main
        real  x, add1()

        x = 5.0
        write(6,*)  add1(x)

        stop
        end

% icc  -c  add1.c
% ifort  main.f  add1.o
% dplace ./a.out


CプログラムからFortranルーチンを呼び出す

Fortranルーチンを呼び出すときに、その名前の末尾に"_"(アンダースコア)を付けます。

例)
呼び出されるFortranルーチン
%  cat  add1.f

        function  real  add1(x)
        real x

        add1 = x + 1

        return
        end

add1ルーチンを呼び出すCプログラム(引数は"アドレス渡し"です)
%  cat  main.c

main()
{
        extern  float  add1_(float* px);
        float x=5.0;

         printf("%f \n", add1_(&x));

          return 0;
}

%  ifort  -c  add1.f
%  icc main.c add1.o
%  dplace ./a.out

ifortコマンドでリンクするときは、-nofor-mainオプションを指定して下さい。

% icc  -c  main.c
% ifort  -nofor-main  add1.f  main.o
% dplace ./a.out

Fortranコンパイラマニュアルの以下の項目も参照下さい。

Fortranコンパイラマニュアル->アプリケーションのビルド->言語が混在したプログラミング


Topへ戻る