Pregunta

Estoy usando Python como interfaz para varios archivos Fortran en mi modelo. Quiero duplicar un archivo Fortran varias veces, pero en cada copia, cambiaré los parámetros que describen mi modelo.

Por ejemplo: tengo el archivo Fortran a continuación

!file.f
! This is a fortran code

!Parameters
alpha = 0.5
beta = 100
...

Quiero copiar file.f varias veces de tal manera que tenga file1.f, file2.f, file3.f, etc. Sin embargo, en cada archivo duplicado quiero cambiar los parámetros alfa y beta automáticamente. Gracias

Editar: Déjame explicarte un poco más. Estoy usando Python para implementar la asimilación de datos (filtrado de Kalman) a los modelos que ya se han desarrollado en Fortran. Básicamente, cómo funciona es en cada paso especificado. Luego, después de la integración (asimilación), vuelvo a ejecutar los mismos modelos, sin embargo, esta vez usando nuevos parámetros que obtuve de fusionar datos del modelo y las observaciones y las nuevas condiciones iniciales. Utilizo Python para hacer todo, excepto ejecutar el modelo que está haciendo Fortran.

¿Fue útil?

Solución

Creo que la forma más consistente de hacerlo sería usar un motor de plantilla. Python tiene mucho de entonces, generalmente implementado dentro de las aplicaciones web.

Pero el propósito de la plantilla de los motores es permitir exactamente que uno tenga la mayor parte del código, que necesita cambio de NOS como texto estático, y a través de algún marcado especial interpolar que con variables generadas dentro del código de Python.

Dependiendo de la complejidad de sus parámetros, incluso podría no necesitar ningún motor de plantilla de separte, y simplemente continúe con las capacidades de formación de cadenas de python, como en el ejemplo a continuación.

Los motores de plantilla podrían proporcionarle un poco de capacidad adicional, como la capacidad de desenrollar bucles y condicionales dentro de la plantilla.

Ejemplo: escriba su plantilla Forttram algo así como:

!file.f
! This is a fortran code

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

Y en el código de Python, escriba algo como:

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)

Otros consejos

Aquí hay un ejemplo de lo que podría hacer. He colocado los diversos pares (alfa, beta) en el alpha_beta lista. Con alpha_beta Estoy eligiendo usar el índice de la posición del par para ser el valor que incrementa el nombre del archivo, pero hay una variedad de formas en que podría hacerlo. Este código es frágil, ya que asume mucho sobre su archivo .f, pero dado que esto es para su propio uso personal en la generación de estos archivos, creo que estará bien (por ejemplo, supongo que en función de la información que ha proporcionado que existe. Solo una instancia de la palabra alfa al comienzo de una línea en su archivo: si eso no es cierto, podría ser mejor usar una 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()

Una solución de Fortran podría ser escribir las líneas de parámetros en un archivo de texto separado, y luego include ese archivo en la fuente de Fortran con una línea como esta:

include 'parameters.inc'

De esta manera, simplemente puede regenerar el archivo de parámetros, sin tener que tocar el archivo que contiene el código principal de Fortran.

En primer lugar, creo que esta solución es exagerada como se indica en varios comentarios. Yo iría a cualquiera de las siguientes dos opciones, preferiblemente la segunda si no realizará mucha codificación de Fortran.

  1. Lea los parámetros que se utilizarán desde un archivo de entrada temporal, algo así como:

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

    Luego cambie los valores en el archivo de entrada temporal de Python o con SED.

  2. Pase los parámetros como argumentos a la subrutina Fortran desde Python, interfaciendo el código Fortran con Python usando F2PY. El código FORTRAN se ve como:

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

    Luego compile con f2py:

    f2py -c -m my_fortran_code file.f
    

    Y finalmente llamar desde dentro de Python como:

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

Ambas soluciones no requieren que recompire ningún código Fortran solo para cambiar algunos parámetros de entrada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top