basis_library.F90 Source File


This file depends on

sourcefile~~basis_library.f90~~EfferentGraph sourcefile~basis_library.f90 basis_library.F90 sourcefile~constants.f90 constants.F90 sourcefile~basis_library.f90->sourcefile~constants.f90 sourcefile~constants_io.f90 constants_io.F90 sourcefile~basis_library.f90->sourcefile~constants_io.f90 sourcefile~elements.f90 elements.F90 sourcefile~basis_library.f90->sourcefile~elements.f90 sourcefile~strings.f90 strings.F90 sourcefile~basis_library.f90->sourcefile~strings.f90 sourcefile~precision.f90 precision.F90 sourcefile~constants.f90->sourcefile~precision.f90 sourcefile~elements.f90->sourcefile~strings.f90 sourcefile~physical_constants.f90 physical_constants.F90 sourcefile~elements.f90->sourcefile~physical_constants.f90

Files dependent on this one

sourcefile~~basis_library.f90~~AfferentGraph sourcefile~basis_library.f90 basis_library.F90 sourcefile~basis_tools.f90 basis_tools.F90 sourcefile~basis_tools.f90->sourcefile~basis_library.f90 sourcefile~c_interop.f90 c_interop.F90 sourcefile~c_interop.f90->sourcefile~basis_tools.f90 sourcefile~types.f90 types.F90 sourcefile~c_interop.f90->sourcefile~types.f90 sourcefile~dft.f90 dft.F90 sourcefile~dft.f90->sourcefile~basis_tools.f90 sourcefile~dft_fuzzycell.f90 dft_fuzzycell.F90 sourcefile~dft.f90->sourcefile~dft_fuzzycell.f90 sourcefile~dft_gridint_energy.f90 dft_gridint_energy.F90 sourcefile~dft.f90->sourcefile~dft_gridint_energy.f90 sourcefile~dft_gridint_grad.f90 dft_gridint_grad.F90 sourcefile~dft.f90->sourcefile~dft_gridint_grad.f90 sourcefile~dft.f90->sourcefile~types.f90 sourcefile~libxc.f90 libxc.F90 sourcefile~dft.f90->sourcefile~libxc.f90 sourcefile~dft_fuzzycell.f90->sourcefile~basis_tools.f90 sourcefile~dft_gridint.f90 dft_gridint.F90 sourcefile~dft_gridint.f90->sourcefile~basis_tools.f90 sourcefile~dft_gridint_energy.f90->sourcefile~basis_tools.f90 sourcefile~dft_gridint_energy.f90->sourcefile~dft_gridint.f90 sourcefile~dft_gridint_energy.f90->sourcefile~types.f90 sourcefile~dft_gridint_fxc.f90 dft_gridint_fxc.F90 sourcefile~dft_gridint_fxc.f90->sourcefile~basis_tools.f90 sourcefile~dft_gridint_fxc.f90->sourcefile~dft_gridint.f90 sourcefile~dft_gridint_fxc.f90->sourcefile~types.f90 sourcefile~dft_gridint_grad.f90->sourcefile~basis_tools.f90 sourcefile~dft_gridint_grad.f90->sourcefile~dft_gridint.f90 sourcefile~dft_gridint_grad.f90->sourcefile~types.f90 sourcefile~dft_gridint_gxc.f90 dft_gridint_gxc.F90 sourcefile~dft_gridint_gxc.f90->sourcefile~basis_tools.f90 sourcefile~dft_gridint_gxc.f90->sourcefile~dft_gridint.f90 sourcefile~dft_gridint_gxc.f90->sourcefile~dft_gridint_fxc.f90 sourcefile~dft_gridint_gxc.f90->sourcefile~types.f90 sourcefile~dft_gridint_tdxc_grad.f90 dft_gridint_tdxc_grad.F90 sourcefile~dft_gridint_tdxc_grad.f90->sourcefile~basis_tools.f90 sourcefile~dft_gridint_tdxc_grad.f90->sourcefile~dft_gridint.f90 sourcefile~dft_gridint_tdxc_grad.f90->sourcefile~types.f90 sourcefile~ecp.f90 ecp.F90 sourcefile~ecp.f90->sourcefile~basis_tools.f90 sourcefile~electric_moments.f90 electric_moments.F90 sourcefile~electric_moments.f90->sourcefile~basis_tools.f90 sourcefile~electric_moments.f90->sourcefile~c_interop.f90 sourcefile~int1.f90 int1.F90 sourcefile~electric_moments.f90->sourcefile~int1.f90 sourcefile~electric_moments.f90->sourcefile~types.f90 sourcefile~get_basis_overlap.f90 get_basis_overlap.F90 sourcefile~get_basis_overlap.f90->sourcefile~basis_tools.f90 sourcefile~get_basis_overlap.f90->sourcefile~c_interop.f90 sourcefile~get_basis_overlap.f90->sourcefile~int1.f90 sourcefile~get_basis_overlap.f90->sourcefile~types.f90 sourcefile~get_states_overlap.f90 get_states_overlap.F90 sourcefile~get_states_overlap.f90->sourcefile~basis_tools.f90 sourcefile~get_states_overlap.f90->sourcefile~c_interop.f90 sourcefile~tdhf_mrsf_lib.f90 tdhf_mrsf_lib.F90 sourcefile~get_states_overlap.f90->sourcefile~tdhf_mrsf_lib.f90 sourcefile~get_states_overlap.f90->sourcefile~types.f90 sourcefile~grd1.f90 grd1.F90 sourcefile~grd1.f90->sourcefile~basis_tools.f90 sourcefile~grd1.f90->sourcefile~ecp.f90 sourcefile~mod_shell_tools.f90 mod_shell_tools.F90 sourcefile~grd1.f90->sourcefile~mod_shell_tools.f90 sourcefile~grd1.f90->sourcefile~types.f90 sourcefile~mod_1e_primitives.f90 mod_1e_primitives.F90 sourcefile~grd1.f90->sourcefile~mod_1e_primitives.f90 sourcefile~grd2.f90 grd2.F90 sourcefile~grd2.f90->sourcefile~basis_tools.f90 sourcefile~grd2_rys.f90 grd2_rys.F90 sourcefile~grd2.f90->sourcefile~grd2_rys.f90 sourcefile~int2.f90 int2.F90 sourcefile~grd2.f90->sourcefile~int2.f90 sourcefile~int2_pairs.f90 int2_pairs.F90 sourcefile~grd2.f90->sourcefile~int2_pairs.f90 sourcefile~grd2.f90->sourcefile~types.f90 sourcefile~grd2_rys.f90->sourcefile~basis_tools.f90 sourcefile~grd2_rys.f90->sourcefile~int2_pairs.f90 sourcefile~guess.f90 guess.F90 sourcefile~guess.f90->sourcefile~basis_tools.f90 sourcefile~guess.f90->sourcefile~types.f90 sourcefile~guess_hcore.f90 guess_hcore.F90 sourcefile~guess_hcore.f90->sourcefile~basis_tools.f90 sourcefile~guess_hcore.f90->sourcefile~c_interop.f90 sourcefile~guess_hcore.f90->sourcefile~guess.f90 sourcefile~printing.f90 printing.F90 sourcefile~guess_hcore.f90->sourcefile~printing.f90 sourcefile~guess_hcore.f90->sourcefile~types.f90 sourcefile~guess_huckel.f90 guess_huckel.F90 sourcefile~guess_huckel.f90->sourcefile~basis_tools.f90 sourcefile~guess_huckel.f90->sourcefile~c_interop.f90 sourcefile~guess_huckel.f90->sourcefile~guess.f90 sourcefile~huckel.f90 huckel.F90 sourcefile~guess_huckel.f90->sourcefile~huckel.f90 sourcefile~guess_huckel.f90->sourcefile~printing.f90 sourcefile~guess_huckel.f90->sourcefile~types.f90 sourcefile~guess_json.f90 guess_json.F90 sourcefile~guess_json.f90->sourcefile~basis_tools.f90 sourcefile~guess_json.f90->sourcefile~c_interop.f90 sourcefile~guess_json.f90->sourcefile~guess.f90 sourcefile~guess_json.f90->sourcefile~printing.f90 sourcefile~guess_json.f90->sourcefile~types.f90 sourcefile~hf_energy.f90 hf_energy.f90 sourcefile~hf_energy.f90->sourcefile~basis_tools.f90 sourcefile~hf_energy.f90->sourcefile~c_interop.f90 sourcefile~hf_energy.f90->sourcefile~dft.f90 sourcefile~hf_energy.f90->sourcefile~printing.f90 sourcefile~scf.f90 scf.F90 sourcefile~hf_energy.f90->sourcefile~scf.f90 sourcefile~hf_energy.f90->sourcefile~types.f90 sourcefile~hf_gradient.f90 hf_gradient.F90 sourcefile~hf_gradient.f90->sourcefile~basis_tools.f90 sourcefile~hf_gradient.f90->sourcefile~c_interop.f90 sourcefile~hf_gradient.f90->sourcefile~dft.f90 sourcefile~hf_gradient.f90->sourcefile~grd1.f90 sourcefile~hf_gradient.f90->sourcefile~grd2.f90 sourcefile~hf_gradient.f90->sourcefile~printing.f90 sourcefile~hf_gradient.f90->sourcefile~types.f90 sourcefile~huckel.f90->sourcefile~basis_tools.f90 sourcefile~huckel.f90->sourcefile~guess.f90 sourcefile~huckel.f90->sourcefile~int1.f90 sourcefile~huckel.f90->sourcefile~types.f90 sourcefile~int1.f90->sourcefile~basis_tools.f90 sourcefile~int1.f90->sourcefile~ecp.f90 sourcefile~int1.f90->sourcefile~mod_shell_tools.f90 sourcefile~int1.f90->sourcefile~printing.f90 sourcefile~int1.f90->sourcefile~mod_1e_primitives.f90 sourcefile~int1e.f90 int1e.F90 sourcefile~int1e.f90->sourcefile~basis_tools.f90 sourcefile~int1e.f90->sourcefile~c_interop.f90 sourcefile~int1e.f90->sourcefile~int1.f90 sourcefile~int1e.f90->sourcefile~printing.f90 sourcefile~int1e.f90->sourcefile~types.f90 sourcefile~int2.f90->sourcefile~basis_tools.f90 sourcefile~int2.f90->sourcefile~int2_pairs.f90 sourcefile~int_libint.f90 int_libint.F90 sourcefile~int2.f90->sourcefile~int_libint.f90 sourcefile~int_rotaxis.f90 int_rotaxis.F90 sourcefile~int2.f90->sourcefile~int_rotaxis.f90 sourcefile~int_rys.f90 int_rys.F90 sourcefile~int2.f90->sourcefile~int_rys.f90 sourcefile~int2.f90->sourcefile~types.f90 sourcefile~int2_pairs.f90->sourcefile~basis_tools.f90 sourcefile~int_libint.f90->sourcefile~basis_tools.f90 sourcefile~int_libint.f90->sourcefile~int2_pairs.f90 sourcefile~int_rotaxis.f90->sourcefile~basis_tools.f90 sourcefile~int_rotaxis.f90->sourcefile~int2_pairs.f90 sourcefile~int_rys.f90->sourcefile~basis_tools.f90 sourcefile~int_rys.f90->sourcefile~int2_pairs.f90 sourcefile~mod_shell_tools.f90->sourcefile~basis_tools.f90 sourcefile~population_analysis.f90 population_analysis.F90 sourcefile~population_analysis.f90->sourcefile~basis_tools.f90 sourcefile~population_analysis.f90->sourcefile~c_interop.f90 sourcefile~population_analysis.f90->sourcefile~types.f90 sourcefile~printing.f90->sourcefile~basis_tools.f90 sourcefile~printing.f90->sourcefile~types.f90 sourcefile~resp.f90 resp.F90 sourcefile~resp.f90->sourcefile~basis_tools.f90 sourcefile~resp.f90->sourcefile~c_interop.f90 sourcefile~resp.f90->sourcefile~int1.f90 sourcefile~resp.f90->sourcefile~types.f90 sourcefile~scf.f90->sourcefile~basis_tools.f90 sourcefile~scf.f90->sourcefile~dft.f90 sourcefile~scf.f90->sourcefile~guess.f90 sourcefile~scf.f90->sourcefile~int2.f90 sourcefile~scf.f90->sourcefile~printing.f90 sourcefile~scf.f90->sourcefile~types.f90 sourcefile~scf_converger.f90 scf_converger.F90 sourcefile~scf.f90->sourcefile~scf_converger.f90 sourcefile~tdhf_energy.f90 tdhf_energy.F90 sourcefile~tdhf_energy.f90->sourcefile~basis_tools.f90 sourcefile~tdhf_energy.f90->sourcefile~c_interop.f90 sourcefile~tdhf_energy.f90->sourcefile~dft.f90 sourcefile~tdhf_energy.f90->sourcefile~dft_gridint_fxc.f90 sourcefile~tdhf_energy.f90->sourcefile~int1.f90 sourcefile~tdhf_energy.f90->sourcefile~int2.f90 sourcefile~tdhf_energy.f90->sourcefile~printing.f90 sourcefile~tdhf_lib.f90 tdhf_lib.F90 sourcefile~tdhf_energy.f90->sourcefile~tdhf_lib.f90 sourcefile~tdhf_energy.f90->sourcefile~types.f90 sourcefile~tdhf_gradient.f90 tdhf_gradient.F90 sourcefile~tdhf_gradient.f90->sourcefile~basis_tools.f90 sourcefile~tdhf_gradient.f90->sourcefile~c_interop.f90 sourcefile~tdhf_gradient.f90->sourcefile~dft.f90 sourcefile~tdhf_gradient.f90->sourcefile~dft_gridint_tdxc_grad.f90 sourcefile~tdhf_gradient.f90->sourcefile~grd1.f90 sourcefile~tdhf_gradient.f90->sourcefile~grd2.f90 sourcefile~tdhf_gradient.f90->sourcefile~printing.f90 sourcefile~tdhf_gradient.f90->sourcefile~tdhf_lib.f90 sourcefile~tdhf_gradient.f90->sourcefile~types.f90 sourcefile~tdhf_lib.f90->sourcefile~basis_tools.f90 sourcefile~tdhf_lib.f90->sourcefile~int2.f90 sourcefile~tdhf_lib.f90->sourcefile~types.f90 sourcefile~tdhf_mrsf_energy.f90 tdhf_mrsf_energy.F90 sourcefile~tdhf_mrsf_energy.f90->sourcefile~basis_tools.f90 sourcefile~tdhf_mrsf_energy.f90->sourcefile~c_interop.f90 sourcefile~tdhf_mrsf_energy.f90->sourcefile~int2.f90 sourcefile~tdhf_mrsf_energy.f90->sourcefile~printing.f90 sourcefile~tdhf_mrsf_energy.f90->sourcefile~tdhf_lib.f90 sourcefile~tdhf_mrsf_energy.f90->sourcefile~tdhf_mrsf_lib.f90 sourcefile~tdhf_sf_lib.f90 tdhf_sf_lib.F90 sourcefile~tdhf_mrsf_energy.f90->sourcefile~tdhf_sf_lib.f90 sourcefile~tdhf_mrsf_energy.f90->sourcefile~types.f90 sourcefile~tdhf_mrsf_lib.f90->sourcefile~basis_tools.f90 sourcefile~tdhf_mrsf_lib.f90->sourcefile~int2.f90 sourcefile~tdhf_mrsf_lib.f90->sourcefile~types.f90 sourcefile~tdhf_sf_energy.f90 tdhf_sf_energy.F90 sourcefile~tdhf_sf_energy.f90->sourcefile~basis_tools.f90 sourcefile~tdhf_sf_energy.f90->sourcefile~c_interop.f90 sourcefile~tdhf_sf_energy.f90->sourcefile~int2.f90 sourcefile~tdhf_sf_energy.f90->sourcefile~printing.f90 sourcefile~tdhf_sf_energy.f90->sourcefile~tdhf_lib.f90 sourcefile~tdhf_sf_energy.f90->sourcefile~tdhf_sf_lib.f90 sourcefile~tdhf_sf_energy.f90->sourcefile~types.f90 sourcefile~tdhf_sf_lib.f90->sourcefile~basis_tools.f90 sourcefile~tdhf_sf_lib.f90->sourcefile~int1.f90 sourcefile~tdhf_sf_lib.f90->sourcefile~tdhf_lib.f90 sourcefile~tdhf_sf_lib.f90->sourcefile~types.f90 sourcefile~tdhf_z_vector.f90 tdhf_z_vector.F90 sourcefile~tdhf_z_vector.f90->sourcefile~basis_tools.f90 sourcefile~tdhf_z_vector.f90->sourcefile~c_interop.f90 sourcefile~tdhf_z_vector.f90->sourcefile~dft.f90 sourcefile~tdhf_z_vector.f90->sourcefile~dft_gridint_fxc.f90 sourcefile~tdhf_z_vector.f90->sourcefile~dft_gridint_gxc.f90 sourcefile~tdhf_z_vector.f90->sourcefile~int2.f90 sourcefile~tdhf_z_vector.f90->sourcefile~printing.f90 sourcefile~tdhf_z_vector.f90->sourcefile~tdhf_lib.f90 sourcefile~tdhf_z_vector.f90->sourcefile~tdhf_sf_lib.f90 sourcefile~tdhf_z_vector.f90->sourcefile~types.f90 sourcefile~types.f90->sourcefile~basis_tools.f90 sourcefile~apply_basis.f90 apply_basis.F90 sourcefile~apply_basis.f90->sourcefile~c_interop.f90 sourcefile~apply_basis.f90->sourcefile~types.f90 sourcefile~libxc.f90->sourcefile~types.f90 sourcefile~mod_1e_primitives.f90->sourcefile~mod_shell_tools.f90 sourcefile~oqp_banner.f90 oqp_banner.F90 sourcefile~oqp_banner.f90->sourcefile~c_interop.f90 sourcefile~oqp_banner.f90->sourcefile~types.f90 sourcefile~scf_converger.f90->sourcefile~printing.f90

Source Code

module basis_library

  use, intrinsic :: iso_fortran_env, only: real64
  use elements, only: MAX_ELEMENT_Z, get_element_id
  use strings, only: to_upper
  use constants, only: ANGULAR_LABEL, NUM_CART_BF
  use io_constants, only: IW

  implicit none

  private

  type, public :: atom_basis_t
    integer :: nshells = 0
    integer :: nbfs = 0
    integer :: nprims = 0
    integer, allocatable :: ang(:)
    integer, allocatable :: ncontract(:)
    real(real64), allocatable :: ex(:)
    real(real64), allocatable :: cc(:)
  contains
    procedure, private :: reserve => atom_basis_reserve
  end type

  type, public :: basis_library_t
    type(atom_basis_t) :: atoms(MAX_ELEMENT_Z)
  contains
    procedure :: from_file => read_basis_library
    procedure :: calc_req_storage
    procedure :: echo => basis_library_echo
  end type

contains

!-------------------------------------------------------------------------------

  subroutine calc_req_storage(this, z, nshell, ngauss, nbasis)
    class(basis_library_t), target, intent(in) :: this
    integer, intent(in) :: z(:)
    integer, intent(out) :: nshell, ngauss, nbasis

    nshell = sum(this%atoms(z)%nshells)
    nbasis = sum(this%atoms(z)%nbfs)
    ngauss = sum(this%atoms(z)%nprims)

  end subroutine

!-------------------------------------------------------------------------------

  subroutine read_basis_library(this, fname)
    class(basis_library_t), target, intent(inout) :: this
    character(*), intent(in) :: fname
    integer :: iunit
    integer :: stat
    character(len=1024) :: msg

    open (newunit=iunit, file=trim(adjustl(fname)), status='old', action='read', &
          iostat=stat, iomsg=msg)

    if (stat /= 0) then
      write (IW, *) 'Can''t open basis library file ''', trim(adjustl(fname)), ''''
      write (IW, *) 'The error is:'
      write (IW, *) trim(msg)
      flush (IW)
      call abort
    end if

    call read_basis_library_file(this, iunit)

    close (iunit)

  end subroutine

!-------------------------------------------------------------------------------

  subroutine read_basis_library_file(this, iunit)
    class(basis_library_t), target, intent(inout) :: this
    integer, intent(in) :: iunit
    type(atom_basis_t), pointer :: atom
    integer :: z
    integer :: ig
    integer :: ln
    integer :: state
    character(1) :: label
    integer :: ng
    character(len=1024) :: error
    integer :: iost

    integer :: id

    character(1024) :: line

    integer :: l
    integer, parameter :: &
      READ_ATOM = 0, &
      READ_SHELL = 1, &
      READ_GAUSS = 2

    state = READ_ATOM
    ig = 0
    ln = 0

    do
      read (unit=iunit, fmt='(A)', end=100) line
      ln = ln+1
!          Check if line is commented out
      if (skip_string(line)) cycle

      select case (state)
      case (READ_ATOM)
        z = get_element_id(trim(adjustl(line)))

        if (z > 0) then
          state = READ_SHELL
          atom => this%atoms(z)
        end if

      case (READ_SHELL)
        if (len_trim(line) == 0) then
          state = READ_ATOM
          ig = 0
          cycle
        end if

        read (line, *, err=200, iostat=iost, iomsg=error) label, ng

        atom%nshells = atom%nshells+1
        call atom%reserve(nshell=atom%nshells, ngauss=ig+ng)

        l = scan(ANGULAR_LABEL, label)
        atom%ang(atom%nshells) = l-1
        atom%nbfs = atom%nbfs+NUM_CART_BF(l-1)

        atom%ncontract(atom%nshells) = ng
        atom%nprims = atom%nprims+ng

        if (atom%ang(atom%nshells) < 0) then
          write (IW, *) "Unknown basis function type: '", label, "'"
          goto 200
        end if

        state = READ_GAUSS

      case (READ_GAUSS)
        ig = ig+1
        read (line, fmt=*, err=200, iostat=iost, iomsg=error) id, atom%ex(ig), atom%cc(ig)

        ng = ng-1
        if (ng == 0) state = READ_SHELL

      end select
    end do

100 continue
    return

200 continue
    write (IW, '("Error while reading basis set file at line ",I0,":")') ln
    write (IW, '(A)') trim(line)
    call abort

  end subroutine

!-------------------------------------------------------------------------------

  subroutine basis_library_echo(this)
    use elements, only: MAX_ELEMENT_Z, ELEMENTS_LONG_NAME
    class(basis_library_t), intent(in) :: this
    integer :: ia, sh, ig, g

    do ia = 1, MAX_ELEMENT_Z
      associate (at => this%atoms(ia))
        if (at%nshells == 0) cycle
        write (*, *) trim(ELEMENTS_LONG_NAME(ia)), at%nshells, at%nprims, at%nbfs
        ig = 0
        do sh = 1, at%nshells
          write (*, '(A1,i10)') ANGULAR_LABEL(at%ang(sh):at%ang(sh)), at%ncontract(sh)
          do g = 1, at%ncontract(sh)
            ig = ig+1
            write (*, '(i4,2ES25.15)') g, at%ex(ig), at%cc(ig)
          end do
        end do
      end associate
    end do
  end subroutine

!-------------------------------------------------------------------------------

  subroutine atom_basis_reserve(this, nshell, ngauss)
    class(atom_basis_t), intent(inout) :: this
    integer, optional, intent(in) :: nshell, ngauss

    if (present(nshell)) then
      call reserve_array_int(this%ang, nshell)
      call reserve_array_int(this%ncontract, nshell)
    end if

    if (present(ngauss)) then
      call reserve_array_real(this%ex, ngauss)
      call reserve_array_real(this%cc, ngauss)
    end if
  end subroutine

  subroutine reserve_array_int(a, n)
    integer, intent(in) :: n
    integer, allocatable, intent(inout) :: a(:)
    integer, allocatable :: tmp(:)
    integer :: lda
    lda = 0
    if (allocated(a)) lda = ubound(a, 1)
    if (n <= lda) return
    allocate (tmp(max(n, lda+16)))
    if (allocated(a)) tmp(:) = a(:)
    call move_alloc(from=tmp, to=a)
  end subroutine

  subroutine reserve_array_real(a, n)
    integer, intent(in) :: n
    real(real64), allocatable, intent(inout) :: a(:)
    real(real64), allocatable :: tmp(:)
    integer :: lda
    lda = 0
    if (allocated(a)) lda = ubound(a, 1)
    if (n <= lda) return
    allocate (tmp(max(n, lda+16)))
    if (allocated(a)) tmp(:lda) = a(:)
    call move_alloc(from=tmp, to=a)
  end subroutine

  logical function skip_string(str) result(res)
    character(*) :: str
    character(*), parameter :: TO_SKIP = '!#&$/\'
    integer :: pos
    res = .false.
    pos = verify(str, ' ')
    if (pos == 0) return
    res = scan(TO_SKIP, str(pos:pos)) /= 0
  end function

end module