SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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, &
7  ig, i, &
8  hprogram,hsurf,hatmfile,hatmfiletype,hpgdfile,hpgdfiletype)
9 ! #################################################################################
10 !
11 !!**** *PREP_HOR_ISBA_CC_FIELD* - reads, interpolates and prepares an ISBA-CC field
12 ! only external case implemeted
13 !!
14 !! PURPOSE
15 !! -------
16 !
17 !!** METHOD
18 !! ------
19 !!
20 !! REFERENCE
21 !! ---------
22 !!
23 !!
24 !! AUTHOR
25 !! ------
26 !! B. Decharme
27 !!
28 !! MODIFICATIONS
29 !! -------------
30 !! Original 05/2014
31 !!------------------------------------------------------------------
32 !
33 !
34 !
35 !
36 !
37 !
39 USE modd_surf_atm_n, ONLY : surf_atm_t
40 !
41 USE modd_isba_grid_n, ONLY : isba_grid_t
42 USE modd_isba_n, ONLY : isba_t
43 !
44 USE modd_co2v_par, ONLY : xca_nit, xcc_nit
45 !
46 USE modd_prep, ONLY : linterp, cmask
47 !
48 
49 USE modd_data_cover_par, ONLY : nvegtype
50 USE modd_surf_par, ONLY : xundef,nundef
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 !
60 USE yomhook ,ONLY : lhook, dr_hook
61 USE parkind1 ,ONLY : jprb
62 !
63 IMPLICIT NONE
64 !
65 !* 0.1 declarations of arguments
66 !
67 !
68 !
69 TYPE(data_cover_t), INTENT(INOUT) :: dtco
70 TYPE(surf_atm_t), INTENT(INOUT) :: u
71 !
72 TYPE(isba_grid_t), INTENT(INOUT) :: ig
73 TYPE(isba_t), INTENT(INOUT) :: i
74 !
75  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
76  CHARACTER(LEN=8), INTENT(IN) :: hsurf ! type of field
77  CHARACTER(LEN=28), INTENT(IN) :: hatmfile ! name of the Atmospheric file
78  CHARACTER(LEN=6), INTENT(IN) :: hatmfiletype! type of the Atmospheric file
79  CHARACTER(LEN=28), INTENT(IN) :: hpgdfile ! name of the Atmospheric file
80  CHARACTER(LEN=6), INTENT(IN) :: hpgdfiletype! type of the Atmospheric file
81 !
82 !* 0.2 declarations of local variables
83 !
84  CHARACTER(LEN=6) :: yfiletype ! type of input file
85  CHARACTER(LEN=28) :: yfile ! name of file
86  CHARACTER(LEN=6) :: yfilepgdtype ! type of input file
87  CHARACTER(LEN=28) :: yfilepgd ! name of file
88 REAL, POINTER, DIMENSION(:,:,:) :: zfieldin ! field to interpolate horizontally
89 REAL, POINTER, DIMENSION(:,:) :: zfield ! field to interpolate horizontally
90 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zfieldoutp ! field interpolated horizontally
91 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zfieldoutv ! field interpolated horizontally
92 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zw ! work array (x, fine soil grid, npatch)
93 !
94 INTEGER :: iluout ! output listing logical unit
95 !
96 LOGICAL :: gunif ! flag for prescribed uniform field
97 LOGICAL :: gprep_ags ! flag to prepare ags field (only external case implemeted)
98 !
99 INTEGER :: jpatch ! loop on patches
100 INTEGER :: jvegtype ! loop on vegtypes
101 INTEGER :: ini, inl, inp, jj, jl ! Work integer
102 !
103 REAL(KIND=JPRB) :: zhook_handle
104 !-------------------------------------------------------------------------------------
105 !
106 IF (lhook) CALL dr_hook('PREP_HOR_ISBA_CC_FIELD',0,zhook_handle)
107 !
108 !* 1. Reading of input file name and type
109 !
110  CALL get_luout(hprogram,iluout)
111 !
112  CALL read_prep_isba_conf(hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype, &
113  hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,iluout,gunif)
114 !
115  cmask = 'NATURE'
116 !
117 ini=SIZE(ig%XLAT)
118 !
119 gprep_ags = .true.
120 !
121 !-------------------------------------------------------------------------------------
122 !
123 !* 2. Reading of input configuration (Grid and interpolation type)
124 !
125 IF (gunif) THEN
126  gprep_ags = .false.
127 ELSE IF (yfiletype=='ASCLLV') THEN
128  gprep_ags = .false.
129 ELSE IF (yfiletype=='GRIB ') THEN
130  gprep_ags = .false.
131 ELSE IF (yfiletype=='MESONH' .OR. yfiletype=='ASCII ' .OR. yfiletype=='LFI '.OR.yfiletype=='FA ') THEN
132  CALL prep_isba_cc_extern(&
133  hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,iluout,zfieldin,gprep_ags)
134 ELSE IF (yfiletype=='BUFFER') THEN
135  gprep_ags = .false.
136 ELSE IF (yfiletype=='NETCDF') THEN
137  gprep_ags = .false.
138 ELSE
139  CALL abor1_sfx('PREP_HOR_ISBA_CC_FIELD: data file type not supported : '//yfiletype)
140 END IF
141 !
142 !-------------------------------------------------------------------------------------
143 !
144 !* 3. Horizontal interpolation
145 !
146 IF(gprep_ags)THEN
147 !
148  inl = SIZE(zfieldin,2)
149  inp = SIZE(zfieldin,3)
150 !
151  ALLOCATE(zfieldoutp(ini,inl,inp))
152  ALLOCATE(zfield(SIZE(zfieldin,1),inl))
153 !
154  DO jpatch = 1, inp
155  zfield(:,:)=zfieldin(:,:,jpatch)
156  IF (inp==nvegtype) THEN
157  linterp = (i%XVEGTYPE(:,jpatch) > 0.)
158  ELSEIF(inp==i%NPATCH)THEN
159  linterp = (i%XPATCH(:,jpatch) > 0.)
160  ENDIF
161  CALL hor_interpol(dtco, u, &
162  iluout,zfield,zfieldoutp(:,:,jpatch))
163  linterp = .true.
164  END DO
165 !
166  DEALLOCATE(zfield)
167  DEALLOCATE(zfieldin)
168 !
169  ALLOCATE(zfieldoutv(ini,inl,nvegtype))
170 !
171  CALL put_on_all_vegtypes(ini,inl,inp,nvegtype,zfieldoutp,zfieldoutv)
172 !
173  DEALLOCATE(zfieldoutp)
174 !
175 !
176 ENDIF
177 !
178 !-------------------------------------------------------------------------------------
179 !
180 !* 6. Transformation from vegtype grid to patch grid
181 !
182 IF(gprep_ags)THEN
183 !
184  ALLOCATE(zw(ini,SIZE(zfieldoutv,2),i%NPATCH))
185 !
186  zw(:,:,:) = 0.
187  CALL vegtype_grid_to_patch_grid(i%NPATCH,i%XVEGTYPE_PATCH,i%XPATCH,zfieldoutv,zw)
188 !
189 ELSE
190 !
191  SELECT CASE (hsurf)
192  !
193  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
194  !
195  CASE('BIOMASS')
196  ALLOCATE(zw(ini,i%NNBIOMASS,i%NPATCH))
197  zw(:,:,:) = 0.
198  WHERE(i%XLAI(:,:)/=xundef)
199  zw(:,1,:) = i%XLAI(:,:) * i%XBSLAI_NITRO(:,:)
200  ENDWHERE
201  zw(:,2,:) = max( 0., (zw(:,1,:)/ (xcc_nit/10.**xca_nit)) &
202  **(1.0/(1.0-xca_nit)) - zw(:,1,:) )
203  !
204  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
205  !
206  CASE('LITTER')
207  ALLOCATE(zw(ini,i%NNLITTER*i%NNLITTLEVS,i%NPATCH))
208  zw(:,:,:) = 0.0
209  !
210  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
211  !
212  CASE('SOILCARB')
213  ALLOCATE(zw(ini,i%NNSOILCARB,i%NPATCH))
214  zw(:,:,:) = 0.0
215  !
216  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
217  !
218  CASE('LIGNIN')
219  ALLOCATE(zw(ini,i%NNLITTLEVS,i%NPATCH))
220  zw(:,:,:) = 0.0
221  !
222  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
223  !
224  END SELECT
225 !
226 ENDIF
227 !-------------------------------------------------------------------------------------
228 !
229 !* 7. Return to historical variable
230 !
231 !
232 SELECT CASE (hsurf)
233  !
234  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
235  !
236  CASE('BIOMASS')
237  ALLOCATE(i%XBIOMASS(ini,i%NNBIOMASS,i%NPATCH))
238  inl=min(i%NNBIOMASS,SIZE(zw,2))
239  DO jl=1,inl
240  WHERE(zw(:,jl,:)/=xundef)
241  i%XBIOMASS(:,jl,:) = zw(:,jl,:)
242  ELSEWHERE
243  i%XBIOMASS(:,jl,:) = 0.0
244  ENDWHERE
245  ENDDO
246  IF(i%NNBIOMASS>inl)THEN
247  DO jl=inl+1,i%NNBIOMASS
248  WHERE(zw(:,jl,:)/=xundef)
249  i%XBIOMASS(:,jl,:) = zw(:,inl,:)
250  ELSEWHERE
251  i%XBIOMASS(:,jl,:) = 0.0
252  ENDWHERE
253  ENDDO
254  ENDIF
255  !
256  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
257  !
258  CASE('LITTER')
259  ALLOCATE(i%XLITTER(ini,i%NNLITTER,i%NNLITTLEVS,i%NPATCH))
260  DO jpatch=1,i%NPATCH
261  inl=0
262  DO jj=1,i%NNLITTER
263  DO jl=1,i%NNLITTLEVS
264  inl=inl+1
265  WHERE(zw(:,inl,jpatch)/=xundef)
266  i%XLITTER(:,jj,jl,jpatch) = zw(:,inl,jpatch)
267  ELSEWHERE
268  i%XLITTER(:,jj,jl,jpatch) = 0.0
269  ENDWHERE
270  ENDDO
271  ENDDO
272  END DO
273  !
274  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
275  !
276  CASE('SOILCARB')
277  ALLOCATE(i%XSOILCARB(ini,i%NNSOILCARB,i%NPATCH))
278  WHERE(zw(:,:,:)/=xundef)
279  i%XSOILCARB(:,:,:) = zw(:,:,:)
280  ELSEWHERE
281  i%XSOILCARB(:,:,:) = 0.0
282  ENDWHERE
283  !
284  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
285  !
286  CASE('LIGNIN')
287  ALLOCATE(i%XLIGNIN_STRUC(ini,i%NNLITTLEVS,i%NPATCH))
288  WHERE(zw(:,:,:)/=xundef)
289  i%XLIGNIN_STRUC(:,:,:) = zw(:,:,:)
290  ELSEWHERE
291  i%XLIGNIN_STRUC(:,:,:) = 0.0
292  ENDWHERE
293  !
294  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
295  !
296 END SELECT
297 !
298 DEALLOCATE(zw)
299 !-------------------------------------------------------------------------------------
300 !
301 !* 8. Deallocations
302 !
303 IF (ALLOCATED(zfieldoutv)) DEALLOCATE(zfieldoutv)
304 !
305 IF (lhook) CALL dr_hook('PREP_HOR_ISBA_CC_FIELD',1,zhook_handle)
306 !
307 !-------------------------------------------------------------------------------------
308 !-------------------------------------------------------------------------------------
309 !
310 !
311 END SUBROUTINE prep_hor_isba_cc_field
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine hor_interpol(DTCO, U, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:6
subroutine read_prep_isba_conf(HPROGRAM, HVAR, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, KLUOUT, OUNIF)
subroutine vegtype_grid_to_patch_grid(KPATCH, PVEGTYPE_PATCH, PPATCH, PFIELDOUT, PW)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine put_on_all_vegtypes(KNI, KLAYER, KPATCH, KVEGTYPE, PFIELD_PATCH, PFIELD_VEGTYPE)
subroutine prep_hor_isba_cc_field(DTCO, U, IG, I, HPROGRAM, HSURF, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE)
subroutine prep_isba_cc_extern(HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, PFIELD, OPREP_AGS)