Skip to content

Commit 849e00b

Browse files
authored
Merge pull request #3 from JacekHoleczek/master
add the libqcdloop 2.x option plus some configure improvements
2 parents 0784865 + 7f87bd2 commit 849e00b

File tree

2 files changed

+232
-34
lines changed

2 files changed

+232
-34
lines changed

configure.ac

+62-25
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ AC_CONFIG_SRCDIR([src/common.h])
4040

4141
AC_CONFIG_AUX_DIR([auxfiles])
4242
AC_CONFIG_MACRO_DIR([m4])
43-
AM_INIT_AUTOMAKE([-Wall -Werror silent-rules foreign])
43+
# Note: "$(shell ...)" is a GNU make extension so it needs "-Wno-portability".
44+
AM_INIT_AUTOMAKE([-Wall -Werror -Wno-portability silent-rules foreign])
4445

4546
AC_CONFIG_HEADERS([config.h])
4647

@@ -52,6 +53,7 @@ AC_PROG_FC
5253
AC_F77_LIBRARY_LDFLAGS
5354
AC_F77_WRAPPERS
5455

56+
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
5557
# AC_PROG_RANLIB
5658
AC_PROG_LIBTOOL
5759

@@ -103,52 +105,87 @@ AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
103105
AC_ARG_WITH([integrals],
104106
[AS_HELP_STRING([--with-integrals],
105107
[library for scalar loop integrals @<:@default=auto@:>@.
106-
@<:@qcdloop1@:>@ tries to use -lqcdloop1.
107-
@<:@oneloop@:>@ tries to use -lavh_olo.
108-
@<:@qcdloop@:>@ use libqcdloop.a and libff.a, CXXFLAGS and LDFLAGS need to be set manually.
108+
@<:@qcdloop2@:>@ tries to use libqcdloop 2.x.
109+
@<:@qcdloop1@:>@ tries to use libqcdloop1.
110+
@<:@oneloop@:>@ tries to use libavh_olo.
111+
@<:@qcdloop@:>@ tries to use libqcdloop 1.x (and libff), CXXFLAGS and LDFLAGS need to be set manually.
109112
])],
110113
[test "x$with_integrals" == "xyes" && with_integrals=auto],
111114
[with_integrals=auto])
112115

113116
case $with_integrals in
114117
auto)
115-
AC_CHECK_LIB([qcdloop1], [qlinit_],[LIBS="$LIBS -lqcdloop1" use_qcdloop1=yes])
116-
AC_CHECK_HEADERS([qcdloop1.h])
117-
if test "x$use_qcdloop1" == "xyes" ; then
118-
AC_DEFINE(USE_QCDLOOP,"1",[use libqcdloop for scalar integrals])
119-
else
118+
library_auto_found="no"
119+
if test "x$library_found" != "xyes" ; then
120+
# QCDLoop 2.x
121+
AC_CHECK_PROG([use_qcdloop2], [qcdloop-config], [yes], [no])
122+
if test "x$use_qcdloop2" == "xyes" ; then
123+
library_auto_found="yes"
124+
AC_DEFINE(USE_QCDLOOP2,"1",[use libqcdloop 2.x for scalar integrals])
125+
CPPFLAGS="-std=c++11 `qcdloop-config --cppflags` $CPPFLAGS" # "qcdloop/qcdloop.h" needs "-std=c++11" or newer
126+
# LDLIBS="$LDLIBS `qcdloop-config --ldflags`"
127+
LIBS="$LIBS `qcdloop-config --ldflags`"
128+
fi
129+
fi
130+
if test "x$library_auto_found" != "xyes" ; then
131+
# QCDLoop1 / FF
132+
AC_CHECK_LIB([qcdloop1], [qlinit_],[LIBS="$LIBS -lqcdloop1" use_qcdloop1=yes])
133+
AC_CHECK_HEADERS([qcdloop1.h])
134+
if test "x$use_qcdloop1" == "xyes" ; then
135+
library_auto_found="yes"
136+
AC_DEFINE(USE_QCDLOOP,"1",[use libqcdloop1 for scalar integrals])
137+
fi
138+
fi
139+
if test "x$library_auto_found" != "xyes" ; then
140+
# OneLOop
141+
AC_F77_FUNC(avh_olo_mu_set)
142+
AC_CHECK_LIB([avh_olo], [$avh_olo_mu_set],[LIBS="$LIBS -lavh_olo" use_oneloop=yes],[],[$FLIBS])
143+
if test "x$use_oneloop" == "xyes" ; then
144+
library_auto_found="yes"
145+
AC_DEFINE(USE_ONELOOP,"1",[use libavh_olo for scalar integrals])
146+
fi
147+
fi
148+
if test "x$library_auto_found" != "xyes" ; then
149+
# QCDLoop 1.x / FF
120150
AC_F77_FUNC(qlinit)
121-
AC_CHECK_LIB([qcdloop], [$qlinit],[LIBS="$LIBS -lff -lqcdloop" use_qcdloop=yes],[],[-lff $FLIBS])
151+
AC_CHECK_LIB([qcdloop], [$qlinit],[LIBS="$LIBS -lqcdloop -lff" use_qcdloop=yes],[],[-lff $FLIBS])
122152
if test "x$use_qcdloop" == "xyes" ; then
123-
AC_DEFINE(USE_QCDLOOP,"1",[use libqcdloop for scalar integrals])
124-
else
125-
AC_F77_FUNC(avh_olo_mu_set)
126-
AC_CHECK_LIB([avh_olo], [$avh_olo_mu_set],[LIBS="$LIBS -lavh_olo" use_oneloop=yes],[],[$FLIBS])
127-
if test "x$use_oneloop" == "xyes" ; then
128-
AC_DEFINE(USE_ONELOOP,"1",[use libavh_olo for scalar integrals])
129-
else
130-
AC_MSG_ERROR([can't find usable scalar integrals library])
131-
fi
153+
library_auto_found="yes"
154+
AC_DEFINE(USE_QCDLOOP,"1",[use libqcdloop 1.x for scalar integrals])
132155
fi
133156
fi
157+
if test "x$library_auto_found" != "xyes" ; then
158+
AC_MSG_ERROR([can't automatically find usable scalar integrals library])
159+
fi
160+
;;
161+
qcdloop2) # QCDLoop 2.x
162+
AC_CHECK_PROG([use_qcdloop2], [qcdloop-config], [yes], [no])
163+
if test "x$use_qcdloop2" == "xyes" ; then
164+
AC_DEFINE(USE_QCDLOOP2,"1",[use libqcdloop 2.x for scalar integrals])
165+
CPPFLAGS="-std=c++11 `qcdloop-config --cppflags` $CPPFLAGS" # "qcdloop/qcdloop.h" needs "-std=c++11" or newer
166+
# LDLIBS="$LDLIBS `qcdloop-config --ldflags`"
167+
LIBS="$LIBS `qcdloop-config --ldflags`"
168+
else
169+
AC_MSG_ERROR([qcdloop-config is missing])
170+
fi
134171
;;
135-
qcdloop1)
172+
qcdloop1) # QCDLoop1 / FF
136173
AC_CHECK_LIB([qcdloop1], [qlinit_],
137-
[LIBS="$LIBS -lqcdloop1" use_qcdloop1=yes AC_DEFINE(USE_QCDLOOP,"1",[use libqcdloop for scalar integrals])],
174+
[LIBS="$LIBS -lqcdloop1" use_qcdloop1=yes AC_DEFINE(USE_QCDLOOP,"1",[use libqcdloop1 for scalar integrals])],
138175
[AC_MSG_ERROR([libqcdloop1 library is missing])])
139176
AC_CHECK_HEADERS([qcdloop1.h])
140177
;;
141-
oneloop)
178+
oneloop) # OneLOop
142179
AC_F77_FUNC(avh_olo_mu_set)
143180
AC_CHECK_LIB([avh_olo], [$avh_olo_mu_set],
144181
[LIBS="$LIBS -lavh_olo" use_oneloop=yes AC_DEFINE(USE_ONELOOP,"1",[use libavh_olo for scalar integrals])],
145182
[AC_MSG_ERROR([libavh_olo library is missing])],[$FLIBS])
146183
;;
147-
qcdloop)
184+
qcdloop) # QCDLoop 1.x / FF
148185
AC_F77_FUNC(qlinit)
149186
AC_CHECK_LIB([qcdloop], [$qlinit],
150-
[LIBS="$LIBS -lff -lqcdloop" use_qcdloop=yes AC_DEFINE(USE_QCDLOOP,"1",[use libqcdloop for scalar integrals])],
151-
[AC_MSG_ERROR([libqcdloop library is missing])],[-lff $FLIBS])
187+
[LIBS="$LIBS -lqcdloop -lff" use_qcdloop=yes AC_DEFINE(USE_QCDLOOP,"1",[use libqcdloop 1.x for scalar integrals])],
188+
[AC_MSG_ERROR([libqcdloop 1.x library is missing])],[-lff $FLIBS])
152189
;;
153190
*)
154191
AC_MSG_ERROR([Bad value for --with-integrals: $with_integrals])

src/integral.cpp

+170-9
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,172 @@
33
*
44
* this file is part of PJFry library
55
* Copyright 2011 Valery Yundin
6+
*
7+
* QCDLoop 2.x interface by Jacek M. Holeczek 2020.01.31
68
*/
79

810
#include "integral.h"
911
#include "minor.h"
1012
#include "cache.h"
1113

12-
static Initialize pjinit=Initialize();
14+
static Initialize pjinit;
15+
16+
//
17+
// QCDLoop 2.x
18+
//
19+
#ifdef USE_QCDLOOP2
20+
// the same identifier is defined in "PJFry/config.h" and "qcdloop/config.h"
21+
// #if defined(VERSION)
22+
// #undef VERSION
23+
// #endif /* defined(VERSION) */
24+
25+
#include "qcdloop/qcdloop.h" // needs "-std=c++11" or newer
26+
#include <stdexcept>
27+
#include <iostream>
28+
29+
Initialize::Initialize() {
30+
#ifndef NDEBUG
31+
std::cout << std::endl << "PJFRY init" << std::endl;
32+
#endif
33+
}
34+
35+
Initialize::~Initialize() {}
36+
37+
ICache::Ival qlI1(const Kinem1 &k) {
38+
static ql::TadPole<ql::complex, double, double> td;
39+
static std::vector<double> mI1(1);
40+
static std::vector<ql::complex> r(3);
41+
ICache::Ival ivalue;
42+
43+
try {
44+
mI1[0] = k.m1();
45+
td.integral(r, ICache::getMu2(), mI1);
46+
} catch (std::exception &e) {
47+
std::cout << e.what() << std::endl;
48+
exit(-1);
49+
}
50+
51+
ivalue.val[0] = r[0];
52+
ivalue.val[1] = r[1];
53+
ivalue.val[2] = r[2];
54+
return ivalue;
55+
}
56+
57+
ICache::Ival qlI2(const Kinem2 &k) {
58+
static ql::Bubble<ql::complex, double, double> bb;
59+
static std::vector<double> mI2(2);
60+
static std::vector<double> pI2(1);
61+
static std::vector<ql::complex> r(3);
62+
ICache::Ival ivalue;
63+
64+
try {
65+
mI2[0] = k.m1();
66+
mI2[1] = k.m2();
67+
pI2[0] = k.p1();
68+
bb.integral(r, ICache::getMu2(), mI2, pI2);
69+
} catch (std::exception &e) {
70+
std::cout << e.what() << std::endl;
71+
exit(-1);
72+
}
73+
74+
ivalue.val[0] = r[0];
75+
ivalue.val[1] = r[1];
76+
ivalue.val[2] = r[2];
77+
return ivalue;
78+
}
79+
80+
ICache::Ival qlI3(const Kinem3 &k) {
81+
static ql::Triangle<ql::complex, double, double> tr;
82+
static std::vector<double> mI3(3);
83+
static std::vector<double> pI3(3);
84+
static std::vector<ql::complex> r(3);
85+
ICache::Ival ivalue;
86+
87+
try {
88+
mI3[0] = k.m1();
89+
mI3[1] = k.m2();
90+
mI3[2] = k.m3();
91+
pI3[0] = k.p1();
92+
pI3[1] = k.p2();
93+
pI3[2] = k.p3();
94+
tr.integral(r, ICache::getMu2(), mI3, pI3);
95+
} catch (std::exception &e) {
96+
std::cout << e.what() << std::endl;
97+
exit(-1);
98+
}
99+
100+
ivalue.val[0] = r[0];
101+
ivalue.val[1] = r[1];
102+
ivalue.val[2] = r[2];
103+
return ivalue;
104+
}
105+
106+
ICache::Ival qlI4(const Kinem4 &k) {
107+
static ql::Box<ql::complex, double, double> bo;
108+
static std::vector<double> mI4(4);
109+
static std::vector<double> pI4(6);
110+
static std::vector<ql::complex> r(3);
111+
ICache::Ival ivalue;
112+
113+
try {
114+
if (k.s12() == 0. || k.s23() == 0.) {
115+
if (k.p1() != 0. && k.p3() != 0.) {
116+
mI4[0] = k.m1();
117+
mI4[1] = k.m3();
118+
mI4[2] = k.m2();
119+
mI4[3] = k.m4();
120+
pI4[0] = k.s12();
121+
pI4[1] = k.p2();
122+
pI4[2] = k.s23();
123+
pI4[3] = k.p4();
124+
pI4[4] = k.p1();
125+
pI4[5] = k.p3();
126+
} else if (k.p2() != 0. && k.p4() != 0.) {
127+
mI4[0] = k.m2();
128+
mI4[1] = k.m4();
129+
mI4[2] = k.m3();
130+
mI4[3] = k.m1();
131+
pI4[0] = k.s23();
132+
pI4[1] = k.p3();
133+
pI4[2] = k.s12();
134+
pI4[3] = k.p1();
135+
pI4[4] = k.p2();
136+
pI4[5] = k.p4();
137+
} else { assert(0); }
138+
} else {
139+
mI4[0] = k.m1();
140+
mI4[1] = k.m2();
141+
mI4[2] = k.m3();
142+
mI4[3] = k.m4();
143+
pI4[0] = k.p1();
144+
pI4[1] = k.p2();
145+
pI4[2] = k.p3();
146+
pI4[3] = k.p4();
147+
pI4[4] = k.s12();
148+
pI4[5] = k.s23();
149+
}
150+
bo.integral(r, ICache::getMu2(), mI4, pI4);
151+
} catch (std::exception &e) {
152+
std::cout << e.what() << std::endl;
153+
exit(-1);
154+
}
155+
156+
ivalue.val[0] = r[0];
157+
ivalue.val[1] = r[1];
158+
ivalue.val[2] = r[2];
159+
return ivalue;
160+
}
161+
#endif /* USE_QCDLOOP2 */
13162

163+
//
164+
// QCDLoop1 and QCDLoop 1.x / FF
165+
//
14166
#ifdef USE_QCDLOOP
15167
Initialize::Initialize()
16168
{
169+
#ifndef NDEBUG
17170
printf("PJFRY init\n");
171+
#endif
18172
const double dbl_min=std::numeric_limits<double>::min();
19173

20174
F77_FUNC(qlinit,QLINIT)();
@@ -228,21 +382,34 @@ ICache::Ival qlI4(const Kinem4& k)
228382
ivalue.val[2]=F77_FUNC(qli4,QLI4)(&p1, &p2, &p3, &p4, &s12, &s23, &m1, &m2, &m3, &m4, &mu2, &ep);
229383
# endif
230384
}
385+
231386
return ivalue;
232387
}
233-
234388
#endif /* USE_QCDLOOP */
235389

390+
//
391+
// OneLOop
392+
//
236393
#ifdef USE_ONELOOP
237394
Initialize::Initialize()
238395
{
396+
#ifndef NDEBUG
239397
printf("PJFRY init\n");
398+
#endif
240399

241400
double mu=sqrt(ICache::getMu2());
242401
F77_FUNC_(avh_olo_mu_set,AVH_OLO_MU_SET)(&mu);
243402

244403
double thrs=Minor5::getmeps();
245404
F77_FUNC_(avh_olo_onshell,AVH_OLO_ONSHELL)(&thrs);
405+
#ifndef NDEBUG
406+
printf("Set avh_olo_onshell threshold value to %e\n", thrs);
407+
#endif
408+
}
409+
410+
Initialize::~Initialize()
411+
{
412+
/* NOOP */
246413
}
247414

248415
ICache::Ival qlI1(const Kinem1& k)
@@ -324,10 +491,4 @@ ICache::Ival qlI4(const Kinem4& k)
324491
ivalue.val[2]=rslt[2];
325492
return ivalue;
326493
}
327-
328-
Initialize::~Initialize()
329-
{
330-
/* NOOP */
331-
}
332-
333-
#endif /* USE_QCDLOOP1 */
494+
#endif /* USE_ONELOOP */

0 commit comments

Comments
 (0)