Frage

Ich verwende Python als Schnittstelle zu mehreren FORTRAN -Dateien in meinem Modell. Ich möchte eine FORTRAN -Datei mehrmals duplizieren, aber bei jeder Kopie werde ich die Parameter ändern, die mein Modell beschreiben.

Zum Beispiel: Ich habe die FORTRAN -Datei unten

!file.f
! This is a fortran code

!Parameters
alpha = 0.5
beta = 100
...

Ich möchte File.f mehrmals kopieren, so dass ich Datei1.f, File2.f, File3.f usw. habe. Bei jeder Datei doppelte ich jedoch die Parameter Alpha und Beta automatisch. Vielen Dank

Bearbeiten: Lassen Sie mich ein wenig weiter erklären. Ich verwende Python, um Datenassimilation (Kalman -Filterung) in Modelle zu implementieren, die bereits in FORTRAN entwickelt wurden. Im Grunde genommen ist die Funktionsweise bei jedem bestimmten Zeitschritt, den die FORTRAN -Modelle nicht mehr ausgeführt haben, und dann integriere ich reale Daten in Modelldaten und mache dies in Python. Nach der Integration (Assimilation) habe ich dann dieselben Modelle unter Verwendung neuer Parameter, die ich durch das Fusion von Daten aus Modell und Beobachtungen und die neuen Anfangsbedingungen erhalten habe, erneut ausgelöst. Ich benutze Python, um alles zu tun, außer das Modell auszuführen, das von Forran durchgeführt wird.

War es hilfreich?

Lösung

Ich denke, der beständigste Weg wäre, einen Vorlagenmotor zu verwenden. Python hat dann viel, in der Regel in Webanwendungen bereitgestellt.

Der Zweck von Templating -Motoren besteht jedoch genau darin, den Großteil des Codes zu ermöglichen, der NOS -Änderungen als statischer Text benötigt und durch einige spezielle Markups die mit Variablen interpoliert werden, die im Python -Code generiert werden.

Abhängig von der Komplexität Ihrer Parameter können Sie überhaupt keine Separte -Templating -Engine benötigen und einfach mit der Formatierungsfunktionen der Python -Saite fortfahren, wie im Beispiel.

Vorlagenmotoren können Ihnen ein wenig zusätzliche Kapazität bieten, da Sie Schleifen und Bedingungen innerhalb der Vorlage abrollen können.

Beispiel - Schreiben Sie Ihre FORTRAM -Vorlage so etwas wie:

!file.f
! This is a fortran code

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

Und im Python -Code schreiben Sie etwas wie:

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)

Andere Tipps

Hier ist ein Beispiel für das, was Sie tun könnten. Ich habe die verschiedenen (Alpha, Beta) -Paare in die platziert alpha_beta aufführen. Mit alpha_beta Ich entscheide mich, den Index der Paarposition als Wert zu verwenden, der den Dateinamen erhöht, aber es gibt eine Vielzahl von Möglichkeiten, wie Sie dies tun können. Dieser Code ist insofern zerbrechlich, als er viel über Ihre .f -Datei nimmt, aber da dies für Ihren persönlichen Gebrauch bei der Generierung dieser Dateien ist, werden Sie wohl in Ordnung sein (zB ich gehe auf die Informationen, die Sie angegeben haben, dass es vorhanden ist, in Ordnung Nur eine Instanz des Wortes Alpha zu Beginn einer Zeile in Ihrer Datei - wenn das nicht stimmt, können Sie möglicherweise besser einen Regex verwenden).

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()

Eine FORTRAN -Lösung könnte darin bestehen, die Parameterzeilen in eine separate Textdatei zu schreiben, und dann include Diese Datei in der FORTRAN -Quelle mit einer solchen Zeile wie folgt:

include 'parameters.inc'

Auf diese Weise können Sie einfach die Parameterdatei regenerieren, ohne die Datei mit dem Haupt -FORTRAN -Code zu berühren.

Zunächst denke ich, dass diese Lösung übertrieben ist, wie in mehreren Kommentaren angegeben. Ich würde mich für eine der folgenden zwei Optionen entscheiden, vorzugsweise die zweite, wenn Sie nicht viel Forran -Codierung durchführen.

  1. Lesen Sie die Parameter, die aus einer temporären Eingabedatei verwendet werden sollen, so etwas wie:

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

    Ändern Sie dann die Werte in der temporären Eingabedatei von Python oder SED.

  2. Übergeben Sie die Parameter als Argumente an die Forran -Unterroutine innerhalb von Python, indem Sie den FORTRAN -Code mit Python mit F2PY zusammenfassen. Der Forran -Code sieht aus wie:

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

    Dann mit F2Py kompilieren:

    f2py -c -m my_fortran_code file.f
    

    Und rufen Sie schließlich von innerhalb von Python an als:

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

Beide Lösungen müssen Sie nicht nur für die Änderung einiger Eingabeparameter neu kompilieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top