Fortran で書かれたプログラムをC#へ移行なんてあまりないかもしれませんが、以前に経験したことをまとめてみました。
既存の FORTRAN アプリケーションがファイルや標準入出力から入出力(READ/WRITE)を行う部分がもっとも工数がかかると思われます。C# へ移行する際に入出力を見直すか、READ/WRITE ステートメントを補完する同等の機能を C# で実装する必要があります。
全体的なデザイン
- C#で一つのクラスを作成しメインアプリケーションとする。Fortran プログラムのメイン部分を main 関数にて実装する
- Fortran の各SUBROUTINEを クラスのPublic な関数として実装する。
- Fortran のPARAMETER はクラス内のconst で変数で定義する
- Fortran のCOMMON はクラス内の 変数で定義する
- 算術 IF 文 「IF (式) 文番号, 文番号, 文番号」「GOTO (文番号, 文番号, …) 整数式」は if 文もしくは switch文にする
- ENTRY はできる限り関数化する
- Fortran アプリケーションの標準入出力へ出力している部分は、C#アプリケーションで別途関数を用意する。
- (処理系によるが)浮動小数点型数値の扱いについて有効桁数がFORTRAN と C# で異なる場合、丸め誤差が発生する可能性があるので、C# 側で丸め処理を行い極力 FORTRAN と同程度の精度を確保する
Fortran データ型とC#のデータ型の対比
Fortran | C# |
---|---|
REAL(4) | float |
REAL(8) | double |
REAL(16) | — |
CHARACTER(1) | byte |
CHARACTER(*) | string |
INTEGER(1) | sbyte |
INTEGER(2) | short |
INTEGER(4) | int |
INTEGER(8) | long |
FORTRAN とC# のライブラリ関数
Fortran | C# |
---|---|
ATAN2 | Math.Atan2 |
NINT | Math.Round *1 MidpointRounding.AwayFromZero |
MIN0 | Math.Min |
MOD | % 演算子 |
COS | Math.Cos |
CMPLX | Complex クラス *2 |
AMIN1 | Math.Min |
AMAX1 | Math.Max |
ABS | Math.Abs |
SIGN | — *3 |
SQRT | Math.Sqrt |
DCOS | Math.Cos |
DSIN | Math.Sin |
DSQRT | Math.Sqrt |
DATAN2 | Math.Atan2 |
べき乗 | Math.Pow |
*1 : Roundメソッドで四捨五入 MidpointRounding.AwayFromZero
*2 : Complexクラス .NET Framework 4.0 (Visual Studio 2010)より利用可能
*3 : シグモイド関数 ex) SIGN(x, y) y >= 0の場合 |x| y < 0の場合 -|x| float Sign(float x, float y) { if (y < 0) x = -x; return x; }
参考:
Fortran Reference: https://homepage2.nifty.com/nimu/docs/fortran_references.html
Equivalent Data Types between Fortran and C#: https://software.intel.com/en-us/articles/equivalent-data-types-between-fortran-and-c_sharp/
Using C/C++ and Fortran together: https://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html
Fortran ResQ: https://fortran.hiroshism.com/index.html
コメントを残す