SURFEX v8.1
General documentation of Surfex
prep_isba_cc_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 ! #########
6 SUBROUTINE prep_isba_cc_extern (GCP,HPROGRAM,HSURF,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,KLUOUT,PFIELD,OPREP_AGS)
7 ! #################################################################################
8 !
9 !!**** *PREP_ISBA_CC_EXTERN* - initializes ISBA-CC fields from external isba field
10 !!
11 !! PURPOSE
12 !! -------
13 !
14 !!** METHOD
15 !! ------
16 !!
17 !! REFERENCE
18 !! ---------
19 !!
20 !!
21 !! AUTHOR
22 !! ------
23 !! V. Masson
24 !!
25 !! MODIFICATIONS
26 !! -------------
27 !! Original 01/2004
28 !! B. Decharme 04/2014, external init with FA files
29 !!------------------------------------------------------------------
30 !
32 !
33 USE modd_surfex_mpi, ONLY : nrank, npio
35 USE modd_surf_par, ONLY : xundef
36 !
37 USE modi_prep_grid_extern
39 USE modi_open_aux_io_surf
40 USE modi_close_aux_io_surf
41 USE modi_make_choice_array
42 !
43 USE yomhook ,ONLY : lhook, dr_hook
44 USE parkind1 ,ONLY : jprb
45 !
46 IMPLICIT NONE
47 !
48 !* 0.1 declarations of arguments
49 !
50 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
51 !
52  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
53  CHARACTER(LEN=8), INTENT(IN) :: HSURF ! type of field
54  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! name of file
55  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! type of input file
56  CHARACTER(LEN=28), INTENT(IN) :: HFILEPGD ! name of file
57  CHARACTER(LEN=6), INTENT(IN) :: HFILEPGDTYPE ! type of input file
58 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing
59 REAL,DIMENSION(:,:,:), POINTER :: PFIELD ! field to interpolate horizontally (on final soil grid)
60 LOGICAL, INTENT(INOUT):: OPREP_AGS
61 !
62 !* 0.2 declarations of local variables
63 !
64 REAL, DIMENSION(:), ALLOCATABLE :: ZMASK
65 !
66  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
67 INTEGER :: IRESP ! reading return code
68 INTEGER :: INI ! total 1D dimension
69 INTEGER :: IPATCH ! number of patch
70  CHARACTER(LEN=3) :: YPHOTO
71  CHARACTER(LEN=3) :: YRESPSL
72  CHARACTER(LEN=4) :: YLVL
73 !
74 INTEGER :: JNBIOMASS ! loop counter
75 INTEGER :: JNLITTER ! loop counter
76 INTEGER :: JNLITTLEVS ! loop counter
77 INTEGER :: JNSOILCARB ! loop counter
78 INTEGER :: IVERSION, IBUGFIX ! surface version
79 INTEGER :: IWORK,INBIOMASS,INLITTER, &
80  INLITTLEVS,INSOILCARB, JP, JL
81 !
82 LOGICAL :: GDIM
83 !
84 REAL(KIND=JPRB) :: ZHOOK_HANDLE
85 !
86 !------------------------------------------------------------------------------
87 !
88 !* 1. Preparation of IO for reading in the file
89 ! -----------------------------------------
90 !
91 !* Note that all points are read, even those without physical meaning.
92 ! These points will not be used during the horizontal interpolation step.
93 ! Their value must be defined as XUNDEF.
94 !
95 IF (lhook) CALL dr_hook('PREP_ISBA_CC_EXTERN',0,zhook_handle)
96 !
97 !------------------------------------------------------------------------------
98 !
99 !* 2. Reading of grid
100 ! ---------------
101 !
102  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'FULL ')
103 !
104  CALL prep_grid_extern(gcp,hfilepgdtype,kluout,cingrid_type,cinterp_type,ini)
105 !
106 yrecfm='VERSION'
107  CALL read_surf(hfilepgdtype,yrecfm,iversion,iresp)
108 !
109 ALLOCATE(zmask(ini))
110 IF (iversion>=7) THEN
111  yrecfm='FRAC_NATURE'
112  CALL read_surf(hfilepgdtype,yrecfm,zmask,iresp,hdir='A')
113 ELSE
114  zmask(:) = 1.
115 ENDIF
116 !
117  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
118 !
119  CALL open_aux_io_surf(hfile,hfiletype,'FULL ')
120 yrecfm='VERSION'
121  CALL read_surf(hfilepgdtype,yrecfm,iversion,iresp)
122 yrecfm='BUG'
123  CALL read_surf(hfiletype,yrecfm,ibugfix,iresp)
124 gdim = (iversion>8 .OR. iversion==8 .AND. ibugfix>0)
125 IF (gdim) CALL read_surf(hfiletype,'SPLIT_PATCH',gdim,iresp)
126 !
127  CALL close_aux_io_surf(hfile,hfiletype)
128 !
129 IF (nrank/=npio) ini = 0
130 !
131 !---------------------------------------------------------------------------------------
132 !
133 !* 3. Transformation into physical quantity to be interpolated
134 ! --------------------------------------------------------
135 !
136  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'NATURE')
137 yrecfm='PHOTO'
138  CALL read_surf(hfilepgdtype,yrecfm,yphoto,iresp,hdir='-')
139 yrecfm='PATCH_NUMBER'
140  CALL read_surf(hfilepgdtype,yrecfm,ipatch,iresp,hdir='-')
141  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
142 !
143 IF(iversion<8.OR.(yphoto/='NIT'.AND.yphoto/='NCB'))THEN
144  oprep_ags = .false.
145  IF (lhook) CALL dr_hook('PREP_ISBA_CC_EXTERN',1,zhook_handle)
146  RETURN
147 ENDIF
148 !
149 SELECT CASE(hsurf)
150 !
151  CASE('BIOMASS')
152  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'NATURE')
153  yrecfm='NBIOMASS'
154  CALL read_surf(hfilepgdtype,yrecfm,inbiomass,iresp,hdir='-')
155  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
156  IF (yphoto=='NIT' .OR. yphoto=='NCB') THEN
157  ALLOCATE(pfield(ini,inbiomass,ipatch))
158  pfield(:,:,:) = xundef
159  CALL open_aux_io_surf(hfile,hfiletype,'NATURE')
160  DO jnbiomass=1,inbiomass
161  WRITE(ylvl,'(I1)') jnbiomass
162  yrecfm='BIOMA'//adjustl(ylvl(:len_trim(ylvl)))
163  CALL make_choice_array(hfiletype, ipatch, gdim, yrecfm, pfield(:,jnbiomass,:),hdir='E')
164  ENDDO
165  CALL close_aux_io_surf(hfile,hfiletype)
166  DO jp=1,SIZE(pfield,3)
167  DO jl=1,SIZE(pfield,2)
168  WHERE (zmask(:)==0.) pfield(:,jl,jp) = xundef
169  ENDDO
170  ENDDO
171  ELSE
172  oprep_ags = .false.
173  ENDIF
174 !
175  CASE('LITTER')
176  CALL open_aux_io_surf(hfile,hfiletype,'NATURE')
177  yrecfm='RESPSL'
178  CALL read_surf(hfiletype,yrecfm,yrespsl,iresp,hdir='-')
179  IF(yrespsl=='CNT')THEN
180  yrecfm='NLITTER'
181  CALL read_surf(hfiletype,yrecfm,inlitter,iresp,hdir='-')
182  yrecfm='NLITTLEVS'
183  CALL read_surf(hfiletype,yrecfm,inlittlevs,iresp,hdir='-')
184  ALLOCATE(pfield(ini,inlitter*inlittlevs,ipatch))
185  pfield(:,:,:) = xundef
186  iwork=0
187  DO jnlitter=1,inlitter
188  DO jnlittlevs=1,inlittlevs
189  iwork=iwork+1
190  WRITE(ylvl,'(I1,A1,I1)') jnlitter,'_',jnlittlevs
191  yrecfm='LITTER'//adjustl(ylvl(:len_trim(ylvl)))
192  CALL make_choice_array(hfiletype, ipatch, gdim, yrecfm, pfield(:,iwork,:),hdir='E')
193  ENDDO
194  ENDDO
195  DO jp=1,SIZE(pfield,3)
196  DO jl=1,SIZE(pfield,2)
197  WHERE (zmask(:)==0.) pfield(:,jl,jp) = xundef
198  ENDDO
199  ENDDO
200  ELSE
201  oprep_ags = .false.
202  ENDIF
203  CALL close_aux_io_surf(hfile,hfiletype)
204 !
205  CASE('SOILCARB')
206  CALL open_aux_io_surf(hfile,hfiletype,'NATURE')
207  yrecfm='RESPSL'
208  CALL read_surf(hfiletype,yrecfm,yrespsl,iresp,hdir='-')
209  IF(yrespsl=='CNT')THEN
210  yrecfm='NSOILCARB'
211  CALL read_surf(hfiletype,yrecfm,insoilcarb,iresp,hdir='-')
212  ALLOCATE(pfield(ini,insoilcarb,ipatch))
213  pfield(:,:,:) = xundef
214  DO jnsoilcarb=1,insoilcarb
215  WRITE(ylvl,'(I4)') jnsoilcarb
216  yrecfm='SOILCARB'//adjustl(ylvl(:len_trim(ylvl)))
217  CALL make_choice_array(hfiletype, ipatch, gdim, yrecfm, pfield(:,jnsoilcarb,:),hdir='E')
218  ENDDO
219  DO jp=1,SIZE(pfield,3)
220  DO jl=1,SIZE(pfield,2)
221  WHERE (zmask(:)==0.) pfield(:,jl,jp) = xundef
222  ENDDO
223  ENDDO
224  ELSE
225  oprep_ags = .false.
226  ENDIF
227  CALL close_aux_io_surf(hfile,hfiletype)
228 !
229  CASE('LIGNIN')
230  CALL open_aux_io_surf(hfile,hfiletype,'NATURE')
231  yrecfm='RESPSL'
232  CALL read_surf(hfiletype,yrecfm,yrespsl,iresp,hdir='-')
233  IF(yrespsl=='CNT')THEN
234  yrecfm='NLITTLEVS'
235  CALL read_surf(hfiletype,yrecfm,inlittlevs,iresp,hdir='-')
236  ALLOCATE(pfield(ini,inlittlevs,ipatch))
237  pfield(:,:,:) = xundef
238  DO jnlittlevs=1,inlittlevs
239  WRITE(ylvl,'(I4)') jnlittlevs
240  yrecfm='LIGNIN_STR'//adjustl(ylvl(:len_trim(ylvl)))
241  CALL make_choice_array(hfiletype, ipatch, gdim, yrecfm, pfield(:,jnlittlevs,:),hdir='E')
242  ENDDO
243  DO jp=1,SIZE(pfield,3)
244  DO jl=1,SIZE(pfield,2)
245  WHERE (zmask(:)==0.) pfield(:,jl,jp) = xundef
246  ENDDO
247  ENDDO
248  ELSE
249  oprep_ags = .false.
250  ENDIF
251  CALL close_aux_io_surf(hfile,hfiletype)
252 !
253 END SELECT
254 !
255 DEALLOCATE(zmask)
256 !
257 !---------------------------------------------------------------------------
258 !
259 !* 6. End of IO
260 ! ---------
261 !
262 IF (lhook) CALL dr_hook('PREP_ISBA_CC_EXTERN',1,zhook_handle)
263 !
264 !---------------------------------------------------------------------------
265 !---------------------------------------------------------------------------
266 END SUBROUTINE prep_isba_cc_extern
character(len=10) cingrid_type
Definition: modd_prep.F90:39
subroutine make_choice_array(HPROGRAM, KNPATCH, ODIM, HRECFM, PWORK, HDIR, KPATCH)
character(len=6) cinterp_type
Definition: modd_prep.F90:40
subroutine close_aux_io_surf(HFILE, HFILETYPE)
subroutine prep_grid_extern(GCP, HFILETYPE, KLUOUT, HGRIDTYPE, HINTER
real, parameter xundef
subroutine prep_isba_cc_extern(GCP, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, PFIELD, OPREP_AGS)
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine open_aux_io_surf(HFILE, HFILETYPE, HMASK, HDIR)