7 hprogram,klu,hcti,hctifiletype,oimp_cti)
56 xmin_work, xmax_work, &
57 xmean_work, xstd_work, &
66 USE modi_get_grid_coord
70 USE modi_interpol_field
72 USE modi_init_io_surf_n
73 USE modi_end_io_surf_n
84 USE yomhook
,ONLY : lhook, dr_hook
85 USE parkind1
,ONLY : jprb
89 USE modi_get_surf_mask_n
91 USE modi_get_type_dim_n
104 TYPE(isba_t
),
INTENT(INOUT) :: i
106 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
107 INTEGER,
INTENT(IN) :: klu
108 CHARACTER(LEN=28),
INTENT(IN) :: hcti
109 CHARACTER(LEN=6),
INTENT(IN) :: hctifiletype
110 LOGICAL,
INTENT(IN) :: oimp_cti
116 REAL,
DIMENSION(:),
ALLOCATABLE :: zlat, zdelta, zmean_ini, &
117 zti_mean, zti_std, zti_skew
119 INTEGER,
DIMENSION(:),
ALLOCATABLE :: imask
121 LOGICAL :: lreg,lreg10,lreg2
128 CHARACTER(LEN=6 ) :: yfiletype, yscheme, ysubroutine
129 CHARACTER(LEN=20) :: yfield
130 REAL(KIND=JPRB) :: zhook_handle
137 IF (lhook) CALL dr_hook(
'PGD_TOPO_INDEX',0,zhook_handle)
138 IF(len_trim(hcti)==0)
THEN
140 ALLOCATE(i%XTI_MIN (0))
141 ALLOCATE(i%XTI_MAX (0))
142 ALLOCATE(i%XTI_MEAN(0))
143 ALLOCATE(i%XTI_STD (0))
144 ALLOCATE(i%XTI_SKEW(0))
157 WRITE(iluout,*)
'*****************************************'
158 WRITE(iluout,*)
'Comput Topographic indexes for TOPMODEL '
159 WRITE(iluout,*)
'*****************************************'
164 ALLOCATE(i%XTI_MIN (klu))
165 ALLOCATE(i%XTI_MAX (klu))
166 ALLOCATE(i%XTI_MEAN(klu))
167 ALLOCATE(i%XTI_STD (klu))
168 ALLOCATE(i%XTI_SKEW(klu))
170 i%XTI_MIN (:) = xundef
171 i%XTI_MAX (:) = xundef
172 i%XTI_MEAN(:) = xundef
173 i%XTI_STD (:) = xundef
174 i%XTI_SKEW(:) = xundef
184 WRITE(iluout,*)
'PGD_TOPO_INDEX: Wrong dimension of MASK: ',i_dim,klu
185 CALL
abor1_sfx(
'PGD_TOPO_INDEX: WRONG DIMENSION OF MASK')
191 'NATURE',klu,imask,ifull,iluout)
193 WRITE(iluout,*)
'PGD_TOPO_INDEX: Wrong dimension of FULL: ',ifull,nl
194 CALL
abor1_sfx(
'PGD_TOPO_INDEX: WRONG DIMENSION OF FULL')
197 ALLOCATE(xmin_work(ifull))
198 ALLOCATE(xmax_work(ifull))
199 ALLOCATE(xmean_work(ifull))
200 ALLOCATE(xstd_work(ifull))
201 ALLOCATE(xskew_work(ifull))
216 yfiletype=hctifiletype
217 IF(hctifiletype==
'NETCDF')
THEN
218 CALL
abor1_sfx(
'Use another format than netcdf for cti input file with LIMP_CTI')
221 cfilein = adjustl(adjustr(hcti)//
'.txt')
224 cfilein_fa = adjustl(adjustr(hcti)//
'.fa')
227 cfilein_lfi = adjustl(hcti)
230 yfiletype,
'FULL ',
'SURF ',
'READ ')
234 yfiletype,
'TI_MIN' ,xmin_work ,iret)
236 yfiletype,
'TI_MAX' ,xmax_work ,iret)
238 yfiletype,
'TI_MEAN',xmean_work,iret)
240 yfiletype,
'TI_STD' ,xstd_work ,iret)
242 yfiletype,
'TI_SKEW',xskew_work,iret)
253 ALLOCATE(nsize(ifull))
254 ALLOCATE(xsumval(ifull))
255 ALLOCATE(xsumval2(ifull))
256 ALLOCATE(xsumval3(ifull))
263 xmax_work(:) =-99999.
267 ysubroutine =
'A_CTI '
269 hprogram,yscheme,hctifiletype,ysubroutine,hcti,yfield)
276 WHERE(nsize(:)<36.OR.xstd_work(:)==0.0)
277 xmin_work(:) = xundef
278 xmax_work(:) = xundef
279 xmean_work(:) = xundef
280 xstd_work(:) = xundef
281 xskew_work(:) = xundef
285 WHERE(u%XNATURE(:)>0.0.AND.xskew_work(:)<=-8.0)
286 xmin_work(:) = xundef
287 xmax_work(:) = xundef
288 xmean_work(:) = xundef
289 xstd_work(:) = xundef
290 xskew_work(:) = xundef
294 WHERE(u%XNATURE(:)==0.)
295 xmin_work(:) = xundef
296 xmax_work(:) = xundef
297 xmean_work(:) = xundef
298 xstd_work(:) = xundef
299 xskew_work(:) = xundef
308 IF(hctifiletype==
'DIRECT')
THEN
313 CALL
ctireg(lreg,lreg10,lreg2)
315 IF(all(xmean_work(:)==xundef))lreg=.false.
319 WRITE(iluout,*)
'WITH DIF, TOPO INDEX USED REGRESSIONS OF '
321 ALLOCATE(zdelta(ifull))
322 ALLOCATE(zmean_ini(ifull))
323 ALLOCATE(zti_mean(ifull))
324 ALLOCATE(zti_std(ifull))
325 ALLOCATE(zti_skew(ifull))
327 zmean_ini(:)=xmean_work(:)
335 WRITE(iluout,*)
' PAN AND KING (2012) 1km to 10m '
336 WHERE(xmean_work(:)/=xundef.AND.(xmax_work(:)-xmin_work(:))>0.2)
337 zti_mean(:)= 1.136+0.657*xmean_work(:)-0.640*xstd_work(:)+0.053*xskew_work(:)
338 zti_std(:)=-0.128+0.187*xmean_work(:)+0.168*xstd_work(:)-0.261*xskew_work(:)
339 zti_skew(:)= 3.768-0.246*xmean_work(:)+0.317*xstd_work(:)+0.222*xskew_work(:)
341 xmean_work(:)=zti_mean(:)
342 xstd_work(:)=zti_std(:)
343 xskew_work(:)=zti_skew(:)
345 zti_mean(:)=xmean_work(:)
346 zti_std(:)=xstd_work(:)
347 zti_skew(:)=xskew_work(:)
352 WRITE(iluout,*)
' PAN AND KING (2012) 10m to 2m '
353 WHERE(xmean_work(:)/=xundef.AND.(xmax_work(:)-xmin_work(:))>0.2)
354 xmean_work(:)=-3.826+1.402*zti_mean(:)-0.434*zti_std(:)+0.328*zti_skew(:)
355 xstd_work(:)= 3.655-0.209*zti_mean(:)+0.440*zti_std(:)-0.091*zti_skew(:)
356 xskew_work(:)= 2.266-0.023*zti_mean(:)-0.245*zti_std(:)-0.240*zti_skew(:)
360 WHERE(xmean_work(:)>0.0.AND.xmean_work(:)/=xundef)
361 zdelta(:)= (xmean_work(:)-zmean_ini(:))
362 xmin_work(:)= max( 0.0,xmin_work(:)+zdelta(:))
363 xmax_work(:)= max(xmin_work(:)+0.2,xmax_work(:)+zdelta(:))
365 xmin_work(:) = xundef
366 xmax_work(:) = xundef
367 xmean_work(:) = xundef
368 xstd_work(:) = xundef
369 xskew_work(:) = xundef
374 DEALLOCATE(zmean_ini)
375 DEALLOCATE(zti_mean )
377 DEALLOCATE(zti_skew )
388 WRITE(iluout,*)
'*********************************************'
389 WRITE(iluout,*)
'Interpolation if some index not initialized '
390 WRITE(iluout,*)
'*********************************************'
396 WHERE (u%XNATURE(:)==0..AND.nsize(:)==0) nsize(:) = -1
399 WHERE(u%XNATURE(:)>0..AND.zlat(:)<-60.)
400 xmin_work(:) = xundef
401 xmax_work(:) = xundef
402 xmean_work(:) = xundef
403 xstd_work(:) = xundef
404 xskew_work(:) = xundef
408 IF(all(nsize(:)==0.0))nsize(:)=-1
411 hprogram,iluout,nsize,xmin_work(:),
'TI_MIN ',pdef=xundef,knpts=1)
413 hprogram,iluout,nsize,xmax_work(:),
'TI_MAX ',pdef=xundef,knpts=1)
415 hprogram,iluout,nsize,xmean_work(:),
'TI_MEAN',pdef=xundef,knpts=1)
417 hprogram,iluout,nsize,xstd_work(:),
'TI_STD ',pdef=xundef,knpts=1)
419 hprogram,iluout,nsize,xskew_work(:),
'TI_SKEW',pdef=xundef,knpts=1)
423 DEALLOCATE(xsumval2 )
424 DEALLOCATE(xsumval3 )
441 DEALLOCATE(xmin_work )
442 DEALLOCATE(xmax_work )
443 DEALLOCATE(xmean_work)
444 DEALLOCATE(xstd_work )
445 DEALLOCATE(xskew_work)
447 WRITE(iluout,*)
'******************************'
448 WRITE(iluout,*)
'End Comput Topographic indexes'
449 WRITE(iluout,*)
'******************************'
453 IF (lhook) CALL dr_hook(
'PGD_TOPO_INDEX',1,zhook_handle)
463 USE modi_open_namelist
464 USE modi_close_namelist
466 USE yomhook
,ONLY : lhook, dr_hook
467 USE parkind1
,ONLY : jprb
474 LOGICAL,
INTENT(OUT) :: oreg,oreg10,oreg2
486 CHARACTER(LEN=28) :: yfilehdr
496 REAL,
DIMENSION(7) :: zval
498 CHARACTER(LEN=100) :: ystring
499 CHARACTER(LEN=100) :: ystring1
500 CHARACTER(LEN=100) :: yval
503 INTEGER :: ifraclength
504 CHARACTER(LEN=2) :: ylength
505 CHARACTER(LEN=2) :: yfraclength
506 CHARACTER(LEN=10) :: yinternalformat
508 REAL :: z1000m, z100m, z10m
510 REAL(KIND=JPRB) :: zhook_handle
514 IF (lhook) CALL dr_hook(
'PGD_TOPO_INDEX:CTIREG',0,zhook_handle)
521 yfilehdr =adjustl(adjustr(hcti)//
'.hdr')
527 READ (iglb,
'(A100)',end=99) ystring
535 READ (iglb,
'(A100)',end=99) ystring
536 ystring=adjustl(ystring)
541 SELECT CASE (ystring(1:5))
544 ystring1=ystring(10:100)
547 ystring1=ystring(8:100)
550 ystring1=ystring(7:100)
553 ystring1=ystring(7:100)
556 ystring1=ystring(6:100)
559 ystring1=ystring(6:100)
562 ystring1=ystring(6:100)
565 ystring1=ystring(6:100)
571 inindex=index(ystring1,
'N')
572 isindex=index(ystring1,
'S')
573 ieindex=index(ystring1,
'E')
574 iwindex=index(ystring1,
'W')
575 yval=adjustl(ystring1)
576 IF (inindex/=0) yval=adjustl(ystring1(1:inindex-1))
577 IF (isindex/=0) yval=
'-'//adjustl(ystring1(1:isindex-1))
578 IF (ieindex/=0) yval=adjustl(ystring1(1:ieindex-1))
579 IF (iwindex/=0) yval=
'-'//adjustl(ystring1(1:iwindex-1))
584 ipoint=index(yval,
'.')
585 IF (ipoint==0) yval=adjustl(adjustr(yval)//
'.')
590 ilength=len_trim(adjustl(adjustr(yval)))
591 ifraclength=ilength-index(yval,
'.')
592 WRITE(ylength,
'(I2)') ilength
593 WRITE(yfraclength,
'(I2)') ifraclength
594 yinternalformat=
'(F'//ylength//
'.'//yfraclength//
')'
599 READ(yval,adjustl(yinternalformat)) zval(ihead)
611 zglblonmax=zval(4)+nint((zval(5)-zval(4)+180.+1.e-10)/360.)*360.
615 zdlat=(zglblatmax-zglblatmin)/inblat
616 zdlon=(zglblonmax-zglblonmin)/inblon
622 IF(sqrt(zdlat*zdlon)>z100m)
THEN
628 IF(sqrt(zdlat*zdlon)>=z10m.AND.sqrt(zdlat*zdlon)<=z100m)
THEN
636 IF (lhook) CALL dr_hook(
'PGD_TOPO_INDEX:CTIREG',1,zhook_handle)
639 CALL
abor1_sfx(
'CTIREG: PB READING TOPO INDEX FILE HEADER')
640 IF (lhook) CALL dr_hook(
'PGD_TOPO_INDEX:CTIREG',1,zhook_handle)
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
subroutine init_io_surf_n(DTCO, DGU, U, HPROGRAM, HMASK, HSCHEME, HACTION)
subroutine pgd_topo_index(DGU, DTCO, UG, U, USS, I, HPROGRAM, KLU, HCTI, HCTIFILETYPE, OIMP_CTI)
subroutine ctireg(OREG, OREG10, OREG2)
subroutine get_grid_coord(UG, U, KLUOUT, PX, PY, KL, HGRID, PGRID_PAR)
subroutine treat_field(UG, U, USS, HPROGRAM, HSCHEME, HFILETYPE, HSUBROUTINE, HFILENAME, HFIELD, PPGDARRAY, HSFTYPE)
subroutine abor1_sfx(YTEXT)
subroutine get_surf_mask_n(DTCO, U, HTYPE, KDIM, KMASK, KLU, KLUOUT)
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine end_io_surf_n(HPROGRAM)
subroutine get_luout(HPROGRAM, KLUOUT)
subroutine interpol_field(UG, U, HPROGRAM, KLUOUT, KCODE, PFIELD, HFIELD, PDEF, KNPTS)
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)