Skip to content
Snippets Groups Projects
rain_ice_red.f90 143 KiB
Newer Older
  • Learn to ignore specific revisions
  • CALL MNH_MEM_GET( ZHLI_LCF , imicro )
    CALL MNH_MEM_GET( ZHLI_HRI , imicro )
    CALL MNH_MEM_GET( ZHLI_LRI , imicro )
    
    CALL MNH_MEM_GET( zrvheni_mr , imicro )
    CALL MNH_MEM_GET( zrchoni    , imicro )
    CALL MNH_MEM_GET( zrrhong_mr , imicro )
    CALL MNH_MEM_GET( zrvdeps    , imicro )
    CALL MNH_MEM_GET( zriaggs    , imicro )
    CALL MNH_MEM_GET( zriauts    , imicro )
    CALL MNH_MEM_GET( zrvdepg    , imicro )
    CALL MNH_MEM_GET( zrcautr    , imicro )
    CALL MNH_MEM_GET( zrcaccr    , imicro )
    CALL MNH_MEM_GET( zrrevav    , imicro )
    CALL MNH_MEM_GET( zrimltc_mr , imicro )
    CALL MNH_MEM_GET( zrcberi    , imicro )
    CALL MNH_MEM_GET( zrhmltr    , imicro )
    CALL MNH_MEM_GET( zrsmltg    , imicro )
    CALL MNH_MEM_GET( zrcmltsr   , imicro )
    CALL MNH_MEM_GET( zrraccss   , imicro )
    CALL MNH_MEM_GET( zrraccsg   , imicro )
    CALL MNH_MEM_GET( zrsaccrg   , imicro )
    CALL MNH_MEM_GET( zrcrimss   , imicro )
    CALL MNH_MEM_GET( zrcrimsg   , imicro )
    CALL MNH_MEM_GET( zrsrimcg   , imicro )
    CALL MNH_MEM_GET( zrsrimcg_mr, imicro )
    CALL MNH_MEM_GET( zricfrrg   , imicro )
    CALL MNH_MEM_GET( zrrcfrig   , imicro )
    CALL MNH_MEM_GET( zricfrr    , imicro )
    CALL MNH_MEM_GET( zrcwetg    , imicro )
    CALL MNH_MEM_GET( zriwetg    , imicro )
    CALL MNH_MEM_GET( zrrwetg    , imicro )
    CALL MNH_MEM_GET( zrswetg    , imicro )
    CALL MNH_MEM_GET( zrcdryg    , imicro )
    CALL MNH_MEM_GET( zridryg    , imicro )
    CALL MNH_MEM_GET( zrrdryg    , imicro )
    CALL MNH_MEM_GET( zrsdryg    , imicro )
    CALL MNH_MEM_GET( zrwetgh    , imicro )
    CALL MNH_MEM_GET( zrwetgh_mr , imicro )
    CALL MNH_MEM_GET( zrgmltr    , imicro )
    CALL MNH_MEM_GET( zrcweth    , imicro )
    CALL MNH_MEM_GET( zriweth    , imicro )
    CALL MNH_MEM_GET( zrsweth    , imicro )
    CALL MNH_MEM_GET( zrgweth    , imicro )
    CALL MNH_MEM_GET( zrrweth    , imicro )
    CALL MNH_MEM_GET( zrcdryh    , imicro )
    CALL MNH_MEM_GET( zridryh    , imicro )
    CALL MNH_MEM_GET( zrsdryh    , imicro )
    CALL MNH_MEM_GET( zrrdryh    , imicro )
    CALL MNH_MEM_GET( zrgdryh    , imicro )
    CALL MNH_MEM_GET( zrdryhg    , imicro )
    
    CALL MNH_MEM_GET( ztot_rvheni , imicro )
    CALL MNH_MEM_GET( ztot_rchoni , imicro )
    CALL MNH_MEM_GET( ztot_rrhong , imicro )
    CALL MNH_MEM_GET( ztot_rvdeps , imicro )
    CALL MNH_MEM_GET( ztot_riaggs , imicro )
    CALL MNH_MEM_GET( ztot_riauts , imicro )
    CALL MNH_MEM_GET( ztot_rvdepg , imicro )
    CALL MNH_MEM_GET( ztot_rcautr , imicro )
    CALL MNH_MEM_GET( ztot_rcaccr , imicro )
    CALL MNH_MEM_GET( ztot_rrevav , imicro )
    CALL MNH_MEM_GET( ztot_rcrimss, imicro )
    CALL MNH_MEM_GET( ztot_rcrimsg, imicro )
    CALL MNH_MEM_GET( ztot_rsrimcg, imicro )
    CALL MNH_MEM_GET( ztot_rimltc , imicro )
    CALL MNH_MEM_GET( ztot_rcberi , imicro )
    CALL MNH_MEM_GET( ztot_rhmltr , imicro )
    CALL MNH_MEM_GET( ztot_rsmltg , imicro )
    CALL MNH_MEM_GET( ztot_rcmltsr, imicro )
    CALL MNH_MEM_GET( ztot_rraccss, imicro )
    CALL MNH_MEM_GET( ztot_rraccsg, imicro )
    CALL MNH_MEM_GET( ztot_rsaccrg, imicro )
    CALL MNH_MEM_GET( ztot_ricfrrg, imicro )
    CALL MNH_MEM_GET( ztot_rrcfrig, imicro )
    CALL MNH_MEM_GET( ztot_ricfrr , imicro )
    CALL MNH_MEM_GET( ztot_rcwetg , imicro )
    CALL MNH_MEM_GET( ztot_riwetg , imicro )
    CALL MNH_MEM_GET( ztot_rrwetg , imicro )
    CALL MNH_MEM_GET( ztot_rswetg , imicro )
    CALL MNH_MEM_GET( ztot_rcdryg , imicro )
    CALL MNH_MEM_GET( ztot_ridryg , imicro )
    CALL MNH_MEM_GET( ztot_rrdryg , imicro )
    CALL MNH_MEM_GET( ztot_rsdryg , imicro )
    CALL MNH_MEM_GET( ztot_rwetgh , imicro )
    CALL MNH_MEM_GET( ztot_rgmltr , imicro )
    CALL MNH_MEM_GET( ztot_rcweth , imicro )
    CALL MNH_MEM_GET( ztot_riweth , imicro )
    CALL MNH_MEM_GET( ztot_rsweth , imicro )
    CALL MNH_MEM_GET( ztot_rgweth , imicro )
    CALL MNH_MEM_GET( ztot_rrweth , imicro )
    CALL MNH_MEM_GET( ztot_rcdryh , imicro )
    CALL MNH_MEM_GET( ztot_rdryhg , imicro )
    CALL MNH_MEM_GET( ztot_ridryh , imicro )
    CALL MNH_MEM_GET( ztot_rsdryh , imicro )
    CALL MNH_MEM_GET( ztot_rrdryh , imicro )
    CALL MNH_MEM_GET( ztot_rgdryh , imicro )
    
    CALL MNH_MEM_GET( z0rvt, imicro )
    CALL MNH_MEM_GET( z0rct, imicro )
    CALL MNH_MEM_GET( z0rrt, imicro )
    CALL MNH_MEM_GET( z0rit, imicro )
    CALL MNH_MEM_GET( z0rst, imicro )
    CALL MNH_MEM_GET( z0rgt, imicro )
    CALL MNH_MEM_GET( z0rht, imicro )
    CALL MNH_MEM_GET( za_th, imicro )
    CALL MNH_MEM_GET( za_rv, imicro )
    CALL MNH_MEM_GET( za_rc, imicro )
    CALL MNH_MEM_GET( za_rr, imicro )
    CALL MNH_MEM_GET( za_ri, imicro )
    CALL MNH_MEM_GET( za_rs, imicro )
    CALL MNH_MEM_GET( za_rg, imicro )
    CALL MNH_MEM_GET( za_rh, imicro )
    CALL MNH_MEM_GET( zb_th, imicro )
    CALL MNH_MEM_GET( zb_rv, imicro )
    CALL MNH_MEM_GET( zb_rc, imicro )
    CALL MNH_MEM_GET( zb_rr, imicro )
    CALL MNH_MEM_GET( zb_ri, imicro )
    CALL MNH_MEM_GET( zb_rs, imicro )
    CALL MNH_MEM_GET( zb_rg, imicro )
    CALL MNH_MEM_GET( zb_rh, imicro )
    
    CALL MNH_MEM_GET( zext_rv, imicro )
    CALL MNH_MEM_GET( zext_rc, imicro )
    CALL MNH_MEM_GET( zext_rr, imicro )
    CALL MNH_MEM_GET( zext_ri, imicro )
    CALL MNH_MEM_GET( zext_rs, imicro )
    CALL MNH_MEM_GET( zext_rg, imicro )
    CALL MNH_MEM_GET( zext_rh, imicro )
    CALL MNH_MEM_GET( zext_th, imicro )
    
    CALL MNH_MEM_GET( iiter, imicro )
    
    CALL MNH_MEM_GET( ztime,           imicro )
    CALL MNH_MEM_GET( zmaxtime,        imicro )
    CALL MNH_MEM_GET( ztime_threshold, imicro )
    CALL MNH_MEM_GET( ztime_lastcall,  imicro )
    
    CALL MNH_MEM_GET( zw1d,     imicro )
    CALL MNH_MEM_GET( zcompute, imicro )
    
    CALL MNH_MEM_GET( gdnotmicro, size( odmicro, 1 ), size( odmicro, 2 ), size( odmicro, 3 ) )
    
    CALL MNH_MEM_GET( zrs_tend, imicro, 8  )
    CALL MNH_MEM_GET( zrg_tend, imicro, 8  )
    CALL MNH_MEM_GET( zrh_tend, imicro, 10 )
    
    CALL MNH_MEM_GET( zssi, imicro )
    
    
    CALL MNH_MEM_GET( zw_rvs, jiu, jju, jku )
    CALL MNH_MEM_GET( zw_rcs, jiu, jju, jku )
    CALL MNH_MEM_GET( zw_rrs, jiu, jju, jku )
    CALL MNH_MEM_GET( zw_ris, jiu, jju, jku )
    CALL MNH_MEM_GET( zw_rss, jiu, jju, jku )
    CALL MNH_MEM_GET( zw_rgs, jiu, jju, jku )
    CALL MNH_MEM_GET( zw_rhs, jiu, jju, jku )
    CALL MNH_MEM_GET( zw_ths, jiu, jju, jku )
    
    CALL MNH_MEM_GET( ZTEMP_BUD, JIU, JJU, JKU )
    !$acc data present( I1, I2, I3,                                                                                                &
    
    !$acc &            ZW, ZT, ZZ_RVHENI_MR, ZZ_RVHENI, ZZ_LVFACT, ZZ_LSFACT, ZLSFACT3D, ZINPRI,                                   &
    !$acc &            ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, ZCIT, ZTHT, ZRHODREF, ZZT, ZPRES, ZEXN,                           &
    !$acc &            ZLSFACT, ZLVFACT,                                                                                           &
    !$acc &            ZHLC_HCF3D, ZHLC_LCF3D, ZHLC_HRC3D, ZHLC_LRC3D, ZHLI_HCF3D, ZHLI_LCF3D, ZHLI_HRI3D, ZHLI_LRI3D,             &
    !$acc &            ZSIGMA_RC, ZCF, ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, ZHLI_HCF, ZHLI_LCF, ZHLI_HRI, ZHLI_LRI,             &
    !$acc &            ZRVHENI_MR, ZRCHONI, ZRRHONG_MR, ZRVDEPS, ZRIAGGS, ZRIAUTS, ZRVDEPG, ZRCAUTR, ZRCACCR, ZRREVAV, ZRIMLTC_MR, &
    !$acc &            ZRCBERI, ZRHMLTR, ZRSMLTG, ZRCMLTSR, ZRRACCSS, ZRRACCSG, ZRSACCRG,                                          &
    !$acc &            ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRSRIMCG_MR,                                                                  &
    !$acc &            ZRICFRRG,  ZRRCFRIG,  ZRICFRR, ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG,      &
    !$acc &            ZRWETGH, ZRWETGH_MR, ZRGMLTR, ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH,                                  &
    !$acc &            ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, ZRDRYHG,                                                       &
    !$acc &            ZTOT_RVHENI, ZTOT_RCHONI, ZTOT_RRHONG, ZTOT_RVDEPS, ZTOT_RIAGGS, ZTOT_RIAUTS, ZTOT_RVDEPG, ZTOT_RCAUTR,     &
    !$acc &            ZTOT_RCACCR, ZTOT_RREVAV, ZTOT_RCRIMSS, ZTOT_RCRIMSG, ZTOT_RSRIMCG, ZTOT_RIMLTC, ZTOT_RCBERI, ZTOT_RHMLTR,  &
    !$acc &            ZTOT_RSMLTG, ZTOT_RCMLTSR, ZTOT_RRACCSS,  ZTOT_RRACCSG,  ZTOT_RSACCRG, ZTOT_RICFRRG,  ZTOT_RRCFRIG,         &
    !$acc &            ZTOT_RICFRR, ZTOT_RCWETG, ZTOT_RIWETG, ZTOT_RRWETG, ZTOT_RSWETG, ZTOT_RCDRYG, ZTOT_RIDRYG, ZTOT_RRDRYG,     &
    !$acc &            ZTOT_RSDRYG, ZTOT_RWETGH, ZTOT_RGMLTR, ZTOT_RCWETH, ZTOT_RIWETH, ZTOT_RSWETH, ZTOT_RGWETH, ZTOT_RRWETH,     &
    !$acc &            ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, ZTOT_RDRYHG,                               &
    !$acc &            Z0RVT, Z0RCT, Z0RRT, Z0RIT, Z0RST, Z0RGT, Z0RHT,                                                            &
    !$acc &            ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH,                                                     &
    !$acc &            ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH,                                                     &
    !$acc &            ZEXT_RV, ZEXT_RC, ZEXT_RR, ZEXT_RI, ZEXT_RS, ZEXT_RG, ZEXT_RH, ZEXT_TH,                                     &
    
    !$acc &            IITER, ZTIME, ZMAXTIME, ZTIME_THRESHOLD, ZTIME_LASTCALL, ZW1D, ZCOMPUTE, GDNOTMICRO,                        &
    !$acc &            ZRS_TEND, ZRG_TEND, ZRH_TEND, ZSSI, ZW_RVS, ZW_RCS, ZW_RRS, ZW_RIS, ZW_RSS, ZW_RGS, ZW_RHS, ZW_THS,         &
    !$acc &            ZTEMP_BUD                                                                                                   )
    #endif
    
    
    !-------------------------------------------------------------------------------
    if ( lbu_enable ) then
    
          ZTEMP_BUD(:,:,:) =  pths(:, :, :) * prhodj(:, :, :)
          !$acc end kernels
          call Budget_store_init( tbudgets(NBUDGET_TH), 'HENU', ZTEMP_BUD(:,:,:) )
       end if
       if ( lbudget_rv ) then
    
          ZTEMP_BUD(:,:,:) =  prvs(:, :, :) * prhodj(:, :, :)
          !$acc end kernels      
          call Budget_store_init( tbudgets(NBUDGET_RV), 'HENU', ZTEMP_BUD(:,:,:) )
       end if
    
    end if
    !-------------------------------------------------------------------------------
    !
    !*       1.     COMPUTE THE LOOP BOUNDS
    !               -----------------------
    !
    CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
    
    #ifdef MNH_COMPILER_CCE
    !$acc kernels present(ZRS_TEND,ZRG_TEND,ZRH_TEND,ZRCHONI,ZRVDEPS,ZRIAGGS,ZRIAUTS,     &
    !$acc &               ZRVDEPG,ZRCAUTR,ZRCACCR,ZRREVAV,ZRSMLTG,ZRCMLTSR,ZRICFRRG,      &
    !$acc &               ZRRCFRIG,ZRICFRR,ZRGMLTR,ZRHMLTR,ZRCBERI)
    #else
    
    IKB=KKA+JPVEXT*KKL
    IKE=KKU-JPVEXT*KKL
    IKTB=1+JPVEXT
    IKTE=KKT-JPVEXT
    !
    ZINV_TSTEP=1./PTSTEP
    GEXT_TEND=.TRUE.
    !
    !Not necessary (done in ICE4_TENDENCIES when GSOFT=.FALSE.)
    !but useful for calls to MPPDB_CHECK
    ZRS_TEND(:,:) = 0.
    ZRG_TEND(:,:) = 0.
    ZRH_TEND(:,:) = 0.
    ZRCHONI(:) = 0.
    ZRVDEPS(:) = 0.
    ZRIAGGS(:) = 0.
    ZRIAUTS(:) = 0.
    ZRVDEPG(:) = 0.
    ZRCAUTR(:) = 0.
    ZRCACCR(:) = 0.
    ZRREVAV(:) = 0.
    ZRSMLTG(:) = 0.
    ZRCMLTSR(:)= 0.
    ZRICFRRG(:) = 0.
    ZRRCFRIG(:) = 0.
    ZRICFRR(:) = 0.
    ZRGMLTR(:) = 0.
    ZRHMLTR(:) = 0.
    ZRCBERI(:) = 0.
    !
    ! LSFACT and LVFACT without exner
    IF(KRR==7) THEN
    
      DO JK = 1, KKT
        DO JJ = 1, KJT
          DO JI = 1, KIT
            ZT(JI,JJ,JK) = PTHT(JI,JJ,JK) * PEXN(JI,JJ,JK)
            ZZ_LSFACT(JI,JJ,JK)=(XLSTT+(XCPV-XCI)*(ZT(JI,JJ,JK)-XTT))   &
                             /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK))   &
                             + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)+PRHT(JI,JJ,JK)))
            ZZ_LVFACT(JI,JJ,JK)=(XLVTT+(XCPV-XCL)*(ZT(JI,JJ,JK)-XTT))   &
                             /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK))   &
                             + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)+PRHT(JI,JJ,JK)))
          ENDDO
        ENDDO
      ENDDO
    ELSE
    
      DO JK = 1, KKT
        DO JJ = 1, KJT
          DO JI = 1, KIT
            ZT(JI,JJ,JK) = PTHT(JI,JJ,JK) * PEXN(JI,JJ,JK)
            ZZ_LSFACT(JI,JJ,JK)=(XLSTT+(XCPV-XCI)*(ZT(JI,JJ,JK)-XTT))   &
                             /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK))   &
                             + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)))
            ZZ_LVFACT(JI,JJ,JK)=(XLVTT+(XCPV-XCL)*(ZT(JI,JJ,JK)-XTT))   &
                             /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK))   &
                             + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)))
          ENDDO
        ENDDO
      ENDDO
    ENDIF
    !$acc end kernels
    !
    !-------------------------------------------------------------------------------
    !
    !*       2.     COMPUTE THE SEDIMENTATION (RS) SOURCE
    !               -------------------------------------
    !
    IF(.NOT. LSEDIM_AFTER) THEN
      !
      !*       2.1     sedimentation
      !
    
          ZTEMP_BUD(:,:,:) =  prcs(:, :, :) * prhodj(:, :, :)
          !$acc end kernels
          call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', ZTEMP_BUD(:,:,:) )
       end if
       if ( lbudget_rr  ) then
    
          ZTEMP_BUD(:,:,:) =  prrs(:, :, :) * prhodj(:, :, :)
          !$acc end kernels
          call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', ZTEMP_BUD(:,:,:) )
       end if
       if ( lbudget_ri  ) then
    
          ZTEMP_BUD(:,:,:) =  pris(:, :, :) * prhodj(:, :, :)
          !$acc end kernels
          call Budget_store_init( tbudgets(NBUDGET_RI), 'SEDI', ZTEMP_BUD(:,:,:) )
       end if
       if ( lbudget_rs  ) then
    
          ZTEMP_BUD(:,:,:) =  prss(:, :, :) * prhodj(:, :, :)
          !$acc end kernels
          call Budget_store_init( tbudgets(NBUDGET_RS), 'SEDI', ZTEMP_BUD(:,:,:) )
       end if
       if ( lbudget_rg  ) then
    
          ZTEMP_BUD(:,:,:) =  prgs(:, :, :) * prhodj(:, :, :)
          !$acc end kernels
          call Budget_store_init( tbudgets(NBUDGET_RG), 'SEDI', ZTEMP_BUD(:,:,:) )
       end if
       if ( lbudget_rh  ) then
    
          ZTEMP_BUD(:,:,:) =  prhs(:, :, :) * prhodj(:, :, :)
          !$acc end kernels
          call Budget_store_init( tbudgets(NBUDGET_RH), 'SEDI', ZTEMP_BUD(:,:,:) )
       end if
    
    
      !Init only if not osedic (to prevent crash with double init)
      !Remark: the 2 source terms SEDI and DEPO could be mixed and stored in the same source term (SEDI)
      !        if osedic=T and ldeposc=T (a warning is printed in ini_budget in that case)
    
       if ( lbudget_rc .and. ldeposc .and. .not.osedic ) then
    
          ZTEMP_BUD(:,:,:) =  prcs(:, :, :) * prhodj(:, :, :)
          !$acc end kernels      
          call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPO', ZTEMP_BUD(:,:,:) )
      end if
    
    
      IF(HSEDIM=='STAT') THEN
    #ifdef MNH_OPENACC
        CALL PRINT_MSG(NVERB_FATAL,'GEN','RAIN_ICE_RED','OpenACC: HSEDIM=STAT not yet implemented')
    #endif
        !SR: It *seems* that we must have two separate calls for ifort
        IF(KRR==7) THEN
          CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
                                      &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                      &PRHODREF, PPABST, PTHT, PRHODJ, &
                                      &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,&
                                      &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,&
                                      &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
                                      &PSEA=PSEA, PTOWN=PTOWN, &
                                      &PINPRH=PINPRH, PRHT=PRHS*PTSTEP, PRHS=PRHS, PFPR=PFPR)
        ELSE
          CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
                                      &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                      &PRHODREF, PPABST, PTHT, PRHODJ, &
                                      &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,&
                                      &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,&
                                      &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
                                      &PSEA=PSEA, PTOWN=PTOWN, &
                                      &PFPR=PFPR)
        ENDIF
    !$acc kernels
        PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
    !$acc end kernels
        !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables
      ELSEIF(HSEDIM=='SPLI') THEN
        !SR: It *seems* that we must have two separate calls for ifort
        IF(KRR==7) THEN
          CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
                                       &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                       &PRHODREF, PPABST, PTHT, PRHODJ, &
                                       &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                                       &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
                                       &PSEA=PSEA, PTOWN=PTOWN, &
                                       &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR)
        ELSE
          CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
                                       &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                       &PRHODREF, PPABST, PTHT, PRHODJ, &
                                       &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                                       &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
                                       &PSEA=PSEA, PTOWN=PTOWN, &
                                       &PFPR=PFPR)
        ENDIF
    !$acc kernels
        PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
    !$acc end kernels
        !We correct negativities with conservation
        !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used.
        !   It is initialized with the m.r. at T and is modified by two tendencies:
        !   sedimentation tendency and an external tendency which represents all other
        !   processes (mainly advection and microphysical processes). If both tendencies
        !   are negative, sedimentation can remove a specie at a given sub-timestep. From
        !   this point sedimentation stops for the remaining sub-timesteps but the other tendency
        !   will be still active and will lead to negative values.
        !   We could prevent the algorithm to not consume too much a specie, instead we apply
        !   a correction here.
        CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRVS, PRCS, PRRS, &
                                 &PRIS, PRSS, PRGS, &
                                 &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS)
      ELSEIF(HSEDIM=='NONE') THEN
      ELSE
        call Print_msg( NVERB_FATAL, 'GEN', 'RAIN_ICE_RED', 'no sedimentation scheme for HSEDIM='//HSEDIM )
      END IF
      !
      !*       2.2     budget storage
      !
    
         ZTEMP_BUD(:,:,:) =  prcs(:, :, :) * prhodj(:, :, :)
         !$acc end kernels
         call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', ZTEMP_BUD(:,:,:) )
      end if
      if ( lbudget_rr  ) then
    
         ZTEMP_BUD(:,:,:) =  prrs(:, :, :) * prhodj(:, :, :)
         !$acc end kernels
         call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', ZTEMP_BUD(:,:,:) )
      end if
      if ( lbudget_ri  ) then
    
         ZTEMP_BUD(:,:,:) =  pris(:, :, :) * prhodj(:, :, :)
         !$acc end kernels
         call Budget_store_end( tbudgets(NBUDGET_RI), 'SEDI', ZTEMP_BUD(:,:,:) )
      end if
      if ( lbudget_rs  ) then
    
         ZTEMP_BUD(:,:,:) =  prss(:, :, :) * prhodj(:, :, :)
         !$acc end kernels
         call Budget_store_end( tbudgets(NBUDGET_RS), 'SEDI', ZTEMP_BUD(:,:,:) )
      end if
      if ( lbudget_rg  ) then
    
          ZTEMP_BUD(:,:,:) =  prgs(:, :, :) * prhodj(:, :, :)
          !$acc end kernels
         call Budget_store_end( tbudgets(NBUDGET_RG), 'SEDI', ZTEMP_BUD(:,:,:) )
      end if
      if ( lbudget_rh  ) then
    
         ZTEMP_BUD(:,:,:) =  prhs(:, :, :) * prhodj(:, :, :)
         !$acc end kernels
         call Budget_store_end( tbudgets(NBUDGET_RH), 'SEDI', ZTEMP_BUD(:,:,:) )
      end if
    
    
      !If osedic=T and ldeposc=T, DEPO is in fact mixed and stored with the SEDI source term
      !(a warning is printed in ini_budget in that case)
    
      if ( lbudget_rc .and. ldeposc .and. .not.osedic) then
    
         ZTEMP_BUD(:,:,:) =  prcs(:, :, :) * prhodj(:, :, :)
         !$acc end kernels      
         call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPO', ZTEMP_BUD(:,:,:) )
      end if
    
    ENDIF
    !
    !-------------------------------------------------------------------------------
    !
    !*       3.     PACKING
    !               --------
    !  optimization by looking for locations where
    !  the microphysical fields are larger than a minimal value only !!!
    !
    #ifndef MNH_OPENACC
    IMICRO=COUNTJV(ODMICRO(:,:,:), I1(:), I2(:), I3(:))
    #else
    CALL COUNTJV_DEVICE(ODMICRO(:,:,:),I1(:),I2(:),I3(:),IMICRO)
    #endif
    !Packing
    GTEST=.false.
    IF(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM') GTEST=.true.
    
    #ifdef MNH_COMPILER_CCE
    !$acc kernels present(ZSIGMA_RC,ZRHT,ZEXT_RH,                                                                                  &
    !$acc &            ZTOT_RVHENI, ZTOT_RCHONI, ZTOT_RRHONG, ZTOT_RVDEPS, ZTOT_RIAGGS, ZTOT_RIAUTS, ZTOT_RVDEPG, ZTOT_RCAUTR,     &
    !$acc &            ZTOT_RCACCR, ZTOT_RREVAV, ZTOT_RCRIMSS, ZTOT_RCRIMSG, ZTOT_RSRIMCG, ZTOT_RIMLTC, ZTOT_RCBERI, ZTOT_RHMLTR,  &
    !$acc &            ZTOT_RSMLTG, ZTOT_RCMLTSR, ZTOT_RRACCSS,  ZTOT_RRACCSG,  ZTOT_RSACCRG, ZTOT_RICFRRG,  ZTOT_RRCFRIG,         &
    !$acc &            ZTOT_RICFRR, ZTOT_RCWETG, ZTOT_RIWETG, ZTOT_RRWETG, ZTOT_RSWETG, ZTOT_RCDRYG, ZTOT_RIDRYG, ZTOT_RRDRYG,     &
    !$acc &            ZTOT_RSDRYG, ZTOT_RWETGH, ZTOT_RGMLTR, ZTOT_RCWETH, ZTOT_RIWETH, ZTOT_RSWETH, ZTOT_RGWETH, ZTOT_RRWETH,     &
    !$acc &            ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, ZTOT_RDRYHG)                              
    #else
    
        ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL))
        ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL))
        ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL))
        ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL))
        ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL))
        ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL))
        ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL))
        ZCF(JL) = PCLDFR(I1(JL),I2(JL),I3(JL))
        ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL))
        ZTHT(JL) = PTHT(I1(JL),I2(JL),I3(JL))
        ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL))
        ZEXN(JL) = PEXN(I1(JL),I2(JL),I3(JL))
        ZHLC_HCF(JL) = PHLC_HCF(I1(JL),I2(JL),I3(JL))
        ZHLC_HRC(JL) = PHLC_HRC(I1(JL),I2(JL),I3(JL))
        ZHLC_LRC(JL) = ZRCT(JL) - ZHLC_HRC(JL)
        ZHLI_HCF(JL) = PHLI_HCF(I1(JL),I2(JL),I3(JL))
        ZHLI_HRI(JL) = PHLI_HRI(I1(JL),I2(JL),I3(JL))
        ZHLI_LRI(JL) = ZRIT(JL) - ZHLI_HRI(JL)
        IF(ZRCT(JL)>0.) THEN
          ZHLC_LCF(JL) = ZCF(JL)- ZHLC_HCF(JL)
        ELSE
          ZHLC_LCF(JL)=0.
        ENDIF
        IF(ZRIT(JL)>0.) THEN
          ZHLI_LCF(JL) = ZCF(JL)- ZHLI_HCF(JL)
        ELSE
          ZHLI_LCF(JL)=0.
        ENDIF
    
        DO JL=1, IMICRO
          ZEXT_RV(JL) = PRVS(I1(JL),I2(JL),I3(JL)) - ZRVT(JL)*ZINV_TSTEP
          ZEXT_RC(JL) = PRCS(I1(JL),I2(JL),I3(JL)) - ZRCT(JL)*ZINV_TSTEP
          ZEXT_RR(JL) = PRRS(I1(JL),I2(JL),I3(JL)) - ZRRT(JL)*ZINV_TSTEP
          ZEXT_RI(JL) = PRIS(I1(JL),I2(JL),I3(JL)) - ZRIT(JL)*ZINV_TSTEP
          ZEXT_RS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) - ZRST(JL)*ZINV_TSTEP
          ZEXT_RG(JL) = PRGS(I1(JL),I2(JL),I3(JL)) - ZRGT(JL)*ZINV_TSTEP
          ZEXT_TH(JL) = PTHS(I1(JL),I2(JL),I3(JL)) - ZTHT(JL)*ZINV_TSTEP
          !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here
        ENDDO
      ENDIF
      !IF(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM') THEN
      IF (GTEST) THEN
    
        DO JL=1, IMICRO
          ZSIGMA_RC(JL) = PSIGS(I1(JL),I2(JL),I3(JL))*2.
        ENDDO
      ELSE !useful when doing calls to MPPDB_CHECK
        ZSIGMA_RC(:) = XUNDEF
      ENDIF
      IF(KRR==7) THEN
    
        DO JL=1, IMICRO
          ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL))
        ENDDO
        IF(GEXT_TEND) THEN
    
          DO JL=1, IMICRO
            ZEXT_RH(JL) = PRHS(I1(JL),I2(JL),I3(JL)) - ZRHT(JL)*ZINV_TSTEP
          ENDDO
        ENDIF
      ELSE
        ZRHT(:)=0.
        IF(GEXT_TEND) ZEXT_RH(:)=0.
      ENDIF
      IF(LBU_ENABLE) THEN
        ZTOT_RVHENI(:)=0.
        ZTOT_RCHONI(:)=0.
        ZTOT_RRHONG(:)=0.
        ZTOT_RVDEPS(:)=0.
        ZTOT_RIAGGS(:)=0.
        ZTOT_RIAUTS(:)=0.
        ZTOT_RVDEPG(:)=0.
        ZTOT_RCAUTR(:)=0.
        ZTOT_RCACCR(:)=0.
        ZTOT_RREVAV(:)=0.
        ZTOT_RCRIMSS(:)=0.
        ZTOT_RCRIMSG(:)=0.
        ZTOT_RSRIMCG(:)=0.
        ZTOT_RIMLTC(:)=0.
        ZTOT_RCBERI(:)=0.
        ZTOT_RHMLTR(:)=0.
        ZTOT_RSMLTG(:)=0.
        ZTOT_RCMLTSR(:)=0.
        ZTOT_RRACCSS(:)=0.
        ZTOT_RRACCSG(:)=0.
        ZTOT_RSACCRG(:)=0.
        ZTOT_RICFRRG(:)=0.
        ZTOT_RRCFRIG(:)=0.
        ZTOT_RICFRR(:)=0.
        ZTOT_RCWETG(:)=0.
        ZTOT_RIWETG(:)=0.
        ZTOT_RRWETG(:)=0.
        ZTOT_RSWETG(:)=0.
        ZTOT_RCDRYG(:)=0.
        ZTOT_RIDRYG(:)=0.
        ZTOT_RRDRYG(:)=0.
        ZTOT_RSDRYG(:)=0.
        ZTOT_RWETGH(:)=0.
        ZTOT_RGMLTR(:)=0.
        ZTOT_RCWETH(:)=0.
        ZTOT_RIWETH(:)=0.
        ZTOT_RSWETH(:)=0.
        ZTOT_RGWETH(:)=0.
        ZTOT_RRWETH(:)=0.
        ZTOT_RCDRYH(:)=0.
        ZTOT_RIDRYH(:)=0.
        ZTOT_RSDRYH(:)=0.
        ZTOT_RRDRYH(:)=0.
        ZTOT_RGDRYH(:)=0.
        ZTOT_RDRYHG(:)=0.
      ENDIF
    ENDIF
    !$acc end kernels
    !-------------------------------------------------------------------------------
    !
    !*       4.     LOOP
    !               ----
    !
    !Maximum number of iterations
    !We only count real iterations (those for which we *compute* tendencies)
    !acc kernels
    INB_ITER_MAX=NMAXITER
    IF(XTSTEP_TS/=0.)THEN
      INB_ITER_MAX=MAX(1, INT(PTSTEP/XTSTEP_TS)) !At least the number of iterations needed for the time-splitting
      ZTSTEP=PTSTEP/INB_ITER_MAX
      INB_ITER_MAX=MAX(NMAXITER, INB_ITER_MAX) !For the case XMRSTEP/=0. at the same time
    ENDIF
    !acc end kernels
    
    IITER(:)=0
    ZTIME(:)=0. ! Current integration time (all points may have a different integration time)
    !$acc end kernels
    !$acc update self(ZTIME)
    DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
      IF(XMRSTEP/=0.) THEN
    !$acc kernels
        ! In this case we need to remember the mixing ratios used to compute the tendencies
        ! because when mixing ratio has evolved more than a threshold, we must re-compute tendecies
        Z0RVT(:)=ZRVT(:)
        Z0RCT(:)=ZRCT(:)
        Z0RRT(:)=ZRRT(:)
        Z0RIT(:)=ZRIT(:)
        Z0RST(:)=ZRST(:)
        Z0RGT(:)=ZRGT(:)
        Z0RHT(:)=ZRHT(:)
    !$acc end kernels
      ENDIF
      IF(XTSTEP_TS/=0.) THEN
    !$acc kernels
        ! In this case we need to remember the time when tendencies were computed
        ! because when time has evolved more than a limit, we must re-compute tendecies
        ZTIME_LASTCALL(:)=ZTIME(:)
    !$acc end kernels
      ENDIF
    !$acc kernels
      ZCOMPUTE(:)=MAX(0., -SIGN(1., ZTIME(:)-PTSTEP)) ! Compuation (1.) only for points for which integration time has not reached the timestep
      GSOFT=.FALSE. ! We *really* compute the tendencies
    
    !$acc loop independent
      DO JL = 1, IMICRO
        IITER(JL) = IITER(JL) + INT( ZCOMPUTE(JL) )
      END DO
    
    !$acc end kernels
    !$acc update self(ZCOMPUTE)
      DO WHILE(SUM(ZCOMPUTE(:))>0.) ! Loop to adjust tendencies when we cross the 0°C or when a specie disappears
    !$acc kernels
        IF(KRR==7) THEN
    
          DO JL=1, IMICRO
            ZZT(JL) = ZTHT(JL) * ZEXN(JL)
            ZLSFACT(JL)=(XLSTT+(XCPV-XCI)*(ZZT(JL)-XTT))   &
                       &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL))   &
                       &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)+ZRHT(JL)))*ZEXN(JL) )
            ZLVFACT(JL)=(XLVTT+(XCPV-XCL)*(ZZT(JL)-XTT))   &
                       &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL))   &
                       &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)+ZRHT(JL)))*ZEXN(JL) )
          ENDDO
        ELSE
    
          DO JL=1, IMICRO
            ZZT(JL) = ZTHT(JL) * ZEXN(JL)
            ZLSFACT(JL)=(XLSTT+(XCPV-XCI)*(ZZT(JL)-XTT))   &
                       &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL))   &
                       &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)))*ZEXN(JL) )
            ZLVFACT(JL)=(XLVTT+(XCPV-XCL)*(ZZT(JL)-XTT))   &
                       &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL))   &
                       &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)))*ZEXN(JL) )
          ENDDO
        ENDIF
    !$acc end kernels
        !
        !***       4.1 Tendecies computation
        !
        ! Tendencies are *really* computed when GSOFT==.FALSE. and only adjusted otherwise
        CALL ICE4_TENDENCIES(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, KKT, KKL, &
                            &KRR, GSOFT, ZCOMPUTE, &
                            &OWARM, CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP, &
                            &HSUBG_AUCV_RC, HSUBG_AUCV_RI, CSUBG_PR_PDF, &
                            &ZEXN, ZRHODREF, ZLVFACT, ZLSFACT, I1, I2, I3, &
                            &ZPRES, ZCF, ZSIGMA_RC,&
                            &ZCIT, &
                            &ZZT, ZTHT, &
                            &ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, &
                            &ZRVHENI_MR, ZRRHONG_MR, ZRIMLTC_MR, ZRSRIMCG_MR, &
                            &ZRCHONI, ZRVDEPS, ZRIAGGS, ZRIAUTS, ZRVDEPG, &
                            &ZRCAUTR, ZRCACCR, ZRREVAV, &
                            &ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRRACCSS, ZRRACCSG, ZRSACCRG, ZRSMLTG, ZRCMLTSR, &
                            &ZRICFRRG, ZRRCFRIG, ZRICFRR, ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, &
                            &ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, ZRWETGH, ZRWETGH_MR, ZRGMLTR, &
                            &ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, &
                            &ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, ZRDRYHG, ZRHMLTR, &
                            &ZRCBERI, &
                            &ZRS_TEND, ZRG_TEND, ZRH_TEND, ZSSI, &
                            &ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH, &
                            &ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH, &
                            &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, &
                            &ZHLI_HCF, ZHLI_LCF, ZHLI_HRI, ZHLI_LRI, PRAINFR)
        ! External tendencies
    
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
          DO JL=1, IMICRO
            ZA_TH(JL) = ZA_TH(JL) + ZEXT_TH(JL)
            ZA_RV(JL) = ZA_RV(JL) + ZEXT_RV(JL)
            ZA_RC(JL) = ZA_RC(JL) + ZEXT_RC(JL)
            ZA_RR(JL) = ZA_RR(JL) + ZEXT_RR(JL)
            ZA_RI(JL) = ZA_RI(JL) + ZEXT_RI(JL)
            ZA_RS(JL) = ZA_RS(JL) + ZEXT_RS(JL)
            ZA_RG(JL) = ZA_RG(JL) + ZEXT_RG(JL)
            ZA_RH(JL) = ZA_RH(JL) + ZEXT_RH(JL)
          ENDDO
    
        !
        !***       4.2 Integration time
        !
        ! If we can, we will use these tendencies until the end of the timestep
        ZMAXTIME(:)=ZCOMPUTE(:) * (PTSTEP-ZTIME(:)) ! Remaining time until the end of the timestep
    
        !We need to adjust tendencies when temperature reaches 0
        IF(LFEEDBACKT) THEN
    
          DO JL=1, IMICRO
            !Is ZB_TH enough to change temperature sign?
            ZW1D(JL)=(ZTHT(JL) - XTT/ZEXN(JL)) * (ZTHT(JL) + ZB_TH(JL) - XTT/ZEXN(JL))
            ZMAXTIME(JL)=ZMAXTIME(JL)*MAX(0., SIGN(1., ZW1D(JL)))
            !Can ZA_TH make temperature change of sign?
            ZW1D(JL)=MAX(0., -SIGN(1., 1.E-20 - ABS(ZA_TH(JL)))) ! WHERE(ABS(ZA_TH(:))>1.E-20)
            ZTIME_THRESHOLD(JL)=(1. - ZW1D(JL))*(-1.) + &
                                ZW1D(JL) * &
                                (XTT/ZEXN(JL) - ZB_TH(JL) - ZTHT(JL))/ &
                                SIGN(MAX(ABS(ZA_TH(JL)), 1.E-20), ZA_TH(JL))
            ZW1D(JL)=MAX(0., -SIGN(1., 1.E-20 - ZTIME_THRESHOLD(JL))) ! WHERE(ZTIME_THRESHOLD(:)>1.E-20)
            ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                         ZW1D(JL) * MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
          ENDDO
        ENDIF
    
        !We need to adjust tendencies when a specy disappears
        !When a species is missing, only the external tendencies can be negative (and we must keep track of it)
    
        DO JL=1, IMICRO
          ZW1D(JL)=MAX(0., -SIGN(1., ZA_RV(JL)+1.E-20)) * & ! WHERE(ZA_RV(:)<-1.E-20)
                  &MAX(0., -SIGN(1., XRTMIN(1)-ZRVT(JL)))   ! WHERE(ZRVT(:)>XRTMIN(1))
          ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                      &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RV(JL)+ZRVT(JL))/MIN(ZA_RV(JL), -1.E-20))
    
          ZW1D(JL)=MAX(0., -SIGN(1., ZA_RC(JL)+1.E-20)) * & ! WHERE(ZA_RC(:)<-1.E-20)
                  &MAX(0., -SIGN(1., XRTMIN(2)-ZRCT(JL)))   ! WHERE(ZRCT(:)>XRTMIN(2))
          ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                      &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RC(JL)+ZRCT(JL))/MIN(ZA_RC(JL), -1.E-20))
    
          ZW1D(JL)=MAX(0., -SIGN(1., ZA_RR(JL)+1.E-20)) * & ! WHERE(ZA_RR(:)<-1.E-20)
                  &MAX(0., -SIGN(1., XRTMIN(3)-ZRRT(JL)))   ! WHERE(ZRRT(:)>XRTMIN(3))
          ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                      &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RR(JL)+ZRRT(JL))/MIN(ZA_RR(JL), -1.E-20))
    
          ZW1D(JL)=MAX(0., -SIGN(1., ZA_RI(JL)+1.E-20)) * & ! WHERE(ZI_RV(:)<-1.E-20)
                  &MAX(0., -SIGN(1., XRTMIN(4)-ZRIT(JL)))   ! WHERE(ZRIT(:)>XRTMIN(4))
          ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                      &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RI(JL)+ZRIT(JL))/MIN(ZA_RI(JL), -1.E-20))
    
          ZW1D(JL)=MAX(0., -SIGN(1., ZA_RS(JL)+1.E-20)) * & ! WHERE(ZA_RS(:)<-1.E-20)
                  &MAX(0., -SIGN(1., XRTMIN(5)-ZRST(JL)))   ! WHERE(ZRST(:)>XRTMIN(5))
          ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                      &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RS(JL)+ZRST(JL))/MIN(ZA_RS(JL), -1.E-20))
    
          ZW1D(JL)=MAX(0., -SIGN(1., ZA_RG(JL)+1.E-20)) * & ! WHERE(ZA_RG(:)<-1.E-20)
                  &MAX(0., -SIGN(1., XRTMIN(6)-ZRGT(JL)))   ! WHERE(ZRGT(:)>XRTMIN(6))
          ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                      &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RG(JL)+ZRGT(JL))/MIN(ZA_RG(JL), -1.E-20))
        ENDDO
    
          DO JL=1, IMICRO
            ZW1D(JL)=MAX(0., -SIGN(1., ZA_RH(JL)+1.E-20)) * & ! WHERE(ZA_RH(:)<-1.E-20)
                    &MAX(0., -SIGN(1., XRTMIN(7)-ZRHT(JL)))   ! WHERE(ZRHT(:)>XRTMIN(7))
            ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                        &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RH(JL)+ZRHT(JL))/MIN(ZA_RH(JL), -1.E-20))
          ENDDO
    
        !We stop when the end of the timestep is reached
        ZCOMPUTE(:)=ZCOMPUTE(:) * MAX(0., -SIGN(1., ZTIME(:)+ZMAXTIME(:)-PTSTEP))
    
        !We must recompute tendencies when the end of the sub-timestep is reached
        IF(XTSTEP_TS/=0.) THEN
    
          DO JL=1, IMICRO
            ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
                    &MAX(0., -SIGN(1., ZTIME_LASTCALL(JL)+ZTSTEP-ZTIME(JL)-ZMAXTIME(JL))) ! WHERE(ZTIME(:)+ZMAXTIME(:)>ZTIME_LASTCALL(:)+ZTSTEP)
            ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                        &ZW1D(JL) * (ZTIME_LASTCALL(JL)-ZTIME(JL)+ZTSTEP)
            ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
          ENDDO
        ENDIF
        !We must recompute tendencies when the maximum allowed change is reached
        !When a specy is missing, only the external tendencies can be active and we do not want to recompute
        !the microphysical tendencies when external tendencies are negative (results won't change because specy was already missing)
    
          DO JL=1, IMICRO
            ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
                    &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RV(JL)))) ! WHERE(ABS(ZA_RV(:))>1.E-20)
            ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
                               &ZW1D(JL)*(SIGN(1., ZA_RV(JL))*XMRSTEP+Z0RVT(JL)-ZRVT(JL)-ZB_RV(JL))/ &
                               &SIGN(MAX(ABS(ZA_RV(JL)), 1.E-20), ZA_RV(JL))
            ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
                    &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
                    &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRVT(JL))) + & !WHERE(ZRVT(:)>XRTMIN(6)) .OR.
                            &MAX(0., -SIGN(1., -ZA_RV(JL))))            !WHERE(ZA_RV(:)>0.)
            ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                        &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
            ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
    
            ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
                    &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RC(JL)))) ! WHERE(ABS(ZA_RC(:))>1.E-20)
            ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
                               &ZW1D(JL)*(SIGN(1., ZA_RC(JL))*XMRSTEP+Z0RCT(JL)-ZRCT(JL)-ZB_RC(JL))/ &
                               &SIGN(MAX(ABS(ZA_RC(JL)), 1.E-20), ZA_RC(JL))
            ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
                    &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
                    &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRCT(JL))) + & !WHERE(ZRCT(:)>XRTMIN(6)) .OR.
                            &MAX(0., -SIGN(1., -ZA_RC(JL))))            !WHERE(ZA_RC(:)>0.)
            ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                        &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
            ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
    
            ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
                    &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RR(JL)))) ! WHERE(ABS(ZA_RR(:))>1.E-20)
            ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
                               &ZW1D(JL)*(SIGN(1., ZA_RR(JL))*XMRSTEP+Z0RRT(JL)-ZRRT(JL)-ZB_RR(JL))/ &
                               &SIGN(MAX(ABS(ZA_RR(JL)), 1.E-20), ZA_RR(JL))
            ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
                    &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
                    &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRRT(JL))) + & !WHERE(ZRRT(:)>XRTMIN(6)) .OR.
                            &MAX(0., -SIGN(1., -ZA_RR(JL))))            !WHERE(ZA_RR(:)>0.)
            ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                        &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
            ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
    
            ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
                    &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RI(JL)))) ! WHERE(ABS(ZA_RI(:))>1.E-20)
            ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
                               &ZW1D(JL)*(SIGN(1., ZA_RI(JL))*XMRSTEP+Z0RIT(JL)-ZRIT(JL)-ZB_RI(JL))/ &
                               &SIGN(MAX(ABS(ZA_RI(JL)), 1.E-20), ZA_RI(JL))
            ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
                    &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
                    &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRIT(JL))) + & !WHERE(ZRIT(:)>XRTMIN(6)) .OR.
                            &MAX(0., -SIGN(1., -ZA_RI(JL))))            !WHERE(ZA_RI(:)>0.)
            ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                        &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
            ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
    
            ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
                    &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RS(JL)))) ! WHERE(ABS(ZA_RS(:))>1.E-20)
            ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
                               &ZW1D(JL)*(SIGN(1., ZA_RS(JL))*XMRSTEP+Z0RST(JL)-ZRST(JL)-ZB_RS(JL))/ &
                               &SIGN(MAX(ABS(ZA_RS(JL)), 1.E-20), ZA_RS(JL))
            ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
                    &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
                    &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRST(JL))) + & !WHERE(ZRST(:)>XRTMIN(6)) .OR.
                            &MAX(0., -SIGN(1., -ZA_RS(JL))))            !WHERE(ZA_RS(:)>0.)
            ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                        &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
            ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
    
            ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
                    &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RG(JL)))) ! WHERE(ABS(ZA_RG(:))>1.E-20)
            ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
                               &ZW1D(JL)*(SIGN(1., ZA_RG(JL))*XMRSTEP+Z0RGT(JL)-ZRGT(JL)-ZB_RG(JL))/ &
                               &SIGN(MAX(ABS(ZA_RG(JL)), 1.E-20), ZA_RG(JL))
            ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
                    &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
                    &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRGT(JL))) + & !WHERE(ZRGT(:)>XRTMIN(6)) .OR.
                            &MAX(0., -SIGN(1., -ZA_RG(JL))))            !WHERE(ZA_RG(:)>0.)
            ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                        &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
            ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
          ENDDO
    
            DO JL=1, IMICRO
              ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
                      &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RH(JL)))) ! WHERE(ABS(ZA_RH(:))>1.E-20)
              ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
                                 &ZW1D(JL)*(SIGN(1., ZA_RH(JL))*XMRSTEP+Z0RHT(JL)-ZRHT(JL)-ZB_RH(JL))/ &
                                 &SIGN(MAX(ABS(ZA_RH(JL)), 1.E-20), ZA_RH(JL))
              ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
                      &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
                      &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRHT(JL))) + & !WHERE(ZRHT(:)>XRTMIN(6)) .OR.
                              &MAX(0., -SIGN(1., -ZA_RH(JL))))            !WHERE(ZA_RH(:)>0.)
              ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                          &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
              ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
            ENDDO
          ENDIF
    
          DO JL=1, IMICRO
            ZW1D(JL)=MAX(ABS(ZB_RV(JL)), ABS(ZB_RC(JL)), ABS(ZB_RR(JL)), ABS(ZB_RI(JL)), &
                        &ABS(ZB_RS(JL)), ABS(ZB_RG(JL)), ABS(ZB_RH(JL)))
            ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & !WHERE(IITER(:)<INB_ITER_MAX)
                    &MAX(0., -SIGN(1., XMRSTEP-ZW1D(JL))) !WHERE(ZW1D(:)>XMRSTEP)
            ZMAXTIME(JL)=(1.-ZW1D(JL))*ZMAXTIME(JL)
            ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
          ENDDO
    
        !
        !***       4.3 New values of variables for next iteration
        !
    
        DO JL=1, IMICRO
          ZTHT(JL)=ZTHT(JL)+ZA_TH(JL)*ZMAXTIME(JL)+ZB_TH(JL)
          ZRVT(JL)=ZRVT(JL)+ZA_RV(JL)*ZMAXTIME(JL)+ZB_RV(JL)
          ZRCT(JL)=ZRCT(JL)+ZA_RC(JL)*ZMAXTIME(JL)+ZB_RC(JL)
          ZRRT(JL)=ZRRT(JL)+ZA_RR(JL)*ZMAXTIME(JL)+ZB_RR(JL)
          ZRIT(JL)=ZRIT(JL)+ZA_RI(JL)*ZMAXTIME(JL)+ZB_RI(JL)
          ZRST(JL)=ZRST(JL)+ZA_RS(JL)*ZMAXTIME(JL)+ZB_RS(JL)
          ZRGT(JL)=ZRGT(JL)+ZA_RG(JL)*ZMAXTIME(JL)+ZB_RG(JL)
          ZCIT(JL)=ZCIT(JL) * MAX(0., -SIGN(1., -ZRIT(JL))) ! WHERE(ZRIT(:)==0.) ZCIT(:) = 0.
        ENDDO
    
    !$acc end kernels
        IF(KRR==7) THEN
    !$acc kernels
          ZRHT(:)=ZRHT(:)+ZA_RH(:)*ZMAXTIME(:)+ZB_RH(:)
    !$acc end kernels
        END IF
    
        !
        !***       4.4 Mixing ratio change due to each process
        !
        IF(LBU_ENABLE) THEN
    
          ZTOT_RVHENI(:)= ZTOT_RVHENI(:) +ZRVHENI_MR(:)
          ZTOT_RCHONI(:)= ZTOT_RCHONI(:) +ZRCHONI(:) *ZMAXTIME(:)
          ZTOT_RRHONG(:)= ZTOT_RRHONG(:) +ZRRHONG_MR(:)
          ZTOT_RVDEPS(:)= ZTOT_RVDEPS(:) +ZRVDEPS(:) *ZMAXTIME(:)
          ZTOT_RIAGGS(:)= ZTOT_RIAGGS(:) +ZRIAGGS(:) *ZMAXTIME(:)
          ZTOT_RIAUTS(:)= ZTOT_RIAUTS(:) +ZRIAUTS(:) *ZMAXTIME(:)
          ZTOT_RVDEPG(:)= ZTOT_RVDEPG(:) +ZRVDEPG(:) *ZMAXTIME(:)
          ZTOT_RCAUTR(:)= ZTOT_RCAUTR(:) +ZRCAUTR(:) *ZMAXTIME(:)
          ZTOT_RCACCR(:)= ZTOT_RCACCR(:) +ZRCACCR(:) *ZMAXTIME(:)
          ZTOT_RREVAV(:)= ZTOT_RREVAV(:) +ZRREVAV(:) *ZMAXTIME(:)
          ZTOT_RCRIMSS(:)=ZTOT_RCRIMSS(:)+ZRCRIMSS(:)*ZMAXTIME(:)
          ZTOT_RCRIMSG(:)=ZTOT_RCRIMSG(:)+ZRCRIMSG(:)*ZMAXTIME(:)
          ZTOT_RSRIMCG(:)=ZTOT_RSRIMCG(:)+ZRSRIMCG(:)*ZMAXTIME(:)+ZRSRIMCG_MR(:)
          ZTOT_RRACCSS(:)=ZTOT_RRACCSS(:)+ZRRACCSS(:)*ZMAXTIME(:)
          ZTOT_RRACCSG(:)=ZTOT_RRACCSG(:)+ZRRACCSG(:)*ZMAXTIME(:)
          ZTOT_RSACCRG(:)=ZTOT_RSACCRG(:)+ZRSACCRG(:)*ZMAXTIME(:)
          ZTOT_RSMLTG(:)= ZTOT_RSMLTG(:) +ZRSMLTG(:) *ZMAXTIME(:)
          ZTOT_RCMLTSR(:)=ZTOT_RCMLTSR(:)+ZRCMLTSR(:) *ZMAXTIME(:)
          ZTOT_RICFRRG(:)=ZTOT_RICFRRG(:)+ZRICFRRG(:)*ZMAXTIME(:)
          ZTOT_RRCFRIG(:)=ZTOT_RRCFRIG(:)+ZRRCFRIG(:)*ZMAXTIME(:)
          ZTOT_RICFRR(:)= ZTOT_RICFRR(:) +ZRICFRR(:) *ZMAXTIME(:)
          ZTOT_RCWETG(:)= ZTOT_RCWETG(:) +ZRCWETG(:) *ZMAXTIME(:)
          ZTOT_RIWETG(:)= ZTOT_RIWETG(:) +ZRIWETG(:) *ZMAXTIME(:)
          ZTOT_RRWETG(:)= ZTOT_RRWETG(:) +ZRRWETG(:) *ZMAXTIME(:)
          ZTOT_RSWETG(:)= ZTOT_RSWETG(:) +ZRSWETG(:) *ZMAXTIME(:)
          ZTOT_RWETGH(:)= ZTOT_RWETGH(:) +ZRWETGH(:) *ZMAXTIME(:)+ZRWETGH_MR(:)
          ZTOT_RCDRYG(:)= ZTOT_RCDRYG(:) +ZRCDRYG(:) *ZMAXTIME(:)
          ZTOT_RIDRYG(:)= ZTOT_RIDRYG(:) +ZRIDRYG(:) *ZMAXTIME(:)
          ZTOT_RRDRYG(:)= ZTOT_RRDRYG(:) +ZRRDRYG(:) *ZMAXTIME(:)
          ZTOT_RSDRYG(:)= ZTOT_RSDRYG(:) +ZRSDRYG(:) *ZMAXTIME(:)
          ZTOT_RGMLTR(:)= ZTOT_RGMLTR(:) +ZRGMLTR(:) *ZMAXTIME(:)
          ZTOT_RCWETH(:)= ZTOT_RCWETH(:) +ZRCWETH(:) *ZMAXTIME(:)
          ZTOT_RIWETH(:)= ZTOT_RIWETH(:) +ZRIWETH(:) *ZMAXTIME(:)
          ZTOT_RSWETH(:)= ZTOT_RSWETH(:) +ZRSWETH(:) *ZMAXTIME(:)
          ZTOT_RGWETH(:)= ZTOT_RGWETH(:) +ZRGWETH(:) *ZMAXTIME(:)
          ZTOT_RRWETH(:)= ZTOT_RRWETH(:) +ZRRWETH(:) *ZMAXTIME(:)
          ZTOT_RCDRYH(:)= ZTOT_RCDRYH(:) +ZRCDRYH(:) *ZMAXTIME(:)
          ZTOT_RIDRYH(:)= ZTOT_RIDRYH(:) +ZRIDRYH(:) *ZMAXTIME(:)
          ZTOT_RSDRYH(:)= ZTOT_RSDRYH(:) +ZRSDRYH(:) *ZMAXTIME(:)
          ZTOT_RRDRYH(:)= ZTOT_RRDRYH(:) +ZRRDRYH(:) *ZMAXTIME(:)
          ZTOT_RGDRYH(:)= ZTOT_RGDRYH(:) +ZRGDRYH(:) *ZMAXTIME(:)
          ZTOT_RDRYHG(:)= ZTOT_RDRYHG(:) +ZRDRYHG(:) *ZMAXTIME(:)
          ZTOT_RHMLTR(:)= ZTOT_RHMLTR(:) +ZRHMLTR(:) *ZMAXTIME(:)
          ZTOT_RIMLTC(:)= ZTOT_RIMLTC(:) +ZRIMLTC_MR(:)
          ZTOT_RCBERI(:)= ZTOT_RCBERI(:) +ZRCBERI(:) *ZMAXTIME(:)
    
        ENDIF
        !
        !***       4.5 Next loop
        !
        GSOFT=.TRUE. ! We try to adjust tendencies (inner while loop)