Skip to content
Snippets Groups Projects
modeln.f90 92.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • VIE Benoit's avatar
    VIE Benoit committed
    !-------------------------------------------------------------------------------
    !
    !*       4.    STORAGE IN A SYNCHRONOUS FILE
    !              -----------------------------
    !
    ZTIME1 = ZTIME2
    !
    IF ( nfile_backup_current < NBAK_NUMB ) THEN
      IF ( KTCOUNT == TBACKUPN(nfile_backup_current + 1)%NSTEP ) THEN
        nfile_backup_current = nfile_backup_current + 1
        !
    
        TPBAKFILE => TBACKUPN(nfile_backup_current)%TFILE
        IVERB    = TPBAKFILE%NLFIVERB
    
    VIE Benoit's avatar
    VIE Benoit committed
        !
    
        CALL IO_File_open(TPBAKFILE)
    
    VIE Benoit's avatar
    VIE Benoit committed
        !
    
        CALL WRITE_DESFM_n(IMI,TPBAKFILE)
    
    VIE Benoit's avatar
    VIE Benoit committed
        CALL IO_Header_write( TBACKUPN(nfile_backup_current)%TFILE )
    
        IF ( ASSOCIATED( TBACKUPN(nfile_backup_current)%TFILE%TDADFILE ) ) THEN
          YDADNAME = TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME
        ELSE
          ! Set a dummy name for the dad file. Its non-zero size will allow the writing of some data in the backup file
          YDADNAME = 'DUMMY'
        END IF
        CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TRIM( YDADNAME ) )
        TOUTDATAFILE => TPBAKFILE
        CALL MNHWRITE_ZS_DUMMY_n(TPBAKFILE)
    
    VIE Benoit's avatar
    VIE Benoit committed
        IF (CSURF=='EXTE') THEN
    
          TFILE_SURFEX => TPBAKFILE
    
    VIE Benoit's avatar
    VIE Benoit committed
          CALL GOTO_SURFEX(IMI)
          CALL WRITE_SURF_ATM_n(YSURF_CUR,'MESONH','ALL',.FALSE.)
          IF ( KTCOUNT > 1) THEN
            CALL DIAG_SURF_ATM_n(YSURF_CUR,'MESONH')
            CALL WRITE_DIAG_SURF_ATM_n(YSURF_CUR,'MESONH','ALL')
          END IF
          NULLIFY(TFILE_SURFEX)
        END IF
        !
        ! Reinitialize Lagragian variables at every model backup
        IF (LLG .AND. LINIT_LG .AND. CINIT_LG=='FMOUT') THEN
    
          CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM )
    
    VIE Benoit's avatar
    VIE Benoit committed
          IF (IVERB>=5) THEN
            WRITE(UNIT=ILUOUT,FMT=*) '************************************'
    
            WRITE(UNIT=ILUOUT,FMT=*) '*** Lagrangian variables refreshed after ',TRIM(TPBAKFILE%CNAME),' backup'
    
    VIE Benoit's avatar
    VIE Benoit committed
            WRITE(UNIT=ILUOUT,FMT=*) '************************************'
          END IF
        END IF
        ! Reinitialise mean variables
        IF (LMEAN_FIELD) THEN
           CALL INI_MEAN_FIELD
        END IF
    !
      ELSE
        !Necessary to have a 'valid' CNAME when calling some subroutines
    
        TPBAKFILE => TFILE_DUMMY
    
    VIE Benoit's avatar
    VIE Benoit committed
      END IF
    ELSE
      !Necessary to have a 'valid' CNAME when calling some subroutines
    
      TPBAKFILE => TFILE_DUMMY
    
    VIE Benoit's avatar
    VIE Benoit committed
    END IF
    !
    IF ( nfile_output_current < NOUT_NUMB ) THEN
      IF ( KTCOUNT == TOUTPUTN(nfile_output_current + 1)%NSTEP ) THEN
        nfile_output_current = nfile_output_current + 1
        !
        TZOUTFILE => TOUTPUTN(nfile_output_current)%TFILE
        !
        CALL IO_File_open(TZOUTFILE)
        !
        CALL IO_Header_write(TZOUTFILE)
        CALL IO_Fieldlist_write(  TOUTPUTN(nfile_output_current) )
        CALL IO_Field_user_write( TOUTPUTN(nfile_output_current) )
        !
        CALL IO_File_close(TZOUTFILE)
        !
      END IF
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_STORE = XT_STORE + ZTIME2 - ZTIME1
    !
    !-------------------------------------------------------------------------------
    !
    !*       4.BIS    IBM and Fluctuations application
    !              -----------------------------
    !
    !*       4.B1   Add fluctuations at the domain boundaries
    !
    IF (LRECYCL) THEN
      CALL ADDFLUCTUATIONS (                                    &
               CLBCX,CLBCY,                                     &
               XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT,    &
               XFLUCTUTN,XFLUCTVTW,XFLUCTUTS,XFLUCTVTE,         &
               XFLUCTWTW,XFLUCTWTN,XFLUCTWTS,XFLUCTWTE          )
    ENDIF
    !
    !*       4.B2   Immersed boundaries
    !
    IF (LIBM) THEN
      !
      ZTIME1=ZTIME2
      !
      IF (.NOT.LCARTESIAN) THEN
        CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODELN', 'IBM can only be used in combination with cartesian coordinates')
      ENDIF
      !
      CALL IBM_FORCING(XUT,XVT,XWT,XTHT,XRT,XSVT,XTKET)
      !
      IF (LIBM_TROUBLE) THEN
         CALL IBM_FORCING_TR(XUT,XVT,XWT,XTHT,XRT,XSVT,XTKET)
      ENDIF
      !
      CALL SECOND_MNH2(ZTIME2)
      !
      XT_IBM_FORC = XT_IBM_FORC + ZTIME2 - ZTIME1
      !
    ENDIF
    !-------------------------------------------------------------------------------
    !
    !*       5.    INITIALIZATION OF THE BUDGET VARIABLES
    !              --------------------------------------
    !
    IF (NBUMOD==IMI) THEN
      LBU_ENABLE = CBUTYPE /='NONE'.AND. CBUTYPE /='SKIP' 
    ELSE
      LBU_ENABLE = .FALSE.
    END IF
    !
    IF (NBUMOD==IMI .AND. CBUTYPE=='MASK' ) THEN
      CALL SET_MASK()
      if ( lbu_ru ) then
        tbudgets(NBUDGET_U)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_U)%trhodj%xdata(:, nbutime, :) &
                                                          + Mask_compress( Mxm( xrhodj(:, :, :) ) )
      end if
      if ( lbu_rv ) then
        tbudgets(NBUDGET_V)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_V)%trhodj%xdata(:, nbutime, :) &
                                                          + Mask_compress( Mym( xrhodj(:, :, :) ) )
      end if
      if ( lbu_rw ) then
        tbudgets(NBUDGET_W)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_W)%trhodj%xdata(:, nbutime, :) &
                                                          + Mask_compress( Mzm( xrhodj(:, :, :) ) )
      end if
      if ( associated( tburhodj ) ) tburhodj%xdata(:, nbutime, :) = tburhodj%xdata(:, nbutime, :) + Mask_compress( xrhodj(:, :, :) )
    END IF
    !
    IF (NBUMOD==IMI .AND. CBUTYPE=='CART' ) THEN
      if ( lbu_ru ) then
        tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) + Cart_compress( Mxm( xrhodj(:, :, :) ) )
      end if
      if ( lbu_rv ) then
        tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) + Cart_compress( Mym( xrhodj(:, :, :) ) )
      end if
      if ( lbu_rw ) then
        tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) &
                                                    + Cart_compress( Mzm( xrhodj(:, :, :) ) )
      end if
      if ( associated( tburhodj ) ) tburhodj%xdata(:, :, :) = tburhodj%xdata(:, :, :) + Cart_compress( xrhodj(:, :, :) )
    END IF
    !
    CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR,         &
                      LUSERI, LUSERS, LUSERG, LUSERH  )
    !
    XTIME_BU   = 0.0
    !
    !-------------------------------------------------------------------------------
    !
    !*       6.    INITIALIZATION OF THE FIELD TENDENCIES
    !              --------------------------------------
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    !
    CALL INITIAL_GUESS ( NRR, NSV, KTCOUNT, XRHODJ,IMI, XTSTEP,                 &
                         XRUS, XRVS, XRWS, XRTHS, XRRS, XRTKES, XRSVS,          &
                         XUT, XVT, XWT, XTHT, XRT, XTKET, XSVT )
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_GUESS = XT_GUESS + ZTIME2 - ZTIME1 - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    !*       7.    INITIALIZATION OF THE LES FOR CURRENT TIME-STEP
    !              -----------------------------------------------
    !
    XTIME_LES_BU   = 0.0
    XTIME_LES      = 0.0
    IF (LLES) CALL LES_INI_TIMESTEP_n(KTCOUNT)
    !
    !-------------------------------------------------------------------------------
    !
    !*       8.    TWO-WAY INTERACTIVE GRID-NESTING
    !              --------------------------------
    !
    !
    CALL SECOND_MNH2(ZTIME1)
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    GMASKkids(:,:)=.FALSE.
    !
    IF (NMODEL>1) THEN
      ! correct an ifort bug
      DPTR_XRHODJ=>XRHODJ
      DPTR_XUM=>XUT
      DPTR_XVM=>XVT
      DPTR_XWM=>XWT
      DPTR_XTHM=>XTHT
      DPTR_XRM=>XRT
      DPTR_XTKEM=>XTKET
      DPTR_XSVM=>XSVT
      DPTR_XRUS=>XRUS
      DPTR_XRVS=>XRVS
      DPTR_XRWS=>XRWS
      DPTR_XRTHS=>XRTHS
      DPTR_XRRS=>XRRS
      DPTR_XRTKES=>XRTKES
      DPTR_XRSVS=>XRSVS
      DPTR_XINPRC=>XINPRC
      DPTR_XINPRR=>XINPRR
      DPTR_XINPRS=>XINPRS
      DPTR_XINPRG=>XINPRG
      DPTR_XINPRH=>XINPRH
      DPTR_XPRCONV=>XPRCONV
      DPTR_XPRSCONV=>XPRSCONV
      DPTR_XDIRFLASWD=>XDIRFLASWD
      DPTR_XSCAFLASWD=>XSCAFLASWD
      DPTR_XDIRSRFSWD=>XDIRSRFSWD
      DPTR_GMASKkids=>GMASKkids
      !
      CALL TWO_WAY(     NRR,NSV,KTCOUNT,DPTR_XRHODJ,IMI,XTSTEP,                                    &
           DPTR_XUM ,DPTR_XVM ,DPTR_XWM , DPTR_XTHM, DPTR_XRM,DPTR_XSVM,                           &
           DPTR_XRUS,DPTR_XRVS,DPTR_XRWS,DPTR_XRTHS,DPTR_XRRS,DPTR_XRSVS,                          &
           DPTR_XINPRC,DPTR_XINPRR,DPTR_XINPRS,DPTR_XINPRG,DPTR_XINPRH,DPTR_XPRCONV,DPTR_XPRSCONV, &
           DPTR_XDIRFLASWD,DPTR_XSCAFLASWD,DPTR_XDIRSRFSWD,DPTR_GMASKkids           )
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    XT_2WAY = XT_2WAY + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !-------------------------------------------------------------------------------
    !
    !*       10.    FORCING
    !               -------
    !
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    IF (LCARTESIAN) THEN
      CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ)
      XMAP=1.
    ELSE
    
      CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS,      &
                        LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, &
                        XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ      )
    
    VIE Benoit's avatar
    VIE Benoit committed
    END IF
    !
    IF ( LFORCING ) THEN
      CALL FORCING(XTSTEP,LUSERV,XRHODJ,XCORIOZ,XZHAT,XZZ,TDTCUR,&
                   XUFRC_PAST, XVFRC_PAST,XWTFRC,         &
                   XUT,XVT,XWT,XTHT,XTKET,XRT,XSVT,       &
                   XRUS,XRVS,XRWS,XRTHS,XRTKES,XRRS,XRSVS,IMI,ZJ)
    END IF
    !
    IF ( L2D_ADV_FRC ) THEN 
      CALL ADV_FORCING_n(XRHODJ,TDTCUR,XTHT,XRT,XZZ,XRTHS,XRRS)
    END IF
    IF ( L2D_REL_FRC ) THEN 
      CALL REL_FORCING_n(XRHODJ,TDTCUR,XTHT,XRT,XZZ,XRTHS,XRRS)
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_FORCING = XT_FORCING + ZTIME2 - ZTIME1 &
                 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    !*       11.    NUDGING
    !               -------
    !
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    IF ( LNUDGING ) THEN
      CALL NUDGING(LUSERV,XRHODJ,XTNUDGING,         &
                   XUT,XVT,XWT,XTHT,XRT,            &
                   XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM, &
                   XRUS,XRVS,XRWS,XRTHS,XRRS)
    
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_NUDGING = XT_NUDGING + ZTIME2 - ZTIME1 &
                 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    !*       12.    DYNAMICAL SOURCES
    !               -----------------
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    IF( LTRANS ) THEN
      XUT(:,:,:) = XUT(:,:,:) + XUTRANS
      XVT(:,:,:) = XVT(:,:,:) + XVTRANS
    END IF
    !
    CALL DYN_SOURCES( NRR,NRRL, NRRI,                              &
                      XUT, XVT, XWT, XTHT, XRT,                    &
                      XCORIOX, XCORIOY, XCORIOZ, XCURVX, XCURVY,   &
                      XRHODJ, XZZ, XTHVREF, XEXNREF,               &
                      XRUS, XRVS, XRWS, XRTHS                      )
    !
    IF( LTRANS ) THEN
      XUT(:,:,:) = XUT(:,:,:) - XUTRANS
      XVT(:,:,:) = XVT(:,:,:) - XVTRANS
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_SOURCES = XT_SOURCES + ZTIME2 - ZTIME1 &
                 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    !*       13.    NUMERICAL DIFFUSION
    !               -------------------
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    IF ( LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV ) THEN
    !
      CALL UPDATE_HALO_ll(TFIELDT_ll, IINFO_ll)
      CALL UPDATE_HALO2_ll(TFIELDT_ll, THALO2T_ll, IINFO_ll)
      IF ( .NOT. LSTEADYLS ) THEN
         CALL UPDATE_HALO_ll(TLSFIELD_ll, IINFO_ll)
         CALL UPDATE_HALO_ll(TLSFIELD2D_ll,IINFO_ll) 
         CALL UPDATE_HALO2_ll(TLSFIELD_ll, TLSHALO2_ll, IINFO_ll)
      END IF
      CALL NUM_DIFF ( CLBCX, CLBCY, NRR, NSV,                               &
                      XDK2U, XDK4U, XDK2TH, XDK4TH, XDK2SV, XDK4SV, IMI,    &
                      XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT,                &
                      XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XRHODJ,               &
                      XRUS, XRVS, XRWS, XRTHS, XRTKES, XRRS, XRSVS,         &
                      LZDIFFU,LNUMDIFU, LNUMDIFTH, LNUMDIFSV,               &
                      THALO2T_ll, TLSHALO2_ll,XZDIFFU_HALO2      )
    END IF
    
    if ( lbudget_sv ) then
      do jsv = 1, nsv
        call Budget_store_init( tbudgets(jsv + NBUDGET_SV1 - 1), 'NEGA2', xrsvs(:, :, :, jsv) )
      end do
    end if
    
    DO JSV = NSV_CHEMBEG,NSV_CHEMEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_CHICBEG,NSV_CHICEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_AERBEG,NSV_AEREND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_LNOXBEG,NSV_LNOXEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_DSTBEG,NSV_DSTEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_SLTBEG,NSV_SLTEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_PPBEG,NSV_PPEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    #ifdef MNH_FOREFIRE
    DO JSV = NSV_FFBEG,NSV_FFEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    #endif
    ! Blaze smoke
    DO JSV = NSV_FIREBEG,NSV_FIREEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_CSBEG,NSV_CSEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    DO JSV = NSV_SNWBEG,NSV_SNWEND
      XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
    END DO
    IF (CELEC .NE. 'NONE') THEN
      XRSVS(:,:,:,NSV_ELECBEG) = MAX(XRSVS(:,:,:,NSV_ELECBEG),0.)
      XRSVS(:,:,:,NSV_ELECEND) = MAX(XRSVS(:,:,:,NSV_ELECEND),0.)
    END IF
    
    if ( lbudget_sv ) then
      do jsv = 1, nsv
        call Budget_store_end( tbudgets(jsv + NBUDGET_SV1 - 1), 'NEGA2', xrsvs(:, :, :, jsv) )
      end do
    end if
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_DIFF = XT_DIFF + ZTIME2 - ZTIME1 &
              - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    !*       14.    UPPER AND LATERAL RELAXATION
    !               ----------------------------
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    IF(LVE_RELAX .OR. LVE_RELAX_GRD .OR. LHORELAX_UVWTH .OR. LHORELAX_RV .OR.&
       LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI .OR. LHORELAX_RS .OR.   &
       LHORELAX_RG .OR. LHORELAX_RH .OR. LHORELAX_TKE .OR.                   &
       ANY(LHORELAX_SV)) THEN
      CALL RELAXATION (LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV,LHORELAX_RC,   &
                       LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG,    &
                       LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV,               &
                       LHORELAX_SVC2R2,LHORELAX_SVC1R3,                    &
                       LHORELAX_SVELEC,LHORELAX_SVLG,                      &
                       LHORELAX_SVCHEM,LHORELAX_SVCHIC,LHORELAX_SVAER,     &
                       LHORELAX_SVDST,LHORELAX_SVSLT,LHORELAX_SVPP,        &
                       LHORELAX_SVCS,LHORELAX_SVSNW,LHORELAX_SVFIRE,       &
    #ifdef MNH_FOREFIRE
                       LHORELAX_SVFF,                                      &
    #endif
                       KTCOUNT,NRR,NSV,XTSTEP,XRHODJ,                      &
                       XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET,              &
                       XLSUM, XLSVM, XLSWM, XLSTHM,                        &
                       XLBXUM, XLBXVM, XLBXWM, XLBXTHM,                    &
                       XLBXRM, XLBXSVM, XLBXTKEM,                          &
                       XLBYUM, XLBYVM, XLBYWM, XLBYTHM,                    &
                       XLBYRM, XLBYSVM, XLBYTKEM,                          &
                       NALBOT, XALK, XALKW,                                &
                       NALBAS, XALKBAS, XALKWBAS,                          &
                       LMASK_RELAX,XKURELAX, XKVRELAX, XKWRELAX,           &
                       NRIMX,NRIMY,                                        &
                       XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS, XRTKES        )
    END IF
    
    IF (CELEC.NE.'NONE' .AND. LRELAX2FW_ION) THEN
       CALL RELAX2FW_ION (KTCOUNT, IMI, XTSTEP, XRHODJ, XSVT, NALBOT,      &
                          XALK, LMASK_RELAX, XKWRELAX, XRSVS )   
    END IF                      
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_RELAX = XT_RELAX + ZTIME2 - ZTIME1 &
               - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    !*       15.    PARAMETRIZATIONS' MONITOR
    !               -------------------------
    !
    ZTIME1 = ZTIME2
    !
    
    CALL PHYS_PARAM_n( KTCOUNT, TPBAKFILE,                            &
    
    VIE Benoit's avatar
    VIE Benoit committed
                       XT_RAD,  XT_SHADOWS, XT_DCONV, XT_GROUND,      &
                       XT_MAFL, XT_DRAG, XT_EOL, XT_TURB,  XT_TRACER, &
                       ZTIME, ZWETDEPAER, GMASKkids, GCLOUD_ONLY      )
    !
    IF (CDCONV/='NONE') THEN
      XPACCONV = XPACCONV + XPRCONV * XTSTEP
      IF (LCH_CONV_LINOX) THEN
        XIC_TOTAL_NUMBER = XIC_TOTAL_NUMBER + XIC_RATE * XTSTEP
        XCG_TOTAL_NUMBER = XCG_TOTAL_NUMBER + XCG_RATE * XTSTEP
      END IF
    END IF
    !
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_PARAM = XT_PARAM + ZTIME2 - ZTIME1 - XTIME_LES - ZTIME
    !
    !-------------------------------------------------------------------------------
    !
    !*       16.    TEMPORAL SERIES
    !               ---------------
    !
    ZTIME1 = ZTIME2
    !
    IF (LSERIES) THEN
      IF ( MOD (KTCOUNT-1,NFREQSERIES) == 0 ) CALL SERIES_n
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_STEP_MISC = XT_STEP_MISC + ZTIME2 - ZTIME1
    !
    !-------------------------------------------------------------------------------
    !
    !*       17.    LARGE SCALE FIELD REFRESH
    !               -------------------------
    !
    ZTIME1 = ZTIME2
    !
    IF (.NOT. LSTEADYLS) THEN
      IF (  IMI==1                             .AND.      &
        NCPL_CUR < NCPL_NBR                              ) THEN
        IF (KTCOUNT+1 == NCPL_TIMES(NCPL_CUR,1)          ) THEN
                                      ! The next current time reachs a
          NCPL_CUR=NCPL_CUR+1         ! coupling one, LS sources are refreshed
          !
          CALL LS_COUPLING(XTSTEP,GSTEADY_DMASS,CCONF,                          &
                 CGETTKET,                                                      &
                 CGETRVT,CGETRCT,CGETRRT,CGETRIT,                               &
                 CGETRST,CGETRGT,CGETRHT,CGETSVT,LCH_INIT_FIELD, NSV,           &
                 NIMAX_ll,NJMAX_ll,                                             &
                 NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll,             &
                 NSIZELBXTKE_ll,NSIZELBYTKE_ll,                                 &
                 NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll,         &
                 XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,XDRYMASST,             &
                 XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,          &
                 XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,          &
                 XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XLSZWSS,XDRYMASSS,             &
                 XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS,          &
                 XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS           )
          !
          DO JSV=NSV_CHEMBEG,NSV_CHEMEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_LNOXBEG,NSV_LNOXEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_AERBEG,NSV_AEREND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_DSTBEG,NSV_DSTEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_DSTDEPBEG,NSV_DSTDEPEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_SLTBEG,NSV_SLTEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_SLTDEPBEG,NSV_SLTDEPEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_PPBEG,NSV_PPEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
    #ifdef MNH_FOREFIRE
          DO JSV=NSV_FFBEG,NSV_FFEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
    #endif
          DO JSV=NSV_FIREBEG,NSV_FIREEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_CSBEG,NSV_CSEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_SNWBEG,NSV_SNWEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
         END IF
      END IF
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_COUPL = XT_COUPL + ZTIME2 - ZTIME1
    !
    !-------------------------------------------------------------------------------
    !
    !
    !
    !*      8 Bis . Blowing snow scheme
    !              ---------
    !
    IF ( LBLOWSNOW ) THEN
     CALL BLOWSNOW( XTSTEP, NRR, XPABST, XTHT, XRT, XZZ, XRHODREF,        &
                    XRHODJ, XEXNREF, XRRS, XRTHS, XSVT, XRSVS, XSNWSUBL3D )
    ENDIF
    !
    !-----------------------------------------------------------------------
    !
    !*       8 Ter  VISCOSITY (no-slip condition inside)
    !              ---------
    !
    !
    IF ( LVISC ) THEN
    !
    ZTIME1 = ZTIME2
    !
       CALL VISCOSITY(CLBCX, CLBCY, NRR, NSV, XMU_V,XPRANDTL,         &
                      LVISC_UVW,LVISC_TH,LVISC_SV,LVISC_R,            &
                      LDRAG,    &
                      XUT, XVT, XWT, XTHT, XRT, XSVT,                 &
                      XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY,           &
                      XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS,XDRAG )
    !
    ENDIF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_VISC = XT_VISC + ZTIME2 - ZTIME1
    !!
    !-------------------------------------------------------------------------------
    !
    !*       9.    ADVECTION
    !              ---------
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    !
    !
    CALL MPPDB_CHECK3DM("before ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ",PRECISION,&
                       &  XUT, XVT, XWT, XTHT, XTKET,XRHODJ)
    
     CALL ADVECTION_METSV ( TPBAKFILE, CUVW_ADV_SCHEME,                    &
    
    VIE Benoit's avatar
    VIE Benoit committed
                     CMET_ADV_SCHEME, CSV_ADV_SCHEME, CCLOUD, NSPLIT,      &
                     LSPLIT_CFL, XSPLIT_CFL, LCFL_WRIT,                    &
                     CLBCX, CLBCY, NRR, NSV, TDTCUR, XTSTEP,               &
                     XUT, XVT, XWT, XTHT, XRT, XTKET, XSVT, XPABST,        &
                     XTHVREF, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY,        &
                     XRTHS, XRRS, XRTKES, XRSVS,                           &
                     XRTHS_CLD, XRRS_CLD, XRSVS_CLD, XRTKEMS               )
    CALL MPPDB_CHECK3DM("after  ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ ",PRECISION,&
                       &  XUT, XVT, XWT, XTHT, XTKET,XRHODJ)
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_ADV = XT_ADV + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    ZRWS = XRWS
    !
    CALL GRAVITY_IMPL ( CLBCX, CLBCY, NRR, NRRL, NRRI,XTSTEP,            &
                     XTHT, XRT, XTHVREF, XRHODJ, XRWS, XRTHS, XRRS,      &
                     XRTHS_CLD, XRRS_CLD                                 )   
    !
    ! At the initial instant the difference with the ref state creates a 
    ! vertical velocity production that must not be advected as it is 
    ! compensated by the pressure gradient
    !
    IF (KTCOUNT == 1 .AND. CCONF=='START') XRWS_PRES = - (XRWS - ZRWS) 
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_GRAV = XT_GRAV + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    ! 
    IF ( LIBM .AND. CIBM_ADV=='FORCIN' ) THEN
      !
      ZTIME1=ZTIME2
      !
      CALL IBM_FORCING_ADV   (XRUS,XRVS,XRWS)
      !
      CALL SECOND_MNH2(ZTIME2)
      !
      XT_IBM_FORC = XT_IBM_FORC + ZTIME2 - ZTIME1
      !
    ENDIF
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    !MPPDB_CHECK_LB=.TRUE.
    CALL MPPDB_CHECK3DM("before ADVEC_UVW:XU/V/W/TH/TKE/T,XRHODJ,XRU/V/Ws",PRECISION,&
                       &  XUT, XVT, XWT, XTHT, XTKET,XRHODJ,XRUS,XRVS,XRWS)
    IF ((CUVW_ADV_SCHEME(1:3)=='CEN') .AND. (CTEMP_SCHEME == 'LEFR')) THEN
      IF (CUVW_ADV_SCHEME=='CEN4TH') THEN
        NULLIFY(TZFIELDC_ll)
        NULLIFY(TZHALO2C_ll)
          CALL ADD3DFIELD_ll( TZFIELDC_ll, XUT, 'MODEL_n::XUT' )
          CALL ADD3DFIELD_ll( TZFIELDC_ll, XVT, 'MODEL_n::XVT' )
          CALL ADD3DFIELD_ll( TZFIELDC_ll, XWT, 'MODEL_n::XWT' )
          CALL INIT_HALO2_ll(TZHALO2C_ll,3,IIU,IJU,IKU)
          CALL UPDATE_HALO_ll(TZFIELDC_ll,IINFO_ll)
          CALL UPDATE_HALO2_ll(TZFIELDC_ll, TZHALO2C_ll, IINFO_ll)
      END IF
     CALL ADVECTION_UVW_CEN(CUVW_ADV_SCHEME,                &
                               CLBCX, CLBCY,                           &
                               XTSTEP, KTCOUNT,                        &
                               XUM, XVM, XWM, XDUM, XDVM, XDWM,        &
                               XUT, XVT, XWT,                          &
                               XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY,   &
                               XRUS,XRVS, XRWS,                        &
                               TZHALO2C_ll                             )
      IF (CUVW_ADV_SCHEME=='CEN4TH') THEN
        CALL CLEANLIST_ll(TZFIELDC_ll)
        NULLIFY(TZFIELDC_ll)
        CALL  DEL_HALO2_ll(TZHALO2C_ll)
        NULLIFY(TZHALO2C_ll)
      END IF
    ELSE
    
      CALL ADVECTION_UVW(CUVW_ADV_SCHEME, CTEMP_SCHEME,                  &
                     NWENO_ORDER, LSPLIT_WENO,                           &
                     CLBCX, CLBCY, XTSTEP,                               &
                     XUT, XVT, XWT,                                      &
                     XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY,               &
                     XRUS, XRVS, XRWS,                                   &
                     XRUS_PRES, XRVS_PRES, XRWS_PRES                     )
    END IF
    !
    CALL MPPDB_CHECK3DM("after  ADVEC_UVW:XU/V/W/TH/TKE/T,XRHODJ,XRU/V/Ws",PRECISION,&
                       &  XUT, XVT, XWT, XTHT, XTKET,XRHODJ,XRUS,XRVS,XRWS)
    !MPPDB_CHECK_LB=.FALSE.
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_ADVUVW = XT_ADVUVW + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    IF (NMODEL_CLOUD==IMI .AND. CTURBLEN_CLOUD/='NONE') THEN
    
      CALL TURB_CLOUD_INDEX( XTSTEP, TPBAKFILE,                               &
    
    VIE Benoit's avatar
    VIE Benoit committed
                             LTURB_DIAG, NRRI,                                &
                             XRRS, XRT, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, &
                             XCEI                                             )
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    !*       18.    LATERAL BOUNDARY CONDITION FOR THE NORMAL VELOCITY
    !               --------------------------------------------------
    !
    ZTIME1 = ZTIME2
    !
    CALL MPPDB_CHECK3DM("before RAD_BOUND :XRU/V/WS",PRECISION,XRUS,XRVS,XRWS)
    ZRUS=XRUS
    ZRVS=XRVS
    ZRWS=XRWS
    !
    if ( .not. l1d ) then
      if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U), 'PRES', xrus(:, :, :) )
      if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V), 'PRES', xrvs(:, :, :) )
      if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W), 'PRES', xrws(:, :, :) )
    end if
    !
    CALL MPPDB_CHECK3DM("before RAD_BOUND : other var",PRECISION,XUT,XVT,XRHODJ,XTKET)
    CALL MPPDB_CHECKLB(XLBXUM,"modeln XLBXUM",PRECISION,'LBXU',NRIMX)
    CALL MPPDB_CHECKLB(XLBYVM,"modeln XLBYVM",PRECISION,'LBYV',NRIMY)
    CALL MPPDB_CHECKLB(XLBXUS,"modeln XLBXUS",PRECISION,'LBXU',NRIMX)
    CALL MPPDB_CHECKLB(XLBYVS,"modeln XLBYVS",PRECISION,'LBYV',NRIMY)
    !
      CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX,           &
                    XTSTEP,                                  &
                    XDXHAT, XDYHAT, XZHAT,                   &
                    XUT, XVT,                                &
                    XLBXUM, XLBYVM, XLBXUS, XLBYVS,          &
                    XFLUCTUNW,XFLUCTVNN,XFLUCTUNE,XFLUCTVNS, &
                    XCPHASE, XCPHASE_PBL, XRHODJ,            &
                    XTKET,XRUS, XRVS, XRWS                   )
    ZRUS=XRUS-ZRUS
    ZRVS=XRVS-ZRVS
    ZRWS=XRWS-ZRWS
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_RAD_BOUND = XT_RAD_BOUND + ZTIME2 - ZTIME1
    !
    !-------------------------------------------------------------------------------
    !
    !*       19.    PRESSURE COMPUTATION
    !               --------------------
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    ZPABST = XPABST
    !
    IF(.NOT. L1D) THEN
    !
    CALL MPPDB_CHECK3DM("before pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS)
      XRUS_PRES = XRUS
      XRVS_PRES = XRVS
      XRWS_PRES = XRWS
    !
      CALL PRESSUREZ( CLBCX,CLBCY,CPRESOPT,NITR,LITRADJ,KTCOUNT, XRELAX,IMI, &
                      XRHODJ,XDXX,XDYY,XDZZ,XDZX,XDZY,XDXHATM,XDYHATM,XRHOM, &
                      XAF,XBFY,XCF,XTRIGSX,XTRIGSY,NIFAXX,NIFAXY,            &
                      NRR,NRRL,NRRI,XDRYMASST,XREFMASS,XMASS_O_PHI0,         &
                      XTHT,XRT,XRHODREF,XTHVREF,XRVREF,XEXNREF, XLINMASS,    &
                      XRUS, XRVS, XRWS, XPABST,                              &
                      XBFB,&
                      XBF_SXP2_YP1_Z) !JUAN Z_SPLITING
    !
      XRUS_PRES = XRUS - XRUS_PRES + ZRUS
      XRVS_PRES = XRVS - XRVS_PRES + ZRVS
      XRWS_PRES = XRWS - XRWS_PRES + ZRWS
      CALL MPPDB_CHECK3DM("after pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS)
    !
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_PRESS = XT_PRESS + ZTIME2 - ZTIME1 &
               - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    !*       20.    CHEMISTRY/AEROSOLS
    !               ------------------
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    IF (LUSECHEM) THEN
      CALL CH_MONITOR_n(ZWETDEPAER,KTCOUNT,XTSTEP, ILUOUT, NVERB)
    END IF
    !
    ! For inert aerosol (dust and sea salt) => aer_monitor_n
    IF ((LDUST).OR.(LSALT)) THEN
    !
    ! tests to see if any cloud exists
    !   
        GCLD=.TRUE.
        IF (GCLD .AND. NRR.LE.3 ) THEN 
          IF( MAX(MAXVAL(XCLDFR(:,:,:)),MAXVAL(XICEFR(:,:,:))).LE. 1.E-10 .AND. GCLOUD_ONLY ) THEN
              GCLD = .FALSE.                ! only the cloudy verticals would be 
                                            ! refreshed but there is no clouds 
          END IF
        END IF
    !
        IF (GCLD .AND. NRR.GE.4 ) THEN 
          IF( CCLOUD(1:3)=='ICE' )THEN
            IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN(2) .AND.             &
                MAXVAL(XRT(:,:,:,4)).LE.XRTMIN(4) .AND. GCLOUD_ONLY ) THEN
                GCLD = .FALSE.            ! only the cloudy verticals would be 
                                          ! refreshed but there is no cloudwater and ice
            END IF
          END IF
          IF( CCLOUD=='C3R5' )THEN
            IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_C1R3(2) .AND.             &
                MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_C1R3(4) .AND. GCLOUD_ONLY ) THEN
                GCLD = .FALSE.            ! only the cloudy verticals would be 
                                          ! refreshed but there is no cloudwater and ice
            END IF
          END IF
          IF( CCLOUD=='LIMA' )THEN
            IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_LIMA(2) .AND.             &
                MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_LIMA(4) .AND. GCLOUD_ONLY ) THEN
                GCLD = .FALSE.            ! only the cloudy verticals would be 
                                          ! refreshed but there is no cloudwater and ice
            END IF
          END IF
        END IF
    
    !
            CALL AER_MONITOR_n(KTCOUNT,XTSTEP, ILUOUT, NVERB, GCLD)
    END IF
    !
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_CHEM = XT_CHEM + ZTIME2 - ZTIME1 &
          - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    ZTIME = ZTIME + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS
    
    !-------------------------------------------------------------------------------
    !
    !*       20.    WATER MICROPHYSICS
    !               ------------------
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
    !
      IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' .OR. CCLOUD == 'C3R5' &
                                                 .OR. CCLOUD == "LIMA" ) THEN
        IF ( LFORCING ) THEN
          XWT_ACT_NUC(:,:,:) = XWT(:,:,:) + XWTFRC(:,:,:)
        ELSE
          XWT_ACT_NUC(:,:,:) = XWT(:,:,:)
        END IF
        IF (CTURB /= 'NONE' ) THEN
         IF ( ((CCLOUD=='C2R2'.OR.CCLOUD=='KHKO').AND.LACTTKE) .OR. (CCLOUD=='LIMA'.AND.MACTTKE) ) THEN 
           XWT_ACT_NUC(:,:,:) = XWT_ACT_NUC(:,:,:) +  (2./3. * XTKET(:,:,:))**0.5
         ELSE
           XWT_ACT_NUC(:,:,:) = XWT_ACT_NUC(:,:,:) 
         ENDIF
        ENDIF
      ELSE
        XWT_ACT_NUC(:,:,:) = 0.
      END IF
    !
      XRTHS_CLD  = XRTHS
      XRRS_CLD   = XRRS
      XRSVS_CLD  = XRSVS
      IF (CSURF=='EXTE') THEN
        ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
        ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
        ZSEA(:,:) = 0.
        ZTOWN(:,:)= 0.
        CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:))
        CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
                              NSPLITG, IMI, KTCOUNT,                               &
    
                              CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM,               &
    
    VIE Benoit's avatar
    VIE Benoit committed
                              LSUBG_COND,LSIGMAS,CSUBG_AUCV,XTSTEP,                &
                              XZZ, XRHODJ, XRHODREF, XEXNREF,                      &
                              ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
                              XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS,            &
                              XSVT, XRSVS,                                         &
                              XSRCT, XCLDFR,XICEFR, XCIT,                          &
                              LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI,   &
                              LCONVHG, XCF_MF,XRC_MF, XRI_MF,                      &
                              XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D,           &
                              XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D,   &
                              XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, &
                              XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR,       &
                              XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF,              &
                              ZSEA, ZTOWN                                          )
        DEALLOCATE(ZTOWN)
        DEALLOCATE(ZSEA)
      ELSE
        CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
                              NSPLITG, IMI, KTCOUNT,                               &
    
                              CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM,               &
    
    VIE Benoit's avatar
    VIE Benoit committed
                              LSUBG_COND,LSIGMAS,CSUBG_AUCV,                       &
                              XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF,               &
                              ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
                              XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS,            &
                              XSVT, XRSVS,                                         &
                              XSRCT, XCLDFR, XICEFR, XCIT,                         &
                              LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI,   &
                              LCONVHG, XCF_MF,XRC_MF, XRI_MF,                      &
                              XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D,           &
                              XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D,   &
                              XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, &
                              XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR,       &
                              XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF               )
      END IF
      XRTHS_CLD  = XRTHS - XRTHS_CLD
      XRRS_CLD   = XRRS  - XRRS_CLD
      XRSVS_CLD  = XRSVS - XRSVS_CLD
    !
      IF (CCLOUD /= 'REVE' ) THEN
        XACPRR = XACPRR + XINPRR * XTSTEP
              IF ( (CCLOUD(1:3) == 'ICE' .AND. LSEDIC ) .OR.                     &
            ((CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' &
                               .OR. CCLOUD == 'LIMA' ) .AND. KSEDC ) )    THEN
          XACPRC = XACPRC + XINPRC * XTSTEP
          IF (LDEPOSC .OR. LDEPOC) XACDEP = XACDEP + XINDEP * XTSTEP
        END IF
        IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. &
                                     (CCLOUD == 'LIMA' .AND. NMOM_I.GE.1 ) ) THEN
          XACPRS = XACPRS + XINPRS * XTSTEP