diff --git a/src/ZSOLVER/advection_metsv.f90 b/src/ZSOLVER/advection_metsv.f90
index dda0df699923d6046a79e1fba1cdbf601409580d..5e92b2d128a879397a012190e3d2b174643d7834 100644
--- a/src/ZSOLVER/advection_metsv.f90
+++ b/src/ZSOLVER/advection_metsv.f90
@@ -526,7 +526,7 @@ END IF
 !PW: not necessary: data already on device due to contrav_device !$acc update device(ZRUCPPM,ZRVCPPM,ZRWCPPM)
 ! acc kernels
 IF (.NOT. L1D) THEN
-  !$acc kernels
+  !$acc kernels present(ZCFLU,ZCFLV,ZCFLW)
   ZCFLU(:,:,:) = 0.0 ; ZCFLV(:,:,:) = 0.0 ;  ZCFLW(:,:,:) = 0.0
   ZCFLU(IIB:IIE,IJB:IJE,:) = ABS(ZRUCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
   ZCFLV(IIB:IIE,IJB:IJE,:) = ABS(ZRVCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
@@ -556,7 +556,7 @@ IF (.NOT. L1D) THEN
   ENDIF
 #ifndef MNH_BITREP
   IF (.NOT. L2D) THEN
-     !$acc kernels 
+     !$acc kernels present(ZCFL) 
      ZCFL(:,:,:)  = SQRT(ZCFLU(:,:,:)**2+ZCFLV(:,:,:)**2+ZCFLW(:,:,:)**2)
      !$acc end kernels
   ELSE
diff --git a/src/ZSOLVER/advection_uvw.f90 b/src/ZSOLVER/advection_uvw.f90
index c19db842546ba29f45d14e350d1cb5a5f2037fbb..53dec7ae2de448870ad14fc0d8489e823d1b4270 100644
--- a/src/ZSOLVER/advection_uvw.f90
+++ b/src/ZSOLVER/advection_uvw.f90
@@ -355,7 +355,7 @@ CALL CONTRAV_DEVICE (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,Z
 !*       2.     COMPUTES THE TENDENCIES SINCE THE BEGINNING OF THE TIME STEP
 !	        ------------------------------------------------------------
 !
-!$acc kernels
+!$acc kernels present(ZRUS_OTHER,ZRVS_OTHER,ZRWS_OTHER)
 ZRUS_OTHER(:,:,:) = PRUS(:,:,:) - ZRUT(:,:,:) / PTSTEP + PRUS_PRES(:,:,:)
 ZRVS_OTHER(:,:,:) = PRVS(:,:,:) - ZRVT(:,:,:) / PTSTEP + PRVS_PRES(:,:,:)
 ZRWS_OTHER(:,:,:) = PRWS(:,:,:) - ZRWT(:,:,:) / PTSTEP + PRWS_PRES(:,:,:)
diff --git a/src/ZSOLVER/modeln.f90 b/src/ZSOLVER/modeln.f90
index 7b54c18bc608b9e83660a2def9ed05cab01c29f5..4415ac257114e300f5f0801cc77306d6b685f74a 100644
--- a/src/ZSOLVER/modeln.f90
+++ b/src/ZSOLVER/modeln.f90
@@ -1761,10 +1761,10 @@ END IF
 ZTIME1 = ZTIME2
 !
 !$acc update self( XRUS, XRVS, XRWS )
-!$acc kernels
-ZRUS=XRUS
-ZRVS=XRVS
-ZRWS=XRWS
+!$acc kernels present(ZRUS,ZRVS,ZRWS)
+ZRUS(:,:,:)=XRUS(:,:,:)
+ZRVS(:,:,:)=XRVS(:,:,:)
+ZRWS(:,:,:)=XRWS(:,:,:)
 !$acc end kernels
 !
 if ( .not. l1d ) then
@@ -1788,10 +1788,10 @@ CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX,             &
                 XCPHASE, XCPHASE_PBL, XRHODJ,            &
                 XTKET,XRUS, XRVS, XRWS                   )
 !$acc update device( XRUS, XRVS, XRWS )
-!$acc kernels
-ZRUS=XRUS-ZRUS
-ZRVS=XRVS-ZRVS
-ZRWS=XRWS-ZRWS
+!$acc kernels present(ZRUS,ZRVS,ZRWS)
+ZRUS(:,:,:)=XRUS(:,:,:)-ZRUS(:,:,:)
+ZRVS(:,:,:)=XRVS(:,:,:)-ZRVS(:,:,:)
+ZRWS(:,:,:)=XRWS(:,:,:)-ZRWS(:,:,:)
 !$acc end kernels
 !
 CALL SECOND_MNH2(ZTIME2)
@@ -1807,16 +1807,16 @@ ZTIME1 = ZTIME2
 XTIME_BU_PROCESS = 0.
 XTIME_LES_BU_PROCESS = 0.
 !
-!$acc kernels
+!$acc kernels present(ZPABST)
 ZPABST(:,:,:) = XPABST(:,:,:)
 !$acc end kernels
 !
 IF(.NOT. L1D) THEN
 !
-   !$acc kernels   
-   XRUS_PRES = XRUS
-   XRVS_PRES = XRVS
-   XRWS_PRES = XRWS
+   !$acc kernels ! present(XRUS_PRES,XRVS_PRES,XRWS_PRES)   
+   XRUS_PRES(:,:,:) = XRUS(:,:,:)
+   XRVS_PRES(:,:,:) = XRVS(:,:,:)
+   XRWS_PRES(:,:,:) = XRWS(:,:,:)
    !$acc end kernels  
    !
    CALL PRESSUREZ( CLBCX,CLBCY,CPRESOPT,NITR,LITRADJ,KTCOUNT, XRELAX,IMI, &
@@ -1832,10 +1832,10 @@ IF(.NOT. L1D) THEN
                   XA_K,XB_K,XC_K,XD_K) !JUAN FULL ZSOLVER
    !
    !$acc update host(XPABST)
-   !$acc kernels  
-   XRUS_PRES = XRUS - XRUS_PRES + ZRUS
-   XRVS_PRES = XRVS - XRVS_PRES + ZRVS
-   XRWS_PRES = XRWS - XRWS_PRES + ZRWS
+   !$acc kernels ! present(XRUS_PRES,XRVS_PRES,XRWS_PRES)  
+   XRUS_PRES(:,:,:) = XRUS(:,:,:) - XRUS_PRES(:,:,:) + ZRUS(:,:,:)
+   XRVS_PRES(:,:,:) = XRVS(:,:,:) - XRVS_PRES(:,:,:) + ZRVS(:,:,:)
+   XRWS_PRES(:,:,:) = XRWS(:,:,:) - XRWS_PRES(:,:,:) + ZRWS(:,:,:)
    !$acc end kernels
    !$acc update host(XRUS,XRVS,XRWS)
    CALL MPPDB_CHECK3DM("after pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS)
diff --git a/src/ZSOLVER/pressurez.f90 b/src/ZSOLVER/pressurez.f90
index 56428f4d87c554b6a35b6972801c87b13b030af7..83a84ad325077a890bad0784d623852072e1d5e9 100644
--- a/src/ZSOLVER/pressurez.f90
+++ b/src/ZSOLVER/pressurez.f90
@@ -849,8 +849,8 @@ IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN
   PRUS = PRUS - MXM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE
   PRWS = PRWS - MZM(PRHODJ * XCPD * ZTHETAV) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ)
 #else
-  !$acc kernels
-  ZPRHODJ = PRHODJ * XCPD * ZTHETAV
+  !$acc kernels present(ZPRHODJ)
+  ZPRHODJ(:,:,:) = PRHODJ(:,:,:) * XCPD * ZTHETAV(:,:,:)
   !$acc end kernels 
   CALL MXM_DEVICE(ZPRHODJ, ZMXM_PRHODJ)
   CALL MZM_DEVICE(ZPRHODJ, ZMZM_PRHODJ)
diff --git a/src/ZSOLVER/qlap.f90 b/src/ZSOLVER/qlap.f90
index 70b03324953397aaaa4acd0767e8d0f25fed0283..d80b1e31be9443abdf37567108d338c35ae6e5ba 100644
--- a/src/ZSOLVER/qlap.f90
+++ b/src/ZSOLVER/qlap.f90
@@ -577,11 +577,11 @@ ENDIF
 !
 IF ( CEQNSYS == 'DUR' .OR. CEQNSYS == 'MAE' ) THEN
    !$acc kernels
-   ZRHODJ = PRHODJ * XCPD * PTHETAV
+   ZRHODJ(:,:,:) = PRHODJ(:,:,:) * XCPD * PTHETAV(:,:,:)
    !$acc end kernels
    CALL MXM_DEVICE (ZRHODJ, ZMXM )
-   !$acc kernels
-   ZU = ZMXM *  ZU
+   !$acc kernels present(ZU)
+   ZU(:,:,:) = ZMXM(:,:,:) *  ZU(:,:,:)
    !$acc end kernels
   IF(.NOT. L2D) THEN 
      CALL MYM_DEVICE (ZRHODJ, ZMYM )
@@ -591,8 +591,8 @@ IF ( CEQNSYS == 'DUR' .OR. CEQNSYS == 'MAE' ) THEN
   END IF
   CALL MZM_DEVICE (ZRHODJ, ZMZM )
   CALL GZ_M_W_DEVICE(1,IKU,1,PY,PDZZ,ZGZMW)
-  !$acc kernels
-  ZW = ZMZM * ZGZMW
+  !$acc kernels present(ZW)
+  ZW(:,:,:) = ZMZM(:,:,:) * ZGZMW(:,:,:)
   !$acc end kernels
 ELSEIF ( CEQNSYS == 'LHE' ) THEN 
   ZU = MXM(PRHODJ) * ZU
diff --git a/src/ZSOLVER/sources_neg_correct.f90 b/src/ZSOLVER/sources_neg_correct.f90
index bda6bb2f03c26a550e94947b22e5088dbdb1d328..63a086cc658c6dae189c5f768717ead0782a3072 100644
--- a/src/ZSOLVER/sources_neg_correct.f90
+++ b/src/ZSOLVER/sources_neg_correct.f90
@@ -243,7 +243,7 @@ end if
 
 !$acc data present( zt, zexn, zlv, zcph, zls, zcor )
 
-!$acc kernels
+!$acc kernels present(zexn,zt,zlv)
 #ifndef MNH_BITREP
 zexn(:, :, :) = ( ppabst(:, :, :) / xp00 ) ** (xrd / xcpd )
 #else
@@ -253,7 +253,7 @@ zt  (:, :, :) = ptht(:, :, :) * zexn(:, :, :)
 zlv (:, :, :) = xlvtt + ( xcpv - xcl ) * ( zt(:, :, :) - xtt )
 !$acc end kernels
 if ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' ) then
-!$acc kernels
+!$acc kernels present(zls)
   zls(:, :, :) = xlstt + ( xcpv - xci ) * ( zt(:, :, :) - xtt )
 !$acc end kernels
 end if
diff --git a/src/ZSOLVER/tke_eps_sources.f90 b/src/ZSOLVER/tke_eps_sources.f90
index 78fd1bccec2c581ffee803d0d661fb873f95b5ff..cb75d7da41b619540ae1c5afbf27610ae675bbf9 100644
--- a/src/ZSOLVER/tke_eps_sources.f90
+++ b/src/ZSOLVER/tke_eps_sources.f90
@@ -418,7 +418,7 @@ ZA(:,:,:)     = - PTSTEP * XCET * &
 #else
 CALL MZM_DEVICE(ZKEFF, ZTMP1_DEVICE) !Warning: re-used later
 CALL MZM_DEVICE(PRHODJ,ZTMP2_DEVICE) !Warning: re-used later
-!$acc kernels
+!$acc kernels present(ZA)
 #ifndef MNH_BITREP
 ZA(:,:,:)     = - PTSTEP * XCET * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) / PDZZ(:,:,:)**2
 #else
diff --git a/src/ZSOLVER/tridiag_thermo.f90 b/src/ZSOLVER/tridiag_thermo.f90
index b7c9db58810dfd0b0674b2e65c0fdd10b7e7e18b..4a363e92f087dd6bc2919a3d9340ff8b1ca868f1 100644
--- a/src/ZSOLVER/tridiag_thermo.f90
+++ b/src/ZSOLVER/tridiag_thermo.f90
@@ -258,9 +258,9 @@ ZMZM_RHODJ = MZM(PRHODJ)
 #else
 CALL MZM_DEVICE(PRHODJ,ZMZM_RHODJ)
 #endif
-!$acc kernels ! async
+!$acc kernels present(ZRHODJ_DFDDTDZ_O_DZ2) ! async
 #ifndef MNH_BITREP
-ZRHODJ_DFDDTDZ_O_DZ2 = ZMZM_RHODJ*PDFDDTDZ/PDZZ**2
+ZRHODJ_DFDDTDZ_O_DZ2(:,:,:) = ZMZM_RHODJ(:,:,:)*PDFDDTDZ(:,:,:)/PDZZ(:,:,:)**2
 #else
 #ifdef MNH_COMPILER_NVHPC
 !$acc loop independent collapse(3)
diff --git a/src/ZSOLVER/turb.f90 b/src/ZSOLVER/turb.f90
index 9a7977551385ef6e1268dc72518730cff8b14574..d502da02bb871d583bc472f3797cca5d4a888602 100644
--- a/src/ZSOLVER/turb.f90
+++ b/src/ZSOLVER/turb.f90
@@ -708,7 +708,7 @@ GOCEAN = LOCEAN
 !
 !
 !$acc update device(PTHLT,PRT)
-!$acc kernels
+!$acc kernels present(ZCOEF_DISS)
 !Copy data into ZTHLM and ZRM only if needed
 IF (HTURBLEN=='BL89' .OR. HTURBLEN=='RM17' .OR. HTURBLEN == 'ADAP' .OR. ORMC01) THEN
   ZTHLM(:,:,:) = PTHLT(:,:,:)
@@ -767,7 +767,7 @@ IF (KRRL >=1) THEN
 !
 !*      2.4 Temperature at t
 !
-!$acc kernels
+!$acc kernels present(ZT)
   ZT(:,:,:) =  PTHLT(:,:,:) * ZEXN(:,:,:)
 !$acc end kernels
 !
@@ -787,10 +787,12 @@ IF (KRRL >=1) THEN
     CALL COMPUTE_FUNCTION_THERMO(XALPI,XBETAI,XGAMI,XLSTT,XCI,ZT,ZEXN,ZCP, &
                                  ZLSOCPEXNM,ZAMOIST_ICE,ZATHETA_ICE)
 !
-!$acc kernels 
-    WHERE(PRT(:,:,:,2)+PRT(:,:,:,4)>0.0)
-      ZFRAC_ICE(:,:,:) = PRT(:,:,:,4) / ( PRT(:,:,:,2)+PRT(:,:,:,4) )
-    END WHERE
+!$acc kernels present(PRT,ZFRAC_ICE,ZLOCPEXNM,ZAMOIST,ZATHETA)
+    DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       IF (PRT(JI,JJ,JK,2)+PRT(JI,JJ,JK,4)>0.0) THEN
+          ZFRAC_ICE(JI,JJ,JK) = PRT(JI,JJ,JK,4) / ( PRT(JI,JJ,JK,2)+PRT(JI,JJ,JK,4) )
+       END IF
+    END DO
 !
     ZLOCPEXNM(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZLVOCPEXNM(:,:,:) &
                            +ZFRAC_ICE(:,:,:) *ZLSOCPEXNM(:,:,:)
@@ -1044,7 +1046,7 @@ ENDIF
 !
 !*      4.2 compute the proportionality coefficient between wind and stress
 !
-!$acc kernels
+!$acc kernels present(ZCDUEFF,ZTAU22M,ZTAU33M)
 #ifndef MNH_BITREP
   ZCDUEFF(:,:) =-SQRT ( (PSFU(:,:)**2 + PSFV(:,:)**2) /                  &
                         (XMNH_TINY + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) )
@@ -1061,7 +1063,7 @@ ENDIF
 !
 !*       4.6 compute the surface tangential fluxes
 !
-!$acc kernels
+!$acc kernels present(ZTAU22M,ZTAU33M)
 ZTAU11M(:,:) =2./3.*(  (1.+ (PZZ (:,:,IKB+KKL)-PZZ (:,:,IKB))  &
                            /(PDZZ(:,:,IKB+KKL)+PDZZ(:,:,IKB))  &
                        )   *PTKET(:,:,IKB)                   &
@@ -1833,7 +1835,7 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) )
 !
 !*       1.1 Lv/Cph at  t
 !
-!$acc kernels
+!$acc kernels present(PLOCPEXN,ZDRVSATDT)
   PLOCPEXN(:,:,:) = ( PLTT + (XCPV-PC) *  (PT(:,:,:)-XTT) ) / PCP(:,:,:)
 !
 !*      1.2 Saturation vapor pressure at t
@@ -2539,7 +2541,7 @@ CALL ETHETA(KRR,KRRI,PTHLT,PRT,PLOCPEXNM,PATHETA,PSRCT,ZETHETA)
 CALL EMOIST(KRR,KRRI,PTHLT,PRT,PLOCPEXNM,PAMOIST,PSRCT,ZEMOIST)
 #endif
 !
-!$acc kernels
+!$acc kernels present(ZWORK2D,PLM)
 IF (KRR>0) THEN
 #ifdef MNH_COMPILER_NVHPC
    !$acc loop independent collapse(3) private(ZVAR)
@@ -2632,10 +2634,12 @@ ELSE
   END DO
 #endif
 END IF
-WHERE(ZWORK2D(:,:)>0.)
-  PLM(:,:,KKB)=MAX(XMNH_EPSILON,MIN( PLM(:,:,KKB),                 &
-                    0.76* SQRT(PTKET(:,:,KKB)/ZWORK2D(:,:))))
-END WHERE
+DO CONCURRENT(JI=1:JIU,JJ=1:JJU)
+   IF (ZWORK2D(JI,JJ)>0.) THEN
+      PLM(JI,JJ,KKB)=MAX(XMNH_EPSILON,MIN( PLM(JI,JJ,KKB),                 &
+           0.76* SQRT(PTKET(JI,JJ,KKB)/ZWORK2D(JI,JJ))))
+   END IF
+END DO
 !
 !  mixing length limited by the distance normal to the surface (with the same factor as for BL89)
 !
diff --git a/src/ZSOLVER/turb_hor_dyn_corr.f90 b/src/ZSOLVER/turb_hor_dyn_corr.f90
index e255ed69a0f50e3161eeffc4fe0a296b2e8fe0a5..957186b8a50213a438bc64f17bf78a096510b00d 100644
--- a/src/ZSOLVER/turb_hor_dyn_corr.f90
+++ b/src/ZSOLVER/turb_hor_dyn_corr.f90
@@ -580,7 +580,7 @@ ZDV_DY(:,:,:)=  DYF(PVM(:,:,IKB:IKB)) / MYF(PDYY(:,:,IKB:IKB)) &
 #else
 CALL MYF_DEVICE(ZTMP3_DEVICE(:,:,1:1), ZTMP4_DEVICE(:,:,1:1))
 CALL MYF_DEVICE(PDYY(:,:,IKB:IKB), ZTMP3_DEVICE(:,:,1:1))
-!$acc kernels async(4)
+!$acc kernels present(ZDV_DZ_DZS_DY) async(4)
 ZDV_DZ_DZS_DY(:,:,1)= ZTMP4_DEVICE(:,:,1) / ZTMP3_DEVICE(:,:,1)
 !$acc end kernels
 !
@@ -659,7 +659,7 @@ ENDDO
 !!! wait for the computation of ZDIRSINZW
 !$acc wait(1)
 !
-!$acc kernels async(4)
+!$acc kernels present(ZFLX) async(4)
 #ifndef MNH_BITREP
 ZFLX(:,:,IKB-1) =                                                            &
         PTAU11M(:,:) * PCOSSLOPE(:,:)**2 * PDIRCOSZW(:,:)**2                 &
@@ -919,7 +919,7 @@ ENDDO
 !!   (-2./3.) * PTP(:,:,IKB:IKB)
 !
 ! extrapolates this flux under the ground with the surface flux
-!$acc kernels async(3)
+!$acc kernels present(ZFLX) async(3)
 #ifndef MNH_BITREP
 ZFLX(:,:,IKB-1) =                                                            &
         PTAU11M(:,:) * PSINSLOPE(:,:)**2 * PDIRCOSZW(:,:)**2                 &         
@@ -1181,7 +1181,7 @@ ENDDO
 !   - 2.* XCMFB * PLM(:,:,IKB:IKB) /SQRT(PTKEM(:,:,IKB:IKB)) *             &
 !  (-2./3.) * PTP(:,:,IKB:IKB)
 ! extrapolates this flux under the ground with the surface flux
-!$acc kernels async(3)
+!$acc kernels present(ZFLX) async(3)
 #ifndef MNH_BITREP
 ZFLX(:,:,IKB-1) = &    
         PTAU11M(:,:) * ZDIRSINZW(:,:)**2                                &
diff --git a/src/ZSOLVER/turb_hor_thermo_flux.f90 b/src/ZSOLVER/turb_hor_thermo_flux.f90
index 71cf7793cb4f1fd5680be282b4c949da68a84ca3..70ed2eb4822bee7ca41841c48dad929268ce9b83 100644
--- a/src/ZSOLVER/turb_hor_thermo_flux.f90
+++ b/src/ZSOLVER/turb_hor_thermo_flux.f90
@@ -355,13 +355,13 @@ ZFLX(:,:,IKB:IKB) = -XCSHF * MXM( PK(:,:,IKB:IKB) ) *          &
 #else
 CALL MXM_DEVICE( PK(:,:,IKB:IKB), ZTMP1_DEVICE(:,:,1:1) )
 CALL DXM_DEVICE( PTHLM(:,:,IKB:IKB), ZTMP2_DEVICE(:,:,1:1) )
-!$acc kernels
+!$acc kernels present(ZTMP3_DEVICE)
 ZTMP3_DEVICE(:,:,1) = ZCOEFF(:,:,IKB+2)*PTHLM(:,:,IKB+2)        &
          +ZCOEFF(:,:,IKB+1)*PTHLM(:,:,IKB+1)       &
          +ZCOEFF(:,:,IKB  )*PTHLM(:,:,IKB  )
 !$acc end kernels
 CALL MXM_DEVICE( ZTMP3_DEVICE(:,:,1:1), ZTMP4_DEVICE(:,:,1:1)) 
-!$acc kernels
+!$acc kernels present(ZFLX)
 ZFLX(:,:,IKB) = -XCSHF * ZTMP1_DEVICE(:,:,1) *          &
   ( ZTMP2_DEVICE(:,:,1) * PINV_PDXX(:,:,IKB) - ZTMP4_DEVICE(:,:,1)      &
         *0.5* ( PDZX(:,:,IKB+1)+PDZX(:,:,IKB))       &
@@ -381,7 +381,7 @@ DO CONCURRENT ( JI=1:JIU,JJ=1:JJU )
 END DO
 !$acc end kernels
   CALL MXM_DEVICE( ZTMP1_DEVICE(:,:,1:1), ZTMP2_DEVICE(:,:,1:1) )
-!$acc kernels
+!$acc kernels present(ZFLX)
   ZFLX(:,:,IKB-1) = 2. * ZTMP2_DEVICE(:,:,1) - ZFLX(:,:,IKB)
 !$acc end kernels
 #endif
@@ -501,7 +501,7 @@ IF ( KRRL >= 1 ) THEN
     !$acc end kernels
     CALL MZM_DEVICE( ZTMP1_DEVICE, ZTMP4_DEVICE )
     CALL MXM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
-    !$acc kernels
+    !$acc kernels present(ZTMP1_DEVICE)
     ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:) *ZFLX(:,:,:)
     !$acc end kernels
     CALL MXF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE)
@@ -509,15 +509,15 @@ IF ( KRRL >= 1 ) THEN
     ZTMP1_DEVICE(:,:,:) = ZFLX(:,:,:)*PINV_PDXX(:,:,:)
     !$acc end kernels
     CALL MZM_DEVICE( ZTMP1_DEVICE, ZTMP5_DEVICE )
-    !$acc kernels
+    !$acc kernels present(ZTMP6_DEVICE)
     ZTMP6_DEVICE(:,:,:) = PDZX(:,:,:)*ZTMP5_DEVICE(:,:,:)
     !$acc end kernels
     CALL MXF_DEVICE( ZTMP6_DEVICE, ZTMP5_DEVICE )
-    !$acc kernels
+    !$acc kernels present(ZTMP6_DEVICE)
     ZTMP6_DEVICE(:,:,:) =  ZTMP4_DEVICE(:,:,:)*ZTMP5_DEVICE(:,:,:)
     !$acc end kernels
     CALL MZF_DEVICE( ZTMP6_DEVICE, ZTMP7_DEVICE )
-    !$acc kernels
+    !$acc kernels present(ZFLXC)
     ZFLXC(:,:,:) = 2.*( ZTMP2_DEVICE(:,:,:) +ZTMP7_DEVICE(:,:,:) )
     !$acc end kernels
     IF ( KRRI >= 1 ) THEN
@@ -525,11 +525,11 @@ IF ( KRRL >= 1 ) THEN
       ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:)
       !$acc end kernels
       CALL MXM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) 
-      !$acc kernels
+      !$acc kernels present(ZTMP6_DEVICE)
       ZTMP6_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)*PINV_PDXX(:,:,:)
       !$acc end kernels
       CALL DXF_DEVICE( ZTMP6_DEVICE, ZTMP2_DEVICE)
-      !$acc kernels
+      !$acc kernels present(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP4_DEVICE(:,:,:)*ZTMP5_DEVICE(:,:,:)*PINV_PDZZ(:,:,:)
       !$acc end kernels
       CALL DZF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
@@ -788,13 +788,13 @@ END DO
 ! gradient
   CALL MXM_DEVICE( PK(:,:,IKB:IKB), ZTMP1_DEVICE(:,:,1:1) )
   CALL DXM_DEVICE(PRM(:,:,IKB:IKB,1), ZTMP2_DEVICE(:,:,1:1))
-!$acc kernels
+!$acc kernels present(ZTMP3_DEVICE)
   ZTMP3_DEVICE(:,:,1) = ZCOEFF(:,:,IKB+2)*PRM(:,:,IKB+2,1) &
                     +ZCOEFF(:,:,IKB+1)*PRM(:,:,IKB+1,1) &
                     +ZCOEFF(:,:,IKB  )*PRM(:,:,IKB  ,1)
 !$acc end kernels
   CALL MXM_DEVICE(ZTMP3_DEVICE(:,:,1:1),ZTMP4_DEVICE(:,:,1:1))
-!$acc kernels
+!$acc kernels present(ZFLX)
   ZFLX(:,:,IKB) = -XCHF * ZTMP1_DEVICE(:,:,1) *              &
                   ( ZTMP2_DEVICE(:,:,1) * PINV_PDXX(:,:,IKB) &
                   -ZTMP4_DEVICE(:,:,1)                       &
@@ -806,7 +806,7 @@ END DO
   ZTMP1_DEVICE(:,:,1) =  PSFRM(:,:)* PDIRCOSXW(:,:)
 !$acc end kernels
   CALL MXM_DEVICE(ZTMP1_DEVICE(:,:,1:1),ZTMP2_DEVICE(:,:,1:1))
-  !$acc kernels
+  !$acc kernels present(ZFLX)
   ZFLX(:,:,IKB-1) = 2. * ZTMP2_DEVICE(:,:,1) - ZFLX(:,:,IKB)
   !$acc end kernels
 
@@ -873,33 +873,33 @@ END DO
   ! Compute the equivalent tendancy for Rc and Ri
   !
   IF ( KRRL >= 1 ) THEN
-    !$acc kernels
+    !$acc kernels present(ZTMP2_DEVICE)
     ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PAMOIST(:,:,:)*PSRCM(:,:,:)
     ZTMP2_DEVICE(:,:,:) = ZFLX(:,:,:)*PINV_PDXX(:,:,:)
     !$acc end kernels
     CALL MXM_DEVICE( ZTMP1_DEVICE, ZTMP8_DEVICE )
     IF (.NOT. LFLAT) THEN
-      !$acc kernels
+      !$acc kernels present(ZTMP4_DEVICE)
       ZTMP4_DEVICE(:,:,:) = ZTMP8_DEVICE(:,:,:) * ZFLX(:,:,:)
       !$acc end kernels
       CALL MXF_DEVICE( ZTMP4_DEVICE, ZTMP3_DEVICE )
       CALL MZM_DEVICE( ZTMP1_DEVICE, ZTMP4_DEVICE )
       CALL MZM_DEVICE( ZTMP2_DEVICE, ZTMP5_DEVICE )
-      !$acc kernels
+      !$acc kernels present(ZTMP6_DEVICE)
       ZTMP6_DEVICE(:,:,:) = PDZX(:,:,:)*ZTMP5_DEVICE(:,:,:)
       !$acc end kernels
       CALL MXF_DEVICE( ZTMP6_DEVICE, ZTMP5_DEVICE )
-      !$acc kernels
+      !$acc kernels present(ZTMP6_DEVICE)
       ZTMP6_DEVICE(:,:,:) = ZTMP4_DEVICE(:,:,:)*ZTMP5_DEVICE(:,:,:)
       !$acc end kernels
       CALL MZF_DEVICE( ZTMP6_DEVICE, ZTMP7_DEVICE )
-      !$acc kernels
+      !$acc kernels present(ZFLXC,ZTMP6_DEVICE)
       ZFLXC(:,:,:) = ZFLXC(:,:,:) + 2.*( ZTMP3_DEVICE(:,:,:) + ZTMP7_DEVICE(:,:,:) )
       !
       ZTMP6_DEVICE(:,:,:) = ZTMP4_DEVICE(:,:,:)*ZTMP5_DEVICE(:,:,:)*PINV_PDZZ(:,:,:)
       !$acc end kernels
       CALL DZF_DEVICE( ZTMP6_DEVICE, ZTMP3_DEVICE )
-      !$acc kernels
+      !$acc kernels present(ZTMP4_DEVICE)
       ZTMP4_DEVICE(:,:,:) = ZTMP8_DEVICE(:,:,:) * ZFLX(:,:,:)*PINV_PDXX(:,:,:)
       !$acc end kernels
       CALL DXF_DEVICE(ZTMP4_DEVICE, ZTMP5_DEVICE)
@@ -1181,13 +1181,13 @@ END IF
 ! gradient
 CALL MYM_DEVICE( PK(:,:,IKB:IKB), ZTMP1_DEVICE(:,:,1:1) )
 CALL DYM_DEVICE(PTHLM(:,:,IKB:IKB), ZTMP2_DEVICE(:,:,1:1) )
-!$acc kernels
+!$acc kernels present(ZTMP3_DEVICE)
 ZTMP3_DEVICE(:,:,1) = ZCOEFF(:,:,IKB+2)*PTHLM(:,:,IKB+2) &
                   +ZCOEFF(:,:,IKB+1)*PTHLM(:,:,IKB+1) &
                   +ZCOEFF(:,:,IKB  )*PTHLM(:,:,IKB  )
 !$acc end kernels
 CALL MYM_DEVICE( ZTMP3_DEVICE(:,:,1:1), ZTMP4_DEVICE(:,:,1:1) ) 
-!$acc kernels
+!$acc kernels present(ZFLX)
 ZFLX(:,:,IKB) = -XCSHF * ZTMP1_DEVICE(:,:,1) *             &
                 ( ZTMP2_DEVICE(:,:,1) * PINV_PDYY(:,:,IKB) &
                 - ZTMP4_DEVICE(:,:,1)                      &
@@ -1201,7 +1201,7 @@ ZFLX(:,:,IKB) = -XCSHF * ZTMP1_DEVICE(:,:,1) *             &
 ZTMP1_DEVICE(:,:,1) = PSFTHM(:,:)* PDIRCOSYW(:,:)
 !$acc end kernels
 CALL MYM_DEVICE( ZTMP1_DEVICE(:,:,1:1), ZTMP2_DEVICE(:,:,1:1) )
-!$acc kernels
+!$acc kernels present(ZFLX)
 ZFLX(:,:,IKB-1) = 2. * ZTMP2_DEVICE(:,:,1) - ZFLX(:,:,IKB)
 !$acc end kernels
 !
@@ -1275,32 +1275,32 @@ IF ( KRRL >= 1 .AND. .NOT. L2D) THEN
     ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:)
     !$acc end kernels
     CALL MYM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
-    !$acc kernels
+    !$acc kernels present(ZTMP4_DEVICE)
     ZTMP4_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)
     !$acc end kernels
     CALL MYF_DEVICE( ZTMP4_DEVICE, ZTMP3_DEVICE )
-    !$acc kernels
+    !$acc kernels present(ZTMP4_DEVICE)
     ZTMP4_DEVICE(:,:,:) = ZFLX(:,:,:)*PINV_PDYY(:,:,:)
     !$acc end kernels
     CALL MZM_DEVICE( ZTMP4_DEVICE, ZTMP5_DEVICE )
-    !$acc kernels
+    !$acc kernels present(ZTMP4_DEVICE)
     ZTMP4_DEVICE(:,:,:) = PDZY(:,:,:)*ZTMP5_DEVICE(:,:,:)
     !$acc end kernels
     CALL MYF_DEVICE( ZTMP4_DEVICE, ZTMP5_DEVICE)
     CALL MZM_DEVICE( ZTMP1_DEVICE, ZTMP4_DEVICE )
-    !$acc kernels
+    !$acc kernels present(ZTMP6_DEVICE)
     ZTMP6_DEVICE(:,:,:) = ZTMP4_DEVICE(:,:,:)*ZTMP5_DEVICE(:,:,:)
     !$acc end kernels
     CALL MZF_DEVICE( ZTMP6_DEVICE, ZTMP4_DEVICE )
-    !$acc kernels
+    !$acc kernels present(ZFLXC)
     ZFLXC(:,:,:) = 2.*( ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) )
     !$acc end kernels
     IF ( KRRI >= 1 ) THEN
-      !$acc kernels
+      !$acc kernels present(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)*PINV_PDYY(:,:,:)
       !$acc end kernels
       CALL DYF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
-      !$acc kernels
+      !$acc kernels present(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP6_DEVICE(:,:,:)*PINV_PDZZ(:,:,:)
       !$acc end kernels
       CALL DZF_DEVICE( ZTMP3_DEVICE, ZTMP5_DEVICE )
@@ -1559,13 +1559,13 @@ IF (KRR/=0) THEN
 ! gradient
   CALL MYM_DEVICE( PK(:,:,IKB:IKB), ZTMP1_DEVICE(:,:,1:1) )
   CALL DYM_DEVICE(PRM(:,:,IKB:IKB,1), ZTMP2_DEVICE(:,:,1:1))
-  !$acc kernels
+  !$acc kernels present(ZTMP3_DEVICE)
   ZTMP3_DEVICE(:,:,1) = ZCOEFF(:,:,IKB+2)*PRM(:,:,IKB+2,1) &
                     +ZCOEFF(:,:,IKB+1)*PRM(:,:,IKB+1,1) &
                     +ZCOEFF(:,:,IKB  )*PRM(:,:,IKB  ,1)
   !$acc end kernels
   CALL MYM_DEVICE( ZTMP3_DEVICE(:,:,1:1), ZTMP4_DEVICE(:,:,1:1) )
-  !$acc kernels
+  !$acc kernels present(ZFLX)
   ZFLX(:,:,IKB) = -XCHF * ZTMP1_DEVICE(:,:,1) *             &
                  ( ZTMP2_DEVICE(:,:,1) * PINV_PDYY(:,:,IKB) &
                  - ZTMP4_DEVICE(:,:,1)                      &
@@ -1579,7 +1579,7 @@ IF (KRR/=0) THEN
   ZTMP1_DEVICE(:,:,1) = PSFRM(:,:)* PDIRCOSYW(:,:)
   !$acc end kernels
   CALL MYM_DEVICE( ZTMP1_DEVICE(:,:,1:1), ZTMP2_DEVICE(:,:,1:1) )
-  !$acc kernels
+  !$acc kernels present(ZFLX)
   ZFLX(:,:,IKB-1) = 2. * ZTMP2_DEVICE(:,:,1) - ZFLX(:,:,IKB)
   !$acc end kernels
   !
@@ -1654,32 +1654,32 @@ IF (KRR/=0) THEN
       ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PAMOIST(:,:,:)*PSRCM(:,:,:)
       !$acc end kernels
       CALL MYM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
-      !$acc kernels
+      !$acc kernels present(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)
       !$acc end kernels
       CALL MXF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
       CALL MZM_DEVICE( ZTMP1_DEVICE, ZTMP5_DEVICE )
-      !$acc kernels
+      !$acc kernels present(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = ZFLX(:,:,:)*PINV_PDYY(:,:,:)
       !$acc end kernels
       CALL MZM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
-      !$acc kernels
+      !$acc kernels present(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = PDZY(:,:,:)*ZTMP2_DEVICE(:,:,:)
       !$acc end kernels
       CALL MYF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
-      !$acc kernels
+      !$acc kernels present(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = ZTMP5_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
       !$acc end kernels
       CALL MZF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
-      !$acc kernels
+      !$acc kernels present(ZFLXC)
       ZFLXC(:,:,:) = ZFLXC(:,:,:) + 2.*( ZTMP4_DEVICE(:,:,:) + ZTMP2_DEVICE(:,:,:) )
       !$acc end kernels
       IF ( KRRI >= 1 ) THEN
-        !$acc kernels
+        !$acc kernels present(ZTMP2_DEVICE)
         ZTMP2_DEVICE(:,:,:) = ZTMP3_DEVICE(:,:,:) * PINV_PDYY(:,:,:)
         !$acc end kernels
         CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
-        !$acc kernels
+        !$acc kernels present(ZTMP2_DEVICE)
         ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)* PINV_PDZZ(:,:,:)
         !$acc end kernels
         CALL DZF_DEVICE( ZTMP2_DEVICE, ZTMP4_DEVICE )
diff --git a/src/ZSOLVER/zsolver.f90 b/src/ZSOLVER/zsolver.f90
index a505d79dbf81685bf160e77777d34a2ef9193ec3..1f8db88a2ba9a14d642734061363559a30eb8bd4 100644
--- a/src/ZSOLVER/zsolver.f90
+++ b/src/ZSOLVER/zsolver.f90
@@ -339,9 +339,9 @@ DO JM = 1,KITR
 !
 !*       2.7     update p and DELTA
 !
-  !$acc kernels
-  ZP     = ZQ   + ZALPHA * ZP
-  ZDELTA = ZKSI + ZALPHA * ZDELTA
+  !$acc kernels present(ZP,ZDELTA)
+  ZP(:,:,:)     = ZQ(:,:,:)   + ZALPHA * ZP(:,:,:)
+  ZDELTA(:,:,:) = ZKSI(:,:,:) + ZALPHA * ZDELTA(:,:,:)
   !$acc end kernels
 !
 END DO              ! end of the loop for the iterative solver