Para completar la idea de utilizar un vector desde un archivo dentro del código de
code saturne es importante dar ciertas garantías de performance. La subrutina a utilizar se encuentra dentro del archivo
usclim.f90 que es utilizado de forma repetitiva durante la simulación.
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 subroutine
Nuevamente 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.