SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
assim_isban.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 ! ###############################################################################
6 SUBROUTINE assim_isba_n (DGMI, IG, I, U, &
7  hprogram,ki, &
8  pcon_rain, pstrat_rain, pcon_snow, pstrat_snow,&
9  pclouds, plsm, pevaptr, pevap, &
10  pswec, ptsc, pucls, pvcls, &
11  pts, pt2m, phu2m, pswe, &
12  htest, od_maskext, plon_in, plat_in )
13 
14 ! ###############################################################################
15 !
16 !!**** *ASSIM_ISBA_n * - Chooses the surface assimilation schemes for ISBA
17 !!
18 !! PURPOSE
19 !! -------
20 !!
21 !!** METHOD
22 !! ------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !!
28 !! AUTHOR
29 !! ------
30 !! T. Aspelien
31 !!
32 !! MODIFICATIONS
33 !! -------------
34 !! Original 04/2012
35 !! Trygve Aspelien, Separating IO 06/2013
36 !!--------------------------------------------------------------------
37 !
38 !
39 !
41 USE modd_isba_grid_n, ONLY : isba_grid_t
42 USE modd_isba_n, ONLY : isba_t
43 USE modd_surf_atm_n, ONLY : surf_atm_t
44 !
45 USE modd_surfex_mpi, ONLY : nrank, npio
46 USE modd_surf_par, ONLY : xundef
47 USE modd_assim, ONLY : cassim_isba,laesnm,lextrap_nature,nprintlev
48 !
49 !
50 USE yomhook, ONLY : lhook, dr_hook
51 USE parkind1, ONLY : jprb
52 !
53 USE modi_abor1_sfx
54 USE modi_oi_hor_extrapol_surf
55 USE modi_assim_isba_update_snow
56 USE modi_assim_nature_isba_ekf
57 USE modi_assim_nature_isba_enkf
58 USE modi_assim_nature_isba_oi
59 USE modi_average_diag_misc_isba_n
60 !
61 IMPLICIT NONE
62 !
63 !* 0.1 declarations of arguments
64 !
65 !
66 TYPE(diag_misc_isba_t), INTENT(INOUT) :: dgmi
67 TYPE(isba_grid_t), INTENT(INOUT) :: ig
68 TYPE(isba_t), INTENT(INOUT) :: i
69 TYPE(surf_atm_t), INTENT(INOUT) :: u
70 !
71  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
72 INTEGER, INTENT(IN) :: ki
73 REAL, DIMENSION(KI), INTENT(IN) :: pcon_rain
74 REAL, DIMENSION(KI), INTENT(IN) :: pstrat_rain
75 REAL, DIMENSION(KI), INTENT(IN) :: pcon_snow
76 REAL, DIMENSION(KI), INTENT(IN) :: pstrat_snow
77 REAL, DIMENSION(KI), INTENT(IN) :: pclouds
78 REAL, DIMENSION(KI), INTENT(IN) :: plsm
79 REAL, DIMENSION(KI), INTENT(IN) :: pevaptr
80 REAL, DIMENSION(KI), INTENT(IN) :: pevap
81 REAL, DIMENSION(KI), INTENT(IN) :: pswec
82 REAL, DIMENSION(KI), INTENT(IN) :: ptsc
83 REAL, DIMENSION(KI), INTENT(IN) :: pucls
84 REAL, DIMENSION(KI), INTENT(IN) :: pvcls
85 REAL, DIMENSION(KI), INTENT(IN) :: pts
86 REAL, DIMENSION(KI), INTENT(IN) :: pt2m
87 REAL, DIMENSION(KI), INTENT(IN) :: phu2m
88 REAL, DIMENSION(KI), INTENT(IN) :: pswe
89  CHARACTER(LEN=2), INTENT(IN) :: htest ! must be equal to 'OK'
90 LOGICAL, DIMENSION (KI), INTENT(IN) :: od_maskext
91 REAL(KIND=JPRB), DIMENSION (:), INTENT(IN) :: plon_in
92 REAL(KIND=JPRB), DIMENSION (:), INTENT(IN) :: plat_in
93 !
94 !* 0.2 declarations of local variables
95 !
96 !-------------------------------------------------------------------------------------
97 !
98 LOGICAL, DIMENSION(:), ALLOCATABLE :: ginterp_nature
99 LOGICAL, DIMENSION(:), ALLOCATABLE :: ginterp_sn
100 REAL, DIMENSION(:), ALLOCATABLE :: zts_ep,zts_ep0
101 REAL, DIMENSION(:), ALLOCATABLE :: ztp_ep,ztp_ep0
102 REAL, DIMENSION(:), ALLOCATABLE :: zws_ep,zws_ep0
103 REAL, DIMENSION(:), ALLOCATABLE :: zwp_ep,zwp_ep0
104 REAL, DIMENSION(:), ALLOCATABLE :: ztl_ep,ztl_ep0
105 REAL, DIMENSION(:), ALLOCATABLE :: zswe_ep,zswe_ep0
106 REAL, DIMENSION(:), ALLOCATABLE :: zsnr_ep,zsnr_ep0
107 REAL, DIMENSION(:), ALLOCATABLE :: zsna_ep,zsna_ep0
108 REAL, DIMENSION(KI) :: zswe
109 REAL, DIMENSION(KI) :: zswe_orig
110 INTEGER :: ji,jl,jp
111 REAL(KIND=JPRB) :: zhook_handle
112 !
113 IF (lhook) CALL dr_hook('ASSIM_ISBA_N',0,zhook_handle)
114 !
115 IF (htest/='OK') THEN
116  CALL abor1_sfx('ASSIM_ISBA_n: FATAL ERROR DURING ARGUMENT TRANSFER')
117 END IF
118 !
119 ! Set snow layers and patches
120 jp = 1
121 jl = 1
122 !
123 zswe = pswe
124 !
125 ! General snow update
126 IF ( cassim_isba /= 'OI ' ) THEN
127  !
128  ! Snow analysis/update
129  IF (laesnm) THEN
130  IF (nrank==npio) WRITE(*,*) 'UPDATE SNOW FROM ANALYSED VALUES'
131  CALL assim_isba_update_snow(i, &
132  hprogram,ki,zswe,zswe_orig,.true.,.true.,htest)
133  ELSE
134  IF (nrank==npio) WRITE(*,*) 'SNOW IS NOT UPDATED FROM ANALYSED VALUES'
135  ENDIF
136 ENDIF
137 !
138 ! Soil assimilation
139 IF ( cassim_isba == 'EKF ' ) THEN
140  !
141  ! Run EKF for soil
142  CALL assim_nature_isba_ekf(i, &
143  hprogram, ki, pt2m, phu2m, htest)
144  !
145 ELSEIF ( cassim_isba == 'ENKF ') THEN
146  !
147  CALL assim_nature_isba_enkf(i, hprogram, ki, pt2m, phu2m, htest)
148  !
149 ELSEIF ( cassim_isba == 'OI ' ) THEN
150  !
151  ! Snow analysis/update. Store the original field in the surfex file
152  IF (laesnm) THEN
153  IF (nrank==npio) WRITE(*,*) 'UPDATE SNOW FROM ANALYSED VALUES'
154  CALL assim_isba_update_snow(i, &
155  hprogram,ki,zswe,zswe_orig,.true.,.false.,htest)
156  ELSE
157  IF (nrank==npio) WRITE(*,*) 'SNOW IS NOT UPDATED FROM ANALYSED VALUES'
158  ENDIF
159  !
160  ! Run OI for soil
161  CALL assim_nature_isba_oi(i, &
162  hprogram, ki, &
163  pcon_rain, pstrat_rain, pcon_snow, pstrat_snow,&
164  pclouds, plsm, pevaptr, pevap, &
165  pswec, ptsc, pucls, pvcls, &
166  pts, pt2m, phu2m, zswe, &
167  htest, od_maskext, plon_in, plat_in )
168  !
169  ! Snow analysis/update (changed in oi_cacsts). Get the full increment
170  IF (laesnm) THEN
171  IF (nrank==npio) WRITE(*,*) 'UPDATE SNOW FROM ANALYSED OI_CACSTS VALUES'
172  CALL assim_isba_update_snow(i, &
173  hprogram,ki,zswe,zswe_orig,.false.,.true.,htest)
174  ELSE
175  IF (nrank==npio) WRITE(*,*) 'SNOW IS NOT UPDATED FROM ANALYSED OI_CACSTS VALUES'
176  ENDIF
177  !
178 ELSE
179  CALL abor1_sfx(cassim_isba//' is not a defined scheme for ASSIM_ISBA_N')
180 ENDIF
181 
182 ! Extrapolation if requested
183 IF ( lextrap_nature ) THEN
184  !
185  ALLOCATE(zws_ep(ki),zwp_ep(ki),zts_ep(ki),ztp_ep(ki),&
186  ztl_ep(ki),zswe_ep(ki),zsnr_ep(ki),zsna_ep(ki))
187  !
188  zws_ep = i%XWG(:,1,jp)
189  zwp_ep = i%XWG(:,2,jp)
190  zts_ep = i%XTG(:,1,jp)
191  ztp_ep = i%XTG(:,2,jp)
192  ztl_ep = i%XWGI(:,2,jp)
193  zswe_ep = i%TSNOW%WSNOW(:,jl,jp)
194  zsnr_ep = i%TSNOW%RHO (:,jl,jp)
195  zsna_ep = i%TSNOW%ALB (:, jp)
196  !
197  ALLOCATE(ginterp_nature(ki),ginterp_sn(ki))
198  !
199  ! Search for the nearest grid point values for land surface fields
200  ! at locations where the CANARI land fraction is less than 50%
201  ! and therefore useless values MIGTH be given
202  ginterp_nature = .false.
203  ginterp_sn = .false.
204  !
205  ! Snow albedo and density are also extrapolated in points
206  ! which get initial snow in the snow analysis
207  WHERE ( zswe_ep(:) < 1.0e-10 .AND. pswe(:)>= 1.0e-10 )
208  ginterp_sn(:) = .true.
209  zsna_ep(:) = xundef
210  zsnr_ep(:) = xundef
211  END WHERE
212  zswe_ep(:) = pswe(:)
213  !
214  WHERE ( plsm(:) < 0.5 )
215  ginterp_nature(:) = .true.
216  ginterp_sn(:) = .true.
217  zts_ep(:) = xundef
218  ztp_ep(:) = xundef
219  zws_ep(:) = xundef
220  zwp_ep(:) = xundef
221  ztl_ep(:) = xundef
222  zswe_ep(:) = xundef
223  zsna_ep(:) = xundef
224  zsnr_ep(:) = xundef
225  END WHERE
226  !
227  ALLOCATE(zws_ep0(ki),zwp_ep0(ki),zts_ep0(ki),ztp_ep0(ki),&
228  ztl_ep0(ki),zswe_ep0(ki),zsnr_ep0(ki),zsna_ep0(ki))
229  !
230  zws_ep0(:) = zws_ep(:)
231  CALL oi_hor_extrapol_surf(ki,ig%XLAT,ig%XLON,zws_ep0,ig%XLAT,ig%XLON,zws_ep,ginterp_nature)
232  zwp_ep0(:) = zwp_ep(:)
233  CALL oi_hor_extrapol_surf(ki,ig%XLAT,ig%XLON,zwp_ep0,ig%XLAT,ig%XLON,zwp_ep,ginterp_nature)
234  zts_ep0(:) = zts_ep(:)
235  CALL oi_hor_extrapol_surf(ki,ig%XLAT,ig%XLON,zts_ep0,ig%XLAT,ig%XLON,zts_ep,ginterp_nature,i%XZS)
236  ztp_ep0(:) = ztp_ep(:)
237  CALL oi_hor_extrapol_surf(ki,ig%XLAT,ig%XLON,ztp_ep0,ig%XLAT,ig%XLON,ztp_ep,ginterp_nature,i%XZS)
238  ztl_ep0(:) = ztl_ep(:)
239  CALL oi_hor_extrapol_surf(ki,ig%XLAT,ig%XLON,ztl_ep0,ig%XLAT,ig%XLON,ztl_ep,ginterp_nature)
240  zswe_ep0(:) = zswe_ep(:)
241  CALL oi_hor_extrapol_surf(ki,ig%XLAT,ig%XLON,zswe_ep0,ig%XLAT,ig%XLON,zswe_ep,ginterp_sn)
242  zsnr_ep0(:) = zsnr_ep(:)
243  CALL oi_hor_extrapol_surf(ki,ig%XLAT,ig%XLON,zsnr_ep0,ig%XLAT,ig%XLON,zsnr_ep,ginterp_sn)
244  zsna_ep0(:) = zsna_ep(:)
245  CALL oi_hor_extrapol_surf(ki,ig%XLAT,ig%XLON,zsna_ep0,ig%XLAT,ig%XLON,zsna_ep,ginterp_sn)
246  !
247  DEALLOCATE(zws_ep0,zwp_ep0,zts_ep0,ztp_ep0,ztl_ep0,zswe_ep0,zsnr_ep0,zsna_ep0)
248  !
249  ! PRINT values produced by OI_HO_EXTRAPOL_SURF for TS
250  IF ( nprintlev > 2 ) THEN
251  DO ji=1,ki
252  IF (ginterp_nature(ji)) THEN
253  print *,'Surface temperature set to ',zts_ep(ji),'from nearest neighbour at I=',u%NR_NATURE(ji)
254  ENDIF
255  ENDDO
256  ENDIF
257  !
258  DEALLOCATE(ginterp_nature,ginterp_sn)
259  !
260  ! Set extrpolated fields to global
261  i%XWG (:,1,jp) = zws_ep(:)
262  i%XWG (:,2,jp) = zwp_ep(:)
263  i%XTG (:,1,jp) = zts_ep(:)
264  i%XTG (:,2,jp) = ztp_ep(:)
265  i%XWGI(:,2,jp) = ztl_ep(:)
266  i%TSNOW%WSNOW(:,jl,jp) = zswe_ep(:)
267  i%TSNOW%RHO (:,jl,jp) = zsnr_ep(:)
268  i%TSNOW%ALB (:, jp) = zsna_ep(:)
269  !
270  DEALLOCATE(zws_ep,zwp_ep,zts_ep,ztp_ep,ztl_ep,zswe_ep,zsnr_ep,zsna_ep)
271  !
272 ENDIF
273 
274 ! Snow analysis/update security
275 IF (laesnm) THEN
276 
277  ! removes very small values due to computation precision
278  WHERE( i%TSNOW%WSNOW(:,jl,jp) < 1.0e-10 ) i%TSNOW%WSNOW(:,jl,jp) = 0.0
279 
280  ! No SNOW
281  WHERE ( i%TSNOW%WSNOW(:,jl,jp) == 0.0 )
282  i%TSNOW%RHO(:,jl,jp) = xundef
283  i%TSNOW%ALB(:,jp) = xundef
284  END WHERE
285  !
286 ENDIF
287 !
288 !to be improved later - needed for surfex course
289  CALL average_diag_misc_isba_n(dgmi, i)
290  !
291 IF (lhook) CALL dr_hook('ASSIM_ISBA_N',1,zhook_handle)
292 !
293 !-------------------------------------------------------------------------------------
294 !
295 END SUBROUTINE assim_isba_n
subroutine average_diag_misc_isba_n(DGMI, I)
subroutine assim_nature_isba_ekf(I, HPROGRAM, KI, PT2M, PHU2M, HTEST)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine assim_isba_update_snow(I, HPROGRAM, KI, PSWE, PSWE_ORIG, OINITSNOW, OINC, HTEST)
subroutine assim_nature_isba_enkf(I, HPROGRAM, KI, PT2M, PHU2M, HTEST)
subroutine assim_nature_isba_oi(I, HPROGRAM, KI, PRRCL, PRRSL, PRRCN, PRRSN, PATMNEB, PITM, PEVAPTR, PEVAP, PSNC, PTSC, PUCLS, PVCLS, PTS_O, PT2M_O, PHU2M_O, PSWE, HTEST, OD_MASKEXT, PLON_IN, PLAT_IN)
subroutine oi_hor_extrapol_surf(NDIM, PLAT_IN, PLON_IN, PFIELD_IN, PLAT, PLON, PFIELD, OINTERP, PZS, NDIM2)
subroutine assim_isba_n(DGMI, IG, I, U, HPROGRAM, KI, PCON_RAIN, PSTRAT_RAIN, PCON_SNOW, PSTRAT_SNOW, PCLOUDS, PLSM, PEVAPTR, PEVAP, PSWEC, PTSC, PUCLS, PVCLS, PTS, PT2M, PHU2M, PSWE, HTEST, OD_MASKEXT, PLON_IN, PLAT_IN)
Definition: assim_isban.F90:6