6 SUBROUTINE interpol_npts (UG, U, HPROGRAM,KLUOUT,KNPTS,KCODE,PX,PY,PFIELD,KNEAR_NBR)
64 USE modi_get_near_meshes
65 USE modi_sum_on_all_procs
71 USE modd_io_ll
, ONLY : isp, isnproc
72 USE modd_var_ll
, ONLY : nmnh_comm_world
74 USE mode_fd_ll
, ONLY : getfd, fd_ll
75 USE mode_tools_ll
, ONLY : get_globaldims_ll
76 USE modd_parameters_ll
,ONLY : jphext
78 USE modd_io_surf_mnh
, ONLY : niu, nju
83 #if defined(SFX_MPI) || defined(SFX_MNH) 94 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
95 INTEGER,
INTENT(IN) :: KLUOUT
96 INTEGER,
INTENT(IN) :: KNPTS
97 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: KCODE
104 REAL,
DIMENSION(:),
INTENT(IN) :: PX
105 REAL,
DIMENSION(:),
INTENT(IN) :: PY
106 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PFIELD
107 INTEGER,
INTENT(IN) :: KNEAR_NBR
112 REAL,
DIMENSION(:,:,:,:),
ALLOCATABLE :: ZFIELD, ZFIELD2
113 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: ZFIELD3
114 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZNDIST
115 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZNVAL
116 REAL,
DIMENSION(:),
ALLOCATABLE :: ZX, ZY
117 REAL,
DIMENSION(:),
ALLOCATABLE :: ZDIST
119 INTEGER,
DIMENSION(:,:,:),
ALLOCATABLE :: ININD0, ININD_ALL
120 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ININD
121 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IINDEX
122 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ISIZE, ISIZE_TOT
125 INTEGER :: IP, ICPT, IL1, JL, JP, JK, JKK
127 INTEGER :: ICOUNT, IL2
129 INTEGER :: INFOMPI, IDIM_FULL, INEAR_NBR, IOLD
131 #if defined(SFX_MPI) || defined(SFX_MNH) 132 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
136 TYPE(fd_ll),
POINTER :: TZFD
138 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZCOORD_2D, ZCOORD_2D_ALL
139 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ISIZE_2D, ISIZE_2D_ALL, INUM_2D,
140 INTEGER,
DIMENSION(:),
ALLOCATABLE :: INUM_1D, IINDEX_1D, INUM_TOT, IINDEX_TOT
141 INTEGER :: IIMAX, IJMAX, IIU, IJU, JI
142 INTEGER :: IRANK_SAVE, IPROC_SAVE, IPIO_SAVE, ICOMM_SAVE
145 REAL(KIND=JPRB) :: ZHOOK_HANDLE
148 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_1',0,zhook_handle)
152 IF ( knear_nbr/=u%NDIM_FULL )
THEN 168 CALL get_dim_phys_ll(
'B',iiu,iju)
170 CALL get_globaldims_ll(iimax,ijmax)
171 idim_full = (iimax) * (ijmax)
172 inear_nbr = idim_full
174 tzfd=>getfd(nmnh_comm_world)
189 ALLOCATE(isize_2d(iiu+2*jphext,iju+2*jphext))
191 isize_2d(1+jphext:iiu+jphext,1+jphext:iju+jphext) = reshape(kcode, (/ iiu
193 ALLOCATE(isize_2d_all(iimax+2*jphext,ijmax+2*jphext))
194 CALL gather_xyfield(isize_2d,isize_2d_all,tzfd%OWNER,tzfd%COMM)
196 ALLOCATE(isize_tot(idim_full))
197 isize_tot = reshape(isize_2d_all(1+jphext:iimax+jphext,1+jphext:ijmax+jphext
198 DEALLOCATE(isize_2d_all)
201 ELSEIF (iold==1)
THEN 203 idim_full = u%NDIM_FULL
204 inear_nbr = knear_nbr
206 ALLOCATE(isize_tot(idim_full))
213 #if defined(SFX_MPI) || defined(SFX_MNH) 214 CALL mpi_bcast(isize_tot,idim_full*kind(isize_tot)/4,mpi_integer,
npio,
ncomm 218 IF (all(isize_tot/=0))
THEN 227 DEALLOCATE(isize_tot)
228 CALL dr_hook(
'INTERPOL_NPTS_1',1,zhook_handle)
233 ip =
count(kcode(:)==0)
243 ALLOCATE(inum_1d(u%NDIM_FULL))
244 DO ji = 1,u%NDIM_FULL
248 ALLOCATE(inum_2d(iiu+2*jphext,iju+2*jphext))
250 inum_2d(1+jphext:iiu+jphext,1+jphext:iju+jphext) = reshape(inum_1d, (/
253 ALLOCATE(inum_2d_all(iimax+2*jphext,ijmax+2*jphext))
254 CALL gather_xyfield(inum_2d,inum_2d_all,tzfd%OWNER,tzfd%COMM)
256 ALLOCATE(inum_tot(idim_full))
257 inum_tot = reshape(inum_2d_all(1+jphext:iimax+jphext,1+jphext:ijmax+jphext
258 DEALLOCATE(inum_2d_all)
261 ALLOCATE(iindex_1d(u%NDIM_FULL))
262 iindex_1d(:) = isp - 1
264 ALLOCATE(iindex_2d(iiu+2*jphext,iju+2*jphext))
266 iindex_2d(1+jphext:iiu+jphext,1+jphext:iju+jphext) = reshape(iindex_1d
267 DEALLOCATE(iindex_1d)
269 ALLOCATE(iindex_2d_all(iimax+2*jphext,ijmax+2*jphext))
270 CALL gather_xyfield(iindex_2d,iindex_2d_all,tzfd%OWNER,tzfd%COMM)
271 DEALLOCATE(iindex_2d)
272 ALLOCATE(iindex_tot(idim_full))
273 iindex_tot = reshape(iindex_2d_all(1+jphext:iimax+jphext,1+jphext:ijmax
274 DEALLOCATE(iindex_2d_all)
278 ALLOCATE(zcoord_2d(iiu+2*jphext,iju+2*jphext))
279 ALLOCATE(zcoord_2d_all(iimax+2*jphext,ijmax+2*jphext))
282 zcoord_2d(1+jphext:iiu+jphext,1+jphext:iju+jphext) = reshape(px, (/ iiu
283 CALL gather_xyfield(zcoord_2d,zcoord_2d_all,tzfd%OWNER,tzfd%COMM)
284 ALLOCATE(zx(idim_full))
285 zx = reshape(zcoord_2d_all(1+jphext:iimax+jphext,1+jphext:ijmax+jphext
288 zcoord_2d(1+jphext:iiu+jphext,1+jphext:iju+jphext) = reshape(py, (/ iiu
289 CALL gather_xyfield(zcoord_2d,zcoord_2d_all,tzfd%OWNER,tzfd%COMM)
290 ALLOCATE(zy(idim_full))
291 zy = reshape(zcoord_2d_all(1+jphext:iimax+jphext,1+jphext:ijmax+jphext
293 DEALLOCATE(zcoord_2d,zcoord_2d_all)
296 CALL mpi_bcast(inum_tot,idim_full*kind(inum_tot)/4,mpi_integer,
npio,
ncomm 297 CALL mpi_bcast(iindex_tot,idim_full*kind(iindex_tot)/4,mpi_integer,
npio 298 CALL mpi_bcast(zx,idim_full*kind(zx)/4,mpi_float,
npio,
ncomm,infompi)
299 CALL mpi_bcast(zy,idim_full*kind(zy)/4,mpi_float,
npio,
ncomm,infompi)
304 ELSEIF (iold==1)
THEN 308 ALLOCATE(zx(il1),zy(il1))
314 IF (inear_nbr/=idim_full)
THEN 315 IF (.NOT.
ASSOCIATED(ug%NNEAR))
THEN 316 ALLOCATE(ug%NNEAR(il1,inear_nbr))
318 CALL get_near_meshes(ug%G%CGRID,ug%NGRID_FULL_PAR,idim_full,ug%XGRID_FULL_PAR
322 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_1',1,zhook_handle)
323 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_2',0,zhook_handle)
325 ALLOCATE(iindex(inear_nbr))
328 IF (inear_nbr==idim_full)
THEN 333 IF (isize_tot(jl)>0)
THEN 341 inpts = min(knpts,icount)
343 WHERE(kcode(:)==0) kcode(:) = -4
345 ALLOCATE(zdist(icount))
347 ALLOCATE(zdist(inear_nbr))
352 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_2',1,zhook_handle)
353 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_3',0,zhook_handle)
356 ALLOCATE(inind(ip,knpts))
359 ALLOCATE(zndist(ip,0:knpts))
360 zndist(:,1:knpts) = 1.e20
368 IF (kcode(jl)/=0) cycle
370 IF (inear_nbr/=idim_full)
THEN 374 IF (ug%NNEAR(jl,jk)>0)
THEN 376 IF (isize_tot(ug%NNEAR(jl,jk))>0)
THEN 378 iindex(icount) = ug%NNEAR(jl,jk)
384 IF (icount>=knpts)
THEN 398 zdist(1:icount) = (zx(iindex(1:icount))-px(jl))**2 + (zy(iindex(1:icount
401 zdist(1:icount) = (px(iindex(1:icount))-zx(jl))**2 + (py(iindex(1:icount
406 IF (zdist(jp)>zndist(icpt,inpts)) cycle
410 IF ( zdist(jp)>zndist(icpt,jk-1) )
THEN 413 DO jkk = inpts,jk+1,-1
414 zndist(icpt,jkk) = zndist(icpt,jkk-1)
415 inind(icpt,jkk) = inind(icpt,jkk-1)
420 zndist(icpt,jk) = zdist(jp)
421 inind(icpt,jk) = iindex(jp)
433 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_3',1,zhook_handle)
434 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_4',0,zhook_handle)
436 DEALLOCATE(iindex,zx,zy,isize_tot,zdist)
438 zndist(:,:) = sqrt(zndist(:,:))
440 ALLOCATE(isize(0:
nproc-1))
444 #if defined(SFX_MPI) || defined(SFX_MNH) 445 CALL mpi_allgather(icpt,kind(icpt)/4,mpi_integer,&
446 isize,kind(isize)/4,mpi_integer,
ncomm,infompi)
455 ALLOCATE(inind0(maxval(isize),knpts,0:
nproc-1))
467 IF (jk/=0) inind0(jp,jl,iindex_tot(jk)) = inum_tot(jk)
469 ELSEIF (iold==1)
THEN 470 IF (jk/=0) inind0(jp,jl,
nindex(jk)) =
nnum(jk)
476 ALLOCATE(inind_all(maxval(isize),knpts,0:
nproc-1))
481 #if defined(SFX_MPI) || defined(SFX_MNH) 484 CALL mpi_gather(inind0(:,:,jp),maxval(isize)*knpts*kind(inind0)/4,mpi_integer
491 inind_all(:,:,:) = inind0(:,:,:)
496 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_4',1,zhook_handle)
497 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_5',0,zhook_handle)
501 ALLOCATE(zfield(maxval(isize),knpts,
SIZE(pfield,2),0:
nproc-1))
504 DO jk=1,maxval(isize)
506 IF (inind_all(jk,jl,jp)/=0)
THEN 508 zfield(jk,jl,:,jp) = pfield(inind_all(jk,jl,jp),:)
514 DEALLOCATE(inind_all)
518 ALLOCATE(zfield2(icpt,knpts,
SIZE(pfield,2),0:
nproc-1))
521 #if defined(SFX_MPI) || defined(SFX_MNH) 522 CALL mpi_gather(zfield(1:isize(jp),:,:,jp),
SIZE(zfield(1:isize(jp),:
523 SIZE(pfield,2)*kind(zfield2)
527 zfield2(:,:,:,:) = zfield(:,:,:,:)
533 ALLOCATE(zfield3(icpt,knpts,
SIZE(pfield,2)))
535 WHERE (zfield2(:,:,:,jp)/=
xundef) zfield3(:,:,:) = zfield2(:,:,:,jp)
539 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_5',1,zhook_handle)
540 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_6',0,zhook_handle)
543 ALLOCATE(znval(ip,il2))
551 IF (inind(jl,jp)/=0)
THEN 552 znval(jl,:) = znval(jl,:) + zfield3(jl,jp,:)/zndist(jl,jp)
553 zsum = zsum + 1./zndist(jl,jp)
556 IF (zsum/=0.) znval(jl,:) = znval(jl,:) / zsum
559 DEALLOCATE(inind, zndist, zfield3)
566 IF (kcode(jl)/=0) cycle
569 pfield(jl,:) = znval(icpt,:)
583 DEALLOCATE(iindex_tot,inum_tot)
587 IF (
lhook)
CALL dr_hook(
'INTERPOL_NPTS_6',1,zhook_handle)
subroutine interpol_npts(UG, U, HPROGRAM, KLUOUT, KNPTS, KCODE, PX, PY
integer, dimension(:), allocatable nnum
subroutine get_near_meshes(HGRID, KGRID_PAR, KL, PGRID_PAR, KNEAR_NBR,
integer, dimension(:), allocatable nindex