1 | MODULE 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 |
---|
27 | USE ldftra ! Lateral diffusion: eddy diffusivity coefficients |
---|
28 | USE ldfslp ! Lateral diffusion: slopes of neutral surfaces |
---|
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 |
---|
33 | USE dom_oce , ONLY : ndastp |
---|
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_si3 |
---|
39 | USE ice |
---|
40 | #endif |
---|
41 | |
---|
42 | IMPLICIT NONE |
---|
43 | PRIVATE |
---|
44 | |
---|
45 | PUBLIC asm_bkg_wri !: Write out the background state |
---|
46 | |
---|
47 | !!---------------------------------------------------------------------- |
---|
48 | !! NEMO/OCE 4.0 , NEMO Consortium (2018) |
---|
49 | !! $Id$ |
---|
50 | !! Software governed by the CeCILL licence (./LICENSE) |
---|
51 | !!---------------------------------------------------------------------- |
---|
52 | CONTAINS |
---|
53 | |
---|
54 | SUBROUTINE asm_bkg_wri( kt ) |
---|
55 | !!----------------------------------------------------------------------- |
---|
56 | !! *** ROUTINE asm_bkg_wri *** |
---|
57 | !! |
---|
58 | !! ** Purpose : Write to file the background state for later use in the |
---|
59 | !! inner loop of data assimilation or for direct initialization |
---|
60 | !! in the outer loop. |
---|
61 | !! |
---|
62 | !! ** Method : Write out the background state for use in the Jb term |
---|
63 | !! in the cost function and for use with direct initialization |
---|
64 | !! at analysis time. |
---|
65 | !!----------------------------------------------------------------------- |
---|
66 | INTEGER, INTENT( IN ) :: kt ! Current time-step |
---|
67 | ! |
---|
68 | CHARACTER (LEN=50) :: cl_asmbkg |
---|
69 | CHARACTER (LEN=50) :: cl_asmdin |
---|
70 | LOGICAL :: llok ! Check if file exists |
---|
71 | INTEGER :: inum ! File unit number |
---|
72 | REAL(wp) :: zdate ! Date |
---|
73 | !!----------------------------------------------------------------------- |
---|
74 | |
---|
75 | ! !------------------------------------------- |
---|
76 | IF( kt == nitbkg_r ) THEN ! Write out background at time step nitbkg_r |
---|
77 | ! !-----------------------------------======== |
---|
78 | ! |
---|
79 | WRITE(cl_asmbkg, FMT='(A,".nc")' ) TRIM( c_asmbkg ) |
---|
80 | cl_asmbkg = TRIM( cl_asmbkg ) |
---|
81 | INQUIRE( FILE = cl_asmbkg, EXIST = llok ) |
---|
82 | ! |
---|
83 | IF( .NOT. llok ) THEN |
---|
84 | IF(lwp) WRITE(numout,*) ' Setting up assimilation background file '// TRIM( c_asmbkg ) |
---|
85 | ! |
---|
86 | ! ! Define the output file |
---|
87 | CALL iom_open( c_asmbkg, inum, ldwrt = .TRUE., kiolib = jprstlib) |
---|
88 | ! |
---|
89 | IF( nitbkg_r == nit000 - 1 ) THEN ! Treat special case when nitbkg = 0 |
---|
90 | zdate = REAL( ndastp ) |
---|
91 | IF( ln_zdftke ) THEN ! read turbulent kinetic energy ( en ) |
---|
92 | IF(lwp) WRITE(numout,*) ' Reading TKE (en) from restart...' |
---|
93 | CALL tke_rst( nit000, 'READ' ) |
---|
94 | ENDIF |
---|
95 | ELSE |
---|
96 | zdate = REAL( ndastp ) |
---|
97 | ENDIF |
---|
98 | ! |
---|
99 | ! ! Write the information |
---|
100 | CALL iom_rstput( kt, nitbkg_r, inum, 'rdastp' , zdate ) |
---|
101 | CALL iom_rstput( kt, nitbkg_r, inum, 'un' , un ) |
---|
102 | CALL iom_rstput( kt, nitbkg_r, inum, 'vn' , vn ) |
---|
103 | CALL iom_rstput( kt, nitbkg_r, inum, 'tn' , tsn(:,:,:,jp_tem) ) |
---|
104 | CALL iom_rstput( kt, nitbkg_r, inum, 'sn' , tsn(:,:,:,jp_sal) ) |
---|
105 | CALL iom_rstput( kt, nitbkg_r, inum, 'sshn' , sshn ) |
---|
106 | IF( ln_zdftke ) CALL iom_rstput( kt, nitbkg_r, inum, 'en' , en ) |
---|
107 | ! |
---|
108 | CALL iom_close( inum ) |
---|
109 | ENDIF |
---|
110 | ! |
---|
111 | ENDIF |
---|
112 | |
---|
113 | ! !------------------------------------------- |
---|
114 | IF( kt == nitdin_r ) THEN ! Write out background at time step nitdin_r |
---|
115 | ! !-----------------------------------======== |
---|
116 | ! |
---|
117 | WRITE(cl_asmdin, FMT='(A,".nc")' ) TRIM( c_asmdin ) |
---|
118 | cl_asmdin = TRIM( cl_asmdin ) |
---|
119 | INQUIRE( FILE = cl_asmdin, EXIST = llok ) |
---|
120 | ! |
---|
121 | IF( .NOT. llok ) THEN |
---|
122 | IF(lwp) WRITE(numout,*) ' Setting up assimilation background file '// TRIM( c_asmdin ) |
---|
123 | ! |
---|
124 | ! ! Define the output file |
---|
125 | CALL iom_open( c_asmdin, inum, ldwrt = .TRUE., kiolib = jprstlib) |
---|
126 | ! |
---|
127 | IF( nitdin_r == nit000 - 1 ) THEN ! Treat special case when nitbkg = 0 |
---|
128 | |
---|
129 | zdate = REAL( ndastp ) |
---|
130 | ELSE |
---|
131 | zdate = REAL( ndastp ) |
---|
132 | ENDIF |
---|
133 | ! |
---|
134 | ! ! Write the information |
---|
135 | CALL iom_rstput( kt, nitdin_r, inum, 'rdastp' , zdate ) |
---|
136 | CALL iom_rstput( kt, nitdin_r, inum, 'un' , un ) |
---|
137 | CALL iom_rstput( kt, nitdin_r, inum, 'vn' , vn ) |
---|
138 | CALL iom_rstput( kt, nitdin_r, inum, 'tn' , tsn(:,:,:,jp_tem) ) |
---|
139 | CALL iom_rstput( kt, nitdin_r, inum, 'sn' , tsn(:,:,:,jp_sal) ) |
---|
140 | CALL iom_rstput( kt, nitdin_r, inum, 'sshn' , sshn ) |
---|
141 | #if defined key_si3 |
---|
142 | IF( nn_ice == 2 ) THEN |
---|
143 | IF( ALLOCATED(at_i) ) THEN |
---|
144 | CALL iom_rstput( kt, nitdin_r, inum, 'iceconc', at_i(:,:) ) |
---|
145 | ELSE |
---|
146 | CALL ctl_warn('asm_bkg_wri: Ice concentration not written to background ', & |
---|
147 | & 'as ice variable at_i not allocated on this timestep') |
---|
148 | ENDIF |
---|
149 | ENDIF |
---|
150 | #endif |
---|
151 | ! |
---|
152 | CALL iom_close( inum ) |
---|
153 | ENDIF |
---|
154 | ! |
---|
155 | ENDIF |
---|
156 | ! |
---|
157 | END SUBROUTINE asm_bkg_wri |
---|
158 | |
---|
159 | !!====================================================================== |
---|
160 | END MODULE asmbkg |
---|