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


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です