From 43ee55168a3c63ce03f3fbb5245f51c8c2c8ff2d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 18 Dec 2019 17:13:54 +0100
Subject: [PATCH] Philippe 18/12/2019: OpenACC: ground_param_n: use
 allocatables for local variables + improve data directive

---
 src/MNH/ground_paramn.f90 | 120 +++++++++++++++++++++++++-------------
 1 file changed, 78 insertions(+), 42 deletions(-)

diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index 9ec06f34f..484a29f90 100644
--- a/src/MNH/ground_paramn.f90
+++ b/src/MNH/ground_paramn.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
 !-----------------------------------------------------------------
 !     ##########
@@ -227,41 +227,41 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE         :: ZRV    ! vapor mixing ratio
 !
 !            suffix 'A' stands for atmospheric variable at first model level
 !
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZZREF  ! Forcing height
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZTA    ! Temperature
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZRVA   ! vapor mixing ratio
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZQA    ! humidity (kg/m3)
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZPA    ! Pressure
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZPS    ! Pressure
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZEXNA  ! Exner function
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZEXNS  ! Exner function
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZTHA   ! potential temperature
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZRAIN  ! liquid precipitation (kg/m2/s)
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSNOW  ! solid precipitation  (kg/m2/s)
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZTSUN  ! solar time           (s since midnight)
-!
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZUA    ! u component of the wind
+REAL, DIMENSION(:,:), allocatable  :: ZZREF  ! Forcing height
+REAL, DIMENSION(:,:), allocatable  :: ZTA    ! Temperature
+REAL, DIMENSION(:,:), allocatable  :: ZRVA   ! vapor mixing ratio
+REAL, DIMENSION(:,:), allocatable  :: ZQA    ! humidity (kg/m3)
+REAL, DIMENSION(:,:), allocatable  :: ZPA    ! Pressure
+REAL, DIMENSION(:,:), allocatable  :: ZPS    ! Pressure
+REAL, DIMENSION(:,:), allocatable  :: ZEXNA  ! Exner function
+REAL, DIMENSION(:,:), allocatable  :: ZEXNS  ! Exner function
+REAL, DIMENSION(:,:), allocatable  :: ZTHA   ! potential temperature
+REAL, DIMENSION(:,:), allocatable  :: ZRAIN  ! liquid precipitation (kg/m2/s)
+REAL, DIMENSION(:,:), allocatable  :: ZSNOW  ! solid precipitation  (kg/m2/s)
+REAL, DIMENSION(:,:), allocatable  :: ZTSUN  ! solar time           (s since midnight)
+!
+REAL, DIMENSION(:,:), allocatable  :: ZUA    ! u component of the wind
 !                                                       ! parallel to the orography
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZVA    ! v component of the wind
+REAL, DIMENSION(:,:), allocatable  :: ZVA    ! v component of the wind
 !                                                       ! parallel to the orography
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZU     ! zonal wind
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZV     ! meridian wind
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZWIND  ! wind parallel to the orography
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZRHOA  ! air density
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZDIR   ! wind direction (rad from N clockwise)
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFU   ! zonal momentum flux
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFV   ! meridian momentum flux
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZCO2   ! CO2 concentration (kg/kg)
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZALFA  ! angle between the wind
+REAL, DIMENSION(:,:), allocatable  :: ZU     ! zonal wind
+REAL, DIMENSION(:,:), allocatable  :: ZV     ! meridian wind
+REAL, DIMENSION(:,:), allocatable  :: ZWIND  ! wind parallel to the orography
+REAL, DIMENSION(:,:), allocatable  :: ZRHOA  ! air density
+REAL, DIMENSION(:,:), allocatable  :: ZDIR   ! wind direction (rad from N clockwise)
+REAL, DIMENSION(:,:), allocatable  :: ZSFU   ! zonal momentum flux
+REAL, DIMENSION(:,:), allocatable  :: ZSFV   ! meridian momentum flux
+REAL, DIMENSION(:,:), allocatable  :: ZCO2   ! CO2 concentration (kg/kg)
+REAL, DIMENSION(:,:), allocatable  :: ZALFA  ! angle between the wind
 !                                                       ! and the x axis
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),1):: ZU2D   ! u and v component of the
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),1):: ZV2D   ! wind at mass point
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFTH  ! Turbulent flux of heat
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFTQ  ! Turbulent flux of water
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFCO2 ! Turbulent flux of CO2
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NSV):: ZSFTS! Turbulent flux of scalar
-!
-REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NBLOWSNOW_2D)  :: ZBLOWSNOW_2D  ! 2D blowing snow variables
+REAL, DIMENSION(:,:,:), allocatable :: ZU2D   ! u and v component of the
+REAL, DIMENSION(:,:,:), allocatable :: ZV2D   ! wind at mass point
+REAL, DIMENSION(:,:), allocatable  :: ZSFTH  ! Turbulent flux of heat
+REAL, DIMENSION(:,:), allocatable  :: ZSFTQ  ! Turbulent flux of water
+REAL, DIMENSION(:,:), allocatable  :: ZSFCO2 ! Turbulent flux of CO2
+REAL, DIMENSION(:,:,:), allocatable :: ZSFTS! Turbulent flux of scalar
+!
+REAL, DIMENSION(:,:,:), allocatable :: ZBLOWSNOW_2D  ! 2D blowing snow variables
                                                                             ! after advection
                                   ! They refer to the 2D fields advected by MNH including:
                                   !             - total number concentration in Canopy
@@ -356,15 +356,51 @@ REAL                              :: ZTIMEC
 INTEGER           :: ILUOUT         ! logical unit
 !
 !-------------------------------------------------------------------------------
-!
-!
 ILUOUT=TLUOUT%NLU
 IKB= 1+JPVEXT
 IKU=NKMAX + 2* JPVEXT
 IKE=IKU-JPVEXT
-!
+
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-!
+
+allocate( ZZREF (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZTA   (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZRVA  (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZQA   (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZPA   (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZPS   (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZEXNA (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZEXNS (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZTHA  (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZRAIN (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZSNOW (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZTSUN (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+
+allocate( ZUA   (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+
+allocate( ZVA   (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+
+allocate( ZU    (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZV    (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZWIND (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZRHOA (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZDIR  (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZSFU  (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZSFV  (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZCO2  (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZALFA (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+
+allocate( ZU2D  (SIZE(PSFTH,1),SIZE(PSFTH,2),1))
+allocate( ZV2D  (SIZE(PSFTH,1),SIZE(PSFTH,2),1))
+allocate( ZSFTH (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZSFTQ (SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZSFCO2(SIZE(PSFTH,1),SIZE(PSFTH,2))  )
+allocate( ZSFTS (SIZE(PSFTH,1),SIZE(PSFTH,2),NSV) )
+
+allocate( ZBLOWSNOW_2D(SIZE(PSFTH,1),SIZE(PSFTH,2),NBLOWSNOW_2D) )
+
+ALLOCATE(ZRV(SIZE(PSFTH,1),SIZE(PSFTH,2),IKU))
+
 PSFTH    = XUNDEF
 PSFRV    = XUNDEF
 PSFSV    = XUNDEF
@@ -380,13 +416,12 @@ PTSRAD   = XUNDEF
 !-------------------------------------------------------------------------------
 !
 !*       1.     CONVERSION OF THE ATMOSPHERIC VARIABLES
-!               --------------------------------------- 
+!               ---------------------------------------
 !
 !        1.1    water vapor
 !               -----------
 
 !
-ALLOCATE(ZRV(SIZE(PSFTH,1),SIZE(PSFTH,2),IKU))
 !
 IF(NRR>0) THEN
   ZRV(:,:,:)=XRT(:,:,:,1)
@@ -421,7 +456,8 @@ END IF
 !               ---------------
 !
 !$acc data copyin(XUT,XVT,XWT,XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, &
-!$acc &           XCOSSLOPE,XSINSLOPE,XDXX,XDYY,XDZZ)          &
+!$acc &           XCOSSLOPE,XSINSLOPE)                         &
+!$acc &   present(XDXX,XDYY,XDZZ)                              &
 !$acc     copyout(ZUA,ZVA)
 CALL ROTATE_WIND(XUT,XVT,XWT,           &
      XDIRCOSXW, XDIRCOSYW, XDIRCOSZW,   &
@@ -597,7 +633,7 @@ END IF
 #endif
 !
 ! Call to surface schemes
-!                       
+!
 CALL COUPLING_SURF_ATM_n(YSURF_CUR,'MESONH', 'E',ZTIMEC,                                                   &
                XTSTEP, TDTCUR%TDATE%YEAR, TDTCUR%TDATE%MONTH, TDTCUR%TDATE%DAY, TDTCUR%TIME,  &
                IDIM1D,KSV_SURF,SIZE(XSW_BANDS),                                                    &
-- 
GitLab