Newer
Older
!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence

WAUTELET Philippe
committed
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------

WAUTELET Philippe
committed
! Modifications:
! P. Wautelet 19/09/2019: add possibility to provide a fallback file if some information are not found in the input file
!-----------------------------------------------------------------

WAUTELET Philippe
committed
program LFI2CDF

WAUTELET Philippe
committed
USE MODD_CONF, ONLY: CPROGRAM
USE MODD_CONFZ, ONLY: NB_PROCIO_R
USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX
USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM

WAUTELET Philippe
committed
USE MODD_IO, ONLY: LVERB_OUTLST, LVERB_STDOUT, NIO_ABORT_LEVEL, NIO_VERB, NGEN_ABORT_LEVEL, NGEN_VERB

WAUTELET Philippe
committed
USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT
USE MODD_TIMEZ, ONLY: TIMEZ

WAUTELET Philippe
committed
use mode_field, only: Ini_field_list

WAUTELET Philippe
committed
USE MODE_IO, ONLY: IO_Init, IO_Config_set

WAUTELET Philippe
committed
use mode_ll
use mode_modeln_handler, only: Goto_model

WAUTELET Philippe
committed
USE mode_options
USE MODE_SET_GRID, ONLY: INTERP_HORGRID_TO_MASSPOINTS

WAUTELET Philippe
committed
USE MODE_SPLITTINGZ_ll, ONLY: INI_PARAZ_ll

WAUTELET Philippe
committed

WAUTELET Philippe
committed
USE MODN_CONFIO, ONLY: LCDF4, LLFIOUT, LLFIREAD
INTEGER :: ji
INTEGER :: nbvar_infile = 0 ! number of variables available in the input file
INTEGER :: nbvar_tbr = 0 ! number of variables to be read
INTEGER :: nbvar_calc = 0 ! number of variables to be computed from others
INTEGER :: nbvar_tbw = 0 ! number of variables to be written
INTEGER :: nbvar = 0 ! number of defined variables
INTEGER :: IINFO_ll ! return code of // routines
INTEGER :: nfiles_out = 0 ! number of output files

WAUTELET Philippe
committed
CHARACTER(LEN=:),allocatable :: hvarlist

WAUTELET Philippe
committed
TYPE(TFILE_ELT),DIMENSION(2) :: infiles
TYPE(TFILE_ELT),DIMENSION(MAXFILES) :: outfiles
TYPE(workfield), DIMENSION(:), POINTER :: tzreclist

WAUTELET Philippe
committed
type(option),dimension(:),allocatable :: options
character(len=:),allocatable :: hinfile, houtfile
integer :: runmode

WAUTELET Philippe
committed

WAUTELET Philippe
committed

WAUTELET Philippe
committed
CPROGRAM = 'LFICDF'

WAUTELET Philippe
committed
CALL IO_Init()

WAUTELET Philippe
committed
CALL VERSION

WAUTELET Philippe
committed
CALL INI_CST
ALLOCATE(TIMEZ) !Used by IO_WRITE_FIELD

WAUTELET Philippe
committed
NIO_VERB = NVERB_WARNING
NGEN_VERB = NVERB_WARNING

WAUTELET Philippe
committed
NIO_ABORT_LEVEL = NVERB_FATAL
NGEN_ABORT_LEVEL = NVERB_FATAL
LVERB_OUTLST = .FALSE.
LVERB_STDOUT = .TRUE.

WAUTELET Philippe
committed
call read_commandline(options,hinfile,houtfile,runmode)
if (options(OPTVERBOSE)%set) then
NIO_VERB = NVERB_DEBUG
NGEN_VERB = NVERB_DEBUG
end if

WAUTELET Philippe
committed
IF (options(OPTMERGE)%set) THEN
NB_PROCIO_R = options(OPTMERGE)%ivalue
ELSE
NB_PROCIO_R = 1
END IF

WAUTELET Philippe
committed
IF (runmode == MODELFI2CDF) THEN
LCDF4 = .TRUE.
LLFIOUT = .FALSE.
LLFIREAD = .TRUE.

WAUTELET Philippe
committed
CALL IO_Config_set()

WAUTELET Philippe
committed
ELSE IF (runmode == MODECDF2CDF) THEN
LCDF4 = .TRUE.
LLFIOUT = .FALSE.
LLFIREAD = .FALSE.

WAUTELET Philippe
committed
CALL IO_Config_set()

WAUTELET Philippe
committed
ELSE
LCDF4 = .TRUE.
LLFIOUT = .TRUE.
LLFIREAD = .FALSE.

WAUTELET Philippe
committed
CALL IO_Config_set()

WAUTELET Philippe
committed
END IF

WAUTELET Philippe
committed
CALL INI_FIELD_LIST()

WAUTELET Philippe
committed
CALL OPEN_FILES(infiles, outfiles, nfiles_out, hinfile, houtfile, nbvar_infile, options, runmode)
IF (options(OPTLIST)%set) STOP

WAUTELET Philippe
committed
!Set and initialize parallel variables (necessary to read split files)

WAUTELET Philippe
committed
CALL SET_JP_ll(1,JPHEXT,JPVEXT,JPHEXT)
CALL SET_DAD0_ll()
CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, NKMAX)
CALL SET_XRATIO_ll(1, 1)
CALL SET_YRATIO_ll(1, 1)
CALL SET_XOR_ll(1, 1)
CALL SET_XEND_ll(NIMAX_ll+2*JPHEXT, 1)
CALL SET_YOR_ll(1, 1)
CALL SET_YEND_ll(NJMAX_ll+2*JPHEXT, 1)
CALL INI_PARAZ_ll(IINFO_ll)
! This has to be done after INI_PARAZ_ll and after reading of XXHAT and XYHAT (in OPEN_FILES)
ALLOCATE(XXHATM(NIMAX_ll+2*JPHEXT))
ALLOCATE(XYHATM(NJMAX_ll+2*JPHEXT))
! Interpolations of positions to mass points
CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )

WAUTELET Philippe
committed
IF (runmode == MODELFI2CDF .OR. runmode == MODECDF2CDF) THEN
IF (options(OPTVAR)%set) THEN
! nbvar_tbr is computed from number of requested variables
! by counting commas, = and +
nbvar_tbr = 1
nbvar_calc = 0
nbvar_tbw = 1

WAUTELET Philippe
committed
hvarlist = options(OPTVAR)%cvalue
DO ji=1,len(hvarlist)
IF (hvarlist(ji:ji) == ',' .OR.hvarlist(ji:ji) == '+') THEN
nbvar_tbr = nbvar_tbr+1
END IF
IF (hvarlist(ji:ji) == ',') THEN
nbvar_tbw = nbvar_tbw+1
END IF
IF (hvarlist(ji:ji) == '=') THEN
nbvar_calc = nbvar_calc+1
END IF
END DO
nbvar = nbvar_calc + nbvar_tbr
ELSE
ELSE
nbvar = nbvar_infile

WAUTELET Philippe
committed
IF (runmode == MODELFI2CDF) THEN
IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,nfiles_out,houtfile,nbvar_tbw,options)
CALL parse_infiles(infiles,outfiles,nfiles_out,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,options,runmode)
CALL def_ncdf(infiles,outfiles,nfiles_out)
CALL fill_files(infiles,outfiles,tzreclist,nbvar,options)

WAUTELET Philippe
committed
ELSE IF (runmode == MODECDF2CDF) THEN
IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,nfiles_out,houtfile,nbvar_tbw,options)
CALL parse_infiles(infiles,outfiles,nfiles_out,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,options,runmode)
CALL def_ncdf(infiles,outfiles,nfiles_out)
CALL fill_files(infiles,outfiles,tzreclist,nbvar,options)
ELSE
! Conversion NetCDF -> LFI
CALL parse_infiles(infiles,outfiles,nfiles_out,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,options,runmode)
CALL fill_files(infiles,outfiles,tzreclist,nbvar,options)

WAUTELET Philippe
committed
if ( options( OPTFALLBACK )%set ) then
CALL CLOSE_FILES(infiles, 2)
else
CALL CLOSE_FILES(infiles, 1)
end if
CALL CLOSE_FILES(outfiles,nfiles_out)

WAUTELET Philippe
committed

WAUTELET Philippe
committed
end program LFI2CDF