147月/120
Fortran からC#への移行
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: http://homepage2.nifty.com/nimu/docs/fortran_references.html
Equivalent Data Types between Fortran and C#: http://software.intel.com/en-us/articles/equivalent-data-types-between-fortran-and-c_sharp/
Using C/C++ and Fortran together: http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html
Fortran ResQ: http://fortran.hiroshism.com/index.html