Skip to content
Snippets Groups Projects
read_all_data_mesonh_case.f90 13.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • !MNH_LIC Copyright 1994-2014 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.
    
    !-----------------------------------------------------------------
    !--------------- special set of characters for RCS information
    !-----------------------------------------------------------------
    ! $Source$ $Revision$
    ! masdev4_7 BUG1 2007/06/15 17:47:27
    !-----------------------------------------------------------------
    !####################################
    MODULE MODI_READ_ALL_DATA_MESONH_CASE
    !####################################
    INTERFACE
          SUBROUTINE READ_ALL_DATA_MESONH_CASE(HPRE_REAL1,HFMFILE,HPGDFILE,        &
                                  HDAD_NAME                                        )
    
    CHARACTER(LEN=28),  INTENT(IN)  :: HPRE_REAL1 ! name of the PRE_REAL1 file
    CHARACTER(LEN=28),  INTENT(IN)  :: HFMFILE    ! name of the Mesonh input file
    CHARACTER(LEN=28),  INTENT(IN)  :: HPGDFILE   ! name of the physiographic data file
    CHARACTER(LEN=*),  INTENT(INOUT) :: HDAD_NAME! true name of the Mesonh input file
    !
    END SUBROUTINE READ_ALL_DATA_MESONH_CASE
    !
    END INTERFACE
    !
    END MODULE MODI_READ_ALL_DATA_MESONH_CASE
    !
    !     #########################################################################
          SUBROUTINE READ_ALL_DATA_MESONH_CASE(HPRE_REAL1,HFMFILE,HPGDFILE,        &
                                  HDAD_NAME                                        )
    !     #########################################################################
    !
    !!****  *READ_ALL_DATA_MESONH_CASE* - reads data for the initialization of real cases.
    !! 
    !!    PURPOSE
    !!    -------
    !!    This routine calls the routines reading the different input files.
    !!    It closes the PGD file.
    !!
    !!**  METHOD
    !!    ------
    !!    Projection is read in READ_LFIFM_PGD (MODD_GRID).
    !!    Grid and definition of large domain are read in PGD file and MESONH file
    !!     (READ_LFIFM_PGD and MESONH_INFO in READ_GENERAL) and coherence is tested.
    !!    The PGD files are also read in READ_LFIFM_PGD.
    !!    The PGD file is closed.
    !!    The MESO-NH domain is defined from PRE_REAL1.nam inputs in SET_SUBDOMAIN.
    !!    Vertical grid is defined in READ_VER_GRID.
    !!    Variables fields are read in Mesonh file and stored on MESO-NH domain
    !!     (READ_LFI_PRC).
    !!
    !!    EXTERNAL
    !!    --------
    !!    subroutine READ_LFIFM_PGD: to read PGD file
    !!    subroutine READ_GRID_TIME_MESONH_CASE  : to read the geographic and time data.
    !!    subroutine SET_SUBDOMAIN : to define the horizontal MESO-NH domain.
    !!    subroutine READ_VER_GRID : to read the vertical grid in namelist file.
    !!    subroutine READ_PRC_FMFILE : to read the large scale fields on the MESO-NH
    !!                               domain.
    !!    
    !!    function FMLOOK  :to retrieve a logical unit number associated with a file
    !!    
    !!    Module MODI_READ_GRID_TIME_MESONH_CASE  : interface for subroutine
    !!                                              READ_GRID_TIME_MESONH_CASE
    !!    Module MODI_SET_SUBDOMAIN : interface for subroutine SET_SUBDOMAIN
    !!    Module MODI_READ_VER_GRID : interface for subroutine READ_VER_GRID
    !!    Module MODI_READ_PRC_FMFILE  : interface for subroutine READ_PRC_FMFILE
    !!
    !!    IMPLICIT ARGUMENTS
    !!    ------------------
    !!
    !!      Module MODD_CONF      : contains configuration variables for all models.
    !!         NVERB : verbosity level for output-listing
    !!      Module MODD_LUNIT     : contains logical unit names for all models
    !!         CLUOUT0 : name of output-listing
    !!      Module MODD_PGDDIM    : contains dimension of PGD fields
    !!         NPGDIMAX: dimension along x (no external point)
    !!         NPGDJMAX: dimension along y (no external point)
    !!      Module MODD_PARAMETERS
    !!         JPHEXT
    !!
    !!    REFERENCE
    !!    ---------
    !!
    !!      Book 2
    !!
    !!
    !!    AUTHOR
    !!    ------
    !!	
    !!      V.Masson  Meteo-France
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!      Original    16/12/94
    !!                  24/09/96 (V. Masson) add HDAD_NAME
    !!                  25/10/96 (V. Masson) remove 3D pressure from routine outputs
    !!                  12/12/96 (V. Masson) add vertical velocity
    !!                  07/05/97 (V. Masson) add tke
    !!                  10/06/97 (V. Masson) add pressure
    !!                  10/07/97 (V. Masson) add epsilon
    !!                  11/07/97 (V. Masson) add READ_DESFM
    !!                  11/07/97 (V. Masson) add passive scalars
    !!                  20/01/98 (J. Stein)  add the Large scale fields reading
    !!                  30/04/98 (V. Masson) Large scale VEG and LAI
    !!                  02/07/00 (F.Solmon/V.Masson) adaptation for patch approach
    !!                  01/2004  (V. Masson) removes surface (externalization)
    !!                  01/06/02 (O.Nuissier) bogussing of tropical cyclone
    !!                  Aou   09, 2005 (D.Barbary) call to compare_dad
    !!                  19/03/2008 (J.Escobar) rename INIT to INIT_MNH --> grib problem
    
    !!-------------------------------------------------------------------------------
    !
    !*       0.    DECLARATIONS
    !              ------------
    !
    USE MODE_FM
    USE MODE_IO_ll
    USE MODE_FMREAD
    !
    USE MODI_READ_GRID_TIME_MESONH_CASE ! interface modules
    USE MODI_READ_HGRID
    USE MODI_READ_VER_GRID
    USE MODI_READ_PRC_FMFILE  
    USE MODI_CHECK_ZS
    USE MODI_CHECK_ZHAT
    USE MODI_SET_BOGUS_VORTEX
    USE MODI_COMPARE_DAD
    USE MODI_ZS_BOUNDARY
    !
    USE MODD_CONF           ! declaration modules
    USE MODD_CONF_n
    USE MODD_PARAM_n
    USE MODD_LUNIT
    USE MODD_LUNIT_n
    USE MODD_PGDDIM
    USE MODD_PARAMETERS
    USE MODD_REF_n
    USE MODD_CST
    USE MODD_TIME_n
    USE MODD_DIM_n
    USE MODD_DYN_n
    USE MODD_GRID_n
    USE MODD_GR_FIELD_n
    USE MODD_FIELD_n
    USE MODD_LBC_n
    USE MODD_HURR_CONF, ONLY: LBOGUSSING, CDADATMFILE,CDADBOGFILE
    USE MODD_PREP_REAL
    !
    USE MODI_INIT_MNH
    !
    
    !20131113 add modules for update_halo and check
    USE MODE_ll
    USE MODD_ARGSLIST_ll, ONLY : LIST_ll
    USE MODE_MPPDB
    !
    
    IMPLICIT NONE
    !
    !*       0.1   Declaration of arguments
    !              ------------------------
    !
    CHARACTER(LEN=28),  INTENT(IN)  :: HPRE_REAL1 ! name of the PRE_REAL1 file
    CHARACTER(LEN=28),  INTENT(IN)  :: HFMFILE    ! name of the Mesonh input file
    CHARACTER(LEN=28),  INTENT(IN)  :: HPGDFILE   ! name of the physiographic data file
    CHARACTER(LEN=*),  INTENT(INOUT) :: HDAD_NAME! true name of the Mesonh input file
    !
    !
    !*       0.2   Declaration of local variables
    !              ------------------------------
    !
    INTEGER :: IIINF_LS   ! lower boundary of the MESO-NH domain
    !                     ! in the large domain (direction I).
    INTEGER :: IISUP_LS   ! upper boundary of the MESO-NH domain
    !                     ! in the large domain (direction I).
    INTEGER :: IJINF_LS   ! lower boundary of the MESO-NH domain
    !                     ! in the large domain (direction J).
    INTEGER :: IJSUP_LS   ! upper boundary of the MESO-NH domain
    !                     ! in the large domain (direction J).
    INTEGER :: IXOR_LS    ! I shift between PGD file and LS atmospheric file
    INTEGER :: IYOR_LS    ! J shift between PGD file and LS atmospheric file
    !
    INTEGER :: IRESP      ! return-code if problems occured
    INTEGER :: ILUOUT0    ! logical unit for file CLUOUT0
    !
    CHARACTER(LEN=28) :: YPGD_NAME, YPGD_DAD_NAME
    CHARACTER(LEN=28) :: YOUTFILE
    CHARACTER(LEN=2)  :: YPGD_TYPE
    !
    INTEGER           :: IMASDEV       ! Masdev version
    INTEGER           :: IGRID, ILENCH
    CHARACTER(LEN=100):: YCOMMENT
    !
    !* temporary namelist configuration variables
    !
    INTEGER                           :: IVERB      ! verbosity level
    CHARACTER(LEN=3)                  :: YEQNSYS    ! EQuatioN SYStem
    CHARACTER(LEN=5)                  :: YPRESOPT   ! PRESsure OPTion
    LOGICAL                           :: GRES
    REAL                              :: ZRES
    INTEGER                           :: IPRE_REAL1
    
    !
    !20131113 add vars related to ADD3DFIELD and UPDATE_HALO
    INTEGER :: IINFO_ll
    
    TYPE(LIST_ll), POINTER :: TZFIELDS_ll => NULL() ! list of fields to exchange
    
    !
    !------------------------------------------------------------------------------
    
    !
    CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
    !
    !-------------------------------------------------------------------------------
    !
    !*            1.  reading of the atm. fields, on the entire atm. file domain
    !                 ----------------------------------------------------------
    !
    !*       1.1   save of some configuration variables before call to INIT
    !
    YEQNSYS = CEQNSYS
    YPRESOPT= CPRESOPT
    IVERB   = NVERB
    GRES    = LRES
    ZRES    = XRES
    !
    !* note that some quantities such as grid and domain definition
    ! will be erased by the following routines
    !
    YOUTFILE=CINIFILE
    CINIFILE=HFMFILE
    !
    CALL CLOSE_ll(HPRE_REAL1, IOSTAT=IRESP)
    CALL INIT_MNH
    CALL OPEN_ll(UNIT=IPRE_REAL1,FILE=HPRE_REAL1,IOSTAT=IRESP,ACTION='READ', &
         DELIM='QUOTE',MODE=GLOBAL,STATUS='OLD')
    !
    CINIFILE=YOUTFILE
    !
    CSTORAGE_TYPE='TT'       ! after prep_real_case, file type is 'TT'
    !
    !*       1.2   restores values after call to INIT
    !
    IF (LEN_TRIM(YEQNSYS)>0)  CEQNSYS = YEQNSYS
    IF (LEN_TRIM(YPRESOPT)>0) CPRESOPT= YPRESOPT
    IF (IVERB/=NUNDEF)        NVERB   = IVERB
    LRES = GRES
    XRES = ZRES
    !
    !*            2. Reading of physiographic data domain
    !                ------------------------------------
    !
    CALL READ_HGRID(0,HPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE)
    !
    !*            3. Reading of large-scale grid and time
    !                ------------------------------------
    !
    CALL READ_GRID_TIME_MESONH_CASE(HFMFILE,IXOR_LS,IYOR_LS,HDAD_NAME)
    !
    !*            4. Definition of horizontal domain
    !                -------------------------------
    !
    IIINF_LS = 1
    IISUP_LS = NIMAX + 2* JPHEXT
    IJINF_LS = 1
    IJSUP_LS = NJMAX + 2* JPHEXT
    !
    !
    !*            5. Reading of vertical grid
    !                ------------------------
    !
    CALL READ_VER_GRID(HPRE_REAL1,XZHAT_LS,LSLEVE_LS,XLEN1_LS,XLEN2_LS)
    !
    !*            6. Add a bogus vortex from observations (radar, satellite,...)
    !                -----------------------------------------------------------
    !
    IF (LBOGUSSING) THEN
      IF (LEN_TRIM(CDADBOGFILE) >0 ) THEN
        IF (LEN_TRIM(CDADATMFILE) == 0 ) THEN
          WRITE(ILUOUT0,*) 'READ_ALL_DATA_MESONH_CASE: CDADATMFILE not initialized in nml NAM_HURR_CONF'
          WRITE(ILUOUT0,*) '-> JOB ABORTED'
     !callabortstop
          CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP)
          CALL ABORT
          STOP
        ELSE 
          IF (LEN_TRIM(HDAD_NAME) >0 ) THEN
            IF (ADJUSTL(ADJUSTR(HDAD_NAME)) .NE. ADJUSTL(ADJUSTR(CDADATMFILE))) THEN
              WRITE(ILUOUT0,*) &
               'READ_ALL_DATA_MESONH_CASE: CDADATMFILE is NOT the DAD of input file'
              WRITE(ILUOUT0,*) ' CDADATMFILE='//TRIM(CDADATMFILE)
              WRITE(ILUOUT0,*) ' DAD_NAME of model1='//TRIM(HDAD_NAME)
              WRITE(ILUOUT0,*) '-> JOB ABORTED'
     !callabortstop
              CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP)
              CALL ABORT
              STOP
            ELSE    
              CALL COMPARE_DAD(CDADATMFILE,CDADBOGFILE,IRESP)
              IF (IRESP .NE. 0) THEN
                WRITE(ILUOUT0,*) &
                  'READ_ALL_DATA_MESONH_CASE: Unable to replace the DAD of output file with CDADBOGFILE'
                WRITE(ILUOUT0,*) '-> JOB ABORTED'
     !callabortstop
                CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP)
                CALL ABORT
                STOP
              ENDIF
              HDAD_NAME=CDADBOGFILE
            ENDIF
          ENDIF ! no DAD_NAME (bogussing of model1)
        ENDIF
      ENDIF
      CALL SET_BOGUS_VORTEX(XUT,XVT,XTHT)
    ENDIF
    !
    !*            7.  truncation of the fields on the new domain
    !                 ------------------------------------------
    !
    IF (IIINF_LS/=1 .OR. IISUP_LS/=SIZE(XTHT,1)) CLBCX(:) ='OPEN'
    IF (IJINF_LS/=1 .OR. IJSUP_LS/=SIZE(XTHT,2)) CLBCY(:) ='OPEN'
    !
    CALL READ_PRC_FMFILE(IIINF_LS,IISUP_LS,IJINF_LS,IJSUP_LS                     )
    !
    !*            8.  Orography
    !                 ---------
    !
    ALLOCATE(XZS(IISUP_LS-IIINF_LS+1,IJSUP_LS-IJINF_LS+1))
    CALL FMREAD(HPGDFILE,'ZS',CLUOUT,'XY',XZS,IGRID,ILENCH,YCOMMENT,IRESP)
    CALL ZS_BOUNDARY(XZS,XZS_LS)
    !
    ALLOCATE(XZSMT(IISUP_LS-IIINF_LS+1,IJSUP_LS-IJINF_LS+1))
    CALL FMREAD(HPGDFILE,'MASDEV',CLUOUT,'XY',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
    IF (IMASDEV<=46) THEN
      XZSMT = XZS
    ELSE
      CALL FMREAD(HPGDFILE,'ZSMT',CLUOUT,'XY',XZSMT,IGRID,ILENCH,YCOMMENT,IRESP)
    END IF 
    CALL ZS_BOUNDARY(XZSMT,XZSMT_LS)
    !
    !
    !*            9. Surface pressure computation
    !                ----------------------------
    !
    ALLOCATE(XPS_LS    (IISUP_LS-IIINF_LS+1,IJSUP_LS-IJINF_LS+1))
    !
    XPS_LS(:,:) = XP00* (                                                     &
                          0.5 * ( (XPMASS_LS(:,:,JPVEXT  )/XP00)**(XRD/XCPD)  &
                                 +(XPMASS_LS(:,:,JPVEXT+1)/XP00)**(XRD/XCPD)  &
                                )                                             &
                         )**(XCPD/XRD)
    !
    
    !20131113 add update_halo
    CALL ADD2DFIELD_ll(TZFIELDS_ll,XPS_LS )
       CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
          CALL CLEANLIST_ll(TZFIELDS_ll)
    CALL MPPDB_CHECK2D(XPS_LS,"PGDFILTER9:XPS_LS",PRECISION)
    !
    
    !
    !*           10. Check coherence between the 2 orographies
    !                -----------------------------------------
    !
    
    !20131023 mise en commentaire du check_zs et zhat
    !
    !IF (LEN_TRIM(HDAD_NAME)>0) CALL CHECK_ZS(HFMFILE,HDAD_NAME,IIINF_LS,IJINF_LS)
    !IF (LEN_TRIM(HDAD_NAME)>0) CALL CHECK_ZHAT(HFMFILE,HDAD_NAME)
    
    !
    !-------------------------------------------------------------------------------
    !
    WRITE (ILUOUT0,*) 'Monitor READ_ALL_DATA_MESONH_CASE completed'
    !
    !-------------------------------------------------------------------------------
    END SUBROUTINE READ_ALL_DATA_MESONH_CASE