From 648e157db9ccd7a0632447449a9c724d750be4d7 Mon Sep 17 00:00:00 2001 From: Kevin Gasperich Date: Tue, 28 Jan 2020 16:37:30 -0600 Subject: [PATCH] added complex mo_one_e_ints; maybe should be structured differently? --- src/ao_one_e_ints/ao_one_e_ints.irp.f | 3 +- src/ao_one_e_ints/kin_ao_ints.irp.f | 16 +++++ src/ao_one_e_ints/pot_ao_ints.irp.f | 15 +++++ src/mo_one_e_ints/kin_mo_ints.irp.f | 64 ++++++++++++++----- src/mo_one_e_ints/mo_one_e_ints.irp.f | 43 +++++++++++++ src/mo_one_e_ints/pot_mo_ints.irp.f | 63 ++++++++++++++----- src/mo_one_e_ints/pot_mo_pseudo_ints.irp.f | 71 +++++++++++++++++----- 7 files changed, 229 insertions(+), 46 deletions(-) diff --git a/src/ao_one_e_ints/ao_one_e_ints.irp.f b/src/ao_one_e_ints/ao_one_e_ints.irp.f index 694f0cdc..b5e8872e 100644 --- a/src/ao_one_e_ints/ao_one_e_ints.irp.f +++ b/src/ao_one_e_ints/ao_one_e_ints.irp.f @@ -60,7 +60,8 @@ BEGIN_PROVIDER [ complex*16, ao_one_e_integrals_complex,(ao_num,ao_num)] do i=1,ao_num do j=1,ao_num - ao_one_e_integrals_complex(j,i)=ao_one_e_integrals(j,i)+(0.d0,1.d0)*ao_one_e_integrals_imag(j,i) + ao_one_e_integrals_complex(j,i)=dcmplx(ao_one_e_integrals(j,i), & + ao_one_e_integrals_imag(j,i)) enddo enddo diff --git a/src/ao_one_e_ints/kin_ao_ints.irp.f b/src/ao_one_e_ints/kin_ao_ints.irp.f index 442c1f88..ca50114c 100644 --- a/src/ao_one_e_ints/kin_ao_ints.irp.f +++ b/src/ao_one_e_ints/kin_ao_ints.irp.f @@ -171,3 +171,19 @@ BEGIN_PROVIDER [double precision, ao_kinetic_integrals_imag, (ao_num,ao_num)] endif END_PROVIDER +BEGIN_PROVIDER [complex*16, ao_kinetic_integrals_complex, (ao_num,ao_num)] + implicit none + BEGIN_DOC + ! Kinetic energy integrals in the |AO| basis. + ! + ! $\langle \chi_i |\hat{T}| \chi_j \rangle$ + ! + END_DOC + integer :: i,j + do i=1,ao_num + do j=1,ao_num + ao_kinetic_integrals_complex(j,i) = dcmplx(ao_kinetic_integrals(j,i), & + ao_kinetic_integrals_imag(j,i)) + enddo + enddo +END_PROVIDER diff --git a/src/ao_one_e_ints/pot_ao_ints.irp.f b/src/ao_one_e_ints/pot_ao_ints.irp.f index 1d4cab7d..63c02dd2 100644 --- a/src/ao_one_e_ints/pot_ao_ints.irp.f +++ b/src/ao_one_e_ints/pot_ao_ints.irp.f @@ -105,6 +105,21 @@ BEGIN_PROVIDER [ double precision, ao_integrals_n_e_imag, (ao_num,ao_num)] endif END_PROVIDER +BEGIN_PROVIDER [complex*16, ao_integrals_n_e_complex, (ao_num,ao_num)] + implicit none + BEGIN_DOC + ! Nucleus-electron interaction, in the |AO| basis set. + ! + ! :math:`\langle \chi_i | -\sum_A \frac{1}{|r-R_A|} | \chi_j \rangle` + END_DOC + integer :: i,j + do i=1,ao_num + do j=1,ao_num + ao_integrals_n_e_complex(j,i) = dcmplx(ao_integrals_n_e(j,i), & + ao_integrals_n_e_imag(j,i)) + enddo + enddo +END_PROVIDER BEGIN_PROVIDER [ double precision, ao_integrals_n_e_per_atom, (ao_num,ao_num,nucl_num)] BEGIN_DOC diff --git a/src/mo_one_e_ints/kin_mo_ints.irp.f b/src/mo_one_e_ints/kin_mo_ints.irp.f index 216628bb..d1a2f0cf 100644 --- a/src/mo_one_e_ints/kin_mo_ints.irp.f +++ b/src/mo_one_e_ints/kin_mo_ints.irp.f @@ -1,23 +1,57 @@ -BEGIN_PROVIDER [double precision, mo_kinetic_integrals, (mo_num,mo_num)] + BEGIN_PROVIDER [double precision, mo_kinetic_integrals, (mo_num,mo_num)] +&BEGIN_PROVIDER [double precision, mo_kinetic_integrals_imag, (mo_num,mo_num)] +&BEGIN_PROVIDER [complex*16, mo_kinetic_integrals_complex, (mo_num,mo_num)] implicit none BEGIN_DOC ! Kinetic energy integrals in the MO basis END_DOC - - if (read_mo_integrals_kinetic) then - call ezfio_get_mo_one_e_ints_mo_integrals_kinetic(mo_kinetic_integrals) - print *, 'MO kinetic integrals read from disk' + if (is_periodic) then + integer :: i,j + if (read_mo_integrals_kinetic) then + call ezfio_get_mo_one_e_ints_mo_integrals_kinetic(mo_kinetic_integrals) + call ezfio_get_mo_one_e_ints_mo_integrals_kinetic_imag(mo_kinetic_integrals_imag) + print *, 'MO kinetic integrals read from disk' + do i=1,mo_num + do j=1,mo_num + mo_kinetic_integrals_complex(j,i) = dcmplx(mo_kinetic_integrals(j,i), & + mo_kinetic_integrals_imag(j,i)) + enddo + enddo + else + call ao_to_mo_complex( & + ao_kinetic_integrals_complex, & + size(ao_kinetic_integrals_complex,1), & + mo_kinetic_integrals_complex, & + size(mo_kinetic_integrals_complex,1) & + ) + do i=1,mo_num + do j=1,mo_num + mo_kinetic_integrals(j,i)=dble(mo_kinetic_integrals_complex(j,i)) + mo_kinetic_integrals_imag(j,i)=dimag(mo_kinetic_integrals_complex(j,i)) + enddo + enddo + endif + if (write_mo_integrals_kinetic) then + call ezfio_set_mo_one_e_ints_mo_integrals_kinetic(mo_kinetic_integrals) + call ezfio_set_mo_one_e_ints_mo_integrals_kinetic_imag(mo_kinetic_integrals_imag) + print *, 'MO kinetic integrals written to disk' + endif else - call ao_to_mo( & - ao_kinetic_integrals, & - size(ao_kinetic_integrals,1), & - mo_kinetic_integrals, & - size(mo_kinetic_integrals,1) & - ) - endif - if (write_mo_integrals_kinetic) then - call ezfio_set_mo_one_e_ints_mo_integrals_kinetic(mo_kinetic_integrals) - print *, 'MO kinetic integrals written to disk' + if (read_mo_integrals_kinetic) then + call ezfio_get_mo_one_e_ints_mo_integrals_kinetic(mo_kinetic_integrals) + print *, 'MO kinetic integrals read from disk' + else + call ao_to_mo( & + ao_kinetic_integrals, & + size(ao_kinetic_integrals,1), & + mo_kinetic_integrals, & + size(mo_kinetic_integrals,1) & + ) + endif + if (write_mo_integrals_kinetic) then + call ezfio_set_mo_one_e_ints_mo_integrals_kinetic(mo_kinetic_integrals) + print *, 'MO kinetic integrals written to disk' + endif endif END_PROVIDER diff --git a/src/mo_one_e_ints/mo_one_e_ints.irp.f b/src/mo_one_e_ints/mo_one_e_ints.irp.f index ac4b4e3b..4db21e46 100644 --- a/src/mo_one_e_ints/mo_one_e_ints.irp.f +++ b/src/mo_one_e_ints/mo_one_e_ints.irp.f @@ -24,3 +24,46 @@ BEGIN_PROVIDER [ double precision, mo_one_e_integrals,(mo_num,mo_num)] ENDIF END_PROVIDER + +BEGIN_PROVIDER [ double precision, mo_one_e_integrals_imag,(mo_num,mo_num)] + implicit none + integer :: i,j,n,l + BEGIN_DOC + ! array of the one-electron Hamiltonian on the |MO| basis : + ! sum of the kinetic and nuclear electronic potentials (and pseudo potential if needed) + END_DOC + print*,'Providing the one-electron integrals' + + IF (read_mo_one_e_integrals) THEN + call ezfio_get_mo_one_e_ints_mo_one_e_integrals_imag(mo_one_e_integrals_imag) + ELSE + mo_one_e_integrals_imag = mo_integrals_n_e_imag + mo_kinetic_integrals_imag + + IF (DO_PSEUDO) THEN + mo_one_e_integrals_imag += mo_pseudo_integrals_imag + ENDIF + + ENDIF + + IF (write_mo_one_e_integrals) THEN + call ezfio_set_mo_one_e_ints_mo_one_e_integrals_imag(mo_one_e_integrals_imag) + print *, 'MO one-e integrals written to disk' + ENDIF + +END_PROVIDER + +BEGIN_PROVIDER [ complex*16, mo_one_e_integrals_complex,(mo_num,mo_num)] + implicit none + integer :: i,j,n,l + BEGIN_DOC + ! One-electron Hamiltonian in the |AO| basis. + END_DOC + + do i=1,mo_num + do j=1,mo_num + mo_one_e_integrals_complex(j,i)=dcmplx(mo_one_e_integrals(j,i), & + mo_one_e_integrals_imag(j,i)) + enddo + enddo + +END_PROVIDER diff --git a/src/mo_one_e_ints/pot_mo_ints.irp.f b/src/mo_one_e_ints/pot_mo_ints.irp.f index 90f7b06c..69ba26bc 100644 --- a/src/mo_one_e_ints/pot_mo_ints.irp.f +++ b/src/mo_one_e_ints/pot_mo_ints.irp.f @@ -1,23 +1,58 @@ -BEGIN_PROVIDER [double precision, mo_integrals_n_e, (mo_num,mo_num)] + BEGIN_PROVIDER [double precision, mo_integrals_n_e, (mo_num,mo_num)] +&BEGIN_PROVIDER [double precision, mo_integrals_n_e_imag, (mo_num,mo_num)] +&BEGIN_PROVIDER [complex*16, mo_integrals_n_e_complex, (mo_num,mo_num)] implicit none BEGIN_DOC ! Nucleus-electron interaction on the |MO| basis END_DOC - if (read_mo_integrals_e_n) then - call ezfio_get_mo_one_e_ints_mo_integrals_e_n(mo_integrals_n_e) - print *, 'MO N-e integrals read from disk' + if (is_periodic) then + integer :: i,j + if (read_mo_integrals_e_n) then + call ezfio_get_mo_one_e_ints_mo_integrals_e_n(mo_integrals_n_e) + call ezfio_get_mo_one_e_ints_mo_integrals_e_n_imag(mo_integrals_n_e_imag) + print *, 'MO N-e integrals read from disk' + do i=1,mo_num + do j=1,mo_num + mo_integrals_n_e_complex(j,i) = dcmplx(mo_integrals_n_e(j,i), & + mo_integrals_n_e_imag(j,i)) + enddo + enddo + else + call ao_to_mo_complex( & + ao_integrals_n_e_complex, & + size(ao_integrals_n_e_complex,1), & + mo_integrals_n_e_complex, & + size(mo_integrals_n_e_complex,1) & + ) + do i=1,mo_num + do j=1,mo_num + mo_integrals_n_e(j,i)=dble(mo_integrals_n_e_complex(j,i)) + mo_integrals_n_e_imag(j,i)=dimag(mo_integrals_n_e_complex(j,i)) + enddo + enddo + endif + if (write_mo_integrals_e_n) then + call ezfio_set_mo_one_e_ints_mo_integrals_e_n(mo_integrals_n_e) + call ezfio_set_mo_one_e_ints_mo_integrals_e_n_imag(mo_integrals_n_e_imag) + print *, 'MO N-e integrals written to disk' + endif else - call ao_to_mo( & - ao_integrals_n_e, & - size(ao_integrals_n_e,1), & - mo_integrals_n_e, & - size(mo_integrals_n_e,1) & - ) - endif - if (write_mo_integrals_e_n) then - call ezfio_set_mo_one_e_ints_mo_integrals_e_n(mo_integrals_n_e) - print *, 'MO N-e integrals written to disk' + if (read_mo_integrals_e_n) then + call ezfio_get_mo_one_e_ints_mo_integrals_e_n(mo_integrals_n_e) + print *, 'MO N-e integrals read from disk' + else + call ao_to_mo( & + ao_integrals_n_e, & + size(ao_integrals_n_e,1), & + mo_integrals_n_e, & + size(mo_integrals_n_e,1) & + ) + endif + if (write_mo_integrals_e_n) then + call ezfio_set_mo_one_e_ints_mo_integrals_e_n(mo_integrals_n_e) + print *, 'MO N-e integrals written to disk' + endif endif END_PROVIDER diff --git a/src/mo_one_e_ints/pot_mo_pseudo_ints.irp.f b/src/mo_one_e_ints/pot_mo_pseudo_ints.irp.f index 179b33ed..3c4674dc 100644 --- a/src/mo_one_e_ints/pot_mo_pseudo_ints.irp.f +++ b/src/mo_one_e_ints/pot_mo_pseudo_ints.irp.f @@ -1,26 +1,65 @@ -BEGIN_PROVIDER [double precision, mo_pseudo_integrals, (mo_num,mo_num)] + BEGIN_PROVIDER [double precision, mo_pseudo_integrals, (mo_num,mo_num)] +&BEGIN_PROVIDER [double precision, mo_pseudo_integrals_imag, (mo_num,mo_num)] +&BEGIN_PROVIDER [complex*16, mo_pseudo_integrals_complex, (mo_num,mo_num)] implicit none BEGIN_DOC ! Pseudopotential integrals in |MO| basis END_DOC - if (read_mo_integrals_pseudo) then - call ezfio_get_mo_one_e_ints_mo_integrals_pseudo(mo_pseudo_integrals) - print *, 'MO pseudopotential integrals read from disk' - else if (do_pseudo) then - call ao_to_mo( & - ao_pseudo_integrals, & - size(ao_pseudo_integrals,1), & - mo_pseudo_integrals, & - size(mo_pseudo_integrals,1) & - ) - else + if (is_periodic) then + integer :: i,j + if (read_mo_integrals_pseudo) then + call ezfio_get_mo_one_e_ints_mo_integrals_pseudo(mo_pseudo_integrals) + call ezfio_get_mo_one_e_ints_mo_integrals_pseudo_imag(mo_pseudo_integrals_imag) + print *, 'MO pseudopotential integrals read from disk' + do i=1,mo_num + do j=1,mo_num + mo_pseudo_integrals_complex(j,i) = dcmplx(mo_pseudo_integrals(j,i), & + mo_pseudo_integrals_imag(j,i)) + enddo + enddo + else if (do_pseudo) then + call ao_to_mo_complex( & + ao_pseudo_integrals_complex, & + size(ao_pseudo_integrals_complex,1), & + mo_pseudo_integrals_complex, & + size(mo_pseudo_integrals_complex,1) & + ) + do i=1,mo_num + do j=1,mo_num + mo_pseudo_integrals(j,i)=dble(mo_pseudo_integrals_complex(j,i)) + mo_pseudo_integrals_imag(j,i)=dimag(mo_pseudo_integrals_complex(j,i)) + enddo + enddo + else mo_pseudo_integrals = 0.d0 - endif + mo_pseudo_integrals_imag = 0.d0 + mo_pseudo_integrals_complex = (0.d0,0.d0) + endif + if (write_mo_integrals_pseudo) then + call ezfio_set_mo_one_e_ints_mo_integrals_pseudo(mo_pseudo_integrals) + call ezfio_set_mo_one_e_ints_mo_integrals_pseudo_imag(mo_pseudo_integrals_imag) + print *, 'MO pseudopotential integrals written to disk' + endif + else + if (read_mo_integrals_pseudo) then + call ezfio_get_mo_one_e_ints_mo_integrals_pseudo(mo_pseudo_integrals) + print *, 'MO pseudopotential integrals read from disk' + else if (do_pseudo) then + call ao_to_mo( & + ao_pseudo_integrals, & + size(ao_pseudo_integrals,1), & + mo_pseudo_integrals, & + size(mo_pseudo_integrals,1) & + ) + else + mo_pseudo_integrals = 0.d0 + endif - if (write_mo_integrals_pseudo) then - call ezfio_set_mo_one_e_ints_mo_integrals_pseudo(mo_pseudo_integrals) - print *, 'MO pseudopotential integrals written to disk' + if (write_mo_integrals_pseudo) then + call ezfio_set_mo_one_e_ints_mo_integrals_pseudo(mo_pseudo_integrals) + print *, 'MO pseudopotential integrals written to disk' + endif endif END_PROVIDER