programas - Desarrollo de código Fortran profesional: creación de archivo de registro
problemas resueltos de programación en fortran 95 pdf (3)
He visto personas implementar el registro en el nivel de compilador de una manera similar al método de Kyle Kanos con las directivas de preprocesador. No estoy de acuerdo con el estándar, pero sé que se puede hacer con algunos compiladores fortran.
Desarrollé un código Fortran que tiene las siguientes características:
- Variables globales
- 13 módulos con múltiples subrutinas
- Subrutinas independientes
- Uso de la biblioteca Intel MKL para bibliotecas LAPACK (Álgebra lineal)
- Leer y escribir archivos de texto
El código se ha vuelto bastante grande. Aunque en esta etapa estoy tratando de obtener la respuesta correcta, se desea la velocidad de ejecución del código.
Estaba escribiendo un archivo de registro de texto con etiquetas como ERROR: message
o INFO: message
hasta el momento. Pero escribir demasiada información ralentiza el código. Sé que en el desarrollo de Java utilizamos la biblioteca log4j para escribir de manera eficiente archivos de registro donde podemos activar o desactivar varios niveles de registro. Entonces, una vez que el código está limpio, podemos desactivar los registros de bajo nivel y simplemente mantener los registros de alto nivel.
Me gustaría saber de otros programadores cuál es la mejor manera de manejar esto en Fortran 90+.
La forma más fácil sería crear una variable entera verbose
y leer su valor en la ejecución (desde el archivo o desde la línea de comandos). Al hacer esto, puedes crear diferentes niveles:
- verbose = 0 => sin salida
- verbose = 1 => errors only
- verboso> = 2 => errores e información
Sería simple de implementar:
IF(verbose >= 1) CALL OutputError(message)
IF(verbose >= 2) CALL OutputInfo(message)
y así.
Estoy usando las siguientes macros de preprocesador para exactamente esta tarea (dentro de MACROS.h
):
#ifdef DEBUG
#define DWRITE write(*,*) __FILE__,__LINE__,
#define dwrite write(*,*) __FILE__,__LINE__,
#else
#define DWRITE !
#define dwrite !
#endif
En mi código, tengo el siguiente encabezado:
#define DEBUG
#include "MACROS.h"
...
dwrite ''An error occurred!''
Esto me da el archivo y la línea donde ocurrió el error, y al comentar la primera línea puedo activar / desactivar el mensaje fácilmente.
Podrías extender esto fácilmente a diferentes niveles de depuración y escribir en archivos ...