diff --git a/src/MNH/rain_ice_fast_rg.f90 b/src/MNH/rain_ice_fast_rg.f90 index 3e64eeeede7e37c453ea38f3bbabca62a01bb3ce..9e8178e5191d615020bbe167cec523a3b4ee2340 100644 --- a/src/MNH/rain_ice_fast_rg.f90 +++ b/src/MNH/rain_ice_fast_rg.f90 @@ -101,6 +101,7 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for int REAL, DIMENSION(:), ALLOCATABLE :: ZVECLBDAG, ZVECLBDAR, ZVECLBDAS REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays ! +INTEGER :: JLU !------------------------------------------------------------------------------- ! ! IN variables @@ -159,6 +160,8 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(XKER_SDRYG,"RAIN_ICE_FAST_RG beg:XKER_RDRYG") END IF ! +JLU = size(PRHODREF) +! ALLOCATE( I1 (size(PRHODREF)) ) ALLOCATE( GWORK(size(PRHODREF)) ) ALLOCATE( ZZW (size(PRHODREF)) ) @@ -170,28 +173,36 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) ) !* 6.1 rain contact freezing ! !$acc kernels - GWORK(:) = PRIT(:)>XRTMIN(4) .AND. PRRT(:)>XRTMIN(3) .AND. PRIS(:)>0.0 .AND. PRRS(:)>0.0 - WHERE( GWORK(:) ) +GWORK(:) = PRIT(:)>XRTMIN(4) .AND. PRRT(:)>XRTMIN(3) .AND. PRIS(:)>0.0 .AND. PRRS(:)>0.0 #ifndef MNH_BITREP + WHERE( GWORK(:) ) ZZW1(:,3) = MIN( PRIS(:),XICFRR * PRIT(:) & ! RICFRRG * PLBDAR(:)**XEXICFRR & * PRHODREF(:)**(-XCEXVT) ) ZZW1(:,4) = MIN( PRRS(:),XRCFRI * PCIT(:) & ! RRCFRIG * PLBDAR(:)**XEXRCFRI & * PRHODREF(:)**(-XCEXVT-1.) ) -#else - ZZW1(:,3) = MIN( PRIS(:),XICFRR * PRIT(:) & ! RICFRRG - * BR_POW(PLBDAR(:),XEXICFRR) & - * BR_POW(PRHODREF(:),-XCEXVT) ) - ZZW1(:,4) = MIN( PRRS(:),XRCFRI * PCIT(:) & ! RRCFRIG - * BR_POW(PLBDAR(:),XEXRCFRI) & - * BR_POW(PRHODREF(:),-XCEXVT-1.) ) -#endif PRIS(:) = PRIS(:) - ZZW1(:,3) PRRS(:) = PRRS(:) - ZZW1(:,4) PRGS(:) = PRGS(:) + ZZW1(:,3)+ZZW1(:,4) PTHS(:) = PTHS(:) + ZZW1(:,4)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*RRCFRIG) - END WHERE + END WHERE +#else + DO CONCURRENT ( JL=1:JLU ) + IF ( GWORK(JL) ) THEN + ZZW1(JL,3) = MIN( PRIS(JL),XICFRR * PRIT(JL) & ! RICFRRG + * BR_POW(PLBDAR(JL),XEXICFRR) & + * BR_POW(PRHODREF(JL),-XCEXVT) ) + ZZW1(JL,4) = MIN( PRRS(JL),XRCFRI * PCIT(JL) & ! RRCFRIG + * BR_POW(PLBDAR(JL),XEXRCFRI) & + * BR_POW(PRHODREF(JL),-XCEXVT-1.) ) + PRIS(JL) = PRIS(JL) - ZZW1(JL,3) + PRRS(JL) = PRRS(JL) - ZZW1(JL,4) + PRGS(JL) = PRGS(JL) + ZZW1(JL,3)+ZZW1(JL,4) + PTHS(JL) = PTHS(JL) + ZZW1(JL,4)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*RRCFRIG) + END IF + END DO ! CONCURRENT +#endif !$acc end kernels IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PRRS,"RAIN_ICE_FAST_RG 6.1:PRRS") @@ -451,18 +462,12 @@ END IF ! PRWETG(:) = 0.0 GWORK(:) = PRGT(:)>XRTMIN(6) +#ifndef MNH_BITREP WHERE( GWORK(:) ) -#ifndef MNH_BITREP ZZW1(:,5) = MIN( PRIS(:), & ZZW1(:,2) / (XCOLIG*EXP(XCOLEXIG*(PZT(:)-XTT)) ) ) ! RIWETG ZZW1(:,6) = MIN( PRSS(:), & ZZW1(:,3) / (XCOLSG*EXP(XCOLEXSG*(PZT(:)-XTT)) ) ) ! RSWETG -#else - ZZW1(:,5) = MIN( PRIS(:), & - ZZW1(:,2) / (XCOLIG*BR_EXP(XCOLEXIG*(PZT(:)-XTT)) ) ) ! RIWETG - ZZW1(:,6) = MIN( PRSS(:), & - ZZW1(:,3) / (XCOLSG*BR_EXP(XCOLEXSG*(PZT(:)-XTT)) ) ) ! RSWETG -#endif ! ZZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure ZZW(:) = PKA(:)*(XTT-PZT(:)) + & @@ -472,17 +477,36 @@ END IF ! compute RWETG ! PRWETG(:)=MAX( 0.0, & -#ifndef MNH_BITREP ( ZZW(:) * ( X0DEPG* PLBDAG(:)**XEX0DEPG + & X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) + & -#else - ( ZZW(:) * ( X0DEPG* BR_POW(PLBDAG(:),XEX0DEPG) + & - X1DEPG*PCJ(:)*BR_POW(PLBDAG(:),XEX1DEPG) ) + & -#endif ( ZZW1(:,5)+ZZW1(:,6) ) * & ( PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PZT(:))) ) ) / & ( PRHODREF(:)*(XLMTT-XCL*(XTT-PZT(:))) ) ) - END WHERE + END WHERE +#else + DO CONCURRENT ( JL=1:JLU ) + IF ( GWORK(JL) ) THEN + ZZW1(JL,5) = MIN( PRIS(JL), & + ZZW1(JL,2) / (XCOLIG*BR_EXP(XCOLEXIG*(PZT(JL)-XTT)) ) ) ! RIWETG + ZZW1(JL,6) = MIN( PRSS(JL), & + ZZW1(JL,3) / (XCOLSG*BR_EXP(XCOLEXSG*(PZT(JL)-XTT)) ) ) ! RSWETG + ! + ZZW(JL) = PRVT(JL)*PPRES(JL)/((XMV/XMD)+PRVT(JL)) ! Vapor pressure + ZZW(JL) = PKA(JL)*(XTT-PZT(JL)) + & + ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PZT(JL) - XTT )) & + *(XESTT-ZZW(JL))/(XRV*PZT(JL)) ) + ! + ! compute RWETG + ! + PRWETG(JL)=MAX( 0.0, & + ( ZZW(JL) * ( X0DEPG* BR_POW(PLBDAG(JL),XEX0DEPG) + & + X1DEPG*PCJ(JL)*BR_POW(PLBDAG(JL),XEX1DEPG) ) + & + ( ZZW1(JL,5)+ZZW1(JL,6) ) * & + ( PRHODREF(JL)*(XLMTT+(XCI-XCL)*(XTT-PZT(JL))) ) ) / & + ( PRHODREF(JL)*(XLMTT-XCL*(XTT-PZT(JL))) ) ) + END IF + END DO ! CONCURRENT +#endif ! !* 6.4 Select Wet or Dry case ! @@ -610,7 +634,8 @@ END IF !* 6.5 Melting of the graupeln ! !$acc kernels - GWORK(:) = PRGT(:)>XRTMIN(6) .AND. PRGS(:)>0.0 .AND. PZT(:)>XTT + GWORK(:) = PRGT(:)>XRTMIN(6) .AND. PRGS(:)>0.0 .AND. PZT(:)>XTT +#ifndef MNH_BITREP WHERE( GWORK(:) ) ZZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure ZZW(:) = PKA(:)*(XTT-PZT(:)) + & @@ -620,20 +645,37 @@ END IF ! compute RGMLTR ! ZZW(:) = MIN( PRGS(:), MAX( 0.0,( -ZZW(:) * & -#ifndef MNH_BITREP ( X0DEPG* PLBDAG(:)**XEX0DEPG + & X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) - & -#else - ( X0DEPG* BR_POW(PLBDAG(:),XEX0DEPG) + & - X1DEPG*PCJ(:)*BR_POW(PLBDAG(:),XEX1DEPG) ) - & -#endif ( ZZW1(:,1)+ZZW1(:,4) ) * & ( PRHODREF(:)*XCL*(XTT-PZT(:))) ) / & ( PRHODREF(:)*XLMTT ) ) ) PRRS(:) = PRRS(:) + ZZW(:) PRGS(:) = PRGS(:) - ZZW(:) PTHS(:) = PTHS(:) - ZZW(:)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*(-RGMLTR)) - END WHERE + END WHERE +#else + DO CONCURRENT ( JL=1:JLU ) + IF ( GWORK(JL) ) THEN + ZZW(JL) = PRVT(JL)*PPRES(JL)/((XMV/XMD)+PRVT(JL)) ! Vapor pressure + ZZW(JL) = PKA(JL)*(XTT-PZT(JL)) + & + ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PZT(JL) - XTT )) & + *(XESTT-ZZW(JL))/(XRV*PZT(JL)) ) + ! + ! compute RGMLTR + ! + ZZW(JL) = MIN( PRGS(JL), MAX( 0.0,( -ZZW(JL) * & + ( X0DEPG* BR_POW(PLBDAG(JL),XEX0DEPG) + & + X1DEPG*PCJ(JL)*BR_POW(PLBDAG(JL),XEX1DEPG) ) - & + ( ZZW1(JL,1)+ZZW1(JL,4) ) * & + ( PRHODREF(JL)*XCL*(XTT-PZT(JL))) ) / & + ( PRHODREF(JL)*XLMTT ) ) ) + PRRS(JL) = PRRS(JL) + ZZW(JL) + PRGS(JL) = PRGS(JL) - ZZW(JL) + PTHS(JL) = PTHS(JL) - ZZW(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(-RGMLTR)) + END IF + END DO ! CONCURRENT +#endif !$acc end kernels IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PRRS,"RAIN_ICE_FAST_RG 6.5:PRRS")