mirror of
https://github.com/LCPQ/quantum_package
synced 2025-01-03 10:05:57 +01:00
Removed all libint stuff
This commit is contained in:
commit
61daec6ee6
21
configure
vendored
21
configure
vendored
@ -77,9 +77,7 @@ d_dependency = {
|
||||
"ninja": ["g++", "python"],
|
||||
"make": [],
|
||||
"p_graphviz": ["python"],
|
||||
"bats": [],
|
||||
"eigen": [],
|
||||
"libint": ["eigen"]
|
||||
"bats": []
|
||||
}
|
||||
|
||||
from collections import namedtuple
|
||||
@ -155,32 +153,23 @@ f77zmq = Info(
|
||||
# join(QP_ROOT, "src", "ZMQ", "f77zmq.h") )
|
||||
|
||||
p_graphviz = Info(
|
||||
url='{head}/xflr6/graphviz/{tail}'.format(**path_github),
|
||||
url='https://github.com/xflr6/graphviz/archive/master.tar.gz',
|
||||
description=' Python library for graphviz',
|
||||
default_path=join(QP_ROOT_INSTALL, "p_graphviz"))
|
||||
|
||||
bats = Info(
|
||||
url='{head}/sstephenson/bats/{tail}'.format(**path_github),
|
||||
url='https://github.com/sstephenson/bats/archive/master.tar.gz',
|
||||
description=' Bash Automated Testing System',
|
||||
default_path=join(QP_ROOT_INSTALL, "bats"))
|
||||
|
||||
libint = Info(
|
||||
url='{head}/evaleev/libint/releases/download/v2.1.0-beta2/libint-2.1.0-beta2.tgz'.format(**path_github),
|
||||
description=' Libint is a high-performance library for computing Gaussian integrals in quantum mechanics',
|
||||
default_path=join(QP_ROOT_INSTALL, "libint"))
|
||||
|
||||
eigen = Info(
|
||||
url='http://bitbucket.org/eigen/eigen/get/3.2.8.tar.gz',
|
||||
description=' Eigen is a C++ template library for linear algebra.',
|
||||
default_path=join(QP_ROOT_INSTALL, "eigen"))
|
||||
|
||||
d_info = dict()
|
||||
|
||||
for m in ["ocaml", "m4", "curl", "zlib", "patch", "irpf90", "docopt",
|
||||
"resultsFile", "ninja", "emsl", "ezfio", "p_graphviz",
|
||||
"zeromq", "f77zmq","bats","libint","eigen"]:
|
||||
"zeromq", "f77zmq","bats"]:
|
||||
exec ("d_info['{0}']={0}".format(m))
|
||||
|
||||
|
||||
def find_path(bin_, l_installed, var_for_qp_root=False):
|
||||
"""Use the global variable
|
||||
* l_installed
|
||||
|
@ -1,10 +0,0 @@
|
||||
#!/bin/bash -x
|
||||
|
||||
TARGET=eigen
|
||||
|
||||
function _install()
|
||||
{
|
||||
cp -R ${BUILD} . || exit 1
|
||||
}
|
||||
|
||||
source scripts/build.sh
|
@ -1,33 +0,0 @@
|
||||
#!/bin/bash -x
|
||||
|
||||
TARGET=libint
|
||||
|
||||
function _install()
|
||||
{
|
||||
|
||||
cd ..
|
||||
QP_ROOT=$PWD
|
||||
cd -
|
||||
|
||||
cp -R ${BUILD} . || exit 1
|
||||
|
||||
cd ${TARGET}
|
||||
export CXX="g++"
|
||||
export CXXFLAGS=" -O3 -std=c++0x"
|
||||
./configure --with-cxx-optflags
|
||||
make -j 8
|
||||
cd -
|
||||
g++ -O2 -std=c++0x -DHAVE_CONFIG_H -I${PWD}/${TARGET}/include -I${QP_ROOT}/install/eigen -DPREP_LIBINT2_SKIP_BOOST -L${PWD}/${TARGET}/lib -lint2 -c ${QP_ROOT}/src/Integrals_Bielec/integral_bielec.cc
|
||||
|
||||
mv integral_bielec.o ${QP_ROOT}/src/Integrals_Bielec/
|
||||
}
|
||||
|
||||
BUILD=_build/${TARGET}
|
||||
rm -rf -- ${BUILD}
|
||||
mkdir ${BUILD} || exit 1
|
||||
tar -zxf Downloads/${TARGET}.tgz --strip-components=1 --directory=${BUILD} || exit 1
|
||||
_install || exit 1
|
||||
rm -rf -- ${BUILD} _build/${TARGET}.log
|
||||
exit 0
|
||||
|
||||
|
@ -1,85 +0,0 @@
|
||||
open Core.Std
|
||||
open Qptypes
|
||||
|
||||
let molecule = lazy (
|
||||
let atom_list =
|
||||
match Input.Nuclei.read () with
|
||||
| Some data -> Input.Nuclei.to_atom_list data
|
||||
| None -> failwith "No coordinate found"
|
||||
and data =
|
||||
match Input.Electrons.read () with
|
||||
| Some data -> data
|
||||
| None -> failwith "No electrons found"
|
||||
in
|
||||
{ Molecule.nuclei = atom_list;
|
||||
Molecule.elec_alpha = data.Input.Electrons.elec_alpha_num;
|
||||
Molecule.elec_beta = data.Input.Electrons.elec_beta_num
|
||||
}
|
||||
)
|
||||
|
||||
let write_xyz_file libint_dir =
|
||||
assert (Sys.is_directory_exn libint_dir);
|
||||
let filename =
|
||||
Filename.concat libint_dir "xyz"
|
||||
and molecule =
|
||||
Lazy.force molecule
|
||||
in
|
||||
Out_channel.with_file filename ~f:(fun oc ->
|
||||
Molecule.to_xyz molecule
|
||||
|> Out_channel.output_string oc
|
||||
)
|
||||
|
||||
let write_basis_file libint_dir =
|
||||
assert (Sys.is_directory_exn libint_dir);
|
||||
let filename =
|
||||
Filename.concat libint_dir "basis.g94"
|
||||
and molecule =
|
||||
Lazy.force molecule
|
||||
in
|
||||
let text =
|
||||
let rec substitute accu i = function
|
||||
| ele :: tail ->
|
||||
let pattern =
|
||||
Printf.sprintf "Atom %d" i
|
||||
in
|
||||
let new_string =
|
||||
String.substr_replace_first accu ~pattern ~with_:(Printf.sprintf "%s 0" ele)
|
||||
in
|
||||
substitute new_string (i+1) tail
|
||||
| [] -> accu
|
||||
in
|
||||
let accu =
|
||||
let b =
|
||||
match Input.Ao_basis.read () with
|
||||
| Some data -> Input.Ao_basis.to_basis data
|
||||
| None -> failwith "No AO basis"
|
||||
in
|
||||
Basis.to_string ~fmt:Gto.Gaussian b
|
||||
and atom_names =
|
||||
List.map molecule.Molecule.nuclei ~f:(fun x -> Element.to_string x.Atom.element)
|
||||
in
|
||||
substitute accu 1 atom_names
|
||||
in
|
||||
Out_channel.with_file filename ~f:(fun oc ->
|
||||
Out_channel.output_string oc text
|
||||
)
|
||||
|
||||
|
||||
let write_files ezfio_filename =
|
||||
assert (Sys.is_directory_exn ezfio_filename);
|
||||
|
||||
let libint_dir =
|
||||
Filename.concat ezfio_filename "libint"
|
||||
in
|
||||
|
||||
let () =
|
||||
match Sys.is_directory libint_dir with
|
||||
| `Yes -> ()
|
||||
| `No -> Unix.mkdir libint_dir
|
||||
| `Unknown -> failwith ("Unable to tell if "^libint_dir^" exists.")
|
||||
in
|
||||
|
||||
write_xyz_file libint_dir;
|
||||
write_basis_file libint_dir
|
||||
|
||||
|
@ -7,9 +7,14 @@ s.set_selection_pt2("epstein_nesbet_2x2")
|
||||
#s.unset_openmp()
|
||||
print s
|
||||
|
||||
#s = H_apply("FCI_PT2")
|
||||
#s.set_perturbation("epstein_nesbet_2x2")
|
||||
#s.unset_openmp()
|
||||
#print s
|
||||
|
||||
s = H_apply_zmq("FCI_PT2")
|
||||
s.set_perturbation("epstein_nesbet_2x2")
|
||||
#s.unset_openmp()
|
||||
s.unset_openmp()
|
||||
print s
|
||||
|
||||
s = H_apply("FCI_no_skip")
|
||||
|
@ -24,6 +24,8 @@ subroutine run_wf
|
||||
integer(ZMQ_PTR) :: zmq_to_qp_run_socket
|
||||
|
||||
print *, 'Getting wave function'
|
||||
zmq_context = f77_zmq_ctx_new ()
|
||||
|
||||
zmq_to_qp_run_socket = new_zmq_to_qp_run_socket()
|
||||
|
||||
call zmq_get_psi(zmq_to_qp_run_socket, 1)
|
||||
|
@ -1,115 +0,0 @@
|
||||
program debug_libint
|
||||
|
||||
implicit none
|
||||
double precision :: ao_bielec_integral
|
||||
|
||||
double precision, allocatable :: buffer_int(:)
|
||||
|
||||
integer :: s1, s2,s3,s4
|
||||
integer :: bf1,bf2,bf3,bf4
|
||||
integer :: bf1_begin,bf2_begin,bf3_begin,bf4_begin
|
||||
integer :: bf1_end,bf2_end,bf3_end,bf4_end
|
||||
integer :: n1,n2,n3,n4
|
||||
integer :: f1,f2,f3,f4,f1234
|
||||
|
||||
PROVIDE has_libint
|
||||
! =================== !
|
||||
! Loop over the shell !
|
||||
! =================== !
|
||||
|
||||
do s1 = 1, shell_num
|
||||
|
||||
print*, s1, "/", shell_num
|
||||
|
||||
bf1_begin = shell_idx(1,s1)
|
||||
bf1_end = shell_idx(2,s1)
|
||||
n1 = 1 + bf1_end - bf1_begin
|
||||
|
||||
do s2 = 1, shell_num
|
||||
|
||||
bf2_begin = shell_idx(1,s2)
|
||||
bf2_end = shell_idx(2,s2)
|
||||
n2 = 1 + bf2_end - bf2_begin
|
||||
|
||||
do s3 = 1, shell_num
|
||||
|
||||
bf3_begin = shell_idx(1,s3)
|
||||
bf3_end = shell_idx(2,s3)
|
||||
n3 = 1 + bf3_end - bf3_begin
|
||||
|
||||
do s4 = 1, shell_num
|
||||
|
||||
bf4_begin = shell_idx(1,s4)
|
||||
bf4_end = shell_idx(2,s4)
|
||||
n4 = 1 + bf4_end - bf4_begin
|
||||
|
||||
! ========================== !
|
||||
! Compute the shell integral !
|
||||
! ========================== !
|
||||
integer :: sze
|
||||
sze = n1*n2*n3*n4
|
||||
allocate(buffer_int(sze))
|
||||
call compute_ao_bielec_integrals_shell(s1,s2,s3,s4,sze,buffer_int)
|
||||
|
||||
! ============================ !
|
||||
! Loop over the basis function !
|
||||
! ============================ !
|
||||
|
||||
do bf1 = bf1_begin, bf1_end
|
||||
do bf2 = bf2_begin, bf2_end
|
||||
do bf3 = bf3_begin, bf3_end
|
||||
do bf4 = bf4_begin, bf4_end
|
||||
|
||||
f1 = bf1 - bf1_begin
|
||||
f2 = bf2 - bf2_begin
|
||||
f3 = bf3 - bf3_begin
|
||||
f4 = bf4 - bf4_begin
|
||||
|
||||
!Get the integral from the buffer
|
||||
f1234 = f1*n2*n3*n4+f2*n3*n4+f3*n4+f4 + 1;
|
||||
|
||||
!Compute the norm
|
||||
double precision:: coef1, coef2, coef3, coef4, norm
|
||||
|
||||
coef1 = ao_coef_normalization_libint_factor(bf1)
|
||||
coef2 = ao_coef_normalization_libint_factor(bf2)
|
||||
coef3 = ao_coef_normalization_libint_factor(bf3)
|
||||
coef4 = ao_coef_normalization_libint_factor(bf4)
|
||||
|
||||
norm = coef1*coef2*coef3*coef4
|
||||
|
||||
double precision:: libint, ref
|
||||
|
||||
!Value of itegral bf1,bf2,bf3, bf4
|
||||
libint = buffer_int(f1234) * norm
|
||||
|
||||
!Verify with the manu's one
|
||||
ref = ao_bielec_integral(bf1,bf2,bf3,bf4)
|
||||
|
||||
|
||||
if ( (ABS(ABS(ref) - ABS(libint)) >= 1.e-6) ) THEN
|
||||
print*, bf1,bf2,bf3,bf4
|
||||
print*,"r", ref
|
||||
print*,"l", libint
|
||||
print*,"r/l", ref/libint
|
||||
print*,"l/r", libint/ref
|
||||
print*,"n", norm
|
||||
|
||||
call exit(1)
|
||||
end if
|
||||
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
|
||||
!Deallocate the buffer_intergral for the shell
|
||||
deallocate(buffer_int)
|
||||
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
|
||||
call finalize_libint()
|
||||
end
|
@ -65,8 +65,17 @@ subroutine run_pt2(N_st,energy)
|
||||
threshold_selectors = 1.d0
|
||||
threshold_generators = 0.999d0
|
||||
|
||||
N_det_generators = lambda_mrcc_pt2(0)
|
||||
do i=1,N_det_generators
|
||||
N_det_generators = lambda_mrcc_pt2(0) + N_det_cas
|
||||
do i=1,N_det_cas
|
||||
do k=1,N_int
|
||||
psi_det_generators(k,1,i) = psi_ref(k,1,i)
|
||||
psi_det_generators(k,2,i) = psi_ref(k,2,i)
|
||||
enddo
|
||||
do k=1,N_st
|
||||
psi_coef_generators(i,k) = psi_ref_coef(i,k)
|
||||
enddo
|
||||
enddo
|
||||
do i=N_det_cas+1,N_det_generators
|
||||
j = lambda_mrcc_pt2(i)
|
||||
do k=1,N_int
|
||||
psi_det_generators(k,1,i) = psi_non_ref(k,1,j)
|
||||
|
@ -25,11 +25,17 @@ print s
|
||||
|
||||
|
||||
|
||||
s = H_apply_zmq("mrcc_PT2")
|
||||
s = H_apply("mrcc_PT2")
|
||||
s.energy = "ci_electronic_energy_dressed"
|
||||
s.set_perturbation("epstein_nesbet_2x2")
|
||||
s.unset_openmp()
|
||||
print s
|
||||
|
||||
#s = H_apply_zmq("mrcc_PT2")
|
||||
#s.energy = "ci_electronic_energy_dressed"
|
||||
#s.set_perturbation("epstein_nesbet_2x2")
|
||||
#s.unset_openmp()
|
||||
#print s
|
||||
|
||||
END_SHELL
|
||||
|
||||
|
@ -274,7 +274,7 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge
|
||||
enddo
|
||||
|
||||
do i_state=1,Nstates
|
||||
ci_inv(i_state) = 1.d0/psi_ref_coef(i_I,i_state)
|
||||
ci_inv(i_state) = psi_ref_coef_inv(i_I,i_state)
|
||||
enddo
|
||||
do l_sd=1,idx_alpha(0)
|
||||
k_sd = idx_alpha(l_sd)
|
||||
@ -285,16 +285,20 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge
|
||||
enddo
|
||||
enddo
|
||||
call omp_set_lock( psi_ref_lock(i_I) )
|
||||
do i_state=1,Nstates
|
||||
if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5)then
|
||||
do l_sd=1,idx_alpha(0)
|
||||
k_sd = idx_alpha(l_sd)
|
||||
do i_state=1,Nstates
|
||||
delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd)
|
||||
if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5)then
|
||||
delta_ii_(i_state,i_I) = delta_ii_(i_state,i_I) - dIa_hla(i_state,k_sd) * ci_inv(i_state) * psi_non_ref_coef_transp(i_state,k_sd)
|
||||
enddo
|
||||
else
|
||||
delta_ii_(i_state,i_I) = 0.d0
|
||||
endif
|
||||
do l_sd=1,idx_alpha(0)
|
||||
k_sd = idx_alpha(l_sd)
|
||||
delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd)
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
call omp_unset_lock( psi_ref_lock(i_I) )
|
||||
enddo
|
||||
|
@ -24,6 +24,20 @@ use bitmasks
|
||||
enddo
|
||||
enddo
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
BEGIN_PROVIDER [ double precision, psi_ref_coef_inv, (psi_det_size,n_states) ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! 1/psi_ref_coef
|
||||
END_DOC
|
||||
integer :: i, i_state
|
||||
do i_state=1,N_states
|
||||
do i=1,N_det_ref
|
||||
psi_ref_coef_inv(i,i_state) = 1.d0/psi_ref_coef(i,i_state)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
|
||||
|
@ -38,7 +38,6 @@ from qp_path import QP_ROOT, QP_SRC, QP_EZFIO
|
||||
LIB = "" # join(QP_ROOT, "lib", "rdtsc.o")
|
||||
EZFIO_LIB = join(QP_ROOT, "lib", "libezfio_irp.a")
|
||||
ZMQ_LIB = join(QP_ROOT, "lib", "libf77zmq.a") + " " + join(QP_ROOT, "lib", "libzmq.a") + " -lstdc++ -lrt"
|
||||
INT_LIB = join(QP_ROOT, "install", "libint","lib", ".libs", "libint2.a")
|
||||
ROOT_BUILD_NINJA = join(QP_ROOT, "config", "build.ninja")
|
||||
|
||||
header = r"""#
|
||||
@ -97,7 +96,7 @@ def ninja_create_env_variable(pwd_config_file):
|
||||
l_string.append(str_)
|
||||
|
||||
lib_lapack = get_compilation_option(pwd_config_file, "LAPACK_LIB")
|
||||
str_lib = " ".join([LIB, lib_lapack, EZFIO_LIB, ZMQ_LIB, INT_LIB])
|
||||
str_lib = " ".join([LIB, lib_lapack, EZFIO_LIB, ZMQ_LIB])
|
||||
l_string.append("LIB = {0} ".format(str_lib))
|
||||
|
||||
l_string.append("")
|
||||
|
@ -345,7 +345,7 @@ def save_ezfio_provider(path_head, dict_code_provider):
|
||||
path = "{0}/ezfio_interface.irp.f".format(path_head)
|
||||
|
||||
l_output = ["! DO NOT MODIFY BY HAND",
|
||||
"! Created by $QP_ROOT/scripts/ezfio_interface.py",
|
||||
"! Created by $QP_ROOT/scripts/ezfio_interface/ei_handler.py",
|
||||
"! from file {0}/EZFIO.cfg".format(path_head),
|
||||
"\n"]
|
||||
|
||||
|
@ -22,6 +22,7 @@ BEGIN_PROVIDER [ %(type)s, %(name)s %(size)s ]
|
||||
|
||||
logical :: has
|
||||
PROVIDE ezfio_filename
|
||||
%(test_null_size)s
|
||||
call ezfio_has_%(ezfio_dir)s_%(ezfio_name)s(has)
|
||||
if (has) then
|
||||
call ezfio_get_%(ezfio_dir)s_%(ezfio_name)s(%(name)s)
|
||||
@ -44,6 +45,7 @@ END_PROVIDER
|
||||
|
||||
def __repr__(self):
|
||||
self.set_write()
|
||||
self.set_test_null_size()
|
||||
for v in self.values:
|
||||
if not v:
|
||||
msg = "Error : %s is not set in EZFIO.cfg" % (v)
|
||||
@ -54,8 +56,19 @@ END_PROVIDER
|
||||
|
||||
return self.data % self.__dict__
|
||||
|
||||
def set_test_null_size(self):
|
||||
if "size" not in self.__dict__:
|
||||
self.__dict__["size"] = ""
|
||||
if self.size != "":
|
||||
self.test_null_size = "if (size(%s) == 0) return\n" % ( self.name )
|
||||
else:
|
||||
self.test_null_size = ""
|
||||
|
||||
def set_write(self):
|
||||
self.write = ""
|
||||
if "size" in self.__dict__:
|
||||
return
|
||||
else:
|
||||
if self.type in self.write_correspondance:
|
||||
write = self.write_correspondance[self.type]
|
||||
output = self.output
|
||||
|
@ -180,7 +180,6 @@ let run check_only ezfio_filename =
|
||||
| None -> "vi"
|
||||
in
|
||||
|
||||
Libint.write_files (!Ezfio.ezfio_filename);
|
||||
match check_only with
|
||||
| true -> ()
|
||||
| false ->
|
||||
|
@ -400,6 +400,15 @@ class H_apply_zmq(H_apply):
|
||||
norm_pert(k) = 0.d0
|
||||
H_pert_diag(k) = 0.d0
|
||||
norm_psi(k) = 0.d0
|
||||
enddo
|
||||
"""
|
||||
self.data["copy_buffer"] = """
|
||||
do i=1,N_det_generators
|
||||
do k=1,N_st
|
||||
pt2(k) = pt2(k) + pt2_generators(k,i)
|
||||
norm_pert(k) = norm_pert(k) + norm_pert_generators(k,i)
|
||||
H_pert_diag(k) = H_pert_diag(k) + H_pert_diag_generators(k,i)
|
||||
enddo
|
||||
enddo
|
||||
"""
|
||||
|
||||
@ -416,3 +425,4 @@ class H_apply_zmq(H_apply):
|
||||
select_max(i_generator) = 0.d0
|
||||
endif
|
||||
"""
|
||||
|
||||
|
@ -307,14 +307,14 @@ subroutine fill_H_apply_buffer_no_selection(n_selected,det_buffer,Nint,iproc)
|
||||
end
|
||||
|
||||
|
||||
subroutine push_pt2(zmq_socket_push,pt2,norm_pert,H_pert_diag,N_st,task_id)
|
||||
subroutine push_pt2(zmq_socket_push,pt2,norm_pert,H_pert_diag,i_generator,N_st,task_id)
|
||||
use f77_zmq
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Push PT2 calculation to the collector
|
||||
END_DOC
|
||||
integer(ZMQ_PTR), intent(in) :: zmq_socket_push
|
||||
integer, intent(in) :: N_st
|
||||
integer, intent(in) :: N_st, i_generator
|
||||
double precision, intent(in) :: pt2(N_st), norm_pert(N_st), H_pert_diag(N_st)
|
||||
integer, intent(in) :: task_id
|
||||
integer :: rc
|
||||
@ -343,6 +343,12 @@ subroutine push_pt2(zmq_socket_push,pt2,norm_pert,H_pert_diag,N_st,task_id)
|
||||
stop 'error'
|
||||
endif
|
||||
|
||||
rc = f77_zmq_send( zmq_socket_push, i_generator, 4, ZMQ_SNDMORE)
|
||||
if (rc /= 4) then
|
||||
print *, irp_here, 'f77_zmq_send( zmq_socket_push, i_generator, 4, 0)'
|
||||
stop 'error'
|
||||
endif
|
||||
|
||||
rc = f77_zmq_send( zmq_socket_push, task_id, 4, 0)
|
||||
if (rc /= 4) then
|
||||
print *, irp_here, 'f77_zmq_send( zmq_socket_push, task_id, 4, 0)'
|
||||
@ -358,7 +364,7 @@ subroutine push_pt2(zmq_socket_push,pt2,norm_pert,H_pert_diag,N_st,task_id)
|
||||
! endif
|
||||
end
|
||||
|
||||
subroutine pull_pt2(zmq_socket_pull,pt2,norm_pert,H_pert_diag,N_st,n,task_id)
|
||||
subroutine pull_pt2(zmq_socket_pull,pt2,norm_pert,H_pert_diag,i_generator,N_st,n,task_id)
|
||||
use f77_zmq
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
@ -368,7 +374,7 @@ subroutine pull_pt2(zmq_socket_pull,pt2,norm_pert,H_pert_diag,N_st,n,task_id)
|
||||
integer, intent(in) :: N_st
|
||||
double precision, intent(out) :: pt2(N_st), norm_pert(N_st), H_pert_diag(N_st)
|
||||
integer, intent(out) :: task_id
|
||||
integer, intent(out) :: n
|
||||
integer, intent(out) :: n, i_generator
|
||||
integer :: rc
|
||||
|
||||
n=0
|
||||
@ -386,7 +392,11 @@ subroutine pull_pt2(zmq_socket_pull,pt2,norm_pert,H_pert_diag,N_st,n,task_id)
|
||||
|
||||
rc = f77_zmq_recv( zmq_socket_pull, pt2(1), 8*N_st, 0)
|
||||
if (rc /= 8*N_st) then
|
||||
print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, pt2(1,1) , 8*N_st, 0)'
|
||||
print *, ''
|
||||
print *, ''
|
||||
print *, ''
|
||||
print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, pt2(1) , 8*N_st, 0)'
|
||||
print *, rc
|
||||
stop 'error'
|
||||
endif
|
||||
|
||||
@ -402,6 +412,12 @@ subroutine pull_pt2(zmq_socket_pull,pt2,norm_pert,H_pert_diag,N_st,n,task_id)
|
||||
stop 'error'
|
||||
endif
|
||||
|
||||
rc = f77_zmq_recv( zmq_socket_pull, i_generator, 4, 0)
|
||||
if (rc /= 4) then
|
||||
print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, i_generator, 4, 0)'
|
||||
stop 'error'
|
||||
endif
|
||||
|
||||
rc = f77_zmq_recv( zmq_socket_pull, task_id, 4, 0)
|
||||
if (rc /= 4) then
|
||||
print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, task_id, 4, 0)'
|
||||
|
@ -10,6 +10,7 @@ subroutine $subroutine($params_main)
|
||||
|
||||
$decls_main
|
||||
|
||||
integer :: i
|
||||
integer :: i_generator
|
||||
double precision :: wall_0, wall_1
|
||||
integer(omp_lock_kind) :: lck
|
||||
@ -26,6 +27,9 @@ subroutine $subroutine($params_main)
|
||||
integer(ZMQ_PTR) :: zmq_socket_pair
|
||||
|
||||
integer(ZMQ_PTR) :: zmq_to_qp_run_socket
|
||||
double precision, allocatable :: pt2_generators(:,:), norm_pert_generators(:,:)
|
||||
double precision, allocatable :: H_pert_diag_generators(:,:)
|
||||
|
||||
call new_parallel_job(zmq_to_qp_run_socket,'$subroutine')
|
||||
zmq_socket_pair = new_zmq_pair_socket(.True.)
|
||||
|
||||
@ -37,24 +41,26 @@ subroutine $subroutine($params_main)
|
||||
call add_task_to_taskserver(zmq_to_qp_run_socket,task)
|
||||
enddo
|
||||
|
||||
integer(ZMQ_PTR) :: collector_thread
|
||||
external :: $subroutine_collector
|
||||
rc = pthread_create(collector_thread, $subroutine_collector)
|
||||
allocate ( pt2_generators(N_states,N_det_generators), &
|
||||
norm_pert_generators(N_states,N_det_generators), &
|
||||
H_pert_diag_generators(N_states,N_det_generators) )
|
||||
|
||||
!$OMP PARALLEL DEFAULT(private)
|
||||
!$OMP TASK PRIVATE(rc)
|
||||
rc = omp_get_thread_num()
|
||||
call $subroutine_slave_inproc(rc)
|
||||
!$OMP END TASK
|
||||
!$OMP TASKWAIT
|
||||
PROVIDE nproc N_states
|
||||
!$OMP PARALLEL DEFAULT(NONE) &
|
||||
!$OMP PRIVATE(i) &
|
||||
!$OMP SHARED(zmq_socket_pair,N_states, pt2_generators, norm_pert_generators, H_pert_diag_generators, n, task_id, i_generator) &
|
||||
!$OMP num_threads(nproc+1)
|
||||
i = omp_get_thread_num()
|
||||
if (i == 0) then
|
||||
call $subroutine_collector()
|
||||
integer :: n, task_id
|
||||
call pull_pt2(zmq_socket_pair, pt2_generators, norm_pert_generators, H_pert_diag_generators, i_generator, size(pt2_generators), n, task_id)
|
||||
else
|
||||
call $subroutine_slave_inproc(i)
|
||||
endif
|
||||
!$OMP END PARALLEL
|
||||
|
||||
|
||||
integer :: n, task_id
|
||||
call pull_pt2(zmq_socket_pair, pt2, norm_pert, H_pert_diag, N_st, n, task_id)
|
||||
|
||||
rc = pthread_join(collector_thread)
|
||||
|
||||
call end_zmq_pair_socket(zmq_socket_pair)
|
||||
call end_parallel_job(zmq_to_qp_run_socket,'$subroutine')
|
||||
|
||||
@ -62,6 +68,7 @@ subroutine $subroutine($params_main)
|
||||
$copy_buffer
|
||||
$generate_psi_guess
|
||||
|
||||
deallocate ( pt2_generators, norm_pert_generators, H_pert_diag_generators)
|
||||
end
|
||||
|
||||
subroutine $subroutine_slave_tcp(iproc)
|
||||
@ -169,7 +176,7 @@ subroutine $subroutine_slave(thread, iproc)
|
||||
endif
|
||||
|
||||
call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id,1)
|
||||
call push_pt2(zmq_socket_push,pt2,norm_pert,H_pert_diag,N_st,task_id)
|
||||
call push_pt2(zmq_socket_push,pt2,norm_pert,H_pert_diag,i_generator,N_st,task_id)
|
||||
|
||||
enddo
|
||||
|
||||
@ -186,7 +193,7 @@ subroutine $subroutine_collector
|
||||
use f77_zmq
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Collects results from the selection
|
||||
! Collects results from the selection in an array of generators
|
||||
END_DOC
|
||||
|
||||
integer :: k, rc
|
||||
@ -194,7 +201,7 @@ subroutine $subroutine_collector
|
||||
integer(ZMQ_PTR), external :: new_zmq_pull_socket
|
||||
integer(ZMQ_PTR) :: zmq_socket_pull
|
||||
integer*8 :: control, accu
|
||||
integer :: n, more, task_id
|
||||
integer :: n, more, task_id, i_generator
|
||||
|
||||
integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket
|
||||
integer(ZMQ_PTR) :: zmq_to_qp_run_socket
|
||||
@ -202,22 +209,25 @@ subroutine $subroutine_collector
|
||||
zmq_to_qp_run_socket = new_zmq_to_qp_run_socket()
|
||||
zmq_socket_pull = new_zmq_pull_socket()
|
||||
|
||||
double precision, allocatable :: pt2(:,:), norm_pert(:,:), H_pert_diag(:,:)
|
||||
allocate ( pt2(N_states,2), norm_pert(N_states,2), H_pert_diag(N_states,2))
|
||||
double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:)
|
||||
double precision, allocatable :: pt2_result(:,:), norm_pert_result(:,:), H_pert_diag_result(:,:)
|
||||
allocate (pt2(N_states), norm_pert(N_states), H_pert_diag(N_states))
|
||||
allocate (pt2_result(N_states,N_det_generators), norm_pert_result(N_states,N_det_generators), &
|
||||
H_pert_diag_result(N_states,N_det_generators))
|
||||
|
||||
pt2 = 0.d0
|
||||
norm_pert = 0.d0
|
||||
H_pert_diag = 0.d0
|
||||
pt2_result = 0.d0
|
||||
norm_pert_result = 0.d0
|
||||
H_pert_diag_result = 0.d0
|
||||
accu = 0_8
|
||||
more = 1
|
||||
do while (more == 1)
|
||||
|
||||
call pull_pt2(zmq_socket_pull, pt2, norm_pert, H_pert_diag, N_states, n, task_id)
|
||||
call pull_pt2(zmq_socket_pull, pt2, norm_pert, H_pert_diag, i_generator, N_states, n, task_id)
|
||||
if (n > 0) then
|
||||
do k=1,N_states
|
||||
pt2(k,2) = pt2(k,1) + pt2(k,2)
|
||||
norm_pert(k,2) = norm_pert(k,1) + norm_pert(k,2)
|
||||
H_pert_diag(k,2) = H_pert_diag(k,1) + H_pert_diag(k,2)
|
||||
pt2_result(k,i_generator) = pt2(k)
|
||||
norm_pert_result(k,i_generator) = norm_pert(k)
|
||||
H_pert_diag_result(k,i_generator) = H_pert_diag(k)
|
||||
enddo
|
||||
accu = accu + 1_8
|
||||
call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more)
|
||||
@ -234,9 +244,10 @@ subroutine $subroutine_collector
|
||||
|
||||
socket_result = new_zmq_pair_socket(.False.)
|
||||
|
||||
call push_pt2(socket_result, pt2(1,2), norm_pert(1,2), H_pert_diag(1,2), N_states,0)
|
||||
call push_pt2(socket_result, pt2_result, norm_pert_result, H_pert_diag_result, i_generator, &
|
||||
N_states*N_det_generators,0)
|
||||
|
||||
deallocate ( pt2, norm_pert, H_pert_diag)
|
||||
deallocate (pt2, norm_pert, H_pert_diag, pt2_result, norm_pert_result, H_pert_diag_result)
|
||||
|
||||
call end_zmq_pair_socket(socket_result)
|
||||
|
||||
|
@ -315,6 +315,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun
|
||||
double precision, intent(inout) :: u_in(dim_in,N_st)
|
||||
double precision, intent(out) :: energies(N_st)
|
||||
|
||||
integer :: sze_8
|
||||
integer :: iter
|
||||
integer :: i,j,k,l,m
|
||||
logical :: converged
|
||||
@ -334,6 +335,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun
|
||||
double precision :: to_print(2,N_st)
|
||||
double precision :: cpu, wall
|
||||
|
||||
!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: U, W, R, Wt, y, h, lambda
|
||||
|
||||
|
||||
call write_time(iunit)
|
||||
@ -362,12 +364,15 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun
|
||||
enddo
|
||||
write(iunit,'(A)') trim(write_buffer)
|
||||
|
||||
integer, external :: align_double
|
||||
sze_8 = align_double(sze)
|
||||
|
||||
allocate( &
|
||||
kl_pairs(2,N_st*(N_st+1)/2), &
|
||||
W(sze,N_st,davidson_sze_max), &
|
||||
W(sze_8,N_st,davidson_sze_max), &
|
||||
Wt(sze), &
|
||||
U(sze,N_st,davidson_sze_max), &
|
||||
R(sze,N_st), &
|
||||
U(sze_8,N_st,davidson_sze_max), &
|
||||
R(sze_8,N_st), &
|
||||
h(N_st,davidson_sze_max,N_st,davidson_sze_max), &
|
||||
y(N_st,davidson_sze_max,N_st,davidson_sze_max), &
|
||||
lambda(N_st*davidson_sze_max))
|
||||
@ -381,6 +386,8 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun
|
||||
! ==============
|
||||
|
||||
|
||||
if (N_st > 1) then
|
||||
|
||||
k_pairs=0
|
||||
do l=1,N_st
|
||||
do k=1,l
|
||||
@ -393,7 +400,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun
|
||||
!$OMP PARALLEL DEFAULT(NONE) &
|
||||
!$OMP SHARED(U,sze,N_st,overlap,kl_pairs,k_pairs, &
|
||||
!$OMP Nint,dets_in,u_in) &
|
||||
!$OMP PRIVATE(k,l,kl,i)
|
||||
!$OMP PRIVATE(k,l,kl)
|
||||
|
||||
|
||||
! Orthonormalize initial guess
|
||||
@ -415,6 +422,17 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun
|
||||
|
||||
call ortho_lowdin(overlap,size(overlap,1),N_st,U_in,size(U_in,1),sze)
|
||||
|
||||
else
|
||||
|
||||
overlap(1,1) = u_dot_u(U_in(1,1),sze)
|
||||
double precision :: f
|
||||
f = 1.d0 / dsqrt(overlap(1,1))
|
||||
do i=1,sze
|
||||
U_in(i,1) = U_in(i,1) * f
|
||||
enddo
|
||||
|
||||
endif
|
||||
|
||||
! Davidson iterations
|
||||
! ===================
|
||||
|
||||
@ -473,7 +491,10 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun
|
||||
! Express eigenvectors of h in the determinant basis
|
||||
! --------------------------------------------------
|
||||
|
||||
!$OMP PARALLEL DEFAULT(NONE) &
|
||||
!$OMP PRIVATE(k,i,l,iter2) SHARED(U,W,R,y,iter,lambda,N_st,sze)
|
||||
do k=1,N_st
|
||||
!$OMP DO
|
||||
do i=1,sze
|
||||
U(i,k,iter+1) = 0.d0
|
||||
W(i,k,iter+1) = 0.d0
|
||||
@ -484,7 +505,9 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
!$OMP END DO
|
||||
enddo
|
||||
!$OMP END PARALLEL
|
||||
|
||||
! Compute residual vector
|
||||
! -----------------------
|
||||
|
@ -1608,12 +1608,11 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint)
|
||||
integer :: i,j,k,l, jj,ii
|
||||
integer :: i0, j0
|
||||
|
||||
integer, allocatable :: shortcut(:), sort_idx(:)
|
||||
integer(bit_kind), allocatable :: sorted(:,:), version(:,:)
|
||||
integer, allocatable :: shortcut(:,:), sort_idx(:,:)
|
||||
integer(bit_kind), allocatable :: sorted(:,:,:), version(:,:,:)
|
||||
integer(bit_kind) :: sorted_i(Nint)
|
||||
|
||||
integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi
|
||||
double precision :: local_threshold
|
||||
|
||||
|
||||
ASSERT (Nint > 0)
|
||||
@ -1621,104 +1620,83 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint)
|
||||
ASSERT (n>0)
|
||||
PROVIDE ref_bitmask_energy davidson_criterion
|
||||
|
||||
allocate (shortcut(0:n+1), sort_idx(n), sorted(Nint,n), version(Nint,n))
|
||||
allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2))
|
||||
v_0 = 0.d0
|
||||
|
||||
call sort_dets_ab_v(keys_tmp, sorted, sort_idx, shortcut, version, n, Nint)
|
||||
call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint)
|
||||
call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint)
|
||||
|
||||
!$OMP PARALLEL DEFAULT(NONE) &
|
||||
!$OMP PRIVATE(i,hij,j,k,jj,vt,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,local_threshold,sorted_i)&
|
||||
!$OMP SHARED(n,H_jj,u_0,keys_tmp,Nint,v_0,threshold_davidson,sorted,shortcut,sort_idx,version)
|
||||
!$OMP PRIVATE(i,hij,j,k,jj,vt,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i)&
|
||||
!$OMP SHARED(n,H_jj,u_0,keys_tmp,Nint,v_0,sorted,shortcut,sort_idx,version)
|
||||
allocate(vt(n))
|
||||
Vt = 0.d0
|
||||
|
||||
!$OMP DO SCHEDULE(dynamic)
|
||||
do sh=1,shortcut(0)
|
||||
do sh2=1,sh
|
||||
do sh=1,shortcut(0,1)
|
||||
do sh2=sh,shortcut(0,1)
|
||||
exa = 0
|
||||
do ni=1,Nint
|
||||
exa = exa + popcnt(xor(version(ni,sh), version(ni,sh2)))
|
||||
exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1)))
|
||||
end do
|
||||
if(exa > 2) then
|
||||
cycle
|
||||
end if
|
||||
|
||||
do i=shortcut(sh),shortcut(sh+1)-1
|
||||
org_i = sort_idx(i)
|
||||
local_threshold = threshold_davidson - dabs(u_0(org_i))
|
||||
do i=shortcut(sh,1),shortcut(sh+1,1)-1
|
||||
org_i = sort_idx(i,1)
|
||||
if(sh==sh2) then
|
||||
endi = i-1
|
||||
else
|
||||
endi = shortcut(sh2+1)-1
|
||||
endi = shortcut(sh2+1,1)-1
|
||||
end if
|
||||
do ni=1,Nint
|
||||
sorted_i(ni) = sorted(ni,i)
|
||||
sorted_i(ni) = sorted(ni,i,1)
|
||||
enddo
|
||||
|
||||
do j=shortcut(sh2),endi
|
||||
org_j = sort_idx(j)
|
||||
if ( dabs(u_0(org_j)) > local_threshold ) then
|
||||
do j=shortcut(sh2,1),endi
|
||||
org_j = sort_idx(j,1)
|
||||
ext = exa
|
||||
do ni=1,Nint
|
||||
ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j)))
|
||||
ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1)))
|
||||
end do
|
||||
if(ext <= 4) then
|
||||
call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij)
|
||||
vt (org_i) = vt (org_i) + hij*u_0(org_j)
|
||||
vt (org_j) = vt (org_j) + hij*u_0(org_i)
|
||||
endif
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
!$OMP END DO
|
||||
|
||||
!$OMP CRITICAL
|
||||
do i=1,n
|
||||
v_0(i) = v_0(i) + vt(i)
|
||||
enddo
|
||||
!$OMP END CRITICAL
|
||||
|
||||
deallocate(vt)
|
||||
!$OMP END PARALLEL
|
||||
|
||||
call sort_dets_ba_v(keys_tmp, sorted, sort_idx, shortcut, version, n, Nint)
|
||||
|
||||
!$OMP PARALLEL DEFAULT(NONE) &
|
||||
!$OMP PRIVATE(i,hij,j,k,jj,vt,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,local_threshold)&
|
||||
!$OMP SHARED(n,H_jj,u_0,keys_tmp,Nint,v_0,threshold_davidson,sorted,shortcut,sort_idx,version)
|
||||
allocate(vt(n))
|
||||
Vt = 0.d0
|
||||
!$OMP END DO NOWAIT
|
||||
|
||||
!$OMP DO SCHEDULE(dynamic)
|
||||
do sh=1,shortcut(0)
|
||||
do i=shortcut(sh),shortcut(sh+1)-1
|
||||
org_i = sort_idx(i)
|
||||
local_threshold = threshold_davidson - dabs(u_0(org_i))
|
||||
do j=shortcut(sh),i-1
|
||||
org_j = sort_idx(j)
|
||||
if ( dabs(u_0(org_j)) > local_threshold ) then
|
||||
do sh=1,shortcut(0,2)
|
||||
do i=shortcut(sh,2),shortcut(sh+1,2)-1
|
||||
org_i = sort_idx(i,2)
|
||||
do j=shortcut(sh,2),i-1
|
||||
org_j = sort_idx(j,2)
|
||||
ext = 0
|
||||
do ni=1,Nint
|
||||
ext = ext + popcnt(xor(sorted(ni,i), sorted(ni,j)))
|
||||
ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2)))
|
||||
end do
|
||||
if(ext == 4) then
|
||||
call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij)
|
||||
vt (org_i) = vt (org_i) + hij*u_0(org_j)
|
||||
vt (org_j) = vt (org_j) + hij*u_0(org_i)
|
||||
end if
|
||||
end if
|
||||
end do
|
||||
end do
|
||||
enddo
|
||||
!$OMP END DO
|
||||
!$OMP END DO NOWAIT
|
||||
|
||||
!$OMP CRITICAL
|
||||
do i=1,n
|
||||
do i=n,1,-1
|
||||
v_0(i) = v_0(i) + vt(i)
|
||||
enddo
|
||||
!$OMP END CRITICAL
|
||||
|
||||
deallocate(vt)
|
||||
!$OMP END PARALLEL
|
||||
|
||||
|
@ -1 +1 @@
|
||||
Pseudo Bitmask ZMQ Integrals_Monoelec
|
||||
Pseudo Bitmask ZMQ
|
||||
|
@ -289,18 +289,11 @@ end
|
||||
subroutine compute_ao_bielec_integrals(j,k,l,sze,buffer_value)
|
||||
implicit none
|
||||
use map_module
|
||||
use libint_module
|
||||
|
||||
BEGIN_DOC
|
||||
! Compute AO 1/r12 integrals for all i and fixed j,k,l
|
||||
END_DOC
|
||||
|
||||
! include 'Utils/constants.include.F'
|
||||
! integer, intent(in) :: j,k,l,sze
|
||||
! real(integral_kind), intent(out) :: buffer_value(sze)
|
||||
!
|
||||
! call compute_ao_bielec_integrals_libint(j,k,l,sze,buffer_value)
|
||||
|
||||
include 'Utils/constants.include.F'
|
||||
integer, intent(in) :: j,k,l,sze
|
||||
real(integral_kind), intent(out) :: buffer_value(sze)
|
||||
@ -375,8 +368,6 @@ BEGIN_PROVIDER [ logical, ao_bielec_integrals_in_map ]
|
||||
integer(ZMQ_PTR) :: zmq_to_qp_run_socket
|
||||
character*(32) :: task
|
||||
|
||||
if (.not.has_libint) then
|
||||
|
||||
call new_parallel_job(zmq_to_qp_run_socket,'ao_integrals')
|
||||
|
||||
do l=1,ao_num
|
||||
@ -384,127 +375,18 @@ BEGIN_PROVIDER [ logical, ao_bielec_integrals_in_map ]
|
||||
call add_task_to_taskserver(zmq_to_qp_run_socket,task)
|
||||
enddo
|
||||
|
||||
integer(ZMQ_PTR) :: collector_thread
|
||||
external :: ao_bielec_integrals_in_map_collector
|
||||
rc = pthread_create(collector_thread, ao_bielec_integrals_in_map_collector)
|
||||
|
||||
!$OMP PARALLEL DEFAULT(private)
|
||||
!$OMP TASK PRIVATE(i)
|
||||
PROVIDE nproc
|
||||
!$OMP PARALLEL DEFAULT(private) num_threads(nproc+1)
|
||||
i = omp_get_thread_num()
|
||||
if (i==0) then
|
||||
call ao_bielec_integrals_in_map_collector(i)
|
||||
else
|
||||
call ao_bielec_integrals_in_map_slave_inproc(i)
|
||||
!$OMP END TASK
|
||||
!$OMP TASKWAIT
|
||||
endif
|
||||
!$OMP END PARALLEL
|
||||
|
||||
rc = pthread_join(collector_thread)
|
||||
|
||||
call end_parallel_job(zmq_to_qp_run_socket, 'ao_integrals')
|
||||
|
||||
else
|
||||
|
||||
double precision, allocatable :: buffer_int(:)
|
||||
|
||||
PROVIDE has_libint
|
||||
|
||||
integer :: s1, s2,s3,s4
|
||||
integer :: bf1,bf2,bf3,bf4
|
||||
integer :: bf1_begin,bf2_begin,bf3_begin,bf4_begin
|
||||
integer :: bf1_end,bf2_end,bf3_end,bf4_end
|
||||
integer :: n1,n2,n3,n4
|
||||
integer :: f1,f2,f3,f4,f1234
|
||||
|
||||
! =================== !
|
||||
! Loop over the shell !
|
||||
! =================== !
|
||||
|
||||
do s1 = 1, shell_num
|
||||
|
||||
print*, s1, "/", shell_num
|
||||
|
||||
bf1_begin = shell_idx(1,s1)
|
||||
bf1_end = shell_idx(2,s1)
|
||||
n1 = 1 + bf1_end - bf1_begin
|
||||
|
||||
do s2 = 1, shell_num
|
||||
|
||||
bf2_begin = shell_idx(1,s2)
|
||||
bf2_end = shell_idx(2,s2)
|
||||
n2 = 1 + bf2_end - bf2_begin
|
||||
|
||||
do s3 = 1, shell_num
|
||||
|
||||
bf3_begin = shell_idx(1,s3)
|
||||
bf3_end = shell_idx(2,s3)
|
||||
n3 = 1 + bf3_end - bf3_begin
|
||||
|
||||
do s4 = 1, shell_num
|
||||
|
||||
bf4_begin = shell_idx(1,s4)
|
||||
bf4_end = shell_idx(2,s4)
|
||||
n4 = 1 + bf4_end - bf4_begin
|
||||
|
||||
! ========================== !
|
||||
! Compute the shell integral !
|
||||
! ========================== !
|
||||
integer :: sze
|
||||
sze = n1*n2*n3*n4
|
||||
allocate(buffer_int(sze))
|
||||
allocate(buffer_i(sze))
|
||||
allocate(buffer_value(sze))
|
||||
call compute_ao_bielec_integrals_shell(s1,s2,s3,s4,sze,buffer_int)
|
||||
|
||||
! ============================ !
|
||||
! Loop over the basis function !
|
||||
! ============================ !
|
||||
|
||||
do bf1 = bf1_begin, bf1_end
|
||||
do bf2 = bf2_begin, bf2_end
|
||||
do bf3 = bf3_begin, bf3_end
|
||||
do bf4 = bf4_begin, bf4_end
|
||||
|
||||
f1 = bf1 - bf1_begin
|
||||
f2 = bf2 - bf2_begin
|
||||
f3 = bf3 - bf3_begin
|
||||
f4 = bf4 - bf4_begin
|
||||
|
||||
! if (bf1 > bf3) cycle
|
||||
! if (bf2 > bf4) cycle
|
||||
! if (bf1 > bf2) cycle
|
||||
|
||||
!Get the integral from the buffer
|
||||
f1234 = f1*n2*n3*n4+f2*n3*n4+f3*n4+f4 + 1;
|
||||
|
||||
!Compute the norm
|
||||
double precision:: coef1, coef2, coef3, coef4, norm
|
||||
|
||||
coef1 = ao_coef_normalization_libint_factor(bf1)
|
||||
coef2 = ao_coef_normalization_libint_factor(bf2)
|
||||
coef3 = ao_coef_normalization_libint_factor(bf3)
|
||||
coef4 = ao_coef_normalization_libint_factor(bf4)
|
||||
|
||||
norm = coef1*coef2*coef3*coef4
|
||||
|
||||
n_integrals += 1
|
||||
buffer_value(n_integrals) = buffer_int(f1234) * norm
|
||||
call bielec_integrals_index(bf1,bf2,bf3,bf4,buffer_i(n_integrals))
|
||||
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
|
||||
!Deallocate the buffer_intergral for the shell
|
||||
deallocate(buffer_int, buffer_i, buffer_value)
|
||||
if (n_integrals >= 0) then
|
||||
call insert_into_ao_integrals_map(n_integrals,buffer_i,buffer_value)
|
||||
endif
|
||||
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
|
||||
endif
|
||||
|
||||
print*, 'Sorting the map'
|
||||
call map_sort(ao_integrals_map)
|
||||
|
@ -67,6 +67,8 @@ end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
subroutine ao_bielec_integrals_in_map_slave(thread,iproc)
|
||||
use map_module
|
||||
use f77_zmq
|
||||
@ -107,7 +109,7 @@ subroutine ao_bielec_integrals_in_map_slave(thread,iproc)
|
||||
call push_integrals(zmq_socket_push, n_integrals, buffer_i, buffer_value, 0)
|
||||
enddo
|
||||
call compute_ao_integrals_jl(l,l,n_integrals,buffer_i,buffer_value)
|
||||
call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id,n_integrals)
|
||||
call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id)
|
||||
call push_integrals(zmq_socket_push, n_integrals, buffer_i, buffer_value, task_id)
|
||||
enddo
|
||||
|
||||
@ -127,7 +129,7 @@ subroutine pull_integrals(zmq_socket_pull, n_integrals, buffer_i, buffer_value,
|
||||
BEGIN_DOC
|
||||
! How the collector pulls the computed integrals
|
||||
END_DOC
|
||||
integer(ZMQ_PTR), intent(out) :: zmq_socket_pull
|
||||
integer(ZMQ_PTR), intent(in) :: zmq_socket_pull
|
||||
integer, intent(out) :: n_integrals
|
||||
integer(key_kind), intent(out) :: buffer_i(*)
|
||||
real(integral_kind), intent(out) :: buffer_value(*)
|
||||
|
@ -1,247 +0,0 @@
|
||||
/*
|
||||
* This file is a part of Libint.
|
||||
* Copyright (C) 2004-2014 Edward F. Valeev
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see http://www.gnu.org/licenses/.
|
||||
*
|
||||
*/
|
||||
|
||||
#if __cplusplus <= 199711L
|
||||
# error "C++11 support is required"
|
||||
#endif
|
||||
|
||||
// standard C++ headers
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
#include <vector>
|
||||
#include <chrono>
|
||||
#include <stdlib.h>
|
||||
|
||||
// Libint Gaussian integrals library
|
||||
#include <libint2.hpp>
|
||||
|
||||
/*** ================ ***/
|
||||
/*** Exposed Function ***/
|
||||
/*** ================ ***/
|
||||
extern "C"
|
||||
{
|
||||
void init_libint(char ezfio_filename[]);
|
||||
void finalize_libint();
|
||||
int nb_shell();
|
||||
void map_shell_to_basis_function_interval(int sze, int* out_val);
|
||||
|
||||
double ao_bielec_integral(int bf1f, int bf2f, int bf3f, int bf4f);
|
||||
void compute_ao_bielec_integrals_jkl(int bf2, int bf3, int bf4, int sze, double* values);
|
||||
void compute_ao_bielec_integrals_shell(int s1, int s2, int s3, int s4, int sze, double* values);
|
||||
}
|
||||
|
||||
using libint2::Shell;
|
||||
|
||||
/*** ================= ***/
|
||||
/*** Internal Function ***/
|
||||
/*** ================= ***/
|
||||
|
||||
size_t nbasis(const std::vector<Shell>& shells);
|
||||
std::vector<size_t> map_shell_to_basis_function(const std::vector<Shell>& shells);
|
||||
std::vector<size_t> map_basis_function_to_shell(const std::vector<Shell>& shells);
|
||||
|
||||
/*** ================ ***/
|
||||
/*** Exposed Function ***/
|
||||
/*** ================ ***/
|
||||
|
||||
void init_libint(char ezfio_filename[]);
|
||||
void finalize_libint();
|
||||
int nb_shell();
|
||||
void map_shell_to_basis_function_interval(int sze, int* out_val);
|
||||
|
||||
|
||||
double ao_bielec_integral(int bf1f, int bf2f, int bf3f, int bf4f);
|
||||
void compute_ao_bielec_integrals_jkl(int i, int j, int k, int sze, double* values);
|
||||
void compute_ao_bielec_integrals_shell(int s1, int s2, int s3, int s4, int sze, double* values);
|
||||
|
||||
/*** =============== ***/
|
||||
/*** Global Variable ***/
|
||||
/*** =============== ***/
|
||||
|
||||
std::vector<Shell> shells_global;
|
||||
std::vector<size_t> shell2bf;
|
||||
std::vector<size_t> bf2shell;
|
||||
static libint2::TwoBodyEngine<libint2::Coulomb> *engine_pointer;
|
||||
|
||||
// ___ _
|
||||
// | ._ _|_ _ ._ ._ _. | _|_ ._ _ _|_ o _ ._
|
||||
// _|_ | | |_ (/_ | | | (_| | | |_| | | (_ |_ | (_) | |
|
||||
//
|
||||
|
||||
size_t nbasis(const std::vector<Shell>& shells) {
|
||||
size_t n = 0;
|
||||
for (const auto& shell: shells)
|
||||
n += shell.size();
|
||||
return n;
|
||||
}
|
||||
|
||||
size_t max_nprim(const std::vector<Shell>& shells) {
|
||||
size_t n = 0;
|
||||
for (auto shell: shells)
|
||||
n = std::max(shell.nprim(), n);
|
||||
return n;
|
||||
}
|
||||
|
||||
int max_l(const std::vector<Shell>& shells) {
|
||||
int l = 0;
|
||||
for (auto shell: shells)
|
||||
for (auto c: shell.contr)
|
||||
l = std::max(c.l, l);
|
||||
return l;
|
||||
}
|
||||
|
||||
|
||||
std::vector<size_t> map_shell_to_basis_function(const std::vector<Shell>& shells) {
|
||||
std::vector<size_t> result;
|
||||
result.reserve(shells.size());
|
||||
|
||||
size_t n = 0;
|
||||
for (auto shell: shells) {
|
||||
result.push_back(n);
|
||||
n += shell.size();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<size_t> map_basis_function_to_shell(const std::vector<Shell>& shells) {
|
||||
|
||||
std::vector<size_t> result;
|
||||
result.reserve(nbasis(shells));
|
||||
|
||||
size_t n = 0;
|
||||
|
||||
for (auto shell: shells) {
|
||||
for (auto i=0; i!=shell.size(); ++i){
|
||||
result.push_back(n);
|
||||
}
|
||||
n++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// _ _
|
||||
// |_ ._ _ _ _ _| _|_ ._ _ _|_ o _ ._
|
||||
// |_ >< |_) (_) _> (/_ (_| | |_| | | (_ |_ | (_) | |
|
||||
// |
|
||||
void init_libint(char ezfio_filename[]){
|
||||
|
||||
/*** =========================== ***/
|
||||
/*** initialize molecule ***/
|
||||
/*** =========================== ***/
|
||||
|
||||
std::string xyz_path = ezfio_filename + std::string("/libint/xyz");
|
||||
// read geometry from a filename
|
||||
std::ifstream input_file(xyz_path);
|
||||
std::vector<libint2::Atom> atoms = libint2::read_dotxyz(input_file);
|
||||
|
||||
/*** =========================== ***/
|
||||
/*** create basis set ***/
|
||||
/*** =========================== ***/
|
||||
|
||||
std::string basis_path = ezfio_filename + std::string("/libint");
|
||||
setenv("LIBINT_DATA_PATH", basis_path.c_str(), 1);
|
||||
|
||||
libint2::BasisSet shells("basis", atoms);
|
||||
|
||||
shells_global = shells;
|
||||
|
||||
for(auto& shell: shells_global)
|
||||
for(auto& contraction: shell.contr)
|
||||
contraction.pure = false;
|
||||
|
||||
// initializes the Libint integrals library ... now ready to compute
|
||||
libint2::init();
|
||||
|
||||
// construct the electron repulsion integrals engine
|
||||
engine_pointer = new libint2::TwoBodyEngine<libint2::Coulomb> (max_nprim(shells_global), max_l(shells_global), 0);
|
||||
|
||||
shell2bf = map_shell_to_basis_function(shells_global);
|
||||
bf2shell = map_basis_function_to_shell(shells_global);
|
||||
|
||||
}
|
||||
|
||||
void finalize_libint(){
|
||||
libint2::finalize(); // done with libint2
|
||||
}
|
||||
|
||||
int nb_shell(){
|
||||
return shells_global.size();
|
||||
}
|
||||
|
||||
void map_shell_to_basis_function_interval(int sze, int* out_val) {
|
||||
size_t n = 1;
|
||||
for (auto i=0; i<shells_global.size() ; i++) {
|
||||
|
||||
out_val[2*i] = n;
|
||||
n += shells_global[i].size();
|
||||
out_val[2*i+1] = n-1;
|
||||
}
|
||||
}
|
||||
|
||||
double ao_bielec_integral(int bf1f, int bf2f, int bf3f, int bf4f){
|
||||
|
||||
auto bf1 = bf1f-1;
|
||||
auto bf2 = bf2f-1;
|
||||
auto bf3 = bf3f-1;
|
||||
auto bf4 = bf4f-1;
|
||||
|
||||
// construct the electron repulsion integrals engine
|
||||
libint2::TwoBodyEngine<libint2::Coulomb> &engine = *engine_pointer;
|
||||
|
||||
auto s1 = bf2shell[bf1];
|
||||
auto n1 = shells_global[s1].size();
|
||||
auto f1 = bf1-shell2bf[s1];
|
||||
|
||||
auto s2 = bf2shell[bf2];
|
||||
auto n2 = shells_global[s2].size();
|
||||
auto f2 = bf2-shell2bf[s2];
|
||||
|
||||
auto s3 = bf2shell[bf3];
|
||||
auto n3 = shells_global[s3].size();
|
||||
auto f3 = bf3-shell2bf[s3];;
|
||||
|
||||
auto s4 = bf2shell[bf4];
|
||||
auto n4 = shells_global[s4].size();
|
||||
auto f4 = bf4- shell2bf[s4];
|
||||
|
||||
// std::cout << "o: compute shell set {" << s1 << "," << s2 <<"," << s3 <<"," << s4 << "} ... ";
|
||||
const auto* buf_1234 = engine.compute(shells_global[s1], shells_global[s2], shells_global[s3], shells_global[s4]);
|
||||
// std::cout << "done" << std::endl;
|
||||
|
||||
auto f1234 = f1*n2*n3*n4+f2*n3*n4+f3*n4+f4;
|
||||
auto result = buf_1234[f1234];
|
||||
|
||||
return result;
|
||||
|
||||
};
|
||||
|
||||
|
||||
void compute_ao_bielec_integrals_shell(int s1, int s2, int s3, int s4, int sze, double* values){
|
||||
libint2::TwoBodyEngine<libint2::Coulomb> &engine = *engine_pointer;
|
||||
|
||||
const auto* buf_1234 = engine.compute(shells_global[s1-1], shells_global[s2-1], shells_global[s3-1], shells_global[s4-1]);
|
||||
|
||||
for(auto i=0; i!=sze; i++)
|
||||
values[i] = buf_1234[i];
|
||||
};
|
@ -1,51 +0,0 @@
|
||||
module libint_module
|
||||
use iso_c_binding
|
||||
|
||||
implicit none
|
||||
interface
|
||||
subroutine init_libint(str) bind(c,name='init_libint')
|
||||
import :: c_char
|
||||
character(len=1,kind=C_char), dimension(*), intent(in) :: str
|
||||
end subroutine
|
||||
|
||||
integer(c_int) function get_nb_shell() bind(c,name='nb_shell')
|
||||
import :: c_int
|
||||
end function
|
||||
|
||||
subroutine finalize_libint() bind(c,name='finalize_libint')
|
||||
end subroutine
|
||||
|
||||
subroutine map_shell_to_basis_function_interval(sze, out_val) bind(c,name='map_shell_to_basis_function_interval')
|
||||
import :: c_ptr
|
||||
import :: c_int
|
||||
|
||||
integer(c_int), INTENT(IN), value :: sze
|
||||
integer(c_int), INTENT(OUT) :: out_val(sze)
|
||||
end subroutine
|
||||
|
||||
real(c_double) function ao_bielec_integral_libint(i,j,k,l) bind(c,name='ao_bielec_integral')
|
||||
import :: c_int
|
||||
import :: c_double
|
||||
|
||||
integer(c_int), value :: i
|
||||
integer(c_int), value :: j
|
||||
integer(c_int), value :: k
|
||||
integer(c_int), value :: l
|
||||
end function
|
||||
|
||||
subroutine compute_ao_bielec_integrals_shell(i,j,k,l,sze,values) bind(c,name='compute_ao_bielec_integrals_shell')
|
||||
import :: c_ptr
|
||||
import :: c_int
|
||||
import :: c_double
|
||||
|
||||
integer(c_int), value :: i
|
||||
integer(c_int), value :: j
|
||||
integer(c_int), value :: k
|
||||
integer(c_int), value :: l
|
||||
integer(c_int), INTENT(IN), value :: sze
|
||||
real(c_double), INTENT(OUT) :: values(sze)
|
||||
end subroutine
|
||||
|
||||
|
||||
end interface
|
||||
end module libint_module
|
@ -4,5 +4,3 @@ work
|
||||
save
|
||||
empty logical
|
||||
|
||||
libint
|
||||
empty logical
|
||||
|
@ -8,7 +8,8 @@ program qp_ao_ints
|
||||
|
||||
call switch_qp_run_to_master
|
||||
|
||||
PROVIDE zmq_context
|
||||
zmq_context = f77_zmq_ctx_new ()
|
||||
|
||||
! Set the state of the ZMQ
|
||||
zmq_state = 'ao_integrals'
|
||||
|
||||
|
@ -3,10 +3,14 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral, (ao_num_align,ao_num)]
|
||||
BEGIN_DOC
|
||||
! Pseudo-potential
|
||||
END_DOC
|
||||
if (do_pseudo) then
|
||||
ao_pseudo_integral = ao_pseudo_integral_local + ao_pseudo_integral_non_local
|
||||
else
|
||||
ao_pseudo_integral = 0.d0
|
||||
if (do_pseudo) then
|
||||
if (pseudo_klocmax > 0) then
|
||||
ao_pseudo_integral += ao_pseudo_integral_local
|
||||
endif
|
||||
if (pseudo_kmax > 0) then
|
||||
ao_pseudo_integral += ao_pseudo_integral_non_local
|
||||
endif
|
||||
endif
|
||||
END_PROVIDER
|
||||
|
||||
|
@ -1,45 +0,0 @@
|
||||
use libint_module
|
||||
BEGIN_PROVIDER [ logical, has_libint ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! If true, use libint
|
||||
END_DOC
|
||||
character :: y
|
||||
call getenv('QP_LIBINT', y)
|
||||
if (y=='1') then
|
||||
has_libint = .True.
|
||||
call init_libint(trim(ezfio_filename)//char((0)))
|
||||
else
|
||||
PROVIDE ezfio_filename
|
||||
has_libint = .False.
|
||||
endif
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
BEGIN_PROVIDER [ integer, shell_num ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Number of shells
|
||||
END_DOC
|
||||
if (has_libint) then
|
||||
shell_num = get_nb_shell()
|
||||
else
|
||||
stop 'shell_num not implemented without libint'
|
||||
endif
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
|
||||
BEGIN_PROVIDER [ integer, shell_idx, (2,shell_num) ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Contains the 1st and last AO index in each shell
|
||||
END_DOC
|
||||
if (has_libint) then
|
||||
call map_shell_to_basis_function_interval(2*shell_num,shell_idx)
|
||||
else
|
||||
stop 'shell_idx not implemented without libint'
|
||||
endif
|
||||
END_PROVIDER
|
||||
|
||||
|
@ -73,6 +73,10 @@ subroutine ortho_canonical(overlap,LDA,N,C,LDC,m)
|
||||
!DEC$ ATTRIBUTES ALIGN : 64 :: U, Vt, D
|
||||
integer :: info, i, j
|
||||
|
||||
if (n < 2) then
|
||||
return
|
||||
endif
|
||||
|
||||
allocate (U(ldc,n), Vt(lda,n), D(n), S_half(lda,n))
|
||||
|
||||
call svd(overlap,lda,U,ldc,D,Vt,lda,n,n)
|
||||
@ -151,6 +155,10 @@ subroutine ortho_lowdin(overlap,LDA,N,C,LDC,m)
|
||||
!DEC$ ATTRIBUTES ALIGN : 64 :: U, Vt, D
|
||||
integer :: info, i, j, k
|
||||
|
||||
if (n < 2) then
|
||||
return
|
||||
endif
|
||||
|
||||
call svd(overlap,lda,U,ldc,D,Vt,lda,m,n)
|
||||
|
||||
!$OMP PARALLEL DEFAULT(NONE) &
|
||||
|
@ -295,18 +295,6 @@ BEGIN_PROVIDER [ integer, nproc ]
|
||||
!$OMP END PARALLEL
|
||||
END_PROVIDER
|
||||
|
||||
BEGIN_PROVIDER [ integer, iproc_save, (nproc) ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! iproc_save(i) = i-1. Used to start threads with pthreads.
|
||||
END_DOC
|
||||
integer :: i
|
||||
do i=1,nproc
|
||||
iproc_save(i) = i-1
|
||||
enddo
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
|
||||
double precision function u_dot_v(u,v,sze)
|
||||
implicit none
|
||||
@ -324,6 +312,7 @@ double precision function u_dot_v(u,v,sze)
|
||||
t3 = t2+t2
|
||||
t4 = t3+t2
|
||||
u_dot_v = 0.d0
|
||||
!DIR$ VECTOR ALWAYS
|
||||
do i=1,t2
|
||||
u_dot_v = u_dot_v + u(t1+i)*v(t1+i) + u(t2+i)*v(t2+i) + &
|
||||
u(t3+i)*v(t3+i) + u(t4+i)*v(t4+i)
|
||||
@ -359,6 +348,7 @@ double precision function u_dot_u(u,sze)
|
||||
! u_dot_u = u_dot_u+u(i)*u(i)
|
||||
! enddo
|
||||
|
||||
!DIR$ VECTOR ALWAYS
|
||||
do i=1,sze
|
||||
u_dot_u = u_dot_u + u(i)*u(i)
|
||||
enddo
|
||||
|
@ -181,14 +181,14 @@ function new_zmq_pair_socket(bind)
|
||||
endif
|
||||
endif
|
||||
|
||||
rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_SNDHWM, 0, 4)
|
||||
rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_SNDHWM, 1, 4)
|
||||
if (rc /= 0) then
|
||||
stop 'f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_SNDHWM, 0, 4)'
|
||||
stop 'f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_SNDHWM, 1, 4)'
|
||||
endif
|
||||
|
||||
rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_RCVHWM, 0, 4)
|
||||
rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_RCVHWM, 1, 4)
|
||||
if (rc /= 0) then
|
||||
stop 'f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_RCVHWM, 0, 4)'
|
||||
stop 'f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_RCVHWM, 1, 4)'
|
||||
endif
|
||||
|
||||
rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_IMMEDIATE, 1, 4)
|
||||
@ -229,16 +229,11 @@ function new_zmq_pull_socket()
|
||||
stop 'Unable to set ZMQ_LINGER on pull socket'
|
||||
endif
|
||||
|
||||
rc = f77_zmq_setsockopt(new_zmq_pull_socket,ZMQ_RCVHWM,100000,4)
|
||||
rc = f77_zmq_setsockopt(new_zmq_pull_socket,ZMQ_RCVHWM,1000,4)
|
||||
if (rc /= 0) then
|
||||
stop 'Unable to set ZMQ_RCVHWM on pull socket'
|
||||
endif
|
||||
|
||||
rc = f77_zmq_setsockopt(new_zmq_pull_socket,ZMQ_IMMEDIATE,1,4)
|
||||
if (rc /= 0) then
|
||||
stop 'Unable to set ZMQ_IMMEDIATE on pull socket'
|
||||
endif
|
||||
|
||||
rc = f77_zmq_bind(new_zmq_pull_socket, zmq_socket_pull_tcp_address)
|
||||
if (rc /= 0) then
|
||||
print *, 'Unable to bind new_zmq_pull_socket (tcp)', zmq_socket_pull_tcp_address
|
||||
@ -279,7 +274,7 @@ function new_zmq_push_socket(thread)
|
||||
stop 'Unable to set ZMQ_LINGER on push socket'
|
||||
endif
|
||||
|
||||
rc = f77_zmq_setsockopt(new_zmq_push_socket,ZMQ_SNDHWM,100,4)
|
||||
rc = f77_zmq_setsockopt(new_zmq_push_socket,ZMQ_SNDHWM,1000,4)
|
||||
if (rc /= 0) then
|
||||
stop 'Unable to set ZMQ_SNDHWM on push socket'
|
||||
endif
|
||||
@ -361,6 +356,8 @@ subroutine end_zmq_pull_socket(zmq_socket_pull)
|
||||
stop 'error'
|
||||
endif
|
||||
|
||||
call sleep(1) ! see https://github.com/zeromq/libzmq/issues/1922
|
||||
|
||||
rc = f77_zmq_setsockopt(zmq_socket_pull,ZMQ_LINGER,0,4)
|
||||
if (rc /= 0) then
|
||||
stop 'Unable to set ZMQ_LINGER on zmq_socket_pull'
|
||||
|
@ -155,7 +155,7 @@ function run_all_1h_1p() {
|
||||
ezfio set determinants read_wf True
|
||||
qp_run mrcc_cassd $INPUT
|
||||
energy="$(ezfio get mrcc_cassd energy)"
|
||||
eq $energy -76.2284994316618 1.e-4
|
||||
eq $energy -76.2288648023833 1.e-4
|
||||
|
||||
}
|
||||
|
||||
@ -166,7 +166,7 @@ function run_all_1h_1p() {
|
||||
}
|
||||
|
||||
@test "SCF H2O VDZ pseudo" {
|
||||
run_HF h2o_pseudo.ezfio -16.9483708495521
|
||||
run_HF h2o_pseudo.ezfio -16.9483703905461
|
||||
}
|
||||
|
||||
@test "FCI H2O VDZ pseudo" {
|
||||
|
Loading…
Reference in New Issue
Block a user