Juan 13/01/2014: add header SURFEX_LIC to all SURFEX files
[MNH-git_open_source-lfs.git] / src / SURFEX / zoom_pgd_orography.F90
1 !SURFEX_LIC Copyright 1994-2014 Meteo-France 
2 !SURFEX_LIC This is part of the SURFEX software governed by the CeCILL-C  licence
3 !SURFEX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SURFEX_LIC for details. version 1.
5 !     #########
6       SUBROUTINE ZOOM_PGD_OROGRAPHY(HPROGRAM,PSEA,PWATER,HINIFILE,HINIFILETYPE)
7 !     ###########################################################
8
9 !!
10 !!    PURPOSE
11 !!    -------
12 !!   This program prepares the physiographic data fields.
13 !!
14 !!    METHOD
15 !!    ------
16 !!   
17 !!    EXTERNAL
18 !!    --------
19 !!
20 !!
21 !!    IMPLICIT ARGUMENTS
22 !!    ------------------
23 !!
24 !!
25 !!    REFERENCE
26 !!    ---------
27 !!
28 !!    AUTHOR
29 !!    ------
30 !!
31 !!    V. Masson                   Meteo-France
32 !!
33 !!    MODIFICATION
34 !!    ------------
35 !!
36 !!    Original     13/10/03
37 !----------------------------------------------------------------------------
38 !
39 !*    0.     DECLARATION
40 !            -----------
41 !
42 USE MODD_DATA_COVER_PAR,   ONLY : JPCOVER
43 USE MODD_SURF_ATM_n,       ONLY : XZS
44 USE MODD_SURF_ATM_GRID_n,  ONLY : XLAT, XLON, CGRID, XGRID_PAR
45 USE MODD_SURF_ATM_SSO_n,   ONLY : XSSO_STDEV, XAVG_ZS, XSIL_ZS, XMIN_ZS, XMAX_ZS,&
46                                     XSSO_ANIS, XSSO_DIR, XSSO_SLOPE,               &
47                                     XAOSIP, XAOSIM, XAOSJP, XAOSJM,                &
48                                     XHO2IP, XHO2IM, XHO2JP, XHO2JM  
49 USE MODD_PREP,             ONLY : CINGRID_TYPE, CINTERP_TYPE, LINTERP
50 USE MODD_SURF_PAR,         ONLY : XUNDEF
51 !
52 USE MODI_OPEN_AUX_IO_SURF
53 USE MODI_READ_SURF
54 USE MODI_CLOSE_AUX_IO_SURF
55 USE MODI_PREP_GRID_EXTERN
56 USE MODI_HOR_INTERPOL
57 USE MODI_PREP_OUTPUT_GRID
58 !
59 !
60 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
61 USE PARKIND1  ,ONLY : JPRB
62 !
63 USE MODI_CLEAN_PREP_OUTPUT_GRID
64 !
65 USE MODI_GET_LUOUT
66 IMPLICIT NONE
67 !
68 !*    0.1    Declaration of dummy arguments
69 !            ------------------------------
70 !
71  CHARACTER(LEN=6),     INTENT(IN)  :: HPROGRAM    ! program calling
72 REAL, DIMENSION(:),   INTENT(IN)  :: PSEA        ! sea fraction
73 REAL, DIMENSION(:),   INTENT(IN)  :: PWATER      ! inland water fraction
74  CHARACTER(LEN=28),    INTENT(IN)  :: HINIFILE    ! input atmospheric file name
75  CHARACTER(LEN=6),     INTENT(IN)  :: HINIFILETYPE! input atmospheric file type
76 !
77 !
78 !*    0.2    Declaration of local variables
79 !            ------------------------------
80 !
81 INTEGER :: IRESP
82 INTEGER :: ILUOUT
83 INTEGER :: INI     ! total 1D dimension (input field)
84 INTEGER :: IL      ! total 1D dimension (output field)
85 REAL, DIMENSION(:), POINTER :: ZZS
86 REAL, DIMENSION(:), POINTER :: ZAVG_ZS
87 REAL, DIMENSION(:), POINTER :: ZSIL_ZS
88 REAL, DIMENSION(:), POINTER :: ZSSO_STDEV
89 REAL, DIMENSION(:), POINTER :: ZMIN_ZS
90 REAL, DIMENSION(:), POINTER :: ZMAX_ZS
91 REAL, DIMENSION(:), POINTER :: ZSSO_ANIS
92 REAL, DIMENSION(:), POINTER :: ZSSO_DIR
93 REAL, DIMENSION(:), POINTER :: ZSSO_SLOPE
94 REAL, DIMENSION(:), POINTER :: ZAOSIP
95 REAL, DIMENSION(:), POINTER :: ZAOSIM
96 REAL, DIMENSION(:), POINTER :: ZAOSJP
97 REAL, DIMENSION(:), POINTER :: ZAOSJM
98 REAL, DIMENSION(:), POINTER :: ZHO2IP
99 REAL, DIMENSION(:), POINTER :: ZHO2IM
100 REAL, DIMENSION(:), POINTER :: ZHO2JP
101 REAL, DIMENSION(:), POINTER :: ZHO2JM
102  CHARACTER(LEN=12) :: YRECFM         ! Name of the article to be read
103 REAL(KIND=JPRB) :: ZHOOK_HANDLE
104 !------------------------------------------------------------------------------
105 IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_OROGRAPHY',0,ZHOOK_HANDLE)
106  CALL GET_LUOUT(HPROGRAM,ILUOUT)
107 !
108 !*      1.     Preparation of IO for reading in the file
109 !              -----------------------------------------
110 !
111 !* Note that all points are read, even those without physical meaning.
112 !  These points will not be used during the horizontal interpolation step.
113 !  Their value must be defined as XUNDEF.
114 !
115  CALL OPEN_AUX_IO_SURF(HINIFILE,HINIFILETYPE,'FULL  ')
116 !
117 !------------------------------------------------------------------------------
118 !
119 !*      2.     Reading of grid
120 !              ---------------
121 !
122  CALL PREP_GRID_EXTERN(HINIFILETYPE,ILUOUT,CINGRID_TYPE,CINTERP_TYPE,INI)
123 !
124  CALL PREP_OUTPUT_GRID(ILUOUT,CGRID,XGRID_PAR,XLAT,XLON)
125 !
126 !------------------------------------------------------------------------------
127 !
128 !*      3.     Reading of orographic parameters
129 !              --------------------------------
130 !
131 ALLOCATE(ZZS        (INI))
132 !
133 ALLOCATE(ZAVG_ZS    (INI))
134 ALLOCATE(ZSIL_ZS    (INI))
135 ALLOCATE(ZSSO_STDEV (INI))
136 ALLOCATE(ZMIN_ZS    (INI))
137 ALLOCATE(ZMAX_ZS    (INI))
138 !
139 ALLOCATE(ZSSO_ANIS  (INI))
140 ALLOCATE(ZSSO_DIR   (INI))
141 ALLOCATE(ZSSO_SLOPE (INI))
142 !
143 ALLOCATE(ZAOSIP     (INI))
144 ALLOCATE(ZAOSIM     (INI))
145 ALLOCATE(ZAOSJP     (INI))
146 ALLOCATE(ZAOSJM     (INI))
147 ALLOCATE(ZHO2IP     (INI))
148 ALLOCATE(ZHO2IM     (INI))
149 ALLOCATE(ZHO2JP     (INI))
150 ALLOCATE(ZHO2JM     (INI))
151 !
152 YRECFM='ZS'
153  CALL READ_SURF(HPROGRAM,YRECFM,ZZS,IRESP,HDIR='A')
154 !
155 YRECFM='AVG_ZS'
156  CALL READ_SURF(HPROGRAM,YRECFM,ZAVG_ZS,IRESP,HDIR='A')
157 YRECFM='SIL_ZS'
158  CALL READ_SURF(HPROGRAM,YRECFM,ZSIL_ZS,IRESP,HDIR='A')
159 YRECFM='SSO_STDEV'
160  CALL READ_SURF(HPROGRAM,YRECFM,ZSSO_STDEV,IRESP,HDIR='A')
161 YRECFM='MIN_ZS'
162  CALL READ_SURF(HPROGRAM,YRECFM,ZMIN_ZS,IRESP,HDIR='A')
163 YRECFM='MAX_ZS'
164  CALL READ_SURF(HPROGRAM,YRECFM,ZMAX_ZS,IRESP,HDIR='A')
165 !
166 YRECFM='SSO_ANIS'
167  CALL READ_SURF(HPROGRAM,YRECFM,ZSSO_ANIS,IRESP,HDIR='A')
168 YRECFM='SSO_DIR'
169  CALL READ_SURF(HPROGRAM,YRECFM,ZSSO_DIR,IRESP,HDIR='A')
170 YRECFM='SSO_SLOPE'
171  CALL READ_SURF(HPROGRAM,YRECFM,ZSSO_SLOPE,IRESP,HDIR='A')
172 !
173 YRECFM='AOSIP'
174  CALL READ_SURF(HPROGRAM,YRECFM,ZAOSIP,IRESP,HDIR='A')
175 YRECFM='AOSIM'
176  CALL READ_SURF(HPROGRAM,YRECFM,ZAOSIM,IRESP,HDIR='A')
177 YRECFM='AOSJP'
178  CALL READ_SURF(HPROGRAM,YRECFM,ZAOSJP,IRESP,HDIR='A')
179 YRECFM='AOSJM'
180  CALL READ_SURF(HPROGRAM,YRECFM,ZAOSJM,IRESP,HDIR='A')
181 YRECFM='HO2IP'
182  CALL READ_SURF(HPROGRAM,YRECFM,ZHO2IP,IRESP,HDIR='A')
183 YRECFM='HO2IM'
184  CALL READ_SURF(HPROGRAM,YRECFM,ZHO2IM,IRESP,HDIR='A')
185 YRECFM='HO2JP'
186  CALL READ_SURF(HPROGRAM,YRECFM,ZHO2JP,IRESP,HDIR='A')
187 YRECFM='HO2JM'
188  CALL READ_SURF(HPROGRAM,YRECFM,ZHO2JM,IRESP,HDIR='A')
189 !
190  CALL CLOSE_AUX_IO_SURF(HINIFILE,HINIFILETYPE)
191 !------------------------------------------------------------------------------
192 !
193 !*      4.     Interpolations
194 !              --------------
195 !
196 IL = SIZE(XLAT)
197 !
198 ALLOCATE(XZS        (IL))
199 !
200 ALLOCATE(XAVG_ZS    (IL))
201 ALLOCATE(XSIL_ZS    (IL))
202 ALLOCATE(XSSO_STDEV (IL))
203 ALLOCATE(XMIN_ZS    (IL))
204 ALLOCATE(XMAX_ZS    (IL))
205 !
206 ALLOCATE(XSSO_ANIS  (IL))
207 ALLOCATE(XSSO_DIR   (IL))
208 ALLOCATE(XSSO_SLOPE (IL))
209 !
210 ALLOCATE(XAOSIP     (IL))
211 ALLOCATE(XAOSIM     (IL))
212 ALLOCATE(XAOSJP     (IL))
213 ALLOCATE(XAOSJM     (IL))
214 ALLOCATE(XHO2IP     (IL))
215 ALLOCATE(XHO2IM     (IL))
216 ALLOCATE(XHO2JP     (IL))
217 ALLOCATE(XHO2JM     (IL))
218 !
219  CALL ZOOM(ILUOUT,ZZS,XZS)
220  CALL ZOOM(ILUOUT,ZAVG_ZS,XAVG_ZS)
221  CALL ZOOM(ILUOUT,ZSIL_ZS,XSIL_ZS)
222  CALL ZOOM(ILUOUT,ZMIN_ZS,XMIN_ZS)
223  CALL ZOOM(ILUOUT,ZMAX_ZS,XMAX_ZS)
224 !
225 LINTERP(:)=(PSEA(:)<1.)
226  CALL ZOOM(ILUOUT,ZSSO_STDEV,XSSO_STDEV)
227  CALL ZOOM(ILUOUT,ZSSO_ANIS,XSSO_ANIS)
228  CALL ZOOM(ILUOUT,ZSSO_DIR,XSSO_DIR)
229  CALL ZOOM(ILUOUT,ZSSO_SLOPE,XSSO_SLOPE)
230  CALL ZOOM(ILUOUT,ZAOSIP,XAOSIP)
231  CALL ZOOM(ILUOUT,ZAOSIM,XAOSIM)
232  CALL ZOOM(ILUOUT,ZAOSJP,XAOSJP)
233  CALL ZOOM(ILUOUT,ZAOSJM,XAOSJM)
234  CALL ZOOM(ILUOUT,ZHO2IP,XHO2IP)
235  CALL ZOOM(ILUOUT,ZHO2IM,XHO2IM)
236  CALL ZOOM(ILUOUT,ZHO2JP,XHO2JP)
237  CALL ZOOM(ILUOUT,ZHO2JM,XHO2JM)
238 !
239 !* coherence with land sea mask
240 !
241 WHERE(PSEA==1.) XZS=0.
242 WHERE(PSEA(:)==1.) XSSO_STDEV(:) = XUNDEF
243 WHERE(PWATER(:)==1.) XSSO_STDEV(:) = 0.
244 WHERE(PSEA(:)>0.) XMIN_ZS(:) = 0.
245 WHERE(PSEA(:)==1.) XMAX_ZS(:) = 0.
246 !
247 WHERE (PSEA(:)==1.)
248   XSSO_ANIS (:) = XUNDEF
249   XSSO_DIR  (:) = XUNDEF
250   XSSO_SLOPE(:) = XUNDEF
251 END WHERE
252 !
253 WHERE (PWATER(:)==1.)
254   XSSO_ANIS (:) = 1.
255   XSSO_DIR  (:) = 0.
256   XSSO_SLOPE(:) = 0.
257 END WHERE
258 !
259 WHERE (PSEA(:)==1.)
260   XHO2IP(:) = XUNDEF
261   XHO2IM(:) = XUNDEF
262   XHO2JP(:) = XUNDEF
263   XHO2JM(:) = XUNDEF
264   XAOSIP(:) = XUNDEF
265   XAOSIM(:) = XUNDEF
266   XAOSJP(:) = XUNDEF
267   XAOSJM(:) = XUNDEF
268 END WHERE
269 !
270 WHERE (PWATER(:)==1.)
271   XHO2IP(:) = 0.
272   XHO2IM(:) = 0.
273   XHO2JP(:) = 0.
274   XHO2JM(:) = 0.
275   XAOSIP(:) = 0.
276   XAOSIM(:) = 0.
277   XAOSJP(:) = 0.
278   XAOSJM(:) = 0.
279 END WHERE
280 !_______________________________________________________________________________
281 DEALLOCATE(ZZS        )
282 !
283 DEALLOCATE(ZAVG_ZS    )
284 DEALLOCATE(ZSIL_ZS    )
285 DEALLOCATE(ZSSO_STDEV )
286 DEALLOCATE(ZMIN_ZS    )
287 DEALLOCATE(ZMAX_ZS    )
288 !
289 DEALLOCATE(ZSSO_ANIS  )
290 DEALLOCATE(ZSSO_DIR   )
291 DEALLOCATE(ZSSO_SLOPE )
292 !
293 DEALLOCATE(ZAOSIP     )
294 DEALLOCATE(ZAOSIM     )
295 DEALLOCATE(ZAOSJP     )
296 DEALLOCATE(ZAOSJM     )
297 DEALLOCATE(ZHO2IP     )
298 DEALLOCATE(ZHO2IM     )
299 DEALLOCATE(ZHO2JP     )
300 DEALLOCATE(ZHO2JM     )
301 !_______________________________________________________________________________
302  CALL CLEAN_PREP_OUTPUT_GRID
303 !_______________________________________________________________________________
304 IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_OROGRAPHY',1,ZHOOK_HANDLE)
305 CONTAINS
306 !
307 SUBROUTINE ZOOM(KLUOUT,PFIELDIN,PFIELDOUT)
308 INTEGER, INTENT(IN)             :: KLUOUT
309 REAL, DIMENSION(:), POINTER     :: PFIELDIN
310 REAL, DIMENSION(:), INTENT(OUT) :: PFIELDOUT
311 REAL, DIMENSION(:,:), POINTER   :: ZFIELDIN
312 REAL, DIMENSION(:,:), POINTER   :: ZFIELDOUT
313 REAL(KIND=JPRB) :: ZHOOK_HANDLE
314 IF (LHOOK) CALL DR_HOOK('ZOOM',0,ZHOOK_HANDLE)
315 ALLOCATE(ZFIELDIN (SIZE(PFIELDIN, 1),1))
316 ALLOCATE(ZFIELDOUT(SIZE(PFIELDOUT,1),1))
317 ZFIELDIN(:,1) = PFIELDIN(:)
318  CALL HOR_INTERPOL(KLUOUT,ZFIELDIN,ZFIELDOUT)
319 PFIELDOUT(:) = ZFIELDOUT(:,1)
320 DEALLOCATE(ZFIELDIN )
321 DEALLOCATE(ZFIELDOUT)
322 IF (LHOOK) CALL DR_HOOK('ZOOM',1,ZHOOK_HANDLE)
323
324 END SUBROUTINE ZOOM
325 !
326 END SUBROUTINE ZOOM_PGD_OROGRAPHY