10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-11-04 05:03:54 +01:00

Started to introduce coarray Fortran in integrals

This commit is contained in:
Anthony Scemama 2014-07-10 02:33:46 +02:00
parent 762fbd41cc
commit 7fed44c5ad
5 changed files with 94 additions and 0 deletions

View File

@ -253,6 +253,11 @@ BEGIN_PROVIDER [ logical, ao_bielec_integrals_in_map ]
!$OMP DO SCHEDULE(dynamic) !$OMP DO SCHEDULE(dynamic)
do kk=1,lmax do kk=1,lmax
IRP_IF COARRAY
if (mod(kk-this_image(),num_images()) /= 0) then
cycle
endif
IRP_ENDIF
if (abort_here) then if (abort_here) then
cycle cycle
endif endif
@ -316,6 +321,10 @@ BEGIN_PROVIDER [ logical, ao_bielec_integrals_in_map ]
if (abort_here) then if (abort_here) then
stop 'Aborting in AO integrals calculation' stop 'Aborting in AO integrals calculation'
endif endif
IRP_IF COARRAY
write(output_BiInts,*) 'Communicating the map'
call communicate_ao_integrals()
IRP_ENDIF COARRAY
write(output_BiInts,*) 'Sorting the map' write(output_BiInts,*) 'Sorting the map'
call map_sort(ao_integrals_map) call map_sort(ao_integrals_map)
call cpu_time(cpu_2) call cpu_time(cpu_2)

View File

@ -321,6 +321,63 @@ subroutine dump_$ao_integrals(filename)
end end
IRP_IF COARRAY
subroutine communicate_$ao_integrals()
use map_module
implicit none
BEGIN_DOC
! Communicate the $ao integrals with co-array
END_DOC
integer(cache_key_kind), pointer :: key(:)
real(integral_kind), pointer :: val(:)
integer*8 :: i,j, k, nmax
integer*8, save :: n[*]
integer :: copy_n
real(integral_kind), allocatable :: buffer_val(:)[:]
integer(cache_key_kind), allocatable :: buffer_key(:)[:]
real(integral_kind), allocatable :: copy_val(:)
integer*8, allocatable :: copy_key(:)
n = 0_8
do i=0_8,$ao_integrals_map%map_size
n = max(n,$ao_integrals_map%map(i)%n_elements)
enddo
sync all
nmax = 0_8
do j=1,num_images()
nmax = max(nmax,n[j])
enddo
allocate( buffer_key(nmax)[*], buffer_val(nmax)[*])
allocate( copy_key(nmax), copy_val(nmax))
do i=0_8,$ao_integrals_map%map_size
key => $ao_integrals_map%map(i)%key
val => $ao_integrals_map%map(i)%value
n = $ao_integrals_map%map(i)%n_elements
do j=1,n
buffer_key(j) = key(j)
buffer_val(j) = val(j)
enddo
sync all
do j=1,num_images()
if (j /= this_image()) then
copy_n = n[j]
do k=1,copy_n
copy_val(k) = buffer_val(k)[j]
copy_key(k) = buffer_key(k)[j]
copy_key(k) = copy_key(k)+ishft(i,-map_shift)
enddo
! call map_update($ao_integrals_map, copy_key, copy_val, copy_n, 0.d0)
call map_append($ao_integrals_map, copy_key, copy_val, copy_n )
endif
enddo
sync all
enddo
deallocate( buffer_key, buffer_val, copy_val, copy_key)
end
IRP_ENDIF
integer function load_$ao_integrals(filename) integer function load_$ao_integrals(filename)
implicit none implicit none

View File

@ -111,6 +111,11 @@ subroutine add_integrals_to_map(mask_ijkl)
!$ thread_num = omp_get_thread_num() !$ thread_num = omp_get_thread_num()
!$OMP DO SCHEDULE(guided) !$OMP DO SCHEDULE(guided)
do l1 = 1,ao_num do l1 = 1,ao_num
IRP_IF COARRAY
if (mod(l1-this_image(),num_images()) /= 0 ) then
cycle
endif
IRP_ENDIF
if (abort_here) then if (abort_here) then
cycle cycle
endif endif
@ -275,6 +280,10 @@ subroutine add_integrals_to_map(mask_ijkl)
if (abort_here) then if (abort_here) then
stop 'Aborting in MO integrals calculation' stop 'Aborting in MO integrals calculation'
endif endif
IRP_IF COARRAY
write(output_BiInts,*) 'Communicating the map'
call communicate_mo_integrals()
IRP_ENDIF
call map_unique(mo_integrals_map) call map_unique(mo_integrals_map)
call wall_time(wall_2) call wall_time(wall_2)

View File

@ -22,7 +22,15 @@ BEGIN_SHELL [ /bin/bash ]
PROVIDE output_wall_time_0 output_cpu_time_0 PROVIDE output_wall_time_0 output_cpu_time_0
integer :: getUnitAndOpen integer :: getUnitAndOpen
call ezfio_set_output_empty(.False.) call ezfio_set_output_empty(.False.)
IRP_IF COARRAY
if (this_image() == 1) then
output_$NAME = getUnitAndOpen(trim(ezfio_filename)//'/output/'//'$NAME.rst','a') output_$NAME = getUnitAndOpen(trim(ezfio_filename)//'/output/'//'$NAME.rst','a')
else
output_$NAME = getUnitAndOpen('/dev/null','w')
endif
IRP_ELSE
output_$NAME = getUnitAndOpen(trim(ezfio_filename)//'/output/'//'$NAME.rst','a')
IRP_ENDIF
write(output_$NAME,'(A)') & write(output_$NAME,'(A)') &
'--------------------------------------------------------------------------------' '--------------------------------------------------------------------------------'
END_PROVIDER END_PROVIDER

View File

@ -48,3 +48,14 @@ BEGIN_PROVIDER [ double precision, select_max, (1) ]
END_DOC END_DOC
select_max(1) = huge(1.d0) select_max(1) = huge(1.d0)
END_PROVIDER END_PROVIDER
BEGIN_PROVIDER [ integer, size_select_max ]
implicit none
BEGIN_DOC
! Size of select_max
END_DOC
size_select_max = 1
END_PROVIDER