6 SUBROUTINE horibl_surf(PILA1,PILO1,PILA2,PILO2,KINLA,KINLO,KILEN,PARIN, &
7 kolen,pxout,pyout,parout,odvect,kluout,ointerp, &
102 USE modi_hor_extrapol_surf
107 USE yomhook
,ONLY : lhook, dr_hook
108 USE parkind1
,ONLY : jprb
116 REAL,
INTENT(IN) :: pila1
117 REAL,
INTENT(IN) :: pilo1
118 REAL,
INTENT(IN) :: pila2
119 REAL,
INTENT(IN) :: pilo2
120 INTEGER,
INTENT(IN) :: kinla
121 INTEGER,
DIMENSION(KINLA),
INTENT(IN) :: kinlo
122 INTEGER,
INTENT(IN) :: kilen
123 REAL,
DIMENSION(KILEN),
INTENT(IN) :: parin
124 INTEGER,
INTENT(IN) :: kolen
125 REAL,
DIMENSION(KOLEN),
INTENT(IN) :: pxout
126 REAL,
DIMENSION(KOLEN),
INTENT(IN) :: pyout
127 REAL,
DIMENSION(KOLEN),
INTENT(OUT) :: parout
128 LOGICAL,
DIMENSION(KOLEN),
INTENT(IN) :: ointerp
129 LOGICAL,
INTENT(IN) :: odvect
130 INTEGER,
INTENT(IN) :: kluout
131 INTEGER,
DIMENSION(KILEN),
INTENT(IN),
OPTIONAL :: klsmin
132 INTEGER,
DIMENSION(KOLEN),
INTENT(IN),
OPTIONAL :: klsmout
141 INTEGER,
DIMENSION(:),
ALLOCATABLE :: iofs
143 INTEGER :: ioss,ios,ion,ionn
145 INTEGER :: ip1,ip2,ip3,ip4,ip5,ip6,ip7,ip8,ip9,ip10, &
148 REAL :: zlann,zlan,zlas,zlass
149 REAL :: zlop1,zlop2,zlop3,zlop4 ,zlop5 ,zlop6, &
150 zlop7,zlop8,zlop9,zlop10,zlop11,zlop12
152 REAL :: zwnn,zwn,zws,zwss
153 REAL :: zw1,zw2,zw3,zw4,zw5,zw6,zw7,zw8,zw9,zw10, &
157 REAL :: zlsm1,zlsm2 ,zlsm3 ,zlsm4 ,zlsm5 ,zlsm6,zlsm7,zlsm8, &
158 zlsm9,zlsm10,zlsm11,zlsm12,zlsmnn,zlsmn,zlsms,zlsmss,&
172 REAL,
DIMENSION(:),
ALLOCATABLE :: zla
173 REAL,
DIMENSION(:),
ALLOCATABLE :: zlo
174 REAL,
DIMENSION(:),
ALLOCATABLE :: zarin
175 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ilsmin
176 INTEGER,
DIMENSION(:),
ALLOCATABLE :: iinlo
190 INTEGER,
DIMENSION(12) :: ip
193 REAL(KIND=JPRB) :: zhook_handle
199 IF (lhook) CALL dr_hook(
'HORIBL_SURF',0,zhook_handle)
214 IF (present(klsmin) .AND. present(klsmout)) ldlsm = .true.
221 IF (odvect) zvect=-1.
225 IF (zilo2 < 0.) zilo2 = zilo2 + 360.
226 IF (zilo1 < 0.) zilo1 = zilo1 + 360.
227 IF (zilo2 < zilo1) zilo1 = zilo1 - 360.
248 jopos = maxval(kinlo(1:kinla))
249 zilo2 = zilo1 + (zilo2 - zilo1) * jopos / (jopos - 1.)
258 IF (zilo2-360.>zilo1-1.e-3) ggloblon = .true.
259 zidla = (pila2 - pila1) / (kinla - 1)
260 IF ((pila1-zidla>= 90.) .OR. (pila1-zidla<=-90.)) gglobs=ggloblon
261 IF ((pila2+zidla>= 90.) .OR. (pila2+zidla<=-90.)) gglobn=ggloblon
263 IF ( pila2 > 100. )
THEN
273 IF (gglobs ) ibigsize=ibigsize+(4+kinlo( 1))+(4+kinlo( 2))
274 IF (gglobn ) ibigsize=ibigsize+(4+kinlo(kinla))+(4+kinlo(kinla-1))
275 IF (ggloblon) ibigsize=ibigsize+ 4*kinla
279 ALLOCATE (zarin(ibigsize))
280 ALLOCATE (ilsmin(ibigsize))
297 IF (gglobs) jopos=jopos+(4+kinlo(1))+(4+kinlo(2))
300 zarin(jopos ) = parin(jipos+kinlo(jloop1)-2)
301 zarin(jopos+1) = parin(jipos+kinlo(jloop1)-1)
302 zarin(jopos+2:jopos+2+kinlo(jloop1)-1) = parin(jipos:jipos+kinlo(jloop1)-1)
303 zarin(jopos+2+kinlo(jloop1) ) = parin(jipos )
304 zarin(jopos+2+kinlo(jloop1)+1) = parin(jipos+1)
306 ilsmin(jopos ) = klsmin(jipos+kinlo(jloop1)-2)
307 ilsmin(jopos+1) = klsmin(jipos+kinlo(jloop1)-1)
308 ilsmin(jopos+2:jopos+2+kinlo(jloop1)-1) = klsmin(jipos:jipos+kinlo(jloop1)-1)
309 ilsmin(jopos+2+kinlo(jloop1) ) = klsmin(jipos )
310 ilsmin(jopos+2+kinlo(jloop1)+1) = klsmin(jipos+1)
312 jipos = jipos + kinlo(jloop1)
313 jopos = jopos + kinlo(jloop1) + 4
316 zarin(jopos:jopos+kilen-1) = parin(jipos:jipos+kilen-1)
318 ilsmin(jopos:jopos+kilen-1) = klsmin(jipos:jipos+kilen-1)
334 ioffset1 = 4 + kinlo(2)
335 ioffset2 = ioffset1 + 4 + kinlo(1)
336 imiddle = (kinlo(1)+4) / 2
337 zarin(ioffset1+1:ioffset1+imiddle) = &
338 zvect*zarin(ioffset2+1+imiddle-2:ioffset2+2*imiddle-2)
339 zarin(ioffset1+imiddle+1:ioffset1+kinlo(1)+4) = &
340 zvect*zarin(ioffset2+1+2:ioffset2+kinlo(1)+4-imiddle+2)
342 ilsmin(ioffset1+1:ioffset1+imiddle) = &
343 ilsmin(ioffset2+1+imiddle-2:ioffset2+2*imiddle-2)
344 ilsmin(ioffset1+imiddle+1:ioffset1+kinlo(1)+4) = &
345 ilsmin(ioffset2+1+2:ioffset2+kinlo(1)+4-imiddle+2)
347 ioffset2 = ioffset2 + 4 + kinlo(1)
348 imiddle = (kinlo(2)+4) / 2
349 zarin(1:imiddle) = zvect*zarin(ioffset2+1+imiddle-2:ioffset2+2*imiddle-2)
350 zarin(imiddle+1:kinlo(2)+4) = &
351 zvect*zarin(ioffset2+1+2:ioffset2+kinlo(2)+4-imiddle+2)
353 ilsmin(1:imiddle) = ilsmin(ioffset2+1+imiddle:ioffset2+2*imiddle)
354 ilsmin(imiddle+1:kinlo(2)+4) = ilsmin(ioffset2+1+2:ioffset2+kinlo(2)+4-imiddle+2)
361 ioffset1 = ibigsize - (4+kinlo(kinla-1)) - (4+kinlo(kinla))
362 ioffset2 = ioffset1 - (4+kinlo(kinla))
363 imiddle = (kinlo(kinla)+4) / 2
364 zarin(ioffset1+1:ioffset1+imiddle) = &
365 zvect*zarin(ioffset2+1+imiddle-2:ioffset2+2*imiddle-2)
366 zarin(ioffset1+imiddle+1:ioffset1+kinlo(kinla)+4) = &
367 zvect*zarin(ioffset2+1+2:ioffset2+kinlo(kinla)+4-imiddle+2)
369 ilsmin(ioffset1+1:ioffset1+imiddle) = &
370 ilsmin(ioffset2+1+imiddle-2:ioffset2+2*imiddle-2)
371 ilsmin(ioffset1+imiddle+1:ioffset1+kinlo(kinla)+4) = &
372 ilsmin(ioffset2+1+2:ioffset2+kinlo(kinla)+4-imiddle+2)
374 ioffset1 = ioffset1 + (4+kinlo(kinla))
375 ioffset2 = ioffset2 - (4+kinlo(kinla-1))
376 imiddle = (kinlo(kinla-1)+4) / 2
377 zarin(ioffset1+1:ioffset1+imiddle) = &
378 zvect*zarin(ioffset2+1+imiddle-2:ioffset2+2*imiddle-2)
379 zarin(ioffset1+imiddle+1:ioffset1+kinlo(kinla-1)+4) = &
380 zvect*zarin(ioffset2+1+2:ioffset2+kinlo(kinla-1)+4-imiddle+2)
382 ilsmin(ioffset1+1:ioffset1+imiddle) = &
383 ilsmin(ioffset2+1+imiddle-2:ioffset2+2*imiddle-2)
384 ilsmin(ioffset1+imiddle+1:ioffset1+kinlo(kinla-1)+4) = &
385 ilsmin(ioffset2+1+2:ioffset2+kinlo(kinla-1)+4-imiddle+2)
392 IF (gglobs) iinla = iinla + 2
393 IF (gglobn) iinla = iinla + 2
395 ALLOCATE (iinlo(iinla))
398 iinlo(ioffset1+1) = kinlo(2)
399 iinlo(ioffset1+2) = kinlo(1)
400 ioffset1 = ioffset1 + 2
402 iinlo(ioffset1+1:ioffset1+kinla) = kinlo(1:kinla)
403 ioffset1 = ioffset1 + kinla
405 iinlo(ioffset1+1) = kinlo(kinla)
406 iinlo(ioffset1+2) = kinlo(kinla-1)
407 ioffset1 = ioffset1 + 2
412 ALLOCATE (iofs(iinla))
414 IF (ggloblon) iofs(1)=iofs(1)+2
416 iofs(jloop1) = iofs(jloop1-1) + iinlo(jloop1-1)
417 IF (ggloblon) iofs(jloop1) = iofs(jloop1) + 4
430 IF (.NOT. ointerp(jopos)) cycle
433 IF (zolo < zilo1) zolo = zolo + 360.
434 IF (zolo > zilo2) zolo = zolo - 360.
452 ios = nint( (zola-pila1)/zidla -0.5)
454 CALL
abor1_sfx(
'HORIBLE_SURF: INPUT DOMAIN SMALLER THAN OUTPUT ONE - LATITUDE')
456 zlas = pila1 + ios * zidla
464 ioss = max(ios - 1,1)
465 ion = min(ios + 1,iinla)
466 ionn = min(ion + 1,iinla)
475 IF (gglobs .AND. ios==2)
THEN
476 zlass = 2. * zsouthpole - zlann
477 zlas = 2. * zsouthpole - zlan
479 IF (gglobs .AND. ios==3)
THEN
480 zlass = 2. * zsouthpole - zlas
482 IF (gglobn .AND. ios==iinla-2)
THEN
483 zlann = 2. * znorthpole - zlass
484 zlan = 2. * znorthpole - zlas
486 IF (gglobn .AND. ios==iinla-3)
THEN
487 zlann = 2. * znorthpole - zlan
490 IF ((ioss<1).OR.(ionn>iinla).OR. &
491 (ioss<1).OR.(ionn>iinla))
THEN
492 CALL
abor1_sfx(
'HORIBLE_SURF: INPUT DOMAIN SMALLER THAN OUTPUT ONE - LATITUDE')
496 zidlo = (zilo2 - zilo1) / (iinlo(ionn))
497 ip1 = int((zolo - zilo1) / zidlo)
501 ip2 = min(iinlo(ionn)-1, ip1+1)
503 zlop1 = zilo1 + ip1 * zidlo
504 zlop2 = zlop1 + zidlo
507 zidlo = (zilo2 - zilo1) / (iinlo(ion ))
508 ip4 = int((zolo - zilo1) / zidlo)
515 ip5 = min(iinlo(ion)-1,ip4+1)
516 ip6 = min(iinlo(ion)-1,ip5+1)
518 zlop4 = zilo1 + ip4 * zidlo
519 zlop3 = zlop4 - zidlo
520 zlop5 = zlop4 + zidlo
521 zlop6 = zlop5 + zidlo
524 zidlo = (zilo2 - zilo1) / (iinlo(ios ))
525 ip8 = int((zolo - zilo1) / zidlo)
532 ip9 = min(iinlo(ios)-1,ip8+1)
533 ip10 = min(iinlo(ios)-1,ip9+1)
535 zlop8 = zilo1 + ip8 * zidlo
536 zlop7 = zlop8 - zidlo
537 zlop9 = zlop8 + zidlo
538 zlop10= zlop9 + zidlo
541 zidlo = (zilo2 - zilo1) / (iinlo(ioss))
542 ip11 = int((zolo - zilo1) / zidlo)
546 ip12 = min(iinlo(ioss)-1,ip11+1)
548 zlop11= zilo1 + ip11* zidlo
549 zlop12= zlop11+ zidlo
553 IF ((ip1 <-2) .OR. (ip2 >iinlo(ionn)+1) .OR. &
554 (ip3 <-2) .OR. (ip6 >iinlo(ion )+1) .OR. &
555 (ip7 <-2) .OR. (ip10>iinlo(ios )+1) .OR. &
556 (ip11<-2) .OR. (ip12>iinlo(ioss)+1))
THEN
557 CALL
abor1_sfx(
'HORIBLE_SURF: INPUT DOMAIN SMALLER THAN OUTPUT ONE - LONGITUDE GLOBAL')
560 IF ((ip1 <0) .OR. (ip2 >iinlo(ionn)-1) .OR. &
561 (ip3 <0) .OR. (ip6 >iinlo(ion )-1) .OR. &
562 (ip7 <0) .OR. (ip10>iinlo(ios )-1) .OR. &
563 (ip11<0) .OR. (ip12>iinlo(ioss)-1))
THEN
564 CALL
abor1_sfx(
'HORIBLE_SURF: INPUT DOMAIN SMALLER THAN OUTPUT ONE - LONGITUDE LOCAL')
569 ip1 =ip1 + iofs(ionn)
570 ip2 =ip2 + iofs(ionn)
571 ip3 =ip3 + iofs(ion )
572 ip4 =ip4 + iofs(ion )
573 ip5 =ip5 + iofs(ion )
574 ip6 =ip6 + iofs(ion )
575 ip7 =ip7 + iofs(ios )
576 ip8 =ip8 + iofs(ios )
577 ip9 =ip9 + iofs(ios )
578 ip10=ip10+ iofs(ios )
579 ip11=ip11+ iofs(ioss)
580 ip12=ip12+ iofs(ioss)
601 IF (ilsmin(ip1 ).NE.klsmout(jopos)) zlsm1 = 0.
602 IF (ilsmin(ip2 ).NE.klsmout(jopos)) zlsm2 = 0.
603 IF (ilsmin(ip3 ).NE.klsmout(jopos)) zlsm3 = 0.
604 IF (ilsmin(ip4 ).NE.klsmout(jopos)) zlsm4 = 0.
605 IF (ilsmin(ip5 ).NE.klsmout(jopos)) zlsm5 = 0.
606 IF (ilsmin(ip6 ).NE.klsmout(jopos)) zlsm6 = 0.
607 IF (ilsmin(ip7 ).NE.klsmout(jopos)) zlsm7 = 0.
608 IF (ilsmin(ip8 ).NE.klsmout(jopos)) zlsm8 = 0.
609 IF (ilsmin(ip9 ).NE.klsmout(jopos)) zlsm9 = 0.
610 IF (ilsmin(ip10).NE.klsmout(jopos)) zlsm10 = 0.
611 IF (ilsmin(ip11).NE.klsmout(jopos)) zlsm11 = 0.
612 IF (ilsmin(ip12).NE.klsmout(jopos)) zlsm12 = 0.
613 zlsmnn = min(zlsm1 +zlsm2,1.)
614 zlsmn = min(zlsm3 +zlsm4 +zlsm5 +zlsm6,1.)
615 zlsms = min(zlsm7 +zlsm8 +zlsm9 +zlsm10,1.)
616 zlsmss = min(zlsm11+zlsm12,1.)
617 zlsmtot = min(zlsmnn+zlsmn+zlsms+zlsmss,1.)
618 IF (zlsmnn < 1.e-3)
THEN
622 IF (zlsmn < 1.e-3)
THEN
628 IF (zlsms < 1.e-3)
THEN
634 IF (zlsmss < 1.e-3)
THEN
638 IF (zlsmtot < 1.e-3)
THEN
649 zw1 = zlsm1 * (1.+zlsm2 *(zolo -zlop1 )/(zlop1 -zlop2 ))
651 zwnn = zlsmnn* (1.+zlsmn *(zola -zlann)/(zlann-zlan )) &
652 * (1.+zlsms *(zola -zlann)/(zlann-zlas )) &
653 * (1.+zlsmss*(zola -zlann)/(zlann-zlass))
656 zw3 = zlsm3 * (1.+zlsm4 *(zolo -zlop3 )/(zlop3 -zlop4 )) &
657 * (1.+zlsm5 *(zolo -zlop3 )/(zlop3 -zlop5 )) &
658 * (1.+zlsm6 *(zolo -zlop3 )/(zlop3 -zlop6 ))
659 zw4 = zlsm4 * (1.+zlsm3 *(zolo -zlop4 )/(zlop4 -zlop3 )) &
660 * (1.+zlsm5 *(zolo -zlop4 )/(zlop4 -zlop5 )) &
661 * (1.+zlsm6 *(zolo -zlop4 )/(zlop4 -zlop6 ))
662 zw5 = zlsm5 * (1.+zlsm3 *(zolo -zlop5 )/(zlop5 -zlop3 )) &
663 * (1.+zlsm4 *(zolo -zlop5 )/(zlop5 -zlop4 )) &
664 * (1.+zlsm6 *(zolo -zlop5 )/(zlop5 -zlop6 ))
665 zw6 = 1. - zw3 - zw4 - zw5
666 zwn = zlsmn * (1.+zlsmnn*(zola -zlan )/(zlan -zlann)) &
667 * (1.+zlsms *(zola -zlan )/(zlan -zlas )) &
668 * (1.+zlsmss*(zola -zlan )/(zlan -zlass))
671 zw7 = zlsm7 * (1.+zlsm8 *(zolo -zlop7 )/(zlop7 -zlop8 )) &
672 * (1.+zlsm9 *(zolo -zlop7 )/(zlop7 -zlop9 )) &
673 * (1.+zlsm10*(zolo -zlop7 )/(zlop7 -zlop10))
674 zw8 = zlsm8 * (1.+zlsm7 *(zolo -zlop8 )/(zlop8 -zlop7 )) &
675 * (1.+zlsm9 *(zolo -zlop8 )/(zlop8 -zlop9 )) &
676 * (1.+zlsm10*(zolo -zlop8 )/(zlop8 -zlop10))
677 zw9 = zlsm9 * (1.+zlsm7 *(zolo -zlop9 )/(zlop9 -zlop7 )) &
678 * (1.+zlsm8 *(zolo -zlop9 )/(zlop9 -zlop8 )) &
679 * (1.+zlsm10*(zolo -zlop9 )/(zlop9 -zlop10))
680 zw10 = 1. - zw7 - zw8 - zw9
681 zws = zlsms * (1.+zlsmnn*(zola -zlas )/(zlas -zlann)) &
682 * (1.+zlsmn *(zola -zlas )/(zlas -zlan )) &
683 * (1.+zlsmss*(zola -zlas )/(zlas -zlass))
686 zw11 = zlsm11* (1.+zlsm12*(zolo -zlop11)/(zlop11-zlop12))
688 zwss = 1. - zwnn - zwn - zws
694 IF (abs(zw2 ) < 1.e-10) zw2=0.
695 IF (abs(zw6 ) < 1.e-10) zw6=0.
696 IF (abs(zw10) < 1.e-10) zw10=0.
697 IF (abs(zw12) < 1.e-10) zw12=0.
698 IF (abs(zwss) < 1.e-10) zwss=0.
714 parout(jopos) = zw1 * zarin(ip1 ) + &
715 zw2 * zarin(ip2 ) + &
716 zw3 * zarin(ip3 ) + &
717 zw4 * zarin(ip4 ) + &
718 zw5 * zarin(ip5 ) + &
719 zw6 * zarin(ip6 ) + &
720 zw7 * zarin(ip7 ) + &
721 zw8 * zarin(ip8 ) + &
722 zw9 * zarin(ip9 ) + &
723 zw10 * zarin(ip10) + &
724 zw11 * zarin(ip11) + &
730 IF (present(klsmin))
THEN
749 IF (zarin(ip(jloop2))==xundef) cycle
751 IF ((zmax==xundef))
THEN
752 zmax=zarin(ip(jloop2))
753 zmin=zarin(ip(jloop2))
755 zmax=max(zmax,zarin(ip(jloop2)))
756 zmin=min(zmin,zarin(ip(jloop2)))
761 parout(jopos) = max(min(parout(jopos),zmax),zmin)
772 WHERE(abs(parout-xundef)<1.e-6) parout=xundef
780 IF (count(parout(:)==xundef .AND. ointerp(:))==0 .AND. lhook) CALL dr_hook(
'HORIBL_SURF',1,zhook_handle)
781 IF (count(parout(:)==xundef .AND. ointerp(:))==0)
RETURN
784 IF (count(parin(:)/=xundef)==0 .AND. lhook) CALL dr_hook(
'HORIBL_SURF',1,zhook_handle)
785 IF (count(parin(:)/=xundef)==0)
RETURN
787 WRITE(kluout,*)
' Remaining horizontal extrapolations'
788 WRITE(kluout,*)
' Total number of input data : ',count(parin(:)/=xundef)
789 WRITE(kluout,*)
' Number of points to interpolate: ',count(parout(:)==xundef .AND. ointerp(:))
797 zidla = (pila2 - pila1) / (kinla - 1)
799 zidlo = (zilo2-zilo1) / kinlo(jlat)
800 DO jlon=1,kinlo(jlat)
802 zla(jipos) = pila1 + (jlat-1) * zidla
803 zlo(jipos) = zilo1 + (jlon-1) * zidlo
811 IF (lhook) CALL dr_hook(
'HORIBL_SURF',1,zhook_handle)
subroutine horibl_surf(PILA1, PILO1, PILA2, PILO2, KINLA, KINLO, KILEN, PARIN, KOLEN, PXOUT, PYOUT, PAROUT, ODVECT, KLUOUT, OINTERP, KLSMIN, KLSMOUT)
subroutine abor1_sfx(YTEXT)