MODULE asmbkg
   !!======================================================================
   !!                       ***  MODULE asmtrj -> asmbkg  ***
   !! Assimilation trajectory interface: Write to file the background state and the model state trajectory
   !!======================================================================
   !! History :       ! 2007-03 (M. Martin)  Met. Office version
   !!                 ! 2007-04 (A. Weaver)  asm_trj_wri, original code
   !!                 ! 2007-03 (K. Mogensen)  Adapt to NEMOVAR and use IOM instead of IOIPSL
   !!                 ! 2007-04 (A. Weaver)  Name change (formally asmbkg.F90). Distinguish
   !!                                        background states in Jb term and at analysis time.
   !!                                        Include state trajectory routine (currently empty)
   !!                 ! 2007-07 (A. Weaver)  Add tke_rst and flt_rst for case nitbkg=0 
   !!                 ! 2009-03 (F. Vigilant)  Add hmlp (zdfmxl) for no tracer nmldp=2 
   !!                 ! 2009-06 (F. Vigilant) asm_trj_wri: special case when kt=nit000-1
   !!                 ! 2009-07 (F. Vigilant) asm_trj_wri: add computation of eiv at restart
   !!                 ! 2010-01 (A. Vidard) split asm_trj_wri into tam_trj_wri and asm_bkg_wri
   !!----------------------------------------------------------------------

   !!----------------------------------------------------------------------
   !!   asm_bkg_wri  : Write out the background state
   !!   asm_trj_wri  : Write out the model state trajectory (used with 4D-Var)
   !!----------------------------------------------------------------------
   USE oce                ! Dynamics and active tracers defined in memory
   USE sbc_oce            ! Ocean surface boundary conditions
   USE zdf_oce            ! Vertical mixing variables
   USE zdfddm             ! Double diffusion mixing parameterization
   USE ldftra             ! Lateral diffusion: eddy diffusivity coefficients
   USE ldfslp             ! Lateral diffusion: slopes of neutral surfaces
   USE tradmp             ! Tracer damping
   USE zdftke             ! TKE vertical physics
   USE eosbn2             ! Equation of state (eos_bn2 routine)
   USE zdfmxl             ! Mixed layer depth
   USE dom_oce     , ONLY : ndastp, l_istiled
   USE in_out_manager     ! I/O manager
   USE iom                ! I/O module
   USE asmpar             ! Parameters for the assmilation interface
   USE zdfmxl             ! mixed layer depth
#if defined key_si3
   USE ice
#endif

   IMPLICIT NONE
   PRIVATE
   
   PUBLIC   asm_bkg_wri   !: Write out the background state

   !!----------------------------------------------------------------------
   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
   !! $Id: asmbkg.F90 15417 2021-10-20 14:16:29Z lovato $
   !! Software governed by the CeCILL license (see ./LICENSE)
   !!----------------------------------------------------------------------
CONTAINS

   SUBROUTINE asm_bkg_wri( kt, Kmm )
      !!-----------------------------------------------------------------------
      !!                  ***  ROUTINE asm_bkg_wri ***
      !!
      !! ** Purpose : Write to file the background state for later use in the
      !!              inner loop of data assimilation or for direct initialization
      !!              in the outer loop.
      !!
      !! ** Method  : Write out the background state for use in the Jb term
      !!              in the cost function and for use with direct initialization
      !!              at analysis time.
      !!-----------------------------------------------------------------------
      INTEGER, INTENT( IN ) :: kt               ! Current time-step
      INTEGER, INTENT( IN ) :: Kmm              ! time level index
      !
      CHARACTER (LEN=50) :: cl_asmbkg
      CHARACTER (LEN=50) :: cl_asmdin
      LOGICAL :: llok          ! Check if file exists
      INTEGER :: inum          ! File unit number
      REAL(wp) :: zdate        ! Date
      !!-----------------------------------------------------------------------


      IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN                       ! Do only on the last tile
          !                                !-------------------------------------------
          IF( kt == nitbkg_r ) THEN        ! Write out background at time step nitbkg_r
             !                             !-----------------------------------========
             !
             WRITE(cl_asmbkg, FMT='(A,".nc")' ) TRIM( c_asmbkg )
             cl_asmbkg = TRIM( cl_asmbkg )
             INQUIRE( FILE = cl_asmbkg, EXIST = llok )
             !
             IF( .NOT. llok ) THEN
                IF(lwp) WRITE(numout,*) ' Setting up assimilation background file '// TRIM( c_asmbkg )
                !
                !                                      ! Define the output file        
                CALL iom_open( c_asmbkg, inum, ldwrt = .TRUE. )
                !
                IF( nitbkg_r == nit000 - 1 ) THEN      ! Treat special case when nitbkg = 0
                   zdate = REAL( ndastp )
                   IF( ln_zdftke ) THEN                   ! read turbulent kinetic energy ( en )
                      IF(lwp) WRITE(numout,*) ' Reading TKE (en) from restart...'
                      CALL tke_rst( nit000, 'READ' )
                   ENDIF
                ELSE
                   zdate = REAL( ndastp )
                ENDIF
                !
                !                                      ! Write the information
                CALL iom_rstput( kt, nitbkg_r, inum, 'rdastp' , zdate                )
                CALL iom_rstput( kt, nitbkg_r, inum, 'un'     , uu(:,:,:,Kmm)        )
                CALL iom_rstput( kt, nitbkg_r, inum, 'vn'     , vv(:,:,:,Kmm)        )
                CALL iom_rstput( kt, nitbkg_r, inum, 'tn'     , ts(:,:,:,jp_tem,Kmm) )
                CALL iom_rstput( kt, nitbkg_r, inum, 'sn'     , ts(:,:,:,jp_sal,Kmm) )
                CALL iom_rstput( kt, nitbkg_r, inum, 'sshn'   , ssh(:,:,Kmm)         )
                IF( ln_zdftke )   CALL iom_rstput( kt, nitbkg_r, inum, 'en'     , en )
                !
                CALL iom_close( inum )
             ENDIF
             !
          ENDIF
    
          !                                !-------------------------------------------
          IF( kt == nitdin_r ) THEN        ! Write out background at time step nitdin_r
             !                             !-----------------------------------========
             !
             WRITE(cl_asmdin, FMT='(A,".nc")' ) TRIM( c_asmdin )
             cl_asmdin = TRIM( cl_asmdin )
             INQUIRE( FILE = cl_asmdin, EXIST = llok )
             !
             IF( .NOT. llok ) THEN
                IF(lwp) WRITE(numout,*) ' Setting up assimilation background file '// TRIM( c_asmdin )
                !
                !                                      ! Define the output file        
                CALL iom_open( c_asmdin, inum, ldwrt = .TRUE. )
                !
                IF( nitdin_r == nit000 - 1 ) THEN      ! Treat special case when nitbkg = 0
    
                   zdate = REAL( ndastp )
                ELSE
                   zdate = REAL( ndastp )
                ENDIF
                !
                !                                      ! Write the information
                CALL iom_rstput( kt, nitdin_r, inum, 'rdastp' , zdate                )
                CALL iom_rstput( kt, nitdin_r, inum, 'un'     , uu(:,:,:,Kmm)        )
                CALL iom_rstput( kt, nitdin_r, inum, 'vn'     , vv(:,:,:,Kmm)        )
                CALL iom_rstput( kt, nitdin_r, inum, 'tn'     , ts(:,:,:,jp_tem,Kmm) )
                CALL iom_rstput( kt, nitdin_r, inum, 'sn'     , ts(:,:,:,jp_sal,Kmm) )
                CALL iom_rstput( kt, nitdin_r, inum, 'sshn'   , ssh(:,:,Kmm)         )
#if defined key_si3
                IF( nn_ice == 2 ) THEN
    	            IF( ALLOCATED(at_i) ) THEN
                      CALL iom_rstput( kt, nitdin_r, inum, 'iceconc', at_i(:,:)   )
                   ELSE
    		            CALL ctl_warn('asm_bkg_wri: Ice concentration not written to background ',   &
    		               &          'as ice variable at_i not allocated on this timestep')
    	            ENDIF
                ENDIF
#endif
                !
                CALL iom_close( inum )
             ENDIF
             !
          ENDIF
      ENDIF ! check for last tile
      !                    
   END SUBROUTINE asm_bkg_wri

   !!======================================================================
END MODULE asmbkg
