get_structures_ao_overlap Subroutine

public subroutine get_structures_ao_overlap(infos)

Uses

  • proc~~get_structures_ao_overlap~~UsesGraph proc~get_structures_ao_overlap get_structures_ao_overlap module~atomic_structure_m atomic_structure_m proc~get_structures_ao_overlap->module~atomic_structure_m module~basis_tools basis_tools proc~get_structures_ao_overlap->module~basis_tools module~constants constants proc~get_structures_ao_overlap->module~constants module~int1 int1 proc~get_structures_ao_overlap->module~int1 module~io_constants io_constants proc~get_structures_ao_overlap->module~io_constants module~messages messages proc~get_structures_ao_overlap->module~messages module~oqp_tagarray_driver oqp_tagarray_driver proc~get_structures_ao_overlap->module~oqp_tagarray_driver module~precision precision proc~get_structures_ao_overlap->module~precision module~strings strings proc~get_structures_ao_overlap->module~strings module~types types proc~get_structures_ao_overlap->module~types module~util util proc~get_structures_ao_overlap->module~util iso_c_binding iso_c_binding module~atomic_structure_m->iso_c_binding module~basis_tools->module~atomic_structure_m module~basis_tools->module~constants module~basis_tools->module~io_constants module~basis_tools->module~precision iso_fortran_env iso_fortran_env module~basis_tools->iso_fortran_env module~parallel parallel module~basis_tools->module~parallel module~constants->module~precision module~int1->module~basis_tools module~int1->module~messages module~int1->iso_fortran_env module~mod_1e_primitives mod_1e_primitives module~int1->module~mod_1e_primitives module~mod_shell_tools mod_shell_tools module~int1->module~mod_shell_tools module~messages->module~io_constants module~messages->module~precision comm_IOFILE comm_IOFILE module~messages->comm_IOFILE comm_PAR comm_PAR module~messages->comm_PAR module~oqp_tagarray_driver->iso_c_binding tagarray tagarray module~oqp_tagarray_driver->tagarray module~precision->iso_fortran_env module~strings->iso_c_binding module~types->module~atomic_structure_m module~types->module~basis_tools module~types->module~precision module~types->iso_c_binding module~functionals functionals module~types->module~functionals module~types->module~parallel module~types->tagarray module~util->module~precision module~functionals->module~precision module~functionals->iso_c_binding xc_f03_lib_m xc_f03_lib_m module~functionals->xc_f03_lib_m module~mod_1e_primitives->module~constants module~mod_1e_primitives->iso_fortran_env module~mod_1e_primitives->module~mod_shell_tools module~mod_gauss_hermite mod_gauss_hermite module~mod_1e_primitives->module~mod_gauss_hermite module~rys rys module~mod_1e_primitives->module~rys module~xyz_order xyz_order module~mod_1e_primitives->module~xyz_order module~mod_shell_tools->module~basis_tools module~mod_shell_tools->module~precision module~parallel->module~precision module~parallel->iso_c_binding module~parallel->iso_fortran_env mpi mpi module~parallel->mpi module~mod_gauss_hermite->module~precision module~rys->module~constants module~rys->module~precision module~rys_lut rys_lut module~rys->module~rys_lut

@brief Calculate AO overlap between two different geometries @param[in,out] infos Information structure containing all necessary data

This subroutine calculates the overlap between basis sets (Atomic Orbitals) of two different geometries. It computes both AO and derived MO overlaps and stores the results in the infos structure.

Note

Output AO overlap is written to mol.data["OQP::overlap_ao_non_orthogonal"] Output MO overlap is written to mol.data["OQP::overlap_mo_non_orthogonal"] Current geometry (xyz) is taken from mol.data["OQP::xyz"] Current MO coefficients (mo_a) are taken from mol.data["OQP::VEC_MO_A"] Current MO energies (e_a) are taken from mol.data["OQP::E_MO_A"] Old geometry (xyz_old) is taken from mol.data["OQP::xyz_old"] Old MO coefficients (mo_a_old) are taken from mol.data["OQP::VEC_MO_A_old"] Old MO energies (e_a_old) are taken from mol.data["OQP::E_MO_A_old"]

Arguments

Type IntentOptional Attributes Name
type(information), intent(inout), target :: infos

Information structure containing all necessary data


Calls

proc~~get_structures_ao_overlap~~CallsGraph proc~get_structures_ao_overlap get_structures_ao_overlap interface~data_has_tags data_has_tags proc~get_structures_ao_overlap->interface~data_has_tags interface~tagarray_get_data tagarray_get_data proc~get_structures_ao_overlap->interface~tagarray_get_data proc~basis_overlap basis_overlap proc~get_structures_ao_overlap->proc~basis_overlap proc~measure_time measure_time proc~get_structures_ao_overlap->proc~measure_time proc~mo_overlap mo_overlap proc~get_structures_ao_overlap->proc~mo_overlap proc~print_geo print_geo proc~get_structures_ao_overlap->proc~print_geo proc~print_results print_results proc~get_structures_ao_overlap->proc~print_results remove_records remove_records proc~get_structures_ao_overlap->remove_records reserve_data reserve_data proc~get_structures_ao_overlap->reserve_data none~alloc2 shpair_t%alloc2 proc~basis_overlap->none~alloc2 none~fetch_by_id shell_t%fetch_by_id proc~basis_overlap->none~fetch_by_id none~shell_pair2 shpair_t%shell_pair2 proc~basis_overlap->none~shell_pair2 proc~comp_kin_ovl_int1_prim comp_kin_ovl_int1_prim proc~basis_overlap->proc~comp_kin_ovl_int1_prim proc~update_rectangular_matrix update_rectangular_matrix proc~basis_overlap->proc~update_rectangular_matrix dgemm dgemm proc~mo_overlap->dgemm proc~doquadgausshermite doQuadGaussHermite proc~comp_kin_ovl_int1_prim->proc~doquadgausshermite abrt abrt proc~doquadgausshermite->abrt

Called by

proc~~get_structures_ao_overlap~~CalledByGraph proc~get_structures_ao_overlap get_structures_ao_overlap proc~get_structures_ao_overlap_c get_structures_ao_overlap_C proc~get_structures_ao_overlap_c->proc~get_structures_ao_overlap

Source Code

  subroutine get_structures_ao_overlap(infos)
    use precision, only: dp
    use io_constants, only: iw
    use oqp_tagarray_driver
    use types, only: information
    use strings, only: Cstring, fstring
    use basis_tools, only: basis_set
    use atomic_structure_m, only: atomic_structure
    use messages, only: show_message, with_abort
    use int1, only: basis_overlap
    use constants, only: tol_int
    use util, only: measure_time

    implicit none

    character(len=*), parameter :: subroutine_name = "get_structures_ao_overlap"

    !> Information structure containing all necessary data
    type(information), target, intent(inout) :: infos

    type(basis_set), pointer :: basis
    type(basis_set), allocatable :: basis_old
    type(atomic_structure), allocatable, target :: atoms_old
    integer :: i, nbf

    ! Tagarray definitions and data pointers
    character(len=*), parameter :: tags_general(*) = (/ character(len=80) :: &
        OQP_XYZ_old, OQP_VEC_MO_A, OQP_E_MO_A, OQP_VEC_MO_A_old, OQP_E_MO_A_old /)
    character(len=*), parameter :: tags_alloc(*) = (/ character(len=80) :: &
        OQP_overlap_mo, OQP_overlap_ao/)
    real(kind=dp), pointer :: xyz_old(:,:), overlap_ao_out(:,:), overlap_mo_out(:,:), &
        mo_a(:,:), mo_a_old(:,:), e_a(:), e_a_old(:)

    ! Open log file
    open (unit=IW, file=infos%log_filename, position="append")

    ! Initialize basis sets and atomic structures
    allocate(basis_old, source=infos%basis)
    allocate(atoms_old, source=infos%atoms)

    basis => infos%basis
    basis%atoms => infos%atoms
    nbf = basis%nbf

    ! Allocate and prepare data for output
    call infos%dat%remove_records(tags_alloc)
    call infos%dat%reserve_data(OQP_overlap_mo, TA_TYPE_REAL64, &
          nbf*nbf, (/ nbf, nbf /), comment=OQP_overlap_mo_comment)
    call infos%dat%reserve_data(OQP_overlap_ao, TA_TYPE_REAL64, &
          nbf*nbf, (/ nbf, nbf /), comment=OQP_overlap_ao_comment)
    call data_has_tags(infos%dat, tags_alloc, module_name, subroutine_name, with_abort)
    call tagarray_get_data(infos%dat, OQP_overlap_mo, overlap_mo_out)
    call tagarray_get_data(infos%dat, OQP_overlap_ao, overlap_ao_out)

    ! Load data from python level
    call data_has_tags(infos%dat, tags_general, module_name, subroutine_name, with_abort)
    call tagarray_get_data(infos%dat, OQP_xyz_old, xyz_old)
    call tagarray_get_data(infos%dat, OQP_VEC_MO_A, mo_a)
    call tagarray_get_data(infos%dat, OQP_E_MO_A, e_a)
    call tagarray_get_data(infos%dat, OQP_VEC_MO_A_old, mo_a_old)
    call tagarray_get_data(infos%dat, OQP_E_MO_A_old, e_a_old)

    ! Apply old geometry to old basis
    atoms_old%xyz = xyz_old
    basis_old%atoms => atoms_old

    call print_geo(basis_old, "Previous geometry")
    call print_geo(basis, " Current geometry")

    overlap_ao_out = 0.0_dp
    overlap_mo_out = 0.0_dp

    ! Calculate AO overlap between old and new basis sets
    call basis_overlap(overlap_ao_out, basis, basis_old, tol=log(10.0_dp)*tol_int)

    ! Normalize AO overlap
    do i = 1, nbf
      overlap_ao_out(:,i) = overlap_ao_out(:,i) * basis%bfnrm(i) * basis_old%bfnrm(:)
    end do

    ! Calculate MO overlap: <old(I)|new(J')> = transpose[Cold(AI)] . <old(A)|new(A')> . Cnew(A'J')
    call mo_overlap(overlap_mo_out, mo_a, mo_a_old, overlap_ao_out, nbf)

    ! Output results: overlap between old and current MOs
    call print_results(overlap_mo_out, e_a, e_a_old, nbf, &
                       infos%mol_prop%nelec_a, iw)

!   Print timings
    call measure_time(print_total=1, log_unit=iw)
    call flush(iw)

    close(iw)

  end subroutine get_structures_ao_overlap