カテゴリー: C#

  • 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