From 6e0c64dc197c748b267c9b95c7d3bec23f9d292a Mon Sep 17 00:00:00 2001
From: Juan Escobar <juan.escobar@aero.obs-mip.fr>
Date: Wed, 15 Sep 2021 18:35:20 +0200
Subject: [PATCH] Juan 15/09/2021: for GET_HALO2_D , allocate HALO2 list at
 first call and put it SAVE

---
 src/ZSOLVER/advecuvw_rk.f90 | 19 +++++++++++++------
 src/ZSOLVER/contrav.f90     | 30 +++++++++++++++++-------------
 src/ZSOLVER/get_halo.f90    |  2 +-
 src/ZSOLVER/ppm.f90         | 22 +++++++++++++++++-----
 4 files changed, 48 insertions(+), 25 deletions(-)

diff --git a/src/ZSOLVER/advecuvw_rk.f90 b/src/ZSOLVER/advecuvw_rk.f90
index b617fffa6..ffdce5df2 100644
--- a/src/ZSOLVER/advecuvw_rk.f90
+++ b/src/ZSOLVER/advecuvw_rk.f90
@@ -205,7 +205,8 @@ REAL, DIMENSION(:),   ALLOCATABLE :: ZBUTS! Butcher array coefficients
 !JUAN
 TYPE(LIST_ll), POINTER      :: TZFIELDMT_ll ! list of fields to exchange
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2MT_ll ! momentum variables
-TYPE(HALO2LIST_ll), POINTER :: TZHALO2_UT,TZHALO2_VT,TZHALO2_WT
+TYPE(HALO2LIST_ll), SAVE , POINTER :: TZHALO2_UT,TZHALO2_VT,TZHALO2_WT
+LOGICAL , SAVE :: GFIRST_CALL_ADVECUVW_RK = .TRUE.
 INTEGER                     :: INBVAR
 INTEGER :: IIU, IJU, IKU ! array sizes
 !JUAN
@@ -459,10 +460,16 @@ ZRWS(:, :, :, : ) = 0.
 !!$        CALL GET_HALO_D(ZVT,HNAME='ZVT')
 !!$        CALL GET_HALO_D(ZWT,HNAME='ZWT')
 !!$        CALL UPDATE_HALO2_ll(TZFIELDMT_ll, TZHALO2MT_ll, IINFO_ll)
+IF (GFIRST_CALL_ADVECUVW_RK) THEN
+   GFIRST_CALL_ADVECUVW_RK = .FALSE.
+   NULLIFY(TZHALO2_UT,TZHALO2_VT,TZHALO2_WT)
+   CALL INIT_HALO2_ll(TZHALO2_UT,1,IIU,IJU,IKU)
+   CALL INIT_HALO2_ll(TZHALO2_VT,1,IIU,IJU,IKU)
+   CALL INIT_HALO2_ll(TZHALO2_WT,1,IIU,IJU,IKU)
+END IF        
         CALL GET_HALO2_D(ZUT,TZHALO2_UT,HNAME='ZUT')
         CALL GET_HALO2_D(ZVT,TZHALO2_VT,HNAME='ZVT')
-        CALL GET_HALO2_D(ZWT,TZHALO2_WT,HNAME='ZWT')        
-        
+        CALL GET_HALO2_D(ZWT,TZHALO2_WT,HNAME='ZWT')               
 ! acc update device(ZUT,ZVT,ZWT)       
 #endif
         
@@ -554,9 +561,9 @@ CALL MNH_REL_ZT3D(IZMEAN,IZWORK)
 !
 CALL CLEANLIST_ll(TZFIELDMT_ll)
 CALL DEL_HALO2_ll(TZHALO2MT_ll)
-CALL DEL_HALO2_ll(TZHALO2_UT)
-CALL DEL_HALO2_ll(TZHALO2_VT)
-CALL DEL_HALO2_ll(TZHALO2_WT)
+!!$CALL DEL_HALO2_ll(TZHALO2_UT)
+!!$CALL DEL_HALO2_ll(TZHALO2_VT)
+!!$CALL DEL_HALO2_ll(TZHALO2_WT)
 !$acc update self(PRUS_ADV,PRVS_ADV,PRWS_ADV)
 !-------------------------------------------------------------------------------
 !
diff --git a/src/ZSOLVER/contrav.f90 b/src/ZSOLVER/contrav.f90
index ebef79590..b909f2298 100644
--- a/src/ZSOLVER/contrav.f90
+++ b/src/ZSOLVER/contrav.f90
@@ -567,7 +567,8 @@ LOGICAL                             :: GDATA_ON_DEVICE
 real                                :: ZTMP1, ZTMP2 ! Intermediate work variables
 REAL,   DIMENSION(:,:), POINTER , CONTIGUOUS :: ZU_EAST, ZV_NORTH, ZDZX_EAST, ZDZY_NORTH
 TYPE(LIST_ll),          POINTER     :: TZFIELD_U, TZFIELD_V, TZFIELD_DZX, TZFIELD_DZY
-TYPE(HALO2LIST_ll),     POINTER     :: TZHALO2_U, TZHALO2_V, TZHALO2_DZX, TZHALO2_DZY
+TYPE(HALO2LIST_ll), SAVE, POINTER  :: TZHALO2_U, TZHALO2_V, TZHALO2_DZX, TZHALO2_DZY
+LOGICAL , SAVE :: GFIRST_CALL_CONTRAV_DEVICE = .TRUE.
 !
 LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH
 !
@@ -634,14 +635,17 @@ IF (KADV_ORDER == 4 ) THEN
 !!$  NULLIFY(TZFIELD_DZY)
 !!$  CALL ADD3DFIELD_ll( TZFIELD_DZX, PDZX, 'CONTRAV::PDZX' )
 !!$  CALL ADD3DFIELD_ll( TZFIELD_DZY, PDZY, 'CONTRAV::PDZY' )
-!!$  NULLIFY(TZHALO2_U)
-!!$  NULLIFY(TZHALO2_V)
-!!$  NULLIFY(TZHALO2_DZX)
-!!$  NULLIFY(TZHALO2_DZY)
-!!$  CALL INIT_HALO2_ll(TZHALO2_U,1,IIU,IJU,IKU)
-!!$  CALL INIT_HALO2_ll(TZHALO2_V,1,IIU,IJU,IKU)
-!!$  CALL INIT_HALO2_ll(TZHALO2_DZX,1,IIU,IJU,IKU)
-!!$  CALL INIT_HALO2_ll(TZHALO2_DZY,1,IIU,IJU,IKU)
+    IF ( GFIRST_CALL_CONTRAV_DEVICE ) THEN
+       GFIRST_CALL_CONTRAV_DEVICE = .FALSE.
+       NULLIFY(TZHALO2_U)
+       NULLIFY(TZHALO2_V)
+       NULLIFY(TZHALO2_DZX)
+       NULLIFY(TZHALO2_DZY)
+       CALL INIT_HALO2_ll(TZHALO2_U,1,IIU,IJU,IKU)
+       CALL INIT_HALO2_ll(TZHALO2_V,1,IIU,IJU,IKU)
+       CALL INIT_HALO2_ll(TZHALO2_DZX,1,IIU,IJU,IKU)
+       CALL INIT_HALO2_ll(TZHALO2_DZY,1,IIU,IJU,IKU)
+    END IF
 !!$  CALL UPDATE_HALO2_ll(TZFIELD_U, TZHALO2_U, IINFO_ll)
 !!$  CALL UPDATE_HALO2_ll(TZFIELD_V, TZHALO2_V, IINFO_ll)
 !!$  CALL UPDATE_HALO2_ll(TZFIELD_DZX, TZHALO2_DZX, IINFO_ll)
@@ -874,10 +878,10 @@ IF (KADV_ORDER == 4 ) THEN
 !!$ !!$  IF (NHALO==1) THEN
 !!$    CALL CLEANLIST_ll(TZFIELD_DZX)
 !!$    CALL CLEANLIST_ll(TZFIELD_DZY)
-    CALL DEL_HALO2_ll(TZHALO2_U)
-    CALL DEL_HALO2_ll(TZHALO2_V)
-    CALL DEL_HALO2_ll(TZHALO2_DZX)
-    CALL DEL_HALO2_ll(TZHALO2_DZY)
+!!$    CALL DEL_HALO2_ll(TZHALO2_U)
+!!$    CALL DEL_HALO2_ll(TZHALO2_V)
+!!$    CALL DEL_HALO2_ll(TZHALO2_DZX)
+!!$    CALL DEL_HALO2_ll(TZHALO2_DZY)
 !!$ !!$  END IF
 END IF
 
diff --git a/src/ZSOLVER/get_halo.f90 b/src/ZSOLVER/get_halo.f90
index acd7833cf..201e1170b 100644
--- a/src/ZSOLVER/get_halo.f90
+++ b/src/ZSOLVER/get_halo.f90
@@ -1513,7 +1513,7 @@ end if
 CALL GET_HALO_DD(PSRC,HNAME=yname)
 
 !!$NULLIFY( TZ_PSRC_ll,TP_PSRC_HALO2_ll)
-CALL INIT_HALO2_ll(TP_PSRC_HALO2_ll,1,IIU,IJU,IKU)
+!!$CALL INIT_HALO2_ll(TP_PSRC_HALO2_ll,1,IIU,IJU,IKU)
 !
 CALL GET_HALO2_DD(PSRC,TP_PSRC_HALO2_ll,'GET_HALO2_DD::'//trim( yname ) )
 !
diff --git a/src/ZSOLVER/ppm.f90 b/src/ZSOLVER/ppm.f90
index 2e899596c..bfeac23c6 100644
--- a/src/ZSOLVER/ppm.f90
+++ b/src/ZSOLVER/ppm.f90
@@ -2557,8 +2557,8 @@ INTEGER                          :: I,J,K
 REAL, DIMENSION(:,:)             :: ZPSRC_HALO2_WEST
 #endif
 
-TYPE(HALO2LIST_ll), POINTER      :: TZ_PSRC_HALO2_ll         ! halo2 for PSRC
-
+TYPE(HALO2LIST_ll), SAVE , POINTER      :: TZ_PSRC_HALO2_ll         ! halo2 for PSRC
+LOGICAL, SAVE :: GFIRST_CALL_PPM_S0_X = .TRUE.
 !-------------------------------------------------------------------------------
 
 !$acc data present( PSRC, PCR, PRHO, PR , &
@@ -2593,6 +2593,11 @@ GEAST = LEAST_ll()
 !!$CALL GET_HALO2(PSRC, TZ_PSRC_HALO2_ll, HNAME='PSRC')
 !!$ZPSRC_HALO2_WEST(:,:) = TZ_PSRC_HALO2_ll%HALO2%WEST(:,:)
 !!$!$acc update device (ZPSRC_HALO2_WEST)
+IF (GFIRST_CALL_PPM_S0_X) THEN
+   GFIRST_CALL_PPM_S0_X = .FALSE.
+   NULLIFY(TZ_PSRC_HALO2_ll)
+   CALL INIT_HALO2_ll(TZ_PSRC_HALO2_ll,1,IIU,IJU,IKU)
+END IF
 CALL GET_HALO2_D(PSRC, TZ_PSRC_HALO2_ll, HNAME='PSRC')
 !$acc kernels
 ZPSRC_HALO2_WEST(:,:) = TZ_PSRC_HALO2_ll%HALO2%WEST(:,:)
@@ -2834,7 +2839,7 @@ CALL GET_HALO(PR, HNAME='PR')
 CALL GET_HALO_D(PR, HDIR="S0_X", HNAME='PR')
 #endif
 !-------------------------------------------------------------------------------
-CALL  DEL_HALO2_ll(TZ_PSRC_HALO2_ll)
+!!$CALL  DEL_HALO2_ll(TZ_PSRC_HALO2_ll)
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
@@ -2993,7 +2998,9 @@ REAL, DIMENSION(:,:,:) :: ZFPOS, ZFNEG
 ! variable at cell edges
 REAL, DIMENSION(:,:,:) :: ZPHAT
 !
-TYPE(HALO2LIST_ll), POINTER      :: TZ_PSRC_HALO2_ll         ! halo2 for PSRC
+TYPE(HALO2LIST_ll), SAVE ,POINTER      :: TZ_PSRC_HALO2_ll         ! halo2 for PSRC
+LOGICAL, SAVE :: GFIRST_CALL_PPM_S0_Y = .TRUE.
+
 TYPE(HALO2LIST_ll), POINTER      :: TZ_PHAT_HALO2_ll         ! halo2 for ZPHAT
 !
 REAL, DIMENSION(:,:,:) :: ZRHO_MYM , ZCR_MYM , ZCR_DYF
@@ -3045,6 +3052,11 @@ ELSE !not L2D
 !!$CALL GET_HALO2(PSRC, TZ_PSRC_HALO2_ll, HNAME='PSRC')
 !!$ZPSRC_HALO2_SOUTH(:,:) = TZ_PSRC_HALO2_ll%HALO2%SOUTH(:,:)
 !!$!$acc update device (ZPSRC_HALO2_SOUTH)
+IF (GFIRST_CALL_PPM_S0_Y) THEN
+   GFIRST_CALL_PPM_S0_Y = .FALSE.
+   NULLIFY(TZ_PSRC_HALO2_ll)
+   CALL INIT_HALO2_ll(TZ_PSRC_HALO2_ll,1,IIU,IJU,IKU)
+END IF   
 CALL GET_HALO2_D(PSRC, TZ_PSRC_HALO2_ll, HNAME='PSRC')  
 !
 ! Initialize with relalistic value all work array 
@@ -3281,7 +3293,7 @@ CALL GET_HALO(PR, HNAME='PR')
 CALL GET_HALO_D(PR, HDIR="S0_Y", HNAME='PR')
 #endif
 !
-CALL  DEL_HALO2_ll(TZ_PSRC_HALO2_ll)
+!!$CALL  DEL_HALO2_ll(TZ_PSRC_HALO2_ll)
 !
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
-- 
GitLab