SURFEX v8.1
General documentation of Surfex
prep_hor_isba_cc_field.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 prep_hor_isba_cc_field (DTCO, U, GCP, KLAT, IO, S, NK, NP, NPE, &
7  HPROGRAM,HSURF,HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,YDCTL)
8 ! #################################################################################
9 !
10 !!**** *PREP_HOR_ISBA_CC_FIELD* - reads, interpolates and prepares an ISBA-CC field
11 ! only external case implemeted
12 !!
13 !! PURPOSE
14 !! -------
15 !
16 !!** METHOD
17 !! ------
18 !!
19 !! REFERENCE
20 !! ---------
21 !!
22 !!
23 !! AUTHOR
24 !! ------
25 !! B. Decharme
26 !!
27 !! MODIFICATIONS
28 !! -------------
29 !! Original 05/2014
30 !! P. Marguinaud10/2014, Support for a 2-part PREP
31 !!------------------------------------------------------------------
32 !
34 USE modd_surf_atm_n, ONLY : surf_atm_t
36 !
40 !
41 USE modd_co2v_par, ONLY : xca_nit, xcc_nit
42 !
43 USE modd_prep, ONLY : linterp, cmask
44 !
45 USE modd_surfex_mpi, ONLY : nrank, npio, ncomm, nproc
46 !
47 USE modd_data_cover_par, ONLY : nvegtype
48 USE modd_surf_par, ONLY : xundef,nundef
49 !
51 !
52 USE modi_read_prep_isba_conf
53 USE modi_abor1_sfx
54 USE modi_hor_interpol
55 USE modi_vegtype_grid_to_patch_grid
56 USE modi_get_luout
57 USE modi_prep_isba_cc_extern
58 USE modi_put_on_all_vegtypes
59 USE modi_get_prep_interp
61 !
62 USE yomhook ,ONLY : lhook, dr_hook
63 USE parkind1 ,ONLY : jprb
64 !
65 IMPLICIT NONE
66 !
67 #ifdef SFX_MPI
68 include "mpif.h"
69 #endif
70 !
71 !* 0.1 declarations of arguments
72 !
73 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
74 TYPE(surf_atm_t), INTENT(INOUT) :: U
75 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
76 !
77 INTEGER, INTENT(IN) :: KLAT
78 TYPE(isba_options_t), INTENT(INOUT) :: IO
79 TYPE(isba_s_t), INTENT(INOUT) :: S
80 TYPE(isba_nk_t), INTENT(INOUT) :: NK
81 TYPE(isba_np_t), INTENT(INOUT) :: NP
82 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
83 type(prep_ctl), INTENT(INOUT) :: ydctl
84 !
85  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
86  CHARACTER(LEN=8), INTENT(IN) :: HSURF ! type of field
87  CHARACTER(LEN=28), INTENT(IN) :: HATMFILE ! name of the Atmospheric file
88  CHARACTER(LEN=6), INTENT(IN) :: HATMFILETYPE! type of the Atmospheric file
89  CHARACTER(LEN=28), INTENT(IN) :: HPGDFILE ! name of the Atmospheric file
90  CHARACTER(LEN=6), INTENT(IN) :: HPGDFILETYPE! type of the Atmospheric file
91 !
92 !* 0.2 declarations of local variables
93 !
94 TYPE fout
95  REAL, DIMENSION(:,:), ALLOCATABLE :: ZOUT
96 END TYPE fout
97 TYPE nfout
98  TYPE(fout), DIMENSION(:), ALLOCATABLE :: AL
99 END TYPE nfout
100 type(nfout) :: zw
101 TYPE(nfout) :: ZF
102 !
103 TYPE(isba_p_t), POINTER :: PK
104 TYPE(isba_pe_t), POINTER :: PEK
105 !
106  CHARACTER(LEN=6) :: YFILETYPE ! type of input file
107  CHARACTER(LEN=28) :: YFILE ! name of file
108  CHARACTER(LEN=6) :: YFILEPGDTYPE ! type of input file
109  CHARACTER(LEN=28) :: YFILEPGD ! name of file
110 REAL, POINTER, DIMENSION(:,:,:) :: ZFIELDIN ! field to interpolate horizontally
111 REAL, POINTER, DIMENSION(:,:,:) :: ZFIELDOUTP ! field interpolated horizontally
112 REAL, POINTER, DIMENSION(:,:,:) :: ZFIELDOUTV ! field interpolated horizontally
113 !
114 INTEGER :: ILUOUT ! output listing logical unit
115 !
116 LOGICAL :: GUNIF ! flag for prescribed uniform field
117 LOGICAL :: GPREP_AGS ! flag to prepare ags field (only external case implemeted)
118 !
119 INTEGER :: JP ! loop on patches
120 INTEGER :: JVEGTYPE ! loop on vegtypes
121 INTEGER :: INL, INP, JJ, JL ! Work integer
122 INTEGER :: INFOMPI
123 !
124 REAL, DIMENSION(:,:), ALLOCATABLE :: ZPATCH
125 !
126 REAL(KIND=JPRB) :: ZHOOK_HANDLE
127 !-------------------------------------------------------------------------------------
128 !
129 IF (lhook) CALL dr_hook('PREP_HOR_ISBA_CC_FIELD',0,zhook_handle)
130 !
131 !* 1. Reading of input file name and type
132 !
133  CALL get_luout(hprogram,iluout)
134 !
135  CALL read_prep_isba_conf(hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype, &
136  hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,iluout,gunif)
137 !
138 cmask = 'NATURE'
139 !
140 gprep_ags = .true.
141 !
142 !-------------------------------------------------------------------------------------
143 !
144 !* 2. Reading of input configuration (Grid and interpolation type)
145 !
146 NULLIFY (zfieldin, zfieldoutp, zfieldoutv)
147 !
148 IF (ydctl%LPART1) THEN
149 !
150  IF (gunif) THEN
151  gprep_ags = .false.
152  ELSE IF (yfiletype=='ASCLLV') THEN
153  gprep_ags = .false.
154  ELSE IF (yfiletype=='GRIB ') THEN
155  gprep_ags = .false.
156  ELSE IF (yfiletype=='MESONH' .OR. yfiletype=='ASCII ' .OR. yfiletype=='LFI '&
157  .OR.yfiletype=='FA '.OR. yfiletype=='AROME '.OR.yfiletype=='NC ') THEN
158  CALL prep_isba_cc_extern(gcp,hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,iluout,zfieldin,gprep_ags)
159  ELSE IF (yfiletype=='BUFFER') THEN
160  gprep_ags = .false.
161  ELSE IF (yfiletype=='NETCDF') THEN
162  gprep_ags = .false.
163  ELSE
164  CALL abor1_sfx('PREP_HOR_ISBA_CC_FIELD: data file type not supported : '//yfiletype)
165  END IF
166 !
167  inl = SIZE(zfieldin,2)
168  inp = SIZE(zfieldin,3)
169 !
170 ENDIF
171 !-------------------------------------------------------------------------------------
172 !
173 !* 3. Horizontal interpolation
174 !
175  CALL prep_ctl_int_part2 (ydctl, hsurf, cmask, 'NATURE', zfieldin)
176 !
177 IF (ydctl%LPART3) THEN
178 !
179  IF(gprep_ags)THEN
180  !
181  IF (nrank==npio) THEN
182  inl = SIZE(zfieldin,2)
183  inp = SIZE(zfieldin,3)
184  ELSEIF (.NOT.ASSOCIATED(zfieldin)) THEN
185  ALLOCATE(zfieldin(0,0,0))
186  ENDIF
187  !
188  IF (nproc>1) THEN
189 #ifdef SFX_MPI
190  CALL mpi_bcast(inl,kind(inl)/4,mpi_integer,npio,ncomm,infompi)
191  CALL mpi_bcast(inp,kind(inp)/4,mpi_integer,npio,ncomm,infompi)
192 #endif
193  ENDIF
194  ALLOCATE(zfieldoutp(klat,inl,inp))
195  !
196  ! ZPATCH is the array of output patches put on the input patches
197  ALLOCATE(zpatch(klat,inp))
198  zpatch(:,:) = 0.
199 !
200  CALL get_prep_interp(inp,io%NPATCH,s%XVEGTYPE,s%XPATCH,zpatch)
201 
202  DO jp = 1, inp
203  ! we interpolate each point the output patch is present
204  linterp(:) = (zpatch(:,jp) > 0.)
205  CALL hor_interpol(dtco, u, gcp, iluout,zfieldin(:,:,jp),zfieldoutp(:,:,jp))
206  linterp = .true.
207  END DO
208 !
209  DEALLOCATE(zfieldin)
210 !
211  ENDIF
212  !
213 ENDIF
214 !
215  CALL prep_ctl_int_part4 (ydctl, hsurf, 'NATURE', cmask, zfieldin, zfieldoutp)
216 !
217 IF (ydctl%LPART5) THEN
218 
219  ALLOCATE(zw%AL(io%NPATCH))
220 
221  IF (gprep_ags) THEN
222 
223  inl = SIZE (zfieldoutp,2)
224  inp = SIZE (zfieldoutp,3)
225 
226  IF (io%NPATCH/=inp) THEN
227 
228  ALLOCATE(zfieldoutv(klat,inl,nvegtype))
229  CALL put_on_all_vegtypes(klat,inl,inp,nvegtype,zfieldoutp,zfieldoutv)
230 !
231  DEALLOCATE(zfieldoutp)
232 !
233 !-------------------------------------------------------------------------------------
234 !
235 !* 6. Transformation from vegtype grid to patch grid
236 !
237  !
238  DO jp = 1,io%NPATCH
239  pk => np%AL(jp)
240  !
241  ALLOCATE(zw%AL(jp)%ZOUT(pk%NSIZE_P,inl))
242  !
243  CALL vegtype_grid_to_patch_grid(jp,io%NPATCH,pk%XVEGTYPE_PATCH,pk%XPATCH,&
244  pk%NR_P,zfieldoutv,zw%AL(jp)%ZOUT)
245  ENDDO
246  !
247  DEALLOCATE(zfieldoutv)
248  !
249  ELSE
250  !
251  DO jp = 1,io%NPATCH
252  !
253  pk => np%AL(jp)
254  !
255  ALLOCATE(zw%AL(jp)%ZOUT(pk%NSIZE_P,inl))
256  !
257  CALL pack_same_rank(pk%NR_P,zfieldoutp(:,:,jp),zw%AL(jp)%ZOUT)
258  !
259  ENDDO
260  !
261  DEALLOCATE(zfieldoutp)
262  !
263  ENDIF
264  !
265  ELSE
266  !
267  DO jp = 1,io%NPATCH
268  pk => np%AL(jp)
269  pek => npe%AL(jp)
270  !
271  SELECT CASE (hsurf)
272  !
273  CASE('BIOMASS')
274  ALLOCATE(zw%AL(jp)%ZOUT(pk%NSIZE_P,io%NNBIOMASS))
275  zw%AL(jp)%ZOUT(:,:) = 0.
276  WHERE(pek%XLAI(:)/=xundef)
277  zw%AL(jp)%ZOUT(:,1) = pek%XLAI(:) * pk%XBSLAI_NITRO(:)
278  ENDWHERE
279  zw%AL(jp)%ZOUT(:,2) = max( 0., (zw%AL(jp)%ZOUT(:,1)/ (xcc_nit/10.**xca_nit)) &
280  **(1.0/(1.0-xca_nit)) - zw%AL(jp)%ZOUT(:,1) )
281  !
282  CASE('LITTER')
283  ALLOCATE(zw%AL(jp)%ZOUT(pk%NSIZE_P,io%NNLITTER*io%NNLITTLEVS))
284  zw%AL(jp)%ZOUT(:,:) = 0.0
285  !
286  CASE('SOILCARB')
287  ALLOCATE(zw%AL(jp)%ZOUT(pk%NSIZE_P,io%NNSOILCARB))
288  zw%AL(jp)%ZOUT(:,:) = 0.0
289  !
290  CASE('LIGNIN')
291  ALLOCATE(zw%AL(jp)%ZOUT(pk%NSIZE_P,io%NNLITTLEVS))
292  zw%AL(jp)%ZOUT(:,:) = 0.0
293  !
294  END SELECT
295  !
296  ENDDO
297  !
298  ENDIF
299 !-------------------------------------------------------------------------------------
300 !
301 !* 7. Return to historical variable
302 !
303 !
304  SELECT CASE (hsurf)
305  !
306  CASE('BIOMASS')
307  DO jp = 1,io%NPATCH
308  pek => npe%AL(jp)
309  pk => np%AL(jp)
310 
311  ALLOCATE(pek%XBIOMASS(pk%NSIZE_P,io%NNBIOMASS))
312  inl=min(io%NNBIOMASS,SIZE(zw%AL(jp)%ZOUT,2))
313  DO jl=1,inl
314  WHERE(zw%AL(jp)%ZOUT(:,jl)/=xundef)
315  pek%XBIOMASS(:,jl) = zw%AL(jp)%ZOUT(:,jl)
316  ELSEWHERE
317  pek%XBIOMASS(:,jl) = 0.0
318  ENDWHERE
319  ENDDO
320  IF(io%NNBIOMASS>inl)THEN
321  DO jl=inl+1,io%NNBIOMASS
322  WHERE(zw%AL(jp)%ZOUT(:,jl)/=xundef)
323  pek%XBIOMASS(:,jl) = zw%AL(jp)%ZOUT(:,inl)
324  ELSEWHERE
325  pek%XBIOMASS(:,jl) = 0.0
326  ENDWHERE
327  ENDDO
328  ENDIF
329  ENDDO
330  !
331  CASE('LITTER')
332  DO jp = 1,io%NPATCH
333  pek => npe%AL(jp)
334  pk => np%AL(jp)
335 
336  ALLOCATE(pek%XLITTER(pk%NSIZE_P,io%NNLITTER,io%NNLITTLEVS))
337  inl=0
338  DO jj=1,io%NNLITTER
339  DO jl=1,io%NNLITTLEVS
340  inl=inl+1
341  WHERE(zw%AL(jp)%ZOUT(:,inl)/=xundef)
342  pek%XLITTER(:,jj,jl) = zw%AL(jp)%ZOUT(:,inl)
343  ELSEWHERE
344  pek%XLITTER(:,jj,jl) = 0.0
345  ENDWHERE
346  ENDDO
347  ENDDO
348  END DO
349  !
350  CASE('SOILCARB')
351  DO jp = 1,io%NPATCH
352  pek => npe%AL(jp)
353  pk => np%AL(jp)
354 
355  ALLOCATE(pek%XSOILCARB(pk%NSIZE_P,io%NNSOILCARB))
356  WHERE(zw%AL(jp)%ZOUT(:,:)/=xundef)
357  pek%XSOILCARB(:,:) = zw%AL(jp)%ZOUT(:,:)
358  ELSEWHERE
359  pek%XSOILCARB(:,:) = 0.0
360  ENDWHERE
361  ENDDO
362  !
363  CASE('LIGNIN')
364  DO jp = 1,io%NPATCH
365  pek => npe%AL(jp)
366  pk => np%AL(jp)
367 
368  ALLOCATE(pek%XLIGNIN_STRUC(pk%NSIZE_P,io%NNLITTLEVS))
369  WHERE(zw%AL(jp)%ZOUT(:,:)/=xundef)
370  pek%XLIGNIN_STRUC(:,:) = zw%AL(jp)%ZOUT(:,:)
371  ELSEWHERE
372  pek%XLIGNIN_STRUC(:,:) = 0.0
373  ENDWHERE
374  ENDDO
375  !
376  END SELECT
377  !
378  DO jp = 1,io%NPATCH
379  DEALLOCATE(zw%AL(jp)%ZOUT)
380  ENDDO
381  DEALLOCATE(zw%AL)
382  !
383 ENDIF
384 !-------------------------------------------------------------------------------------
385 !
386 !* 8. Deallocations
387 !
388 !
389 IF (lhook) CALL dr_hook('PREP_HOR_ISBA_CC_FIELD',1,zhook_handle)
390 !
391 !-------------------------------------------------------------------------------------
392 !-------------------------------------------------------------------------------------
393 !
394 !
395 END SUBROUTINE prep_hor_isba_cc_field
character(len=6) cmask
Definition: modd_prep.F90:41
subroutine get_prep_interp(KNP_IN, KNP_OUT, PVEGTYPE, PPATCH_IN, PPATCH_OUT, KMASK_IN)
subroutine put_on_all_vegtypes(KNI, KLAYER, KPATCH, KVEGTYPE, PFIELD_P
subroutine vegtype_grid_to_patch_grid(KPATCH, KNPATCH, PVEGTYPE_PATCH, PPATCH, KMASK, PFIELDOUT, PW)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine prep_isba_cc_extern(GCP, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, PFIELD, OPREP_AGS)
logical, dimension(:), allocatable linterp
Definition: modd_prep.F90:43
subroutine hor_interpol(DTCO, U, GCP, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:7
subroutine read_prep_isba_conf(HPROGRAM, HVAR, HFILE, HFILETYPE, HFILE
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter nundef
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
logical lhook
Definition: yomhook.F90:15
subroutine prep_hor_isba_cc_field(DTCO, U, GCP, KLAT, IO, S, NK, NP, NPE, HPROGRAM, HSURF, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, YDCTL)