From 149f58244106542cab59d6399f63049c02fc12b2 Mon Sep 17 00:00:00 2001 From: Juan Escobar <escj@aero.obs-mip.fr> Date: Wed, 24 May 2017 17:12:29 +0200 Subject: [PATCH] Juan 24/05/2017: add MPPDB_CHECK on SURFEX routine for reprod check with MNH_PARALLEL key --- src/SURFEX/init_tebn.F90 | 15 + src/SURFEX/pgd_flake.F90 | 10 + src/SURFEX/pgd_grid.F90 | 8 + src/SURFEX/pgd_isba.F90 | 10 + src/SURFEX/pgd_seaflux.F90 | 19 +- src/SURFEX/pgd_surf_atm.F90 | 11 + src/SURFEX/pgd_teb.F90 | 13 +- src/SURFEX/read_pgd_isban.F90 | 11 + src/SURFEX/read_pgd_tebn.F90 | 14 +- src/SURFEX/zoom_pgd_cover.F90 | 700 +++++++++++++++--------------- src/SURFEX/zoom_pgd_isba.F90 | 31 +- src/SURFEX/zoom_pgd_orography.F90 | 29 ++ src/SURFEX/zoom_pgd_seaflux.F90 | 16 +- src/SURFEX/zoom_pgd_teb.F90 | 29 +- 14 files changed, 565 insertions(+), 351 deletions(-) diff --git a/src/SURFEX/init_tebn.F90 b/src/SURFEX/init_tebn.F90 index 88c96c16a..bf1f94a01 100644 --- a/src/SURFEX/init_tebn.F90 +++ b/src/SURFEX/init_tebn.F90 @@ -44,6 +44,7 @@ !! G. Pigeon 09/2012: add ROUGH_WALL/ROUGH_ROOF/CH_BEM for conv. coef. !! B. Decharme 04/2013 new coupling variables !! delete CTOPREG option (never used) +!! M.Moge 02/2015 MPPDB_CHECK !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -119,6 +120,11 @@ USE MODI_SET_SURFEX_FILEIN USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB ! +#ifdef MNH_PARALLEL +USE MODD_DATA_COVER_PAR, ONLY : JPCOVER +USE MODE_MPPDB +! +#endif IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -304,6 +310,9 @@ END SELECT ! CALL READ_PGD_TEB_n(DTCO, U, TM,GCP, & HPROGRAM) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(TM%TOP%XCOVER,"INIT_TEB_n after READ_PGD_TEB_n:XCOVER",PRECISION,ILUOUT, 'TOWN ',JPCOVER) +#endif ! CALL END_IO_SURF_n(HPROGRAM) ! @@ -314,6 +323,9 @@ ILU = SIZE(TM%TOP%XCOVER,1) ALLOCATE(TM%TOP%XTEB_PATCH(ILU,TM%TOP%NTEB_PATCH)) CALL CONVERT_TEB(TM%TOP, & TM%TOP%XCOVER,TM%TOP%XTEB_PATCH) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(TM%TOP%XCOVER,"INIT_TEB_n after CONVERT_TEB:XCOVER",PRECISION,ILUOUT, 'TOWN ',JPCOVER) +#endif ! CALL SET_SURFEX_FILEIN(HPROGRAM,'PREP') ! restore input file name CALL INIT_IO_SURF_n(DTCO, DGU, U, & @@ -680,6 +692,9 @@ DO JPATCH=1,TM%TOP%NTEB_PATCH CALL DIAG_MISC_TEB_INIT_n(TM%DGCT, TM%DGMT, TM%DGMTO, TM%TOP, & HPROGRAM,ILU,ISWB) END DO ! end of loop on patches +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(TM%TOP%XCOVER,"INIT_TEB_n end:XCOVER",PRECISION,ILUOUT, 'TOWN ',JPCOVER) +#endif ! !------------------------------------------------------------------------------- ! diff --git a/src/SURFEX/pgd_flake.F90 b/src/SURFEX/pgd_flake.F90 index b46ca1363..01cb2fb6d 100644 --- a/src/SURFEX/pgd_flake.F90 +++ b/src/SURFEX/pgd_flake.F90 @@ -35,6 +35,7 @@ !! !! Original 03/2004 !! 04/2013, P. Le Moigne : allow limitation of lake depth +!! M. Moge 02/2015 : MPPDB_CHECK !! !---------------------------------------------------------------------------- ! @@ -72,6 +73,9 @@ USE MODI_TREAT_GLOBAL_LAKE_DEPTH ! USE MODE_POS_SURF ! +#ifdef MNH_PARALLEL +USE MODE_MPPDB +#endif ! USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB @@ -201,6 +205,12 @@ ALLOCATE(FG%XMESH_SIZE (FG%NDIM)) FG%CGRID, FG%XGRID_PAR, & F%LCOVER, F%XCOVER, F%XZS, & FG%XLAT, FG%XLON, FG%XMESH_SIZE ) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(F%XCOVER,"PGD_FLAKE after PACK_PGD:XCOVER",PRECISION,ILUOUT,'WATER',JPCOVER) + CALL MPPDB_CHECK_SURFEX2D(FG%XLAT,"PGD_FLAKE after PACK_PGD:XLAT",PRECISION,ILUOUT,'WATER') + CALL MPPDB_CHECK_SURFEX2D(FG%XLON,"PGD_FLAKE after PACK_PGD:XLON",PRECISION,ILUOUT,'WATER') + CALL MPPDB_CHECK_SURFEX2D(FG%XMESH_SIZE,"PGD_FLAKE after PACK_PGD:XMESH_SIZE",PRECISION,ILUOUT,'WATER') +#endif ! !------------------------------------------------------------------------------- ! diff --git a/src/SURFEX/pgd_grid.F90 b/src/SURFEX/pgd_grid.F90 index caa68ad37..f4759b145 100644 --- a/src/SURFEX/pgd_grid.F90 +++ b/src/SURFEX/pgd_grid.F90 @@ -83,6 +83,9 @@ USE MODI_PGD_GRID_IO_INIT USE MODE_TOOLS_ll, ONLY : GET_MEAN_OF_COORD_SQRT_ll ! USE MODI_GET_SIZE_FULL_n +#ifdef MNH_PARALLEL +USE MODE_MPPDB +#endif USE MODI_SPLIT_GRID USE MODD_CONF, ONLY : CPROGRAM #endif @@ -314,6 +317,11 @@ ALLOCATE(UG%XLON (U%NSIZE_FULL)) ALLOCATE(UG%XMESH_SIZE (U%NSIZE_FULL)) ALLOCATE(UG%XJPDIR (U%NSIZE_FULL)) CALL LATLON_GRID(CGRID,NGRID_PAR,U%NSIZE_FULL,ILUOUT,XGRID_PAR,UG%XLAT,UG%XLON,UG%XMESH_SIZE,UG%XJPDIR) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX2D(UG%XLAT,"PGD_GRID after LATLON_GRID:XLAT",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(UG%XLON,"PGD_GRID after LATLON_GRID:XLON",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(UG%XMESH_SIZE,"PGD_GRID after LATLON_GRID:XMESH_SIZE",PRECISION,ILUOUT) +#endif ! !------------------------------------------------------------------------------ ! diff --git a/src/SURFEX/pgd_isba.F90 b/src/SURFEX/pgd_isba.F90 index dfe376970..60ca41eca 100644 --- a/src/SURFEX/pgd_isba.F90 +++ b/src/SURFEX/pgd_isba.F90 @@ -44,6 +44,7 @@ !! R. Alkama 05/2012 : npatch must be 12 or 19 if CPHOTO/='NON' !! B. Decharme 11/2013 : groundwater distribution for water table/surface coupling !! P. Samuelsson 02/2012 : MEB +!! M. Moge 02/2015 : MPPDB_CHECK !! !---------------------------------------------------------------------------- ! @@ -106,6 +107,10 @@ USE PARKIND1 ,ONLY : JPRB ! USE MODI_ABOR1_SFX ! +#ifdef MNH_PARALLEL +USE MODE_MPPDB +! +#endif IMPLICIT NONE ! !* 0.1 Declaration of arguments @@ -430,6 +435,11 @@ ALLOCATE(I%XZ0EFFJPDIR(ILU)) IG%CGRID, IG%XGRID_PAR, & I%LCOVER, I%XCOVER, I%XZS, & IG%XLAT, IG%XLON, IG%XMESH_SIZE, I%XZ0EFFJPDIR ) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX2D(IG%XLAT,"PGD_ISBA after PACK_PGD:XLAT",PRECISION,ILUOUT, 'NATURE') + CALL MPPDB_CHECK_SURFEX2D(IG%XLON,"PGD_ISBA after PACK_PGD:XLON",PRECISION,ILUOUT, 'NATURE') + CALL MPPDB_CHECK_SURFEX2D(IG%XMESH_SIZE,"PGD_ISBA after PACK_PGD:XMESH_SIZE",PRECISION,ILUOUT, 'NATURE') +#endif ! !------------------------------------------------------------------------------- ! diff --git a/src/SURFEX/pgd_seaflux.F90 b/src/SURFEX/pgd_seaflux.F90 index e7bd58a16..310f67f7f 100644 --- a/src/SURFEX/pgd_seaflux.F90 +++ b/src/SURFEX/pgd_seaflux.F90 @@ -35,6 +35,7 @@ !! !! Original 03/2004 !! Lebeaupin-B C. 01/2008 : include bathymetry +!! M.Moge 02/2015 check with MPPDB !! !---------------------------------------------------------------------------- ! @@ -67,6 +68,11 @@ USE MODI_PGD_SEAFLUX_PAR USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB ! +#ifdef MNH_PARALLEL +USE MODE_MPPDB +USE MODI_GET_LUOUT +! +#endif IMPLICIT NONE ! !* 0.1 Declaration of arguments @@ -88,6 +94,9 @@ TYPE(SURF_ATM_SSO_t), INTENT(INOUT) :: USS ! ------------------------------ ! REAL, DIMENSION(NL) :: ZSEABATHY ! bathymetry on all surface points +#ifdef MNH_PARALLEL +INTEGER :: ILUOUT +#endif ! !* 0.3 Declaration of namelists ! ------------------------ @@ -111,6 +120,9 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE ! ------------------- ! IF (LHOOK) CALL DR_HOOK('PGD_SEAFLUX',0,ZHOOK_HANDLE) +#ifdef MNH_PARALLEL + CALL GET_LUOUT(HPROGRAM,ILUOUT) +#endif CALL READ_NAM_PGD_SEABATHY(HPROGRAM,YSEABATHY,YSEABATHYFILETYPE,YNCVARNAME,& XUNIF_SEABATHY) ! @@ -145,7 +157,12 @@ ALLOCATE(SG%XMESH_SIZE (SG%NDIM)) HPROGRAM, 'SEA ', & SG%CGRID, SG%XGRID_PAR, & S%LCOVER, S%XCOVER, S%XZS, & - SG%XLAT, SG%XLON, SG%XMESH_SIZE ) + SG%XLAT, SG%XLON, SG%XMESH_SIZE ) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX2D(SG%XLAT,"PGD_SEAFLUX after PACK_PGD:XLAT",PRECISION,ILUOUT,'SEA') + CALL MPPDB_CHECK_SURFEX2D(SG%XLON,"PGD_SEAFLUX after PACK_PGD:XLON",PRECISION,ILUOUT,'SEA') + CALL MPPDB_CHECK_SURFEX2D(SG%XMESH_SIZE,"PGD_SEAFLUX after PACK_PGD:XMESH_SIZE",PRECISION,ILUOUT,'SEA') +#endif ! CALL PACK_PGD_SEAFLUX(DTCO, SG, S, U, & HPROGRAM, ZSEABATHY) diff --git a/src/SURFEX/pgd_surf_atm.F90 b/src/SURFEX/pgd_surf_atm.F90 index b328e22c4..fcca45b89 100644 --- a/src/SURFEX/pgd_surf_atm.F90 +++ b/src/SURFEX/pgd_surf_atm.F90 @@ -37,6 +37,7 @@ !! A. Lemonsu 05/2009 Ajout de la clef LGARDEN pour TEB !! J. Escobar 11/2013 Add USE MODI_READ_NAM_PGD_CHEMISTRY !! B. Decharme 02/2014 Add LRM_RIVER +!! M.Moge 02/2015 check with MPPDB !---------------------------------------------------------------------------- ! !* 0. DECLARATION @@ -76,6 +77,11 @@ USE MODI_INIT_READ_DATA_COVER USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB ! +USE MODI_READ_NAM_PGD_CHEMISTRY +#ifdef MNH_PARALLEL +! +USE MODE_MPPDB +#endif ! IMPLICIT NONE ! @@ -138,6 +144,11 @@ ALLOCATE(YSC%UG%XMESH_SIZE(YSC%U%NSIZE_FULL)) ALLOCATE(YSC%UG%XJPDIR(YSC%U%NSIZE_FULL)) CALL LATLON_GRID(YSC%UG%CGRID,YSC%UG%NGRID_PAR,YSC%U%NSIZE_FULL,ILUOUT,& YSC%UG%XGRID_PAR,YSC%UG%XLAT,YSC%UG%XLON,YSC%UG%XMESH_SIZE,YSC%UG%XJPDIR) +#ifdef MNH_PARALLEL +! CALL MPPDB_CHECK_SURFEX2D(YSC%UG%XLAT,"PGD_SURF_ATM_n after LATLON_GRID:XLAT",PRECISION,ILUOUT) +! CALL MPPDB_CHECK_SURFEX2D(YSC%UG%XLON,"PGD_SURF_ATM_n after LATLON_GRID:XLON",PRECISION,ILUOUT) +! CALL MPPDB_CHECK_SURFEX2D(YSC%UG%XMESH_SIZE,"PGD_SURF_ATM_n after LATLON_GRID:XMESH_SIZE",PRECISION,ILUOUT) +#endif ! ! !* 2.3 Stores the grid in the module MODD_PGD_GRID diff --git a/src/SURFEX/pgd_teb.F90 b/src/SURFEX/pgd_teb.F90 index f0f167d04..bcfe3715f 100644 --- a/src/SURFEX/pgd_teb.F90 +++ b/src/SURFEX/pgd_teb.F90 @@ -36,6 +36,7 @@ !! Original 10/12/97 !! A. Lemonsu 05/2009 Key for garden option !! G. Pigeon /09/12: WALL, ROOF, FLOOR, MASS LAYER default to 5 +!! M. Moge 02/2015 : MPPDB_CHECK !! !---------------------------------------------------------------------------- ! @@ -70,6 +71,10 @@ USE MODI_ABOR1_SFX USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB ! +#ifdef MNH_PARALLEL +USE MODE_MPPDB +! +#endif USE MODI_WRITE_COVER_TEX_TEB ! IMPLICIT NONE @@ -156,7 +161,13 @@ ALLOCATE(TM%TG%XMESH_SIZE (TM%TG%NDIM)) HPROGRAM, 'TOWN ', & TM%TG%CGRID, TM%TG%XGRID_PAR, & TM%TOP%LCOVER, TM%TOP%XCOVER, TM%TOP%XZS, & - TM%TG%XLAT, TM%TG%XLON, TM%TG%XMESH_SIZE ) + TM%TG%XLAT, TM%TG%XLON, TM%TG%XMESH_SIZE ) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(TM%TOP%XCOVER,"PGD_TEB after PACK_PGD:XCOVER",PRECISION,ILUOUT, 'TOWN ',JPCOVER) + CALL MPPDB_CHECK_SURFEX2D(TM%TG%XLAT,"PGD_TEB after PACK_PGD:XLAT",PRECISION,ILUOUT, 'TOWN ') + CALL MPPDB_CHECK_SURFEX2D(TM%TG%XLON,"PGD_TEB after PACK_PGD:XLON",PRECISION,ILUOUT, 'TOWN ') + CALL MPPDB_CHECK_SURFEX2D(TM%TG%XMESH_SIZE,"PGD_TEB after PACK_PGD:XMESH_SIZE",PRECISION,ILUOUT, 'TOWN ') +#endif ! !------------------------------------------------------------------------------- ! diff --git a/src/SURFEX/read_pgd_isban.F90 b/src/SURFEX/read_pgd_isban.F90 index c8d82407e..2a0f0175a 100644 --- a/src/SURFEX/read_pgd_isban.F90 +++ b/src/SURFEX/read_pgd_isban.F90 @@ -42,6 +42,7 @@ !! 11/2013 : same for groundwater distribution !! 11/2014 : Read XSOILGRID as a series of real !! P. Samuelsson 10/2014 : MEB +!! M. Moge 02/2015 READ_SURF // + MPPDB_CHECK !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -91,6 +92,10 @@ USE MODI_GET_LUOUT USE MODI_PACK_SAME_RANK USE MODI_GET_SURF_MASK_n ! +#ifdef MNH_PARALLEL +USE MODE_MPPDB +! +#endif IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -301,6 +306,7 @@ ALLOCATE(I%XCOVER(IG%NDIM,COUNT(I%LCOVER))) #ifdef MNH_PARALLEL CALL READ_SURF_COV(& HPROGRAM,'COVER',I%XCOVER(:,:),I%LCOVER,IRESP,HDIR='H') + CALL MPPDB_CHECK_SURFEX3D(I%XCOVER,"READ_PGD_ISBA_n after READ_SURF:XCOVER",PRECISION,ILUOUT,'NATURE',JPCOVER) #else CALL READ_SURF_COV(& HPROGRAM,'COVER',I%XCOVER(:,:),I%LCOVER,IRESP) @@ -324,6 +330,11 @@ ALLOCATE(IG%XMESH_SIZE (IG%NDIM)) ALLOCATE(I%XZ0EFFJPDIR(IG%NDIM)) CALL READ_GRID(& HPROGRAM,IG%CGRID,IG%XGRID_PAR,IG%XLAT,IG%XLON,IG%XMESH_SIZE,IRESP,I%XZ0EFFJPDIR) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX2D(IG%XLAT,"READ_PGD_ISBA_n after READ_GRID:XLAT",PRECISION,ILUOUT,'NATURE') + CALL MPPDB_CHECK_SURFEX2D(IG%XLON,"READ_PGD_ISBA_n after READ_GRID:XLON",PRECISION,ILUOUT,'NATURE') + CALL MPPDB_CHECK_SURFEX2D(IG%XMESH_SIZE,"READ_PGD_ISBA_n after READ_GRID:XMESH_SIZE",PRECISION,ILUOUT,'NATURE') +#endif ! !* clay fraction : attention, seul un niveau est present dans le fichier !* on rempli tout les niveaux de XCLAY avec les valeurs du fichiers diff --git a/src/SURFEX/read_pgd_tebn.F90 b/src/SURFEX/read_pgd_tebn.F90 index 0d0dcddf5..665fb4125 100644 --- a/src/SURFEX/read_pgd_tebn.F90 +++ b/src/SURFEX/read_pgd_tebn.F90 @@ -34,7 +34,7 @@ !! MODIFICATIONS !! ------------- !! Original 01/2003 -!! M. Moge 02/2015 READ_SURF +!! M. Moge 02/2015 READ_SURF // + MPPDB_CHECK !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -66,6 +66,11 @@ USE MODI_GET_TYPE_DIM_n ! USE MODI_READ_LECOCLIMAP ! +#ifdef MNH_PARALLEL +USE MODI_GET_LUOUT +USE MODE_MPPDB +! +#endif IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -83,6 +88,9 @@ TYPE(GRID_CONF_PROJ_t),INTENT(INOUT) :: GCP ! ------------------------------- ! INTEGER :: IRESP ! Error code after redding +#ifdef MNH_PARALLEL +INTEGER :: ILUOUT ! output listing logical unit +#endif ! CHARACTER(LEN=LEN_HREC) :: YRECFM ! Name of the article to be read INTEGER :: IVERSION @@ -94,6 +102,9 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE !* 1D physical dimension ! IF (LHOOK) CALL DR_HOOK('READ_PGD_TEB_N',0,ZHOOK_HANDLE) +#ifdef MNH_PARALLEL + CALL GET_LUOUT(HPROGRAM,ILUOUT) +#endif YRECFM='SIZE_TOWN' CALL GET_TYPE_DIM_n(DTCO, U, & 'TOWN ',TM%TG%NDIM) @@ -208,6 +219,7 @@ ALLOCATE(TM%TOP%XCOVER(TM%TG%NDIM,COUNT(TM%TOP%LCOVER))) #ifdef MNH_PARALLEL CALL READ_SURF_COV(& HPROGRAM,'COVER',TM%TOP%XCOVER(:,:),TM%TOP%LCOVER,IRESP,HDIR='H') + CALL MPPDB_CHECK_SURFEX3D(TM%TOP%XCOVER,"READ_PGD_TEB_n after READ_SURF:XCOVER",PRECISION,ILUOUT, 'TOWN ',JPCOVER) #else CALL READ_SURF_COV(& HPROGRAM,'COVER',TM%TOP%XCOVER(:,:),TM%TOP%LCOVER,IRESP) diff --git a/src/SURFEX/zoom_pgd_cover.F90 b/src/SURFEX/zoom_pgd_cover.F90 index 5c8da7dbc..bdd156a1e 100644 --- a/src/SURFEX/zoom_pgd_cover.F90 +++ b/src/SURFEX/zoom_pgd_cover.F90 @@ -1,345 +1,355 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!SFX_LIC for details. version 1. -! ######### - SUBROUTINE ZOOM_PGD_COVER (DTCO, UG, U,GCP, & - HPROGRAM,HINIFILE,HINIFILETYPE,OECOCLIMAP) -! ########################################################### - -!! -!! PURPOSE -!! ------- -!! This program prepares the physiographic data fields. -!! -!! METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! -!! V. Masson Meteo-France -!! -!! MODIFICATION -!! ------------ -!! -!! Original 13/10/03 -! Modification 17/04/12 M.Tomasini All COVER physiographic fields are now -!! interpolated for spawning => -!! ABOR1_SFX if (.NOT.OECOCLIMAP) in comment -! Modification 05/02/15 M.Moge : use NSIZE_FULL instead of SIZE(XLAT) (for clarity) -!! J.Escobar 18/12/2015 : missing interface -!---------------------------------------------------------------------------- -! -!* 0. DECLARATION -! ----------- -! -! -! -! -USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t -USE MODD_SURF_ATM_GRID_n, ONLY : SURF_ATM_GRID_t -USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t -USE MODD_GRID_CONF_PROJ, ONLY : GRID_CONF_PROJ_t -! -USE MODD_SURF_PAR, ONLY : XUNDEF -USE MODD_DATA_COVER_PAR, ONLY : JPCOVER -USE MODD_PREP, ONLY : CINGRID_TYPE, CINTERP_TYPE -! -USE MODE_READ_SURF_COV, ONLY : READ_SURF_COV -! -USE MODI_CONVERT_COVER_FRAC -USE MODI_OPEN_AUX_IO_SURF -USE MODI_READ_SURF -USE MODI_CLOSE_AUX_IO_SURF -USE MODI_PREP_GRID_EXTERN -USE MODI_HOR_INTERPOL -USE MODI_HOR_INTERPOL_1COV -USE MODI_PREP_OUTPUT_GRID -USE MODI_OLD_NAME -USE MODI_SUM_ON_ALL_PROCS -USE MODI_GET_LUOUT -USE MODI_CLEAN_PREP_OUTPUT_GRID -USE MODI_GET_1D_MASK -USE MODI_READ_LCOVER -#ifdef SFX_MNH -USE MODI_READ_SURFX2COV_1COV_MNH -#endif -! -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK -USE PARKIND1 ,ONLY : JPRB -! -IMPLICIT NONE -! -!* 0.1 Declaration of dummy arguments -! ------------------------------ -! -! -TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO -TYPE(SURF_ATM_GRID_t), INTENT(INOUT) :: UG -TYPE(SURF_ATM_t), INTENT(INOUT) :: U -TYPE(GRID_CONF_PROJ_t),INTENT(INOUT) :: GCP -! - CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling - CHARACTER(LEN=28), INTENT(IN) :: HINIFILE ! input atmospheric file name - CHARACTER(LEN=6), INTENT(IN) :: HINIFILETYPE! input atmospheric file type -LOGICAL, INTENT(OUT) :: OECOCLIMAP ! flag to use ecoclimap -! -! -!* 0.2 Declaration of local variables -! ------------------------------ -! -INTEGER :: ICPT1, ICPT2 -INTEGER :: IRESP -INTEGER :: ILUOUT -INTEGER :: INI ! total 1D dimension (input grid) -INTEGER :: IL ! total 1D dimension (output grid) -INTEGER :: JCOVER ! loop counter -INTEGER :: IVERSION ! surface version -#ifdef MNH_PARALLEL -REAL, DIMENSION(:), POINTER :: ZCOVER1D -#endif -REAL, DIMENSION(:,:), POINTER :: ZCOVER -REAL, DIMENSION(:,:), POINTER :: ZSEA1, ZWATER1, ZNATURE1, ZTOWN1 -REAL, DIMENSION(:,:), POINTER :: ZSEA2, ZWATER2, ZNATURE2, ZTOWN2 -REAL, DIMENSION(:), ALLOCATABLE :: ZSUM - CHARACTER(LEN=16) :: YRECFM ! Name of the article to be read - CHARACTER(LEN=100) :: YCOMMENT -REAL(KIND=JPRB) :: ZHOOK_HANDLE -!------------------------------------------------------------------------------ -IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_COVER',0,ZHOOK_HANDLE) - CALL GET_LUOUT(HPROGRAM,ILUOUT) -! -!* 1. Preparation of IO for reading in the file -! ----------------------------------------- -! -!* Note that all points are read, even those without physical meaning. -! These points will not be used during the horizontal interpolation step. -! Their value must be defined as XUNDEF. -! - CALL OPEN_AUX_IO_SURF(& - HINIFILE,HINIFILETYPE,'FULL ') -! - CALL READ_SURF(& - HPROGRAM,'ECOCLIMAP',OECOCLIMAP,IRESP) -! -!------------------------------------------------------------------------------ -! -!* 2. Reading of grid -! --------------- -! - CALL PREP_GRID_EXTERN(GCP,& - HINIFILETYPE,ILUOUT,CINGRID_TYPE,CINTERP_TYPE,INI) -! - CALL PREP_OUTPUT_GRID(UG, U, & - ILUOUT,UG%CGRID,UG%XGRID_PAR,UG%XLAT,UG%XLON) -! -!------------------------------------------------------------------------------ -! -!* 3. Reading of cover -! ---------------- -! -YRECFM='VERSION' - CALL READ_SURF(& - HPROGRAM,YRECFM,IVERSION,IRESP) -! -ALLOCATE(U%LCOVER(JPCOVER)) -! -ALLOCATE(ZSEA1 (INI,1)) -ALLOCATE(ZNATURE1(INI,1)) -ALLOCATE(ZWATER1 (INI,1)) -ALLOCATE(ZTOWN1 (INI,1)) -! -IF (IVERSION>=7) THEN - CALL READ_SURF(& - HPROGRAM,'FRAC_SEA ',ZSEA1(:,1), IRESP,HDIR='A') - CALL READ_SURF(& - HPROGRAM,'FRAC_NATURE',ZNATURE1(:,1),IRESP,HDIR='A') - CALL READ_SURF(& - HPROGRAM,'FRAC_WATER ',ZWATER1(:,1), IRESP,HDIR='A') - CALL READ_SURF(& - HPROGRAM,'FRAC_TOWN ',ZTOWN1(:,1), IRESP,HDIR='A') - CALL OLD_NAME(& - HPROGRAM,'COVER_LIST ',YRECFM) - CALL READ_LCOVER(HPROGRAM,U%LCOVER) -#ifdef MNH_PARALLEL - ALLOCATE(ZCOVER1D(INI)) -#else - ALLOCATE(ZCOVER(INI,COUNT(U%LCOVER))) - CALL READ_SURF_COV(& - HPROGRAM,YRECFM,ZCOVER(:,:),U%LCOVER,IRESP,HDIR='A') - -#endif - - ! -ELSE -#ifdef MNH_PARALLEL - ! we assume that IVERSION>=7 -#else - CALL OLD_NAME(& - HPROGRAM,'COVER_LIST ',YRECFM) - CALL READ_LCOVER(HPROGRAM,U%LCOVER) - ! - ALLOCATE(ZCOVER(INI,COUNT(U%LCOVER))) - CALL READ_SURF_COV(& - HPROGRAM,YRECFM,ZCOVER(:,:),U%LCOVER,IRESP,HDIR='A') - - - CALL CONVERT_COVER_FRAC(DTCO, & - ZCOVER,U%LCOVER,ZSEA1(:,1),ZNATURE1(:,1),ZTOWN1(:,1),ZWATER1(:,1)) -#endif -ENDIF -! -! CALL CLOSE_AUX_IO_SURF(HINIFILE,HINIFILETYPE) -!------------------------------------------------------------------------------ -! -!* 4. Reading of cover & Interpolations -! -------------- -! -IL = U%NSIZE_FULL -ALLOCATE(U%XCOVER(IL,COUNT(U%LCOVER))) -! -! on lit les cover une apres l'autre, et on appelle hor_interpol sur chaque cover separement -! -#ifdef MNH_PARALLEL -IF ( HPROGRAM == 'MESONH' ) THEN - ICPT1 = 0 - DO JCOVER=1,JPCOVER - IF ( U%LCOVER( JCOVER ) ) THEN - ICPT1 = ICPT1 + 1 - CALL READ_SURFX2COV_1COV_MNH(YRECFM,INI,JCOVER,ZCOVER1D(:),IRESP,YCOMMENT,'A') - CALL HOR_INTERPOL_1COV(DTCO, U,GCP,ILUOUT,ZCOVER1D,U%XCOVER(:,ICPT1)) - ENDIF - ! - ENDDO -ENDIF -DEALLOCATE(ZCOVER1D) -#else - CALL HOR_INTERPOL(DTCO, U,GCP, & - ILUOUT,ZCOVER,U%XCOVER) - DEALLOCATE(ZCOVER) -#endif -! -ALLOCATE(ZCOVER(IL,COUNT(U%LCOVER))) -ICPT1 = 0 -ICPT2 = 0 -DO JCOVER = 1,JPCOVER - IF (U%LCOVER(JCOVER)) THEN - ICPT1 = ICPT1 + 1 - IF (ALL(U%XCOVER(:,ICPT1)==0.)) THEN - U%LCOVER(JCOVER) = .FALSE. - ELSE - ICPT2 = ICPT2 + 1 - ZCOVER(:,ICPT2) = U%XCOVER(:,ICPT1) - ENDIF - ENDIF -ENDDO -! -DEALLOCATE(U%XCOVER) -ALLOCATE(U%XCOVER(IL,ICPT2)) -U%XCOVER(:,:) = ZCOVER(:,1:ICPT2) -DEALLOCATE(ZCOVER) -! -CALL CLOSE_AUX_IO_SURF(HINIFILE,HINIFILETYPE) -ALLOCATE(ZSEA2 (IL,1)) -ALLOCATE(ZNATURE2(IL,1)) -ALLOCATE(ZWATER2 (IL,1)) -ALLOCATE(ZTOWN2 (IL,1)) -! - CALL HOR_INTERPOL(DTCO, U,GCP, & - ILUOUT,ZSEA1,ZSEA2) - CALL HOR_INTERPOL(DTCO, U,GCP, & - ILUOUT,ZNATURE1,ZNATURE2) - CALL HOR_INTERPOL(DTCO, U,GCP, & - ILUOUT,ZWATER1,ZWATER2) - CALL HOR_INTERPOL(DTCO, U,GCP, & - ILUOUT,ZTOWN1,ZTOWN2) -! -DEALLOCATE(ZSEA1) -DEALLOCATE(ZNATURE1) -DEALLOCATE(ZWATER1) -DEALLOCATE(ZTOWN1) -! -ALLOCATE(U%XSEA (IL)) -ALLOCATE(U%XNATURE(IL)) -ALLOCATE(U%XWATER (IL)) -ALLOCATE(U%XTOWN (IL)) -! -U%XSEA(:) = ZSEA2 (:,1) -U%XNATURE(:)= ZNATURE2(:,1) -U%XWATER(:) = ZWATER2 (:,1) -U%XTOWN(:) = ZTOWN2 (:,1) -! -DEALLOCATE(ZSEA2) -DEALLOCATE(ZNATURE2) -DEALLOCATE(ZWATER2) -DEALLOCATE(ZTOWN2) -! - CALL CLEAN_PREP_OUTPUT_GRID -!------------------------------------------------------------------------------ -! -!* 5. Coherence check -! --------------- -! -ALLOCATE(ZSUM(IL)) -ZSUM = 0. -DO JCOVER=1,SIZE(U%XCOVER,2) - ZSUM(:) = ZSUM(:) + U%XCOVER(:,JCOVER) -END DO -! -DO JCOVER=1,SIZE(U%XCOVER,2) - WHERE(ZSUM(:)/=0.) U%XCOVER(:,JCOVER) = U%XCOVER(:,JCOVER)/ZSUM(:) -END DO -! -DO JCOVER=1,SIZE(U%XCOVER,2) - IF (ALL(U%XCOVER(:,JCOVER)==0.)) U%LCOVER(JCOVER) = .FALSE. -END DO -!------------------------------------------------------------------------------ -! -!* 6. Fractions -! --------- -! -! When the model runs in multiproc, NSIZE* represents the number of points -! on a proc, and NDIM* the total number of points on all procs. -! The following definition of NDIM* won't be correct any more when the PGD -! runs in multiproc. -! -U%NSIZE_NATURE = COUNT(U%XNATURE(:) > 0.0) -U%NSIZE_WATER = COUNT(U%XWATER (:) > 0.0) -U%NSIZE_SEA = COUNT(U%XSEA (:) > 0.0) -U%NSIZE_TOWN = COUNT(U%XTOWN (:) > 0.0) -U%NSIZE_FULL = IL -! -U%NDIM_NATURE = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XNATURE(:) > 0., 'DIM') -U%NDIM_WATER = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XWATER (:) > 0., 'DIM') -U%NDIM_SEA = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XSEA (:) > 0., 'DIM') -U%NDIM_TOWN = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XTOWN (:) > 0., 'DIM') -ZSUM=1. -U%NDIM_FULL = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,ZSUM (:) ==1., 'DIM') -DEALLOCATE(ZSUM) -! -ALLOCATE(U%NR_NATURE (U%NSIZE_NATURE)) -ALLOCATE(U%NR_TOWN (U%NSIZE_TOWN )) -ALLOCATE(U%NR_WATER (U%NSIZE_WATER )) -ALLOCATE(U%NR_SEA (U%NSIZE_SEA )) -! -IF (U%NSIZE_SEA >0)CALL GET_1D_MASK( U%NSIZE_SEA, U%NSIZE_FULL, U%XSEA , U%NR_SEA ) -IF (U%NSIZE_WATER >0)CALL GET_1D_MASK( U%NSIZE_WATER, U%NSIZE_FULL, U%XWATER , U%NR_WATER ) -IF (U%NSIZE_TOWN >0)CALL GET_1D_MASK( U%NSIZE_TOWN, U%NSIZE_FULL, U%XTOWN , U%NR_TOWN ) -IF (U%NSIZE_NATURE>0)CALL GET_1D_MASK( U%NSIZE_NATURE, U%NSIZE_FULL, U%XNATURE, U%NR_NATURE) -IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_COVER',1,ZHOOK_HANDLE) - -!_______________________________________________________________________________ -! -END SUBROUTINE ZOOM_PGD_COVER +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE ZOOM_PGD_COVER (DTCO, UG, U,GCP, & + HPROGRAM,HINIFILE,HINIFILETYPE,OECOCLIMAP) +! ########################################################### + +!! +!! PURPOSE +!! ------- +!! This program prepares the physiographic data fields. +!! +!! METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! V. Masson Meteo-France +!! +!! MODIFICATION +!! ------------ +!! +!! Original 13/10/03 +! Modification 17/04/12 M.Tomasini All COVER physiographic fields are now +!! interpolated for spawning => +!! ABOR1_SFX if (.NOT.OECOCLIMAP) in comment +! Modification 05/02/15 M.Moge : MPPDB_CHECK + use NSIZE_FULL instead of SIZE(XLAT) (for clarity) +!! J.Escobar 18/12/2015 : missing interface +!---------------------------------------------------------------------------- +! +!* 0. DECLARATION +! ----------- +! +! +! +! +USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t +USE MODD_SURF_ATM_GRID_n, ONLY : SURF_ATM_GRID_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +USE MODD_GRID_CONF_PROJ, ONLY : GRID_CONF_PROJ_t +! +USE MODD_SURF_PAR, ONLY : XUNDEF +USE MODD_DATA_COVER_PAR, ONLY : JPCOVER +USE MODD_PREP, ONLY : CINGRID_TYPE, CINTERP_TYPE +! +USE MODE_READ_SURF_COV, ONLY : READ_SURF_COV +! +USE MODI_CONVERT_COVER_FRAC +USE MODI_OPEN_AUX_IO_SURF +USE MODI_READ_SURF +USE MODI_CLOSE_AUX_IO_SURF +USE MODI_PREP_GRID_EXTERN +USE MODI_HOR_INTERPOL +USE MODI_HOR_INTERPOL_1COV +USE MODI_PREP_OUTPUT_GRID +USE MODI_OLD_NAME +USE MODI_SUM_ON_ALL_PROCS +USE MODI_GET_LUOUT +USE MODI_CLEAN_PREP_OUTPUT_GRID +USE MODI_GET_1D_MASK +USE MODI_READ_LCOVER +#ifdef SFX_MNH +USE MODI_READ_SURFX2COV_1COV_MNH +#endif +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +USE MODE_MPPDB +! +IMPLICIT NONE +! +!* 0.1 Declaration of dummy arguments +! ------------------------------ +! +! +TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO +TYPE(SURF_ATM_GRID_t), INTENT(INOUT) :: UG +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +TYPE(GRID_CONF_PROJ_t),INTENT(INOUT) :: GCP +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling + CHARACTER(LEN=28), INTENT(IN) :: HINIFILE ! input atmospheric file name + CHARACTER(LEN=6), INTENT(IN) :: HINIFILETYPE! input atmospheric file type +LOGICAL, INTENT(OUT) :: OECOCLIMAP ! flag to use ecoclimap +! +! +!* 0.2 Declaration of local variables +! ------------------------------ +! +INTEGER :: ICPT1, ICPT2 +INTEGER :: IRESP +INTEGER :: ILUOUT +INTEGER :: INI ! total 1D dimension (input grid) +INTEGER :: IL ! total 1D dimension (output grid) +INTEGER :: JCOVER ! loop counter +INTEGER :: IVERSION ! surface version +#ifdef MNH_PARALLEL +REAL, DIMENSION(:), POINTER :: ZCOVER1D +#endif +REAL, DIMENSION(:,:), POINTER :: ZCOVER +REAL, DIMENSION(:,:), POINTER :: ZSEA1, ZWATER1, ZNATURE1, ZTOWN1 +REAL, DIMENSION(:,:), POINTER :: ZSEA2, ZWATER2, ZNATURE2, ZTOWN2 +REAL, DIMENSION(:), ALLOCATABLE :: ZSUM + CHARACTER(LEN=16) :: YRECFM ! Name of the article to be read + CHARACTER(LEN=100) :: YCOMMENT +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!------------------------------------------------------------------------------ +IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_COVER',0,ZHOOK_HANDLE) + CALL GET_LUOUT(HPROGRAM,ILUOUT) +! +!* 1. Preparation of IO for reading in the file +! ----------------------------------------- +! +!* Note that all points are read, even those without physical meaning. +! These points will not be used during the horizontal interpolation step. +! Their value must be defined as XUNDEF. +! + CALL OPEN_AUX_IO_SURF(& + HINIFILE,HINIFILETYPE,'FULL ') +! + CALL READ_SURF(& + HPROGRAM,'ECOCLIMAP',OECOCLIMAP,IRESP) +! +!------------------------------------------------------------------------------ +! +!* 2. Reading of grid +! --------------- +! + CALL PREP_GRID_EXTERN(GCP,& + HINIFILETYPE,ILUOUT,CINGRID_TYPE,CINTERP_TYPE,INI) +! + CALL PREP_OUTPUT_GRID(UG, U, & + ILUOUT,UG%CGRID,UG%XGRID_PAR,UG%XLAT,UG%XLON) + CALL MPPDB_CHECK_SURFEX2D(UG%XLAT,"ZOOM_PGD_COVER:XLAT",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(UG%XLON,"ZOOM_PGD_COVER:XLON",PRECISION,ILUOUT) +! +!------------------------------------------------------------------------------ +! +!* 3. Reading of cover +! ---------------- +! +YRECFM='VERSION' + CALL READ_SURF(& + HPROGRAM,YRECFM,IVERSION,IRESP) +! +ALLOCATE(U%LCOVER(JPCOVER)) +! +ALLOCATE(ZSEA1 (INI,1)) +ALLOCATE(ZNATURE1(INI,1)) +ALLOCATE(ZWATER1 (INI,1)) +ALLOCATE(ZTOWN1 (INI,1)) +! +IF (IVERSION>=7) THEN + CALL READ_SURF(& + HPROGRAM,'FRAC_SEA ',ZSEA1(:,1), IRESP,HDIR='A') + CALL READ_SURF(& + HPROGRAM,'FRAC_NATURE',ZNATURE1(:,1),IRESP,HDIR='A') + CALL READ_SURF(& + HPROGRAM,'FRAC_WATER ',ZWATER1(:,1), IRESP,HDIR='A') + CALL READ_SURF(& + HPROGRAM,'FRAC_TOWN ',ZTOWN1(:,1), IRESP,HDIR='A') + CALL OLD_NAME(& + HPROGRAM,'COVER_LIST ',YRECFM) + CALL READ_LCOVER(HPROGRAM,U%LCOVER) +#ifdef MNH_PARALLEL + ALLOCATE(ZCOVER1D(INI)) +#else + ALLOCATE(ZCOVER(INI,COUNT(U%LCOVER))) + CALL READ_SURF_COV(& + HPROGRAM,YRECFM,ZCOVER(:,:),U%LCOVER,IRESP,HDIR='A') + +#endif + + ! +ELSE +#ifdef MNH_PARALLEL + ! we assume that IVERSION>=7 +#else + CALL OLD_NAME(& + HPROGRAM,'COVER_LIST ',YRECFM) + CALL READ_LCOVER(HPROGRAM,U%LCOVER) + ! + ALLOCATE(ZCOVER(INI,COUNT(U%LCOVER))) + CALL READ_SURF_COV(& + HPROGRAM,YRECFM,ZCOVER(:,:),U%LCOVER,IRESP,HDIR='A') + + + CALL CONVERT_COVER_FRAC(DTCO, & + ZCOVER,U%LCOVER,ZSEA1(:,1),ZNATURE1(:,1),ZTOWN1(:,1),ZWATER1(:,1)) +#endif +ENDIF +! +! CALL CLOSE_AUX_IO_SURF(HINIFILE,HINIFILETYPE) +!------------------------------------------------------------------------------ +! +!* 4. Reading of cover & Interpolations +! -------------- +! +IL = U%NSIZE_FULL +ALLOCATE(U%XCOVER(IL,COUNT(U%LCOVER))) +! +! on lit les cover une apres l'autre, et on appelle hor_interpol sur chaque cover separement +! +#ifdef MNH_PARALLEL +IF ( HPROGRAM == 'MESONH' ) THEN + ICPT1 = 0 + DO JCOVER=1,JPCOVER + IF ( U%LCOVER( JCOVER ) ) THEN + ICPT1 = ICPT1 + 1 + CALL READ_SURFX2COV_1COV_MNH(YRECFM,INI,JCOVER,ZCOVER1D(:),IRESP,YCOMMENT,'A') + CALL HOR_INTERPOL_1COV(DTCO, U,GCP,ILUOUT,ZCOVER1D,U%XCOVER(:,ICPT1)) + CALL MPPDB_CHECK_SURFEX3D(U%XCOVER,"ZOOM_PGD_COVER:XCOVER",PRECISION,ILUOUT,'FULL',JPCOVER) + ENDIF + ! + ENDDO +ENDIF +DEALLOCATE(ZCOVER1D) +#else + CALL HOR_INTERPOL(DTCO, U,GCP, & + ILUOUT,ZCOVER,U%XCOVER) + DEALLOCATE(ZCOVER) +#endif +! +ALLOCATE(ZCOVER(IL,COUNT(U%LCOVER))) +ICPT1 = 0 +ICPT2 = 0 +DO JCOVER = 1,JPCOVER + IF (U%LCOVER(JCOVER)) THEN + ICPT1 = ICPT1 + 1 + IF (ALL(U%XCOVER(:,ICPT1)==0.)) THEN + U%LCOVER(JCOVER) = .FALSE. + ELSE + ICPT2 = ICPT2 + 1 + ZCOVER(:,ICPT2) = U%XCOVER(:,ICPT1) + ENDIF + ENDIF +ENDDO +! +DEALLOCATE(U%XCOVER) +ALLOCATE(U%XCOVER(IL,ICPT2)) +U%XCOVER(:,:) = ZCOVER(:,1:ICPT2) +DEALLOCATE(ZCOVER) +! +CALL CLOSE_AUX_IO_SURF(HINIFILE,HINIFILETYPE) +ALLOCATE(ZSEA2 (IL,1)) +ALLOCATE(ZNATURE2(IL,1)) +ALLOCATE(ZWATER2 (IL,1)) +ALLOCATE(ZTOWN2 (IL,1)) +! + CALL HOR_INTERPOL(DTCO, U,GCP, & + ILUOUT,ZSEA1,ZSEA2) + CALL HOR_INTERPOL(DTCO, U,GCP, & + ILUOUT,ZNATURE1,ZNATURE2) + CALL HOR_INTERPOL(DTCO, U,GCP, & + ILUOUT,ZWATER1,ZWATER2) + CALL HOR_INTERPOL(DTCO, U,GCP, & + ILUOUT,ZTOWN1,ZTOWN2) +! +DEALLOCATE(ZSEA1) +DEALLOCATE(ZNATURE1) +DEALLOCATE(ZWATER1) +DEALLOCATE(ZTOWN1) +! +ALLOCATE(U%XSEA (IL)) +ALLOCATE(U%XNATURE(IL)) +ALLOCATE(U%XWATER (IL)) +ALLOCATE(U%XTOWN (IL)) +! +U%XSEA(:) = ZSEA2 (:,1) +U%XNATURE(:)= ZNATURE2(:,1) +U%XWATER(:) = ZWATER2 (:,1) +U%XTOWN(:) = ZTOWN2 (:,1) +! +DEALLOCATE(ZSEA2) +DEALLOCATE(ZNATURE2) +DEALLOCATE(ZWATER2) +DEALLOCATE(ZTOWN2) +! + CALL CLEAN_PREP_OUTPUT_GRID +!------------------------------------------------------------------------------ +! +!* 5. Coherence check +! --------------- +! +ALLOCATE(ZSUM(IL)) +ZSUM = 0. +DO JCOVER=1,SIZE(U%XCOVER,2) + ZSUM(:) = ZSUM(:) + U%XCOVER(:,JCOVER) +END DO +CALL MPPDB_CHECK_SURFEX2D(ZSUM,"ZOOM_PGD_COVER:ZSUM",PRECISION,ILUOUT) +! +DO JCOVER=1,SIZE(U%XCOVER,2) + WHERE(ZSUM(:)/=0.) U%XCOVER(:,JCOVER) = U%XCOVER(:,JCOVER)/ZSUM(:) +END DO +! +DO JCOVER=1,SIZE(U%XCOVER,2) + IF (ALL(U%XCOVER(:,JCOVER)==0.)) U%LCOVER(JCOVER) = .FALSE. +END DO +!------------------------------------------------------------------------------ +! +!* 6. Fractions +! --------- +! +! When the model runs in multiproc, NSIZE* represents the number of points +! on a proc, and NDIM* the total number of points on all procs. +! The following definition of NDIM* won't be correct any more when the PGD +! runs in multiproc. +! +U%NSIZE_NATURE = COUNT(U%XNATURE(:) > 0.0) +U%NSIZE_WATER = COUNT(U%XWATER (:) > 0.0) +U%NSIZE_SEA = COUNT(U%XSEA (:) > 0.0) +U%NSIZE_TOWN = COUNT(U%XTOWN (:) > 0.0) +U%NSIZE_FULL = IL +! +U%NDIM_NATURE = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XNATURE(:) > 0., 'DIM') +U%NDIM_WATER = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XWATER (:) > 0., 'DIM') +U%NDIM_SEA = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XSEA (:) > 0., 'DIM') +U%NDIM_TOWN = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XTOWN (:) > 0., 'DIM') +ZSUM=1. +U%NDIM_FULL = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,ZSUM (:) ==1., 'DIM') +DEALLOCATE(ZSUM) +! +ALLOCATE(U%NR_NATURE (U%NSIZE_NATURE)) +ALLOCATE(U%NR_TOWN (U%NSIZE_TOWN )) +ALLOCATE(U%NR_WATER (U%NSIZE_WATER )) +ALLOCATE(U%NR_SEA (U%NSIZE_SEA )) +! +IF (U%NSIZE_SEA >0)CALL GET_1D_MASK( U%NSIZE_SEA, U%NSIZE_FULL, U%XSEA , U%NR_SEA ) +IF (U%NSIZE_WATER >0)CALL GET_1D_MASK( U%NSIZE_WATER, U%NSIZE_FULL, U%XWATER , U%NR_WATER ) +IF (U%NSIZE_TOWN >0)CALL GET_1D_MASK( U%NSIZE_TOWN, U%NSIZE_FULL, U%XTOWN , U%NR_TOWN ) +IF (U%NSIZE_NATURE>0)CALL GET_1D_MASK( U%NSIZE_NATURE, U%NSIZE_FULL, U%XNATURE, U%NR_NATURE) +CALL MPPDB_CHECK_SURFEX2D(U%XSEA,"ZOOM_PGD_COVER:XSEA",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(U%XWATER,"ZOOM_PGD_COVER:XWATER",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(U%XTOWN,"ZOOM_PGD_COVER:XTOWN",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(U%XNATURE,"ZOOM_PGD_COVER:XNATURE",PRECISION,ILUOUT) +IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_COVER',1,ZHOOK_HANDLE) + +!_______________________________________________________________________________ +! +END SUBROUTINE ZOOM_PGD_COVER diff --git a/src/SURFEX/zoom_pgd_isba.F90 b/src/SURFEX/zoom_pgd_isba.F90 index fa209759c..83c6c0ac1 100644 --- a/src/SURFEX/zoom_pgd_isba.F90 +++ b/src/SURFEX/zoom_pgd_isba.F90 @@ -37,6 +37,7 @@ !! Original 13/10/03 !! B. Decharme 2008 XWDRAIN !! M.Tomasini 17/04/12 Add interpolation for ISBA variables (MODD_DATA_ISBA_n) +! M.Moge 05/02/15 MPPDB_CHECK !---------------------------------------------------------------------------- ! !* 0. DECLARATION @@ -76,6 +77,10 @@ USE MODI_PACK_PGD_ISBA USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB ! +#ifdef MNH_PARALLEL +USE MODE_MPPDB +! +#endif IMPLICIT NONE ! !* 0.1 Declaration of dummy arguments @@ -238,7 +243,14 @@ ALLOCATE(I%XZ0EFFJPDIR(ILU)) HPROGRAM, 'NATURE', & IG%CGRID, IG%XGRID_PAR, & I%LCOVER, I%XCOVER, I%XZS, & - IG%XLAT, IG%XLON, IG%XMESH_SIZE, I%XZ0EFFJPDIR ) + IG%XLAT, IG%XLON, IG%XMESH_SIZE, I%XZ0EFFJPDIR ) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(I%XCOVER,"ZOOM_PGD_ISBA:XCOVER",PRECISION,ILUOUT,'NATURE',JPCOVER) + CALL MPPDB_CHECK_SURFEX2D(IG%XLAT,"ZOOM_PGD_ISBA:XLAT",PRECISION,ILUOUT,'NATURE') + CALL MPPDB_CHECK_SURFEX2D(IG%XLON,"ZOOM_PGD_ISBA:XLON",PRECISION,ILUOUT,'NATURE') + CALL MPPDB_CHECK_SURFEX2D(IG%XMESH_SIZE,"ZOOM_PGD_ISBA:XMESH_SIZE",PRECISION,ILUOUT,'NATURE') + CALL MPPDB_CHECK_SURFEX2D(I%XZ0EFFJPDIR,"ZOOM_PGD_ISBA:XZ0EFFJPDIR",PRECISION,ILUOUT,'NATURE') +#endif ! !------------------------------------------------------------------------------ ! @@ -251,6 +263,12 @@ ALLOCATE(I%XRUNOFFB(ILU)) ALLOCATE(I%XWDRAIN (ILU)) CALL ZOOM_PGD_ISBA_FULL(CHI, DTCO, DTI, IG, I, UG, U, GCP,& HPROGRAM,HINIFILE,HINIFILETYPE) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(I%XSAND,"ZOOM_PGD_ISBA:XSAND",PRECISION,ILUOUT,'NATURE',I%NGROUND_LAYER) + CALL MPPDB_CHECK_SURFEX3D(I%XCLAY,"ZOOM_PGD_ISBA:XCLAY",PRECISION,ILUOUT,'NATURE',I%NGROUND_LAYER) + CALL MPPDB_CHECK_SURFEX2D(I%XRUNOFFB,"ZOOM_PGD_ISBA:XRUNOFFB",PRECISION,ILUOUT,'NATURE') + CALL MPPDB_CHECK_SURFEX2D(I%XWDRAIN,"ZOOM_PGD_ISBA:XWDRAIN",PRECISION,ILUOUT,'NATURE') +#endif ! !------------------------------------------------------------------------------- ! @@ -280,6 +298,17 @@ ALLOCATE(ZSSO_SLOPE(IL)) ZAOSIP, ZAOSIM, ZAOSJP, ZAOSJM, & ZHO2IP, ZHO2IM, ZHO2JP, ZHO2JM, & ZSSO_SLOPE ) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX2D(ZAOSIP,"ZOOM_PGD_ISBA:ZAOSIP",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(ZAOSIM,"ZOOM_PGD_ISBA:ZAOSIM",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(ZAOSJP,"ZOOM_PGD_ISBA:ZAOSJP",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(ZAOSJM,"ZOOM_PGD_ISBA:ZAOSJM",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(ZHO2IP,"ZOOM_PGD_ISBA:ZHO2IP",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(ZHO2IM,"ZOOM_PGD_ISBA:ZHO2IM",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(ZHO2JP,"ZOOM_PGD_ISBA:ZHO2JP",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(ZHO2JM,"ZOOM_PGD_ISBA:ZHO2JM",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(ZSSO_SLOPE,"ZOOM_PGD_ISBA:ZSSO_SLOPE",PRECISION,ILUOUT) +#endif ! DEALLOCATE(ZAOSIP) DEALLOCATE(ZAOSIM) diff --git a/src/SURFEX/zoom_pgd_orography.F90 b/src/SURFEX/zoom_pgd_orography.F90 index 6f21dd21b..e24b8aa26 100644 --- a/src/SURFEX/zoom_pgd_orography.F90 +++ b/src/SURFEX/zoom_pgd_orography.F90 @@ -70,6 +70,11 @@ USE PARKIND1 ,ONLY : JPRB USE MODI_CLEAN_PREP_OUTPUT_GRID ! USE MODI_GET_LUOUT +! +#ifdef MNH_PARALLEL +USE MODE_MPPDB +! +#endif IMPLICIT NONE ! !* 0.1 Declaration of dummy arguments @@ -144,6 +149,10 @@ IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_OROGRAPHY',0,ZHOOK_HANDLE) ! CALL PREP_OUTPUT_GRID(UG, U, & ILUOUT,UG%CGRID,UG%XGRID_PAR,UG%XLAT,UG%XLON) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX2D(UG%XLAT,"ZOOM_PGD_OROGRAPHY:XLAT",PRECISION,ILUOUT) + CALL MPPDB_CHECK_SURFEX2D(UG%XLON,"ZOOM_PGD_OROGRAPHY:XLON",PRECISION,ILUOUT) +#endif ! !------------------------------------------------------------------------------ ! @@ -316,6 +325,26 @@ WHERE (PWATER(:)==1.) USS%XAOSJP(:) = 0. USS%XAOSJM(:) = 0. END WHERE +#ifdef MNH_PARALLEL +CALL MPPDB_CHECK_SURFEX2D(U%XZS,"ZOOM_PGD_OROGRAPHY:XZS",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XAVG_ZS,"ZOOM_PGD_OROGRAPHY:XAVG_ZS",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XSIL_ZS,"ZOOM_PGD_OROGRAPHY:XSIL_ZS",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XSSO_STDEV,"ZOOM_PGD_OROGRAPHY:XSSO_STDEV",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XMIN_ZS,"ZOOM_PGD_OROGRAPHY:XMIN_ZS",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XMAX_ZS,"ZOOM_PGD_OROGRAPHY:XMAX_ZS",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XSSO_ANIS,"ZOOM_PGD_OROGRAPHY:XSSO_ANIS",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XSSO_DIR,"ZOOM_PGD_OROGRAPHY:XSSO_DIR",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XSSO_SLOPE,"ZOOM_PGD_OROGRAPHY:XSSO_SLOPE",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XAOSIP,"ZOOM_PGD_OROGRAPHY:XAOSIP",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XAOSIM,"ZOOM_PGD_OROGRAPHY:XAOSIM",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XAOSJP,"ZOOM_PGD_OROGRAPHY:XAOSJP",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XAOSJM,"ZOOM_PGD_OROGRAPHY:XAOSJM",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XHO2IP,"ZOOM_PGD_OROGRAPHY:XHO2IP",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XHO2IM,"ZOOM_PGD_OROGRAPHY:XHO2IM",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XHO2JP,"ZOOM_PGD_OROGRAPHY:XHO2JP",PRECISION,ILUOUT) +CALL MPPDB_CHECK_SURFEX2D(USS%XHO2JM,"ZOOM_PGD_OROGRAPHY:XHO2JM",PRECISION,ILUOUT) +! +#endif ! go back to child model CALL GOTO_MODEL_MNH(U,HPROGRAM, 2, IINFO_ll) !_______________________________________________________________________________ diff --git a/src/SURFEX/zoom_pgd_seaflux.F90 b/src/SURFEX/zoom_pgd_seaflux.F90 index 05a68fd64..11c7219e4 100644 --- a/src/SURFEX/zoom_pgd_seaflux.F90 +++ b/src/SURFEX/zoom_pgd_seaflux.F90 @@ -36,6 +36,7 @@ !! Original 09/2008 !! G. TANGUY 03/2009 : add reading and interpolation of XDATA_SST and !! TDATA_SST in the case LDATA_SST=T +! Modification 05/02/15 M.Moge : MPPDB_CHECK !! !---------------------------------------------------------------------------- ! @@ -73,6 +74,10 @@ USE MODI_CLEAN_PREP_OUTPUT_GRID USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB ! +#ifdef MNH_PARALLEL +USE MODE_MPPDB +! +#endif IMPLICIT NONE ! !* 0.1 Declaration of arguments @@ -142,7 +147,12 @@ ALLOCATE(SG%XMESH_SIZE (SG%NDIM)) HPROGRAM, 'SEA ', & SG%CGRID, SG%XGRID_PAR, S%LCOVER, & S%XCOVER, S%XZS, & - SG%XLAT, SG%XLON, SG%XMESH_SIZE ) + SG%XLAT, SG%XLON, SG%XMESH_SIZE ) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(S%XCOVER,"ZOOM_PGD_SEAFLUX:XCOVER",PRECISION,ILUOUT, 'SEA',JPCOVER) + CALL MPPDB_CHECK_SURFEX2D(SG%XMESH_SIZE,"ZOOM_PGD_SEAFLUX:XMESH_SIZE",PRECISION,ILUOUT, 'SEA') + CALL MPPDB_CHECK_SURFEX2D(S%XZS,"ZOOM_PGD_SEAFLUX:XZS",PRECISION,ILUOUT, 'SEA') +#endif ! !------------------------------------------------------------------------------ ! @@ -154,6 +164,10 @@ ALLOCATE(SG%XMESH_SIZE (SG%NDIM)) ! CALL PREP_OUTPUT_GRID(UG, U, & ILUOUT,SG%CGRID,SG%XGRID_PAR,SG%XLAT,SG%XLON) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX2D(SG%XLAT,"ZOOM_PGD_SEAFLUX:XLAT",PRECISION,ILUOUT, 'SEA') + CALL MPPDB_CHECK_SURFEX2D(SG%XLON,"ZOOM_PGD_SEAFLUX:XLON",PRECISION,ILUOUT, 'SEA') +#endif ! !* mask where interpolations must be done ! diff --git a/src/SURFEX/zoom_pgd_teb.F90 b/src/SURFEX/zoom_pgd_teb.F90 index 43271ee57..090248527 100644 --- a/src/SURFEX/zoom_pgd_teb.F90 +++ b/src/SURFEX/zoom_pgd_teb.F90 @@ -37,6 +37,7 @@ !! ------------ !! !! Original 13/10/03 +! Modification 05/02/15 M.Moge : MPPDB_CHECK !---------------------------------------------------------------------------- ! !* 0. DECLARATION @@ -87,6 +88,9 @@ USE MODI_GOTO_WRAPPER_TEB_PATCH USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB ! +#ifdef MNH_PARALLEL +USE MODE_MPPDB +#endif ! IMPLICIT NONE ! @@ -181,7 +185,14 @@ ALLOCATE(TG%XMESH_SIZE (ILU)) HPROGRAM, 'TOWN ', & TG%CGRID, TG%XGRID_PAR, & TOP%LCOVER, TOP%XCOVER, TOP%XZS, & - TG%XLAT, TG%XLON, TG%XMESH_SIZE ) + TG%XLAT, TG%XLON, TG%XMESH_SIZE ) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(TOP%XCOVER,"ZOOM_PGD_TEB:XCOVER",PRECISION,ILUOUT, 'TOWN ',JPCOVER) + CALL MPPDB_CHECK_SURFEX2D(TG%XLAT,"ZOOM_PGD_TEB:XLAT",PRECISION,ILUOUT, 'TOWN ') + CALL MPPDB_CHECK_SURFEX2D(TG%XLON,"ZOOM_PGD_TEB:XLON",PRECISION,ILUOUT, 'TOWN ') + CALL MPPDB_CHECK_SURFEX2D(TG%XMESH_SIZE,"ZOOM_PGD_TEB:XMESH_SIZE",PRECISION,ILUOUT, 'TOWN ') + CALL MPPDB_CHECK_SURFEX2D(TOP%XZS,"ZOOM_PGD_TEB:XZS",PRECISION,ILUOUT, 'TOWN ') +#endif ! TG%NDIM = ILU ! @@ -200,6 +211,10 @@ TG%NDIM = ILU ! CALL PREP_OUTPUT_GRID(UG, U, & ILUOUT,TG%CGRID,TG%XGRID_PAR,TG%XLAT,TG%XLON) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX2D(TG%XLAT,"ZOOM_PGD_TEB:XLAT",PRECISION,ILUOUT, 'TOWN ') + CALL MPPDB_CHECK_SURFEX2D(TG%XLON,"ZOOM_PGD_TEB:XLON",PRECISION,ILUOUT, 'TOWN ') +#endif ! ! !------------------------------------------------------------------------------ @@ -317,6 +332,9 @@ END DO ALLOCATE(TGDP%XSAND(ILU,TGDO%NGROUND_LAYER)) CALL HOR_INTERPOL(DTCO, U,GCP, & ILUOUT,ZIN,TGDP%XSAND) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(TGDP%XSAND,"ZOOM_PGD_TEB_GARDEB:XSAND",PRECISION,ILUOUT, 'TOWN ',TGDO%NGROUND_LAYER) +#endif DEALLOCATE(ZIN) ! !* clay @@ -332,6 +350,9 @@ END DO ALLOCATE(TGDP%XCLAY(ILU,TGDO%NGROUND_LAYER)) CALL HOR_INTERPOL(DTCO, U,GCP, & ILUOUT,ZIN,TGDP%XCLAY) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(TGDP%XCLAY,"ZOOM_PGD_TEB_GARDEB:XCLAY",PRECISION,ILUOUT, 'TOWN ',TGDO%NGROUND_LAYER) +#endif DEALLOCATE(ZIN) ! !* runoff & drainage @@ -345,6 +366,9 @@ ZIN(:,1) = ZFIELD(:) ALLOCATE(TGDP%XRUNOFFB(ILU)) CALL HOR_INTERPOL(DTCO, U,GCP, & ILUOUT,ZIN,ZOUT) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(ZOUT,"ZOOM_PGD_TEB_GARDEB:ZOUT",PRECISION,ILUOUT, 'TOWN ',1) +#endif TGDP%XRUNOFFB(:) = ZOUT(:,1) ! IF (IVERSION<=3) THEN @@ -358,6 +382,9 @@ ELSE ALLOCATE(TGDP%XWDRAIN(ILU)) CALL HOR_INTERPOL(DTCO, U,GCP, & ILUOUT,ZIN,ZOUT) +#ifdef MNH_PARALLEL + CALL MPPDB_CHECK_SURFEX3D(ZOUT,"ZOOM_PGD_TEB_GARDEB:ZOUT",PRECISION,ILUOUT, 'TOWN ',1) +#endif TGDP%XWDRAIN(:) = ZOUT(:,1) ENDIF ! -- GitLab