mirror of
https://github.com/LCPQ/quantum_package
synced 2024-08-31 16:43:42 +02:00
100 lines
3.2 KiB
Fortran
100 lines
3.2 KiB
Fortran
|
subroutine ao_bielec_integrals_in_map_slave
|
||
|
use map_module
|
||
|
use f77_zmq
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Computes a buffer of integrals
|
||
|
END_DOC
|
||
|
|
||
|
integer :: j,l,n_integrals
|
||
|
integer :: rc
|
||
|
character*(8), external :: zmq_port
|
||
|
integer(ZMQ_PTR) :: zmq_socket_req_inproc, zmq_socket_push_inproc
|
||
|
real(integral_kind), allocatable :: buffer_value(:)
|
||
|
integer(key_kind), allocatable :: buffer_i(:)
|
||
|
|
||
|
allocate ( buffer_i(ao_num*ao_num), buffer_value(ao_num*ao_num) )
|
||
|
|
||
|
! Sockets
|
||
|
zmq_socket_req_inproc = f77_zmq_socket(zmq_context, ZMQ_REQ)
|
||
|
rc = f77_zmq_connect(zmq_socket_req_inproc, 'inproc://req_rep')
|
||
|
if (rc /= 0) then
|
||
|
stop 'Unable to connect zmq_socket_req_inproc'
|
||
|
endif
|
||
|
|
||
|
zmq_socket_push_inproc = f77_zmq_socket(zmq_context, ZMQ_PUSH)
|
||
|
rc = f77_zmq_connect(zmq_socket_push_inproc, 'inproc://push_pull')
|
||
|
if (rc /= 0) then
|
||
|
stop 'Unable to connect zmq_socket_push_inproc'
|
||
|
endif
|
||
|
|
||
|
|
||
|
|
||
|
rc = f77_zmq_send( zmq_socket_req_inproc, 'get_ao_integrals', 16, 0)
|
||
|
rc = f77_zmq_recv( zmq_socket_req_inproc, l, 4, 0)
|
||
|
|
||
|
do while (l > 0)
|
||
|
rc = f77_zmq_send( zmq_socket_req_inproc, 'get_ao_integrals', 16, 0)
|
||
|
|
||
|
do j = 1, l
|
||
|
if (ao_overlap_abs(j,l) < ao_integrals_threshold) then
|
||
|
cycle
|
||
|
endif
|
||
|
call compute_ao_integrals_jl(j,l,n_integrals,buffer_i,buffer_value)
|
||
|
rc = f77_zmq_send( zmq_socket_push_inproc, n_integrals, 4, ZMQ_SNDMORE)
|
||
|
rc = f77_zmq_send( zmq_socket_push_inproc, buffer_i, key_kind*n_integrals, ZMQ_SNDMORE)
|
||
|
rc = f77_zmq_send( zmq_socket_push_inproc, buffer_value, integral_kind*n_integrals, 0)
|
||
|
enddo
|
||
|
rc = f77_zmq_recv( zmq_socket_req_inproc, l, 4, 0)
|
||
|
enddo
|
||
|
|
||
|
deallocate( buffer_i, buffer_value )
|
||
|
|
||
|
rc = f77_zmq_disconnect(zmq_socket_req_inproc, 'inproc://req_rep')
|
||
|
end
|
||
|
|
||
|
|
||
|
subroutine ao_bielec_integrals_in_map_collector
|
||
|
use map_module
|
||
|
use f77_zmq
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Collects results from the AO integral calculation
|
||
|
END_DOC
|
||
|
|
||
|
integer :: j,l,n_integrals
|
||
|
integer :: rc
|
||
|
character*(8), external :: zmq_port
|
||
|
integer(ZMQ_PTR) :: zmq_socket_pull_inproc
|
||
|
real(integral_kind), allocatable :: buffer_value(:)
|
||
|
integer(key_kind), allocatable :: buffer_i(:)
|
||
|
|
||
|
allocate ( buffer_i(ao_num*ao_num), buffer_value(ao_num*ao_num) )
|
||
|
|
||
|
zmq_socket_pull_inproc = f77_zmq_socket(zmq_context, ZMQ_PULL)
|
||
|
rc = f77_zmq_bind(zmq_socket_pull_inproc, 'inproc://push_pull')
|
||
|
if (rc /= 0) then
|
||
|
stop 'Unable to connect zmq_socket_pull_inproc'
|
||
|
endif
|
||
|
|
||
|
n_integrals = 0
|
||
|
do while (n_integrals >= 0)
|
||
|
|
||
|
rc = f77_zmq_recv( zmq_socket_pull_inproc, n_integrals, 4, 0)
|
||
|
if (n_integrals > -1) then
|
||
|
rc = f77_zmq_recv( zmq_socket_pull_inproc, buffer_i, key_kind*n_integrals, 0)
|
||
|
rc = f77_zmq_recv( zmq_socket_pull_inproc, buffer_value, integral_kind*n_integrals, 0)
|
||
|
call insert_into_ao_integrals_map(n_integrals,buffer_i,buffer_value)
|
||
|
else
|
||
|
rc = f77_zmq_recv( zmq_socket_pull_inproc, buffer_i, key_kind, 0)
|
||
|
rc = f77_zmq_recv( zmq_socket_pull_inproc, buffer_value, integral_kind, 0)
|
||
|
endif
|
||
|
|
||
|
enddo
|
||
|
|
||
|
rc = f77_zmq_unbind(zmq_socket_pull_inproc, 'inproc://push_pull')
|
||
|
|
||
|
deallocate( buffer_i, buffer_value )
|
||
|
end
|
||
|
|