From f89dc6ae13d579b3a3435a207216e42caab9c425 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 12 Jan 2018 10:43:11 +0100 Subject: [PATCH] Philippe 12/01/2018: IO: add ZTOP field for model top (useful for mesh description in CF convention) --- src/LIB/SURCOUCHE/src/mode_field.f90 | 30 ++++++++++++++++++++++++++++ src/MNH/ini_modeln.f90 | 3 ++- src/MNH/ini_spectren.f90 | 3 ++- src/MNH/init_for_convlfi.f90 | 1 + src/MNH/mnh2lpdm_ini.f90 | 1 + src/MNH/modd_gridn.f90 | 1 + src/MNH/read_ver_grid.f90 | 3 +++ src/MNH/set_grid.f90 | 7 +++++-- src/MNH/write_lfifm1_for_diag.f90 | 1 + src/MNH/write_lfifmn_fordiachron.f90 | 1 + src/MNH/write_lfin.f90 | 1 + 11 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index f039d2212..90704a893 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -510,6 +510,19 @@ ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL)) IDX = IDX+1 ! IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() +TFIELDLIST(IDX)%CMNHNAME = 'ZTOP' +TFIELDLIST(IDX)%CSTDNAME = 'altitude_at_top_of_atmosphere_model' +TFIELDLIST(IDX)%CLONGNAME = 'MesoNH: ZTOP' +TFIELDLIST(IDX)%CUNITS = 'm' +TFIELDLIST(IDX)%CDIR = '--' +TFIELDLIST(IDX)%CCOMMENT = 'Height of top level' +TFIELDLIST(IDX)%NGRID = 4 +TFIELDLIST(IDX)%NTYPE = TYPEREAL +TFIELDLIST(IDX)%NDIMS = 0 +ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL)) +IDX = IDX+1 +! +IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() TFIELDLIST(IDX)%CMNHNAME = 'DXHAT' !TODO: check stdname TFIELDLIST(IDX)%CSTDNAME = '' @@ -3210,6 +3223,13 @@ IF (.NOT.LFIELDLIST_ISINIT) THEN END IF ! ! +IF (.NOT.ASSOCIATED(XZTOP)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XZTOP was not associated') + ALLOCATE(XZTOP) + CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP',IID,IRESP) + TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XZTOP +END IF +! IF (.NOT.ASSOCIATED(LSLEVE)) THEN CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LSLEVE was not associated') ALLOCATE(LSLEVE) @@ -3527,6 +3547,7 @@ CALL FIND_FIELD_ID_FROM_MNHNAME('ZSMT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(K CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XXHAT CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XYHAT CALL FIND_FIELD_ID_FROM_MNHNAME('ZHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XZHAT +CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP', IID,IRESP); TFIELDLIST(IID)%TFIELD_X0D(KFROM)%DATA => XZTOP CALL FIND_FIELD_ID_FROM_MNHNAME('DXHAT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XDXHAT CALL FIND_FIELD_ID_FROM_MNHNAME('DYHAT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XDYHAT CALL FIND_FIELD_ID_FROM_MNHNAME('ALT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XZZ @@ -3856,6 +3877,15 @@ CALL FIND_FIELD_ID_FROM_MNHNAME('ZSMT', IID,IRESP); XZSMT => TFIELDLIST(IID)%TF CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT', IID,IRESP); XXHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT', IID,IRESP); XYHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA CALL FIND_FIELD_ID_FROM_MNHNAME('ZHAT', IID,IRESP); XZHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA +! +CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP', IID,IRESP) +IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& + 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) + ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA) +END IF +XZTOP => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA +! CALL FIND_FIELD_ID_FROM_MNHNAME('DXHAT',IID,IRESP); XDXHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA CALL FIND_FIELD_ID_FROM_MNHNAME('DYHAT',IID,IRESP); XDYHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA ! diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 5fc10c258..0a896fe3c 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -584,6 +584,7 @@ IKU=NKMAX+2*JPVEXT ! ALLOCATE(XZHAT(IKU)) CALL IO_READ_FIELD(TPINIFILE,'ZHAT',XZHAT) +CALL IO_READ_FIELD(TPINIFILE,'ZTOP',XZTOP) IF (XALZBOT>=XZHAT(IKU) .AND. LVE_RELAX) THEN WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR: you want to use vertical relaxation" WRITE(ILUOUT,FMT=*) " but bottom of layer XALZBOT(",XALZBOT,")" @@ -1563,7 +1564,7 @@ CALL SET_GRID(KMI,TPINIFILE,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll, & XTSTEP,XSEGLEN, & XLONORI,XLATORI,XLON,XLAT, & XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP, & - XZS,XZZ,XZHAT,LSLEVE,XLEN1,XLEN2,XZSMT, & + XZS,XZZ,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2,XZSMT, & ZJ, & TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN) ! diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90 index 384d41ffa..384f43ed6 100644 --- a/src/MNH/ini_spectren.f90 +++ b/src/MNH/ini_spectren.f90 @@ -224,6 +224,7 @@ IKU=NKMAX+2*JPVEXT ! ALLOCATE(XZHAT(IKU)) CALL IO_READ_FIELD(TPINIFILE,'ZHAT',XZHAT) +CALL IO_READ_FIELD(TPINIFILE,'ZTOP',XZTOP) IF (XALZBOT>=XZHAT(IKU) .AND. LVE_RELAX) THEN WRITE(ILUOUT,FMT=*) "INI_SPECTRE_n ERROR: you want to use vertical relaxation" WRITE(ILUOUT,FMT=*) " but bottom of layer XALZBOT(",XALZBOT,")" @@ -716,7 +717,7 @@ CALL SET_GRID(KMI,TPINIFILE,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll, & XTSTEP,XSEGLEN, & XLONORI,XLATORI,XLON,XLAT, & XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP, & - XZS,XZZ,XZHAT,LSLEVE,XLEN1,XLEN2,XZSMT, & + XZS,XZZ,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2,XZSMT, & ZJ, & TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN) ! diff --git a/src/MNH/init_for_convlfi.f90 b/src/MNH/init_for_convlfi.f90 index c3d723b74..2479f6880 100644 --- a/src/MNH/init_for_convlfi.f90 +++ b/src/MNH/init_for_convlfi.f90 @@ -235,6 +235,7 @@ IF (IRESP/=0) XZSMT(:,:)=XZS(:,:) ! ALLOCATE(XZHAT(IKU)) CALL IO_READ_FIELD(TPINIFILE,'ZHAT',XZHAT) +CALL IO_READ_FIELD(TPINIFILE,'ZTOP',XZTOP) ! CALL IO_READ_FIELD(TPINIFILE,'SLEVE',LSLEVE,IRESP) IF (IRESP/=0) LSLEVE = .FALSE. diff --git a/src/MNH/mnh2lpdm_ini.f90 b/src/MNH/mnh2lpdm_ini.f90 index d91ef88d9..9852c2aa2 100644 --- a/src/MNH/mnh2lpdm_ini.f90 +++ b/src/MNH/mnh2lpdm_ini.f90 @@ -197,6 +197,7 @@ ALLOCATE( XSFV(NIU,NJU)) !* 2.6 Decoupage vertical. ! CALL IO_READ_FIELD(TPFILE1,'ZHAT',XZHAT) +CALL IO_READ_FIELD(TPFILE1,'ZTOP',XZTOP) ! !* 2.7 Orographie. ! diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90 index 68e03c97e..75fd2f485 100644 --- a/src/MNH/modd_gridn.f90 +++ b/src/MNH/modd_gridn.f90 @@ -56,6 +56,7 @@ REAL, DIMENSION(:), POINTER :: XDYHAT=>NULL() ! horizontal stretch REAL, DIMENSION(:,:), POINTER :: XMAP=>NULL() ! Map factor REAL, DIMENSION(:,:), POINTER :: XZS=>NULL() ! orography REAL, DIMENSION(:,:,:),POINTER :: XZZ=>NULL() ! height z +REAL, POINTER :: XZTOP=>NULL() ! model top (m) REAL, DIMENSION(:), POINTER :: XZHAT=>NULL() ! height level without orography REAL, DIMENSION(:,:), POINTER :: XDIRCOSXW=>NULL(),XDIRCOSYW=>NULL(),XDIRCOSZW=>NULL() ! director cosinus of the normal ! to the ground surface diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90 index 0bb587beb..2593caab7 100644 --- a/src/MNH/read_ver_grid.f90 +++ b/src/MNH/read_ver_grid.f90 @@ -320,6 +320,9 @@ CASE DEFAULT CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_VER_GRID','') END SELECT ! +!Set model top +XZTOP = XZHAT(IKU) +! !------------------------------------------------------------------------------- ! !* 5. TEST ON STRETCHING : diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index a9d5d2fca..1e2d99424 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -23,7 +23,7 @@ INTERFACE PTSTEP,PSEGLEN, & PLONORI,PLATORI,PLON,PLAT, & PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP, & - PZS,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2,PZSMT, & + PZS,PZZ,PZHAT,PZTOP,OSLEVE,PLEN1,PLEN2,PZSMT, & PJ, & TPDTMOD,TPDTCUR,KSTOP, & KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN ) @@ -75,6 +75,7 @@ REAL, DIMENSION(:,:), INTENT(OUT) :: PMAP ! Map factor REAL, DIMENSION(:,:), INTENT(OUT) :: PZS ! orography REAL, DIMENSION(:,:,:), INTENT(OUT) :: PZZ ! Height z REAL, DIMENSION(:), INTENT(OUT) :: PZHAT ! Height level +REAL, INTENT(OUT) :: PZTOP ! Model top LOGICAL, INTENT(OUT) :: OSLEVE ! flag for SLEVE coordinate REAL, INTENT(OUT) :: PLEN1 ! Decay scale for smooth topography REAL, INTENT(OUT) :: PLEN2 ! Decay scale for small-scale topography deviation @@ -112,7 +113,7 @@ END MODULE MODI_SET_GRID PTSTEP,PSEGLEN, & PLONORI,PLATORI,PLON,PLAT, & PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP, & - PZS,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2,PZSMT, & + PZS,PZZ,PZHAT,PZTOP,OSLEVE,PLEN1,PLEN2,PZSMT, & PJ, & TPDTMOD,TPDTCUR,KSTOP, & KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN ) @@ -304,6 +305,7 @@ REAL, DIMENSION(:,:), INTENT(OUT) :: PMAP ! Map factor REAL, DIMENSION(:,:), INTENT(OUT) :: PZS ! orography REAL, DIMENSION(:,:,:), INTENT(OUT) :: PZZ ! Height z REAL, DIMENSION(:), INTENT(OUT) :: PZHAT ! Height level +REAL, INTENT(OUT) :: PZTOP ! Model top LOGICAL, INTENT(OUT) :: OSLEVE ! flag for SLEVE coordinate REAL, INTENT(OUT) :: PLEN1 ! Decay scale for smooth topography REAL, INTENT(OUT) :: PLEN2 ! Decay scale for small-scale topography deviation @@ -401,6 +403,7 @@ END IF CALL IO_READ_FIELD(TPINIFILE,'ZS',PZS) CALL IO_READ_FIELD(TPINIFILE,'ZHAT',PZHAT) +CALL IO_READ_FIELD(TPINIFILE,'ZTOP',PZTOP) ! CALL DEFAULT_SLEVE(OSLEVE,PLEN1,PLEN2) ! diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 24bdb779f..25cd9b3f5 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -428,6 +428,7 @@ CALL IO_WRITE_FIELD(TPFILE,'BETA',XBETA) CALL IO_WRITE_FIELD(TPFILE,'XHAT',XXHAT) CALL IO_WRITE_FIELD(TPFILE,'YHAT',XYHAT) CALL IO_WRITE_FIELD(TPFILE,'ZHAT',XZHAT) +CALL IO_WRITE_FIELD(TPFILE,'ZTOP',XZTOP) ! CALL IO_WRITE_FIELD(TPFILE,'ZS', XZS) CALL IO_WRITE_FIELD(TPFILE,'ZSMT', XZSMT) diff --git a/src/MNH/write_lfifmn_fordiachron.f90 b/src/MNH/write_lfifmn_fordiachron.f90 index b40493e3f..d152d850d 100644 --- a/src/MNH/write_lfifmn_fordiachron.f90 +++ b/src/MNH/write_lfifmn_fordiachron.f90 @@ -202,6 +202,7 @@ CALL IO_WRITE_FIELD(TPFILE,'BETA',XBETA) CALL IO_WRITE_FIELD(TPFILE,'XHAT',XXHAT) CALL IO_WRITE_FIELD(TPFILE,'YHAT',XYHAT) CALL IO_WRITE_FIELD(TPFILE,'ZHAT',XZHAT) +CALL IO_WRITE_FIELD(TPFILE,'ZTOP',XZTOP) ! CALL IO_WRITE_FIELD(TPFILE,'ZS', XZS) CALL IO_WRITE_FIELD(TPFILE,'ZSMT', XZSMT) diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index 04e741973..3bbbacb6a 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -396,6 +396,7 @@ CALL IO_WRITE_FIELD(TPFILE,'BETA',XBETA) CALL IO_WRITE_FIELD(TPFILE,'XHAT',XXHAT) CALL IO_WRITE_FIELD(TPFILE,'YHAT',XYHAT) CALL IO_WRITE_FIELD(TPFILE,'ZHAT',XZHAT) +CALL IO_WRITE_FIELD(TPFILE,'ZTOP',XZTOP) ! ! #ifdef MNH_NCWRIT ! ! -- GitLab