subroutine var_3d_wlocs(rlon,rlat,rpres,theta,theta0,mdata,ivar,varlats,varpres,nvarlats,nvarpres,npes) include 'mpif.h' include "my_comm.h" real(4) rlon(max(1,mdata)),rlat(max(1,mdata)),rpres(max(1,mdata)),varlats(nvarlats),varpres(nvarpres) real(4) theta(max(1,mdata)) integer(4) ivar(nvarlats,nvarpres) real(4),allocatable::spres(:) integer(4),allocatable::nearest0(:) real(4),allocatable::delmin0(:) call mpi_comm_rank(my_comm,mype,ierr) allocate(nearest0(0:npes-1)) allocate(delmin0(0:npes-1)) allocate(spres(max(1,mdata))) if(mdata.gt.0) then do i=1,mdata spres(i)=exp(rpres(i)) end do end if do k=1,nvarpres do j=1,nvarlats nearest=0 delmin=huge(dellat) if(mdata.gt.0) then do i=1,mdata del=(rlat(i)-varlats(j))**2+(spres(i)-varpres(k))**2 if(del.le.delmin.and.abs(theta(i)-theta0).lt.1.) then nearest=i delmin=del end if end do end if call mpi_gather(nearest,1,mpi_integer,nearest0,1,mpi_integer,0,my_comm,ierr) call mpi_gather(delmin,1,mpi_real,delmin0,1,mpi_real,0,my_comm,ierr) if(mype.eq.0) then minpe=-1 delminmin=huge(delminmin) do i=0,npes-1 if(delmin0(i).le.delminmin) then minpe=i delminmin=delmin0(i) end if end do do i=0,npes-1 if(i.ne.minpe) then nearest0(i)=0 end if end do end if call mpi_scatter(nearest0,1,mpi_integer,ivar(j,k),1,mpi_integer,0,my_comm,ierr) ! if(ivar(j,k).ne.0) then ! print *,' in var_3d_wlocs, mype,ivar,varlat,oblat,varpres,obpres,theta0,theta=', & ! mype,theta0,ivar(j,k),varlats(j), & ! rlat(ivar(j,k)),varpres(k),spres(ivar(j,k)),theta0,theta(ivar(j,k)) ! end if end do end do return end subroutine var_3d_wlocs