SURFEX v8.1
General documentation of Surfex
read_surf_isba_parn.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 read_surf_isba_par_n (DTCO, U, GCP, KPATCH, HPROGRAM, HREC, KLUOUT, KSIZE, &
7  KVERSION, KBUGFIX, ODATA, PFIELD, KRESP, HCOMMENT, HDIR)
8 ! #######################
9 !
10 !! MODIFICATIONS
11 !! -------------
12 !
14 USE modd_surf_atm_n, ONLY : surf_atm_t
16 !
17 USE modd_data_cover_par, ONLY : nvegtype
18 !
20 USE modi_hor_interpol
21 USE modi_put_on_all_vegtypes
22 USE modi_vegtype_to_patch
23 !
24 USE yomhook ,ONLY : lhook, dr_hook
25 USE parkind1 ,ONLY : jprb
26 !
27 IMPLICIT NONE
28 !
29 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
30 TYPE(surf_atm_t), INTENT(INOUT) :: U
31 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
32 !
33 INTEGER, INTENT(IN) :: KPATCH
34 !
35  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program
36  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
37 !
38 INTEGER, INTENT(IN) :: KLUOUT
39 INTEGER, INTENT(IN) :: KSIZE
40 INTEGER, INTENT(IN) :: KVERSION
41 INTEGER, INTENT(IN) :: KBUGFIX
42 LOGICAL, DIMENSION(:), INTENT(INOUT) :: ODATA
43 !
44 REAL, DIMENSION(:,:), INTENT(OUT):: PFIELD ! array containing the data field
45 
46 INTEGER ,INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
47  CHARACTER(LEN=*),OPTIONAL,INTENT(OUT) :: HCOMMENT ! name of the article to be read
48  CHARACTER(LEN=1),OPTIONAL,INTENT(IN) :: HDIR ! type of field :
49 ! ! 'H' : field with
50 ! ! horizontal spatial dim.
51 ! ! '-' : no horizontal dim.
52 !
53 !* local variables
54 ! ---------------
55 !
56  CHARACTER(LEN=12) :: YREC
57  CHARACTER(LEN=3) :: YVEG
58 REAL, DIMENSION(KSIZE, NVEGTYPE) :: ZFIELD
59 REAL, DIMENSION(SIZE(PFIELD,1),1,KPATCH) :: ZFIELD_PATCH
60 REAL, DIMENSION(SIZE(PFIELD,1),1,NVEGTYPE) :: ZFIELD_VEGTYPE
61  CHARACTER(LEN=1) :: YDIR
62 INTEGER :: INI, JP, IPATCH, JV, JV2
63 REAL(KIND=JPRB) :: ZHOOK_HANDLE
64 !
65 !-------------------------------------------------------------------
66 IF (lhook) CALL dr_hook('READ_SURF_ISBA_PAR_n',0,zhook_handle)
67 !
68 ydir = 'H'
69 IF (PRESENT(hdir)) ydir = hdir
70 !
71 ini = SIZE(pfield,1)
72 !
73 zfield(:,:) = 0.
74 !
75 IF (kversion<7) THEN
76  !
77  ! fields were written by patch
78  CALL read_surf(hprogram,hrec,zfield(:,1:kpatch),kresp,hcomment=hcomment,hdir=ydir)
79  ! case zoom
80  IF (ini.NE.ksize) THEN
81  CALL hor_interpol(dtco, u, gcp, kluout,zfield(:,1:kpatch),pfield(:,1:kpatch))
82  ELSE
83  ! classical case
84  pfield(:,1:kpatch) = zfield(:,1:kpatch)
85  ENDIF
86  !
87  ! classical case
88  IF (SIZE(pfield,2)==nvegtype) THEN
89  DO jp = 1, kpatch
90  zfield_patch(:,1,jp) = pfield(:,jp)
91  ENDDO
92  ! patchs shared on vegtypes
93  CALL put_on_all_vegtypes(ini,1,kpatch,nvegtype,zfield_patch,zfield_vegtype)
94  pfield(:,:) = zfield_vegtype(:,1,:)
95  ENDIF
96  !
97 ELSE
98  !
99  IF (kversion>8 .OR. (kversion==8 .AND. kbugfix>=1)) THEN
100  !
101  DO jv = 1,nvegtype
102  IF (odata(jv)) THEN
103  WRITE(yveg,fmt='(A1,I2.2)') 'V',jv
104  yrec = trim(adjustl(hrec))//yveg
105  CALL read_surf(hprogram,yrec,zfield(:,jv),kresp,hcomment=hcomment,hdir=ydir)
106  ELSE
107 
108  !IF (HREC(1:3)=='LAI'.OR.HREC(1:10)=='ALBNIR_VEG'.OR.HREC(1:10)=='ALBVIS_VEG' &
109  ! .OR. HREC(1:6)=='H_TREE') THEN
110  ! IF (JV<=3) ZFIELD(:,JV) = 0.
111  ! IF (HREC(1:6)=='H_TREE'.AND.((JV>=7.AND.JV<=12).OR.JV>=18)) ZFIELD(:,JV) = 0.
112  ! ODATA(JV) = .TRUE.
113  !ENDIF
114 
115  IF (.NOT.odata(jv)) THEN
116  DO jv2=jv,1,-1
117  IF (odata(jv2)) THEN
118  zfield(:,jv) = zfield(:,jv2)
119  EXIT
120  ENDIF
121  ENDDO
122  ENDIF
123  ENDIF
124  ENDDO
125  !
126  ELSE
127  !
128  ! field written by vegtype
129  CALL read_surf(hprogram,hrec,zfield(:,:),kresp,hcomment=hcomment,hdir=ydir)
130  !
131  ENDIF
132  !
133  ! case zoom
134  IF (ini.NE.ksize) THEN
135  CALL hor_interpol(dtco, u, gcp, kluout,zfield(:,:),zfield_vegtype(:,1,:))
136  ELSE
137  ! classical case
138  zfield_vegtype(:,1,:) = zfield(:,:)
139  ENDIF
140  !
141  ! case mode_read_extern
142  IF (SIZE(pfield,2).NE.nvegtype) THEN
143  ipatch = SIZE(pfield,2)
144  pfield(:,:) = 0.
145  DO jv = 1, nvegtype
146  jp = vegtype_to_patch(jv,ipatch)
147  ! artefact to simplify in mode_read_extern: we take the upper value
148  pfield(:,jp) = max(pfield(:,jp),zfield_vegtype(:,1,jv))
149  ENDDO
150  ELSE
151  ! classical case
152  pfield(:,:) = zfield_vegtype(:,1,:)
153  ENDIF
154 ENDIF
155 !
156 IF (lhook) CALL dr_hook('READ_SURF_ISBA_PAR_n',1,zhook_handle)
157 !-------------------------------------------------------------------
158 !
159 END SUBROUTINE read_surf_isba_par_n
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine put_on_all_vegtypes(KNI, KLAYER, KPATCH, KVEGTYPE, PFIELD_P
integer function vegtype_to_patch(IVEGTYPE, INPATCH)
subroutine hor_interpol(DTCO, U, GCP, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine read_surf_isba_par_n(DTCO, U, GCP, KPATCH, HPROGRAM, H