source: branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ASM/asmbkg.F90 @ 7953

Last change on this file since 7953 was 7953, checked in by gm, 4 years ago

#1880 (HPC-09): add zdfphy (the ZDF manager) + remove all key_…

  • Property svn:keywords set to Id
File size: 7.9 KB
RevLine 
[3764]1MODULE asmbkg
2   !!======================================================================
3   !!                       ***  MODULE asmtrj -> asmbkg  ***
4   !! Assimilation trajectory interface: Write to file the background state and the model state trajectory
5   !!======================================================================
6   !! History :       ! 2007-03 (M. Martin)  Met. Office version
7   !!                 ! 2007-04 (A. Weaver)  asm_trj_wri, original code
8   !!                 ! 2007-03 (K. Mogensen)  Adapt to NEMOVAR and use IOM instead of IOIPSL
9   !!                 ! 2007-04 (A. Weaver)  Name change (formally asmbkg.F90). Distinguish
10   !!                                        background states in Jb term and at analysis time.
11   !!                                        Include state trajectory routine (currently empty)
12   !!                 ! 2007-07 (A. Weaver)  Add tke_rst and flt_rst for case nitbkg=0
13   !!                 ! 2009-03 (F. Vigilant)  Add hmlp (zdfmxl) for no tracer nmldp=2
14   !!                 ! 2009-06 (F. Vigilant) asm_trj_wri: special case when kt=nit000-1
15   !!                 ! 2009-07 (F. Vigilant) asm_trj_wri: add computation of eiv at restart
16   !!                 ! 2010-01 (A. Vidard) split asm_trj_wri into tam_trj_wri and asm_bkg_wri
17   !!----------------------------------------------------------------------
18
19   !!----------------------------------------------------------------------
20   !!   asm_bkg_wri  : Write out the background state
21   !!   asm_trj_wri  : Write out the model state trajectory (used with 4D-Var)
22   !!----------------------------------------------------------------------
23   USE oce                ! Dynamics and active tracers defined in memory
24   USE sbc_oce            ! Ocean surface boundary conditions
25   USE zdf_oce            ! Vertical mixing variables
26   USE zdfddm             ! Double diffusion mixing parameterization
[5836]27   USE ldftra             ! Lateral diffusion: eddy diffusivity coefficients
28   USE ldfslp             ! Lateral diffusion: slopes of neutral surfaces
[3764]29   USE tradmp             ! Tracer damping
30   USE zdftke             ! TKE vertical physics
31   USE eosbn2             ! Equation of state (eos_bn2 routine)
32   USE zdfmxl             ! Mixed layer depth
[6140]33   USE dom_oce     , ONLY :   ndastp
[3764]34   USE in_out_manager     ! I/O manager
35   USE iom                ! I/O module
36   USE asmpar             ! Parameters for the assmilation interface
37   USE zdfmxl             ! mixed layer depth
38#if defined key_lim2
39   USE ice_2
40#endif
41#if defined key_lim3
42   USE ice
43#endif
[6140]44
[3764]45   IMPLICIT NONE
46   PRIVATE
47   
48   PUBLIC   asm_bkg_wri   !: Write out the background state
49
50   !!----------------------------------------------------------------------
51   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
[5215]52   !! $Id$
[3764]53   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
54   !!----------------------------------------------------------------------
55CONTAINS
56
57   SUBROUTINE asm_bkg_wri( kt )
58      !!-----------------------------------------------------------------------
59      !!                  ***  ROUTINE asm_bkg_wri ***
60      !!
61      !! ** Purpose : Write to file the background state for later use in the
62      !!              inner loop of data assimilation or for direct initialization
63      !!              in the outer loop.
64      !!
65      !! ** Method  : Write out the background state for use in the Jb term
66      !!              in the cost function and for use with direct initialization
67      !!              at analysis time.
68      !!-----------------------------------------------------------------------
69      INTEGER, INTENT( IN ) :: kt               ! Current time-step
70      !
71      CHARACTER (LEN=50) :: cl_asmbkg
72      CHARACTER (LEN=50) :: cl_asmdin
73      LOGICAL :: llok          ! Check if file exists
74      INTEGER :: inum          ! File unit number
75      REAL(wp) :: zdate        ! Date
76      !!-----------------------------------------------------------------------
77
78      !                                !-------------------------------------------
79      IF( kt == nitbkg_r ) THEN        ! Write out background at time step nitbkg_r
80         !                             !-----------------------------------========
81         !
82         WRITE(cl_asmbkg, FMT='(A,".nc")' ) TRIM( c_asmbkg )
83         cl_asmbkg = TRIM( cl_asmbkg )
84         INQUIRE( FILE = cl_asmbkg, EXIST = llok )
85         !
86         IF( .NOT. llok ) THEN
87            IF(lwp) WRITE(numout,*) ' Setting up assimilation background file '// TRIM( c_asmbkg )
88            !
89            !                                      ! Define the output file       
90            CALL iom_open( c_asmbkg, inum, ldwrt = .TRUE., kiolib = jprstlib)
91            !
92            IF( nitbkg_r == nit000 - 1 ) THEN      ! Treat special case when nitbkg = 0
93               zdate = REAL( ndastp )
[7953]94               IF( ln_zdftke ) THEN                   ! read turbulent kinetic energy ( en )
95                  IF(lwp) WRITE(numout,*) ' Reading TKE (en) from restart...'
96                  CALL tke_rst( nit000, 'READ' )
97               ENDIF
[3764]98            ELSE
99               zdate = REAL( ndastp )
100            ENDIF
101            !
102            !                                      ! Write the information
103            CALL iom_rstput( kt, nitbkg_r, inum, 'rdastp' , zdate             )
104            CALL iom_rstput( kt, nitbkg_r, inum, 'un'     , un                )
105            CALL iom_rstput( kt, nitbkg_r, inum, 'vn'     , vn                )
106            CALL iom_rstput( kt, nitbkg_r, inum, 'tn'     , tsn(:,:,:,jp_tem) )
107            CALL iom_rstput( kt, nitbkg_r, inum, 'sn'     , tsn(:,:,:,jp_sal) )
108            CALL iom_rstput( kt, nitbkg_r, inum, 'sshn'   , sshn              )
[7953]109            IF( ln_zdftke )   CALL iom_rstput( kt, nitbkg_r, inum, 'en'     , en                )
[3764]110            !
111            CALL iom_close( inum )
112         ENDIF
113         !
114      ENDIF
115
116      !                                !-------------------------------------------
117      IF( kt == nitdin_r ) THEN        ! Write out background at time step nitdin_r
118         !                             !-----------------------------------========
119         !
120         WRITE(cl_asmdin, FMT='(A,".nc")' ) TRIM( c_asmdin )
121         cl_asmdin = TRIM( cl_asmdin )
122         INQUIRE( FILE = cl_asmdin, EXIST = llok )
123         !
124         IF( .NOT. llok ) THEN
125            IF(lwp) WRITE(numout,*) ' Setting up assimilation background file '// TRIM( c_asmdin )
126            !
127            !                                      ! Define the output file       
128            CALL iom_open( c_asmdin, inum, ldwrt = .TRUE., kiolib = jprstlib)
129            !
130            IF( nitdin_r == nit000 - 1 ) THEN      ! Treat special case when nitbkg = 0
131
132               zdate = REAL( ndastp )
133            ELSE
134               zdate = REAL( ndastp )
135            ENDIF
136            !
137            !                                      ! Write the information
138            CALL iom_rstput( kt, nitdin_r, inum, 'rdastp' , zdate             )
139            CALL iom_rstput( kt, nitdin_r, inum, 'un'     , un                )
140            CALL iom_rstput( kt, nitdin_r, inum, 'vn'     , vn                )
141            CALL iom_rstput( kt, nitdin_r, inum, 'tn'     , tsn(:,:,:,jp_tem) )
142            CALL iom_rstput( kt, nitdin_r, inum, 'sn'     , tsn(:,:,:,jp_sal) )
143            CALL iom_rstput( kt, nitdin_r, inum, 'sshn'   , sshn              )
144#if defined key_lim2 || defined key_lim3
[5836]145            IF( nn_ice == 2  .OR.  nn_ice == 3 ) THEN
146               IF( ALLOCATED(frld) ) THEN
147                  CALL iom_rstput( kt, nitdin_r, inum, 'iceconc', 1._wp - frld(:,:)   )
[4990]148               ELSE
[5836]149                  CALL ctl_warn('Ice concentration not written to background as ice variable frld not allocated on this timestep')
150               ENDIF
[3764]151            ENDIF
152#endif
153            !
154            CALL iom_close( inum )
155         ENDIF
156         !
157      ENDIF
158      !                   
159   END SUBROUTINE asm_bkg_wri
160
161   !!======================================================================
162END MODULE asmbkg
Note: See TracBrowser for help on using the repository browser.