source: branches/UKMO/dev_r5518_GO6_package/NEMOGCM/NEMO/OPA_SRC/ASM/asmbkg.F90 @ 9321

Last change on this file since 9321 was 9321, checked in by davestorkey, 3 years ago

UKMO/dev_r5518_GO6_package branch: allow timing of I/O and coupling only.
See GMED ticket 374.

File size: 8.8 KB
Line 
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   !!   'key_asminc' : Switch on the assimilation increment interface
21   !!----------------------------------------------------------------------
22   !!   asm_bkg_wri  : Write out the background state
23   !!   asm_trj_wri  : Write out the model state trajectory (used with 4D-Var)
24   !!----------------------------------------------------------------------
25   USE oce                ! Dynamics and active tracers defined in memory
26   USE sbc_oce            ! Ocean surface boundary conditions
27   USE zdf_oce            ! Vertical mixing variables
28   USE zdfddm             ! Double diffusion mixing parameterization
29   USE ldftra_oce         ! Lateral tracer mixing coefficient defined in memory
30   USE ldfslp             ! Slopes of neutral surfaces
31   USE tradmp             ! Tracer damping
32#if defined key_zdftke
33   USE zdftke             ! TKE vertical physics
34#endif
35   USE eosbn2             ! Equation of state (eos_bn2 routine)
36   USE zdfmxl             ! Mixed layer depth
37   USE dom_oce, ONLY :   ndastp
38   USE sol_oce, ONLY :   gcx   ! Solver variables defined in memory
39   USE in_out_manager     ! I/O manager
40   USE iom                ! I/O module
41   USE asmpar             ! Parameters for the assmilation interface
42   USE zdfmxl             ! mixed layer depth
43#if defined key_traldf_c2d
44   USE ldfeiv             ! eddy induced velocity coef.      (ldf_eiv routine)
45#endif
46#if defined key_lim2
47   USE ice_2
48#endif
49#if defined key_lim3
50   USE ice
51#endif
52   USE timing
53   IMPLICIT NONE
54   PRIVATE
55   
56   PUBLIC   asm_bkg_wri   !: Write out the background state
57
58   !!----------------------------------------------------------------------
59   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
60   !! $Id$
61   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
62   !!----------------------------------------------------------------------
63CONTAINS
64
65   SUBROUTINE asm_bkg_wri( kt )
66      !!-----------------------------------------------------------------------
67      !!                  ***  ROUTINE asm_bkg_wri ***
68      !!
69      !! ** Purpose : Write to file the background state for later use in the
70      !!              inner loop of data assimilation or for direct initialization
71      !!              in the outer loop.
72      !!
73      !! ** Method  : Write out the background state for use in the Jb term
74      !!              in the cost function and for use with direct initialization
75      !!              at analysis time.
76      !!-----------------------------------------------------------------------
77      INTEGER, INTENT( IN ) :: kt               ! Current time-step
78      !
79      CHARACTER (LEN=50) :: cl_asmbkg
80      CHARACTER (LEN=50) :: cl_asmdin
81      LOGICAL :: llok          ! Check if file exists
82      INTEGER :: inum          ! File unit number
83      REAL(wp) :: zdate        ! Date
84      !!-----------------------------------------------------------------------
85
86      !                                !-------------------------------------------
87      IF( kt == nitbkg_r ) THEN        ! Write out background at time step nitbkg_r
88         !                             !-----------------------------------========
89         !
90         WRITE(cl_asmbkg, FMT='(A,".nc")' ) TRIM( c_asmbkg )
91         cl_asmbkg = TRIM( cl_asmbkg )
92         INQUIRE( FILE = cl_asmbkg, EXIST = llok )
93         !
94         IF( .NOT. llok ) THEN
95            IF(lwp) WRITE(numout,*) ' Setting up assimilation background file '// TRIM( c_asmbkg )
96            !
97            !                                      ! Define the output file       
98            CALL iom_open( c_asmbkg, inum, ldwrt = .TRUE., kiolib = jprstlib)
99            !
100            IF( nitbkg_r == nit000 - 1 ) THEN      ! Treat special case when nitbkg = 0
101               zdate = REAL( ndastp )
102#if defined key_zdftke
103               ! lk_zdftke=T :   Read turbulent kinetic energy ( en )
104               IF(lwp) WRITE(numout,*) ' Reading TKE (en) from restart...'
105               CALL tke_rst( nit000, 'READ' )               ! lk_zdftke=T :   Read turbulent kinetic energy ( en )
106
107#endif
108            ELSE
109               zdate = REAL( ndastp )
110            ENDIF
111            !
112            !                                      ! Write the information
113            IF(nn_timing == 2)  CALL timing_start('iom_rstput')
114            CALL iom_rstput( kt, nitbkg_r, inum, 'rdastp' , zdate             )
115            CALL iom_rstput( kt, nitbkg_r, inum, 'un'     , un                )
116            CALL iom_rstput( kt, nitbkg_r, inum, 'vn'     , vn                )
117            CALL iom_rstput( kt, nitbkg_r, inum, 'tn'     , tsn(:,:,:,jp_tem) )
118            CALL iom_rstput( kt, nitbkg_r, inum, 'sn'     , tsn(:,:,:,jp_sal) )
119            CALL iom_rstput( kt, nitbkg_r, inum, 'sshn'   , sshn              )
120#if defined key_zdftke
121            CALL iom_rstput( kt, nitbkg_r, inum, 'en'     , en                )
122#endif
123!            CALL iom_rstput( kt, nitbkg_r, inum, 'gcx'    , gcx               )
124            CALL iom_rstput( kt, nitbkg_r, inum, 'avt'    , avt               )
125            IF(nn_timing == 2)  CALL timing_stop('iom_rstput')
126            !
127            CALL iom_close( inum )
128         ENDIF
129         !
130      ENDIF
131
132      !                                !-------------------------------------------
133      IF( kt == nitdin_r ) THEN        ! Write out background at time step nitdin_r
134         !                             !-----------------------------------========
135         !
136         WRITE(cl_asmdin, FMT='(A,".nc")' ) TRIM( c_asmdin )
137         cl_asmdin = TRIM( cl_asmdin )
138         INQUIRE( FILE = cl_asmdin, EXIST = llok )
139         !
140         IF( .NOT. llok ) THEN
141            IF(lwp) WRITE(numout,*) ' Setting up assimilation background file '// TRIM( c_asmdin )
142            !
143            !                                      ! Define the output file       
144            CALL iom_open( c_asmdin, inum, ldwrt = .TRUE., kiolib = jprstlib)
145            !
146            IF( nitdin_r == nit000 - 1 ) THEN      ! Treat special case when nitbkg = 0
147
148               zdate = REAL( ndastp )
149            ELSE
150               zdate = REAL( ndastp )
151            ENDIF
152            !
153            !                                      ! Write the information
154            IF(nn_timing == 2)  CALL timing_start('iom_rstput')
155            CALL iom_rstput( kt, nitdin_r, inum, 'rdastp' , zdate             )
156            CALL iom_rstput( kt, nitdin_r, inum, 'un'     , un                )
157            CALL iom_rstput( kt, nitdin_r, inum, 'vn'     , vn                )
158            CALL iom_rstput( kt, nitdin_r, inum, 'tn'     , tsn(:,:,:,jp_tem) )
159            CALL iom_rstput( kt, nitdin_r, inum, 'sn'     , tsn(:,:,:,jp_sal) )
160            CALL iom_rstput( kt, nitdin_r, inum, 'avt'    , avt     )
161            CALL iom_rstput( kt, nitdin_r, inum, 'sshn'   , sshn              )
162#if defined key_lim2 || defined key_lim3
163            IF(( nn_ice == 2 ) .OR. ( nn_ice == 3 )) THEN
164          IF(ALLOCATED(frld)) THEN
165                  CALL iom_rstput( kt, nitdin_r, inum, 'iceconc', 1.0 - frld(:,:)   )
166               ELSE
167        CALL ctl_warn('Ice concentration not written to background as ice variable frld not allocated on this timestep')
168          ENDIF
169            ENDIF
170#endif
171            IF(nn_timing == 2)  CALL timing_stop('iom_rstput')
172            !
173            CALL iom_close( inum )
174         ENDIF
175         !
176      ENDIF
177      !                   
178   END SUBROUTINE asm_bkg_wri
179
180   !!======================================================================
181END MODULE asmbkg
Note: See TracBrowser for help on using the repository browser.