SURFEX v8.1
General documentation of Surfex
mode_read_extern.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 ! #####################
7 ! #####################
8 !-------------------------------------------------------------------
9 !
10 USE modd_surf_par, ONLY : nundef, xundef
11 USE modd_data_cover_par, ONLY : ncover, ntype, nvegtype, jpcover, nvegtype_old, nvegtype_ecosg
12 !
14 !
15 USE modi_read_lecoclimap
16 !
17 USE modi_old_name
18 USE modi_open_aux_io_surf
19 USE modi_close_aux_io_surf
21 USE modi_make_choice_array
22 USE modi_abor1_sfx
23 USE modi_read_pgd_cover_garden
24 !
25 USE yomhook ,ONLY : lhook, dr_hook
26 USE parkind1 ,ONLY : jprb
27 !
28 CONTAINS
29 !
30 !---------------------------------------------------------------------------------------
31 !
32 ! #######################
33  SUBROUTINE read_extern_depth (U, DTCO, GCP, IO, &
34  HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,&
35  KLUOUT,HISBA,HNAT,HFIELD,KNI,KLAYER, &
36  KPATCH,PSOILGRID,PDEPTH,KVERSION,KWG_LAYER )
37 ! #######################
38 !
39 USE modd_surf_atm_n, ONLY : surf_atm_t
41 !
44 !
45 USE modd_surfex_mpi, ONLY : nrank,npio
46 !
47 USE modd_prep_teb_greenroof, ONLY : ngrid_level, xgrid_soil
48 !
49 USE modi_open_aux_io_surf
50 USE modi_close_aux_io_surf
51 USE modi_read_surf_isba_par_n
52 USE modi_convert_cover_isba
53 USE modi_garden_soil_depth
54 USE modi_read_arrange_cover
55 !
56 ! Modifications :
57 ! P.Marguinaud : 11-09-2012 : shorten field name
58 ! G.Delautier : 24-06-2015 : bug for arome compressed files
59 !
60 IMPLICIT NONE
61 !
62 !* dummy arguments
63 ! ---------------
64 !
65 TYPE(surf_atm_t), INTENT(INOUT) :: U
66 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
67 !
68 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
69 TYPE(isba_options_t), INTENT(INOUT) :: IO
70 !
71  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! type of input file
72  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! type of input file
73  CHARACTER(LEN=28), INTENT(IN) :: HFILEPGD ! type of input file
74  CHARACTER(LEN=6), INTENT(IN) :: HFILEPGDTYPE ! type of input file
75 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing
76  CHARACTER(LEN=3), INTENT(IN) :: HISBA ! type of ISBA soil scheme
77  CHARACTER(LEN=3), INTENT(IN) :: HNAT ! type of surface (nature, gardens)
78  CHARACTER(LEN=7), INTENT(IN) :: HFIELD ! field name
79 INTEGER, INTENT(IN) :: KNI ! number of points
80 INTEGER, INTENT(IN) :: KLAYER ! number of layers
81 INTEGER, INTENT(IN) :: KPATCH ! number of patch
82 INTEGER, INTENT(IN) :: KVERSION ! surface version
83 REAL, DIMENSION(:), INTENT(IN) :: PSOILGRID !
84 REAL, DIMENSION(:,:,:), POINTER :: PDEPTH ! depth of each layer over each patches
85 INTEGER, DIMENSION(:,:), INTENT(OUT):: KWG_LAYER
86 !
87 !* local variables
88 ! ---------------
89 !
90  CHARACTER(LEN=4 ) :: YLVL
91  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
92  CHARACTER(LEN=16) :: YRECFM2
93  CHARACTER(LEN=100):: YCOMMENT ! Comment string
94  CHARACTER(LEN=6) :: YSURF
95 INTEGER :: IRESP ! reading return code
96 INTEGER :: JL ! loop counter
97 INTEGER :: JP ! loop counter
98 INTEGER :: JJ, JI, IEND
99 INTEGER :: IVERSION
100 INTEGER :: IBUGFIX
101 !
102 LOGICAL, DIMENSION(:), ALLOCATABLE :: GCOVER ! flag to read the covers
103 REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOVER ! cover fractions
104 REAL, DIMENSION(:,:), ALLOCATABLE :: ZGROUND_DEPTH ! cover fractions
105 REAL, DIMENSION(:), ALLOCATABLE :: ZSOILGRID
106 REAL, DIMENSION(KNI) :: ZHVEG ! high vegetation fraction
107 REAL, DIMENSION(KNI) :: ZLVEG ! low vegetation fraction
108 REAL, DIMENSION(KNI) :: ZNVEG ! no vegetation fraction
109 REAL, DIMENSION(KNI) :: ZPERM ! permafrost distribution
110  CHARACTER(LEN=4) :: YHVEG ! type of high vegetation
111  CHARACTER(LEN=4) :: YLVEG ! type of low vegetation
112  CHARACTER(LEN=4) :: YNVEG ! type of no vegetation
113 INTEGER :: INVEGTYPE_SAVE, IJPCOVER_SAVE
114 LOGICAL :: GECOCLIMAP ! T if ecoclimap is used
115 LOGICAL :: GECOSG
116 LOGICAL :: GPAR_GARDEN! T if garden data are used
117 LOGICAL, DIMENSION(NVEGTYPE_ECOSG) :: GDATA_DG
118 LOGICAL, DIMENSION(NVEGTYPE_ECOSG) :: GDATA_GROUND_DEPTH, GDATA_ROOT_DEPTH
119 LOGICAL :: GPERM
120 LOGICAL :: GREAD_EXT
121 LOGICAL :: GREAD_OK, GDIM, GDIM2, GWATER_TO_NATURE, GTOWN_TO_ROCK, GGARDEN
122 REAL(KIND=JPRB) :: ZHOOK_HANDLE
123 !
124 !
125 !------------------------------------------------------------------------------
126 !
127 IF (lhook) CALL dr_hook('MODE_READ_EXTERN:READ_EXTERN_DEPTH',0,zhook_handle)
128 !
129  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'FULL ')
130 
131  yrecfm='VERSION'
132  CALL read_surf(hfilepgdtype,yrecfm,iversion,iresp,hdir='-')
133 !
134 yrecfm='BUG'
135  CALL read_surf(hfilepgdtype,yrecfm,ibugfix,iresp,hdir='-')
136 !
137 gdim = (iversion>8 .OR. iversion==8 .AND. ibugfix>0)
138 gdim2 = gdim
139 IF (gdim) CALL read_surf(hfilepgdtype,'SPLIT_PATCH',gdim2,iresp)
140 !
141  CALL read_lecoclimap(hfilepgdtype,gecoclimap,gecosg,hdir='-')
142 IF (hnat=='NAT') THEN
143  ysurf = "NATURE"
144  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
145 ELSE
146  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
147  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'TOWN ')
148  CALL read_surf(hfilepgdtype,'PAR_GARDEN',gpar_garden,iresp,hdir='-')
149  gecoclimap = .NOT. gpar_garden
150  IF (.NOT.gecoclimap) gecosg = .false.
151  ysurf = "TOWN "
152  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
153 END IF
154 !
155 invegtype_save = nvegtype
156 ijpcover_save = jpcover
157 IF (gecosg) THEN
158  nvegtype = nvegtype_ecosg
159  jpcover = sum(ntype)
160 ELSE
161  nvegtype = nvegtype_old
162  jpcover = ncover
163 ENDIF
164 !
165 !------------------------------------------------------------------------------
166 !
167 ALLOCATE(pdepth(kni,klayer,kpatch))
168 pdepth(:,:,:) = xundef
169 !
170 kwg_layer(:,:) = nundef
171 !
172  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,ysurf)
173 !
174 !-------------------------------------------------------------------
175 !
176 gread_ok = .false.
177 !
178 !
179 iend = 1
180 IF (gdim) iend = nvegtype_ecosg
181 !
182 IF (hnat=='NAT' .AND. (iversion>=7 .OR. .NOT.gecoclimap)) THEN
183  !
184  !* directly read soil layers in the file for nature ISBA soil layers
185  !
186  gdata_dg(:) = .false.
187  IF (.NOT.gecoclimap) gdata_dg(:) = .true.
188  IF (iversion>=7) THEN
189  yrecfm='L_DG'
190  ycomment=yrecfm
191  CALL read_surf(hfilepgdtype,yrecfm,gdata_dg(1:iend),iresp,hcomment=ycomment,hdir='-')
192  ENDIF
193  !
194  IF (any(gdata_dg(1:iend))) THEN
195  !
196  DO jl=1,klayer
197  IF (gdim) THEN
198  WRITE(yrecfm,fmt='(A6,I2.2)') 'D_DG_L',jl
199  ELSE
200  IF (jl<10) WRITE(yrecfm,fmt='(A4,I1.1)') 'D_DG',jl
201  IF (jl>=10) WRITE(yrecfm,fmt='(A4,I2.2)') 'D_DG',jl
202  ENDIF
203  CALL read_surf_isba_par_n(dtco, u, gcp, kpatch, hfilepgdtype, yrecfm, kluout, kni, &
204  iversion, ibugfix, gdata_dg, pdepth(:,jl,:),iresp,hdir='E')
205  END DO
206  gread_ok = .true.
207  !
208  ENDIF
209  !
210  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=2) THEN
211  !
212  !cas when root_depth and ground_depth were extrapolated in extrapol_field
213  !during pgd step
214  IF (.NOT.any(gdata_dg(1:iend)) .AND. hisba=="3-L") THEN
215  !
216  yrecfm2='L_ROOT_DEPTH'
217  ycomment=yrecfm2
218  CALL read_surf(hfilepgdtype,yrecfm2,gdata_root_depth(1:iend),iresp,hcomment=ycomment,hdir='-')
219  !
220  IF (any(gdata_root_depth(1:iend))) THEN
221  IF (gdim) THEN
222  yrecfm2='D_RTDPT_'
223  ELSE
224  yrecfm2='D_ROOT_DEPTH'
225  ENDIF
226  CALL read_surf_isba_par_n(dtco, u, gcp, kpatch, hfilepgdtype, yrecfm2, kluout, kni, &
227  iversion, ibugfix, gdata_root_depth, pdepth(:,2,:),iresp,hdir='E')
228  ENDIF
229  !
230  ENDIF
231  !
232  yrecfm2='L_GROUND_DEPTH'
233  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) yrecfm2='L_GROUND_DPT'
234  ycomment=yrecfm2
235  CALL read_surf(hfilepgdtype,yrecfm2,gdata_ground_depth(1:iend),iresp,hcomment=ycomment,hdir='-')
236  !
237  IF (any(gdata_ground_depth(1:iend))) THEN
238  !
239  ALLOCATE(zground_depth(kni,kpatch))
240  IF (gdim) THEN
241  yrecfm2='D_GRDPT_'
242  ELSE
243  yrecfm2='D_GROUND_DEPTH'
244  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) yrecfm2='D_GROUND_DPT'
245  ENDIF
246  CALL read_surf_isba_par_n(dtco, u, gcp, kpatch, hfilepgdtype, yrecfm2, kluout, kni, &
247  iversion, ibugfix, gdata_ground_depth, zground_depth(:,:),iresp,hdir='E')
248  !
249  IF (.NOT.any(gdata_dg(1:iend))) THEN
250  !
251  IF (hisba=="2-L") THEN
252  !
253  pdepth(:,2,:) = zground_depth(:,:)
254  pdepth(:,1,:) = xundef
255  WHERE (zground_depth(:,:)/=xundef) pdepth(:,1,:) = 0.01
256  gread_ok = .true.
257  !
258  ELSEIF (hisba=="3-L") THEN
259  !
260  pdepth(:,3,:) = zground_depth(:,:)
261  pdepth(:,1,:) = xundef
262  WHERE (zground_depth(:,:)/=xundef) pdepth(:,1,:) = 0.01
263  IF (any(gdata_root_depth(1:iend))) gread_ok = .true.
264  !
265  ELSEIF (hisba=="DIF") THEN
266  !
267  ALLOCATE(zsoilgrid(klayer))
268  DO jl=1,klayer
269  WRITE(ylvl,'(I4)') jl
270  yrecfm2='SOILGRID'//adjustl(ylvl(:len_trim(ylvl)))
271  CALL read_surf(hfilepgdtype,yrecfm,zsoilgrid(jl),iresp)
272  pdepth(:,jl,:) = zsoilgrid(jl)
273  ENDDO
274  DEALLOCATE(zsoilgrid)
275  gread_ok = .true.
276  !
277  ENDIF
278  ENDIF
279  !
280  DO jp=1,kpatch
281  DO jj=1,kni
282  DO jl=1,klayer
283  IF ( pdepth(jj,jl,jp) <= zground_depth(jj,jp) .AND. zground_depth(jj,jp) < xundef ) &
284  kwg_layer(jj,jp) = jl
285  ENDDO
286  ENDDO
287  ENDDO
288  DEALLOCATE(zground_depth)
289  !
290  ENDIF
291  !
292  ENDIF
293  !
294 ELSE IF (hnat=='GD' .AND. .NOT.gecoclimap ) THEN
295  !
296  !* computes soil layers from vegetation fractions read in the file
297  !
298  CALL read_surf(hfilepgdtype,'D_TYPE_HVEG',yhveg,iresp,hdir='E')
299  CALL read_surf(hfilepgdtype,'D_TYPE_LVEG',ylveg,iresp,hdir='E')
300  CALL read_surf(hfilepgdtype,'D_TYPE_NVEG',ynveg,iresp,hdir='E')
301  CALL read_surf(hfilepgdtype,'D_FRAC_HVEG',zhveg,iresp,hdir='E')
302  CALL read_surf(hfilepgdtype,'D_FRAC_LVEG',zlveg,iresp,hdir='E')
303  CALL read_surf(hfilepgdtype,'D_FRAC_NVEG',znveg,iresp,hdir='E')
304  ! Ground layers
305  CALL garden_soil_depth(ynveg,ylveg,yhveg,znveg,zlveg,zhveg,pdepth)
306  !
307 ELSEIF (hnat=='GR' .AND. .NOT.gecoclimap ) THEN
308 ! Depth of greenroof ground layers
309  pdepth(:, 1,:) = xgrid_soil(ngrid_level - 5)
310  pdepth(:, 2,:) = xgrid_soil(ngrid_level - 4)
311  pdepth(:, 3,:) = xgrid_soil(ngrid_level - 3)
312  pdepth(:, 4,:) = xgrid_soil(ngrid_level - 2)
313  pdepth(:, 5,:) = xgrid_soil(ngrid_level - 1)
314  pdepth(:, 6,:) = xgrid_soil(ngrid_level - 0)
315 END IF
316 !
317  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
318 !
319 IF (gecoclimap .AND. .NOT.gread_ok ) THEN
320  !
321  IF (iversion>8 .OR. (iversion==8 .AND. ibugfix>=1)) THEN
322  CALL open_aux_io_surf(hfile,hfiletype,'FULL ')
323  CALL read_surf(hfiletype,'WRITE_EXT ',gread_ext,iresp,hdir='-')
324  CALL close_aux_io_surf(hfile,hfiletype)
325  ELSE
326  gread_ext = .false.
327  ENDIF
328  !
329  IF (gread_ext) THEN
330  !
331  CALL open_aux_io_surf(hfile,hfiletype,ysurf)
332  yrecfm='VERSION'
333  CALL read_surf(hfiletype,yrecfm,iversion,iresp)
334  yrecfm='BUG'
335  CALL read_surf(hfiletype,yrecfm,ibugfix,iresp)
336  gdim = (iversion>8 .OR. iversion==8 .AND. ibugfix>0)
337  gdim2 = gdim
338  IF (gdim) CALL read_surf(hfiletype,'SPLIT_PATCH',gdim2,iresp)
339  DO jl=1,klayer
340  WRITE(ylvl,'(I4)') jl
341  yrecfm='DG'//adjustl(ylvl(:len_trim(ylvl)))
342  CALL make_choice_array(hfiletype, kpatch, gdim2, yrecfm, pdepth(:,jl,:),hdir='E')
343  END DO
344  CALL close_aux_io_surf(hfile,hfiletype)
345  !
346  ELSE
347  !
348  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'FULL ')
349  !
350  !* reading of the cover to obtain the depth of inter-layers
351  !
352  IF (gdim.AND.gecosg) THEN
353  ALLOCATE(gcover(sum(ntype)))
354  ELSE
355  ALLOCATE(gcover(ncover))
356  ENDIF
357  !
358  CALL old_name(hfilepgdtype,'COVER_LIST ',yrecfm,hdir='-')
359  CALL read_surf(hfilepgdtype,yrecfm,gcover(:),iresp,hdir='-')
360  !
361  IF (nrank==npio) THEN
362  ALLOCATE(zcover(kni,count(gcover)))
363  ELSE
364  ALLOCATE(zcover(0,0))
365  ENDIF
366  yrecfm='COVER'
367  CALL read_surf_cov(hfilepgdtype,yrecfm,zcover(:,:),gcover(:),iresp,hdir='E')
368  !
369  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
370  !
371  !* computes soil layers
372  !
373  !* permafrost distribution for soil depth
374  !
375  gperm =.false.
376  zperm(:)=0.0
377  !
378  IF (hnat=='NAT'.AND.(iversion>7 .OR. (iversion==7 .AND. ibugfix>3)))THEN
379  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'NATURE')
380  yrecfm='PERMAFROST'
381  CALL read_surf(hfilepgdtype,yrecfm,gperm,iresp,hdir='-')
382  IF(gperm)THEN
383  yrecfm='PERM'
384  CALL read_surf(hfilepgdtype,yrecfm,zperm(:),iresp,hdir='E')
385  ENDIF
386  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
387  ENDIF
388  !
389  IF (SIZE(gcover)/=jpcover) THEN
390  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'NATURE')
391  CALL read_pgd_cover_garden(hfilepgdtype,ggarden)
392  CALL read_arrange_cover(hfilepgdtype,gwater_to_nature,gtown_to_rock,'A')
393  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
394  ELSE
395  ggarden = .false.
396  gwater_to_nature = .false.
397  gtown_to_rock = .false.
398  ENDIF
399  !
400  IF (nrank==npio) THEN
401  CALL convert_cover_isba(dtco, io%CALBEDO, &
402  hisba,io%LTR_ML,1,zcover,gcover,' ',hnat,psoilgrid=psoilgrid, &
403  pperm=zperm,pdg=pdepth,kwg_layer=kwg_layer, &
404  owater_to_nature=gwater_to_nature, otown_to_rock=gtown_to_rock, &
405  ogarden=ggarden )
406  ENDIF
407  !
408  DEALLOCATE(gcover,zcover)
409  !
410  ENDIF
411  !
412 ENDIF
413 !
414 nvegtype = invegtype_save
415 jpcover = ijpcover_save
416 !-------------------------------------------------------------------
417 !
418 IF (lhook) CALL dr_hook('MODE_READ_EXTERN:READ_EXTERN_DEPTH',1,zhook_handle)
419 !-------------------------------------------------------------------
420 !
421 END SUBROUTINE read_extern_depth
422 !
423 !
424 !-------------------------------------------------------------------
425 !---------------------------------------------------------------------------------------
426 !
427 ! #######################
428  SUBROUTINE read_extern_isba (U, DTCO, GCP, IO, &
429  HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,&
430  KLUOUT,KNI,HFIELD,HNAME,PFIELD,PDEPTH,OKEY)
431 ! #######################
432 !
433 !
435 USE modd_surf_atm_n, ONLY : surf_atm_t
437 !
440 !
441 USE modd_surfex_mpi, ONLY : nrank
442 USE modd_isba_par, ONLY : xoptimgrid
443 !
444 USE mode_soil
445 USE modi_read_surf
446 USE modi_isba_soc_parameters
448 !
449 IMPLICIT NONE
450 !
451 !* dummy arguments
452 ! ---------------
453 !
454 TYPE(surf_atm_t), INTENT(INOUT) :: U
455 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
456 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
457 !
458 TYPE(isba_options_t), INTENT(INOUT) :: IO
459 !
460  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! name of file
461  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! type of input file
462  CHARACTER(LEN=28), INTENT(IN) :: HFILEPGD ! name of file
463  CHARACTER(LEN=6), INTENT(IN) :: HFILEPGDTYPE ! type of input file
464 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing
465 INTEGER, INTENT(IN) :: KNI ! number of points
466  CHARACTER(LEN=7), INTENT(IN) :: HFIELD ! field name
467  CHARACTER(LEN=*), INTENT(IN) :: HNAME ! field name in the file
468 REAL, DIMENSION(:,:,:), POINTER :: PFIELD ! field to initialize
469 REAL, DIMENSION(:,:,:), POINTER :: PDEPTH ! depth of each inter-layer
470 LOGICAL, OPTIONAL, INTENT(INOUT) :: OKEY
471 !
472 !
473 !* local variables
474 ! ---------------
475 !
476 TYPE(isba_k_t) :: YK
477 TYPE(isba_np_t) :: YNP
478 TYPE(isba_p_t), POINTER :: PK
479 !
480  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
481 #ifdef MNH_PARALLEL
482  CHARACTER(LEN=8) :: YPATCH
483 #endif
484  CHARACTER(LEN=4) :: YLVL
485  CHARACTER(LEN=4) :: YPEDOTF ! type of pedo-transfert function
486  CHARACTER(LEN=3) :: YISBA ! type of ISBA soil scheme
487  CHARACTER(LEN=3) :: YNAT ! type of surface (nature, garden)
488 !
489 INTEGER :: IRESP ! reading return code
490 INTEGER :: ILAYER, ILAYER_SAVE ! number of layers
491 INTEGER :: JL ! loop counter
492 INTEGER :: IPATCH ! number of patch
493 INTEGER :: JP ! loop counter
494 INTEGER :: JVEGTYPE ! loop counter
495 LOGICAL :: GTEB ! TEB field
496 LOGICAL :: GGD
497 INTEGER :: IWORK ! work integer
498 INTEGER :: JI
499 !
500 REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLAY ! clay fraction
501 REAL, DIMENSION(:,:), ALLOCATABLE :: ZSAND ! sand fraction
502 REAL, DIMENSION(:,:), ALLOCATABLE :: ZCONDSAT ! sand fraction
503 REAL, DIMENSION(:,:), ALLOCATABLE :: ZMPOTSAT ! sand fraction
504 REAL, DIMENSION(:,:), ALLOCATABLE :: ZBCOEF ! sand fraction
505 REAL, DIMENSION(:,:), ALLOCATABLE :: ZSOC_GR ! sand fraction
506 REAL, DIMENSION(:), ALLOCATABLE :: ZSOILGRID
507 REAL, DIMENSION(:), ALLOCATABLE :: ZNAT ! natural surface fraction
508 !
509 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWWILT ! wilting point
510 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWFC ! field capacity
511 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWSAT ! saturation
512 REAL, DIMENSION(:,:), ALLOCATABLE :: ZPATCH
513 !
514 REAL, DIMENSION(KNI,2) :: ZSOC
515 !
516 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK, ZFRACSOC
517 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWG_LAYER
518 !
519 LOGICAL :: GTEMP_ARP ! Arpege soil temperature profile
520 LOGICAL :: GSOC_DATA ! Soil organic carbon (data in pgd)
521 LOGICAL :: GSOC ! Soil organic carbon (physical option)
522 !
523 REAL, PARAMETER :: ZWSAT_OM = 0.9 ! Porosity of OM (m3/m3)
524 REAL, PARAMETER :: ZMPOT_WWILT = -150. ! Matric potential at wilting point (m)
525 REAL, PARAMETER :: ZHYDCOND_WFC = 1.157e-9 ! Hydraulic conductivity at field capacity (m/s)
526 !
527 INTEGER :: IVERSION ! surface version
528 INTEGER :: IBUGFIX, ISIZE
529 LOGICAL :: GDIM, GDIM2
530 LOGICAL :: GDATA_WSAT, GDATA_WWILT, GDATA_WFC, GDATA_CONDSAT, GDATA_MPOTSAT, GDATA_BCOEF, GCALC
531 !
532 REAL(KIND=JPRB) :: ZHOOK_HANDLE
533 !-------------------------------------------------------------------------------
534 IF (lhook) CALL dr_hook('MODE_READ_EXTERN:READ_EXTERN_ISBA',0,zhook_handle)
535 WRITE (kluout,*) ' | Reading ',hfield,' in externalized file'
536 !
537 !------------------------------------------------------------------------------
538 ! Init
539 !
540 gteb = (hname(1:3)=='TWN' .OR. hname(1:3)=='GD_' .OR. hname(1:3)=='GR_' &
541  .OR. hname(4:6)=='GD_' .OR. hname(4:6)=='GR_')
542 ggd = .false.
543 IF (gteb) ggd = (hname(1:3)=='TWN' .OR. hname(1:3)=='GD_' .OR. hname(4:6)=='GD_')
544 !
545 gtemp_arp = .false.
546 gsoc = .false.
547 gsoc_data = .false.
548 !
549 !------------------------------------------------------------------------------
550 !
551  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'FULL ')
552 yrecfm='VERSION'
553  CALL read_surf(hfilepgdtype,yrecfm,iversion,iresp,hdir='-')
554 yrecfm='BUG'
555  CALL read_surf(hfilepgdtype,yrecfm,ibugfix,iresp,hdir='-')
556  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
557 gdim = (iversion>8 .OR. iversion==8 .AND. ibugfix>0)
558 
559 !
560 IF (gteb) THEN
561  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'TOWN ')
562 ELSE
563  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'NATURE')
564 ENDIF
565 !
566 !* Read number of soil layers
567 !
568 yrecfm='GROUND_LAYER'
569 IF (gteb) THEN
570  yrecfm='TWN_LAYER'
571  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) THEN
572  IF (ggd) THEN
573  yrecfm='GD_LAYER'
574  ELSE
575  yrecfm='GR_LAYER'
576  ENDIF
577  ENDIF
578 ENDIF
579  CALL read_surf(hfilepgdtype,yrecfm,ilayer,iresp,hdir='-')
580 !
581 !* number of tiles
582 !
583 ipatch=1
584 IF (.NOT. gteb) THEN
585  yrecfm='PATCH_NUMBER'
586  CALL read_surf(hfilepgdtype,yrecfm,ipatch,iresp,hdir='-')
587 END IF
588 !
589 !* soil scheme
590 !
591 yrecfm='ISBA'
592 IF (gteb) THEN
593  yrecfm='TWN_ISBA'
594  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) THEN
595  IF (ggd) THEN
596  yrecfm='GD_ISBA'
597  ELSE
598  yrecfm='GR_ISBA'
599  ENDIF
600  ENDIF
601 ENDIF
602  CALL read_surf(hfilepgdtype,yrecfm,yisba,iresp,hdir='-')
603 IF(yisba=='DIF'.AND.PRESENT(okey))THEN
604  okey=.false.
605 ENDIF
606 !
607 IF (iversion>=7) THEN
608  !
609  !* Pedo-transfert function
610  !
611  yrecfm='PEDOTF'
612  IF (gteb) THEN
613  yrecfm='TWN_PEDOTF'
614  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) yrecfm='GD_PEDOTF'
615  ENDIF
616  CALL read_surf(hfilepgdtype,yrecfm,ypedotf,iresp,hdir='-')
617  !
618 ELSE
619  ypedotf = 'CH78'
620 ENDIF
621 !
622 !Only Brook and Corey with Force-Restore scheme
623 IF(yisba/='DIF')THEN
624  ypedotf='CH78'
625 ENDIF
626 !
627 IF (hfield=='WG ' .OR. hfield=='WGI ') THEN
628  !
629  ALLOCATE (zwfc(kni,ilayer))
630  ALLOCATE (zwwilt(kni,ilayer))
631  ALLOCATE (zwsat(kni,ilayer))
632  IF (gteb.AND..NOT.ggd) THEN
633  ALLOCATE(zbcoef(kni,ilayer))
634  ALLOCATE(zmpotsat(kni,ilayer))
635  ALLOCATE(zcondsat(kni,ilayer))
636  ENDIF
637  !
638  IF (gdim) THEN
639  yrecfm='L_WFC'
640  CALL read_surf(hfilepgdtype,yrecfm,gdata_wfc,iresp,hdir='E')
641  IF (gdata_wfc) THEN
642  DO jl=1,ilayer
643  WRITE(yrecfm,fmt='(A9,I2.2)') 'D_WFC_L',jl
644  CALL read_surf(hfilepgdtype,yrecfm,zwfc(:,jl),iresp,hdir='E')
645  ENDDO
646  ENDIF
647  yrecfm='L_WWILT'
648  CALL read_surf(hfilepgdtype,yrecfm,gdata_wwilt,iresp,hdir='E')
649  IF (gdata_wwilt) THEN
650  DO jl=1,ilayer
651  WRITE(yrecfm,fmt='(A9,I2.2)') 'D_WWILT_L',jl
652  CALL read_surf(hfilepgdtype,yrecfm,zwwilt(:,jl),iresp,hdir='E')
653  ENDDO
654  ENDIF
655  yrecfm='L_WSAT'
656  CALL read_surf(hfilepgdtype,yrecfm,gdata_wsat,iresp,hdir='E')
657  IF (gdata_wsat) THEN
658  DO jl=1,ilayer
659  WRITE(yrecfm,fmt='(A9,I2.2)') 'D_WSAT_L',jl
660  CALL read_surf(hfilepgdtype,yrecfm,zwsat(:,jl),iresp,hdir='E')
661  ENDDO
662  ENDIF
663  IF (gteb.AND..NOT.ggd) THEN
664  yrecfm='L_CONDSAT'
665  CALL read_surf(hfilepgdtype,yrecfm,gdata_condsat,iresp,hdir='E')
666  IF (gdata_condsat) THEN
667  DO jl=1,ilayer
668  WRITE(yrecfm,fmt='(A9,I2.2)') 'D_CNDSAT_L',jl
669  CALL read_surf(hfilepgdtype,yrecfm,zcondsat(:,jl),iresp,hdir='E')
670  ENDDO
671  ENDIF
672  yrecfm='L_MPOTSAT'
673  CALL read_surf(hfilepgdtype,yrecfm,gdata_mpotsat,iresp,hdir='E')
674  IF (gdata_mpotsat) THEN
675  DO jl=1,ilayer
676  WRITE(yrecfm,fmt='(A9,I2.2)') 'D_MPTSAT_L',jl
677  CALL read_surf(hfilepgdtype,yrecfm,zmpotsat(:,jl),iresp,hdir='E')
678  ENDDO
679  ENDIF
680  yrecfm='L_BCOEF'
681  CALL read_surf(hfilepgdtype,yrecfm,gdata_bcoef,iresp,hdir='E')
682  IF (gdata_bcoef) THEN
683  DO jl=1,ilayer
684  WRITE(yrecfm,fmt='(A9,I2.2)') 'D_BCOEF_L',jl
685  CALL read_surf(hfilepgdtype,yrecfm,zbcoef(:,jl),iresp,hdir='E')
686  ENDDO
687  ENDIF
688  ENDIF
689  ELSE
690  gdata_wwilt = .false.
691  gdata_wfc = .false.
692  gdata_wsat = .false.
693  gdata_condsat = .false.
694  gdata_mpotsat = .false.
695  gdata_bcoef = .false.
696  ENDIF
697  !
698  gcalc = .false.
699  IF (.NOT.(gdata_wwilt.AND.gdata_wfc.AND.gdata_wsat)) THEN
700  IF ((.NOT.gteb.OR.ggd).OR..NOT.(gdata_condsat.AND.gdata_mpotsat.AND.gdata_bcoef)) gcalc = .true.
701  ENDIF
702  !
703  IF (gcalc) THEN
704  !
705  !-------------------------------------------------------------------------------
706  !
707  ! *. Read clay fraction
708  ! ------------------
709  !
710  ALLOCATE(zclay(kni,ilayer))
711  yrecfm='CLAY'
712  IF (gteb) THEN
713  yrecfm='TWN_CLAY'
714  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) yrecfm='GD_CLAY'
715  ENDIF
716  IF (.NOT.gteb.OR.ggd) THEN
717  CALL read_surf(hfilepgdtype,yrecfm,zclay(:,1),iresp,hdir='E')
718  DO jl=2,ilayer
719  zclay(:,jl) = zclay(:,1)
720  ENDDO
721  ELSE
722  DO jl=1,ilayer
723  WRITE(yrecfm,fmt='(A9,I2.2)') 'D_CLAY_GR',jl
724  CALL read_surf(hfilepgdtype,yrecfm,zclay(:,jl),iresp,hdir='E')
725  ENDDO
726  ENDIF
727  !
728  !-------------------------------------------------------------------------------
729  !
730  ! *. Read sand fraction
731  ! ------------------
732  !
733  ALLOCATE(zsand(kni,ilayer))
734  yrecfm='SAND'
735  IF (gteb) THEN
736  yrecfm='TWN_SAND'
737  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) yrecfm='GD_SAND'
738  ENDIF
739  IF (.NOT.gteb.OR.ggd) THEN
740  CALL read_surf(hfilepgdtype,yrecfm,zsand(:,1),iresp,hdir='E')
741  DO jl=2,ilayer
742  zsand(:,jl) = zsand(:,1)
743  ENDDO
744  ELSE
745  DO jl=1,ilayer
746  WRITE(yrecfm,fmt='(A9,I2.2)') 'D_SAND_GR',jl
747  CALL read_surf(hfilepgdtype,yrecfm,zsand(:,jl),iresp,hdir='E')
748  ENDDO
749  ENDIF
750  !
751  IF (gteb.AND..NOT.ggd) THEN
752  ALLOCATE(zsoc_gr(kni,ilayer))
753  DO jl=1,ilayer
754  WRITE(yrecfm,fmt='(A7,I2.2)') 'D_OM_GR',jl
755  CALL read_surf(hfilepgdtype,yrecfm,zsoc_gr(:,jl),iresp,hdir='E')
756  ENDDO
757  ENDIF
758  !
759  ENDIF
760  !
761 ENDIF
762 !-------------------------------------------------------------------------------
763 !
764 !
765 ! *. Soil organic carbon profile
766 ! ---------------------------
767 !
768 IF ( (.NOT.gteb).AND.(iversion>7.OR.(iversion==7.AND.ibugfix>3)) &
769  .AND.(yisba=='DIF').AND.(hfield=='WG '.OR.hfield=='WGI ') ) THEN
770  yrecfm='SOCP'
771  CALL read_surf(hfilepgdtype,yrecfm,gsoc_data,iresp)
772  IF(gsoc_data)THEN
773  yrecfm='SOC_TOP'
774  CALL read_surf(hfilepgdtype,yrecfm,zsoc(:,1),iresp,hdir='E')
775  yrecfm='SOC_SUB'
776  CALL read_surf(hfilepgdtype,yrecfm,zsoc(:,2),iresp,hdir='E')
777  WHERE(zsoc(:,:)==xundef)zsoc(:,:)=0.0
778  ENDIF
779 ENDIF
780 !
781 !-------------------------------------------------------------------------------
782 !
783 ! *. Read soil grid
784 ! --------------
785 !
786 !* Reference grid for DIF
787 !
788 IF(yisba=='DIF') THEN
789  ALLOCATE(zsoilgrid(ilayer))
790  zsoilgrid=xundef
791  IF (.NOT.gteb.OR.ggd) THEN
792  IF (iversion>=8) THEN
793  DO jl=1,ilayer
794  WRITE(ylvl,'(I4)') jl
795  yrecfm='SOILGRID'//adjustl(ylvl(:len_trim(ylvl)))
796  IF (gteb) THEN
797  yrecfm='GD_SGRID'//adjustl(ylvl(:len_trim(ylvl)))
798  ENDIF
799  CALL read_surf(hfilepgdtype,yrecfm,zsoilgrid(jl),iresp,hdir='A')
800  ENDDO
801  ELSEIF (iversion==7 .AND. ibugfix>=2.AND.ggd) THEN
802  yrecfm='SOILGRID'
803  IF (gteb) THEN
804  yrecfm='TWN_SOILGRID'
805  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) yrecfm='GD_SOILGRID'
806  ENDIF
807  CALL read_surf(hfilepgdtype,yrecfm,zsoilgrid,iresp,hdir='A')
808  ELSE
809  zsoilgrid(1:ilayer) = xoptimgrid(1:ilayer)
810  ENDIF
811  ELSE
812  zsoilgrid(1:ilayer) = xoptimgrid(1:ilayer)
813  ENDIF
814 ELSE
815  ALLOCATE(zsoilgrid(0))
816 ENDIF
817 !
818 ALLOCATE(iwg_layer(kni,ipatch))
819 iwg_layer(:,:) = nundef
820 !
821 ! *. Read fraction of nature
822 ! --------------
823 !
824 ALLOCATE(znat(kni))
825 IF (iversion>=7) THEN
826  IF (gteb) THEN
827  CALL read_surf(hfilepgdtype,'FRAC_TOWN',znat,iresp,hdir='E')
828  ELSE
829  CALL read_surf(hfilepgdtype,'FRAC_NATURE',znat,iresp,hdir='E')
830  ENDIF
831 ELSE
832  znat=1.0
833 ENDIF
834 !
835 !
836  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
837 !
838 !
839 IF (.NOT.gteb .AND. hfield=='TG ' .AND. (yisba=='2-L' .OR. yisba=='3-L') ) THEN
840  IF (iversion>7) THEN
841  yrecfm='TEMPARP'
842  CALL open_aux_io_surf(hfile,hfiletype,'NATURE')
843  CALL read_surf(hfiletype,yrecfm,gtemp_arp,iresp,hdir='-')
844  IF(gtemp_arp)THEN
845  yrecfm = 'NTEMPLARP'
846  CALL read_surf(hfiletype,yrecfm,ilayer,iresp,hdir='-')
847  ENDIF
848  CALL close_aux_io_surf(hfile,hfiletype)
849  ENDIF
850 ENDIF
851 !
852 !
853 IF ((hfield=='TG ') .AND. (yisba=='2-L' .OR. yisba=='3-L')) THEN
854  ALLOCATE(pdepth(kni,ilayer,nvegtype))
855  DO jvegtype=1,nvegtype
856  pdepth(:,1,jvegtype) = 0.01
857  pdepth(:,2,jvegtype) = 0.40
858  IF (ilayer==3) pdepth(:,3,jvegtype) = 5.00
859 ! GTEMP_ARP case
860  IF (gtemp_arp) THEN
861  pdepth(:,3,jvegtype) = 1.0
862  DO jl=4,ilayer
863  pdepth(:,jl,jvegtype) = pdepth(:,jl-1,jvegtype)+1.
864  ENDDO
865  ENDIF
866  END DO
867 ELSE
868  ynat='NAT'
869  IF (gteb) THEN
870  IF (ggd) THEN
871  ynat='GD'
872  ELSE
873  ynat='GR'
874  ENDIF
875  ENDIF
876  !
877  CALL read_extern_depth(u, dtco, gcp, io, &
878  hfile,hfiletype,hfilepgd,hfilepgdtype, &
879  kluout,yisba,ynat,hfield,kni, &
880  ilayer,ipatch,zsoilgrid,pdepth,iversion,iwg_layer)
881  !
882 END IF
883 !
884 DEALLOCATE(zsoilgrid)
885 !
886 !
887 ! *. Read soil variable profile
888 ! --------------------------
889 !
890 IF (gteb) THEN
891  CALL open_aux_io_surf(hfile,hfiletype,'TOWN ')
892 ELSE
893  CALL open_aux_io_surf(hfile,hfiletype,'NATURE')
894 ENDIF
895 !
896 yrecfm='VERSION'
897  CALL read_surf(hfiletype,yrecfm,iversion,iresp)
898 yrecfm='BUG'
899  CALL read_surf(hfiletype,yrecfm,ibugfix,iresp)
900 gdim = (iversion>8 .OR. iversion==8 .AND. ibugfix>0)
901 gdim2 = gdim
902 IF (gdim) CALL read_surf(hfiletype,'SPLIT_PATCH',gdim2,iresp)
903 !
904 iwork=ilayer
905 IF(yisba=='2-L'.OR.yisba=='3-L') THEN
906  SELECT CASE(hfield)
907  CASE('TG ')
908  IF(gtemp_arp)THEN
909  iwork=ilayer
910  ELSE
911  iwork=2
912  ENDIF
913  CASE('WGI ')
914  iwork=2
915  END SELECT
916 ENDIF
917 !
918 ALLOCATE(pfield(kni,ilayer,ipatch))
919 !
920 DO jl=1,iwork
921  WRITE(ylvl,'(I4)') jl
922  yrecfm=trim(hname)//adjustl(ylvl(:len_trim(ylvl)))
923  IF (gteb) THEN
924  CALL make_choice_array(hfiletype, ipatch, gdim2, yrecfm, pfield(:,jl,:),hdir='E',kpatch=0)
925  ELSE
926  CALL make_choice_array(hfiletype, ipatch, gdim2, yrecfm, pfield(:,jl,:),hdir='E')
927  ENDIF
928 END DO
929 !
930 DO jp=1,ipatch
931  DO jl=1,iwork
932  WHERE (znat(:)==0.) pfield(:,jl,jp) = xundef
933  ENDDO
934 END DO
935 !
936 DEALLOCATE (znat)
937 !
938 IF(yisba=='3-L') THEN
939  SELECT CASE(hfield)
940  CASE('TG ')
941  IF(.NOT.gtemp_arp)pfield(:,3,:)=pfield(:,2,:)
942  CASE('WGI ')
943  pfield(:,3,:)=pfield(:,2,:)
944  END SELECT
945 ENDIF
946 !
947  CALL close_aux_io_surf(hfile,hfiletype)
948 !
949 !
950 ! *. Compute relative humidity from units kg/m^2 (SWI)
951 ! ------------------------------------------------
952 !
953 IF (hfield=='WG ' .OR. hfield=='WGI ') THEN
954  !
955  IF (gcalc) THEN
956  !
957  ! Compute ISBA model constants
958  !
959  DO jl=1,ilayer
960  zwsat(:,jl) = wsat_func(zclay(:,jl),zsand(:,jl),ypedotf)
961  zwwilt(:,jl) = wwilt_func(zclay(:,jl),zsand(:,jl),ypedotf)
962  IF(yisba=='DIF')THEN
963  zwfc(:,jl) = w33_func(zclay(:,jl),zsand(:,jl),ypedotf)
964  ELSE
965  zwfc(:,jl) = wfc_func(zclay(:,jl),zsand(:,jl),ypedotf)
966  ENDIF
967  ENDDO
968  !
969  IF (gteb.AND..NOT.ggd) THEN
970  !
971  DO jl=1,ilayer
972  zbcoef(:,jl) = bcoef_func(zclay(:,jl),zsand(:,jl),ypedotf)
973  zcondsat(:,jl) = hydcondsat_func(zclay(:,jl),zsand(:,jl),ypedotf)
974  zmpotsat(:,jl) = matpotsat_func(zclay(:,jl),zsand(:,jl),ypedotf)
975 
976  WHERE (zwsat(:,jl)/=xundef)
977  zwsat(:,jl) = zsoc_gr(:,jl)* zwsat_om +(1-zsoc_gr(:,jl))* zwsat(:,jl)
978  zwwilt(:,jl) = exp(((log(-1*zmpot_wwilt)-log(-1*zmpotsat(:,jl))) &
979  / (-1*zbcoef(:,jl)))+log(zwsat(:,jl)))
980  zwfc(:,jl) = exp(((log(zhydcond_wfc)-log(zcondsat(:,jl))) &
981  / (2*zbcoef(:,jl)+3))+log(zwsat(:,jl)))
982  END WHERE
983  END DO
984  DEALLOCATE(zbcoef,zmpotsat,zcondsat)
985  !
986  ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
987  ! Validation case : experimental values for Nancy 2011 case
988  ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
989  ! Substrate layer
990  DO jl=1,4
991  zwsat(:,jl) = 0.674 ! Value tested
992  zwwilt(:,jl) = 0.15 ! from OBS-NANCY
993  zwfc(:,jl) = 0.37 ! from OBS-NANCY
994  ENDDO
995  ! Drainage layer
996  DO jl=5,6
997  zwsat(:,jl) = 0.9 ! Value tested
998  zwwilt(:,jl) = 0.15 ! sert à initialiser le WG ds la couche
999  zwfc(:,jl) = 0.37 ! sert à initialiser le WG ds la couche
1000  ENDDO
1001 
1002  ENDIF
1003  !
1004  DEALLOCATE (zsand)
1005  DEALLOCATE (zclay)
1006  !
1007  IF(gsoc_data)THEN
1008  !
1009  ALLOCATE(zwork(kni,ipatch))
1010  !
1011  CALL open_aux_io_surf(hfile,hfiletype,'NATURE')
1012  !
1013  yrecfm='SOC'
1014  CALL read_surf(hfiletype,yrecfm,gsoc,iresp,hdir='-')
1015  yrecfm='PATCH'
1016  CALL make_choice_array(hfiletype, ipatch, gdim2, yrecfm, zwork,hdir='E')
1017  WHERE(zwork(:,:)==xundef)zwork(:,:)=0.0
1018  CALL close_aux_io_surf(hfile,hfiletype)
1019  !
1020  IF(gsoc)THEN
1021  !
1022  ALLOCATE(ynp%AL(ipatch))
1023  DO jp = 1,ipatch
1024  pk => ynp%AL(jp)
1025  pk%NSIZE_P = kni
1026  ALLOCATE(pk%NR_P(kni))
1027  DO ji = 1,kni
1028  pk%NR_P(ji) = ji
1029  ENDDO
1030  ALLOCATE(pk%XPATCH(kni))
1031  pk%XPATCH = zwork(:,jp)
1032  ALLOCATE(pk%XDG(kni,ilayer))
1033  pk%XDG(:,:) = pdepth(:,:,jp)
1034  ALLOCATE(pk%XCONDSAT(kni,ilayer))
1035  pk%XCONDSAT(:,:) = 0.0
1036  ENDDO
1037  ALLOCATE(yk%XBCOEF (kni,ilayer))
1038  ALLOCATE(yk%XMPOTSAT (kni,ilayer))
1039  ALLOCATE(yk%XHCAPSOIL(kni,ilayer))
1040  ALLOCATE(yk%XCONDDRY (kni,ilayer))
1041  ALLOCATE(yk%XCONDSLD (kni,ilayer))
1042  ALLOCATE(yk%XWD0 (kni,ilayer))
1043  ALLOCATE(yk%XKANISO (kni,ilayer))
1044  ALLOCATE(zfracsoc(kni,ilayer))
1045  yk%XBCOEF (:,:)=0.0
1046  yk%XMPOTSAT (:,:)=0.0
1047  yk%XHCAPSOIL(:,:)=0.0
1048  yk%XCONDDRY (:,:)=xundef
1049  yk%XCONDSLD (:,:)=xundef
1050  yk%XWD0 (:,:)=0.0
1051  yk%XKANISO (:,:)=0.0
1052  zfracsoc(:,:)=0.0
1053  CALL isba_soc_parameters ('NONE', zsoc, yk, ynp, zfracsoc, &
1054  zwsat, zwfc, zwwilt, ipatch)
1055  CALL isba_k_init(yk)
1056  CALL isba_np_init(ynp,ipatch)
1057  !
1058  ENDIF
1059  !
1060  ENDIF
1061  !
1062  ENDIF
1063  !
1064  IF(yisba=='DIF')THEN
1065  !
1066  ! extrapolation of deep layers
1067  DO jp=1,ipatch
1068  DO ji=1,kni
1069  iwork=iwg_layer(ji,jp)
1070  IF(iwork<ilayer)THEN
1071  DO jl=iwork+1,ilayer
1072  pfield(ji,jl,jp)=pfield(ji,iwork,jp)
1073  ENDDO
1074  ENDIF
1075  ENDDO
1076  ENDDO
1077  ENDIF
1078  !
1079  IF (hfield=='WG ') THEN
1080  DO jp=1,ipatch
1081  DO jl=1,ilayer
1082  DO ji=1,kni
1083  IF(pfield(ji,jl,jp)/=xundef)THEN
1084  pfield(ji,jl,jp) = max(min(pfield(ji,jl,jp),zwsat(ji,jl)),0.)
1085  !
1086  pfield(ji,jl,jp) = (pfield(ji,jl,jp) - zwwilt(ji,jl)) / &
1087  (zwfc(ji,jl) - zwwilt(ji,jl))
1088  ENDIF
1089  END DO
1090  END DO
1091  END DO
1092  ELSE IF (hfield=='WGI ') THEN
1093  DO jp=1,ipatch
1094  DO jl=1,ilayer
1095  WHERE(pfield(:,jl,jp)/=xundef)
1096  pfield(:,jl,jp) = pfield(:,jl,jp) / zwsat(:,jl)
1097  END WHERE
1098  END DO
1099  END DO
1100  END IF
1101 !
1102  DEALLOCATE (zwsat)
1103  DEALLOCATE (zwwilt)
1104  DEALLOCATE (zwfc)
1105 !
1106 END IF
1107 !
1108 DEALLOCATE(iwg_layer)
1109 !-------------------------------------------------------------------------------
1110 !
1111 IF (lhook) CALL dr_hook('MODE_READ_EXTERN:READ_EXTERN_ISBA',1,zhook_handle)
1112 !
1113 !------------------------------------------------------------------------------
1114 !
1115 END SUBROUTINE read_extern_isba
1116 !
1117 !------------------------------------------------------------------------------
1118 !
1119 END MODULE mode_read_extern
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine make_choice_array(HPROGRAM, KNPATCH, ODIM, HRECFM, PWORK, HDIR, KPATCH)
subroutine old_name(HPROGRAM, HRECIN, HRECOUT, HDIR)
Definition: old_name.F90:7
subroutine isba_soc_parameters(HRUNOFF, PSOC, K, NP, PFRACSOC, PWSAT, PWFC, PWWILT, KPATCH)
subroutine close_aux_io_surf(HFILE, HFILETYPE)
subroutine read_surf_cov(HPROGRAM, HREC, PFIELD, OFLAG, KRESP, HCOMMENT, HDIR)
real, parameter xundef
subroutine read_lecoclimap(HPROGRAM, OECOCLIMAP, OECOSG, HDIR)
subroutine convert_cover_isba(DTCO, HALBEDO, HISBA, OTR_ML, KDECADE, PCOVER, OCOV
integer, parameter jprb
Definition: parkind1.F90:32
subroutine isba_np_init(YISBA_NP, KPATCH)
Definition: modd_isban.F90:775
subroutine read_extern_depth(U, DTCO, GCP, IO, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, HISBA, HNAT, HFIELD, KNI, KLAYER, KPATCH, PSOILGRID, PDEPTH, KVERSION, KWG_LAYER)
integer, parameter nundef
subroutine read_pgd_cover_garden(HPROGRAM, OGARDEN)
subroutine read_extern_isba(U, DTCO, GCP, IO, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, KNI, HFIELD, HNAME, PFIELD, PDEPTH, OKEY)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
logical lhook
Definition: yomhook.F90:15
subroutine read_arrange_cover( HPROGRAM, OWATER_TO_NATURE, OTOWN_TO_
subroutine isba_k_init(YISBA_K)
Definition: modd_isban.F90:558
subroutine open_aux_io_surf(HFILE, HFILETYPE, HMASK, HDIR)
subroutine read_surf_isba_par_n(DTCO, U, GCP, KPATCH, HPROGRAM, H
static int count
Definition: memory_hook.c:21