qmcchem/src/ZMQ/qmc.irp.f

198 lines
4.8 KiB
Fortran

subroutine main_qmc
use f77_zmq
implicit none
is_worker = .True.
SOFT_TOUCH is_worker
call start_main_qmc()
end
subroutine start_main_qmc
use f77_zmq
implicit none
integer(ZMQ_PTR) :: msg
integer :: rc, v
integer*8 :: cpu0, count_rate, count_max
! Initialization
! --------------
call system_clock(cpu0, count_rate, count_max)
msg = f77_zmq_msg_new()
call zmq_register_worker(msg)
! One equilibration block
! -----------------------
call equilibration
! Run the QMC blocks
! ------------------
call run_qmc(cpu0)
! Clean exit
! ----------
call zmq_unregister_worker(msg)
rc = f77_zmq_msg_destroy(msg)
v = 0
rc = f77_zmq_setsockopt(zmq_socket_push,ZMQ_LINGER,v,4)
rc = f77_zmq_setsockopt(zmq_socket_running,ZMQ_LINGER,v,4)
rc = f77_zmq_setsockopt(zmq_to_dataserver_socket,ZMQ_LINGER,v,4)
rc = f77_zmq_close(zmq_socket_push)
rc = f77_zmq_close(zmq_socket_running)
rc = f77_zmq_close(zmq_to_dataserver_socket)
! rc = f77_zmq_ctx_destroy(zmq_context)
end
subroutine equilibration
PROVIDE E_loc_block_walk
end
subroutine run_qmc(cpu0)
use f77_zmq
implicit none
include '../types.F'
integer*8 :: cpu0
integer :: isize, i, j, ierr
double precision :: min, max
real :: value
integer(ZMQ_PTR) :: msg
integer :: do_run, rc
integer :: block_id
integer*8 :: cpu1, count_rate, count_max
PROVIDE elec_num
msg = f77_zmq_msg_new()
call get_running(do_run)
block_id = 0
do while (do_run == t_Running)
block_id += 1
call accep_reset
TOUCH elec_coord
PROVIDE block_weight E_loc_block_walk
! Start by sending accept rate
real, external :: accep_rate
call zmq_send_header(msg,'accep',block_id)
value = accep_rate()
call zmq_send_real(msg, value, 1)
double precision :: v0, v1, v2, h
double precision :: d1v,d2v,d1e,d2e
if (save_data) then
call zmq_send_header(msg,'elec_coord',block_id)
call zmq_send_real(msg,elec_coord_full,size(elec_coord_full))
endif
BEGIN_SHELL [ /usr/bin/env python2 ]
from properties import *
derivlist = []
td = """
do j=0,size($X_block_walk,1)-1,7
if ($X_block_walk(j+Pos_weight) == 0.d0) then
$X_block_walk(j+1) = 0.d0
$X_block_walk(j+2) = 0.d0
$X_block_walk(j+3) = 0.d0
$X_block_walk(j+4) = 0.d0
$X_block_walk(j+5) = 0.d0
$X_block_walk(j+6) = 0.d0
$X_block_walk(j+7) = 0.d0
cycle
endif
$X_block_walk(j+Pos_E_loc) = &
$X_block_walk(j+Pos_E_loc) / $X_block_walk(j+Pos_weight)
$X_block_walk(j+Pos_E_loc_2) = &
$X_block_walk(j+Pos_E_loc_2) / $X_block_walk(j+Pos_weight)
$X_block_walk(j+Neg_E_loc) = &
$X_block_walk(j+Neg_E_loc) / $X_block_walk(j+Neg_weight)
$X_block_walk(j+Neg_E_loc_2) = &
$X_block_walk(j+Neg_E_loc_2) / $X_block_walk(j+Neg_weight)
h = $X_block_walk(j+Delta)
v0 = E_loc_block_walk
v1 = $X_block_walk(j+Pos_E_loc)
v2 = $X_block_walk(j+Neg_E_loc)
d1e = 0.5d0*(v1-v2)/h
d2e = (v1+v2-v0-v0)/(h*h)
v0 = dabs(E_loc_2_block_walk - v0*v0)
v1 = dabs($X_block_walk(j+Pos_E_loc_2) - $X_block_walk(j+Pos_E_loc)**2)
v2 = dabs($X_block_walk(j+Neg_E_loc_2) - $X_block_walk(j+Neg_E_loc)**2)
d1v = 0.5d0*(v1-v2)/h
d2v = (v1+v2-v0-v0)/(h*h)
$X_block_walk(j+1) = d1e
$X_block_walk(j+2) = d2e
$X_block_walk(j+3) = d1v
$X_block_walk(j+4) = d2v
$X_block_walk(j+5) = 0.d0
$X_block_walk(j+6) = 0.d0
$X_block_walk(j+7) = 0.d0
enddo
"""
for p in properties:
t = """
if (calc_$X) then
"""
if p[2] == "":
t += """
call zmq_send_header(msg,'$X',block_id)
call zmq_send_scalar_prop(msg,block_weight,$X_block_walk)
$X_2_block_walk = dabs($X_2_block_walk - $X_block_walk*$X_block_walk)
call zmq_send_header(msg,'$X_qmcvar',block_id)
call zmq_send_scalar_prop(msg,block_weight,$X_2_block_walk)
"""
else:
if p[1] in derivlist:
t+= td
t += """
isize = size($X_block_walk)
call zmq_send_header(msg,'$X',block_id)
call zmq_send_array_prop(msg,block_weight,$X_block_walk,isize)
"""
t += """
! TODO : Min and Max are commented here
! call zmq_send_header(msg,'$X_min',block_id)
! call zmq_send_real(msg,$X_min)
! call zmq_send_header(msg,'$X_max',block_id)
! call zmq_send_real(msg,block_weight,$X_max)
endif
"""
print t.replace("$X",p[1])
END_SHELL
! Finish by sending CPU time
call system_clock(cpu1, count_rate, count_max)
value = real(cpu1-cpu0)/real(count_rate)
call zmq_send_header(msg,'cpu',block_id)
call zmq_send_real(msg, value, 1)
call get_running(do_run)
cpu0 = cpu1
enddo
99 continue
!
end