Skip to content
Snippets Groups Projects
lfi2cdf.f90 5.9 KiB
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
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------
! Modifications:
!  P. Wautelet 19/09/2019: add possibility to provide a fallback file if some information are not found in the input file
!-----------------------------------------------------------------
  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
  USE MODD_IO,            ONLY: LVERB_OUTLST, LVERB_STDOUT, NIO_ABORT_LEVEL, NIO_VERB, NGEN_ABORT_LEVEL, NGEN_VERB
  USE MODD_PARAMETERS,    ONLY: JPHEXT, JPVEXT
  USE MODD_TIMEZ,         ONLY: TIMEZ

  use mode_modeln_handler, only: Goto_model
  USE MODE_SET_GRID,      ONLY: INTERP_HORGRID_TO_MASSPOINTS
  USE mode_util
  USE MODI_VERSION
  IMPLICIT NONE 
  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
  TYPE(TFILE_ELT),DIMENSION(MAXFILES) :: outfiles

  TYPE(workfield), DIMENSION(:), POINTER :: tzreclist

  type(option),dimension(:),allocatable :: options
  character(len=:),allocatable :: hinfile, houtfile
  integer                      :: runmode
  CALL Goto_model(1)

  CALL INI_CST

  ALLOCATE(TIMEZ) !Used by IO_WRITE_FIELD
  NIO_VERB  = NVERB_WARNING
  NGEN_VERB = NVERB_WARNING
  NIO_ABORT_LEVEL = NVERB_FATAL
  NGEN_ABORT_LEVEL = NVERB_FATAL
  LVERB_OUTLST = .FALSE.
  LVERB_STDOUT = .TRUE.

  call read_commandline(options,hinfile,houtfile,runmode)

  if (options(OPTVERBOSE)%set) then
    NIO_VERB  = NVERB_DEBUG
    NGEN_VERB = NVERB_DEBUG
  end if

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

  IF (runmode == MODELFI2CDF) THEN
     LCDF4    = .TRUE.
     LLFIOUT  = .FALSE.
     LLFIREAD = .TRUE.
  ELSE IF (runmode == MODECDF2CDF) THEN
     LCDF4    = .TRUE.
     LLFIOUT  = .FALSE.
     LLFIREAD = .FALSE.
  ELSE
     LCDF4    = .TRUE.
     LLFIOUT  = .TRUE.
     LLFIREAD = .FALSE.
  CALL OPEN_FILES(infiles, outfiles, nfiles_out, hinfile, houtfile, nbvar_infile, options, runmode)
  IF (options(OPTLIST)%set) STOP
  !Set and initialize parallel variables (necessary to read split files)
  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 )

  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 +
        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
        nbvar = nbvar_infile
     ! Conversion LFI -> NetCDF
     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)
     ! Conversion netCDF -> netCDF
     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)
  if ( options( OPTFALLBACK )%set ) then
    CALL CLOSE_FILES(infiles, 2)
  else
    CALL CLOSE_FILES(infiles, 1)
  end if
  CALL CLOSE_FILES(outfiles,nfiles_out)