7 KINLA,KINLO,KP,PFIELD_IN,PLAT,PLON,PFIELD,OINTERP,&
64 INTEGER,
INTENT(IN) :: KLUOUT
65 CHARACTER(LEN=4),
INTENT(IN) :: HCOORTYPE
66 INTEGER,
INTENT(IN) :: KILEN
67 REAL,
INTENT(IN) :: PILA1
68 REAL,
INTENT(IN) :: PILA2
69 REAL,
INTENT(IN) :: PILO1
70 REAL,
INTENT(IN) :: PILO2
71 INTEGER,
INTENT(IN) :: KINLA
72 INTEGER,
DIMENSION(:),
INTENT(IN) :: KINLO
73 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: KP
74 REAL,
DIMENSION(:,:),
INTENT(IN) :: PFIELD_IN
75 REAL,
DIMENSION(:),
INTENT(IN) :: PLAT
76 REAL,
DIMENSION(:),
INTENT(IN) :: PLON
77 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PFIELD
78 LOGICAL,
DIMENSION(:),
INTENT(IN) :: OINTERP
79 REAL,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: PILATARRAY
84 REAL,
DIMENSION(:),
ALLOCATABLE :: ZTLONMIN, ZTLONMAX, ZTLATMIN, ZTLATMAX
85 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZFIELD
89 REAL,
DIMENSION(:),
ALLOCATABLE :: ZNDIST
92 REAL :: ZIDLO, ZIDLOMAX, ZIDLOMIN, ZIDLAMAX, ZIDLAMIN
93 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZCOOR
94 REAL,
DIMENSION(:),
ALLOCATABLE :: ZIDLA
95 REAL,
DIMENSION(:),
ALLOCATABLE :: ZLA
96 REAL,
DIMENSION(:),
ALLOCATABLE :: ZLO
97 REAL(KIND=JPRB) :: ZRAD
99 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IMASK, IMASKR
100 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: IVAL_EXT
101 INTEGER,
DIMENSION(NPROC) :: INO_TAB
103 INTEGER,
DIMENSION(2) :: ITSIZE, ITDIM
104 INTEGER,
DIMENSION(2,0:NPROC-1) :: IBOR
105 INTEGER :: ISIZE, ISIZE_MAX, J, ID0, ICOMPT, ICPT
106 INTEGER :: INFOMPI, IDX, INL
107 INTEGER :: JI, JL, JLAT, JLON, JIPOS, JP
110 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
114 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
116 IF (
lhook)
CALL dr_hook(
'HOR_EXTRAPOL_SURF_1',0,zhook_handle)
121 ALLOCATE(zndist(inl))
125 glalo = hcoortype==
'LALO' 129 ALLOCATE(zidla(kinla))
137 IF (
PRESENT(pilatarray))
THEN 140 zidla(jlat) = pilatarray(jlat) - pilatarray(jlat-1)
143 zidla(:) = (pila2 - pila1) / (kinla - 1)
146 zidlamax = maxval(abs(zidla))
147 zidlamin = minval(abs(zidla(2:kinla)))
151 zidlo = (pilo2-pilo1) / kinlo(jlat)
153 zidlo = (pilo2-pilo1) / (kinlo(jlat)-1)
155 DO jlon=1,kinlo(jlat)
157 zla(jipos) = pila1 +
sum(zidla(2:jlat))
158 zlo(jipos) = pilo1 + (jlon-1) * zidlo
161 IF (zidlo>zidlomax) zidlomax = zidlo
162 IF (zidlo<zidlomin) zidlomin = zidlo
170 ALLOCATE(ztlonmin(ino),ztlonmax(ino),ztlatmin(ino),ztlatmax(ino))
186 IF (all(pfield(ji,:)/=
xundef)) cycle
187 IF (.NOT. ointerp(ji)) cycle
191 ztlonmin(ji) = minval(zlo(kp(ji,:)))-zidlomax*
nhalo_prep 192 ztlonmax(ji) = maxval(zlo(kp(ji,:)))+zidlomax*
nhalo_prep 193 ztlatmin(ji) = minval(zla(kp(ji,:)))-zidlamax*
nhalo_prep 194 ztlatmax(ji) = maxval(zla(kp(ji,:)))+zidlamax*
nhalo_prep 196 ztlonmin(ji) = minval(zlo(:))
197 ztlonmax(ji) = maxval(zlo(:))
198 ztlatmin(ji) = minval(zla(:))
199 ztlatmax(ji) = maxval(zla(:))
201 isize = ceiling((ztlonmax(ji)-ztlonmin(ji)+1)/zidlomin)*&
202 ceiling((ztlatmax(ji)-ztlatmin(ji)+1)/zidlamin)
203 IF (isize>isize_max) isize_max = isize
209 itsize(2) = isize_max
214 CALL mpi_gather(itsize,2*kind(itsize)/4,mpi_integer,&
215 ibor,2*kind(ibor)/4,mpi_integer,&
219 ibor(:,0) = itsize(:)
224 ALLOCATE(imask(itsize(1)))
228 ALLOCATE(ival_ext(maxval(ibor(1,:)),maxval(ibor(2,:))))
229 ALLOCATE(zcoor(maxval(ibor(1,:)),2))
231 ALLOCATE(ival_ext(itsize(1),itsize(2)))
232 ALLOCATE(zcoor(itsize(1),2))
242 IF (all(pfield(ji,:)/=
xundef)) cycle
243 IF (.NOT. ointerp(ji)) cycle
254 zcoor(icpt,1) = plat(ji)
255 zcoor(icpt,2) = plon(ji)
259 zlat = pila1 +
sum(zidla(2:jlat))
260 IF (zlat>=ztlatmin(ji) .AND. zlat<=ztlatmax(ji))
THEN 262 zidlo = (pilo2-pilo1) / kinlo(jlat)
264 zidlo = (pilo2-pilo1) / (kinlo(jlat)-1)
266 IF (jlat>1) jisc =
sum(kinlo(1:jlat-1))
267 DO jlon = 1,kinlo(jlat)
268 zlon = pilo1 + (jlon-1) * zidlo
269 IF (zlon>=ztlonmin(ji) .AND. zlon<=ztlonmax(ji))
THEN 273 ival_ext(icpt,icompt) = jisc + jlon
284 IF (
lhook)
CALL dr_hook(
'HOR_EXTRAPOL_SURF_1',1,zhook_handle)
288 IF (
lhook)
CALL dr_hook(
'HOR_EXTRAPOL_SURF_2',0,zhook_handle)
291 IF (
sum(itsize)/=0)
THEN 294 ALLOCATE(zfield(itsize(1),inl))
299 CALL mpi_send(ival_ext,
SIZE(ival_ext)*kind(ival_ext)/4,mpi_integer,
npio 305 CALL mpi_send(zcoor,
SIZE(zcoor)*kind(zcoor)/4,mpi_real,
npio,
idx_i,
ncomm 311 CALL mpi_recv(zfield,
SIZE(zfield)*kind(zfield)/4,mpi_real,
npio,
idx_i 315 pfield(imask(ji),:) = zfield(ji,:)
323 IF (
lhook)
CALL dr_hook(
'HOR_EXTRAPOL_SURF_2',1,zhook_handle)
327 IF (
lhook)
CALL dr_hook(
'HOR_EXTRAPOL_SURF_31',0,zhook_handle_omp)
333 IF (
sum(ibor(:,j))/=0)
THEN 335 ALLOCATE(zfield(ibor(1,j),inl))
342 CALL mpi_recv(ival_ext(1:ibor(1,j),1:ibor(2,j)), ibor(1,j)*ibor(
344 CALL mpi_recv(zcoor(1:ibor(1,j),:), ibor(1,j)*
SIZE(zcoor,2)*kind
354 zcosla=cos(zcoor(ji,1)*zrad)
355 DO jisc = 1,ibor(2,j)
357 id0 = ival_ext(ji,jisc)
359 IF (any(pfield_in(id0,:)/=
xundef))
THEN 362 IF (zlonsc-zcoor(ji,2)> 180.) zlonsc = zlonsc - 360.
363 IF (zlonsc-zcoor(ji,2)<-180.) zlonsc = zlonsc + 360.
364 zdist= (zla(id0)-zcoor(ji,1)) ** 2 + ((zlonsc-zcoor(ji,2
366 zdist= (zla(id0)-zcoor(ji,1)) ** 2 + (zlonsc-zcoor(ji,2)
369 IF (zdist<=zndist(jl))
THEN 370 IF (pfield_in(id0,jl)/=
xundef)
THEN 371 zfield(ji,jl) = pfield_in(id0,jl)
384 CALL mpi_send(zfield,
SIZE(zfield)*kind(zfield)/4,mpi_real,j,
idx_i 388 pfield(imask(ji),:) = zfield(ji,:)
397 IF (
lhook)
CALL dr_hook(
'HOR_EXTRAPOL_SURF_31',1,zhook_handle_omp)
401 IF (
lhook)
CALL dr_hook(
'HOR_EXTRAPOL_SURF_32',0,zhook_handle)
405 IF (
lhook)
CALL dr_hook(
'HOR_EXTRAPOL_SURF_32',1,zhook_handle)
409 IF (
lhook)
CALL dr_hook(
'HOR_EXTRAPOL_SURF_4',0,zhook_handle)
415 IF (
ALLOCATED(zla))
DEALLOCATE(zla)
416 IF (
ALLOCATED(zlo))
DEALLOCATE(zlo)
417 DEALLOCATE(ztlonmin,ztlonmax,ztlatmin,ztlatmax)
420 IF (any(pfield(:,jl)==
xundef .AND. ointerp(:)))
THEN 421 WRITE(*,*)
'LAYER ',jl,
': NO EXTRAPOLATION : INCREASE YOUR HALO_PREP IN NAM_PREP_SURF_ATM' 422 CALL abor1_sfx(
'NO EXTRAPOLATION : INCREASE YOUR HALO_PREP IN NAM_PREP_SURF_ATM' 424 WHERE (.NOT. ointerp(:)) pfield(:,jl) =
xundef 428 IF (
lhook)
CALL dr_hook(
'HOR_EXTRAPOL_SURF_4',1,zhook_handle)
subroutine abor1_sfx(YTEXT)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))