subroutine readcmaq2d(ncidcmaq,data2d,name)
  use gridmod, only : nlon,nlat
  use mpimod, only : mype
  use kinds, only : r_kind,i_kind
  implicit none
  include 'netcdf.inc'
  character *(*) name
  real(r_kind) data2d(nlat,nlon),data2din(nlon,nlat)
  integer(i_kind) ierr,ipnt,ncidcmaq,i,j
  if(mype.ne.0)return
!  write(6,*)'readcmaq2d',name
!  call flush(6)
  ierr=nf_inq_varid(ncidcmaq,name,ipnt)
  if(ierr /= NF_NOERR)then
    write(6,*)'readcmaq2d var not found',trim(name)
  endif
  ierr=nf_get_var_double(ncidcmaq,ipnt,data2din)
  if(ierr /= NF_NOERR)then
    write(6,*)'error reading ',trim(name)
  endif
  call flush(6)
  do i=1,nlon
    do j=1,nlat
      data2d(j,i)=data2din(i,j)
    end do
  end do
  return
end subroutine readcmaq2d
subroutine readcmaq3d(ncidcmaq,data3d,nl,name)
  use gridmod, only : nlon,nlat
  use mpimod, only : mype
  use kinds, only : r_kind,i_kind,r_double,r_single
  implicit none
  include 'netcdf.inc'
  character *(*) name
  real(r_kind) data3d(nlat,nlon,nl),data3din(nlon,nlat,nl)
  integer(i_kind) ierr,ipnt,ncidcmaq,nl,i,j,k
  if(mype.ne.0)return
  ierr=nf_inq_varid(ncidcmaq,name,ipnt)
  if(ierr /= NF_NOERR)then
    write(6,*)'readcmaq3d var not found',trim(name)
    call flush(6)
    call stop2(876)
 
  endif
  ierr=nf_get_var_double(ncidcmaq,ipnt,data3din)
  if(ierr /= NF_NOERR)then
    write(6,*)'error reading ',trim(name)
    call flush(6)
    call stop2(875)
  endif
!   write(6,*)'r_kind',r_kind,'r_double',r_double,'r_single',r_single
!   write(6,*)'shape',shape(data3din),'ipnt',ipnt
!   write(6,*)name,'readcmaq3di data3din max',maxval(data3din),minval(data3din),'nlon',nlon,nlat,nl
!   call flush(6)
! note 1 is bottom for global GSI and also cmaq data
  do k=1,nl
!    write(6,*)trim(name),k,data3din(nlon,nlat,k)
    do i=1,nlon
      do j=1,nlat
        data3d(j,i,k)=data3din(i,j,k)
      end do
    end do
  end do
!  write(6,*)'shape data3d',shape(data3d),'data3din',shape(data3din)
!  write(6,*)'data3d output',maxval(data3d),minval(data3d)
  return
end subroutine readcmaq3d
subroutine scat2dcmaq(datacmaq,datanode)
  use cmaqmod, only : i2d,j2d
  use kinds, only : i_kind,r_kind
  use mpimod, only : npe,mpi_comm_world,mpi_rtype,mype
  use gridmod
  implicit none
  integer(i_kind) ierr,nccmaq,nrcmaq,i,j,ii
  real(r_kind) send2d(itotsub)
! note datacmaq flipped already to be lat,lon
  real(r_kind) datanode(lat2,lon2),datacmaq(nlat,nlon)
  if(mype.eq.0)then
    do ii=1,itotsub
      i=i2d(ii) ! lon
      j=j2d(ii) ! lat
      send2d(ii)=datacmaq(j,i)
!      if(ii<1000)then
!        write(6,*)'i',i,j,'ii',ii,'send2d',send2d(ii)
!      endif
    end do
  endif
 
  call mpi_scatterv(send2d,ijn_s,displs_s,mpi_rtype, &
                     datanode ,ijn_s(mype+1),mpi_rtype,0,mpi_comm_world,ierr)
  return
end subroutine scat2d
subroutine scat3dcmaq(datacmaq,datanode)
  use cmaqmod, only : i2d,j2d
  use kinds, only : i_kind,r_kind
  use mpimod, only : npe,mpi_comm_world,mpi_rtype,mype
  use gridmod
  implicit none
!  integer(i_kind) i2d(itotsub),j2d(itotsub),ierr,nccmaq,nrcmaq,i,j,ii,k
  integer(i_kind) ierr,nccmaq,nrcmaq,i,j,ii,k
  integer(i_kind) isend3d(npe),disp3d(npe)
  real(r_kind) send3d(nsig,itotsub)
! note datacmaq flipped already to be lat,lon
  real(r_kind),dimension(grd_a%lat2,grd_a%lon2,grd_a%nsig) :: datanode
  real(r_kind) datacmaq(nlat,nlon,grd_a%nsig)
!  real(r_kind), dimension(grd%lat2,grd%lon2,grd%nsig), intent(out) :: g_u,g_v, g_q,g_oz,g_tv
  real(r_kind) datarecv(grd_a%nsig,grd_a%lat2,grd_a%lon2)
  isend3d=grd_a%nsig*ijn_s
  disp3d=grd_a%nsig*displs_s
  if(mype.eq.0)then
    do ii=1,itotsub
      i=i2d(ii) ! lon
      j=j2d(ii) ! lat
      send3d(:,ii)=datacmaq(j,i,:)
    end do
  endif
 
  call mpi_scatterv(send3d,isend3d,disp3d,mpi_rtype, &
                     datarecv ,isend3d(mype+1),mpi_rtype,0,mpi_comm_world,ierr)
  do k=1,nsig
    do i=1,lon2
      do j=1,lat2
        datanode(j,i,k)=datarecv(k,j,i)
      end do
    end do
  end do
  return
end subroutine scat3d
subroutine scat3dp(datacmaq,datanode)
  use cmaqmod, only : i2d,j2d
  use kinds, only : i_kind,r_kind
  use mpimod, only : npe,mpi_comm_world,mpi_rtype,mype
  use gridmod
  implicit none
!  integer(i_kind) i2d(itotsub),j2d(itotsub),ierr,nccmaq,nrcmaq,i,j,ii,k
  integer(i_kind) ierr,nccmaq,nrcmaq,i,j,ii,k
  integer(i_kind) isend3d(npe),disp3d(npe)
  real(r_kind) send3d(nsig+1,itotsub)
! note datacmaq flipped already to be lat,lon
  real(r_kind),dimension(grd_a%lat2,grd_a%lon2,grd_a%nsig+1) :: datanode
  real(r_kind) datacmaq(nlat,nlon,grd_a%nsig+1)
!  real(r_kind), dimension(grd%lat2,grd%lon2,grd%nsig), intent(out) :: g_u,g_v, g_q,g_oz,g_tv
  real(r_kind) datarecv(grd_a%nsig+1,grd_a%lat2,grd_a%lon2)
  isend3d=(grd_a%nsig+1)*ijn_s
  disp3d=(grd_a%nsig+1)*displs_s
  if(mype.eq.0)then
    do ii=1,itotsub
      i=i2d(ii) ! lon
      j=j2d(ii) ! lat
      send3d(:,ii)=datacmaq(j,i,:)
    end do
  endif
 
  call mpi_scatterv(send3d,isend3d,disp3d,mpi_rtype, &
                     datarecv ,isend3d(mype+1),mpi_rtype,0,mpi_comm_world,ierr)
  do k=1,nsig+1
    do i=1,lon2
      do j=1,lat2
        datanode(j,i,k)=datarecv(k,j,i)
      end do
    end do
  end do
  return
end subroutine scat3dp
