subroutine build_grid(nNuc,ZNuc,rNuc,max_ang_mom,min_exponent,max_exponent, & 
                      radial_precision,nRad,nAng,nGrid,weight,root)

! Compute quadrature grid with numgrid (Radovan Bast)

  use numgrid
  use, intrinsic :: iso_c_binding, only: c_ptr

  implicit none
  include 'parameters.h'

! Input variables

  integer,intent(in)            :: nNuc
  double precision,intent(in)   :: ZNuc(nNuc)
  double precision,intent(in)   :: rNuc(nNuc,ncart)

  integer,intent(in)            :: max_ang_mom(nNuc)
  double precision,intent(in)   :: min_exponent(nNuc,maxL+1)
  double precision,intent(in)   :: max_exponent(nNuc)

  double precision,intent(in)   :: radial_precision
  integer,intent(in)            :: nAng
  integer,intent(in)            :: nGrid

! Local variables
 
  logical                       :: dump_grid = .false.
  integer                       :: iNuc
  integer                       :: iG

  integer                       :: min_num_angular_points
  integer                       :: max_num_angular_points
  integer                       :: num_points
  integer                       :: num_radial_points

  integer                       :: center_index
  type(c_ptr)                   :: context

! Output variables

  integer,intent(out)           :: nRad
  double precision,intent(out)  :: root(ncart,nGrid)
  double precision,intent(out)  :: weight(nGrid)

! Set useful variables

  min_num_angular_points = nAng
  max_num_angular_points = nAng

!------------------------------------------------------------------------
! Main loop over atoms
!------------------------------------------------------------------------

  iG = 0
  nRad = 0

  do iNuc=1,nNuc

    context = numgrid_new_atom_grid(radial_precision,min_num_angular_points,max_num_angular_points, &
                                    int(ZNuc(iNuc)),max_exponent(iNuc),max_ang_mom(iNuc),           &
                                    min_exponent(iNuc,1:max_ang_mom(iNuc)+1))

    center_index = iNuc - 1
    num_points = numgrid_get_num_grid_points(context)
    num_radial_points = numgrid_get_num_radial_grid_points(context)


    call numgrid_get_grid(context,nNuc,center_index,rNuc(:,1),rNuc(:,2),rNuc(:,3),int(ZNuc(:)),    &
                          root(1,iG+1:iG+num_points),root(2,iG+1:iG+num_points),root(3,iG+1:iG+num_points), &
                          weight(iG+1:iG+num_points))

    iG = iG + num_points
    nRad = nRad + num_radial_points

    call numgrid_free_atom_grid(context)

  end do

!------------------------------------------------------------------------
! End main loop over atoms
!------------------------------------------------------------------------

! Print grid

  write(*,*)
  write(*,'(A30,E10.1)') 'Radial precision         = ',radial_precision
  write(*,'(A30,I10)')   'Number of radial  points = ',nRad
  write(*,'(A30,I10)')   'Number of angular points = ',nAng
  write(*,'(A30,I10)')   'Total number of   points = ',nGrid
  write(*,*)

  if(dump_grid) then 

    write(*,*) ' ***********************'
    write(*,*) ' *** QUADRATURE GRID ***'
    write(*,*) ' ***********************'

    write(*,'(A10,3X,3A15)') 'Grid point','X','Y','Z'
    do iG=1,nGrid
       write(*,'(I10,3X,4F15.10)') iG,weight(iG),root(:,iG)
    end do
    write(*,*)

  end if

end subroutine build_grid
