SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_ekf.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 MODULE mode_ekf
6 !
7 USE yomhook ,ONLY : lhook, dr_hook
8 USE parkind1 ,ONLY : jprb
9 !
10 INTERFACE get_file_name
11  MODULE PROCEDURE get_file_name
12 END INTERFACE
13 INTERFACE b_big_loop
14  MODULE PROCEDURE b_big_loop
15 END INTERFACE
16 INTERFACE inverse_matrix
17  MODULE PROCEDURE inverse_matrix
18 END INTERFACE
19 INTERFACE choldc
20  MODULE PROCEDURE choldc
21 END INTERFACE
22 INTERFACE cholsl
23  MODULE PROCEDURE cholsl
24 END INTERFACE
25 INTERFACE cofswi
26  MODULE PROCEDURE cofswi
27 END INTERFACE
28 INTERFACE set_filein
29  MODULE PROCEDURE set_filein
30 END INTERFACE
31 !
32  CONTAINS
33 !
34 SUBROUTINE get_file_name(KYEAR,KMONTH,KDAY,KHOUR,HMFILE)
35 !
36 USE modi_trans_chaine
37 !
38 IMPLICIT NONE
39 !
40 INTEGER, INTENT (IN) :: kyear, kmonth, kday, khour
41  CHARACTER(LEN=50) :: ymonth,yday,yyear,yhour
42  CHARACTER(LEN=200), INTENT(INOUT) :: hmfile
43 REAL(KIND=JPRB) :: zhook_handle
44 !
45 IF (lhook) CALL dr_hook('MODE_EKF:GET_FILE_NAME',0,zhook_handle)
46 !
47  CALL trans_chaine(ymonth,kmonth,2)
48  CALL trans_chaine(yday,kday,2)
49  CALL trans_chaine(yyear,kyear,4)
50  CALL trans_chaine(yhour,khour,2)
51 IF (khour.EQ.0 .OR. khour.EQ.24 .OR. khour.EQ.48) yhour='00'
52 !
53 hmfile = trim(hmfile)//yyear(3:4)
54 hmfile = trim(hmfile)//ymonth
55 hmfile = trim(hmfile)//yday
56 hmfile = trim(hmfile)//'H'
57 hmfile = trim(hmfile)//yhour
58 hmfile = trim(hmfile)
59 !
60 IF (lhook) CALL dr_hook('MODE_EKF:GET_FILE_NAME',1,zhook_handle)
61 !
62 END SUBROUTINE get_file_name
63 !
64 !
65 SUBROUTINE b_big_loop (I, &
66  haction,hfile,ptab,ptab_in)
67 !
68 !
69 USE modd_isba_n, ONLY : isba_t
70 !
71 USE modd_assim, ONLY : nvar
72 !
73 IMPLICIT NONE
74 !
75 !
76 TYPE(isba_t), INTENT(INOUT) :: i
77 !
78  CHARACTER(LEN=4), INTENT(IN) :: haction
79  CHARACTER(LEN=*), INTENT(IN) :: hfile
80 REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ptab
81 REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: ptab_in
82 INTEGER :: ji,jj,jk,jl,jjj,l1,k1
83 INTEGER :: iki
84 !RJ: missing declarations
85 INTEGER :: icpt,istat
86 REAL(KIND=JPRB) :: zhook_handle
87 !
88 IF (lhook) CALL dr_hook('MODE_EKF:B_BIG_LOOP',0,zhook_handle)
89 !
90 IF (haction=="READ" .OR. haction=="WRIT") THEN
91  OPEN (unit=111,file=hfile,form='UNFORMATTED',access='SEQUENTIAL',iostat=istat)
92 ELSE
93  icpt = 0
94 ENDIF
95 !
96 iki = SIZE(ptab,1)
97 !
98 DO jl = 1,nvar ! control variable (x at previous time step)
99  DO jk = 1,nvar
100  DO ji = 1,iki
101  DO jj = 1,i%NPATCH
102  DO jjj = 1,i%NPATCH
103  !
104  l1 = jj+i%NPATCH*(jl-1)
105  k1 = jjj+i%NPATCH*(jk-1)
106  !
107  IF ( haction=="READ" ) THEN
108  READ (111) ptab(ji,l1,k1)
109  ELSEIF ( haction=="WRIT" ) THEN
110  WRITE(111) ptab(ji,l1,k1)
111  ELSE
112  icpt = icpt+1
113  ptab(ji,l1,k1) = ptab_in(icpt)
114  ENDIF
115  !
116  ENDDO
117  ENDDO
118  ENDDO
119  ENDDO
120 ENDDO
121 !
122 IF (haction=="READ" .OR. haction=="WRIT") CLOSE(111)
123 !
124 IF (lhook) CALL dr_hook('MODE_EKF:B_BIG_LOOP',1,zhook_handle)
125 !
126 END SUBROUTINE b_big_loop
127 
128 SUBROUTINE inverse_matrix(KN,PA,PP)
129 !--------------------------------------------------------
130 !
131 ! Explicit inversed matrix after Cholesky decomposition
132 !
133 !--------------------------------------------------------
134 !
135 IMPLICIT NONE
136 !
137 INTEGER, INTENT(IN) :: kn
138 REAL, DIMENSION (KN,KN), INTENT(INOUT) :: pa
139 REAL, DIMENSION (KN), INTENT(IN) :: pp
140 REAL :: zsum
141 INTEGER :: ji, jj, jk
142 REAL(KIND=JPRB) :: zhook_handle
143 !
144 IF (lhook) CALL dr_hook('MODE_EKF:INVERSE_MATRIX',0,zhook_handle)
145 !
146 DO ji = 1,kn
147  pa(ji,ji)=1./pp(ji)
148  DO jj = ji+1,kn
149  zsum = 0.
150  DO jk = ji,jj-1
151  zsum = zsum - pa(jj,jk)*pa(jk,ji)
152  ENDDO
153  pa(jj,ji) = zsum/pp(jj)
154  ENDDO
155 ENDDO
156 !
157 DO ji = 1,kn
158  DO jj = ji+1,kn
159  pa(ji,jj) = 0.0
160  ENDDO
161 ENDDO
162 !
163 pa = matmul(transpose(pa),pa)
164 !
165 IF (lhook) CALL dr_hook('MODE_EKF:INVERSE_MATRIX',1,zhook_handle)
166 !
167 END SUBROUTINE inverse_matrix
168 
169 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
170 
171 SUBROUTINE choldc(KN,PA,PP)
172 !
173 USE modi_abor1_sfx
174 !
175 IMPLICIT NONE
176 !
177 INTEGER, INTENT(IN) :: kn
178 REAL, DIMENSION(KN,KN), INTENT(INOUT) :: pa
179 REAL, DIMENSION(KN), INTENT(OUT) :: pp
180 INTEGER :: ji
181 REAL :: zsum
182 REAL(KIND=JPRB) :: zhook_handle
183 !
184 IF (lhook) CALL dr_hook('MODE_EKF:CHOLDC',0,zhook_handle)
185 !
186 DO ji = 1,kn
187  zsum = pa(ji,ji)- dot_product(pa(ji,1:ji-1),pa(ji,1:ji-1))
188  IF ( zsum<=0.0 ) CALL abor1_sfx('MODE_EKF: ERROR IN CHOLDC')
189  pp(ji) = sqrt(zsum)
190  pa(ji+1:kn,ji) = ( pa(ji,ji+1:kn) - matmul(pa(ji+1:kn,1:ji-1),pa(ji,1:ji-1)) )/pp(ji)
191 ENDDO
192 !
193 IF (lhook) CALL dr_hook('MODE_EKF:CHOLDC',1,zhook_handle)
194 !
195 END SUBROUTINE choldc
196 
197 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
198 
199 SUBROUTINE cholsl(KN,PA,PP,PB,PX)
200 !
201 IMPLICIT NONE
202 !
203 INTEGER, INTENT(IN) :: kn
204 REAL, DIMENSION (KN,KN), INTENT(IN) :: pa
205 REAL, DIMENSION (KN), INTENT(IN) :: pp,pb
206 REAL, DIMENSION (KN), INTENT(INOUT) :: px
207 INTEGER :: ji
208 REAL(KIND=JPRB) :: zhook_handle
209 !
210 IF (lhook) CALL dr_hook('MODE_EKF:CHOLSL',0,zhook_handle)
211 !
212 DO ji = 1,kn
213  px(ji) = (pb(ji) - dot_product(pa(ji,1:ji-1),px(1:ji-1)))/pp(ji)
214 ENDDO
215 DO ji = kn,1,-1
216  px(ji) = (px(ji) - dot_product(pa(ji+1:kn,ji),px(ji+1:kn)))/pp(ji)
217 ENDDO
218 !
219 IF (lhook) CALL dr_hook('MODE_EKF:CHOLSL',1,zhook_handle)
220 !
221 END SUBROUTINE cholsl
222 !
223 SUBROUTINE cofswi(PCLAY,PCOFSWI)
224 !
225 IMPLICIT NONE
226 REAL, DIMENSION(:), INTENT(IN) :: pclay
227 REAL, DIMENSION(:), INTENT(OUT) :: pcofswi
228 REAL(KIND=JPRB) :: zhook_handle
229 !
230 IF (lhook) CALL dr_hook('MODE_EKF:COFSWI',0,zhook_handle)
231 !
232 pcofswi(:) = 0.001 * (89.0467 * ((100.*pclay(:))**0.3496) - 37.1342*((100.*pclay(:))**0.5))
233 !
234 IF (lhook) CALL dr_hook('MODE_EKF:COFSWI',1,zhook_handle)
235 !
236 END SUBROUTINE cofswi
237 !
238 !
239 SUBROUTINE set_filein(HFILE)
240 !
241 USE modn_io_offline, ONLY : csurf_filetype
242 !
243 #ifdef SFX_NC
244 USE modd_io_surf_nc, ONLY : cfilein_nc, cfilein_nc_save
245 #endif
246 #ifdef SFX_ASC
247 USE modd_io_surf_asc, ONLY : cfilein, cfilein_save
248 #endif
249 #ifdef SFX_FA
250 USE modd_io_surf_fa, ONLY : cfilein_fa, cfilein_fa_save
251 #endif
252 #ifdef SFX_LFI
253 USE modd_io_surf_lfi, ONLY : cfilein_lfi, cfilein_lfi_save, cfile_lfi
254 #endif
255 !
256 USE modi_abor1_sfx
257 !
258 IMPLICIT NONE
259 !
260  CHARACTER(LEN=*), INTENT(IN) :: hfile
261  CHARACTER(LEN=28) :: yfilein
262 REAL(KIND=JPRB) :: zhook_handle
263 !
264 IF (lhook) CALL dr_hook('MODE_EKF:SET_FILEIN',0,zhook_handle)
265 !
266 IF ( csurf_filetype == "LFI " ) THEN
267  yfilein = trim(hfile)
268 #ifdef SFX_LFI
269  cfilein_lfi = yfilein
270  cfile_lfi = yfilein
271  cfilein_lfi_save = yfilein
272 #endif
273 ELSEIF ( csurf_filetype == "FA " ) THEN
274  yfilein = trim(hfile)//'.fa'
275 #ifdef SFX_FA
276  cfilein_fa = yfilein
277  cfilein_fa_save = yfilein
278 #endif
279 ELSEIF ( csurf_filetype == "ASCII " ) THEN
280  yfilein = trim(hfile)//'.txt'
281 #ifdef SFX_ASC
282  cfilein = yfilein
283  cfilein_save = yfilein
284 #endif
285 ELSEIF ( csurf_filetype == "NC " ) THEN
286  yfilein = trim(hfile)//'.nc'
287 #ifdef SFX_NC
288  cfilein_nc = yfilein
289  cfilein_nc_save = yfilein
290 #endif
291 ELSE
292  CALL abor1_sfx(trim(csurf_filetype)//" is not implemented!")
293 ENDIF
294 !
295 IF (lhook) CALL dr_hook('MODE_EKF:SET_FILEIN',1,zhook_handle)
296 !
297 END SUBROUTINE set_filein
298 !
299 END MODULE mode_ekf
300 
subroutine trans_chaine(HCHAINE, KENTIER, KOPTION)
Definition: trans_chaine.F90:6
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6