SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
assim_inland_watern.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_inland_water_n (I, U, W, &
7  hprogram,ki,pts_in,pitm,htest, &
8  olkeepextzone,od_maskext,plon_in,plat_in)
9 
10 ! ###############################################################################
11 !
12 !!**** *ASSIM_INLAND_WATER_n * - Chooses the surface assimilation schemes for INLAND_WATER parts
13 !!
14 !! PURPOSE
15 !! -------
16 !!
17 !!** METHOD
18 !! ------
19 !!
20 !! REFERENCE
21 !! ---------
22 !!
23 !!
24 !! AUTHOR
25 !! ------
26 !! T. Aspelien
27 !!
28 !! MODIFICATIONS
29 !! -------------
30 !! Original 04/2012
31 !! Trygve Aspelien, Separating IO 06/2013
32 !!--------------------------------------------------------------------
33 !
34 !
35 USE modd_isba_n, ONLY : isba_t
36 USE modd_surf_atm_n, ONLY : surf_atm_t
37 USE modd_watflux_n, ONLY : watflux_t
38 !
39 USE modd_surfex_mpi, ONLY : nrank, npio
40 USE modd_surf_par, ONLY : xundef
41 USE modd_assim, ONLY : nprintlev,lextrap_water,lwatertg2
42 !
43 USE yomhook, ONLY : lhook,dr_hook
44 USE parkind1, ONLY : jprb
45 !
46 USE modi_abor1_sfx
47 USE modi_oi_hor_extrapol_surf
48 !
49 IMPLICIT NONE
50 !
51 !* 0.1 declarations of arguments
52 !
53 !
54 TYPE(isba_t), INTENT(INOUT) :: i
55 TYPE(surf_atm_t), INTENT(INOUT) :: u
56 TYPE(watflux_t), INTENT(INOUT) :: w
57 !
58  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
59 INTEGER, INTENT(IN) :: ki
60 REAL,DIMENSION(KI), INTENT(IN) :: pts_in
61 REAL,DIMENSION(KI), INTENT(IN) :: pitm
62  CHARACTER(LEN=2), INTENT(IN) :: htest ! must be equal to 'OK'
63 LOGICAL, INTENT(IN) :: olkeepextzone
64 LOGICAL, DIMENSION(KI), INTENT(IN) :: od_maskext
65 REAL(KIND=JPRB), DIMENSION (:), INTENT(IN) :: plon_in
66 REAL(KIND=JPRB), DIMENSION (:), INTENT(IN) :: plat_in
67 !
68 !* 0.2 declarations of local variables
69 !
70 !-------------------------------------------------------------------------------------
71 !
72 REAL, DIMENSION(KI) :: zlst
73 REAL, DIMENSION(KI) :: zlst0
74 REAL, DIMENSION(KI) :: zlstinc
75 REAL, DIMENSION(:), ALLOCATABLE :: zlst01, zlst1, zlon1, zlat1, zalt1
76 !
77 LOGICAL,DIMENSION(KI) :: ginterp_lst
78 LOGICAL, DIMENSION(:), ALLOCATABLE :: ginterp_lst1
79 INTEGER :: iresp,ji,jj,is1,j1
80 REAL(KIND=JPRB) :: zhook_handle
81 
82 IF (lhook) CALL dr_hook('ASSIM_INLAND_WATER_N',0,zhook_handle)
83 
84 IF (htest/='OK') THEN
85  CALL abor1_sfx('ASSIM_INLAND_WATER_n: FATAL ERROR DURING ARGUMENT TRANSFER')
86 END IF
87 
88 IF (nrank==npio) WRITE(*,*) 'UPDATING LST FOR INLAND_WATER: ',trim(u%CWATER)
89 IF (u%CWATER=="NONE") THEN
90  IF (lhook) CALL dr_hook('ASSIM_INLAND_WATER_N',1,zhook_handle)
91  RETURN
92 ENDIF
93 !
94 !* ZLST updated!
95 !
96 zlst(:) = xundef
97 IF (.NOT.lwatertg2 ) THEN
98  !* ZLST updated from from CANARI analysis
99  DO ji=1,ki
100  IF ( pitm(ji)<0.5 ) zlst(ji) = pts_in(ji)
101  ENDDO
102  !
103 ELSE
104  ! Set TG2 from global array
105  DO ji=1,ki
106  IF ( pitm(ji)>0.5 ) THEN
107  !* ZLST updated from LAND values of climatological TS
108  DO jj=1,u%NSIZE_NATURE
109  IF ( u%NR_WATER(ji)==u%NR_NATURE(jj) ) THEN
110  zlst(ji) = i%XTG(jj,2,1)
111  EXIT
112  ENDIF
113  ENDDO
114  ENDIF
115  ENDDO
116  !
117 ENDIF
118 !
119 ! Set local array from global
120 ginterp_lst(:) = .false.
121 DO ji=1,ki
122  IF ( zlst(ji)/=xundef ) THEN
123  zlst0(ji) = zlst(ji)
124  ELSEIF ( lextrap_water ) THEN
125  ! Keep ZLST or do extrapolation from neighbour points
126  zlst0(ji) = xundef
127  ginterp_lst(ji) = .true.
128  ELSE
129  zlst0(ji) = w%XTS(ji)
130  ENDIF
131 ENDDO
132 !
133 IF ( lextrap_water ) THEN
134  !
135  IF (olkeepextzone) THEN
136  !
137  zlst(:) = zlst0(:)
138  WHERE ( od_maskext(:) ) zlst0(:) = xundef
139  CALL oi_hor_extrapol_surf(ki,plat_in,plon_in,zlst0,plat_in,plon_in,zlst,ginterp_lst,w%XZS)
140  !
141  ELSE
142  !
143  is1 = count(.NOT.od_maskext)
144  ALLOCATE (zlst1(is1), zlst01(is1), zlat1(is1), zlon1(is1), zalt1(is1), ginterp_lst1(is1))
145  !
146  ! remove extension zone
147  jj = 1
148  DO j1 = 1, ki
149  IF ( .NOT.od_maskext(j1) ) THEN
150  zlst01(jj) = zlst0(j1)
151  zlat1(jj) = plat_in(j1)
152  zlon1(jj) = plon_in(j1)
153  zalt1(jj) = w%XZS (j1)
154  ginterp_lst1(jj) = ginterp_lst(j1)
155  jj = jj + 1
156  ENDIF
157  ENDDO
158 
159  zlst1(:) = zlst01(:)
160  CALL oi_hor_extrapol_surf(is1,zlat1,zlon1,zlst01,zlat1,zlon1,zlst1,ginterp_lst1,zalt1)
161  !
162  ! copy back
163  jj = 1
164  DO j1 = 1, ki
165  IF ( .NOT.od_maskext(j1) ) THEN
166  zlst(j1) = zlst1(jj)
167  jj = jj + 1
168  ENDIF
169  ENDDO
170  !
171  DEALLOCATE (zlst01, zlst1, zlat1, zlon1, zalt1, ginterp_lst1)
172  !
173  ENDIF
174  !
175 ENDIF
176 !
177 !* Print values produced by OI_HO_EXTRAPOL_SURF
178 IF ( nprintlev > 2 ) THEN
179  DO ji=1,ki
180  IF (ginterp_lst(ji)) THEN
181  print *,'Lake surface temperature set to ',zlst(ji),'from nearest neighbour at I=',u%NR_WATER(ji)
182  ENDIF
183  ENDDO
184 ENDIF
185 !
186 ! Sum the increments
187 IF (all(zlst(:)/=xundef)) THEN
188  zlstinc(:) = zlst(:) - w%XTS(:)
189  ! Setting modified variables
190  w%XTS(:) = zlst(:)
191 ELSE
192  zlstinc(:) = 0.
193 ENDIF
194 !
195 WRITE(*,*) 'Mean LST increments over inland water ',sum(zlstinc)/ki
196 !
197 IF (lhook) CALL dr_hook('ASSIM_INLAND_WATER_N',1,zhook_handle)
198 !
199 !-------------------------------------------------------------------------------------
200 !
201 END SUBROUTINE assim_inland_water_n
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine oi_hor_extrapol_surf(NDIM, PLAT_IN, PLON_IN, PFIELD_IN, PLAT, PLON, PFIELD, OINTERP, PZS, NDIM2)
subroutine assim_inland_water_n(I, U, W, HPROGRAM, KI, PTS_IN, PITM, HTEST, OLKEEPEXTZONE, OD_MASKEXT, PLON_IN, PLAT_IN)