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