Skip to content
Snippets Groups Projects
modeln.f90 80.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • !
    !-------------------------------------------------------------------------------
    !
    !*       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(     CLUOUT,NRR,NSV,KTCOUNT,DPTR_XRHODJ,IMI,XTSTEP,        &        
           DPTR_XUM ,DPTR_XVM ,DPTR_XWM , DPTR_XTHM, DPTR_XRM, DPTR_XTKEM, DPTR_XSVM,              &        
           DPTR_XRUS,DPTR_XRVS,DPTR_XRWS,DPTR_XRTHS,DPTR_XRRS,DPTR_XRTKES,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 ( LFORCING ) THEN
    
      CALL FORCING(XTSTEP,LUSERV,XRHODJ,XCORIOZ,XZHAT,XZZ,TDTCUR,&
    
                   XUFRC_PAST, XVFRC_PAST,                &
                   XUT,XVT,XWT,XTHT,XTKET,XRT,XSVT,       &
                   XRUS,XRVS,XRWS,XRTHS,XRTKES,XRRS,XRSVS,IMI)
    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(TZFIELDT_ll, IINFO_ll)
    
      CALL UPDATE_HALO2_ll(TZFIELDT_ll, TZHALO2T_ll, IINFO_ll)
    
      IF ( .NOT. LSTEADYLS ) THEN
         CALL UPDATE_HALO_ll(TZLSFIELD_ll, IINFO_ll)
         CALL UPDATE_HALO2_ll(TZLSFIELD_ll, TZLSHALO2_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,               &
    
                      TZHALO2T_ll, TZLSHALO2_ll,XZDIFFU_HALO2      )
    
    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
    
    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
    
    
    IF (CELEC .NE. 'NONE') THEN
      XRSVS(:,:,:,NSV_ELECBEG) = MAX(XRSVS(:,:,:,NSV_ELECBEG),0.)
      XRSVS(:,:,:,NSV_ELECEND) = MAX(XRSVS(:,:,:,NSV_ELECEND),0.)
    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,                                      &
    #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
    !
    #ifdef MNH_NCWRIT
    IF ( LNETCDF .AND. GCLOSE_OUT ) THEN
      DEF_NC = .TRUE.
      NC_WRITE=LNETCDF
      NC_FILE='phy'
      LLFIFM = .FALSE.
    
      CALL WRITE_PHYS_PARAM(YFMFILE)
    
      DEF_NC=.FALSE.
      LLFIFM = .TRUE.
    END IF
    
    CALL PHYS_PARAM_n(KTCOUNT,YFMFILE, GCLOSE_OUT,                        &
                      XT_RAD,XT_SHADOWS,XT_DCONV,XT_GROUND,XT_MAFL,       &
                      XT_DRAG,XT_TURB,XT_TRACER,                          &
                      XT_CHEM,ZTIME,GMASKkids)
    
    DEF_NC=.TRUE.
    #else
    
    CALL PHYS_PARAM_n(KTCOUNT,YFMFILE, GCLOSE_OUT,                        &
                      XT_RAD,XT_SHADOWS,XT_DCONV,XT_GROUND,XT_MAFL,       &
                      XT_DRAG,XT_TURB,XT_TRACER,                          &
                      XT_CHEM,ZTIME,GMASKkids)
    
    #endif                  
    !
    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
    !
    DO JOUT = 1,NOUT_NUMB
      IF (KTCOUNT == NOUT_TIMES(JOUT)) THEN
        IF (CSURF=='EXTE') THEN
          CALL GOTO_SURFEX(IMI,.TRUE.)
          CALL DIAG_SURF_ATM_n('MESONH')
    #ifdef MNH_NCWRIT
          NC_WRITE=LNETCDF
          NC_FILE='sf2'
          CALL WRITE_DIAG_SURF_ATM_n('MESONH','ALL')
          IF ( LNETCDF ) THEN
            DEF_NC=.FALSE.
            CALL WRITE_DIAG_SURF_ATM_n('MESONH','ALL')
            DEF_NC=.TRUE.
            NC_WRITE = .FALSE.
          END IF
    #else
          CALL WRITE_DIAG_SURF_ATM_n('MESONH','ALL')
    #endif
        END IF
      END IF
    END DO
    !
    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(CLUOUT,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,XDRYMASST,                     &
                 XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,          &
                 XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,          &
                 XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,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_CSBEG,NSV_CSEND
            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
    !
    !-------------------------------------------------------------------------------
    !
    
    !
    !*       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 ( CLUOUT, YFMFILE, GCLOSE_OUT,CUVW_ADV_SCHEME, &
    
                     CMET_ADV_SCHEME, CSV_ADV_SCHEME, CCLOUD, NSPLIT,    &
    
                     LSPLIT_CFL, XSPLIT_CFL, LCFL_WRIT,                  &
                     CLBCX, CLBCY, NRR, NSV, KTCOUNT, 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
    ! 
    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') THEN
    
        NULLIFY(TZFIELDC_ll)
        NULLIFY(TZHALO2C_ll)
          CALL ADD3DFIELD_ll(TZFIELDC_ll, XUT)
          CALL ADD3DFIELD_ll(TZFIELDC_ll, XVT)
          CALL ADD3DFIELD_ll(TZFIELDC_ll, 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                             )
    
        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, NSPLIT,                                &
                     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,YFMFILE,CLUOUT,                    &
                            LTURB_DIAG,GCLOSE_OUT,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
    
      CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX,           &
    
                    XTSTEP,                                  &
                    XDXHAT, XDYHAT, XZHAT,                   &
                    XUT, XVT,                                &
    
                    XLBXUM, XLBYVM, XLBXUS, XLBYVS,          &
                    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.
    !
    !
    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( CLUOUT,                                                &
    
                      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
    !
    
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_PRESS = XT_PRESS + ZTIME2 - ZTIME1 &
               - 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' ) THEN
        IF ( LFORCING ) THEN
          ZWT_ACT_NUC(:,:,:) = XWT(:,:,:) + XWTFRC(:,:,:)
        ELSE
          ZWT_ACT_NUC(:,:,:) = XWT(:,:,:)
        END IF
        IF (CTURB /= 'NONE' ) THEN
          ZWT_ACT_NUC(:,:,:) = ZWT_ACT_NUC(:,:,:) + (2./3. * XTKET(:,:,:))**0.5
        ENDIF
      ELSE
        ZWT_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(:,:))
    #ifdef MNH_NCWRIT
        NC_FILE='phy'
        DEF_NC=.FALSE.
        CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
                              NSPLITG, IMI, KTCOUNT,                               &
                              CLBCX,CLBCY,YFMFILE, CLUOUT, CRAD, CTURBDIM,         &
    
                              GCLOSE_OUT, LSUBG_COND,LSIGMAS,CSUBG_AUCV,XTSTEP,    &
                              XZZ, XRHODJ, XRHODREF, XEXNREF,                      &
                              XPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
    
                              XPABSM, ZWT_ACT_NUC,XDTHRAD, XRTHS, XRRS,            &
    
                              XSVT, XRSVS,                                         &
                              XSRCT, XCLDFR,XCIT,                                  &
    
                              LSEDIC,LACTIT, LSEDC, LSEDI, LRAIN, LWARM, LHHONI,   &
    
                              XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D,           &
                              XINPRS,ZINPRS3D, XINPRG,ZINPRG3D,                    &
                              XINPRH,ZINPRH3D, XSOLORG , XMI,                      &
                              ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH,         &
                              ZSEA, ZTOWN    )
    
        DEF_NC=.TRUE.
    #else    
        CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
                              NSPLITG, IMI, KTCOUNT,                               &
                              CLBCX,CLBCY,YFMFILE, CLUOUT, CRAD, CTURBDIM,         &
    
                              GCLOSE_OUT, LSUBG_COND,LSIGMAS,CSUBG_AUCV,XTSTEP,    &
                              XZZ, XRHODJ, XRHODREF, XEXNREF,                      &
                              XPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
    
                              XPABSM, ZWT_ACT_NUC,XDTHRAD, XRTHS, XRRS,            &
    
                              XSVT, XRSVS,                                         &
                              XSRCT, XCLDFR,XCIT,                                  &
    
                              LSEDIC,LACTIT, LSEDC, LSEDI, LRAIN, LWARM, LHHONI,   &
    
                              XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D,           &
                              XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D,   &
                              XSOLORG , XMI,                                       &
                              ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH,         &
                              ZSEA, ZTOWN    )
    
    #endif
        DEALLOCATE(ZTOWN)
      ELSE
    #ifdef MNH_NCWRIT
        NC_FILE='phy'
        DEF_NC=.FALSE.
        CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
                              NSPLITG, IMI, KTCOUNT,                               &
                              CLBCX,CLBCY,YFMFILE, CLUOUT, CRAD, CTURBDIM,         &
    
                              GCLOSE_OUT, LSUBG_COND,LSIGMAS,CSUBG_AUCV,           &
    
                              XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF,               &
    
                              XPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
    
                              XPABSM, ZWT_ACT_NUC,XDTHRAD, XRTHS, XRRS,            &
    
                              XSVT, XRSVS,                                         &
                              XSRCT, XCLDFR,XCIT,                                  &
    
                              LSEDIC, LACTIT, LSEDC, LSEDI, LRAIN, LWARM, LHHONI,  &
    
                              XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D,             &
                              XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D,   &
                              XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH)
    
        DEF_NC=.TRUE.
    #else
        CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
                              NSPLITG, IMI, KTCOUNT,                               &
                              CLBCX,CLBCY,YFMFILE, CLUOUT, CRAD, CTURBDIM,         &
    
                              GCLOSE_OUT, LSUBG_COND,LSIGMAS,CSUBG_AUCV,           &
    
                              XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF,               &
    
                              XPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
    
                              XPABSM, ZWT_ACT_NUC,XDTHRAD, XRTHS, XRRS,            &
    
                              XSVT, XRSVS,                                         &
                              XSRCT, XCLDFR,XCIT,                                  &
    
                              LSEDIC, LACTIT, LSEDC, LSEDI, LRAIN, LWARM, LHHONI,  &
    
                              XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D,             &
                              XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D,   &
                              XSOLORG, XMI,                             &
                              ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH          )
    
      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') &
    
          XACPRC = XACPRC + XINPRC * XTSTEP
    
        IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5') THEN
          XACPRS = XACPRS + XINPRS * XTSTEP
          XACPRG = XACPRG + XINPRG * XTSTEP
          IF (CCLOUD == 'ICE4') XACPRH = XACPRH + XINPRH * XTSTEP          
        END IF
      END IF
    !
    ! It is necessary that SV_C2R2 and SV_C1R3 are contiguous in the preceeding CALL
    !
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_CLOUD = XT_CLOUD + ZTIME2 - ZTIME1 &
               - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    !*       21.    CLOUD ELECTRIFICATION AND LIGHTNING FLASHES
    !               -------------------------------------------
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    XTIME_LES_BU_PROCESS = 0.
    !
    IF (CELEC /= 'NONE' .AND. (CCLOUD(1:3) == 'ICE')) THEN
      ZWT_ACT_NUC(:,:,:) = 0.
    !
    
      XRTHS_CLD = XRTHS
      XRRS_CLD  = XRRS
    
      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_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD,                     &
    
                              NRR, NSPLITR, IMI, KTCOUNT, OEXIT,             &
    
                              CLBCX, CLBCY, CRAD, CTURBDIM,                  &
                              LSUBG_COND, LSIGMAS,VSIGQSAT,CSUBG_AUCV,       &
    
                              XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF,        &
                              XPABST, XTHT, XRTHS, XWT,  XRT, XRRS,          &
                              XSVT, XRSVS, XCIT,                             &
                              XSIGS, XSRCT, XCLDFR, XMFCONV, XCF_MF, XRC_MF, &
    
                              XRI_MF, LSEDIC, LWARM,                         &
                              XINPRC, XINPRR, XINPRR3D, XEVAP3D,             &
                              XINPRS, XINPRG, XINPRH,                        &
                              ZSEA, ZTOWN                                    )
        DEALLOCATE(ZTOWN)
      ELSE
        CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD,                     &
    
                              NRR, NSPLITR, IMI, KTCOUNT, OEXIT,             &
    
                              CLBCX, CLBCY, CRAD, CTURBDIM,                  &
                              LSUBG_COND, LSIGMAS,VSIGQSAT, CSUBG_AUCV,      &
    
                              XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF,        &
                              XPABST, XTHT, XRTHS, XWT,                      &
                              XRT, XRRS, XSVT, XRSVS, XCIT,                  &
                              XSIGS, XSRCT, XCLDFR, XMFCONV, XCF_MF, XRC_MF, &
    
                              XRI_MF, LSEDIC, LWARM,                         &
                              XINPRC, XINPRR, XINPRR3D, XEVAP3D,             &
                              XINPRS, XINPRG, XINPRH                         )
      END IF
    
      XRTHS_CLD = XRTHS - XRTHS_CLD
      XRRS_CLD  = XRRS  - XRRS_CLD
      XRSVS_CLD = XRSVS - XRSVS_CLD
    
    !
      XACPRR = XACPRR + XINPRR * XTSTEP
      IF ((CCLOUD(1:3) == 'ICE' .AND. LSEDIC)) & 
           XACPRC = XACPRC + XINPRC * XTSTEP
      IF (CCLOUD(1:3) == 'ICE') THEN
        XACPRS = XACPRS + XINPRS * XTSTEP
        XACPRG = XACPRG + XINPRG * XTSTEP
        IF (CCLOUD == 'ICE4') XACPRH = XACPRH + XINPRH * XTSTEP          
      END IF
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_ELEC = XT_ELEC + ZTIME2 - ZTIME1 &
               - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    !*       21.    L.E.S. COMPUTATIONS
    !               -------------------
    !
    ZTIME1 = ZTIME2
    !
    CALL LES_n
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_SPECTRA = XT_SPECTRA + ZTIME2 - ZTIME1 + XTIME_LES_BU + XTIME_LES
    !
    !-------------------------------------------------------------------------------
    !
    !*       21. bis    MEAN_UM
    !               --------------------
    !
    IF (LMEAN_FIELD) THEN
    
       CALL MEAN_FIELD(XUT, XVT, XWT, XTHT, XTKET, XPABST)
    
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    !*       22.    UPDATE HALO OF EACH SUBDOMAINS FOR TIME T+DT
    !               --------------------------------------------
    !
    ZTIME1 = ZTIME2
    !
    
    CALL EXCHANGE (XTSTEP,NRR,NSV,XRHODJ,TZFIELDS_ll,     &
    
                   XRUS, XRVS,XRWS,XRTHS,XRRS,XRTKES,XRSVS)
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_HALO = XT_HALO + ZTIME2 - ZTIME1
    !
    !-------------------------------------------------------------------------------
    !
    !*       23.    TEMPORAL SWAPPING
    !               -----------------
    !
    ZTIME1 = ZTIME2
    XTIME_BU_PROCESS = 0.
    !
    
    CALL ENDSTEP  ( XTSTEP,NRR,NSV,KTCOUNT,IMI,               &
                    CUVW_ADV_SCHEME,XRHODJ,                   &
    
                    XRUS,XRVS,XRWS,XDRYMASSS,                 &
                    XRTHS,XRRS,XRTKES,XRSVS,                  &
                    XLSUS,XLSVS,XLSWS,                        &
                    XLSTHS,XLSRVS,                            &
                    XLBXUS,XLBXVS,XLBXWS,                     &
                    XLBXTHS,XLBXRS,XLBXTKES,XLBXSVS,          &
                    XLBYUS,XLBYVS,XLBYWS,                     &
                    XLBYTHS,XLBYRS,XLBYTKES,XLBYSVS,          &
    
                    XUM,XVM,XWM,                              &
    
                    XUT,XVT,XWT,XPABST,XDRYMASST,             &
    
                    XTHT, XRT, XTHM, XRCM, XPABSM,XTKET, XSVT,&
    
                    XLSUM,XLSVM,XLSWM,                        &
                    XLSTHM,XLSRVM,                            &
                    XLBXUM,XLBXVM,XLBXWM,                     &
                    XLBXTHM,XLBXRM,XLBXTKEM,XLBXSVM,          &
                    XLBYUM,XLBYVM,XLBYWM,                     &
    
                    XLBYTHM,XLBYRM,XLBYTKEM,XLBYSVM           )
    
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_STEP_SWA = XT_STEP_SWA + ZTIME2 - ZTIME1 - XTIME_BU_PROCESS
    !
    !-------------------------------------------------------------------------------
    !
    !*       24.1    BALLOON and AIRCRAFT
    !               --------------------
    !
    ZTIME1 = ZTIME2
    !
    IF (LFLYER)                                                                   &
      CALL AIRCRAFT_BALLOON(CLUOUT, XTSTEP,                                       &
                          TDTEXP, TDTMOD, TDTSEG, TDTCUR,                         &
                          XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI,              &
                          XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD,  &
    
                          XRHODREF,XCIT,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG,       &
                          ZSPEEDH,PSEA=ZSEA(:,:))
    
    
    
    !-------------------------------------------------------------------------------
    !
    !*       24.2    STATION (observation diagnostic)
    !               --------------------------------
    !
    IF (LSTATION)                                                            &
      CALL STATION_n(CLUOUT, XTSTEP,                                         &
                     TDTEXP, TDTMOD, TDTSEG, TDTCUR,                         &
                     XXHAT, XYHAT, XZZ,                                      &
                     XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST   )
    !
    !---------------------------------------------------------
    !
    !*       24.3    PROFILER (observation diagnostic)
    !               ---------------------------------
    !
    IF (LPROFILER)                                                           &
      CALL PROFILER_n(CLUOUT, XTSTEP,                                        &
                      TDTEXP, TDTMOD, TDTSEG, TDTCUR,                        &
                      XXHAT, XYHAT, XZZ,XRHODREF,                            &
                      XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, &
    
                      XAER, XCLDFR, XCIT ,                                   &
                      ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH,           &
                      ZINPRC3D,XINPRR3D,ZINPRS3D,ZINPRG3D,ZINPRH3D           )
    
    !
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_STEP_MISC = XT_STEP_MISC + ZTIME2 - ZTIME1
    !
    !-------------------------------------------------------------------------------
    !
    !*       24.4   deallocation of observation diagnostics
    !               ---------------------------------------
    !
    CALL END_DIAG_IN_RUN
    !
    !-------------------------------------------------------------------------------
    !
    !
    !*       25.    STORAGE OF BUDGET FIELDS
    !               ------------------------
    !
    ZTIME1 = ZTIME2
    !
    IF (NBUMOD==IMI .AND. CBUTYPE/='NONE') THEN
    
      CALL ENDSTEP_BUDGET(CFMDIAC,CLUOUT,KTCOUNT,TDTCUR,TDTMOD,XTSTEP,NSV)
    
    END IF
    !
    CALL SECOND_MNH2(ZTIME2)
    !
    XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU
    !
    !-------------------------------------------------------------------------------
    !
    !*       26.    FM FILE CLOSURE
    !               ---------------
    !
    IF (GCLOSE_OUT) THEN
      GCLOSE_OUT=.FALSE.
      CALL FMCLOS_ll(YFMFILE,'KEEP',CLUOUT,IRESP)
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    !*       27.    CURRENT TIME REFRESH
    
    !               --------------------
    
    !
    TDTCUR%TIME=TDTCUR%TIME + XTSTEP
    CALL ADD_FORECAST_TO_DATE(TDTCUR%TDATE%YEAR, &
                              TDTCUR%TDATE%MONTH,&
                              TDTCUR%TDATE%DAY,  &
                              TDTCUR%TIME        )
    !
    !-------------------------------------------------------------------------------
    !
    !*       28.    CPU ANALYSIS
    !               ------------
    !
    CALL SECOND_MNH2(ZTIME2)
    XT_START=XT_START+ZTIME2-ZEND
    !
    !
    IF ( KTCOUNT == NSTOP .AND. IMI==1) THEN
      OEXIT=.TRUE.
    END IF
    !
    IF (OEXIT) THEN
    !
    #ifdef MNH_NCWRIT
      NC_WRITE = LNETCDF