Una forma de garantizar que la carga del CSV se realiza una sóla vez es utilizando código global y variables globales. Lamentablemente, el archivo disponible no cuenta con las secciones comunes con lo que se supone una composición de ese código dentro del programa de simulación general.
Otra alternativa es utilizar variables en el data segment persistentes entre llamadas a la subrutina. Optamos por ese camino y utilizamos la palabra reservada SAVE para realizar un breve programa de prueba:
program read_csv_once implicit none call readAndPrint(1000) call readAndPrint(100) end program read_csv_once subroutine readAndPrint(test_offset) integer:: test_offset integer, parameter:: values_qty = 2 real, save, pointer:: pValues(:) logical, save:: pValues_initialized= .false. if (.not.pValues_initialized) then allocate(pValues(values_qty)) open(unit=99, file="act1.csv", action="read") read(99, *) pValues close(99) pValues = pValues + test_offset pValues_initialized = .true. endif write(*,*) "Values from file:", pValues write(*,*) "Values Quantity:", values_qty end subroutineNuevamente tenemos una cantidad fija de valores a leer del CSV dado que por el momento es un número conocido.
Notar que el puntero estático pValues NO posee un valor por defecto definido, es por ese motivo que se utiliza pValues_initialized para controlar si se hizo la lectura del CSV o no.
El resultado de correr este programa de pruebas es:
Values from file: 1003.6295 1003.6688 Values Quantity: 2 Values from file: 1003.6295 1003.6688 Values Quantity: 2
Demostrando que la inicialización se realizó una vez.