10
0
mirror of https://github.com/QuantumPackage/qp2.git synced 2024-12-23 21:03:49 +01:00

working on mo 2e int framework

This commit is contained in:
Kevin Gasperich 2020-02-05 14:21:28 -06:00
parent 91a86c3b2f
commit f35c8f4f4c
3 changed files with 94 additions and 2 deletions

View File

@ -25,3 +25,33 @@
END_PROVIDER END_PROVIDER
BEGIN_PROVIDER [complex*16, big_array_coulomb_integrals_periodic, (mo_num,mo_num, mo_num)]
&BEGIN_PROVIDER [complex*16, big_array_exchange_integrals_periodic,(mo_num,mo_num, mo_num)]
implicit none
BEGIN_DOC
! big_array_coulomb_integrals(j,i,k) = <ij|kj> = (ik|jj)
! big_array_exchange_integrals(j,i,k) = <ij|jk> = (ij|jk)
! for both of these, i and k must be from same kpt for integral to be nonzero
! TODO: only loop over half, and assign two elements:
! b_a_coul_int(j,i,k) = b_a_coul_int(j,k,i)*
! b_a_exch_int(j,i,k) = b_a_exch_int(j,k,i)*
END_DOC
integer :: i,j,k,l
complex*16 :: get_two_e_integral_periodic
complex*16 :: integral
do k = 1, mo_num
do i = 1, mo_num
do j = 1, mo_num
l = j
integral = get_two_e_integral_periodic(i,j,k,l,mo_integrals_map,mo_integrals_map_2)
big_array_coulomb_integrals(j,i,k) = integral
l = j
integral = get_two_e_integral_periodic(i,j,l,k,mo_integrals_map,mo_integrals_map_2)
big_array_exchange_integrals(j,i,k) = integral
enddo
enddo
enddo
END_PROVIDER

View File

@ -28,9 +28,60 @@ BEGIN_PROVIDER [ logical, mo_two_e_integrals_in_map ]
integer(bit_kind) :: mask_ijkl(N_int,4) integer(bit_kind) :: mask_ijkl(N_int,4)
integer(bit_kind) :: mask_ijk(N_int,3) integer(bit_kind) :: mask_ijk(N_int,3)
double precision :: cpu_1, cpu_2, wall_1, wall_2 double precision :: cpu_1, cpu_2, wall_1, wall_2
integer*8 :: get_mo_map_size, mo_map_size
double precision, external :: map_mb
PROVIDE mo_class PROVIDE mo_class
if (is_periodic) then
mo_two_e_integrals_in_map = .True.
if (read_mo_two_e_integrals) then
print*,'Reading the MO integrals'
call map_load_from_disk(trim(ezfio_filename)//'/work/mo_ints_periodic_1',mo_integrals_map)
call map_load_from_disk(trim(ezfio_filename)//'/work/mo_ints_periodic_2',mo_integrals_map_2)
print*, 'MO integrals provided (periodic)'
return
else
PROVIDE ao_two_e_integrals_in_map
endif
print *, ''
print *, 'AO -> MO integrals transformation (periodic)'
print *, '---------------------------------'
print *, ''
call wall_time(wall_1)
call cpu_time(cpu_1)
if(no_vvvv_integrals)then
print*,'not implemented for periodic',irp_here
stop -1
call four_idx_novvvv_periodic
else
print*,'not implemented for periodic',irp_here
stop -1
call add_integrals_to_map_periodic(full_ijkl_bitmask_4)
endif
call wall_time(wall_2)
call cpu_time(cpu_2)
mo_map_size = get_mo_map_size()
print*,'Molecular integrals provided:'
print*,' Size of MO map 1 ', map_mb(mo_integrals_map) ,'MB'
print*,' Size of MO map 2 ', map_mb(mo_integrals_map_2) ,'MB'
print*,' Number of MO integrals: ', mo_map_size
print*,' cpu time :',cpu_2 - cpu_1, 's'
print*,' wall time :',wall_2 - wall_1, 's ( x ', (cpu_2-cpu_1)/(wall_2-wall_1), ')'
if (write_mo_two_e_integrals.and.mpi_master) then
call ezfio_set_work_empty(.False.)
call map_save_to_disk(trim(ezfio_filename)//'/work/mo_ints_periodic_1',mo_integrals_map)
call map_save_to_disk(trim(ezfio_filename)//'/work/mo_ints_periodic_2',mo_integrals_map_2)
call ezfio_set_mo_two_e_ints_io_mo_two_e_integrals('Read')
endif
else
mo_two_e_integrals_in_map = .True. mo_two_e_integrals_in_map = .True.
if (read_mo_two_e_integrals) then if (read_mo_two_e_integrals) then
print*,'Reading the MO integrals' print*,'Reading the MO integrals'
@ -58,10 +109,8 @@ BEGIN_PROVIDER [ logical, mo_two_e_integrals_in_map ]
call wall_time(wall_2) call wall_time(wall_2)
call cpu_time(cpu_2) call cpu_time(cpu_2)
integer*8 :: get_mo_map_size, mo_map_size
mo_map_size = get_mo_map_size() mo_map_size = get_mo_map_size()
double precision, external :: map_mb
print*,'Molecular integrals provided:' print*,'Molecular integrals provided:'
print*,' Size of MO map ', map_mb(mo_integrals_map) ,'MB' print*,' Size of MO map ', map_mb(mo_integrals_map) ,'MB'
print*,' Number of MO integrals: ', mo_map_size print*,' Number of MO integrals: ', mo_map_size
@ -73,6 +122,7 @@ BEGIN_PROVIDER [ logical, mo_two_e_integrals_in_map ]
call map_save_to_disk(trim(ezfio_filename)//'/work/mo_ints',mo_integrals_map) call map_save_to_disk(trim(ezfio_filename)//'/work/mo_ints',mo_integrals_map)
call ezfio_set_mo_two_e_ints_io_mo_two_e_integrals('Read') call ezfio_set_mo_two_e_ints_io_mo_two_e_integrals('Read')
endif endif
endif
END_PROVIDER END_PROVIDER

View File

@ -54,6 +54,18 @@ mo_two_e_ints
incomplete incomplete
NOTES:
number of unique 4-tuples with 8-fold symmetry is a8(n)=n*(n+1)*(n^2+n+2)/8
number of unique 4-tuples with 4-fold symmetry is a4(n)=n^2*(n^2+3)/4
a8 is number of unique real 2e ints with n mos
a4 is number of unique* complex 2e ints with n mos (where p+i*q and p-i*q are counted as one, not two)
a4(n) = a8(n) + a8(n-1)
we can already generate the list of <ij|kl> with unique values for the 8-fold case
the set of these for 4-fold symmetry is the union of the 8-fold set for n and the 8-fold set for n-1 with a simple transformation
<ij|kl>_{4,n} = <ij|kl>_{8,n} + <(k+1)j|i(l+1)>_{8,n-1}
############################ ############################