From 4c016f61b830ab343d5ff21a5ba7103e8cf1a3fc Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Mon, 3 Jun 2019 10:17:29 +0200 Subject: [PATCH] Philippe 03/06/2019: simplify code (remove always true masks) + replace PACK intrinsics --- src/MNH/shallow_convection.f90 | 158 +++++++++++---------------------- 1 file changed, 54 insertions(+), 104 deletions(-) diff --git a/src/MNH/shallow_convection.f90 b/src/MNH/shallow_convection.f90 index e9ea4751e..548e8bda5 100644 --- a/src/MNH/shallow_convection.f90 +++ b/src/MNH/shallow_convection.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-2019 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 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 conv 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ###################### MODULE MODI_SHALLOW_CONVECTION ! ###################### @@ -158,7 +153,7 @@ END MODULE MODI_SHALLOW_CONVECTION !! " 01/01/02 Apply conservation correction !! F Bouyssel 05/11/08 Modifications for reproductibility !! E. Bazile 20/07/09 Input of TKECLS. -!! Juan 24/09/2012: for BUG Pgi rewrite PACK function on mode_pack_pgi +! P. Wautelet 03/06/2019: simplify code (remove always true masks) + replace PACK intrinsics !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -174,10 +169,6 @@ USE MODI_CONVECT_UPDRAFT_SHAL USE MODI_CONVECT_CLOSURE_SHAL USE MODI_CONVECT_CHEM_TRANSPORT ! -#ifdef MNH_PGI -USE MODE_PACK_PGI -#endif -! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -229,7 +220,7 @@ REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(INOUT):: PCH1TEN! species conv. tendency ! !* 0.2 Declarations of local fixed memory variables : ! -INTEGER :: ITEST, ICONV ! number of convective columns +INTEGER :: ICONV ! number of convective columns INTEGER :: IIB, IIE ! horizontal loop bounds INTEGER :: IKB, IKE ! vertical loop bounds INTEGER :: IKS ! vertical dimension @@ -240,8 +231,6 @@ INTEGER :: IFTSTEPS ! only used for chemical tracers REAL :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d REAL :: ZRDOCP ! R_d/C_p ! -LOGICAL, DIMENSION(KLON, KLEV) :: GTRIG3 ! 3D logical mask for convection -LOGICAL, DIMENSION(KLON) :: GTRIG ! 2D logical mask for trigger test REAL, DIMENSION(KLON,KLEV) :: ZTHT, ZSTHV, ZSTHES ! grid scale theta, theta_v REAL, DIMENSION(KLON) :: ZWORK2, ZWORK2B ! work array REAL :: ZW1 ! work variable @@ -317,9 +306,8 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZRCC ! conv. adj. grid scale r_c REAL, DIMENSION(:,:), ALLOCATABLE :: ZRIC ! conv. adj. grid scale r_i REAL, DIMENSION(:,:), ALLOCATABLE :: ZWSUB ! envir. compensating subsidence (Pa/s) ! -LOGICAL, DIMENSION(:),ALLOCATABLE :: GTRIG1 ! logical mask for convection -LOGICAL, DIMENSION(:),ALLOCATABLE :: GWORK ! logical work array -INTEGER, DIMENSION(:),ALLOCATABLE :: IINDEX, IJINDEX, IJSINDEX, IJPINDEX!hor.index +LOGICAL, DIMENSION(:),ALLOCATABLE :: GTRIG1 ! logical mask for convection +INTEGER, DIMENSION(:),ALLOCATABLE :: IJINDEX ! hor.index REAL, DIMENSION(:), ALLOCATABLE :: ZCPH ! specific heat C_ph REAL, DIMENSION(:), ALLOCATABLE :: ZLV, ZLS! latent heat of vaporis., sublim. REAL :: ZES ! saturation vapor mixng ratio @@ -328,7 +316,6 @@ REAL :: ZES ! saturation vapor mixng ratio REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZCH1 ! grid scale chemical specy (kg/kg) REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZCH1C ! conv. adjust. chemical specy 1 REAL, DIMENSION(:,:), ALLOCATABLE:: ZWORK3 ! conv. adjust. chemical specy 1 -LOGICAL, DIMENSION(:,:,:),ALLOCATABLE::GTRIG4 ! logical mask ! !------------------------------------------------------------------------------- ! @@ -343,44 +330,23 @@ IKB = 1 + JCVEXB IKS = KLEV JCVEXT = MAX( 0, KTDIA - 1) IKE = IKS - JCVEXT -! -! -!* 0.5 Update convective counter ( where KCOUNT > 0 -! convection is still active ). -! --------------------------------------------- -! -GTRIG(:) = .FALSE. -GTRIG(IIB:IIE) = .TRUE. -ITEST = COUNT( GTRIG(:) ) -IF ( ITEST == 0 ) THEN - RETURN -ENDIF - ! ! !* 0.7 Reset convective tendencies to zero if convective ! counter becomes negative ! ------------------------------------------------- ! -GTRIG3(:,:) = SPREAD( GTRIG(:), DIM=2, NCOPIES=IKS ) -WHERE ( GTRIG3(:,:) ) - PTTEN(:,:) = 0. - PRVTEN(:,:) = 0. - PRCTEN(:,:) = 0. - PRITEN(:,:) = 0. +PTTEN(:,:) = 0. +PRVTEN(:,:) = 0. +PRCTEN(:,:) = 0. +PRITEN(:,:) = 0. ! PUTEN(:,:) = 0. ! PVTEN(:,:) = 0. - PUMF(:,:) = 0. -END WHERE -WHERE ( GTRIG(:) ) - KCLTOP(:) = 0 - KCLBAS(:) = 0 -END WHERE +PUMF(:,:) = 0. +KCLTOP(:) = 0 +KCLBAS(:) = 0 IF ( OCH1CONV ) THEN - ALLOCATE( GTRIG4(KLON,KLEV,KCH1) ) - GTRIG4(:,:,:) = SPREAD( GTRIG3(:,:), DIM=3, NCOPIES=KCH1 ) - WHERE( GTRIG4(:,:,:) ) PCH1TEN(:,:,:) = 0. - DEALLOCATE( GTRIG4 ) + PCH1TEN(:,:,:) = 0. END IF ! ! @@ -429,47 +395,38 @@ END DO ! at the moment. ! -------------------------------------------------------------- ! -ALLOCATE( ZPRES(ITEST,IKS) ) -ALLOCATE( ZZ(ITEST,IKS) ) -ALLOCATE( ZW(ITEST,IKS) ) -ALLOCATE( ZTH(ITEST,IKS) ) -ALLOCATE( ZTHV(ITEST,IKS) ) -ALLOCATE( ZTHEST(ITEST,IKS) ) -ALLOCATE( ZRV(ITEST,IKS) ) -ALLOCATE( ZSTHLCL(ITEST) ) -ALLOCATE( ZSTLCL(ITEST) ) -ALLOCATE( ZSRVLCL(ITEST) ) -ALLOCATE( ZSWLCL(ITEST) ) -ALLOCATE( ZSZLCL(ITEST) ) -ALLOCATE( ZSTHVELCL(ITEST) ) -ALLOCATE( ISDPL(ITEST) ) -ALLOCATE( ISPBL(ITEST) ) -ALLOCATE( ISLCL(ITEST) ) -ALLOCATE( ZSDXDY(ITEST) ) -ALLOCATE( GTRIG1(ITEST) ) -ALLOCATE( IINDEX(KLON) ) -ALLOCATE( IJSINDEX(ITEST) ) -DO JI = 1, KLON - IINDEX(JI) = JI -END DO -IJSINDEX(:) = PACK( IINDEX(:), MASK=GTRIG(:) ) +ALLOCATE( ZPRES(KLON,IKS) ) +ALLOCATE( ZZ(KLON,IKS) ) +ALLOCATE( ZW(KLON,IKS) ) +ALLOCATE( ZTH(KLON,IKS) ) +ALLOCATE( ZTHV(KLON,IKS) ) +ALLOCATE( ZTHEST(KLON,IKS) ) +ALLOCATE( ZRV(KLON,IKS) ) +ALLOCATE( ZSTHLCL(KLON) ) +ALLOCATE( ZSTLCL(KLON) ) +ALLOCATE( ZSRVLCL(KLON) ) +ALLOCATE( ZSWLCL(KLON) ) +ALLOCATE( ZSZLCL(KLON) ) +ALLOCATE( ZSTHVELCL(KLON) ) +ALLOCATE( ISDPL(KLON) ) +ALLOCATE( ISPBL(KLON) ) +ALLOCATE( ISLCL(KLON) ) +ALLOCATE( ZSDXDY(KLON) ) +ALLOCATE( GTRIG1(KLON) ) ! DO JK = IKB, IKE -DO JI = 1, ITEST - JL = IJSINDEX(JI) - ZPRES(JI,JK) = PPABST(JL,JK) - ZZ(JI,JK) = PZZ(JL,JK) - ZTH(JI,JK) = ZTHT(JL,JK) - ZTHV(JI,JK) = ZSTHV(JL,JK) - ZTHEST(JI,JK) = ZSTHES(JL,JK) - ZRV(JI,JK) = MAX( 0., PRVT(JL,JK) ) - ZW(JI,JK) = PWT(JL,JK) -END DO +DO JI = 1, KLON + JL = JI + ZPRES(JI,JK) = PPABST(JI,JK) + ZZ(JI,JK) = PZZ(JI,JK) + ZTH(JI,JK) = ZTHT(JI,JK) + ZTHV(JI,JK) = ZSTHV(JI,JK) + ZTHEST(JI,JK) = ZSTHES(JI,JK) + ZRV(JI,JK) = MAX( 0., PRVT(JI,JK) ) + ZW(JI,JK) = PWT(JI,JK) END DO -DO JI = 1, ITEST - JL = IJSINDEX(JI) - ZSDXDY(JI) = XA25 END DO +ZSDXDY(:) = XA25 ! !* 2.2 Compute environm. enthalpy and total water = r_v + r_i + r_c ! and envir. saturation theta_e @@ -483,7 +440,7 @@ ISLCL(:) = MAX( IKB, 2 ) ! initialize DPL PBL and LCL ISDPL(:) = IKB ISPBL(:) = IKB ! -CALL CONVECT_TRIGGER_SHAL( ITEST, KLEV, & +CALL CONVECT_TRIGGER_SHAL( KLON, KLEV, & ZPRES, ZTH, ZTHV, ZTHEST, & ZRV, ZW, ZZ, ZSDXDY, PTKECLS, & ZSTHLCL, ZSTLCL, ZSRVLCL, ZSWLCL, ZSZLCL, & @@ -518,8 +475,6 @@ IF ( ICONV == 0 ) THEN DEALLOCATE( ISDPL ) DEALLOCATE( ISPBL ) DEALLOCATE( GTRIG1 ) - DEALLOCATE( IINDEX ) - DEALLOCATE( IJSINDEX ) RETURN ! no convective column has been found, exit DEEP_CONVECTION ENDIF ! @@ -569,7 +524,6 @@ ALLOCATE( ZCAPE(ICONV) ) ! work variables ! ALLOCATE( IJINDEX(ICONV) ) -ALLOCATE( IJPINDEX(ICONV) ) ALLOCATE( ZCPH(ICONV) ) ALLOCATE( ZLV(ICONV) ) ALLOCATE( ZLS(ICONV) ) @@ -579,8 +533,13 @@ ALLOCATE( ZLS(ICONV) ) ! arrays using mask GTRIG ! --------------------------------------------------- ! -GTRIG(:) = UNPACK( GTRIG1(:), MASK=GTRIG, FIELD=.FALSE. ) -IJINDEX(:) = PACK( IINDEX(:), MASK=GTRIG(:) ) +JL = 1 +DO JI = 1, KLON + IF ( GTRIG1(JI) ) THEN + IJINDEX(JL) = JI + JL = JL +1 + END IF +END DO ! DO JK = IKB, IKE DO JI = 1, ICONV @@ -597,12 +556,8 @@ DO JI = 1, ICONV END DO END DO ! -DO JI = 1, ITEST - IJSINDEX(JI) = JI -END DO -IJPINDEX(:) = PACK( IJSINDEX(:), MASK=GTRIG1(:) ) DO JI = 1, ICONV - JL = IJPINDEX(JI) + JL = IJINDEX(JI) IDPL(JI) = ISDPL(JL) IPBL(JI) = ISPBL(JL) ILCL(JI) = ISLCL(JL) @@ -614,14 +569,11 @@ DO JI = 1, ICONV ZTHVELCL(JI) = ZSTHVELCL(JL) ZDXDY(JI) = ZSDXDY(JL) END DO -ALLOCATE( GWORK(ICONV) ) -GWORK(:) = PACK( GTRIG1(:), MASK=GTRIG1(:) ) + DEALLOCATE( GTRIG1 ) ALLOCATE( GTRIG1(ICONV) ) -GTRIG1(:) = GWORK(:) -! -DEALLOCATE( GWORK ) -DEALLOCATE( IJPINDEX ) +GTRIG1(:) = .true. + DEALLOCATE( ISDPL ) DEALLOCATE( ISPBL ) DEALLOCATE( ISLCL ) @@ -1014,9 +966,7 @@ DEALLOCATE( ZCAPE ) ! ! work arrays ! -DEALLOCATE( IINDEX ) DEALLOCATE( IJINDEX ) -DEALLOCATE( IJSINDEX ) DEALLOCATE( GTRIG1 ) ! ! -- GitLab