ファイルを複製する方法がありますが、内部のいくつかのパラメーターを変更しますか?

StackOverflow https://stackoverflow.com/questions/8844547

質問

PythonをモデルのいくつかのFortranファイルのインターフェイスとして使用しています。 Fortranファイルを数回複製したいのですが、各コピーでモデルを説明するパラメーターを変更します。

たとえば、以下にFortranファイルがあります

!file.f
! This is a fortran code

!Parameters
alpha = 0.5
beta = 100
...

file1.f、file2.f、file3.fなどができるようにfile.fを何度かコピーしたいと思います。ただし、複製された各ファイルで、パラメーターアルファとベータを自動的に変更する必要があります。ありがとう

編集:もう少し説明させてください。 Pythonを使用して、Fortranですでに開発されているモデルにデータ同化(Kalmanフィルタリング)を実装しています。基本的に、それがどのように機能するかは、指定された各時間ステップであり、Fortranモデルが実行を停止し、現実世界データをモデルデータに統合し、Pythonでこれを行います。その後、統合(同化)の後、私は同じモデルを再実行しましたが、今回はモデルと観測からデータを融合することから得た新しいパラメーターを使用して、新しい初期条件を使用しました。 Pythonを使用して、Fortranによって行われているモデルを実行する以外にすべてを行います。

役に立ちましたか?

解決

最も一貫した方法は、テンプレートエンジンを使用することだと思います。 Pythonには多くのことがあり、通常はWebアプリケーション内に展開されています。

しかし、テンプレートエンジンの目的は、コードの大部分を持つことができ、静的テキストとしてNOSの変更が必要であり、Pythonコード内で生成された変数を使用して、特別なマークアップを介して補間することです。

パラメーターの複雑さに応じて、Separteテンプレートエンジンはまったく必要ありません。Bellowのように、Python Stringフォーミング機能を続けてください。

テンプレートエンジンは、テンプレート内のループや条件を解除する機能として、少し余分な容量を提供できます。

例-FORTRAMテンプレートを書く:

!file.f
! This is a fortran code

!Parameters
alpha = %(alpha)s
beta = %(beta)s

そして、Pythonコードで、次のようなものを書きます

template = open("fortram_template.for", "rt").read()
data = {"alpha": 0.5, "beta": 100}

with open("fortram_1.for", "wt") as output:
    output.write (template % data)

他のヒント

これがあなたができることの例です。さまざまな(アルファ、ベータ)ペアを配置しました alpha_beta リスト。と alpha_beta ペアポジションのインデックスを使用して、ファイル名を増やす値にすることを選択していますが、これを行うことができるさまざまな方法があります。このコードはあなたの.fファイルについて多くを想定しているという点で脆弱ですが、これはこれらのファイルを生成するのにあなた自身の個人的な使用であるため、あなたは大丈夫だと思います(例えば、あなたが提供した情報に基づいて仮定しますファイルの行の開始時にアルファという単語の1つのインスタンスのみが、それが真実でない場合は、regexを使用する方が良いかもしれません)。

alpha_beta = [(0.1, 16), (0.9, 50), (0.4, 76)]
file_name = 'file'
file_ext = '.txt'

for index, vars in enumerate(alpha_beta, start=1):
    with open(file_name + file_ext) as f:
        alpha, beta = vars
        new_file = open(file_name + str(index) + file_ext, 'w')
        for line in f:
            if line.startswith('alpha'):
                new_file.write('alpha = %s \n' % str(alpha))
            elif line.startswith('beta'):
                new_file.write('beta = %s \n' % str(beta))
            else:
                new_file.write(line)
        new_file.close()

Fortranソリューションは、パラメーター行を別のテキストファイルに記述し、次に include このような行を持つFortranソースのそのファイル:

include 'parameters.inc'

これにより、メインのFortranコードを含むファイルをタッチすることなく、パラメーターファイルを単純に再生できます。

まず第一に、いくつかのコメントで述べたように、このソリューションはやり過ぎだと思います。私は次の2つのオプションのいずれかに行きます。できれば2番目のオプションは、多くのFortranコーディングをしていない場合は2つ目です。

  1. 一時的な入力ファイルから使用するパラメーターを読み取ります。

    !file.f
    !This is a fortran code
    
    !Parameters
    open (unit=input, file='tmp_inp.txt', action='read', iostat=ierr)
    read (input, '(...)') alpha, beta
    

    次に、PythonまたはSEDで一時入力ファイルの値を変更します。

  2. F2PYを使用してPythonとFortranコードをインターフェースすることにより、Python内からFortran Subroutineに引数としてパラメーターを渡します。 Fortranコードは次のように見えます:

    !file.f
    !This is a fortran code
    subroutine my_sub(alpha, beta)
    ...
    

    次に、F2PYでコンパイルします。

    f2py -c -m my_fortran_code file.f
    

    そして最後に、Python内から次のように呼び出します。

    #python code
    from my_fortran_code import my_sub
    my_sub(alpha, beta)
    

どちらのソリューションでも、いくつかの入力パラメーターを変更するためだけにFortranコードを再コンパイルする必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top