Merge lp:~maddevelopers/mg5amcnlo/COLLIER into lp:~maddevelopers/mg5amcnlo/2.4.1

Proposed by Valentin Hirschi
Status: Superseded
Proposed branch: lp:~maddevelopers/mg5amcnlo/COLLIER
Merge into: lp:~maddevelopers/mg5amcnlo/2.4.1
Diff against target: 28088 lines (+18883/-1449)
162 files modified
MadSpin/decay.py (+28/-8)
Template/LO/Source/make_opts (+4/-4)
Template/LO/SubProcesses/genps.f (+1/-1)
Template/LO/SubProcesses/myamp.f (+1/-1)
Template/LO/SubProcesses/refine.sh (+40/-13)
Template/LO/SubProcesses/setcuts.f (+226/-88)
Template/NLO/SubProcesses/BinothLHA.f (+8/-4)
Template/NLO/SubProcesses/check_poles.f (+2/-0)
Template/NLO/SubProcesses/makefile_loop.inc (+1/-0)
Template/loop_material/StandAlone/Cards/MadLoopParams.dat (+81/-12)
Template/loop_material/StandAlone/SubProcesses/MadLoopCommons.inc (+151/-6)
Template/loop_material/StandAlone/SubProcesses/MadLoopParamReader.f (+62/-7)
Template/loop_material/StandAlone/SubProcesses/MadLoopParams.inc (+12/-5)
Template/loop_material/StandAlone/SubProcesses/makefile (+2/-0)
UpdateNotes.txt (+15/-2)
VERSION (+2/-2)
input/.mg5_configuration_default.txt (+7/-2)
madgraph/interface/amcatnlo_run_interface.py (+19/-14)
madgraph/interface/common_run_interface.py (+10/-6)
madgraph/interface/extended_cmd.py (+3/-1)
madgraph/interface/loop_interface.py (+4/-2)
madgraph/interface/madevent_interface.py (+52/-34)
madgraph/interface/madgraph_interface.py (+34/-8)
madgraph/iolibs/export_fks.py (+42/-12)
madgraph/iolibs/export_v4.py (+58/-18)
madgraph/iolibs/template_files/loop/check_sa.inc (+1/-0)
madgraph/iolibs/template_files/loop/check_sa_loop_induced.inc (+1/-0)
madgraph/iolibs/template_files/loop_optimized/COLLIER_interface.inc (+646/-0)
madgraph/iolibs/template_files/loop_optimized/CT_interface.inc (+8/-8)
madgraph/iolibs/template_files/loop_optimized/GOLEM_interface.inc (+2/-2)
madgraph/iolibs/template_files/loop_optimized/TIR_interface.inc (+36/-13)
madgraph/iolibs/template_files/loop_optimized/loop_matrix_standalone.inc (+102/-16)
madgraph/iolibs/template_files/matrix_loop_induced_madevent.inc (+4/-1)
madgraph/iolibs/template_files/matrix_loop_induced_madevent_group.inc (+4/-1)
madgraph/loop/loop_exporters.py (+129/-26)
madgraph/madevent/gen_ximprove.py (+1/-0)
madgraph/madevent/sum_html.py (+5/-2)
madgraph/various/banner.py (+20/-6)
madgraph/various/cluster.py (+2/-0)
madgraph/various/lhe_parser.py (+53/-39)
madgraph/various/misc.py (+8/-1)
madgraph/various/process_checks.py (+53/-13)
madgraph/various/q_polynomial.py (+14/-0)
tests/IOTests.py (+1/-1)
tests/acceptance_tests/test_cmd.py (+1/-0)
tests/acceptance_tests/test_histograms.py (+0/-1)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%COLLIER_interface.f (+693/-0)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%CT_interface.f (+6/-3)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%GOLEM_interface.f (+2/-1)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%TIR_interface.f (+10/-4)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%loop_matrix.f (+116/-10)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%mp_compute_loop_coefs.f (+13/-3)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_udx_wp%V0_udx_wp%COLLIER_interface.f (+693/-0)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_udx_wp%V0_udx_wp%CT_interface.f (+6/-3)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_udx_wp%V0_udx_wp%GOLEM_interface.f (+2/-1)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_udx_wp%V0_udx_wp%TIR_interface.f (+10/-4)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_udx_wp%V0_udx_wp%check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_udx_wp%V0_udx_wp%loop_matrix.f (+116/-10)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_udx_wp%V0_udx_wp%mp_compute_loop_coefs.f (+13/-3)
tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_udx_wp%V0_udx_wp%unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/LoopSquaredOrder_IOTest/Loop_sqso_uux_ddx/loop_matrix_QCDQEDpert_QCDsq_eq_4.f (+116/-10)
tests/input_files/IOTestsComparison/LoopSquaredOrder_IOTest/Loop_sqso_uux_ddx/loop_matrix_QCDQEDpert_QCDsq_gt_0_QEDAmpAndQEDsq_gt_2.f (+116/-10)
tests/input_files/IOTestsComparison/LoopSquaredOrder_IOTest/Loop_sqso_uux_ddx/loop_matrix_QCDQEDpert_QCDsq_gt_4.f (+116/-10)
tests/input_files/IOTestsComparison/LoopSquaredOrder_IOTest/Loop_sqso_uux_ddx/loop_matrix_QCDQEDpert_QEDsq_le_4.f (+116/-10)
tests/input_files/IOTestsComparison/LoopSquaredOrder_IOTest/Loop_sqso_uux_ddx/loop_matrix_QCDQEDpert_WGTsq_le_10_QEDAmpAndQEDsq_gt_2.f (+116/-10)
tests/input_files/IOTestsComparison/LoopSquaredOrder_IOTest/Loop_sqso_uux_ddx/loop_matrix_QCDQEDpert_default.f (+116/-10)
tests/input_files/IOTestsComparison/LoopSquaredOrder_IOTest/Loop_sqso_uux_ddx/loop_matrix_QCDpert_default.f (+116/-10)
tests/input_files/IOTestsComparison/LoopSquaredOrder_IOTest/Loop_sqso_uux_ddx/loop_matrix_QEDpert_default.f (+116/-10)
tests/input_files/IOTestsComparison/MadLoop_output_from_the_interface/TIR_output/%ggttx_IOTest%SubProcesses%MadLoopCommons.f (+140/-8)
tests/input_files/IOTestsComparison/MadLoop_output_from_the_interface/TIR_output/%ggttx_IOTest%SubProcesses%MadLoopParamReader.f (+62/-7)
tests/input_files/IOTestsComparison/MadLoop_output_from_the_interface/TIR_output/%ggttx_IOTest%SubProcesses%P0_gg_ttx%COLLIER_interface.f (+701/-0)
tests/input_files/IOTestsComparison/MadLoop_output_from_the_interface/TIR_output/%ggttx_IOTest%SubProcesses%P0_gg_ttx%CT_interface.f (+6/-3)
tests/input_files/IOTestsComparison/MadLoop_output_from_the_interface/TIR_output/%ggttx_IOTest%SubProcesses%P0_gg_ttx%GOLEM_interface.f (+2/-1)
tests/input_files/IOTestsComparison/MadLoop_output_from_the_interface/TIR_output/%ggttx_IOTest%SubProcesses%P0_gg_ttx%TIR_interface.f (+11/-4)
tests/input_files/IOTestsComparison/MadLoop_output_from_the_interface/TIR_output/%ggttx_IOTest%SubProcesses%P0_gg_ttx%check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/MadLoop_output_from_the_interface/TIR_output/%ggttx_IOTest%SubProcesses%P0_gg_ttx%loop_matrix.f (+116/-10)
tests/input_files/IOTestsComparison/MadLoop_output_from_the_interface/TIR_output/%ggttx_IOTest%SubProcesses%P0_gg_ttx%mp_compute_loop_coefs.f (+13/-3)
tests/input_files/IOTestsComparison/TestCmdMatchBox/MatchBoxOutput/%TEST%SubProcesses%P1_uux_uux%COLLIER_interface.f (+693/-0)
tests/input_files/IOTestsComparison/TestCmdMatchBox/MatchBoxOutput/%TEST%SubProcesses%P1_uux_uux%CT_interface.f (+6/-3)
tests/input_files/IOTestsComparison/TestCmdMatchBox/MatchBoxOutput/%TEST%SubProcesses%P1_uux_uux%GOLEM_interface.f (+2/-1)
tests/input_files/IOTestsComparison/TestCmdMatchBox/MatchBoxOutput/%TEST%SubProcesses%P1_uux_uux%TIR_interface.f (+11/-4)
tests/input_files/IOTestsComparison/TestCmdMatchBox/MatchBoxOutput/%TEST%SubProcesses%P1_uux_uux%check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/TestCmdMatchBox/MatchBoxOutput/%TEST%SubProcesses%P1_uux_uux%loop_matrix.f (+116/-10)
tests/input_files/IOTestsComparison/TestCmdMatchBox/MatchBoxOutput/%TEST%SubProcesses%P1_uux_uux%mp_compute_loop_coefs.f (+13/-3)
tests/input_files/IOTestsComparison/TestCmdMatchBox/MatchBoxOutput/%TEST%SubProcesses%P1_uux_uux%unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/long_ML_SMQCD_default/dux_mumvmxg/check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/long_ML_SMQCD_default/dux_mumvmxg/unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/long_ML_SMQCD_default/gg_wmtbx/check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/long_ML_SMQCD_default/gg_wmtbx/unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/long_ML_SMQCD_optimized/dux_mumvmxg/CT_interface.f (+2/-1)
tests/input_files/IOTestsComparison/long_ML_SMQCD_optimized/dux_mumvmxg/TIR_interface.f (+11/-4)
tests/input_files/IOTestsComparison/long_ML_SMQCD_optimized/dux_mumvmxg/check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/long_ML_SMQCD_optimized/dux_mumvmxg/loop_matrix.f (+111/-10)
tests/input_files/IOTestsComparison/long_ML_SMQCD_optimized/dux_mumvmxg/unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/long_ML_SMQCD_optimized/gg_wmtbx/CT_interface.f (+2/-1)
tests/input_files/IOTestsComparison/long_ML_SMQCD_optimized/gg_wmtbx/TIR_interface.f (+11/-4)
tests/input_files/IOTestsComparison/long_ML_SMQCD_optimized/gg_wmtbx/check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/long_ML_SMQCD_optimized/gg_wmtbx/loop_matrix.f (+111/-10)
tests/input_files/IOTestsComparison/long_ML_SMQCD_optimized/gg_wmtbx/unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/short_ML_SMQCD_LoopInduced/gg_hh/check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/short_ML_SMQCD_LoopInduced/gg_hh/unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/short_ML_SMQCD_default/ddx_ttx/check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/short_ML_SMQCD_default/ddx_ttx/unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/short_ML_SMQCD_default/gg_ttx/check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/short_ML_SMQCD_default/gg_ttx/unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/short_ML_SMQCD_optimized/ddx_ttx/CT_interface.f (+2/-1)
tests/input_files/IOTestsComparison/short_ML_SMQCD_optimized/ddx_ttx/TIR_interface.f (+11/-4)
tests/input_files/IOTestsComparison/short_ML_SMQCD_optimized/ddx_ttx/check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/short_ML_SMQCD_optimized/ddx_ttx/loop_matrix.f (+111/-10)
tests/input_files/IOTestsComparison/short_ML_SMQCD_optimized/ddx_ttx/unique_id.inc (+2/-0)
tests/input_files/IOTestsComparison/short_ML_SMQCD_optimized/gg_ttx/CT_interface.f (+2/-1)
tests/input_files/IOTestsComparison/short_ML_SMQCD_optimized/gg_ttx/TIR_interface.f (+11/-4)
tests/input_files/IOTestsComparison/short_ML_SMQCD_optimized/gg_ttx/check_sa.f (+2/-0)
tests/input_files/IOTestsComparison/short_ML_SMQCD_optimized/gg_ttx/loop_matrix.f (+111/-10)
tests/input_files/IOTestsComparison/short_ML_SMQCD_optimized/gg_ttx/unique_id.inc (+2/-0)
tests/parallel_tests/test_ML5.py (+1/-2)
tests/time_db (+230/-229)
tests/unit_tests/iolibs/test_export_v4.py (+6/-3)
vendor/CutTools/src/avh/avh_olo.f90 (+425/-425)
vendor/CutTools/src/cts/cts_cutroutines.f90 (+1/-1)
vendor/CutTools/src/cts/cts_cuttools.f90 (+2/-2)
vendor/CutTools/src/cts/cts_loopfunctions.f90 (+2/-2)
vendor/IREGI/src/makefile_ML5_lib (+11/-8)
vendor/IREGI/src/mis_warp.f90 (+1/-1)
vendor/IREGI/src/oneloop/ONI/example/example.f (+4/-4)
vendor/IREGI/src/oneloop/avh_olo_foriregi.f90 (+11045/-0)
vendor/IREGI/src/oneloop/example/example.f (+4/-4)
vendor/IREGI/src/oneloop/example_arprec/f_test.f (+4/-4)
vendor/IREGI/src/oneloop/example_ddfun90/example.f (+4/-4)
vendor/IREGI/src/oneloop/example_mpfun90/example.f (+4/-4)
vendor/IREGI/src/oneloop/example_qdcpp/f_test.f (+4/-4)
vendor/IREGI/src/oneloop/src/avh_olo_a0.h90 (+1/-1)
vendor/IREGI/src/oneloop/src/avh_olo_an.h90 (+1/-1)
vendor/IREGI/src/oneloop/src/avh_olo_arprec.f90 (+3/-3)
vendor/IREGI/src/oneloop/src/avh_olo_arrays.f90 (+3/-3)
vendor/IREGI/src/oneloop/src/avh_olo_auxfun.f90 (+3/-3)
vendor/IREGI/src/oneloop/src/avh_olo_b0.h90 (+1/-1)
vendor/IREGI/src/oneloop/src/avh_olo_b11.h90 (+1/-1)
vendor/IREGI/src/oneloop/src/avh_olo_bn.h90 (+1/-1)
vendor/IREGI/src/oneloop/src/avh_olo_bnlog.f90 (+7/-7)
vendor/IREGI/src/oneloop/src/avh_olo_box.f90 (+7/-7)
vendor/IREGI/src/oneloop/src/avh_olo_boxc.f90 (+6/-6)
vendor/IREGI/src/oneloop/src/avh_olo_bub.f90 (+6/-6)
vendor/IREGI/src/oneloop/src/avh_olo_c0.h90 (+2/-2)
vendor/IREGI/src/oneloop/src/avh_olo_comb.f90 (+25/-25)
vendor/IREGI/src/oneloop/src/avh_olo_d0.h90 (+2/-2)
vendor/IREGI/src/oneloop/src/avh_olo_ddfun90.f90 (+2/-2)
vendor/IREGI/src/oneloop/src/avh_olo_dilog.f90 (+8/-8)
vendor/IREGI/src/oneloop/src/avh_olo_intrinsic.f90 (+3/-3)
vendor/IREGI/src/oneloop/src/avh_olo_kinds.f90 (+1/-1)
vendor/IREGI/src/oneloop/src/avh_olo_main.f90 (+9/-9)
vendor/IREGI/src/oneloop/src/avh_olo_mpfun90.f90 (+3/-3)
vendor/IREGI/src/oneloop/src/avh_olo_olog.f90 (+6/-6)
vendor/IREGI/src/oneloop/src/avh_olo_print.f90 (+2/-2)
vendor/IREGI/src/oneloop/src/avh_olo_qdcpp.f90 (+2/-2)
vendor/IREGI/src/oneloop/src/avh_olo_qmplx.f90 (+6/-6)
vendor/IREGI/src/oneloop/src/avh_olo_tri.f90 (+6/-6)
vendor/IREGI/src/oneloop/src/avh_olo_units.f90 (+1/-1)
vendor/IREGI/src/oneloop/src/avh_olo_version.f90 (+1/-1)
vendor/IREGI/src/oneloop/src/avh_olo_wrp01.f90 (+14/-14)
To merge this branch: bzr merge lp:~maddevelopers/mg5amcnlo/COLLIER
Reviewer Review Type Date Requested Status
Olivier Mattelaer Needs Fixing
marco zaro Pending
Rikkert Frederix Pending
davide.pagani.85 Pending
Hua-Sheng Shao Pending
Review via email: mp+295787@code.launchpad.net

This proposal has been superseded by a proposal from 2016-06-24.

Description of the change

This branch introduces the longed-for interface to COLLIER!

All tests pass (incl. the comparison with the multitude of benchmark processes) and MG5aMC user can now effortlessly use COLLIER for all the applications that can involve MadLoop.

So please give it a try simply by running a couple of loop processes with different setup, and after having installed COLLIER with

MG5_aMC> install collier

Regarding performances, COLLIER holds up to its promises (when properly using its global caching system). I compiled a tex document that summarizes the profiling I did so far:

https://drive.google.com/open?id=0By4qXx23HZGESkU2c0RMQ0J1RGs

In summary, we observe that:

a) COLLIER is faster than CutTools but slower than Ninja, although one must keep in mind that Ninja's timings must be doubled in practice for the stability test.

b) COLLIER scales worse than integrand reduction with the rank of the loop *and its multiplicity* (and significantly so, something I had not appreciated before). This is striking when looking at the timings of the 2 > 6 process. But it is nice that the COLI branch of COLLIER has no hard limitation in rank or multiplicity.

c) COLLIER's stability is indeed astonishing! The numerical stability plots speak for themselves... And this was not even for the most difficult processes we can generate with MadLoop (see http://arxiv.org/pdf/1604.01363.pdf). However, COLLIER's internal stability assessment is quite a bit over-conservative.

Finally, there are a number of new COLLIER-related parameters that you can find at the end of the MadLoopParams.dat card (please have a look). Speaking of which, notice that I decided to change the default value of the following three existing MadLoop parameters starting from this version:

    a) NRotationsDP 1-> 0
       We have been using that for quite some time and it doubles
       MadLoop runtime. I think we now have enough confidence in the
       loop direction stability test to drop it.

    b) COLLIERUseInternalStabilityTest False -> True
       Even though for complicated processes this test seems to
       overshoot the actual stability by up to 5 digits, it seems to never
       undershoots it, so it is safe to rely on it and it comes in at no
       additional computational time.
       So we can use it and if at some point too many unstable PS point show
       (but that should almost never occur) with COLLIER, then we can turn this off
       and fall back on the loop-direction stability test instead.

    c) UseQPIntegrandForNinja False -> True
       For complicated processes where a lot of points need stability rescuing
       with Ninja, it turns out that quad. prec. in the integrand can
       significantly increases the accuracy (up to 4-5 digits), so it
       is actually better to leave this on, especially since we
       now have COLLIER first.

Let me know your comments/questions on the above, the interface and the code if you want to look at it.

Cheers

To post a comment you must log in.
Revision history for this message
Olivier Mattelaer (olivier-mattelaer) wrote :

Hi Valentin,

This is so cool.
I did not have the time to check yet but this is some first comment:

1) I would refrain to include this in 2.4.1, mainly because I want to have that version as bug fix only and be released very very soon (in max two weeks).

2) I do not understand the reason "UseQPIntegrandForNinja False -> True". You said "especially since we now have COLLIER first." This is actually not really True 99% of the user will not install collier and your option should reflect that scenario (or you update your option according to the tool available which can be really interesting.

Cheers,

Olivier

Revision history for this message
Valentin Hirschi (valentin-hirschi) wrote :

Hi Olivier,

On Thu, May 26, 2016 at 2:03 AM, Olivier Mattelaer <
<email address hidden>> wrote:

> Hi Valentin,
>
> This is so cool.
> I did not have the time to check yet but this is some first comment:
>
> 1) I would refrain to include this in 2.4.1, mainly because I want to have
> that version as bug fix only and be released very very soon (in max two
> weeks).
>

I understand. But I think that this implementation is fairly robust as it
doesn't modify anything else except MadLoop's output (to the exception of
the 'unique_id' additional option to generate_subrpocess_v4).
But still, I understand if you would rather delay it, just for safety; I'm
ok with this.

> 2) I do not understand the reason "UseQPIntegrandForNinja False -> True".
> You said "especially since we now have COLLIER first." This is actually not
> really True 99% of the user will not install collier and your option should
> reflect that scenario (or you update your option according to the tool
> available which can be really interesting.
>

I will have COLLIER installed by default from a local copy that can then be
updated at any point by the user from the online tarball using the command
'install collier'. (I'll ask D&D for their consent on this first, event
though the tool is public, just to be politically correct). Basically, the
same strategy as I used for Ninja.
And COLLIER has *no dependence*, is in plain fortran90 and only needs a
minute or so to install. So yes, everybody will have it :).

Regarding the order, I think I want to still keep Ninja first, then
followed by COLLIER and finally CutTools (though it should almost never get
there anymore).

Cheers,

>
> Cheers,
>
> Olivier
>
>
> --
> https://code.launchpad.net/~maddevelopers/mg5amcnlo/COLLIER/+merge/295787
> Your team MadDevelopers is subscribed to branch
> lp:~maddevelopers/mg5amcnlo/2.4.1.
>

--
Valentin

lp:~maddevelopers/mg5amcnlo/COLLIER updated
423. By Valentin Hirschi

1. Fixed a small issue in the check profile function.

424. By Valentin Hirschi

1. Added '--collier_mode=' option to the checks.
2. Fixed the propagation of COLLIER's internal numerical accuracy error estimate.

425. By Valentin Hirschi

1. Improved the propagation of COLLIER accuracy internal estimate which now only falls 1 order of magnitude short typically.

426. By Valentin Hirschi

1. Added local automatic installation of COLLIER.
2. 'Fixed' rank 7+ reduction by COLLIER by turning off all caches system temporarily.

Revision history for this message
Olivier Mattelaer (olivier-mattelaer) wrote :

Hi Valentin,

I wanted to start this review today. But I was stop quickly:

Enter COLLIER directory and installing COLLIER
/Users/omatt/Documents/eclipse/COLLIER/HEPTools/HEPToolsInstallers/installCOLLIER.sh: line 14: cmake: command not found
make: *** No targets specified and no makefile found. Stop.
Copying the static library and modules generated to target directory
cp: libcollier.a: No such file or directory
cp: modules/*.mod: No such file or directory
Finished installing COLLIER

Cheers,

Olivier

review: Needs Fixing
lp:~maddevelopers/mg5amcnlo/COLLIER updated
427. By Valentin Hirschi

1. Added the automatic installation of the dependency 'cmake' of COLLIER if necessary.

428. By Valentin Hirschi

1. Added LARS's fix to COLLIER for rank 7+
2. Completely isolated the OneLOop of IREGI and CutTools so as to prevent interferences with other reduction tools using OneLOop.

429. By Valentin Hirschi

1. Fixed BinothLHA.f

430. By Valentin Hirschi

1.

431. By Valentin Hirschi

1. Merged with latest version 2.4.3

432. By Valentin Hirschi

1. Added comments and updated the Offline HEPTools installer.

433. By Valentin Hirschi

1. Changed the default value of the ML reduction order to 6|7|1.

434. By Valentin Hirschi

1. Fixed IOTests and default config tests.

435. By Valentin Hirschi

1. Merged with latest 2.4.3

436. By Valentin Hirschi

1. Fixed an issue in the compilation of SMWidth
2. Updated all IOTest to correspond to a setup without Ninja Quad prec. We will do so until clang releases a version supporting __float128 (and quadmath in general).

437. By Valentin Hirschi

1. Reinstated the 'wrong' loop_MSSM for parallel tests, but only in the input_files.
2. Merged with latest version of 2.4.3.

Unmerged revisions

437. By Valentin Hirschi

1. Reinstated the 'wrong' loop_MSSM for parallel tests, but only in the input_files.
2. Merged with latest version of 2.4.3.

436. By Valentin Hirschi

1. Fixed an issue in the compilation of SMWidth
2. Updated all IOTest to correspond to a setup without Ninja Quad prec. We will do so until clang releases a version supporting __float128 (and quadmath in general).

435. By Valentin Hirschi

1. Merged with latest 2.4.3

434. By Valentin Hirschi

1. Fixed IOTests and default config tests.

433. By Valentin Hirschi

1. Changed the default value of the ML reduction order to 6|7|1.

432. By Valentin Hirschi

1. Added comments and updated the Offline HEPTools installer.

431. By Valentin Hirschi

1. Merged with latest version 2.4.3

430. By Valentin Hirschi

1.

429. By Valentin Hirschi

1. Fixed BinothLHA.f

428. By Valentin Hirschi

1. Added LARS's fix to COLLIER for rank 7+
2. Completely isolated the OneLOop of IREGI and CutTools so as to prevent interferences with other reduction tools using OneLOop.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'MadSpin/decay.py'
--- MadSpin/decay.py 2016-06-08 20:19:53 +0000
+++ MadSpin/decay.py 2016-06-24 21:04:21 +0000
@@ -1224,6 +1224,7 @@
1224 'P%s' % me.get('processes')[0].shell_string())1224 'P%s' % me.get('processes')[0].shell_string())
1225 topo['decays'] = []1225 topo['decays'] = []
1226 topo['total_br'] = 0 1226 topo['total_br'] = 0
1227 topo['Pid'] = proc.get('id')
1227 1228
1228 if skip:1229 if skip:
1229 self.add_me_symmetric(skip, topo)1230 self.add_me_symmetric(skip, topo)
@@ -2115,7 +2116,7 @@
2115 # launch the decay and reweighting2116 # launch the decay and reweighting
2116 self.mscmd.update_status('MadSpin: Decaying Events')2117 self.mscmd.update_status('MadSpin: Decaying Events')
2117 efficiency = self.decaying_events(self.inverted_decay_mapping)2118 efficiency = self.decaying_events(self.inverted_decay_mapping)
2118 if efficiency != 1:2119 if efficiency != 1 and any(v==-1 for v in self.br_per_id.values()):
2119 # need to change the banner information [nb_event/cross section]2120 # need to change the banner information [nb_event/cross section]
2120 files.cp(self.outputfile.name, '%s_tmp' % self.outputfile.name)2121 files.cp(self.outputfile.name, '%s_tmp' % self.outputfile.name)
2121 self.outputfile = open(self.outputfile.name, 'w')2122 self.outputfile = open(self.outputfile.name, 'w')
@@ -2685,13 +2686,13 @@
2685 proc_nb = '@ %i' % proc_nb 2686 proc_nb = '@ %i' % proc_nb
2686 else:2687 else:
2687 proc_nb = ''2688 proc_nb = ''
2688 2689
2689 if ',' in proc:2690 if ',' in proc:
2690 raise MadSpinError, 'MadSpin can not decay event which comes from a decay chain.'+\2691 raise MadSpinError, 'MadSpin can not decay event which comes from a decay chain.'+\
2691 '\n The full decay chain should either be handle by MadGraph or by Masdspin.'2692 '\n The full decay chain should either be handle by MadGraph or by Masdspin.'
2692 2693
2693 if '[' not in proc:2694 if '[' not in proc:
2694 commandline+="add process %s --no_warning=duplicate;" % proc2695 commandline+="add process %s %s --no_warning=duplicate;" % (proc, proc_nb)
2695 else:2696 else:
2696 process, order, final = re.split('\[\s*(.*)\s*\]', proc)2697 process, order, final = re.split('\[\s*(.*)\s*\]', proc)
2697 commandline+="add process %s %s --no_warning=duplicate;" % (process, proc_nb)2698 commandline+="add process %s %s --no_warning=duplicate;" % (process, proc_nb)
@@ -2723,6 +2724,7 @@
2723 commandline +='add process %s pert_%s %s --no_warning=duplicate;' % (process,order, proc_nb) 2724 commandline +='add process %s pert_%s %s --no_warning=duplicate;' % (process,order, proc_nb)
2724 commandline = commandline.replace('add process', 'generate',1)2725 commandline = commandline.replace('add process', 'generate',1)
2725 logger.info(commandline)2726 logger.info(commandline)
2727
2726 mgcmd.exec_cmd(commandline, precmd=True)2728 mgcmd.exec_cmd(commandline, precmd=True)
2727 commandline = 'output standalone_msP %s %s' % \2729 commandline = 'output standalone_msP %s %s' % \
2728 (pjoin(path_me,'production_me'), ' '.join(self.list_branches.keys())) 2730 (pjoin(path_me,'production_me'), ' '.join(self.list_branches.keys()))
@@ -3876,16 +3878,24 @@
3876 ms_banner = ""3878 ms_banner = ""
3877 cross_section = True # tell if possible to write the cross-section in advance3879 cross_section = True # tell if possible to write the cross-section in advance
3878 total_br = []3880 total_br = []
3881 self.br_per_id = {}
3879 for production in self.all_ME.values():3882 for production in self.all_ME.values():
3880 one_br = 03883 one_br = 0
3884 partial_br = 0
3881 for decay in production['decays']:3885 for decay in production['decays']:
3882 if not decay['decay_tag']:3886 if not decay['decay_tag']:
3883 cross_section = False3887 cross_section = False
3884 one_br += decay['br']3888 one_br += decay['br']
3885 continue3889 continue
3890 partial_br += decay['br']
3886 ms_banner += "# %s\n" % ','.join(decay['decay_tag']).replace('\n',' ')3891 ms_banner += "# %s\n" % ','.join(decay['decay_tag']).replace('\n',' ')
3887 ms_banner += "# BR: %s\n# max_weight: %s\n" % (decay['br'], decay['max_weight'])3892 ms_banner += "# BR: %s\n# max_weight: %s\n" % (decay['br'], decay['max_weight'])
3888 one_br += decay['br']3893 one_br += decay['br']
3894
3895 if production['Pid'] not in self.br_per_id:
3896 self.br_per_id[production['Pid']] = partial_br
3897 elif self.br_per_id[production['Pid']] != partial_br:
3898 self.br_per_id[production['Pid']] = -1
3889 total_br.append(one_br)3899 total_br.append(one_br)
3890 3900
3891 if __debug__:3901 if __debug__:
@@ -3893,7 +3903,6 @@
3893 assert production['total_br'] - min(total_br) < 1e-43903 assert production['total_br'] - min(total_br) < 1e-4
3894 3904
3895 self.branching_ratio = max(total_br) * eff3905 self.branching_ratio = max(total_br) * eff
3896
3897 #self.banner['madspin'] += ms_banner3906 #self.banner['madspin'] += ms_banner
3898 # Update cross-section in the banner3907 # Update cross-section in the banner
3899 if 'mggenerationinfo' in self.banner:3908 if 'mggenerationinfo' in self.banner:
@@ -3924,18 +3933,29 @@
3924 mg_info[i] = '%s : %s' % (info, value * self.branching_ratio)3933 mg_info[i] = '%s : %s' % (info, value * self.branching_ratio)
3925 self.banner['mggenerationinfo'] = '\n'.join(mg_info)3934 self.banner['mggenerationinfo'] = '\n'.join(mg_info)
3926 3935
3927 3936
3928 3937 if 'init' in self.banner and (eff!=1 or not any(v==-1 for v in self.br_per_id.values())):
3929 if 'init' in self.banner:
3930 new_init =''3938 new_init =''
3939 curr_proc = 0
3940 has_missing=False
3931 for line in self.banner['init'].split('\n'):3941 for line in self.banner['init'].split('\n'):
3932 if len(line.split()) != 4:3942 if len(line.split()) != 4:
3933 new_init += '%s\n' % line3943 new_init += '%s\n' % line
3934 else:3944 else:
3945 curr_proc += 1
3935 data = [float(nb) for nb in line.split()]3946 data = [float(nb) for nb in line.split()]
3936 data[:3] = [ data[i] * self.branching_ratio for i in range(3)]3947 id = int(data[-1])
3948 if id in self.br_per_id and not any(v==-1 for v in self.br_per_id.values()):
3949 data[:3] = [data[i] * self.br_per_id[id] for i in range(3)]
3950 else:
3951 data[:3] = [ data[i] * self.branching_ratio for i in range(3)]
3952 has_missing=True
3937 new_init += ' %.12E %.12E %.12E %i\n' % tuple(data)3953 new_init += ' %.12E %.12E %.12E %i\n' % tuple(data)
3938 self.banner['init'] = new_init3954 self.banner['init'] = new_init
3955 if has_missing and curr_proc not in [0,1]:
3956 logger.warning('''The partial cross section for each subprocess can not be determine. due
3957 Reason: multiple final state in the same subprocess (and the presence of multiple BR)
3958 Consequence: the <init> information of the lhe will therefore be incorrect. Please correct it if needed.''')
3939 self.banner.write(self.outputfile, close_tag=False) 3959 self.banner.write(self.outputfile, close_tag=False)
3940 3960
3941 def terminate_fortran_executables(self, path_to_decay=0 ):3961 def terminate_fortran_executables(self, path_to_decay=0 ):
39423962
=== modified file 'Template/LO/Source/make_opts'
--- Template/LO/Source/make_opts 2016-06-10 16:31:39 +0000
+++ Template/LO/Source/make_opts 2016-06-24 21:04:21 +0000
@@ -1,9 +1,9 @@
1DEFAULT_F2PY_COMPILER=f2py1DEFAULT_F2PY_COMPILER=f2py
2DEFAULT_F_COMPILER=gfortran2DEFAULT_F_COMPILER=gfortran
3MACFLAG=-mmacosx-version-min=10.73MACFLAG=
4DEFAULT_CPP_COMPILER=clang4DEFAULT_CPP_COMPILER=g++
5STDLIB=-lc++5STDLIB=-lstdc++
6STDLIB_FLAG=-stdlib=libc++6STDLIB_FLAG=
7#end_of_make_opts_variables7#end_of_make_opts_variables
8# Rest of the makefile8# Rest of the makefile
99
1010
=== modified file 'Template/LO/SubProcesses/genps.f'
--- Template/LO/SubProcesses/genps.f 2014-11-06 01:54:56 +0000
+++ Template/LO/SubProcesses/genps.f 2016-06-24 21:04:21 +0000
@@ -1159,7 +1159,7 @@
11591159
1160C IF THERE IS NO S CHANNEL POLE USE BELOW:1160C IF THERE IS NO S CHANNEL POLE USE BELOW:
11611161
1162 TAUMIN = SMIN/S1162 TAUMIN = 0d0 !SMIN/S !keep scale fix
1163 TAUMAX = 1D01163 TAUMAX = 1D0
1164 TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN1164 TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN
1165 SJACOBI= sjacobi*(TAUMAX-TAUMIN)1165 SJACOBI= sjacobi*(TAUMAX-TAUMIN)
11661166
=== modified file 'Template/LO/SubProcesses/myamp.f'
--- Template/LO/SubProcesses/myamp.f 2016-04-13 13:49:42 +0000
+++ Template/LO/SubProcesses/myamp.f 2016-06-24 21:04:21 +0000
@@ -606,7 +606,7 @@
606c-----------------------606c-----------------------
607 if (swidth(i) .eq. 0d0) then607 if (swidth(i) .eq. 0d0) then
608 if (xo.lt.smin/stot)then608 if (xo.lt.smin/stot)then
609 xo = -1d0*smin/stot609 xo = 1d0*smin/stot
610 endif610 endif
611 swidth(i) = xo611 swidth(i) = xo
612 spole(i)= -2.0d0 ! 1/s pole612 spole(i)= -2.0d0 ! 1/s pole
613613
=== modified file 'Template/LO/SubProcesses/refine.sh'
--- Template/LO/SubProcesses/refine.sh 2015-05-22 18:00:40 +0000
+++ Template/LO/SubProcesses/refine.sh 2016-06-24 21:04:21 +0000
@@ -8,7 +8,12 @@
8if [[ -e MadLoop5_resources.tar.gz && ! -e MadLoop5_resources ]]; then8if [[ -e MadLoop5_resources.tar.gz && ! -e MadLoop5_resources ]]; then
9tar -xzf MadLoop5_resources.tar.gz9tar -xzf MadLoop5_resources.tar.gz
10fi10fi
11k=%(name)s_app.log11keeplog=%(keeplog)s
12if [ "$keeplog" = true ] ; then
13 k=%(name)s_app.log
14else
15 k=/dev/null
16fi
12script=%(script_name)s 17script=%(script_name)s
1318
14grid_directory=%(base_directory)s19grid_directory=%(base_directory)s
@@ -24,9 +29,10 @@
24 fi29 fi
25 fi 30 fi
26 fi31 fi
27
28 cd $j32 cd $j
29 rm -f $k33 if [ "$keeplog" = true ] ; then
34 rm -f $k
35 fi
30 rm -f moffset.dat >& /dev/null36 rm -f moffset.dat >& /dev/null
31 echo %(offset)s > moffset.dat37 echo %(offset)s > moffset.dat
32 if [[ -e ftn26 ]]; then38 if [[ -e ftn26 ]]; then
@@ -50,17 +56,27 @@
50 # filesystem problem (executable not found)56 # filesystem problem (executable not found)
51 for((try=1;try<=16;try+=1)); 57 for((try=1;try<=16;try+=1));
52 do58 do
53 ../madevent 2>&1 >> $k <input_sg.txt | tee -a $k;59 if [ "$keeplog" = true ] ; then
54 status_code=${PIPESTATUS[0]};60 ../madevent 2>&1 >> $k <input_sg.txt | tee -a $k;
55 if [ -s $k ]61 status_code=${PIPESTATUS[0]};
56 then62 if [ -s $k ]
57 break63 then
58 else64 break
59 echo $try > fail.log 65 else
60 fi66 echo $try > fail.log
67 fi
68 else
69 ../madevent 2>&1 >> log.txt <input_sg.txt | tee -a log.txt;
70 status_code=${PIPESTATUS[0]};
71 if [ -s log.txt ]
72 then
73 rm log.txt
74 break
75 else
76 echo $try > fail.log
77 fi
78 fi
61 done79 done
62 echo "" >> $k; echo "ls status:" >> $k; ls >> $k
63 cat $k >> log.txt
64 if [[ $status_code -ne 0 ]]; then 80 if [[ $status_code -ne 0 ]]; then
65 rm results.dat81 rm results.dat
66 echo "ERROR DETECTED"82 echo "ERROR DETECTED"
@@ -69,5 +85,16 @@
69 if [[ -e ftn26 ]]; then85 if [[ -e ftn26 ]]; then
70 cp ftn26 ftn2586 cp ftn26 ftn25
71 fi87 fi
88
89 if [ "$keeplog" = true ] ; then
90 echo "" >> $k; echo "ls status:" >> $k; ls >> $k
91 else
92 rm ftn26 > /dev/null
93 fi
94
95
96
97
98
72 cd ../99 cd ../
73100
74101
=== modified file 'Template/LO/SubProcesses/setcuts.f'
--- Template/LO/SubProcesses/setcuts.f 2016-05-11 10:34:14 +0000
+++ Template/LO/SubProcesses/setcuts.f 2016-06-24 21:04:21 +0000
@@ -107,6 +107,11 @@
107 $ ,ptll_max_save,etmin_save,etmax_save,emin_save,emax_save107 $ ,ptll_max_save,etmin_save,etmax_save,emin_save,emax_save
108 $ ,etamin_save,etamax_save108 $ ,etamin_save,etamax_save
109c109c
110c count the number of j/bjet/photon/lepton
111c
112 integer nb_j, nb_b, nb_a, nb_l, nb_nocut
113 double precision smin_p, smin_m ! local variable to compute smin
114c
110c setup masses for the final-state particles115c setup masses for the final-state particles
111c116c
112 include 'pmass.inc'117 include 'pmass.inc'
@@ -133,6 +138,8 @@
133 fixed_fac_scale=.true.138 fixed_fac_scale=.true.
134 use_syst=.false.139 use_syst=.false.
135 endif140 endif
141
142
136c143c
137c set ptj and s_min if xqcut and ktscheme = 1, to improve144c set ptj and s_min if xqcut and ktscheme = 1, to improve
138c integration speed, and set drjj and drjl to 0.145c integration speed, and set drjj and drjl to 0.
@@ -221,61 +228,63 @@
221 if (abs(idup(i,1,iproc)).eq.16) is_a_nu(i)=.true. ! no cuts on vt vt~228 if (abs(idup(i,1,iproc)).eq.16) is_a_nu(i)=.true. ! no cuts on vt vt~
222 if (pmass(i).gt.10d0) is_heavy(i)=.true. ! heavy fs particle229 if (pmass(i).gt.10d0) is_heavy(i)=.true. ! heavy fs particle
223c-onium230c-onium
224 if (idup(i,1,iproc).eq.441) is_a_onium(i)=.true. ! charmonium231c if (idup(i,1,iproc).eq.441) is_a_onium(i)=.true. ! charmonium
225 if (idup(i,1,iproc).eq.10441) is_a_onium(i)=.true. ! charmonium232c if (idup(i,1,iproc).eq.10441) is_a_onium(i)=.true. ! charmonium
226 if (idup(i,1,iproc).eq.100441) is_a_onium(i)=.true. ! charmonium233c if (idup(i,1,iproc).eq.100441) is_a_onium(i)=.true. ! charmonium
227 if (idup(i,1,iproc).eq.443) is_a_onium(i)=.true. ! charmonium234c if (idup(i,1,iproc).eq.443) is_a_onium(i)=.true. ! charmonium
228 if (idup(i,1,iproc).eq.10443) is_a_onium(i)=.true. ! charmonium235c if (idup(i,1,iproc).eq.10443) is_a_onium(i)=.true. ! charmonium
229 if (idup(i,1,iproc).eq.20443) is_a_onium(i)=.true. ! charmonium236c if (idup(i,1,iproc).eq.20443) is_a_onium(i)=.true. ! charmonium
230 if (idup(i,1,iproc).eq.100443) is_a_onium(i)=.true. ! charmonium237c if (idup(i,1,iproc).eq.100443) is_a_onium(i)=.true. ! charmonium
231 if (idup(i,1,iproc).eq.30443) is_a_onium(i)=.true. ! charmonium238c if (idup(i,1,iproc).eq.30443) is_a_onium(i)=.true. ! charmonium
232 if (idup(i,1,iproc).eq.9000443) is_a_onium(i)=.true. ! charmonium239c if (idup(i,1,iproc).eq.9000443) is_a_onium(i)=.true. ! charmonium
233 if (idup(i,1,iproc).eq.9010443) is_a_onium(i)=.true. ! charmonium240c if (idup(i,1,iproc).eq.9010443) is_a_onium(i)=.true. ! charmonium
234 if (idup(i,1,iproc).eq.9020443) is_a_onium(i)=.true. ! charmonium241c if (idup(i,1,iproc).eq.9020443) is_a_onium(i)=.true. ! charmonium
235 if (idup(i,1,iproc).eq.445) is_a_onium(i)=.true. ! charmonium242c if (idup(i,1,iproc).eq.445) is_a_onium(i)=.true. ! charmonium
236 if (idup(i,1,iproc).eq.9000445) is_a_onium(i)=.true. ! charmonium243c if (idup(i,1,iproc).eq.9000445) is_a_onium(i)=.true. ! charmonium
237244
238 if (idup(i,1,iproc).eq.551) is_a_onium(i)=.true. ! bottomonium245c if (idup(i,1,iproc).eq.551) is_a_onium(i)=.true. ! bottomonium
239 if (idup(i,1,iproc).eq.10551) is_a_onium(i)=.true. ! bottomonium246c if (idup(i,1,iproc).eq.10551) is_a_onium(i)=.true. ! bottomonium
240 if (idup(i,1,iproc).eq.100551) is_a_onium(i)=.true. ! bottomonium247c if (idup(i,1,iproc).eq.100551) is_a_onium(i)=.true. ! bottomonium
241 if (idup(i,1,iproc).eq.110551) is_a_onium(i)=.true. ! bottomonium248c if (idup(i,1,iproc).eq.110551) is_a_onium(i)=.true. ! bottomonium
242 if (idup(i,1,iproc).eq.200551) is_a_onium(i)=.true. ! bottomonium249c if (idup(i,1,iproc).eq.200551) is_a_onium(i)=.true. ! bottomonium
243 if (idup(i,1,iproc).eq.210551) is_a_onium(i)=.true. ! bottomonium250c if (idup(i,1,iproc).eq.210551) is_a_onium(i)=.true. ! bottomonium
244 if (idup(i,1,iproc).eq.553) is_a_onium(i)=.true. ! bottomonium251c if (idup(i,1,iproc).eq.553) is_a_onium(i)=.true. ! bottomonium
245 if (idup(i,1,iproc).eq.10553) is_a_onium(i)=.true. ! bottomonium252c if (idup(i,1,iproc).eq.10553) is_a_onium(i)=.true. ! bottomonium
246 if (idup(i,1,iproc).eq.20553) is_a_onium(i)=.true. ! bottomonium253c if (idup(i,1,iproc).eq.20553) is_a_onium(i)=.true. ! bottomonium
247 if (idup(i,1,iproc).eq.30553) is_a_onium(i)=.true. ! bottomonium254c if (idup(i,1,iproc).eq.30553) is_a_onium(i)=.true. ! bottomonium
248 if (idup(i,1,iproc).eq.100553) is_a_onium(i)=.true. ! bottomonium255c if (idup(i,1,iproc).eq.100553) is_a_onium(i)=.true. ! bottomonium
249 if (idup(i,1,iproc).eq.110553) is_a_onium(i)=.true. ! bottomonium256c if (idup(i,1,iproc).eq.110553) is_a_onium(i)=.true. ! bottomonium
250 if (idup(i,1,iproc).eq.120553) is_a_onium(i)=.true. ! bottomonium257c if (idup(i,1,iproc).eq.120553) is_a_onium(i)=.true. ! bottomonium
251 if (idup(i,1,iproc).eq.130553) is_a_onium(i)=.true. ! bottomonium258c if (idup(i,1,iproc).eq.130553) is_a_onium(i)=.true. ! bottomonium
252 if (idup(i,1,iproc).eq.200553) is_a_onium(i)=.true. ! bottomonium259c if (idup(i,1,iproc).eq.200553) is_a_onium(i)=.true. ! bottomonium
253 if (idup(i,1,iproc).eq.210553) is_a_onium(i)=.true. ! bottomonium260c if (idup(i,1,iproc).eq.210553) is_a_onium(i)=.true. ! bottomonium
254 if (idup(i,1,iproc).eq.220553) is_a_onium(i)=.true. ! bottomonium261c if (idup(i,1,iproc).eq.220553) is_a_onium(i)=.true. ! bottomonium
255 if (idup(i,1,iproc).eq.300553) is_a_onium(i)=.true. ! bottomonium262c if (idup(i,1,iproc).eq.300553) is_a_onium(i)=.true. ! bottomonium
256 if (idup(i,1,iproc).eq.9000553) is_a_onium(i)=.true. ! bottomonium263c if (idup(i,1,iproc).eq.9000553) is_a_onium(i)=.true. ! bottomonium
257 if (idup(i,1,iproc).eq.9010553) is_a_onium(i)=.true. ! bottomonium264c if (idup(i,1,iproc).eq.9010553) is_a_onium(i)=.true. ! bottomonium
258 if (idup(i,1,iproc).eq.555) is_a_onium(i)=.true. ! bottomonium265c if (idup(i,1,iproc).eq.555) is_a_onium(i)=.true. ! bottomonium
259 if (idup(i,1,iproc).eq.10555) is_a_onium(i)=.true. ! bottomonium266c if (idup(i,1,iproc).eq.10555) is_a_onium(i)=.true. ! bottomonium
260 if (idup(i,1,iproc).eq.20555) is_a_onium(i)=.true. ! bottomonium267c if (idup(i,1,iproc).eq.20555) is_a_onium(i)=.true. ! bottomonium
261 if (idup(i,1,iproc).eq.100555) is_a_onium(i)=.true. ! bottomonium268c if (idup(i,1,iproc).eq.100555) is_a_onium(i)=.true. ! bottomonium
262 if (idup(i,1,iproc).eq.110555) is_a_onium(i)=.true. ! bottomonium269c if (idup(i,1,iproc).eq.110555) is_a_onium(i)=.true. ! bottomonium
263 if (idup(i,1,iproc).eq.200555) is_a_onium(i)=.true. ! bottomonium270c if (idup(i,1,iproc).eq.200555) is_a_onium(i)=.true. ! bottomonium
264 if (idup(i,1,iproc).eq.557) is_a_onium(i)=.true. ! bottomonium271c if (idup(i,1,iproc).eq.557) is_a_onium(i)=.true. ! bottomonium
265 if (idup(i,1,iproc).eq.100557) is_a_onium(i)=.true. ! bottomonium272c if (idup(i,1,iproc).eq.100557) is_a_onium(i)=.true. ! bottomonium
266273
267 if (idup(i,1,iproc).eq.541) is_a_onium(i)=.true. ! Bc274c if (idup(i,1,iproc).eq.541) is_a_onium(i)=.true. ! Bc
268 if (idup(i,1,iproc).eq.10541) is_a_onium(i)=.true. ! Bc275c if (idup(i,1,iproc).eq.10541) is_a_onium(i)=.true. ! Bc
269 if (idup(i,1,iproc).eq.543) is_a_onium(i)=.true. ! Bc276c if (idup(i,1,iproc).eq.543) is_a_onium(i)=.true. ! Bc
270 if (idup(i,1,iproc).eq.10543) is_a_onium(i)=.true. ! Bc277c if (idup(i,1,iproc).eq.10543) is_a_onium(i)=.true. ! Bc
271 if (idup(i,1,iproc).eq.20543) is_a_onium(i)=.true. ! Bc278c if (idup(i,1,iproc).eq.20543) is_a_onium(i)=.true. ! Bc
272 if (idup(i,1,iproc).eq.545) is_a_onium(i)=.true. ! Bc279c if (idup(i,1,iproc).eq.545) is_a_onium(i)=.true. ! Bc
273 enddo280 enddo
274281
282
283
284
275c285c
276c et and eta cuts286c et and eta cuts
277c287c
278 Smin = 0d0
279 do i=nincoming+1,nexternal288 do i=nincoming+1,nexternal
280 etmin(i) = 0d0289 etmin(i) = 0d0
281 etmax(i) = -1290 etmax(i) = -1
@@ -291,7 +300,6 @@
291c JET300c JET
292 if(is_a_j(i))then301 if(is_a_j(i))then
293 etmin(i)=ptj302 etmin(i)=ptj
294 SMIN = SMIN + max(ptj,ej)
295 etmax(i)=ptjmax303 etmax(i)=ptjmax
296 emin(i)=ej304 emin(i)=ej
297 emax(i)=ejmax305 emax(i)=ejmax
@@ -301,7 +309,6 @@
301c LEPTON309c LEPTON
302 if(is_a_l(i))then310 if(is_a_l(i))then
303 etmin(i)=ptl311 etmin(i)=ptl
304 SMIN = SMIN + max(ptl,el)
305 etmax(i)=ptlmax312 etmax(i)=ptlmax
306 emin(i)=el313 emin(i)=el
307 emax(i)=elmax314 emax(i)=elmax
@@ -311,7 +318,6 @@
311c BJET318c BJET
312 if(is_a_b(i))then319 if(is_a_b(i))then
313 etmin(i)=ptb320 etmin(i)=ptb
314 SMIN = SMIN + max(ptb,eb)
315 etmax(i)=ptbmax321 etmax(i)=ptbmax
316 emin(i)=eb322 emin(i)=eb
317 emax(i)=ebmax323 emax(i)=ebmax
@@ -321,7 +327,6 @@
321c PHOTON327c PHOTON
322 if(is_a_a(i))then328 if(is_a_a(i))then
323 etmin(i) = max(pta, ptgmin)329 etmin(i) = max(pta, ptgmin)
324 SMIN = SMIN + max(etmin(i),ea)
325 etmax(i)=ptamax330 etmax(i)=ptamax
326 emin(i)=ea331 emin(i)=ea
327 emax(i)=eamax332 emax(i)=eamax
@@ -329,14 +334,16 @@
329 etamin(i)=etaamin334 etamin(i)=etaamin
330 endif335 endif
331c QUARKONIUM336c QUARKONIUM
332 if(is_a_onium(i))then337c if(is_a_onium(i))then
333 etmin(i)=ptonium338c etmin(i)=ptonium
334 SMIN = SMIN + ptonium339c SMIN = SMIN + max(0d0,ptonium**2
335 etamax(i)=etaonium340c etamax(i)=etaonium
336 endif341c endif
337 endif342 endif
338 enddo343 enddo
339 SMIN = SMIN **2344
345
346
340c347c
341c delta r cut348c delta r cut
342c349c
@@ -473,35 +480,166 @@
473480
474481
475c482c
476c Compute Smin (for efficiency483c Compute Smin (for efficiency purpose)
477c484c
478 do i=nincoming+1,nexternal-1485 smin = 0d0
479 do j=nincoming+1,nexternal-1486c check for the jet
480 if(j.lt.i)then487 smin_m = 0d0
481 s_min(i,j) = max(s_min(j,i),s_min(i,j))488 smin_p = 0d0
482 else489 nb_j = 0
483 smin=0.0d0**2490 nb_nocut = 0
484491 do i=nincoming+1,nexternal
485 if(do_cuts(i).and.do_cuts(j)) then492 if (is_a_j(i)) then
486 if(is_a_j(i).and.is_a_j(j)) s_min(j,i)=mmjj*dabs(mmjj)493 nb_j = nb_j + 1
487 if(is_a_a(i).and.is_a_a(j)) s_min(j,i)=mmaa*dabs(mmaa)494 smin_m = smin_m - pmass(i)**2
488 if( is_a_b(i).and.is_a_b(j) ) s_min(j,i)=mmbb*dabs(mmbb)495 if (do_cuts(i))then
489 if((is_a_l(i).and.is_a_l(j)).and.496 if (nb_j.eq.1) then
490 & (abs(idup(i,1,iproc)).eq.abs(idup(j,1,iproc))).and.497 smin_p = smin_p + max(ej,ptj,xptj,0d0,
491 & (idup(i,1,iproc)*idup(j,1,iproc).lt.0))498 & max(ptj1min,ptj2min,ptj3min,ptj4min))
492 & s_min(j,i)=mmll*dabs(mmll) !only on l+l- pairs (same flavour)499 elseif(nb_j.eq.2) then
493500 smin_p = max(ht2min, smin_p + max(ej,ptj,0d0,
494 if(is_a_j(i).and.is_a_j(j)) s_max(j,i)=mmjjmax*dabs(mmjjmax)501 & max(ptj2min,ptj3min,ptj4min)))
495 if(is_a_a(i).and.is_a_a(j)) s_max(j,i)=mmaamax*dabs(mmaamax)502 elseif(nb_j.eq.3) then
496 if( is_a_b(i).and.is_a_b(j) ) s_max(j,i)=mmbbmax*dabs(mmbbmax)503 smin_p = max(ht3min, smin_p + max(ej,ptj,0d0,
497 if((is_a_l(i).and.is_a_l(j)).and.504 & max(ptj3min,ptj4min)))
498 & (abs(idup(i,1,iproc)).eq.abs(idup(j,1,iproc))).and.505 elseif(nb_j.eq.4) then
499 & (idup(i,1,iproc)*idup(j,1,iproc).lt.0))506 smin_p = max(ht4min, smin_p + max(ej,ptj,ptj4min,0d0))
500 & s_max(j,i)=mmllmax*dabs(mmllmax) !only on l+l- pairs (same flavour)507 else
501 endif508 smin_p = smin_p + max(ej,ptj,0d0)
502 endif509 endif
503 enddo510 else
504 enddo511 nb_nocut = nb_nocut + 1
512 if (nb_j.eq.1) then
513 smin_p = smin_p + max(0d0,ptj1min,ptj2min,ptj3min,ptj4min)
514 elseif(nb_j.eq.2) then
515 smin_p = max(ht2min, smin_p + max(ptj2min,ptj3min,ptj4min,0d0))
516 elseif(nb_j.eq.3) then
517 smin_p = max(ht3min, smin_p + max(0d0,ptj3min,ptj4min))
518 elseif(nb_j.eq.4) then
519 smin_p = max(ht4min, smin_p + max(ptj4min,0d0))
520 endif
521 endif
522 endif
523 enddo
524 if (nb_j.gt.0)then
525 if ((nb_j-nb_nocut).gt.0)then
526 smin_m = smin_m + (nb_j-nb_nocut)*(nb_j-nb_nocut-1)/2d0*mmjj**2
527 endif
528 smin = smin + max(smin_p**2, smin_m, htjmin**2)
529 endif
530c check for the bjet
531 smin_m = 0d0
532 smin_p = 0d0
533 nb_b = 0
534 nb_nocut = 0
535 do i=nincoming+1,nexternal
536 if (is_a_b(i).and.do_cuts(i)) then
537 nb_b = nb_b + 1
538 smin_m = smin_m - pmass(i)**2
539 if (do_cuts(i)) then
540 if (nb_b.eq.1) then
541 smin_p = smin_p + max(eb,ptb,xptb,0d0)
542 else
543 smin_p = smin_p + max(eb,ptb,0d0)
544 endif
545 else
546 nb_nocut = nb_nocut +1
547 if (nb_b.eq.1) then
548 smin_p = smin_p + max(xptb,0d0)
549 endif
550 endif
551 endif
552 enddo
553 if (nb_b.gt.0)then
554 if ((nb_b-nb_nocut).gt.0) then
555 smin_m = smin_m + (nb_b-nb_nocut)*(nb_b-nb_nocut-1)/2d0*mmbb**2
556 endif
557 smin = smin + max(smin_p**2, smin_m, (ihtmin**2-htjmin**2))
558 endif
559c check for the photon
560 smin_m = 0d0
561 smin_p = 0d0
562 nb_a = 0
563 nb_nocut = 0
564 do i=nincoming+1,nexternal
565 if (is_a_a(i))then
566 nb_a = nb_a + 1
567 if (do_cuts(i))then
568 if (ptgmin.eq.0d0) then
569 if (nb_a.eq.1) then
570 smin_p = smin_p + max(ea,pta,xpta,0d0)
571 else
572 smin_p = smin_p + max(ea,pta,0d0)
573 endif
574 endif
575 else
576 nb_nocut = nb_nocut + 1
577 if(ptgmin.eq.0d0)then
578 if (nb_a.eq.1) then
579 smin_p = smin_p + max(xpta,0d0)
580 endif
581 endif
582 endif
583 endif
584 enddo
585 if (nb_a.gt.0) then
586 if ((nb_a-nb_nocut).gt.0)then
587 smin_m = (nb_a-nb_nocut)*(nb_a-nb_nocut-1)/2d0*mmaa**2
588 endif
589 smin = smin + max(smin_p**2, smin_m)
590 endif
591c check for lepton
592 smin_m = 0d0
593 smin_p = 0d0
594 nb_l = 0
595 nb_nocut = 0
596 do i=nincoming+1,nexternal-1
597 if (is_a_l(i))then
598 nb_l = nb_l + 1
599 smin_m = smin_m - pmass(i)**2
600 if (do_cuts(i))then
601 if (nb_l.eq.1) then
602 smin_p = smin_p + max(el,ptl,xptl,0d0,
603 & max(ptl1min,ptl2min,ptl3min,ptl4min))
604 elseif(nb_l.eq.2) then
605 smin_p = smin_p + max(el,ptl,0d0,max(ptl2min,ptl3min,ptl4min))
606 elseif(nb_l.eq.3) then
607 smin_p = smin_p + max(el,ptl,0d0, max(ptl3min,ptl4min))
608 elseif(nb_l.eq.4) then
609 smin_p = smin_p + max(el,ptl,ptl4min,0d0)
610 else
611 smin_p = smin_p + max(el,ptl,0d0)
612 endif
613 else
614 nb_nocut = nb_nocut + 1
615 if (nb_l.eq.1) then
616 smin_p = smin_p + max(xptl,0d0,
617 & max(ptl1min,ptl2min,ptl3min,ptl4min))
618 elseif(nb_l.eq.2) then
619 smin_p = smin_p + max(0d0,ptl2min,ptl3min,ptl4min)
620 elseif(nb_l.eq.3) then
621 smin_p = smin_p + max(0d0,ptl3min,ptl4min)
622 elseif(nb_l.eq.4) then
623 smin_p = smin_p + max(ptl4min,0d0)
624 endif
625 endif
626 endif
627 enddo
628 if (nb_l.gt.0)then
629 if ((nb_l-nb_nocut).gt.0)then
630 smin_m = smin_m + (nb_l-nb_nocut)*((nb_l-nb_nocut)-1)/2d0*mmll**2
631 endif
632 smin = smin + max(smin_p**2, smin_m, mmnl**2, ptllmin**2, misset**2)
633 endif
634c ensure symmetry of s_min(i,j)
635 do i=nincoming+1,nexternal-1
636 do j=nincoming+1,nexternal-1
637 if(j.lt.i)then
638 s_min(i,j) = max(s_min(j,i),s_min(i,j))
639 endif
640 enddo
641 enddo
642 write(*,*) "Define smin to", smin
505643
506c Check that results are consistent among all the grouped subprocesses644c Check that results are consistent among all the grouped subprocesses
507645
508646
=== modified file 'Template/NLO/SubProcesses/BinothLHA.f'
--- Template/NLO/SubProcesses/BinothLHA.f 2016-03-02 09:31:23 +0000
+++ Template/NLO/SubProcesses/BinothLHA.f 2016-06-24 21:04:21 +0000
@@ -85,6 +85,8 @@
85c itself again to perform stability check to make sure no unstable EPS85c itself again to perform stability check to make sure no unstable EPS
86c splips unnoticed.86c splips unnoticed.
87 CALL FORCE_STABILITY_CHECK(.TRUE.)87 CALL FORCE_STABILITY_CHECK(.TRUE.)
88 CALL COLLIER_COMPUTE_UV_POLES(.FALSE.)
89 CALL COLLIER_COMPUTE_IR_POLES(.FALSE.)
88 firsttime_run = .false.90 firsttime_run = .false.
89 endif91 endif
90 if (firsttime) then92 if (firsttime) then
@@ -102,6 +104,7 @@
102c Just set the accuracy found to a positive value as it is not specified104c Just set the accuracy found to a positive value as it is not specified
103c once the initial pole check is performed.105c once the initial pole check is performed.
104 if (mc_hel.eq.0) then106 if (mc_hel.eq.0) then
107
105 call sloopmatrix_thres(p,virt_wgts,tolerance,accuracies108 call sloopmatrix_thres(p,virt_wgts,tolerance,accuracies
106 $ ,ret_code)109 $ ,ret_code)
107 prec_found = accuracies(0) 110 prec_found = accuracies(0)
@@ -164,18 +167,19 @@
164c MadLoop initialization PS points.167c MadLoop initialization PS points.
165 cpol=.false.168 cpol=.false.
166 if ((firsttime .or. mc_hel.eq.0) .and. mod(ret_code,100)/10.ne.3169 if ((firsttime .or. mc_hel.eq.0) .and. mod(ret_code,100)/10.ne.3
167 $ .and. mod(ret_code,100)/10.ne.4) then 170 $ .and. mod(ret_code,100)/10.ne.4) then
168 call getpoles(p,QES2,madfks_double,madfks_single,fksprefact)171 call getpoles(p,QES2,madfks_double,madfks_single,fksprefact)
169 avgPoleRes(1)=(single+madfks_single)/2.0d0172 avgPoleRes(1)=(single+madfks_single)/2.0d0
170 avgPoleRes(2)=(double+madfks_double)/2.0d0173 avgPoleRes(2)=(double+madfks_double)/2.0d0
171 PoleDiff(1)=dabs(single - madfks_single)174 PoleDiff(1)=dabs(single - madfks_single)
172 PoleDiff(2)=dabs(double - madfks_double)175 PoleDiff(2)=dabs(double - madfks_double)
173 if ((dabs(avgPoleRes(1))+dabs(avgPoleRes(2))).ne.0d0) then176 if ((dabs(avgPoleRes(1))+dabs(avgPoleRes(2))).ne.0d0) then
174 cpol = .not. (((PoleDiff(1)+PoleDiff(2))/177 cpol = .not. ((((PoleDiff(1)+PoleDiff(2))/
175 $ (dabs(avgPoleRes(1))+dabs(avgPoleRes(2)))) .lt.178 $ (dabs(avgPoleRes(1))+dabs(avgPoleRes(2)))) .lt.
176 $ tolerance*10d0)179 $ tolerance*10d0).or.(mod(ret_code,10).eq.7))
177 else180 else
178 cpol = .not.(PoleDiff(1)+PoleDiff(2).lt.tolerance*10d0)181 cpol = .not.((PoleDiff(1)+PoleDiff(2).lt.tolerance*10d0).or.
182 $ (mod(ret_code,10).eq.7))
179 endif183 endif
180 if (tolerance.lt.0.0d0) then184 if (tolerance.lt.0.0d0) then
181 cpol = .false.185 cpol = .false.
182186
=== modified file 'Template/NLO/SubProcesses/check_poles.f'
--- Template/NLO/SubProcesses/check_poles.f 2016-03-02 09:31:23 +0000
+++ Template/NLO/SubProcesses/check_poles.f 2016-06-24 21:04:21 +0000
@@ -116,6 +116,8 @@
116c Make sure that stability checks are always used by MadLoop, even for116c Make sure that stability checks are always used by MadLoop, even for
117c initialization117c initialization
118 CALL FORCE_STABILITY_CHECK(.TRUE.)118 CALL FORCE_STABILITY_CHECK(.TRUE.)
119 CALL COLLIER_COMPUTE_UV_POLES(.TRUE.)
120 CALL COLLIER_COMPUTE_IR_POLES(.TRUE.)
119121
120200 continue122200 continue
121 calculatedborn = .false.123 calculatedborn = .false.
122124
=== modified file 'Template/NLO/SubProcesses/makefile_loop.inc'
--- Template/NLO/SubProcesses/makefile_loop.inc 2016-03-02 03:03:20 +0000
+++ Template/NLO/SubProcesses/makefile_loop.inc 2016-06-24 21:04:21 +0000
@@ -24,6 +24,7 @@
24 $(patsubst %(dotf)s,%(doto)s,$(wildcard mp_coef_construction_*.f)) \24 $(patsubst %(dotf)s,%(doto)s,$(wildcard mp_coef_construction_*.f)) \
25 $(patsubst %(dotf)s,%(doto)s,$(wildcard TIR_interface.f)) \25 $(patsubst %(dotf)s,%(doto)s,$(wildcard TIR_interface.f)) \
26 $(patsubst %(dotf)s,%(doto)s,$(wildcard GOLEM_interface.f)) \26 $(patsubst %(dotf)s,%(doto)s,$(wildcard GOLEM_interface.f)) \
27 $(patsubst %(dotf)s,%(doto)s,$(wildcard COLLIER_interface.f)) \
27 $(patsubst %(dotf)s,%(doto)s,$(wildcard compute_color_flows.f))28 $(patsubst %(dotf)s,%(doto)s,$(wildcard compute_color_flows.f))
2829
29# This is the core of madloop computationally wise, so make sure to turn optimizations on and bound checks off.30# This is the core of madloop computationally wise, so make sure to turn optimizations on and bound checks off.
3031
=== modified file 'Template/loop_material/StandAlone/Cards/MadLoopParams.dat'
--- Template/loop_material/StandAlone/Cards/MadLoopParams.dat 2016-04-06 10:19:13 +0000
+++ Template/loop_material/StandAlone/Cards/MadLoopParams.dat 2016-06-24 21:04:21 +0000
@@ -4,8 +4,8 @@
44
5! 5!
6#MLReductionLib6#MLReductionLib
7!6|1|27!7|6|1|2
8! Default :: 6|1|28! Default :: 7|6|1|2
9! The tensor integral reduction library.The current choices are:9! The tensor integral reduction library.The current choices are:
10! 1 | CutTools10! 1 | CutTools
11! 2 | PJFry++11! 2 | PJFry++
@@ -13,6 +13,7 @@
13! 4 | Golem9513! 4 | Golem95
14! 5 | Samurai14! 5 | Samurai
15! 6 | Ninja15! 6 | Ninja
16! 7 | COLLIER
16! One can use the combinations to reduce integral,e.g.17! One can use the combinations to reduce integral,e.g.
17! 1|2|3 means first use CutTools, if it is not stable, use PJFry++, 18! 1|2|3 means first use CutTools, if it is not stable, use PJFry++,
18! if it is still unstable, use IREGI. If it failed, use QP of CutTools.19! if it is still unstable, use IREGI. If it failed, use QP of CutTools.
@@ -22,15 +23,15 @@
22! When using quadruple precision with Ninja or CutTools, the reduction will 23! When using quadruple precision with Ninja or CutTools, the reduction will
23! always be done in quadruple precision, but the parameters below allow you to24! always be done in quadruple precision, but the parameters below allow you to
24! chose if you want to also recompute the *integrand* in quadruple precision.25! chose if you want to also recompute the *integrand* in quadruple precision.
25! Doing so is slow and typically does not improve the accuracy for Ninja, so it 26! Doing so is slow but might improve the accuracy in some situation.
26! is disabled by default in this case.
27#UseQPIntegrandForCutTools27#UseQPIntegrandForCutTools
28!.TRUE.28!.TRUE.
29! Default :: .TRUE.29! Default :: .TRUE.
30#UseQPIntegrandForNinja30#UseQPIntegrandForNinja
31!.FALSE.31!.TRUE.
32! Default :: .FALSE.32! Default :: .TRUE.
33!33!
34
34! =================================================================================35! =================================================================================
35! The parameters below set the parameters for IREGI36! The parameters below set the parameters for IREGI
36! =================================================================================37! =================================================================================
@@ -38,9 +39,9 @@
38#IREGIMODE39#IREGIMODE
39!240!2
40! Default :: 241! Default :: 2
41! IMODE=0, IBP reduction42! IREGIMODE=0, IBP reduction
42! IMODE=1, PaVe reduction43! IREGIMODE=1, PaVe reduction
43! IMODE=2, PaVe reduction with stablility improved by IBP reduction44! IREGIMODE=2, PaVe reduction with stablility improved by IBP reduction
4445
45#IREGIRECY46#IREGIRECY
46!.TRUE.47!.TRUE.
@@ -59,7 +60,7 @@
59! 2 | Double precision, loops reduced with propagator with reversed order 60! 2 | Double precision, loops reduced with propagator with reversed order
60! 4 | Quadruple precision, loops reduced with propagator in original order 61! 4 | Quadruple precision, loops reduced with propagator in original order
61! 5 | Quadruple precision, loops reduced with propagator with reversed order 62! 5 | Quadruple precision, loops reduced with propagator with reversed order
62! -1 |  Exhaustive automated numerical stability checks. See below for details.63! -1 | Exhaustive automated numerical stability checks. See below for details.
63! 64!
64! Due to the architecture of the program, you are better off65! Due to the architecture of the program, you are better off
65! rerunning the full PS point in quadruple precision than just a single loop 66! rerunning the full PS point in quadruple precision than just a single loop
@@ -84,8 +85,8 @@
84! Below you can chose if you want to use zero, one or two rotations of the PS point 85! Below you can chose if you want to use zero, one or two rotations of the PS point
85! in QP.86! in QP.
86#NRotations_DP87#NRotations_DP
87!188!0
88! Default :: 189! Default :: 0
89#NRotations_QP90#NRotations_QP
90!091!0
91! Default :: 092! Default :: 0
@@ -114,6 +115,7 @@
114#ImprovePSPoint115#ImprovePSPoint
115!2116!2
116! Default :: 2117! Default :: 2
118
117! =================================================================================119! =================================================================================
118! The parameters below set two CutTools internal parameters accessible to the user. 120! The parameters below set two CutTools internal parameters accessible to the user.
119! =================================================================================121! =================================================================================
@@ -226,4 +228,71 @@
226!.FALSE.228!.FALSE.
227! Default :: .FALSE.229! Default :: .FALSE.
228230
231! =================================================================================
232! The parameters below set the main parameters for COLLIER
233! To edit more specific technical COLLIER parameters, modify directly the content
234! of the subroutine 'INITCOLLIER' in the file 'MadLoopCommons.f'
235! =================================================================================
236
237! Decide if COLLIER must be computed multiple times to evaluate the UV pole residues
238! (Withing a Monte-Carlo performed in MG5aMC, this is automatically disabled internally)
239#COLLIERComputeUVpoles
240!.TRUE.
241! Default :: .TRUE.
242
243! Decide if COLLIER must be computed multiple times to evaluate the IR pole residues
244! (Withing a Monte-Carlo performed in MG5aMC, this is automatically disabled internally)
245#COLLIERComputeIRpoles
246!.TRUE.
247! Default :: .TRUE.
248
249! Decide if COLLIER must be computed multiple times to evaluate the IR pole residues
250#COLLIERRequiredAccuracy
251!1.0d-8
252! Default :: 1.0d-8
253! A value of -1.0d0 means that it will be automatically set from MLStabThres.
254! The default value of 1.0d-8 corresponds to the value for which COLLIER's authors
255! have optimized the library.
256
257! Decide whether to use COLLIER's internal stability test or the loop-direction
258! switch test instead.
259#COLLIERUseInternalStabilityTest
260!.TRUE.
261! Default :: .TRUE.
262! COLLIER's internal stability test is at no extra cost but not as reliable
263! as the loop-direction switch test, which however doubles the reduction time.
264! This parameter is only relevant when running MadLoop with CTModeRun=-1.
265! If you find a large number of unstable points with COLLIER for complicated
266! processes, set this parameter to .FALSE. to make sure the PS points flagged
267! as unstable with COLLIER really are so.
268
269! Set up to which N-loop to use the COLLIER global caching system.
270#COLLIERGlobalCache
271!-1
272! Default :: -1
273! -1 : Enable the global cache for all loops
274! 0 : Disable the global cache alltogether
275! N : Enable the global cache but only for up to N-loops
276
277! Use the global cache when evaluating the poles as well (more memory consuming)
278! During a Monte-Carlo it is typically not useful anyway, because the pole
279! computation is automatically disabled for COLLIER, irrespectively of the value
280! of the parameters COLLIERCompute<UV/IR>poles specified above.
281#COLLIERUseCacheForPoles
282!.FALSE.
283! Default :: .FALSE.
284
285! Choose which branch(es) of COLLIER have to be used
286#COLLIERMode
287!1
288! Default :: 1
289! COLLIERMode=1 : COLI branch
290! COLLIERMode=2 : DD branch
291! COLLIERMode=3 : Both DD and COLI branch compared
292
293! Decide if COLLIER can output its information in a log directory.
294#COLLIERCanOutput
295!.FALSE.
296! Default :: .FALSE.
297
229/* End of param file */298/* End of param file */
230299
=== modified file 'Template/loop_material/StandAlone/SubProcesses/MadLoopCommons.inc'
--- Template/loop_material/StandAlone/SubProcesses/MadLoopCommons.inc 2016-02-08 23:58:00 +0000
+++ Template/loop_material/StandAlone/SubProcesses/MadLoopCommons.inc 2016-06-24 21:04:21 +0000
@@ -30,6 +30,86 @@
3030
31 end31 end
3232
33
34## if(collier_available){
35 SUBROUTINE INITCOLLIER()
36C
37C INITIALISATION OF COLLIER
38C
39C
40C MODULE
41C
42 USE COLLIER
43C
44C CONSTANTS
45C
46 character(len=*) no_folder
47 parameter (no_folder='')
48 character(len=*) folderOutput
49 parameter (folderOutput='COLLIER_output')
50
51C Force COLLIER to completely reset from scratch
52 logical noreset
53 parameter (noreset=.FALSE.)
54C
55C LOCAL VARIABLES
56C
57 INTEGER N_CACHES
58C
59C GLOBAL VARIABLES
60C
61 include 'MadLoopParams.inc'
62C Now obtain the overall maximum rank, maximum external lines
63C and maximal number of processes.
64 include 'global_specs.inc'
65
66C ----------
67C BEGIN CODE
68C ----------
69
70C Initialize Collier
71 IF (.NOT.COLLIERCanOutput) THEN
72 CALL Init_cll(MAXNEXTERNAL,OVERALLMAXRANK,no_folder,noreset)
73 ELSE
74 CALL Init_cll(MAXNEXTERNAL,OVERALLMAXRANK,folderOutput,noreset)
75 ENDIF
76
77C Set target accuracy, be conservative w.r.t user request
78C Keep in mind that COLLIER has been optimized for 1d-8.
79 IF (COLLIERRequiredAccuracy.eq.-1.0d0) THEN
80 CALL SetReqAcc_cll(MLStabThres*1.0d-3)
81 ELSE
82 CALL SetReqAcc_cll(COLLIERRequiredAccuracy)
83 ENDIF
84
85C Set COLLIER mode
86 CALL SetMode_cll(COLLIERMode)
87
88C Set the global cache strategy
89C If we use the caches for the poles as well, then it is a total of
90C 4 caches per process.
91 IF (COLLIERUseCacheForPoles) THEN
92 N_CACHES =4*NPROCS
93 ELSE
94 N_CACHES =NPROCS
95 ENDIF
96 IF (COLLIERGlobalCache.eq.-1) THEN
97 CALL InitCacheSystem_cll(N_CACHES,MAXNEXTERNAL)
98 ELSEIF(COLLIERGlobalCache.gt.0) THEN
99 CALL InitCacheSystem_cll(N_CACHES,COLLIERGlobalCache)
100 ENDIF
101
102C Make sure to start by first switching off all cache
103 IF (COLLIERGlobalCache.ne.0) THEN
104 call SwitchOffCacheSystem_cll()
105 ENDIF
106
107C Specify below your other custom COLLIER parameter settings
108C [user_specific_COLLIER_settings]
109
110 END
111## }
112
33 SUBROUTINE SET_FORBID_HEL_DOUBLECHECK(ONOFF)113 SUBROUTINE SET_FORBID_HEL_DOUBLECHECK(ONOFF)
34C114C
35C Give the possibility to overwrite the value of MadLoopParams.dat115C Give the possibility to overwrite the value of MadLoopParams.dat
@@ -67,9 +147,10 @@
67 DATA ML_INIT/.TRUE./147 DATA ML_INIT/.TRUE./
68 common/ML_INIT/ML_INIT148 common/ML_INIT/ML_INIT
69149
70 LOGICAL CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT150 LOGICAL CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT,COLLIERINIT
71 DATA CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT/.TRUE.,.TRUE.,.TRUE.,.TRUE.,.TRUE./151 DATA CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT,COLLIERINIT/.TRUE.,.TRUE.,.TRUE.,.TRUE.,.TRUE.,.TRUE./
72 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT152 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT, COLLIERINIT
153
73154
74 character(512) MLPath155 character(512) MLPath
75 data MLPath/'[[NA]]'/ 156 data MLPath/'[[NA]]'/
@@ -163,6 +244,8 @@
163C Stable with Samurai.244C Stable with Samurai.
164C U == 6245C U == 6
165C Stable with Ninja in double precision.246C Stable with Ninja in double precision.
247C U == 7
248C Stable with COLLIER.
166C U == 8249C U == 8
167C Stable with Ninja in quadruple precision.250C Stable with Ninja in quadruple precision.
168C U == 9251C U == 9
@@ -201,10 +284,10 @@
201 STOP 'Only CutTools and Ninja can use quardruple precision'284 STOP 'Only CutTools and Ninja can use quardruple precision'
202 ENDIF285 ENDIF
203 ENDIF286 ENDIF
204 IF(MLRed.GE.1.AND.MLRed.LE.6)THEN287 IF(MLRed.GE.1.AND.MLRed.LE.7)THEN
205 SET_RET_CODE_U=MLRed288 SET_RET_CODE_U=MLRed
206 ELSE289 ELSE
207 STOP 'Only CutTools, PJFry++, IREGI, Golem95, Samurai and Ninja are available'290 STOP 'Only CutTools, PJFry++, IREGI, Golem95, Samurai, Ninja and COLLIER are available'
208 ENDIF291 ENDIF
209 END292 END
210293
@@ -249,8 +332,11 @@
249 ELSEIF(LIBNUM.EQ.6)THEN332 ELSEIF(LIBNUM.EQ.6)THEN
250C Ninja 333C Ninja
251 CALL DETECT_NINJA(NLOOPLINE,RANK,complex_mass,LPASS)334 CALL DETECT_NINJA(NLOOPLINE,RANK,complex_mass,LPASS)
335 ELSEIF(LIBNUM.EQ.7)THEN
336C Collier
337 CALL DETECT_COLLIER(NLOOPLINE,RANK,complex_mass,LPASS)
252 ELSE338 ELSE
253 STOP 'ONLY CUTTOOLS,PJFry++,IREGI,Golem95 and Samurai are available'339 STOP 'Only CutTools, PJFry++, IREGI, Golem95, Samurai, Ninja and COLLIER are available'
254 ENDIF340 ENDIF
255 RETURN341 RETURN
256 END342 END
@@ -358,6 +444,65 @@
358 RETURN444 RETURN
359 END445 END
360446
447## if(collier_available){
448 SUBROUTINE DETECT_COLLIER(NLOOPLINE,RANK,complex_mass,LPASS)
449C
450C Detect whether Collier can be used or not
451C
452 USE COLLIER
453 IMPLICIT NONE
454C
455C CONSTANTS
456C
457C
458C ARGUMENTS
459C
460 INTEGER NLOOPLINE,RANK
461 LOGICAL complex_mass,LPASS
462C
463C LOCAL VARIABLES
464C
465 INTEGER CURRENT_COLLIERMODE
466C
467C GLOBAL VARIABLES
468C
469 LOGICAL CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT,COLLIERINIT
470 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT, COLLIERINIT
471 include 'MadLoopParams.inc'
472C ----------
473C BEGIN CODE
474C ----------
475 if (.NOT.COLLIERINIT) THEN
476 CALL GETMODE_CLL(CURRENT_COLLIERMODE)
477 ELSE
478 CURRENT_COLLIERMODE = COLLIERMODE
479 ENDIF
480 LPASS=.TRUE.
481 IF (CURRENT_COLLIERMODE.NE.1) THEN
482C The DD branch is used and it has limitations
483 IF((NLOOPLINE.GT.6).OR.(RANK.GT.NLOOPLINE)) then
484 LPASS=.FALSE.
485 endif
486 ELSE
487C Limitations of the COLI branch are academic.
488 LPASS=.TRUE.
489 ENDIF
490 RETURN
491 END
492## }else{
493 SUBROUTINE DETECT_COLLIER(NLOOPLINE,RANK,complex_mass,LPASS)
494C
495C ARGUMENTS
496C
497 INTEGER NLOOPLINE,RANK
498 LOGICAL complex_mass,LPASS
499C
500C COLLIER is not available in this output. This subroutine is dummy.
501C
502 LPASS=.True.
503 END
504## }
505
361 SUBROUTINE DETECT_PJFRY(NLOOPLINE,RANK,complex_mass,LPASS)506 SUBROUTINE DETECT_PJFRY(NLOOPLINE,RANK,complex_mass,LPASS)
362C507C
363C DETECT whether PJFRY++ CAN BE USED OR NOT508C DETECT whether PJFRY++ CAN BE USED OR NOT
364509
=== modified file 'Template/loop_material/StandAlone/SubProcesses/MadLoopParamReader.f'
--- Template/loop_material/StandAlone/SubProcesses/MadLoopParamReader.f 2016-02-18 11:42:56 +0000
+++ Template/loop_material/StandAlone/SubProcesses/MadLoopParamReader.f 2016-06-24 21:04:21 +0000
@@ -33,6 +33,12 @@
33 stop 'CTModeRun must be >= -1 and <=6.'33 stop 'CTModeRun must be >= -1 and <=6.'
34 endif 34 endif
3535
36 else if (buff .eq. '#COLLIERGlobalCache') then
37 read(666,*,end=999) COLLIERGlobalCache
38 if (COLLIERGlobalCache .lt. -1) then
39 stop 'COLLIERGlobalCache must be >= -1'
40 endif
41
36 else if (buff .eq. '#NRotations_DP') then42 else if (buff .eq. '#NRotations_DP') then
37 read(666,*,end=999) NRotations_DP43 read(666,*,end=999) NRotations_DP
38 if (NRotations_DP .lt. 0 .or.44 if (NRotations_DP .lt. 0 .or.
@@ -52,7 +58,14 @@
52 if (MLStabThres.lt.0.0d0) then58 if (MLStabThres.lt.0.0d0) then
53 stop 'MLStabThres must be >= 0'59 stop 'MLStabThres must be >= 0'
54 endif60 endif
55 61
62 else if (buff .eq. '#COLLIERRequiredAccuracy') then
63 read(666,*,end=999) COLLIERRequiredAccuracy
64 if (COLLIERRequiredAccuracy.le.0.0d0.and.
65 & COLLIERRequiredAccuracy.ne.-1.0d0) then
66 stop 'COLLIERRequiredAccuracy must be > 0 or = -1.0'
67 endif
68
56 else if (buff .eq. '#CTLoopLibrary') then69 else if (buff .eq. '#CTLoopLibrary') then
57 read(666,*,end=999) CTLoopLibrary70 read(666,*,end=999) CTLoopLibrary
58 if (CTLoopLibrary.lt.2 .or.71 if (CTLoopLibrary.lt.2 .or.
@@ -90,6 +103,21 @@
90 stop 'MaxAttempts must be >= 1'103 stop 'MaxAttempts must be >= 1'
91 endif104 endif
92105
106 else if (buff .eq. '#COLLIERComputeUVpoles') then
107 read(666,*,end=999) COLLIERComputeUVpoles
108
109 else if (buff .eq. '#COLLIERComputeIRpoles') then
110 read(666,*,end=999) COLLIERComputeIRpoles
111
112 else if (buff .eq. '#COLLIERUseInternalStabilityTest') then
113 read(666,*,end=999) COLLIERUseInternalStabilityTest
114
115 else if (buff .eq. '#COLLIERUseCacheForPoles') then
116 read(666,*,end=999) COLLIERUseCacheForPoles
117
118 else if (buff .eq. '#COLLIERCanOutput') then
119 read(666,*,end=999) COLLIERCanOutput
120
93 else if (buff .eq. '#UseLoopFilter') then121 else if (buff .eq. '#UseLoopFilter') then
94 read(666,*,end=999) UseLoopFilter122 read(666,*,end=999) UseLoopFilter
95123
@@ -127,7 +155,7 @@
127155
128 else if (buff .eq. '#MLReductionLib') then156 else if (buff .eq. '#MLReductionLib') then
129 read(666,*,end=999) MLReductionLib_str157 read(666,*,end=999) MLReductionLib_str
130 MLReductionLib(1:6)=0158 MLReductionLib(1:7)=0
131 MLReductionLib_str_save=MLReductionLib_str159 MLReductionLib_str_save=MLReductionLib_str
132 j=0160 j=0
133 DO161 DO
@@ -149,6 +177,8 @@
149 MLRed=5177 MLRed=5
150 ELSEIF(MLReductionLib_char.EQ.'6 ')THEN178 ELSEIF(MLReductionLib_char.EQ.'6 ')THEN
151 MLRed=6179 MLRed=6
180 ELSEIF(MLReductionLib_char.EQ.'7 ')THEN
181 MLRed=7
152 ELSE182 ELSE
153 PRINT *, 'MLReductionLib is wrong: '//183 PRINT *, 'MLReductionLib is wrong: '//
154 $ TRIM(MLReductionLib_str_save)184 $ TRIM(MLReductionLib_str_save)
@@ -171,6 +201,12 @@
171 MLReductionLib_str=MLReductionLib_str(i+1:)201 MLReductionLib_str=MLReductionLib_str(i+1:)
172 ENDIF202 ENDIF
173 ENDDO203 ENDDO
204 else if (buff .eq. '#COLLIERMode') then
205 read(666,*,end=999) COLLIERMode
206 if (COLLIERMode .lt. 1 .or.
207 & COLLIERMode .gt.3) then
208 stop 'COLLIERMode must be >=1 and <=3.'
209 endif
174 else if (buff .eq. '#IREGIRECY') then210 else if (buff .eq. '#IREGIRECY') then
175 read(666,*,end=999) IREGIRECY211 read(666,*,end=999) IREGIRECY
176 else if (buff .eq. '#IREGIMODE') then212 else if (buff .eq. '#IREGIMODE') then
@@ -218,8 +254,6 @@
218 & '==============================================================='254 & '==============================================================='
219 write(*,*) ' > MLReductionLib = '255 write(*,*) ' > MLReductionLib = '
220 $ //TRIM(MLReductionLib_str_save)256 $ //TRIM(MLReductionLib_str_save)
221 write(*,*) ' > IREGIMODE = ',IREGIMODE
222 write(*,*) ' > IREGIRECY = ',IREGIRECY
223 write(*,*) ' > CTModeRun = ',CTModeRun257 write(*,*) ' > CTModeRun = ',CTModeRun
224 write(*,*) ' > MLStabThres = ',MLStabThres258 write(*,*) ' > MLStabThres = ',MLStabThres
225 write(*,*) ' > NRotations_DP = ',NRotations_DP259 write(*,*) ' > NRotations_DP = ',NRotations_DP
@@ -243,6 +277,19 @@
243 &UseQPIntegrandForNinja277 &UseQPIntegrandForNinja
244 write(*,*) ' > UseQPIntegrandForCutTools = ',278 write(*,*) ' > UseQPIntegrandForCutTools = ',
245 &UseQPIntegrandForCutTools279 &UseQPIntegrandForCutTools
280 write(*,*) ' > IREGIMODE = ',IREGIMODE
281 write(*,*) ' > IREGIRECY = ',IREGIRECY
282 write(*,*) ' > COLLIERMode = ',COLLIERMode
283 write(*,*) ' > COLLIERRequiredAccuracy = ',
284 $COLLIERRequiredAccuracy
285 write(*,*) ' > COLLIERCanOutput = ',COLLIERCanOutput
286 write(*,*) ' > COLLIERComputeUVpoles = ',COLLIERComputeUVpoles
287 write(*,*) ' > COLLIERComputeIRpoles = ',COLLIERComputeIRpoles
288 write(*,*) ' > COLLIERGlobalCache = ',COLLIERGlobalCache
289 write(*,*) ' > COLLIERUseCacheForPoles = ',
290 &COLLIERUseCacheForPoles
291 write(*,*) ' > COLLIERUseInternalStabilityTest = ',
292 &COLLIERUseInternalStabilityTest
246 write(*,*)293 write(*,*)
247 & '==============================================================='294 & '==============================================================='
248 paramPrinted=.TRUE.295 paramPrinted=.TRUE.
@@ -259,12 +306,20 @@
259 include "MadLoopParams.inc"306 include "MadLoopParams.inc"
260307
261 MLReductionLib(1)=6308 MLReductionLib(1)=6
262 MLReductionLib(2:6)=0309 MLReductionLib(2:7)=0
263 IREGIMODE=2310 IREGIMODE=2
264 IREGIRECY=.TRUE.311 IREGIRECY=.TRUE.
312 COLLIERComputeIRpoles = .TRUE.
313 COLLIERComputeUVpoles = .TRUE.
314 COLLIERUseCacheForPoles = .FALSE.
315 COLLIERCanOutput = .FALSE.
316 COLLIERGlobalCache = -1
317 COLLIERMode=1
318 COLLIERRequiredAccuracy=1.0d-8
319 COLLIERUseInternalStabilityTest = .TRUE.
265 CTModeInit=0320 CTModeInit=0
266 CTModeRun=-1321 CTModeRun=-1
267 NRotations_DP=1322 NRotations_DP=0
268 NRotations_QP=0323 NRotations_QP=0
269 MLStabThres=1.0d-3324 MLStabThres=1.0d-3
270 CTStabThres=1.0d-2325 CTStabThres=1.0d-2
@@ -281,6 +336,6 @@
281 OSThres=1.0d-13336 OSThres=1.0d-13
282 ImprovePSPoint=2337 ImprovePSPoint=2
283 UseQPIntegrandForCutTools=.True.338 UseQPIntegrandForCutTools=.True.
284 UseQPIntegrandForNinja=.False.339 UseQPIntegrandForNinja=.True.
285340
286 end341 end
287342
=== modified file 'Template/loop_material/StandAlone/SubProcesses/MadLoopParams.inc'
--- Template/loop_material/StandAlone/SubProcesses/MadLoopParams.inc 2016-02-18 11:42:56 +0000
+++ Template/loop_material/StandAlone/SubProcesses/MadLoopParams.inc 2016-06-24 21:04:21 +0000
@@ -7,17 +7,24 @@
7!7!
8 integer CTModeInit,CTModeRun,CheckCycle,MaxAttempts,8 integer CTModeInit,CTModeRun,CheckCycle,MaxAttempts,
9 &CTLoopLibrary,NRotations_DP,NRotations_QP,ImprovePSPoint,9 &CTLoopLibrary,NRotations_DP,NRotations_QP,ImprovePSPoint,
10 &MLReductionLib(7),IREGIMODE,HelicityFilterLevel10 &MLReductionLib(8),IREGIMODE,HelicityFilterLevel,COLLIERMode,
1111 &COLLIERGlobalCache
12 real*8 MLStabThres,CTStabThres,ZeroThres,OSThres12
1313 real*8 MLStabThres,CTStabThres,ZeroThres,OSThres,COLLIERRequiredAccuracy
14 logical UseLoopFilter,LoopInitStartOver,DoubleCheckHelicityFilter14
15 logical UseLoopFilter,LoopInitStartOver,DoubleCheckHelicityFilter,
16 &COLLIERComputeIRpoles,COLLIERComputeUVpoles,COLLIERCanOutput
15 logical HelInitStartOver,IREGIRECY,WriteOutFilters17 logical HelInitStartOver,IREGIRECY,WriteOutFilters
16 logical UseQPIntegrandForNinja, UseQPIntegrandForCutTools18 logical UseQPIntegrandForNinja, UseQPIntegrandForCutTools
19 logical COLLIERUseCacheForPoles,COLLIERUseInternalStabilityTest
1720
18 common /MADLOOP/CTModeInit,CTModeRun,NRotations_DP,NRotations_QP,21 common /MADLOOP/CTModeInit,CTModeRun,NRotations_DP,NRotations_QP,
22 &COLLIERMode,COLLIERGlobalCache,
19 &ImprovePSPoint,CheckCycle, MaxAttempts,UseLoopFilter,MLStabThres,23 &ImprovePSPoint,CheckCycle, MaxAttempts,UseLoopFilter,MLStabThres,
24 &COLLIERRequiredAccuracy,
20 &CTStabThres,CTLoopLibrary,LoopInitStartOver,25 &CTStabThres,CTLoopLibrary,LoopInitStartOver,
26 &COLLIERComputeIRpoles,COLLIERComputeUVpoles,COLLIERCanOutput,
27 &COLLIERUseCacheForPoles,COLLIERUseInternalStabilityTest,
21 &DoubleCheckHelicityFilter,ZeroThres,OSThres,HelInitStartOver,28 &DoubleCheckHelicityFilter,ZeroThres,OSThres,HelInitStartOver,
22 &MLReductionLib,IREGIMODE,HelicityFilterLevel,IREGIRECY,29 &MLReductionLib,IREGIMODE,HelicityFilterLevel,IREGIRECY,
23 &WriteOutFilters,UseQPIntegrandForNinja,UseQPIntegrandForCutTools30 &WriteOutFilters,UseQPIntegrandForNinja,UseQPIntegrandForCutTools
2431
=== modified file 'Template/loop_material/StandAlone/SubProcesses/makefile'
--- Template/loop_material/StandAlone/SubProcesses/makefile 2016-05-26 23:36:59 +0000
+++ Template/loop_material/StandAlone/SubProcesses/makefile 2016-06-24 21:04:21 +0000
@@ -45,6 +45,7 @@
45 $(patsubst $(DOTF),$(DOTO),$(wildcard mp_coef_construction_*.f)) \45 $(patsubst $(DOTF),$(DOTO),$(wildcard mp_coef_construction_*.f)) \
46 $(patsubst $(DOTF),$(DOTO),$(wildcard TIR_interface.f)) \46 $(patsubst $(DOTF),$(DOTO),$(wildcard TIR_interface.f)) \
47 $(patsubst $(DOTF),$(DOTO),$(wildcard GOLEM_interface.f)) \47 $(patsubst $(DOTF),$(DOTO),$(wildcard GOLEM_interface.f)) \
48 $(patsubst $(DOTF),$(DOTO),$(wildcard COLLIER_interface.f)) \
48 $(patsubst $(DOTF),$(DOTO),$(wildcard compute_color_flows.f))49 $(patsubst $(DOTF),$(DOTO),$(wildcard compute_color_flows.f))
4950
50OLP_PROCESS= MadLoopParamReader.o MadLoopCommons.o \51OLP_PROCESS= MadLoopParamReader.o MadLoopCommons.o \
@@ -64,6 +65,7 @@
64 $(patsubst $(DOTF),$(DOTO),$(wildcard $(LOOP_PREFIX)*/mp_coef_construction_*.f)) \65 $(patsubst $(DOTF),$(DOTO),$(wildcard $(LOOP_PREFIX)*/mp_coef_construction_*.f)) \
65 $(patsubst $(DOTF),$(DOTO),$(wildcard $(LOOP_PREFIX)*/TIR_interface.f)) \66 $(patsubst $(DOTF),$(DOTO),$(wildcard $(LOOP_PREFIX)*/TIR_interface.f)) \
66 $(patsubst $(DOTF),$(DOTO),$(wildcard $(LOOP_PREFIX)*/GOLEM_interface.f)) \67 $(patsubst $(DOTF),$(DOTO),$(wildcard $(LOOP_PREFIX)*/GOLEM_interface.f)) \
68 $(patsubst $(DOTF),$(DOTO),$(wildcard $(LOOP_PREFIX)*/COLLIER_interface.f)) \
67 $(patsubst $(DOTF),$(DOTO),$(wildcard $(LOOP_PREFIX)*/compute_color_flows.f))69 $(patsubst $(DOTF),$(DOTO),$(wildcard $(LOOP_PREFIX)*/compute_color_flows.f))
6870
69$(PROG): check_sa.o $(PROCESS) makefile $(LIBS)71$(PROG): check_sa.o $(PROCESS) makefile $(LIBS)
7072
=== modified file 'UpdateNotes.txt'
--- UpdateNotes.txt 2016-06-08 08:59:13 +0000
+++ UpdateNotes.txt 2016-06-24 21:04:21 +0000
@@ -1,6 +1,19 @@
1Update notes for MadGraph5_aMC@NLO (in reverse time order)1Update notes for MadGraph5_aMC@NLO (in reverse time order)
22
32.4.1 (xx/xx/xx)32.4.3 (xx/xx/xx)
4 OM: Reduce the amount of log file/output generated for LO run (output can use up to three times less output).
5 OM: For the LO combination of events (unweighting) pass to the method previously used for loop-induced.
6 This method is faster and requires less I/O operation.
7 This fully remove the need of the file events.lhe.gz which is not created anymore (further reduce the ouput size)
8 OM: Optimise the code in order to be able to run scan with more than 2k steps.
9 OM: Optimise the lhe_parser module (use for the unweighting/re-weighing/...) around 20% faster than before.
10
11
122.4.2 (10/06/16)
13 OM: fix a compilation problem for non standard gfortran system
14 OM: reduce the need of lhapdf for standard LO run. (was making some run to test due to missing dependencies)
15
162.4.1 (10/06/16)
4 OM: Fix a bug in fix target experiment with PDF on the particle at rest.17 OM: Fix a bug in fix target experiment with PDF on the particle at rest.
5 The cross-section was correct but the z-boost was not performed correctly.18 The cross-section was correct but the z-boost was not performed correctly.
6 OM: Fix various bug in MadSpin19 OM: Fix various bug in MadSpin
@@ -8,7 +21,7 @@
8 OM: Allow to specify a path for a custom directory where to look for model via the environment 21 OM: Allow to specify a path for a custom directory where to look for model via the environment
9 variable PYTHONPATH. Note this used AFTER the standard ./models directory22 variable PYTHONPATH. Note this used AFTER the standard ./models directory
1023
112.4.0 (12/06/16)242.4.0 (12/05/16)
12 OM: Allowing the proper NLO reweighting for NLO sample25 OM: Allowing the proper NLO reweighting for NLO sample
13 RF: For NLO processes allow for multiple PDF and scales reweighting, directy by inputting lists26 RF: For NLO processes allow for multiple PDF and scales reweighting, directy by inputting lists
14 in the run_card.dat.27 in the run_card.dat.
1528
=== modified file 'VERSION'
--- VERSION 2016-05-13 12:40:54 +0000
+++ VERSION 2016-06-24 21:04:21 +0000
@@ -1,5 +1,5 @@
1version = 2.4.1.beta1version = 2.4.2
2date = 2016-04-062date = 2016-06-10
33
44
55
66
=== modified file 'input/.mg5_configuration_default.txt'
--- input/.mg5_configuration_default.txt 2016-04-28 19:07:40 +0000
+++ input/.mg5_configuration_default.txt 2016-06-24 21:04:21 +0000
@@ -180,12 +180,17 @@
180#! if samurai=/PATH/TO/samurai/lib: use that specific installation path for samurai180#! if samurai=/PATH/TO/samurai/lib: use that specific installation path for samurai
181# samurai = None181# samurai = None
182182
183#! Set the samurai directory containing ninja's library183#! Set the Ninja directory containing ninja's library
184#! if auto: try to find it automatically on the system (default)
185#! if '' or None: disabling ninja 184#! if '' or None: disabling ninja
186#! if ninja=/PATH/TO/ninja/lib: use that specific installation path for ninja 185#! if ninja=/PATH/TO/ninja/lib: use that specific installation path for ninja
187# ninja = ./HEPTools/lib186# ninja = ./HEPTools/lib
188187
188#! Set the COLLIER directory containing COLLIER's library
189#! if '' or None: disabling COLLIER
190#! if ninja=/PATH/TO/ninja/lib: use that specific installation path for COLLIER
191# Note that it is necessary that you have generated a static library for COLLIER
192# collier = ./HEPTools/lib
193
189#! Set how MadLoop dependencies (such as CutTools) should be handled194#! Set how MadLoop dependencies (such as CutTools) should be handled
190#! > external : ML5 places a link to the MG5_aMC-wide libraries195#! > external : ML5 places a link to the MG5_aMC-wide libraries
191#! > internal : ML5 copies all dependencies in the output so that it is independent196#! > internal : ML5 copies all dependencies in the output so that it is independent
192197
=== modified file 'madgraph/interface/amcatnlo_run_interface.py'
--- madgraph/interface/amcatnlo_run_interface.py 2016-05-26 09:31:57 +0000
+++ madgraph/interface/amcatnlo_run_interface.py 2016-06-24 21:04:21 +0000
@@ -120,7 +120,8 @@
120 input = pjoin(me_dir, '%s_input.txt' % test)120 input = pjoin(me_dir, '%s_input.txt' % test)
121 #this can be improved/better written to handle the output121 #this can be improved/better written to handle the output
122 misc.call(['./%s' % (test)], cwd=this_dir, 122 misc.call(['./%s' % (test)], cwd=this_dir,
123 stdin = open(input), stdout=open(pjoin(this_dir, '%s.log' % test), 'w'))123 stdin = open(input), stdout=open(pjoin(this_dir, '%s.log' % test), 'w'),
124 close_fds=True)
124 if test == 'check_poles' and os.path.exists(pjoin(this_dir,'MadLoop5_resources')) :125 if test == 'check_poles' and os.path.exists(pjoin(this_dir,'MadLoop5_resources')) :
125 tf=tarfile.open(pjoin(this_dir,'MadLoop5_resources.tar.gz'),'w:gz',126 tf=tarfile.open(pjoin(this_dir,'MadLoop5_resources.tar.gz'),'w:gz',
126 dereference=True)127 dereference=True)
@@ -132,7 +133,8 @@
132 open(pjoin(this_dir, 'gensym_input.txt'), 'w').write('%s\n' % run_mode)133 open(pjoin(this_dir, 'gensym_input.txt'), 'w').write('%s\n' % run_mode)
133 misc.call(['./gensym'],cwd= this_dir,134 misc.call(['./gensym'],cwd= this_dir,
134 stdin=open(pjoin(this_dir, 'gensym_input.txt')),135 stdin=open(pjoin(this_dir, 'gensym_input.txt')),
135 stdout=open(pjoin(this_dir, 'gensym.log'), 'w')) 136 stdout=open(pjoin(this_dir, 'gensym.log'), 'w'),
137 close_fds=True)
136 #compile madevent_mintMC/mintFO138 #compile madevent_mintMC/mintFO
137 misc.compile([exe], cwd=this_dir, job_specs = False)139 misc.compile([exe], cwd=this_dir, job_specs = False)
138 if mode in ['aMC@NLO', 'aMC@LO', 'noshower', 'noshowerLO']:140 if mode in ['aMC@NLO', 'aMC@LO', 'noshower', 'noshowerLO']:
@@ -516,7 +518,8 @@
516 input_file = filenames[0]518 input_file = filenames[0]
517 output_file = pjoin(self.me_dir, 'Events', 'pythia_events.hep')519 output_file = pjoin(self.me_dir, 'Events', 'pythia_events.hep')
518 lock = cluster.asyncrone_launch('gunzip',stdout=open(output_file,'w'), 520 lock = cluster.asyncrone_launch('gunzip',stdout=open(output_file,'w'),
519 argument=['-c', input_file])521 argument=['-c', input_file],
522 close_fds=True)
520 else:523 else:
521 if tag: 524 if tag:
522 self.run_card['run_tag'] = tag525 self.run_card['run_tag'] = tag
@@ -576,7 +579,8 @@
576 input_file = filenames[0]579 input_file = filenames[0]
577 output_file = pjoin(self.me_dir, 'Events', 'pythia_events.hep')580 output_file = pjoin(self.me_dir, 'Events', 'pythia_events.hep')
578 lock = cluster.asyncrone_launch('gunzip',stdout=open(output_file,'w'), 581 lock = cluster.asyncrone_launch('gunzip',stdout=open(output_file,'w'),
579 argument=['-c', input_file])582 argument=['-c', input_file],
583 close_fds=True)
580 else:584 else:
581 if tag:585 if tag:
582 self.run_card['run_tag'] = tag586 self.run_card['run_tag'] = tag
@@ -1331,8 +1335,6 @@
1331 nevents=self.run_card['nevents']1335 nevents=self.run_card['nevents']
1332 return self.reweight_and_collect_events(options, mode, nevents, event_norm)1336 return self.reweight_and_collect_events(options, mode, nevents, event_norm)
13331337
1334 devnull = os.open(os.devnull, os.O_RDWR)
1335
1336 if mode in ['LO', 'NLO']:1338 if mode in ['LO', 'NLO']:
1337 # this is for fixed order runs1339 # this is for fixed order runs
1338 mode_dict = {'NLO': 'all', 'LO': 'born'}1340 mode_dict = {'NLO': 'all', 'LO': 'born'}
@@ -1962,7 +1964,6 @@
1962 logger.info('The results of this run' + \1964 logger.info('The results of this run' + \
1963 ' have been saved in %s' % pjoin(self.me_dir, 'Events', self.run_name))1965 ' have been saved in %s' % pjoin(self.me_dir, 'Events', self.run_name))
19641966
1965
1966 def combine_plots_HwU(self,jobs,out,normalisation=None):1967 def combine_plots_HwU(self,jobs,out,normalisation=None):
1967 """Sums all the plots in the HwU format."""1968 """Sums all the plots in the HwU format."""
1968 logger.debug('Combining HwU plots.')1969 logger.debug('Combining HwU plots.')
@@ -2399,6 +2400,7 @@
2399 4 : 'Golem95',2400 4 : 'Golem95',
2400 5 : 'Samurai',2401 5 : 'Samurai',
2401 6 : 'Ninja (double precision)',2402 6 : 'Ninja (double precision)',
2403 7 : 'COLLIER',
2402 8 : 'Ninja (quadruple precision)',2404 8 : 'Ninja (quadruple precision)',
2403 9 : 'CutTools (quadruple precision)'}2405 9 : 'CutTools (quadruple precision)'}
2404 RetUnit_finder =re.compile(2406 RetUnit_finder =re.compile(
@@ -2887,8 +2889,8 @@
2887 fjwrapper_lines[fjwrapper_lines.index(line)] = include_line2889 fjwrapper_lines[fjwrapper_lines.index(line)] = include_line
2888 if '//NAMESPACE_FJ' in line:2890 if '//NAMESPACE_FJ' in line:
2889 fjwrapper_lines[fjwrapper_lines.index(line)] = namespace_line2891 fjwrapper_lines[fjwrapper_lines.index(line)] = namespace_line
2890 open(pjoin(self.me_dir, 'MCatNLO', 'srcCommon', 'myfastjetfortran.cc'), 'w').write(\2892 with open(pjoin(self.me_dir, 'MCatNLO', 'srcCommon', 'myfastjetfortran.cc'), 'w') as fsock:
2891 '\n'.join(fjwrapper_lines) + '\n')2893 fsock.write('\n'.join(fjwrapper_lines) + '\n')
28922894
2893 extrapaths = self.shower_card['extrapaths'].split()2895 extrapaths = self.shower_card['extrapaths'].split()
28942896
@@ -2940,7 +2942,8 @@
29402942
2941 misc.call(['./MCatNLO_MadFKS.inputs'], stdout=open(mcatnlo_log, 'w'),2943 misc.call(['./MCatNLO_MadFKS.inputs'], stdout=open(mcatnlo_log, 'w'),
2942 stderr=open(mcatnlo_log, 'w'), 2944 stderr=open(mcatnlo_log, 'w'),
2943 cwd=pjoin(self.me_dir, 'MCatNLO'))2945 cwd=pjoin(self.me_dir, 'MCatNLO'),
2946 close_fds=True)
29442947
2945 exe = 'MCATNLO_%s_EXE' % shower2948 exe = 'MCATNLO_%s_EXE' % shower
2946 if not os.path.exists(pjoin(self.me_dir, 'MCatNLO', exe)) and \2949 if not os.path.exists(pjoin(self.me_dir, 'MCatNLO', exe)) and \
@@ -3017,8 +3020,8 @@
3017 out_id = 'TOP'3020 out_id = 'TOP'
30183021
3019 # write the executable3022 # write the executable
3020 open(pjoin(rundir, 'shower.sh'), 'w').write(\3023 with open(pjoin(rundir, 'shower.sh'), 'w') as fsock:
3021 open(pjoin(self.me_dir, 'MCatNLO', 'shower_template.sh')).read() \3024 fsock.write(open(pjoin(self.me_dir, 'MCatNLO', 'shower_template.sh')).read() \
3022 % {'extralibs': ':'.join(extrapaths)})3025 % {'extralibs': ':'.join(extrapaths)})
3023 subprocess.call(['chmod', '+x', pjoin(rundir, 'shower.sh')])3026 subprocess.call(['chmod', '+x', pjoin(rundir, 'shower.sh')])
30243027
@@ -4097,7 +4100,8 @@
4097 exe = 'madevent_mintMC'4100 exe = 'madevent_mintMC'
4098 tests = ['test_ME', 'test_MC']4101 tests = ['test_ME', 'test_MC']
4099 # write an analyse_opts with a dummy analysis so that compilation goes through4102 # write an analyse_opts with a dummy analysis so that compilation goes through
4100 open(pjoin(self.me_dir, 'SubProcesses', 'analyse_opts'),'w').write('FO_ANALYSE=analysis_dummy.o dbook.o open_output_files_dummy.o HwU_dummy.o\n')4103 with open(pjoin(self.me_dir, 'SubProcesses', 'analyse_opts'),'w') as fsock:
4104 fsock.write('FO_ANALYSE=analysis_dummy.o dbook.o open_output_files_dummy.o HwU_dummy.o\n')
41014105
4102 #directory where to compile exe4106 #directory where to compile exe
4103 p_dirs = [d for d in \4107 p_dirs = [d for d in \
@@ -4161,7 +4165,8 @@
4161 if line.strip().startswith('APPLLIBS=$'):4165 if line.strip().startswith('APPLLIBS=$'):
4162 line=appllibs4166 line=appllibs
4163 text_out.append(line)4167 text_out.append(line)
4164 open(pjoin(self.me_dir,'Source','make_opts'),'w').writelines(text_out)4168 with open(pjoin(self.me_dir,'Source','make_opts'),'w') as fsock:
4169 fsock.writelines(text_out)
4165 else:4170 else:
4166 self.make_opts_var['applgrid'] = ""4171 self.make_opts_var['applgrid'] = ""
41674172
41684173
=== modified file 'madgraph/interface/common_run_interface.py'
--- madgraph/interface/common_run_interface.py 2016-06-09 23:25:41 +0000
+++ madgraph/interface/common_run_interface.py 2016-06-24 21:04:21 +0000
@@ -2214,7 +2214,8 @@
2214 content_variables += '\n%s' % tag2214 content_variables += '\n%s' % tag
22152215
2216 if diff:2216 if diff:
2217 open(make_opts, 'w').write(content_variables + '\n'.join(content))2217 with open(make_opts, 'w') as fsock:
2218 fsock.write(content_variables + '\n'.join(content))
2218 return 2219 return
22192220
22202221
@@ -2901,7 +2902,8 @@
2901 p_card, flags=(re.M+re.I))2902 p_card, flags=(re.M+re.I))
2902 if n==0:2903 if n==0:
2903 p_card = '%s \n QCUT= %s' % (p_card, args[1])2904 p_card = '%s \n QCUT= %s' % (p_card, args[1])
2904 open(pythia_path, 'w').write(p_card)2905 with open(pythia_path, 'w') as fsock:
2906 fsock.write(p_card)
2905 return2907 return
2906 # Special case for the showerkt value2908 # Special case for the showerkt value
2907 if args[0].lower() == 'showerkt':2909 if args[0].lower() == 'showerkt':
@@ -2914,7 +2916,8 @@
2914 p_card, flags=(re.M+re.I))2916 p_card, flags=(re.M+re.I))
2915 if n==0:2917 if n==0:
2916 p_card = '%s \n SHOWERKT= %s' % (p_card, args[1].upper())2918 p_card = '%s \n SHOWERKT= %s' % (p_card, args[1].upper())
2917 open(pythia_path, 'w').write(p_card)2919 with open(pythia_path, 'w') as fsock:
2920 fsock.write(p_card)
2918 return2921 return
2919 2922
29202923
@@ -3384,7 +3387,6 @@
3384 logger.info("change madspin_card to add one decay to %s: %s" %(particle, line.strip()), '$MG:color:BLACK')3387 logger.info("change madspin_card to add one decay to %s: %s" %(particle, line.strip()), '$MG:color:BLACK')
3385 3388
3386 text = text.replace('launch', "\ndecay %s\nlaunch\n" % line,1)3389 text = text.replace('launch', "\ndecay %s\nlaunch\n" % line,1)
3387 open(path,'w').write(text)
3388 else:3390 else:
3389 # Here we have to remove all the previous definition of the decay3391 # Here we have to remove all the previous definition of the decay
3390 #first find the particle3392 #first find the particle
@@ -3395,8 +3397,10 @@
3395 text= open(path).read()3397 text= open(path).read()
3396 text = decay_pattern.sub('', text)3398 text = decay_pattern.sub('', text)
3397 text = text.replace('launch', "\ndecay %s\nlaunch\n" % line,1)3399 text = text.replace('launch', "\ndecay %s\nlaunch\n" % line,1)
3398 open(path,'w').write(text)3400
3399 3401 with open(path,'w') as fsock:
3402 fsock.write(text)
3403
3400 3404
34013405
3402 def do_compute_widths(self, line):3406 def do_compute_widths(self, line):
34033407
=== modified file 'madgraph/interface/extended_cmd.py'
--- madgraph/interface/extended_cmd.py 2016-03-05 08:26:48 +0000
+++ madgraph/interface/extended_cmd.py 2016-06-24 21:04:21 +0000
@@ -841,10 +841,12 @@
841 try:841 try:
842 cmd.Cmd.onecmd(self, 'history %s' % self.debug_output.replace(' ', '\ '))842 cmd.Cmd.onecmd(self, 'history %s' % self.debug_output.replace(' ', '\ '))
843 except Exception, error:843 except Exception, error:
844 logger.error(error)844 logger.error(error)
845845
846 debug_file = open(self.debug_output, 'a')846 debug_file = open(self.debug_output, 'a')
847 traceback.print_exc(file=debug_file)847 traceback.print_exc(file=debug_file)
848 if hasattr(error, 'filename'):
849 debug_file.write("Related File: %s\n" % error.filename)
848 # Create a nice error output850 # Create a nice error output
849 if self.history and line == self.history[-1]:851 if self.history and line == self.history[-1]:
850 error_text = 'Command \"%s\" interrupted with error:\n' % line852 error_text = 'Command \"%s\" interrupted with error:\n' % line
851853
=== modified file 'madgraph/interface/loop_interface.py'
--- madgraph/interface/loop_interface.py 2016-05-24 09:52:16 +0000
+++ madgraph/interface/loop_interface.py 2016-06-24 21:04:21 +0000
@@ -538,10 +538,11 @@
538538
539 # Fortran MadGraph5_aMC@NLO Standalone539 # Fortran MadGraph5_aMC@NLO Standalone
540 if self._export_format in self.supported_ML_format:540 if self._export_format in self.supported_ML_format:
541 for me in matrix_elements:541 for unique_id, me in enumerate(matrix_elements):
542 calls = calls + \542 calls = calls + \
543 self._curr_exporter.generate_subprocess_directory_v4(\543 self._curr_exporter.generate_subprocess_directory_v4(\
544 me, self._curr_fortran_model)544 me, self._curr_fortran_model, (unique_id+1))
545 self._curr_exporter.write_global_specs(matrix_elements)
545 # If all ME's do not share the same maximum loop vertex rank and the546 # If all ME's do not share the same maximum loop vertex rank and the
546 # same loop maximum wavefunction size, we need to set the maximum547 # same loop maximum wavefunction size, we need to set the maximum
547 # in coef_specs.inc of the HELAS Source. The SubProcesses/P* directory548 # in coef_specs.inc of the HELAS Source. The SubProcesses/P* directory
@@ -554,6 +555,7 @@
554 if len(set(max_lwfspins))>1 or len(set(max_loop_vert_ranks))>1:555 if len(set(max_lwfspins))>1 or len(set(max_loop_vert_ranks))>1:
555 self._curr_exporter.fix_coef_specs(max(max_lwfspins),\556 self._curr_exporter.fix_coef_specs(max(max_lwfspins),\
556 max(max_loop_vert_ranks))557 max(max_loop_vert_ranks))
558 self._curr_exporter.write_global_specs(matrix_elements)
557559
558 # Just the matrix.f files560 # Just the matrix.f files
559 if self._export_format == 'matrix':561 if self._export_format == 'matrix':
560562
=== modified file 'madgraph/interface/madevent_interface.py'
--- madgraph/interface/madevent_interface.py 2016-06-10 16:31:39 +0000
+++ madgraph/interface/madevent_interface.py 2016-06-24 21:04:21 +0000
@@ -2540,7 +2540,7 @@
2540# helicity filters.2540# helicity filters.
2541 self.MadLoopparam.set('CheckCycle',4, ifnotdefault=False)2541 self.MadLoopparam.set('CheckCycle',4, ifnotdefault=False)
2542 2542
2543 # For now it is tricky to have eahc channel performing the helicity2543 # For now it is tricky to have each channel performing the helicity
2544 # double check. What we will end up doing is probably some kind2544 # double check. What we will end up doing is probably some kind
2545 # of new initialization round at the beginning of each launch2545 # of new initialization round at the beginning of each launch
2546 # command, to reset the filters. 2546 # command, to reset the filters.
@@ -2548,7 +2548,7 @@
2548 ifnotdefault=False)2548 ifnotdefault=False)
2549 2549
2550 # Thanks to TIR recycling, TIR is typically much faster for Loop-induced2550 # Thanks to TIR recycling, TIR is typically much faster for Loop-induced
2551 # processes, so that we place OPP last.2551 # processes when not doing MC over helicities, so that we place OPP last.
2552 if not hasattr(self, 'run_card'):2552 if not hasattr(self, 'run_card'):
2553 run_card = banner_mod.RunCard(opt['run_card'])2553 run_card = banner_mod.RunCard(opt['run_card'])
2554 else:2554 else:
@@ -2561,7 +2561,7 @@
2561 """You chose to set the preferred reduction technique in MadLoop to be OPP (see parameter MLReductionLib).2561 """You chose to set the preferred reduction technique in MadLoop to be OPP (see parameter MLReductionLib).
2562 Beware that this can bring significant slowdown; the optimal choice --when not MC over helicity-- being to first start with TIR reduction.""")2562 Beware that this can bring significant slowdown; the optimal choice --when not MC over helicity-- being to first start with TIR reduction.""")
2563 # We do not include GOLEM for now since it cannot recycle TIR coefs yet.2563 # We do not include GOLEM for now since it cannot recycle TIR coefs yet.
2564 self.MadLoopparam.set('MLReductionLib','2|6|1', ifnotdefault=False)2564 self.MadLoopparam.set('MLReductionLib','7|6|1', ifnotdefault=False)
2565 else:2565 else:
2566 if 'MLReductionLib' in self.MadLoopparam.user_set and \2566 if 'MLReductionLib' in self.MadLoopparam.user_set and \
2567 not (self.MadLoopparam.get('MLReductionLib').startswith('1') or2567 not (self.MadLoopparam.get('MLReductionLib').startswith('1') or
@@ -2569,7 +2569,7 @@
2569 logger.warning(2569 logger.warning(
2570 """You chose to set the preferred reduction technique in MadLoop to be different than OPP (see parameter MLReductionLib).2570 """You chose to set the preferred reduction technique in MadLoop to be different than OPP (see parameter MLReductionLib).
2571 Beware that this can bring significant slowdown; the optimal choice --when MC over helicity-- being to first start with OPP reduction.""")2571 Beware that this can bring significant slowdown; the optimal choice --when MC over helicity-- being to first start with OPP reduction.""")
2572 self.MadLoopparam.set('MLReductionLib','6|1|2', ifnotdefault=False)2572 self.MadLoopparam.set('MLReductionLib','6|7|1', ifnotdefault=False)
25732573
2574 # Also TIR cache will only work when NRotations_DP=0 (but only matters2574 # Also TIR cache will only work when NRotations_DP=0 (but only matters
2575 # when not MC-ing over helicities) so it will be hard-reset by MadLoop2575 # when not MC-ing over helicities) so it will be hard-reset by MadLoop
@@ -2900,14 +2900,13 @@
2900 self.update_status('Combining Events', level='parton')2900 self.update_status('Combining Events', level='parton')
29012901
2902 2902
2903 if not hasattr(self, "refine_mode") or self.refine_mode == "old":2903 if False: #not hasattr(self, "refine_mode") or self.refine_mode == "old":
2904 try:2904 try:
2905 os.remove(pjoin(self.me_dir,'SubProcesses', 'combine.log'))2905 os.remove(pjoin(self.me_dir,'SubProcesses', 'combine.log'))
2906 except Exception:2906 except Exception:
2907 pass2907 pass
29082908
2909 tmpcluster = cluster.MultiCore(nb_core=1)2909 cluster.onecore.launch_and_wait('../bin/internal/run_combine',
2910 tmpcluster.launch_and_wait('../bin/internal/run_combine',
2911 args=[self.run_name],2910 args=[self.run_name],
2912 cwd=pjoin(self.me_dir,'SubProcesses'),2911 cwd=pjoin(self.me_dir,'SubProcesses'),
2913 stdout=pjoin(self.me_dir,'SubProcesses', 'combine.log'),2912 stdout=pjoin(self.me_dir,'SubProcesses', 'combine.log'),
@@ -2958,7 +2957,7 @@
2958 out=pjoin(self.me_dir,'Events', self.run_name, 'unweighted_events.lhe')) 2957 out=pjoin(self.me_dir,'Events', self.run_name, 'unweighted_events.lhe'))
29592958
2960 2959
2961 elif self.refine_mode == "new":2960 elif True:#self.refine_mode == "new":
2962 # Define The Banner2961 # Define The Banner
2963 tag = self.run_card['run_tag']2962 tag = self.run_card['run_tag']
2964 # Update the banner with the pythia card2963 # Update the banner with the pythia card
@@ -2975,9 +2974,12 @@
2975 '%s_%s_banner.txt' % (self.run_name, tag)))2974 '%s_%s_banner.txt' % (self.run_name, tag)))
2976 2975
2977 2976
2977 get_wgt = lambda event: event.wgt
2978 AllEvent = lhe_parser.MultiEventFile()2978 AllEvent = lhe_parser.MultiEventFile()
2979 AllEvent.banner = self.banner2979 AllEvent.banner = self.banner
2980 2980
2981 partials = 0 # if too many file make some partial unweighting
2982 sum_xsec, sum_xerru, sum_axsec = 0,[],0
2981 for Gdir,mfactor in self.get_Gdir():2983 for Gdir,mfactor in self.get_Gdir():
2982 if os.path.exists(pjoin(Gdir, 'events.lhe')):2984 if os.path.exists(pjoin(Gdir, 'events.lhe')):
2983 result = sum_html.OneResult('')2985 result = sum_html.OneResult('')
@@ -2987,12 +2989,28 @@
2987 result.get('xerru'),2989 result.get('xerru'),
2988 result.get('axsec')2990 result.get('axsec')
2989 )2991 )
2990 2992 sum_xsec += result.get('xsec')
2991 get_wgt = lambda event: event.wgt2993 sum_xerru.append(result.get('xerru'))
2994 sum_axsec += result.get('axsec')
2995 if len(AllEvent) >= 80: #perform a partial unweighting
2996 AllEvent.unweight(pjoin(self.me_dir, "Events", self.run_name, "partials%s.lhe.gz" % partials),
2997 get_wgt, log_level=logging.DEBUG)
2998 AllEvent = lhe_parser.MultiEventFile()
2999 AllEvent.add(pjoin(self.me_dir, "Events", self.run_name, "partials%s.lhe.gz" % partials),
3000 sum_xsec,
3001 math.sqrt(sum(x**2 for x in sum_xerru)),
3002 sum_axsec)
3003 partials +=1
3004
2992 nb_event = AllEvent.unweight(pjoin(self.me_dir, "Events", self.run_name, "unweighted_events.lhe.gz"),3005 nb_event = AllEvent.unweight(pjoin(self.me_dir, "Events", self.run_name, "unweighted_events.lhe.gz"),
2993 get_wgt, trunc_error=1e-2, event_target=self.run_card['nevents'],3006 get_wgt, trunc_error=1e-2, event_target=self.run_card['nevents'],
2994 log_level=logging.DEBUG)3007 log_level=logging.DEBUG)
2995 3008
3009 if partials:
3010 misc.sprint("used partials")
3011 for i in range(partials):
3012 os.remove(pjoin(self.me_dir, "Events", self.run_name, "partials%s.lhe.gz" % i))
3013
2996 self.results.add_detail('nb_event', nb_event)3014 self.results.add_detail('nb_event', nb_event)
2997 3015
2998 self.to_store.append('event')3016 self.to_store.append('event')
@@ -3025,9 +3043,9 @@
3025 os.mkdir(pjoin(self.me_dir, 'HTML', run)) 3043 os.mkdir(pjoin(self.me_dir, 'HTML', run))
3026 3044
3027 # 1) Store overall process information3045 # 1) Store overall process information
3028 input = pjoin(self.me_dir, 'SubProcesses', 'results.dat')3046 #input = pjoin(self.me_dir, 'SubProcesses', 'results.dat')
3029 output = pjoin(self.me_dir, 'SubProcesses', '%s_results.dat' % run)3047 #output = pjoin(self.me_dir, 'SubProcesses', '%s_results.dat' % run)
3030 files.cp(input, output) 3048 #files.cp(input, output)
30313049
30323050
3033 # 2) Treat the files present in the P directory3051 # 2) Treat the files present in the P directory
@@ -3048,14 +3066,14 @@
3048 os.remove(pjoin(G_path, 'events.lhe'))3066 os.remove(pjoin(G_path, 'events.lhe'))
3049 except Exception:3067 except Exception:
3050 continue3068 continue
3051 try:3069 #try:
3052 # Store results.dat3070 # # Store results.dat
3053 if os.path.exists(pjoin(G_path, 'results.dat')):3071 # if os.path.exists(pjoin(G_path, 'results.dat')):
3054 input = pjoin(G_path, 'results.dat')3072 # input = pjoin(G_path, 'results.dat')
3055 output = pjoin(G_path, '%s_results.dat' % run)3073 # output = pjoin(G_path, '%s_results.dat' % run)
3056 files.cp(input, output) 3074 # files.cp(input, output)
3057 except Exception:3075 #except Exception:
3058 continue 3076 # continue
3059 # Store log3077 # Store log
3060 try:3078 try:
3061 if os.path.exists(pjoin(G_path, 'log.txt')):3079 if os.path.exists(pjoin(G_path, 'log.txt')):
@@ -3064,18 +3082,18 @@
3064 files.mv(input, output) 3082 files.mv(input, output)
3065 except Exception:3083 except Exception:
3066 continue3084 continue
3067 try: 3085 #try:
3068 # Grid3086 # # Grid
3069 for name in ['ftn26']:3087 # for name in ['ftn26']:
3070 if os.path.exists(pjoin(G_path, name)):3088 # if os.path.exists(pjoin(G_path, name)):
3071 if os.path.exists(pjoin(G_path, '%s_%s.gz'%(run,name))):3089 # if os.path.exists(pjoin(G_path, '%s_%s.gz'%(run,name))):
3072 os.remove(pjoin(G_path, '%s_%s.gz'%(run,name)))3090 # os.remove(pjoin(G_path, '%s_%s.gz'%(run,name)))
3073 input = pjoin(G_path, name)3091 # input = pjoin(G_path, name)
3074 output = pjoin(G_path, '%s_%s' % (run,name))3092 # output = pjoin(G_path, '%s_%s' % (run,name))
3075 files.mv(input, output)3093 # files.mv(input, output)
3076 misc.gzip(pjoin(G_path, output), error=None) 3094 # misc.gzip(pjoin(G_path, output), error=None)
3077 except Exception:3095 #except Exception:
3078 continue3096 # continue
3079 # Delete ftn25 to ensure reproducible runs3097 # Delete ftn25 to ensure reproducible runs
3080 if os.path.exists(pjoin(G_path, 'ftn25')):3098 if os.path.exists(pjoin(G_path, 'ftn25')):
3081 os.remove(pjoin(G_path, 'ftn25'))3099 os.remove(pjoin(G_path, 'ftn25'))
@@ -5056,7 +5074,7 @@
5056 if MG_options:5074 if MG_options:
5057 mcore = cluster.MultiCore(**MG_options)5075 mcore = cluster.MultiCore(**MG_options)
5058 else:5076 else:
5059 mcore = cluster.MultiCore(nb_core=1)5077 mcore = cluster.onecore
5060 def run_initialization_wrapper(run_dir, infos, attempts):5078 def run_initialization_wrapper(run_dir, infos, attempts):
5061 if attempts is None:5079 if attempts is None:
5062 n_PS = MadLoopInitializer.run_initialization(5080 n_PS = MadLoopInitializer.run_initialization(
50635081
=== modified file 'madgraph/interface/madgraph_interface.py'
--- madgraph/interface/madgraph_interface.py 2016-06-07 09:34:40 +0000
+++ madgraph/interface/madgraph_interface.py 2016-06-24 21:04:21 +0000
@@ -910,8 +910,11 @@
910 910
911 user_options = {'--energy':'1000','--split_orders':'-1',911 user_options = {'--energy':'1000','--split_orders':'-1',
912 '--reduction':'1|2|3|4|5|6','--CTModeRun':'-1',912 '--reduction':'1|2|3|4|5|6','--CTModeRun':'-1',
913 '--helicity':'-1','--seed':'-1'}913 '--helicity':'-1','--seed':'-1','--collier_cache':'-1',
914 914 '--collier_req_acc':'auto',
915 '--collier_internal_stability_test':'False',
916 '--collier_mode':'1'}
917
915 if args[0] in ['cms'] or args[0].lower()=='cmsoptions':918 if args[0] in ['cms'] or args[0].lower()=='cmsoptions':
916 # increase the default energy to 5000919 # increase the default energy to 5000
917 user_options['--energy']='5000'920 user_options['--energy']='5000'
@@ -2630,7 +2633,7 @@
2630 'update', 'Delphes2', 'SysCalc', 'Golem95', 'PJFry',2633 'update', 'Delphes2', 'SysCalc', 'Golem95', 'PJFry',
2631 'QCDLoop']2634 'QCDLoop']
2632 # The targets below are installed using the HEPToolsInstaller.py script2635 # The targets below are installed using the HEPToolsInstaller.py script
2633 _advanced_install_opts = ['ninja']2636 _advanced_install_opts = ['ninja','collier']
2634 2637
2635 # The options below are commented for now but already available2638 # The options below are commented for now but already available
2636# _advanced_install_opts += ['pythia8','zlib','boost','lhapdf6','lhapdf5','hepmc','mg5amc_py8_interface','oneloop']2639# _advanced_install_opts += ['pythia8','zlib','boost','lhapdf6','lhapdf5','hepmc','mg5amc_py8_interface','oneloop']
@@ -2685,6 +2688,7 @@
2685 'golem':'auto',2688 'golem':'auto',
2686 'samurai':None,2689 'samurai':None,
2687 'ninja':'./HEPTools/lib',2690 'ninja':'./HEPTools/lib',
2691 'collier':'./HEPTools/lib',
2688 'lhapdf':'lhapdf-config',2692 'lhapdf':'lhapdf-config',
2689 'applgrid':'applgrid-config',2693 'applgrid':'applgrid-config',
2690 'amcfast':'amcfast-config',2694 'amcfast':'amcfast-config',
@@ -3527,6 +3531,15 @@
3527 " must be an integer, not %s."%option[1])3531 " must be an integer, not %s."%option[1])
3528 elif option[0]=='--reduction':3532 elif option[0]=='--reduction':
3529 MLoptions['MLReductionLib']=[int(ir) for ir in option[1].split('|')]3533 MLoptions['MLReductionLib']=[int(ir) for ir in option[1].split('|')]
3534 elif option[0]=='--collier_mode':
3535 MLoptions['COLLIERMode']=int(option[1])
3536 elif option[0]=='--collier_cache':
3537 MLoptions['COLLIERGlobalCache']=int(option[1])
3538 elif option[0]=='--collier_req_acc':
3539 if option[1]!='auto':
3540 MLoptions['COLLIERRequiredAccuracy']=float(option[1])
3541 elif option[0]=='--collier_internal_stability_test':
3542 MLoptions['COLLIERUseInternalStabilityTest']=eval(option[1])
3530 elif option[0]=='--CTModeRun':3543 elif option[0]=='--CTModeRun':
3531 try:3544 try:
3532 MLoptions['CTModeRun']=int(option[1]) 3545 MLoptions['CTModeRun']=int(option[1])
@@ -3891,6 +3904,14 @@
3891 logger_check.warning('Samurai not available on your system; it will be skipped.')3904 logger_check.warning('Samurai not available on your system; it will be skipped.')
3892 MLoptions["MLReductionLib"].remove(5)3905 MLoptions["MLReductionLib"].remove(5)
3893 3906
3907 if 'collier' in self.options and isinstance(self.options['collier'],str):
3908 TIR_dir['collier_dir']=self.options['collier']
3909 else:
3910 if "MLReductionLib" in MLoptions:
3911 if 7 in MLoptions["MLReductionLib"]:
3912 logger_check.warning('Collier not available on your system; it will be skipped.')
3913 MLoptions["MLReductionLib"].remove(7)
3914
3894 if 'ninja' in self.options and isinstance(self.options['ninja'],str):3915 if 'ninja' in self.options and isinstance(self.options['ninja'],str):
3895 TIR_dir['ninja_dir']=self.options['ninja']3916 TIR_dir['ninja_dir']=self.options['ninja']
3896 else:3917 else:
@@ -5390,7 +5411,9 @@
5390 self.options['mg5amc_py8_interface_path'] = \5411 self.options['mg5amc_py8_interface_path'] = \
5391 pjoin(MG5DIR,'HEPTools','MG5aMC_PY8_interface')5412 pjoin(MG5DIR,'HEPTools','MG5aMC_PY8_interface')
5392 self.exec_cmd('save options') 5413 self.exec_cmd('save options')
53935414 elif tool == 'collier':
5415 self.options['collier'] = pjoin(os.curdir,'HEPTools','lib')
5416 self.exec_cmd('save options')
5394 elif tool == 'ninja':5417 elif tool == 'ninja':
5395 if not misc.get_ninja_quad_prec_support(pjoin(5418 if not misc.get_ninja_quad_prec_support(pjoin(
5396 MG5DIR,'HEPTools','ninja','lib')):5419 MG5DIR,'HEPTools','ninja','lib')):
@@ -5489,6 +5512,7 @@
5489 'hepmc':['CPC 134 (2001) 41-46'],5512 'hepmc':['CPC 134 (2001) 41-46'],
5490 'mg5amc_py8_interface':['arXiv:1410.3012','arXiv:XXXX.YYYYY'],5513 'mg5amc_py8_interface':['arXiv:1410.3012','arXiv:XXXX.YYYYY'],
5491 'ninja':['arXiv:1203.0291','arXiv:1403.1229','arXiv:1604.01363'],5514 'ninja':['arXiv:1203.0291','arXiv:1403.1229','arXiv:1604.01363'],
5515 'collier':['arXiv:1604.06792'],
5492 'oneloop':['arXiv:1007.4716']}5516 'oneloop':['arXiv:1007.4716']}
54935517
5494 if args[0] in advertisements:5518 if args[0] in advertisements:
@@ -5675,10 +5699,10 @@
5675 # to 5699 # to
5676 #DELPHES_LIBS = $(shell $(RC) --libs) -lEG $(SYSLIBS) -Wl,-rpath,/Applications/root_v6.04.08/lib/5700 #DELPHES_LIBS = $(shell $(RC) --libs) -lEG $(SYSLIBS) -Wl,-rpath,/Applications/root_v6.04.08/lib/
5677 rootsys = os.environ['ROOTSYS']5701 rootsys = os.environ['ROOTSYS']
5678 text = open('./Delphes/Makefile').read()5702 text = open(pjoin(MG5DIR, 'Delphes','Makefile')).read()
5679 text = text.replace('DELPHES_LIBS = $(shell $(RC) --libs) -lEG $(SYSLIBS)', 5703 text = text.replace('DELPHES_LIBS = $(shell $(RC) --libs) -lEG $(SYSLIBS)',
5680 'DELPHES_LIBS = $(shell $(RC) --libs) -lEG $(SYSLIBS) -Wl,-rpath,%s/lib/' % rootsys)5704 'DELPHES_LIBS = $(shell $(RC) --libs) -lEG $(SYSLIBS) -Wl,-rpath,%s/lib/' % rootsys)
5681 open('./Delphes/Makefile','w').write(text)5705 open(pjoin(MG5DIR, 'Delphes','Makefile'),'w').write(text)
5682 5706
5683 # For SysCalc link to lhapdf5707 # For SysCalc link to lhapdf
5684 if name == 'SysCalc':5708 if name == 'SysCalc':
@@ -6852,8 +6876,8 @@
6852 logger.info('set fastjet to %s' % args[1])6876 logger.info('set fastjet to %s' % args[1])
6853 self.options[args[0]] = args[1]6877 self.options[args[0]] = args[1]
68546878
6855 elif args[0] in ['pjfry','golem','samurai','ninja'] and \6879 elif args[0] in ['pjfry','golem','samurai','ninja','collier'] and \
6856 not (args[0]=='ninja' and args[1]=='./HEPTools/lib'):6880 not (args[0] in ['ninja','collier'] and args[1]=='./HEPTools/lib'):
6857 if args[1] in ['None',"''",'""']:6881 if args[1] in ['None',"''",'""']:
6858 self.options[args[0]] = None6882 self.options[args[0]] = None
6859 else:6883 else:
@@ -7253,6 +7277,8 @@
7253 if self._export_format == 'madevent':7277 if self._export_format == 'madevent':
7254 calls += self._curr_exporter.export_processes(self._curr_matrix_elements,7278 calls += self._curr_exporter.export_processes(self._curr_matrix_elements,
7255 self._curr_fortran_model)7279 self._curr_fortran_model)
7280 self._curr_exporter.write_global_specs(
7281 self._curr_matrix_elements.get_matrix_elements())
7256 7282
7257 # Write the procdef_mg5.dat file with process info7283 # Write the procdef_mg5.dat file with process info
7258 card_path = pjoin(path, os.path.pardir, 'SubProcesses', \7284 card_path = pjoin(path, os.path.pardir, 'SubProcesses', \
72597285
=== modified file 'madgraph/iolibs/export_fks.py'
--- madgraph/iolibs/export_fks.py 2016-05-12 10:46:19 +0000
+++ madgraph/iolibs/export_fks.py 2016-06-24 21:04:21 +0000
@@ -187,7 +187,8 @@
187 writer = writers.FortranWriter(os.path.join(self.dir_path, 187 writer = writers.FortranWriter(os.path.join(self.dir_path,
188 "SubProcesses","MadLoopCommons.f"))188 "SubProcesses","MadLoopCommons.f"))
189 writer.writelines(MadLoopCommon%{189 writer.writelines(MadLoopCommon%{
190 'print_banner_commands':self.MadLoop_banner})190 'print_banner_commands':self.MadLoop_banner},
191 context={'collier_available':False})
191 writer.close()192 writer.close()
192 193
193 # Write the cts_mpc.h and cts_mprec.h files imported from CutTools194 # Write the cts_mpc.h and cts_mprec.h files imported from CutTools
@@ -1573,12 +1574,19 @@
1573 matrix_element.get('processes')[0].nice_string(print_weighted=False))1574 matrix_element.get('processes')[0].nice_string(print_weighted=False))
1574 plot.draw()1575 plot.draw()
15751576
1577 # We also need to write the overall maximum quantities for this group
1578 # of processes in 'global_specs.inc'. In aMCatNLO, there is always
1579 # only one process, so this is trivial
1580 self.write_global_specs(matrix_element)
1581 open('unique_id.inc','w').write(
1582""" integer UNIQUE_ID
1583 parameter(UNIQUE_ID=1)""")
1584
1576 linkfiles = ['coupl.inc', 'mp_coupl.inc', 'mp_coupl_same_name.inc',1585 linkfiles = ['coupl.inc', 'mp_coupl.inc', 'mp_coupl_same_name.inc',
1577 'cts_mprec.h', 'cts_mpc.h', 'MadLoopParamReader.f',1586 'cts_mprec.h', 'cts_mpc.h', 'MadLoopParamReader.f',
1578 'MadLoopCommons.f','MadLoopParams.inc']1587 'MadLoopCommons.f','MadLoopParams.inc','global_specs.inc']
15791588
1580 # We should move to MadLoop5_resources directory from the SubProcesses1589 # We should move to MadLoop5_resources directory from the SubProcesses
1581
1582 ln(pjoin(os.path.pardir,os.path.pardir,'MadLoopParams.dat'),1590 ln(pjoin(os.path.pardir,os.path.pardir,'MadLoopParams.dat'),
1583 pjoin('..','MadLoop5_resources'))1591 pjoin('..','MadLoop5_resources'))
15841592
@@ -3090,17 +3098,31 @@
3090 libpath,"lib%s.a"%tir,tir_name=tir)3098 libpath,"lib%s.a"%tir,tir_name=tir)
3091 setattr(self,tir_dir,libpath)3099 setattr(self,tir_dir,libpath)
3092 if libpath != "":3100 if libpath != "":
3093 if tir in ['pjfry','ninja','golem', 'samurai']:3101 if tir in ['pjfry','ninja','golem', 'samurai','collier']:
3094 # We should link dynamically when possible, so we use the original3102 # We should link dynamically when possible, so we use the original
3095 # location of these libraries.3103 # location of these libraries.
3096 link_tir_libs.append('-L%s/ -l%s'%(libpath,tir))3104 link_tir_libs.append('-L%s/ -l%s'%(libpath,tir))
3097 tir_libs.append('%s/lib%s.$(libext)'%(libpath,tir))3105 tir_libs.append('%s/lib%s.$(libext)'%(libpath,tir))
3098 # We must add the corresponding includes for golem, samurai3106 # For Ninja, we must also link against OneLoop.
3099 # and ninja3107 if tir in ['ninja']:
3100 if tir in ['golem','samurai','ninja']:3108 if not any(os.path.isfile(pjoin(libpath,'libavh_olo.%s'%ext))
3109 for ext in ['a','dylib','so']):
3110 raise MadGraph5Error(
3111"The OneLOop library 'libavh_olo.(a|dylib|so)' could no be found in path '%s'. Please place a symlink to it there."%libpath)
3112 link_tir_libs.append('-L%s/ -l%s'%(libpath,'avh_olo'))
3113 tir_libs.append('%s/lib%s.$(libext)'%(libpath,'avh_olo'))
3114 # We must add the corresponding includes for these TIR
3115 if tir in ['golem','samurai','ninja','collier']:
3101 trg_path = pjoin(os.path.dirname(libpath),'include')3116 trg_path = pjoin(os.path.dirname(libpath),'include')
3102 to_include = misc.find_includes_path(trg_path,3117 if os.path.isdir(trg_path):
3118 to_include = misc.find_includes_path(trg_path,
3103 self.include_names[tir])3119 self.include_names[tir])
3120 else:
3121 to_include = None
3122 # Special possible location for collier
3123 if to_include is None and tir=='collier':
3124 to_include = misc.find_includes_path(
3125 pjoin(libpath,'modules'),self.include_names[tir])
3104 if to_include is None:3126 if to_include is None:
3105 logger.error(3127 logger.error(
3106'Could not find the include directory for %s, looking in %s.\n' % (tir ,str(trg_path))+3128'Could not find the include directory for %s, looking in %s.\n' % (tir ,str(trg_path))+
@@ -3170,7 +3192,8 @@
3170 writer = writers.FortranWriter(os.path.join(self.dir_path, 3192 writer = writers.FortranWriter(os.path.join(self.dir_path,
3171 "SubProcesses","MadLoopCommons.f"))3193 "SubProcesses","MadLoopCommons.f"))
3172 writer.writelines(MadLoopCommon%{3194 writer.writelines(MadLoopCommon%{
3173 'print_banner_commands':self.MadLoop_banner})3195 'print_banner_commands':self.MadLoop_banner},
3196 context={'collier_available':self.tir_available_dict['collier']})
3174 writer.close()3197 writer.close()
31753198
3176 # link the files from the MODEL3199 # link the files from the MODEL
@@ -3280,14 +3303,21 @@
3280 print_weighted=False))3303 print_weighted=False))
3281 plot.draw()3304 plot.draw()
32823305
3306 # We also need to write the overall maximum quantities for this group
3307 # of processes in 'global_specs.inc'. In aMCatNLO, there is always
3308 # only one process, so this is trivial
3309 self.write_global_specs(matrix_element)
3310 open('unique_id.inc','w').write(
3311""" integer UNIQUE_ID
3312 parameter(UNIQUE_ID=1)""")
3313
3283 linkfiles = ['coupl.inc', 'mp_coupl.inc', 'mp_coupl_same_name.inc',3314 linkfiles = ['coupl.inc', 'mp_coupl.inc', 'mp_coupl_same_name.inc',
3284 'cts_mprec.h', 'cts_mpc.h', 'MadLoopParamReader.f',3315 'cts_mprec.h', 'cts_mpc.h', 'MadLoopParamReader.f',
3285 'MadLoopParams.inc','MadLoopCommons.f']3316 'MadLoopParams.inc','MadLoopCommons.f','global_specs.inc']
32863317
3287 for file in linkfiles:3318 for file in linkfiles:
3288 ln('../../%s' % file)3319 ln('../../%s' % file)
32893320
3290
3291 os.system("ln -s ../../makefile_loop makefile")3321 os.system("ln -s ../../makefile_loop makefile")
3292 3322
3293# We should move to MadLoop5_resources directory from the SubProcesses3323# We should move to MadLoop5_resources directory from the SubProcesses
32943324
=== modified file 'madgraph/iolibs/export_v4.py'
--- madgraph/iolibs/export_v4.py 2016-04-16 23:51:09 +0000
+++ madgraph/iolibs/export_v4.py 2016-06-24 21:04:21 +0000
@@ -102,9 +102,11 @@
102 102
103 calls = 0103 calls = 0
104 if isinstance(matrix_elements, group_subprocs.SubProcessGroupList):104 if isinstance(matrix_elements, group_subprocs.SubProcessGroupList):
105 unique_id=1
105 for (group_number, me_group) in enumerate(matrix_elements):106 for (group_number, me_group) in enumerate(matrix_elements):
106 calls = calls + self.generate_subprocess_directory_v4(\107 calls = calls + self.generate_subprocess_directory_v4(\
107 me_group, fortran_model, group_number)108 me_group, fortran_model, group_number, unique_id=unique_id)
109 unique_id += len(me_group.get('matrix_elements'))
108 else:110 else:
109 for me_number, me in enumerate(matrix_elements.get_matrix_elements()):111 for me_number, me in enumerate(matrix_elements.get_matrix_elements()):
110 calls = calls + self.generate_subprocess_directory_v4(\112 calls = calls + self.generate_subprocess_directory_v4(\
@@ -112,7 +114,16 @@
112 114
113 return calls 115 return calls
114 116
115117 #===========================================================================
118 # Generate an include file with global quantities about all ME's output.
119 #===========================================================================
120 def write_global_specs(self, matrix_elements):
121 """ Writes the file global_specs.inc which contains general information
122 about *all* the ME's output in this directory."""
123
124 # Do nothing here, but daughter classes such as LoopOptimizedExporterFortran
125 # overwrites this.
126 pass
116127
117 #===========================================================================128 #===========================================================================
118 # create the run_card 129 # create the run_card
@@ -4462,10 +4473,12 @@
4462 #===========================================================================4473 #===========================================================================
4463 def generate_subprocess_directory_v4(self, subproc_group,4474 def generate_subprocess_directory_v4(self, subproc_group,
4464 fortran_model,4475 fortran_model,
4465 group_number):4476 group_number,
4477 unique_id=None):
4466 """Generate the Pn directory for a subprocess group in MadEvent,4478 """Generate the Pn directory for a subprocess group in MadEvent,
4467 including the necessary matrix_N.f files, configs.inc and various4479 including the necessary matrix_N.f files, configs.inc and various
4468 other helper files"""4480 other helper files. Unique_id is dummy here, but not in
4481 LoopInducedExporterMEGroup, so it must be kept."""
44694482
4470 assert isinstance(subproc_group, group_subprocs.SubProcessGroup), \4483 assert isinstance(subproc_group, group_subprocs.SubProcessGroup), \
4471 "subproc_group object not SubProcessGroup"4484 "subproc_group object not SubProcessGroup"
@@ -6261,34 +6274,58 @@
6261 else:6274 else:
6262 curr_proc = None6275 curr_proc = None
62636276
6264 requires_ninja = opt['loop_optimized_output'] and (not curr_proc is None) and \6277 requires_reduction_tool = opt['loop_optimized_output'] and \
6265 (curr_proc.get('perturbation_couplings') != [] and \6278 (not curr_proc is None) and \
6266 not curr_proc.get('NLO_mode') in [None,'real','tree','LO','LOonly'])6279 (curr_proc.get('perturbation_couplings') != [] and \
6280 not curr_proc.get('NLO_mode') in [None,'real','tree','LO','LOonly'])
6267 # An installation is required then, but only if the specified path is the6281 # An installation is required then, but only if the specified path is the
6268 # default local one and that the Ninja library appears missing.6282 # default local one and that the Ninja library appears missing.
6269 if requires_ninja and (not opt['ninja'] is None) and\6283 if requires_reduction_tool:
6284 if (not opt['ninja'] is None) and\
6270 os.path.abspath(opt['ninja'])==pjoin(MG5DIR,'HEPTools','lib') and\6285 os.path.abspath(opt['ninja'])==pjoin(MG5DIR,'HEPTools','lib') and\
6271 not os.path.isfile(pjoin(MG5DIR,'HEPTools','lib','libninja.a')):6286 not os.path.isfile(pjoin(MG5DIR,'HEPTools','lib','libninja.a')):
6272 # Then install Ninja here from the tarballs in the vendor6287 # Then install Ninja here from the tarballs in the vendor
6273 # directory so that it would work offline too.6288 # directory so that it would work offline too.
6274 logger.info(6289 logger.info(
6275"""MG5aMC will now install the loop reduction tool 'Ninja' from the local offline installer.6290"""MG5aMC will now install the loop reduction tool 'Ninja' from the local offline installer.
6276Use the command 'install ninja' if you want to update to the latest online version.6291Use the command 'install ninja' if you want to update to the latest online version.
6277This installation can take some time but only needs to be performed once.""",'$MG:color:GREEN')6292This installation can take some time but only needs to be performed once.""",'$MG:color:GREEN')
6278 try:6293 try:
6279 cmd.do_install('ninja',paths={'HEPToolsInstaller':6294 cmd.do_install('ninja',paths={'HEPToolsInstaller':
6280 pjoin(MG5DIR,'vendor','OfflineHEPToolsInstaller.tar.gz')},6295 pjoin(MG5DIR,'vendor','OfflineHEPToolsInstaller.tar.gz')},
6281 additional_options=[6296 additional_options=[
6282 '--ninja_tarball=%s'%pjoin(MG5DIR,'vendor','ninja.tar.gz'),6297 '--ninja_tarball=%s'%pjoin(MG5DIR,'vendor','ninja.tar.gz'),
6283 '--oneloop_tarball=%s'%pjoin(MG5DIR,'vendor','oneloop.tar.gz')])6298 '--oneloop_tarball=%s'%pjoin(MG5DIR,'vendor','oneloop.tar.gz')])
6284 except InvalidCmd:6299 except InvalidCmd:
6285 logger.warning(6300 logger.warning(
6286"""The offline installation of Ninja was unsuccessful, and MG5aMC disabled it.6301"""The offline installation of Ninja was unsuccessful, and MG5aMC disabled it.
6287In the future, if you want to reactivate Ninja, you can do so by re-attempting6302In the future, if you want to reactivate Ninja, you can do so by re-attempting
6288its online installation with the command 'install ninja' or install it on your6303its online installation with the command 'install ninja' or install it on your
6289own and set the path to its library in the MG5aMC option 'ninja'.""")6304own and set the path to its library in the MG5aMC option 'ninja'.""")
6290 cmd.exec_cmd("set ninja ''")6305 cmd.exec_cmd("set ninja ''")
6291 cmd.exec_cmd('save options') 6306 cmd.exec_cmd('save options')
6307 if (not opt['collier'] is None) and\
6308 os.path.abspath(opt['collier'])==pjoin(MG5DIR,'HEPTools','lib') and\
6309 not os.path.isfile(pjoin(MG5DIR,'HEPTools','lib','libcollier.a')):
6310 # Then install Collier here from the tarballs in the vendor
6311 # directory so that it would work offline too.
6312 logger.info(
6313"""MG5aMC will now install the loop reduction tool 'COLLIER' from the local offline installer.
6314Use the command 'install collier' if you want to update to the latest online version.
6315This installation can take some time but only needs to be performed once.""",'$MG:color:GREEN')
6316 try:
6317 cmd.do_install('collier',paths={'HEPToolsInstaller':
6318 pjoin(MG5DIR,'vendor','OfflineHEPToolsInstaller.tar.gz')},
6319 additional_options=[
6320 '--collier_tarball=%s'%pjoin(MG5DIR,'vendor','collier.tar.gz')])
6321 except InvalidCmd:
6322 logger.warning(
6323"""The offline installation of COLLIER was unsuccessful, and MG5aMC disabled it.
6324In the future, if you want to reactivate COLLIER, you can do so by re-attempting
6325its online installation with the command 'install collier' or install it on your
6326own and set the path to its library in the MG5aMC option 'collier'.""")
6327 cmd.exec_cmd("set collier ''")
6328 cmd.exec_cmd('save options')
62926329
62936330
6294 # ==========================================================================6331 # ==========================================================================
@@ -6304,6 +6341,7 @@
6304 'golem_dir':cmd.options['golem'],6341 'golem_dir':cmd.options['golem'],
6305 'samurai_dir':cmd.options['samurai'],6342 'samurai_dir':cmd.options['samurai'],
6306 'ninja_dir':cmd.options['ninja'],6343 'ninja_dir':cmd.options['ninja'],
6344 'collier_dir':cmd.options['collier'],
6307 'fortran_compiler':cmd.options['fortran_compiler'],6345 'fortran_compiler':cmd.options['fortran_compiler'],
6308 'f2py_compiler':cmd.options['f2py_compiler'],6346 'f2py_compiler':cmd.options['f2py_compiler'],
6309 'output_dependencies':cmd.options['output_dependencies'],6347 'output_dependencies':cmd.options['output_dependencies'],
@@ -6431,10 +6469,12 @@
6431 #===========================================================================6469 #===========================================================================
6432 def generate_subprocess_directory_v4(self, subproc_group,6470 def generate_subprocess_directory_v4(self, subproc_group,
6433 fortran_model,6471 fortran_model,
6434 group_number):6472 group_number,
6473 unique_id=None):
6435 """Generate the Pn directory for a subprocess group in MadEvent,6474 """Generate the Pn directory for a subprocess group in MadEvent,
6436 including the necessary matrix_N.f files, configs.inc and various6475 including the necessary matrix_N.f files, configs.inc and various
6437 other helper files"""6476 other helper files. Unique_id is dummy here, but not in
6477 LoopInducedExporterMEGroup, so it must be kept."""
64386478
6439 if not isinstance(subproc_group, group_subprocs.SubProcessGroup):6479 if not isinstance(subproc_group, group_subprocs.SubProcessGroup):
6440 raise base_objects.PhysicsObject.PhysicsObjectError,\6480 raise base_objects.PhysicsObject.PhysicsObjectError,\
64416481
=== modified file 'madgraph/iolibs/template_files/loop/check_sa.inc'
--- madgraph/iolibs/template_files/loop/check_sa.inc 2016-02-17 21:24:01 +0000
+++ madgraph/iolibs/template_files/loop/check_sa.inc 2016-06-24 21:04:21 +0000
@@ -262,6 +262,7 @@
262 write(*,*) 'Estimated accuracy could not be computed for an unknown reason.'262 write(*,*) 'Estimated accuracy could not be computed for an unknown reason.'
263 endif263 endif
264 endif264 endif
265 Write (*,'(1x,a23,3x,i3)') 'MadLoop return code =',RETURNCODE
265 write (*,*) "---------------------------------"266 write (*,*) "---------------------------------"
266 IF (NBORNCHOSEN.EQ.0) THEN267 IF (NBORNCHOSEN.EQ.0) THEN
267 write (*,*) "No Born contribution satisfied the squared order constraints."268 write (*,*) "No Born contribution satisfied the squared order constraints."
268269
=== modified file 'madgraph/iolibs/template_files/loop/check_sa_loop_induced.inc'
--- madgraph/iolibs/template_files/loop/check_sa_loop_induced.inc 2016-02-17 21:24:01 +0000
+++ madgraph/iolibs/template_files/loop/check_sa_loop_induced.inc 2016-06-24 21:04:21 +0000
@@ -241,6 +241,7 @@
241 write(*,*) 'Estimated accuracy could not be computed for an unknown reason.'241 write(*,*) 'Estimated accuracy could not be computed for an unknown reason.'
242 endif242 endif
243 endif243 endif
244 Write (*,'(1x,a23,3x,i3)') 'MadLoop return code =',RETURNCODE
244 write (*,*) "---------------------------------"245 write (*,*) "---------------------------------"
245 IF (NLOOPCHOSEN.ne.NSQUAREDSO) THEN246 IF (NLOOPCHOSEN.ne.NSQUAREDSO) THEN
246 write (*,*) "Selected squared coupling orders combination for the loop summed result below:"247 write (*,*) "Selected squared coupling orders combination for the loop summed result below:"
247248
=== added file 'madgraph/iolibs/template_files/loop_optimized/COLLIER_interface.inc'
--- madgraph/iolibs/template_files/loop_optimized/COLLIER_interface.inc 1970-01-01 00:00:00 +0000
+++ madgraph/iolibs/template_files/loop_optimized/COLLIER_interface.inc 2016-06-24 21:04:21 +0000
@@ -0,0 +1,646 @@
1 SUBROUTINE %(proc_prefix)sCOLLIERLOOP(CTMODE, NLOOPLINE,RANK,PL,PDEN,M2L,TIRCOEFS,TIRCOEFSERRORS)
2C
3%(info_lines)s
4C
5C Interface between MG5 and COLLIER.
6C It supports any rank when 1 < NLOOPLINE < 7.
7C
8%(process_lines)s
9C
10C
11C MODULES
12C
13 USE COLLIER
14 IMPLICIT NONE
15C
16C CONSTANTS
17C
18 LOGICAL checkPConservation
19 PARAMETER (checkPConservation=.TRUE.)
20 %(real_dp_format)s PIVALUE
21 PARAMETER(PIVALUE=3.14159265358979323846D0)
22 integer MAXRANK
23 parameter (MAXRANK=%(maxrank)d)
24 INTEGER NLOOPGROUPS
25 PARAMETER (NLOOPGROUPS=%(nloop_groups)d)
26 include 'loop_max_coefs.inc'
27C
28C ARGUMENTS
29C
30 INTEGER NLOOPLINE, RANK, CTMODE
31 %(real_dp_format)s PL(0:3,NLOOPLINE)
32 %(real_dp_format)s PDEN(0:3,NLOOPLINE-1)
33 %(mass_dp_format)s M2L(NLOOPLINE)
34 %(complex_dp_format)s RES(3)
35 %(complex_dp_format)s TIRCOEFS(0:LOOPMAXCOEFS-1,3)
36 %(complex_dp_format)s TIRCOEFSERRORS(0:LOOPMAXCOEFS-1,3)
37
38C
39C LOCAL VARIABLES
40C
41 INTEGER N, I, J, K, L
42 INTEGER C0,C1,C2,C3
43 INTEGER N_CACHES
44 INTEGER CURR_RANK, SGN
45 INTEGER CURR_INDEX
46 INTEGER CURR_MAXCOEF
47 %(real_dp_format)s RBUFF(0:3)
48
49 INTEGER COEFMAP_ZERO(0:LOOPMAXCOEFS-1)
50 INTEGER COEFMAP_ONE(0:LOOPMAXCOEFS-1)
51 INTEGER COEFMAP_TWO(0:LOOPMAXCOEFS-1)
52 INTEGER COEFMAP_THREE(0:LOOPMAXCOEFS-1)
53 %(collier_coefmap)s
54
55 %(real_dp_format)s REF_NORMALIZATION
56
57 double complex M2LCOLLIER(0:NLOOPLINE-1)
58 double complex MomVec(0:3,NLOOPLINE-1)
59 double complex MomInv((NLOOPLINE*(NLOOPLINE-1))/2)
60
61 double complex TNten(0:RANK,0:RANK,0:RANK,0:RANK)
62 double complex TNtenuv(0:RANK,0:RANK,0:RANK,0:RANK)
63 double precision TNtenerr(0:RANK)
64
65 %(real_dp_format)s MaxCoefForRank(0:RANK)
66
67C These quantities are for the pole evaluation
68 double complex TNten_UV(0:RANK,0:RANK,0:RANK,0:RANK)
69 double complex TNtenuv_UV(0:RANK,0:RANK,0:RANK,0:RANK)
70 double precision TNtenerr_UV(0:RANK)
71 double complex TNten_IR1(0:RANK,0:RANK,0:RANK,0:RANK)
72 double complex TNtenuv_IR1(0:RANK,0:RANK,0:RANK,0:RANK)
73 double precision TNtenerr_IR1(0:RANK)
74 double complex TNten_IR2(0:RANK,0:RANK,0:RANK,0:RANK)
75 double complex TNtenuv_IR2(0:RANK,0:RANK,0:RANK,0:RANK)
76 double precision TNtenerr_IR2(0:RANK)
77C
78C GLOBAL VARIABLES
79C
80 include 'coupl.inc'
81 include 'MadLoopParams.inc'
82 include 'unique_id.inc'
83 include 'global_specs.inc'
84
85## if(not AmplitudeReduction) {
86 INTEGER ID,SQSOINDEX,R
87 common/%(proc_prefix)sLOOP/ID,SQSOINDEX,R
88## }else{
89 INTEGER ID,R
90 common/%(proc_prefix)sLOOP/ID,R
91## }
92
93C
94C These global variables cache the coefficients already computed by COLLIER
95C so that they can be reused. In particular, in CTMODE 2, the cached ERROR
96C quantities for eahc rank will be used to make use of COLLIER's internal
97C assessment of the numerical accuracy.
98C
99 logical LOOP_ID_DONE(NLOOPGROUPS)
100 DATA LOOP_ID_DONE/NLOOPGROUPS*.FALSE./
101 %(complex_dp_format)s TIR_COEFS_DIRECT_MODE(0:LOOPMAXCOEFS-1,3,NLOOPGROUPS)
102 %(real_dp_format)s TIR_COEFS_ERROR(0:MAXRANK,NLOOPGROUPS)
103 common/%(proc_prefix)sCOLLIER_TIR_COEFS/TIR_COEFS_DIRECT_MODE,TIR_COEFS_ERROR,LOOP_ID_DONE
104
105 INTEGER COLLIER_CACHE_ACTIVE, NCALLS_IN_CACHE(4), NCOLLIERCALLS(4)
106 LOGICAL MUST_INIT_EVENT
107 COMMON/%(proc_prefix)sCOLLIER_CACHE_STATUS/COLLIER_CACHE_ACTIVE,NCALLS_IN_CACHE, NCOLLIERCALLS,MUST_INIT_EVENT
108
109 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT, COLLIERINIT
110 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT, COLLIERINIT
111
112C ----------
113C BEGIN CODE
114C ----------
115
116 IF (COLLIERUseCacheForPoles) THEN
117 N_CACHES = 4
118 ELSE
119 N_CACHES =1
120 ENDIF
121
122C Initialize COLLIER if needed
123 IF (COLLIERINIT) THEN
124 COLLIERINIT=.FALSE.
125 CALL INITCOLLIER()
126 ENDIF
127
128C Initialize the event if it is the first time collier is called on this PS point
129 IF(MUST_INIT_EVENT) THEN
130 MUST_INIT_EVENT = .False.
131 IF (COLLIERGlobalCache.eq.0) THEN
132 CALL InitEvent_cll()
133 ELSE
134 DO I=1,N_CACHES
135C Record how many events where put in the cache. On the first PS point.
136 IF (NCALLS_IN_CACHE(I).eq.-1.AND.NCOLLIERCALLS(I).gt.0) THEN
137 NCALLS_IN_CACHE(I) = NCOLLIERCALLS(I)
138 ENDIF
139 ENDDO
140 DO I=1,N_CACHES
141C Now apply a safety check that our last event had as many calls as the cache is setup for.
142C The only case for now when it can be half of the calls when we are doing the true loop-direction test with also the computation of a rotated PS point (which is computed for one mode only).
143 IF (NCALLS_IN_CACHE(I).ne.-1.and..NOT. ( NCOLLIERCALLS(I).eq.NCALLS_IN_CACHE(I).or. ( CTModeRun.eq.-1.and..not.COLLIERUseInternalStabilityTest.and.NRotations_DP.gt.0.and.MOD(NCALLS_IN_CACHE(I),2).eq.0.and.(NCALLS_IN_CACHE(I)/2).eq.NCOLLIERCALLS(I) ) ) ) then
144 WRITE(*,*) 'WARNING: A consistency check in MadLoop failed and, for safety, forced MadLoop to reinitialize the global cache of COLLIER. Report this to MadLoop authors. The problematic cache was number ',I
145 IF (COLLIERGLOBALCACHE.EQ.-1) THEN
146 CALL INITCACHESYSTEM_CLL(N_CACHES*NPROCS,MAXNEXTERNAL)
147 ELSE
148 CALL INITCACHESYSTEM_CLL(N_CACHES*NPROCS,COLLIERGLOBALCACHE)
149 ENDIF
150C Make sure all caches are switched off at first.
151 call SwitchOffCacheSystem_cll()
152C Reset the cache design property
153 NCALLS_IN_CACHE(:) = -1
154 NCOLLIERCALLS(:) = 0
155 IF (COLLIER_CACHE_ACTIVE.eq.1) THEN
156 CALL SwitchOnCache_cll((unique_id-1)*N_CACHES+1)
157 ENDIF
158C No need to check the other caches since we already had to reset here.
159 EXIT
160 ENDIF
161 ENDDO
162 CALL InitEvent_cll((UNIQUE_ID-1)*N_CACHES+1)
163 NCOLLIERCALLS(1) = 0
164 IF(COLLIERComputeUVpoles.and.COLLIERUseCacheForPoles) THEN
165 CALL InitEvent_cll((UNIQUE_ID-1)*N_CACHES+2)
166 NCOLLIERCALLS(2) = 0
167 ENDIF
168 IF(COLLIERComputeIRpoles.and.COLLIERUseCacheForPoles) THEN
169 CALL InitEvent_cll((UNIQUE_ID-1)*N_CACHES+3)
170 NCOLLIERCALLS(3) = 0
171 CALL InitEvent_cll((UNIQUE_ID-1)*N_CACHES+4)
172 NCOLLIERCALLS(4) = 0
173 ENDIF
174 ENDIF
175 CALL SetDeltaIR_cll(0.0d0,(PIVALUE**2)/6.0d0)
176 CALL SetDeltaUV_cll(0.0d0)
177 CALL SetMuIR2_cll(mu_r**2)
178 CALL SetMuUV2_cll(mu_r**2)
179 ENDIF
180
181C Now really start the reduction with COLLIER
182
183C Number of coefficients for the current rank
184 CURR_MAXCOEF = 0
185 DO I=0,RANK
186 CURR_MAXCOEF=CURR_MAXCOEF+(3+I)*(2+I)*(1+I)/6
187 ENDDO
188
189 IF (CTMODE.ne.1.and.CTMODE.ne.2) THEN
190 WRITE(*,*) 'ERROR: COLLIER only support the computational mode CTMODE equal to 1 or 2, not',CTMODE
191 stop 'Incorrect computational mode specified to the COLLIER MG5aMC interface.'
192 ENDIF
193
194 DO I=0,CURR_MAXCOEF-1
195 DO K=1,3
196 TIRCOEFSERRORS(I,K)=DCMPLX(0.0d0,0.0d0)
197 ENDDO
198 ENDDO
199
200 IF (COLLIERUseInternalStabilityTest) THEN
201C Use MADLOOP internal cache dedicated to COLLIER that emulates the CTMODE 2
202 IF (LOOP_ID_DONE(ID)) THEN
203 DO I=0,CURR_MAXCOEF-1
204 DO K=1,3
205 TIRCOEFS(I,K)=TIR_COEFS_DIRECT_MODE(I,K,ID)
206 ENDDO
207 ENDDO
208 DO I=0,RANK
209 MaxCoefForRank(I) = 0.0d0
210 ENDDO
211 DO I=0,CURR_MAXCOEF-1
212 CURR_RANK = COEFMAP_ZERO(I)+COEFMAP_ONE(I)+COEFMAP_TWO(I)+COEFMAP_THREE(I)
213 MaxCoefForRank(CURR_RANK)=max(MaxCoefForRank(CURR_RANK),abs(TIR_COEFS_DIRECT_MODE(I,1,ID)))
214 ENDDO
215 DO I=0,CURR_MAXCOEF-1
216 CURR_RANK = COEFMAP_ZERO(I)+COEFMAP_ONE(I)+COEFMAP_TWO(I)+COEFMAP_THREE(I)
217 IF (MaxCoefForRank(CURR_RANK).ne.0.0d0) THEN
218 DO K=1,3
219C The expression below is like taking the absolute value when summing errors linearly
220C TIRCOEFSERRORS(I,K)=(TIR_COEFS_ERROR(CURR_RANK,ID)/MaxCoefForRank(CURR_RANK))*DCMPLX( ABS(DBLE(TIRCOEFS(I,K))),ABS(DIMAG(TIRCOEFS(I,K))) )
221C But empirically, I observed that retaining the original complex phase leads to slightly more accurate estimates
222 TIRCOEFSERRORS(I,K)=(TIR_COEFS_ERROR(CURR_RANK,ID)/MaxCoefForRank(CURR_RANK))*TIRCOEFS(I,K)
223 ENDDO
224 ENDIF
225 ENDDO
226 RETURN
227 ENDIF
228 ELSE
229C Apply the loop-direction switching here.
230 CALL %(proc_prefix)sSWITCH_ORDER(CTMODE,NLOOPLINE,PL,PDEN,M2L)
231 ENDIF
232
233C Make sure masses are complex
234 do I=1,NLOOPLINE
235 M2LCOLLIER(I-1)=DCMPLX(M2L(I))
236 ENDDO
237
238C Now convert the loop offset momenta to COLLIER conventions
239 DO i=0,3
240 DO j=1,NLOOPLINE-1
241 MomVec(i,j)=DCMPLX(PDEN(i,j),0.0d0)
242 ENDDO
243 ENDDO
244
245C This first do loop spans over 'N' in '\foreach_N \foreach_i(k_i+k_{i+1}+..+k_{i+N})^2'
246 CURR_INDEX = 0
247 DO N=0,NLOOPLINE-1
248C We stop whenever we reached the target number of invariants
249 IF (CURR_INDEX.GE.((NLOOPLINE*(NLOOPLINE-1))/2)) THEN
250 EXIT
251 ENDIF
252C This do loop spans over 'i' in the expression above.
253 DO I=1,NLOOPLINE
254 IF (CURR_INDEX.GE.((NLOOPLINE*(NLOOPLINE-1))/2)) THEN
255 EXIT
256 ENDIF
257
258 CURR_INDEX = CURR_INDEX+1
259 RBUFF(:) = 0.0D0
260 DO J=I,I+N
261 RBUFF(:) = RBUFF(:) + PL(:,MOD(J-1,NLOOPLINE)+1)
262 ENDDO
263 MomInv(CURR_INDEX) = DCMPLX(RBUFF(0)**2-RBUFF(1)**2-RBUFF(2)**2-RBUFF(3)**2,0.0d0)
264
265C Now regularize the onshell behavior of the kinematic invarients
266C All loop masses are tested, but that might be a bit too inclusive.
267 DO K=1,NLOOPLINE
268 IF(ABS(M2L(K)).NE.0.0d0) THEN
269 IF(ABS((MomInv(CURR_INDEX)-M2L(K))/M2L(K)).LT.OSTHRES) THEN
270 MomInv(CURR_INDEX)=DCMPLX(M2L(K))
271 ENDIF
272 ENDIF
273 ENDDO
274C For the massless onshell-case, we base the threshold only on the energy component
275 REF_NORMALIZATION=0.0D0
276 DO L=0,0
277 REF_NORMALIZATION = REF_NORMALIZATION + ABS(RBUFF(L))
278 ENDDO
279 REF_NORMALIZATION = (REF_NORMALIZATION/(N+1))**2
280 IF(REF_NORMALIZATION.NE.0.0D0)THEN
281 IF(ABS(MomInv(CURR_INDEX)/REF_NORMALIZATION).LT.OSTHRES)THEN
282 MomInv(CURR_INDEX)=DCMPLX(0.0d0,0.0d0)
283 ENDIF
284 ENDIF
285
286 ENDDO
287 ENDDO
288
289C We can now call COLLIER
290 IF (NLOOPLINE.ne.1) THEN
291 CALL TNten_cll(TNten, TNtenuv, MomVec, MomInv, M2LCOLLIER, NLOOPLINE, RANK, TNtenerr)
292 ELSE
293 CALL TNten_cll(TNten, TNtenuv, M2LCOLLIER, NLOOPLINE, RANK, TNtenerr)
294 ENDIF
295 IF (COLLIER_CACHE_ACTIVE.eq.1) THEN
296 NCOLLIERCALLS(1) = NCOLLIERCALLS(1)+1
297 ENDIF
298
299C Now compute the UV poles if asked for
300 IF (COLLIERComputeUVpoles) THEN
301 IF(COLLIER_CACHE_ACTIVE.eq.1) THEN
302 CALL SwitchOffCache_cll((unique_id-1)*N_CACHES+1)
303 IF(COLLIERUseCacheForPoles) THEN
304 CALL SwitchOnCache_cll((unique_id-1)*N_CACHES+2)
305 ENDIF
306 ENDIF
307 CALL SetDeltaUV_cll(1.0d0)
308 IF (NLOOPLINE.ne.1) THEN
309 CALL TNten_cll(TNten_UV, TNtenuv_UV, MomVec, MomInv, M2LCOLLIER, NLOOPLINE, RANK, TNtenerr_UV)
310 ELSE
311 CALL TNten_cll(TNten_UV, TNtenuv_UV, M2LCOLLIER, NLOOPLINE, RANK, TNtenerr_UV)
312 ENDIF
313 IF (COLLIER_CACHE_ACTIVE.eq.1) THEN
314 NCOLLIERCALLS(2) = NCOLLIERCALLS(2)+1
315 ENDIF
316 IF(COLLIER_CACHE_ACTIVE.eq.1) THEN
317 IF(COLLIERUseCacheForPoles) THEN
318 CALL SwitchOffCache_cll((unique_id-1)*N_CACHES+2)
319 ENDIF
320 CALL SwitchOnCache_cll((unique_id-1)*N_CACHES+1)
321 ENDIF
322 CALL SetDeltaUV_cll(0.0d0)
323 ENDIF
324
325C Now compute the IR poles if asked for
326 IF (COLLIERComputeIRpoles) THEN
327 IF(COLLIER_CACHE_ACTIVE.eq.1) THEN
328 CALL SwitchOffCache_cll((unique_id-1)*N_CACHES+1)
329 IF(COLLIERUseCacheForPoles) THEN
330 CALL SwitchOnCache_cll((unique_id-1)*N_CACHES+3)
331 ENDIF
332 ENDIF
333 CALL SetDeltaIR_cll(1.0d0,(PIVALUE**2)/6.0d0)
334 IF (NLOOPLINE.ne.1) THEN
335 CALL TNten_cll(TNten_IR1, TNtenuv_IR1, MomVec, MomInv, M2LCOLLIER, NLOOPLINE, RANK, TNtenerr_IR1)
336 ELSE
337 CALL TNten_cll(TNten_IR1, TNtenuv_IR1, M2LCOLLIER, NLOOPLINE, RANK, TNtenerr_IR1)
338 ENDIF
339 IF (COLLIER_CACHE_ACTIVE.eq.1) THEN
340 NCOLLIERCALLS(3) = NCOLLIERCALLS(3)+1
341 ENDIF
342 IF(COLLIER_CACHE_ACTIVE.eq.1.AND.COLLIERUseCacheForPoles) THEN
343 CALL SwitchOffCache_cll((unique_id-1)*N_CACHES+3)
344 CALL SwitchOnCache_cll((unique_id-1)*N_CACHES+4)
345 ENDIF
346 CALL SetDeltaIR_cll(0.0d0,1.0d0+(PIVALUE**2)/6.0d0)
347 IF (NLOOPLINE.ne.1) THEN
348 CALL TNten_cll(TNten_IR2, TNtenuv_IR2, MomVec, MomInv, M2LCOLLIER, NLOOPLINE, RANK, TNtenerr_IR2)
349 ELSE
350 CALL TNten_cll(TNten_IR2, TNtenuv_IR2, M2LCOLLIER, NLOOPLINE, RANK, TNtenerr_IR2)
351 ENDIF
352 IF (COLLIER_CACHE_ACTIVE.eq.1) THEN
353 NCOLLIERCALLS(4) = NCOLLIERCALLS(4)+1
354 ENDIF
355 IF(COLLIER_CACHE_ACTIVE.eq.1) THEN
356 IF(COLLIERUseCacheForPoles) THEN
357 CALL SwitchOffCache_cll((unique_id-1)*N_CACHES+4)
358 ENDIF
359 CALL SwitchOnCache_cll((unique_id-1)*N_CACHES+1)
360 ENDIF
361 CALL SetDeltaIR_cll(0.0d0,(PIVALUE**2)/6.0d0)
362 ENDIF
363
364 DO I=0,(CURR_MAXCOEF-1)
365 C0 = COEFMAP_ZERO(I)
366 C1 = COEFMAP_ONE(I)
367 C2 = COEFMAP_TWO(I)
368 C3 = COEFMAP_THREE(I)
369 CURR_RANK = C0+C1+C2+C3
370C Because we must set q -> -q, we apply a minus sign to coefs of odd rank
371 IF (MOD(CURR_RANK,2).eq.1) THEN
372 SGN = -1
373 ELSE
374 SGN = 1
375 ENDIF
376 TIRCOEFS(I,1) = SGN*TNten(C0,C1,C2,C3)
377 IF (COLLIERComputeUVpoles) THEN
378 TIRCOEFS(I,2) = SGN*( TNten_UV(C0,C1,C2,C3)-TNten(C0,C1,C2,C3) )
379 ELSE
380 TIRCOEFS(I,2) = DCMPLX(0.0d0,0.0d0)
381 ENDIF
382 IF (COLLIERComputeIRpoles) THEN
383 TIRCOEFS(I,2) = TIRCOEFS(I,2) + SGN*( TNten_IR1(C0,C1,C2,C3)-TNten(C0,C1,C2,C3) )
384 TIRCOEFS(I,3) = SGN*( TNten_IR2(C0,C1,C2,C3)-TNten(C0,C1,C2,C3) )
385 ELSE
386 TIRCOEFS(I,3) = DCMPLX(0.0d0,0.0d0)
387 ENDIF
388 ENDDO
389
390 IF (COLLIERUseInternalStabilityTest) THEN
391c Finish by caching the coefficients and error just computed
392 LOOP_ID_DONE(ID) = .TRUE.
393 DO J=0,CURR_MAXCOEF-1
394 DO K=1,3
395 TIR_COEFS_DIRECT_MODE(J,K,ID) = TIRCOEFS(J,K)
396 ENDDO
397 ENDDO
398 DO J=0,RANK
399 TIR_COEFS_ERROR(J,ID)=TNtenerr(J)
400 ENDDO
401
402C Now compute the errors on each coefficient
403 DO I=0,RANK
404 MaxCoefForRank(I) = 0.0d0
405 ENDDO
406 DO I=0,CURR_MAXCOEF-1
407 CURR_RANK = COEFMAP_ZERO(I)+COEFMAP_ONE(I)+COEFMAP_TWO(I)+COEFMAP_THREE(I)
408 MaxCoefForRank(CURR_RANK)=max(MaxCoefForRank(CURR_RANK),abs(TIRCOEFS(I,1)))
409 ENDDO
410 DO I=0,CURR_MAXCOEF-1
411 CURR_RANK = COEFMAP_ZERO(I)+COEFMAP_ONE(I)+COEFMAP_TWO(I)+COEFMAP_THREE(I)
412 IF (MaxCoefForRank(CURR_RANK).ne.0.0d0) THEN
413 DO K=1,3
414C The expression below is like taking the absolute value when summing errors linearly
415C TIRCOEFSERRORS(I,K)=(TNtenerr(CURR_RANK)/MaxCoefForRank(CURR_RANK))*DCMPLX( ABS(DBLE(TIRCOEFS(I,K))),ABS(DIMAG(TIRCOEFS(I,K))) )
416C But empirically, I observed that retaining the original complex phase leads to slightly more accurate estimates
417 TIRCOEFSERRORS(I,K)=(TNtenerr(CURR_RANK)/MaxCoefForRank(CURR_RANK))*TIRCOEFS(I,K)
418 ENDDO
419 ENDIF
420 ENDDO
421
422 ENDIF
423
424 END SUBROUTINE %(proc_prefix)sCOLLIERLOOP
425
426 SUBROUTINE %(proc_prefix)sCLEAR_COLLIER_CACHE()
427
428 USE COLLIER
429
430 include 'loop_max_coefs.inc'
431 INTEGER NLOOPGROUPS
432 PARAMETER (NLOOPGROUPS=%(nloop_groups)d)
433 integer MAXRANK
434 parameter (MAXRANK=%(maxrank)d)
435
436 integer I,J,K
437
438 include 'MadLoopParams.inc'
439
440 logical LOOP_ID_DONE(NLOOPGROUPS)
441 %(complex_dp_format)s TIR_COEFS_DIRECT_MODE(0:LOOPMAXCOEFS-1,3,NLOOPGROUPS)
442 %(complex_dp_format)s TIR_COEFS_ERROR(0:MAXRANK,NLOOPGROUPS)
443 common/%(proc_prefix)sCOLLIER_TIR_COEFS/TIR_COEFS_DIRECT_MODE,TIR_COEFS_ERROR,LOOP_ID_DONE
444
445 INTEGER COLLIER_CACHE_ACTIVE, NCALLS_IN_CACHE(4), NCOLLIERCALLS(4)
446 LOGICAL MUST_INIT_EVENT
447 COMMON/%(proc_prefix)sCOLLIER_CACHE_STATUS/COLLIER_CACHE_ACTIVE,NCALLS_IN_CACHE, NCOLLIERCALLS,MUST_INIT_EVENT
448
449C Make sure that next time the COLLIER Subroutine is called it will call the subroutine initEvent of Collier.
450 MUST_INIT_EVENT = .True.
451
452C Reinitialize the ML cache for COLLIER
453 DO I=1,NLOOPGROUPS
454 LOOP_ID_DONE(I) = .FALSE.
455 DO J=0,LOOPMAXCOEFS-1
456 DO K=1,3
457 TIR_COEFS_DIRECT_MODE(J,K,I) = DCMPLX(0.0d0,0.0d0)
458 ENDDO
459 ENDDO
460 DO J=0,MAXRANK
461 TIR_COEFS_ERROR(J,I)=0.0d0
462 ENDDO
463 ENDDO
464
465 END
466
467 SUBROUTINE %(proc_prefix)sSET_COLLIER_GLOBAL_CACHE(ONOFF)
468C
469C This routine is used by loop_matrix.f to turn on the global
470C cache of COLLIER when it the main SLOOP subroutine starts and
471C turn it off when it ends.
472C However several checks are performed to verify that it is safe
473C to turn it on and to reinitialize it if necessary.
474C
475C MODULES
476C
477 USE COLLIER
478 implicit none
479C
480C ARGUMENTS
481C
482 LOGICAL ONOFF
483C
484C LOCAL VARIABLES
485C
486 LOGICAL NEED_REINITIALIZATION
487 INTEGER N_CACHES
488C
489C GLOBAL VARIABLES
490C
491C
492C This common blocks saves the relevant ML parameters when activating the
493C global cache of COLLIER so that we know when we must reinitialize it.
494C COLLIER_CACHE_ACTIVE is set to -1 when it has never been turned on yet and
495C to 1 for 'Active' and 0 for 'Inactive'.
496C The integer NCALLS_IN_CACHE saves how many calls the cache is setup for, for each of the up to four caches.
497C When it is the first PS points, it is set to -1.
498 INTEGER COLLIER_CACHE_ACTIVE, NCALLS_IN_CACHE(4), NCOLLIERCALLS(4)
499 DATA COLLIER_CACHE_ACTIVE/-1/
500 DATA NCALLS_IN_CACHE/-1,-1,-1,-1/
501 DATA NCOLLIERCALLS/0,0,0,0/
502C This is a flag to tell the COLLIER subroutine that it must init the event when called.
503 LOGICAL MUST_INIT_EVENT
504 DATA MUST_INIT_EVENT/.TRUE./
505 COMMON/%(proc_prefix)sCOLLIER_CACHE_STATUS/COLLIER_CACHE_ACTIVE, NCALLS_IN_CACHE, NCOLLIERCALLS,MUST_INIT_EVENT
506
507 LOGICAL COLLIERUseInternalStabilityTest_BU
508 INTEGER USERHEL_BU, SQSO_TARGET_BU, COLLIERMode_BU,CTModeRun_BU
509 COMMON/%(proc_prefix)sCOLLIER_CACHE_RELEVANT_PARAMS/USERHEL_BU,SQSO_TARGET_BU,COLLIERMode_BU,CTModeRun_BU,COLLIERUseInternalStabilityTest_BU
510
511C The common blocks below are to retrieve the necessary information about
512C MadLoop running mode and store it in the sCOLLIER_CACHE_RELEVANT_PARAMS common block.
513
514 include 'MadLoopParams.inc'
515 include 'unique_id.inc'
516 include 'global_specs.inc'
517
518 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT, COLLIERINIT
519 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT, COLLIERINIT
520
521 LOGICAL CHECKPHASE
522 LOGICAL HELDOUBLECHECKED
523 common/%(proc_prefix)sINIT/CHECKPHASE, HELDOUBLECHECKED
524
525 INTEGER USERHEL
526 common/%(proc_prefix)sUSERCHOICE/USERHEL
527
528 INTEGER SQSO_TARGET
529 common/%(proc_prefix)sSOCHOICE/SQSO_TARGET
530
531C
532C BEGIN CODE
533C
534
535 IF (COLLIERUseCacheForPoles) THEN
536 N_CACHES = 4
537 ELSE
538 N_CACHES =1
539 ENDIF
540
541C Do nothing if COLLIER still has to be initialized or if global caches are disabled
542 IF(COLLIERINIT.OR.COLLIERGlobalCache.eq.0) THEN
543 RETURN
544 ENDIF
545
546C Never activate anything in the checkphase
547 IF (ONOFF.AND.CHECKPHASE) THEN
548 RETURN
549 ENDIF
550
551C Handle the request of turning off the caching
552 IF (.NOT.ONOFF) THEN
553 IF (COLLIER_CACHE_ACTIVE.eq.1) THEN
554 CALL SwitchOffCache_cll((unique_id-1)*4+1)
555 COLLIER_CACHE_ACTIVE = 0
556 ENDIF
557C If we were asked to turn the cache off but it was already so, then do nothing
558 RETURN
559 ENDIF
560
561C Handle the request of turning on the caching
562
563C If asked to activate it but already active, then do nothing
564 IF (ONOFF.AND.COLLIER_CACHE_ACTIVE.eq.1) THEN
565 RETURN
566 ENDIF
567
568C We are now in the position where we are asked to activate the global cache but it was *not* already active.
569
570C If we activate it for the first time, make sure to store the value of the relevant parameters, activate and return.
571 IF (COLLIER_CACHE_ACTIVE.eq.-1) THEN
572 USERHEL_BU = USERHEL
573 SQSO_TARGET_BU = SQSO_TARGET
574 COLLIERMode_BU = COLLIERMode
575 COLLIERUseInternalStabilityTest_BU = COLLIERUseInternalStabilityTest
576 CTModeRun_BU = CTModeRun
577 CALL SwitchOnCache_cll((unique_id-1)*4+1)
578 COLLIER_CACHE_ACTIVE = 1
579 RETURN
580 ENDIF
581
582C Now perform sanity check before the activation to decide if we need to reinitialize the cache system first.
583 NEED_REINITIALIZATION = .FALSE.
584
585 IF (SQSO_TARGET.NE.SQSO_TARGET_BU) THEN
586 NEED_REINITIALIZATION = .TRUE.
587 ENDIF
588
589 IF (COLLIERMode.NE.COLLIERMode_BU) THEN
590 NEED_REINITIALIZATION = .TRUE.
591 ENDIF
592
593 IF (COLLIERUseInternalStabilityTest.NEQV.COLLIERUseInternalStabilityTest_BU) THEN
594 NEED_REINITIALIZATION = .TRUE.
595 ENDIF
596
597 IF (CTModeRun_BU.ne.CTModeRun.and.(.not.COLLIERUseInternalStabilityTest)) THEN
598 NEED_REINITIALIZATION = .TRUE.
599 ENDIF
600
601## if(AmplitudeReduction){
602C When doing amplitude reduction, the parameter USERHEL impacts the number of COLLIER calls/order if
603C it involves a different number of helicity configurations or always if the Loop filter is on, which
604C it should almost never be by now.
605 IF(UseLoopFilter.and.(USERHEL.ne.USERHEL_BU)) THEN
606 NEED_REINITIALIZATION = .TRUE.
607 ENDIF
608 IF((USERHEL.eq.-1).and.(USERHEL_BU.ne.-1)) THEN
609 NEED_REINITIALIZATION = .TRUE.
610 ENDIF
611 IF((USERHEL.ne.-1).and.(USERHEL_BU.eq.-1)) THEN
612 NEED_REINITIALIZATION = .TRUE.
613 ENDIF
614## }else{
615C When doing amplitude reduction the parameter USERHEL does not impact the number/order of COLLIER calls
616C except if the LoopFilter is ON which really shouldn't be the case anymore.
617 IF(UseLoopFilter.and.(USERHEL.ne.USERHEL_BU)) THEN
618 NEED_REINITIALIZATION = .TRUE.
619 ENDIF
620## }
621
622 IF(NEED_REINITIALIZATION) THEN
623C Log the event because if it happens a lot of time and floods the screen, the user must see it
624C and either change its usage of MadLoop or turnoff COLLIER cache
625 WRITE(*,*) 'INFO: MadLoop detected that the global cache of COLLIER had to be reset because of a change in your use of MadLoop. This should not happend for each event.'
626 USERHEL_BU = USERHEL
627 SQSO_TARGET_BU = SQSO_TARGET
628 COLLIERMode_BU = COLLIERMode
629 COLLIERUseInternalStabilityTest_BU = COLLIERUseInternalStabilityTest
630 CTModeRun_BU = CTModeRun
631 IF (COLLIERGLOBALCACHE.EQ.-1) THEN
632 CALL INITCACHESYSTEM_CLL(N_CACHES*NPROCS,MAXNEXTERNAL)
633 ELSE
634 CALL INITCACHESYSTEM_CLL(N_CACHES*NPROCS,COLLIERGLOBALCACHE)
635 ENDIF
636 NCOLLIERCALLS(:) = 0
637 NCALLS_IN_CACHE(:) = -1
638C Make sure all caches are switched off at first.
639 call SwitchOffCacheSystem_cll()
640 ENDIF
641
642C Now we can finally activate the cache
643 CALL SwitchOnCache_cll((unique_id-1)*4+1)
644 COLLIER_CACHE_ACTIVE = 1
645
646 END
0647
=== modified file 'madgraph/iolibs/template_files/loop_optimized/CT_interface.inc'
--- madgraph/iolibs/template_files/loop_optimized/CT_interface.inc 2016-04-28 23:52:58 +0000
+++ madgraph/iolibs/template_files/loop_optimized/CT_interface.inc 2016-06-24 21:04:21 +0000
@@ -34,8 +34,8 @@
34C34C
35 %(complex_dp_format)s R1, ACC35 %(complex_dp_format)s R1, ACC
36 INTEGER I, J, K36 INTEGER I, J, K
37 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT37 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT,COLLIERINIT
38 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT38 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT,COLLIERINIT
39C39C
40C EXTERNAL FUNCTIONS40C EXTERNAL FUNCTIONS
41C41C
@@ -351,8 +351,8 @@
351 %(complex_dp_format)s R1, ACC351 %(complex_dp_format)s R1, ACC
352 INTEGER I, J, K352 INTEGER I, J, K
353 %(real_dp_format)s PDEN_DUMMY(0:3,NLOOPLINE-1)353 %(real_dp_format)s PDEN_DUMMY(0:3,NLOOPLINE-1)
354 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT354 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT,COLLIERINIT
355 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT355 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT,COLLIERINIT
356C356C
357C EXTERNAL FUNCTIONS357C EXTERNAL FUNCTIONS
358C358C
@@ -649,8 +649,8 @@
649C649C
650 include 'coupl.inc'650 include 'coupl.inc'
651651
652 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT652 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT,COLLIERINIT
653 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT653 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT,COLLIERINIT
654654
655 %(real_dp_format)s LSCALE655 %(real_dp_format)s LSCALE
656 INTEGER CTMODE656 INTEGER CTMODE
@@ -875,8 +875,8 @@
875C875C
876 include 'coupl.inc'876 include 'coupl.inc'
877877
878 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT878 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT,COLLIERINIT
879 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT879 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT,COLLIERINIT
880880
881 %(real_dp_format)s LSCALE881 %(real_dp_format)s LSCALE
882 INTEGER CTMODE882 INTEGER CTMODE
883883
=== modified file 'madgraph/iolibs/template_files/loop_optimized/GOLEM_interface.inc'
--- madgraph/iolibs/template_files/loop_optimized/GOLEM_interface.inc 2016-03-10 00:23:21 +0000
+++ madgraph/iolibs/template_files/loop_optimized/GOLEM_interface.inc 2016-06-24 21:04:21 +0000
@@ -103,8 +103,8 @@
103 common/%(proc_prefix)sLOOP/ID,R103 common/%(proc_prefix)sLOOP/ID,R
104## }104## }
105105
106 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT106 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT,COLLIERINIT
107 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT107 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT,COLLIERINIT
108108
109 INTEGER NLOOPGROUPS109 INTEGER NLOOPGROUPS
110 PARAMETER (NLOOPGROUPS=%(nloop_groups)d)110 PARAMETER (NLOOPGROUPS=%(nloop_groups)d)
111111
=== modified file 'madgraph/iolibs/template_files/loop_optimized/TIR_interface.inc'
--- madgraph/iolibs/template_files/loop_optimized/TIR_interface.inc 2016-03-10 00:23:21 +0000
+++ madgraph/iolibs/template_files/loop_optimized/TIR_interface.inc 2016-06-24 21:04:21 +0000
@@ -43,14 +43,14 @@
43C43C
44 INTEGER I, J, K44 INTEGER I, J, K
45 INTEGER NLOOPCOEFS45 INTEGER NLOOPCOEFS
46 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT46 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT,COLLIERINIT
47 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT47 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT,COLLIERINIT
4848
49c This variable will be used to detect changes in the TIR library used so as to force the reset of the TIR filter.49c This variable will be used to detect changes in the TIR library used so as to force the reset of the TIR filter.
50 INTEGER LAST_LIB_USED50 INTEGER LAST_LIB_USED
51 DATA LAST_LIB_USED/-1/51 DATA LAST_LIB_USED/-1/
5252
53 %(complex_dp_format)s TIRCOEFS(0:LOOPMAXCOEFS-1,3)53 %(complex_dp_format)s TIRCOEFS(0:LOOPMAXCOEFS-1,3),TIRCOEFSERRORS(0:LOOPMAXCOEFS-1,3)
54 %(complex_dp_format)s PJCOEFS(0:LOOPMAXCOEFS-1,3)54 %(complex_dp_format)s PJCOEFS(0:LOOPMAXCOEFS-1,3)
55## if(TIRCaching){55## if(TIRCaching){
56 integer TIR_CACHE_INDEX 56 integer TIR_CACHE_INDEX
@@ -72,9 +72,13 @@
72 %(real_dp_format)s LSCALE72 %(real_dp_format)s LSCALE
73 common/%(proc_prefix)sCT/LSCALE,CTMODE73 common/%(proc_prefix)sCT/LSCALE,CTMODE
7474
75C The variables below are just for monitoring purposes. 75## if(not AmplitudeReduction) {
76 INTEGER ID,SQSOINDEX,R76 INTEGER ID,SQSOINDEX,R
77 COMMON/%(proc_prefix)sLOOP/ID,SQSOINDEX,R77 common/%(proc_prefix)sLOOP/ID,SQSOINDEX,R
78## }else{
79 INTEGER ID,R
80 common/%(proc_prefix)sLOOP/ID,R
81## }
7882
79c The argument ILIB is the TIR library to be used for that specific library.83c The argument ILIB is the TIR library to be used for that specific library.
80 INTEGER LIBINDEX84 INTEGER LIBINDEX
@@ -178,9 +182,9 @@
178 enddo182 enddo
179183
180 do I=0,3184 do I=0,3
181 do J=1,(NLOOPLINE-1)185 do J=1,(NLOOPLINE-1)
182 PDEN(I,J)=PCT(I,J)186 PDEN(I,J)=PCT(I,J)
183 enddo187 enddo
184 enddo188 enddo
185C NUMBER OF INDEPEDENT LOOPCOEFS FOR RANK=RANK189C NUMBER OF INDEPEDENT LOOPCOEFS FOR RANK=RANK
186 NLOOPCOEFS=0190 NLOOPCOEFS=0
@@ -220,6 +224,23 @@
220 WRITE(*,*) 'ERROR:: IREGI is not interfaced.'224 WRITE(*,*) 'ERROR:: IREGI is not interfaced.'
221 STOP225 STOP
222## }226## }
227 CASE(7)
228C COLLIER
229## if(collier_available){
230 CALL %(proc_prefix)sCOLLIERLOOP(CTMODE,NLOOPLINE,RANK,PL,PDEN,M2L,TIRCOEFS,TIRCOEFSERRORS)
231C Shift the TIR coefficients by the corresponding COLLIER error if in CTMODE 2.
232 if (COLLIERUseInternalStabilityTest.and.CTMODE.eq.2) THEN
233C We add here the numerical inaccuracies linearly to be conservative
234 DO I=1,3
235 DO J=0,NLOOPCOEFS-1
236 TIRCOEFS(J,I)=TIRCOEFS(J,I)+TIRCOEFSERRORS(J,I)
237 ENDDO
238 ENDDO
239 ENDIF
240## } else {
241 WRITE(*,*) 'ERROR:: COLLIER is not interfaced.'
242 STOP
243## }
223 END SELECT244 END SELECT
224## if(TIRCaching){245## if(TIRCaching){
225C The zero index is dummy and means no caching at all since TIR_CACHE_SIZE=0.246C The zero index is dummy and means no caching at all since TIR_CACHE_SIZE=0.
@@ -262,6 +283,8 @@
262C WRITE(*,*) 'PJFry: Loop ID',ID,' =',RES(1),RES(2),RES(3)283C WRITE(*,*) 'PJFry: Loop ID',ID,' =',RES(1),RES(2),RES(3)
263C ELSEIF(MLReductionLib(I_LIB).EQ.3) THEN284C ELSEIF(MLReductionLib(I_LIB).EQ.3) THEN
264C WRITE(*,*) 'Iregi: Loop ID',ID,' =',RES(1),RES(2),RES(3)285C WRITE(*,*) 'Iregi: Loop ID',ID,' =',RES(1),RES(2),RES(3)
286C ELSEIF(MLReductionLib(I_LIB).EQ.7) THEN
287C WRITE(*,*) 'COLLIER: Loop ID',ID,' =',RES(1),RES(2),RES(3)
265C ENDIF288C ENDIF
266 END289 END
267290
@@ -385,8 +408,8 @@
385C GLOBAL VARIABLES 408C GLOBAL VARIABLES
386C409C
387 include 'MadLoopParams.inc'410 include 'MadLoopParams.inc'
388 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT411 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT,COLLIERINIT
389 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT412 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT,NINJAINIT,COLLIERINIT
390 413
391C ----------414C ----------
392C BEGIN CODE415C BEGIN CODE
@@ -428,7 +451,7 @@
428C CONSTANTS451C CONSTANTS
429C452C
430 INTEGER NLOOPLIB453 INTEGER NLOOPLIB
431 PARAMETER (NLOOPLIB=4)454 PARAMETER (NLOOPLIB=7)
432 INTEGER QP_NLOOPLIB455 INTEGER QP_NLOOPLIB
433## if(ninja_supports_quad_prec) {456## if(ninja_supports_quad_prec) {
434 PARAMETER (QP_NLOOPLIB=2)457 PARAMETER (QP_NLOOPLIB=2)
@@ -479,8 +502,8 @@
479 ENDIF502 ENDIF
480 ENDDO503 ENDDO
481 IF(J_LIB.EQ.0)THEN504 IF(J_LIB.EQ.0)THEN
482 SELECT_LIBINDEX=SELECT_LIBINDEX+1 505 SELECT_LIBINDEX=SELECT_LIBINDEX+1
483 IF(SELECT_LIBINDEX.GT.NLOOPLIB.OR.MLReductionLib(SELECT_LIBINDEX).EQ.0)SELECT_LIBINDEX=1506 IF(SELECT_LIBINDEX.GT.NLOOPLIB.OR.MLReductionLib(SELECT_LIBINDEX).EQ.0)SELECT_LIBINDEX=1
484 ENDIF507 ENDIF
485 ENDDO508 ENDDO
486 I=J_LIB509 I=J_LIB
487510
=== modified file 'madgraph/iolibs/template_files/loop_optimized/loop_matrix_standalone.inc'
--- madgraph/iolibs/template_files/loop_optimized/loop_matrix_standalone.inc 2016-04-05 23:57:17 +0000
+++ madgraph/iolibs/template_files/loop_optimized/loop_matrix_standalone.inc 2016-06-24 21:04:21 +0000
@@ -97,9 +97,9 @@
97 INTEGER NSQUAREDSOP197 INTEGER NSQUAREDSOP1
98 PARAMETER (NSQUAREDSOP1=NSQUAREDSO+1)98 PARAMETER (NSQUAREDSOP1=NSQUAREDSO+1)
99C The total number of loop reduction libraries99C The total number of loop reduction libraries
100C At present, there are only CutTools,PJFry++,IREGI,Golem95,Samurai and Ninja100C At present, there are only CutTools,PJFry++,IREGI,Golem95,Samurai, Ninja and COLLIER
101 INTEGER NLOOPLIB101 INTEGER NLOOPLIB
102 PARAMETER (NLOOPLIB=6)102 PARAMETER (NLOOPLIB=7)
103C Only CutTools or possibly Ninja (if installed with qp support) provide QP103C Only CutTools or possibly Ninja (if installed with qp support) provide QP
104 INTEGER QP_NLOOPLIB104 INTEGER QP_NLOOPLIB
105## if(ninja_supports_quad_prec) {105## if(ninja_supports_quad_prec) {
@@ -235,6 +235,7 @@
235C GLOBAL VARIABLES235C GLOBAL VARIABLES
236C 236C
237 include 'process_info.inc'237 include 'process_info.inc'
238 include 'unique_id.inc'
238 include 'coupl.inc'239 include 'coupl.inc'
239 include 'mp_coupl.inc'240 include 'mp_coupl.inc'
240 include 'MadLoopParams.inc'241 include 'MadLoopParams.inc'
@@ -267,20 +268,20 @@
267 DATA MP_DONE/.FALSE./268 DATA MP_DONE/.FALSE./
268 common/%(proc_prefix)sMP_DONE/MP_DONE269 common/%(proc_prefix)sMP_DONE/MP_DONE
269C A FLAG TO DENOTE WHETHER THE CORRESPONDING LOOPLIBS ARE AVAILABLE OR NOT270C A FLAG TO DENOTE WHETHER THE CORRESPONDING LOOPLIBS ARE AVAILABLE OR NOT
270 LOGICAL LOOPLIBS_AVAILABLE(6)271 LOGICAL LOOPLIBS_AVAILABLE(NLOOPLIB)
271 DATA LOOPLIBS_AVAILABLE/%(data_looplibs_av)s/272 DATA LOOPLIBS_AVAILABLE/%(data_looplibs_av)s/
272 common/%(proc_prefix)sLOOPLIBS_AV/ LOOPLIBS_AVAILABLE273 common/%(proc_prefix)sLOOPLIBS_AV/ LOOPLIBS_AVAILABLE
273C A FLAG TO DENOTE WHETHER THE CORRESPONDING DIRECTION TESTS AVAILABLE OR NOT IN THE LOOPLIBS274C A FLAG TO DENOTE WHETHER THE CORRESPONDING DIRECTION TESTS AVAILABLE OR NOT IN THE LOOPLIBS
274 LOGICAL LOOPLIBS_DIRECTEST(6)275 LOGICAL LOOPLIBS_DIRECTEST(NLOOPLIB)
275 DATA LOOPLIBS_DIRECTEST /.TRUE.,.TRUE.,.TRUE.,.TRUE.,.TRUE.,.TRUE./276 DATA LOOPLIBS_DIRECTEST /.TRUE.,.TRUE.,.TRUE.,.TRUE.,.TRUE.,.TRUE.,.TRUE./
276C Specifying for which reduction tool quadruple precision is available.277C Specifying for which reduction tool quadruple precision is available.
277C The index 0 is dummy and simply means that the corresponding loop_library is not available278C The index 0 is dummy and simply means that the corresponding loop_library is not available
278C in which case neither is its quadruple precision version.279C in which case neither is its quadruple precision version.
279 LOGICAL LOOPLIBS_QPAVAILABLE(0:6)280 LOGICAL LOOPLIBS_QPAVAILABLE(0:7)
280## if(ninja_supports_quad_prec) {281## if(ninja_supports_quad_prec) {
281 DATA LOOPLIBS_QPAVAILABLE /.FALSE.,.TRUE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.TRUE./282 DATA LOOPLIBS_QPAVAILABLE /.FALSE.,.TRUE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.TRUE.,.FALSE./
282## } else {283## } else {
283 DATA LOOPLIBS_QPAVAILABLE /.FALSE.,.TRUE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE./284 DATA LOOPLIBS_QPAVAILABLE /.FALSE.,.TRUE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE./
284## }285## }
285C PS CAN POSSIBILY BE PASSED THROUGH IMPROVE_PS BUT IS NOT MODIFIED FOR THE PURPOSE OF THE STABILITY TEST286C PS CAN POSSIBILY BE PASSED THROUGH IMPROVE_PS BUT IS NOT MODIFIED FOR THE PURPOSE OF THE STABILITY TEST
286C EVEN THOUGH THEY ARE PUT IN COMMON BLOCK, FOR NOW THEY ARE NOT USED ANYWHERE ELSE287C EVEN THOUGH THEY ARE PUT IN COMMON BLOCK, FOR NOW THEY ARE NOT USED ANYWHERE ELSE
@@ -329,7 +330,7 @@
329 DATA CT_REQ_SO_DONE/.FALSE./330 DATA CT_REQ_SO_DONE/.FALSE./
330 DATA MP_CT_REQ_SO_DONE/.FALSE./ 331 DATA MP_CT_REQ_SO_DONE/.FALSE./
331 DATA LOOP_REQ_SO_DONE/.FALSE./332 DATA LOOP_REQ_SO_DONE/.FALSE./
332 DATA MP_LOOP_REQ_SO_DONE/.FALSE./ 333 DATA MP_LOOP_REQ_SO_DONE/.FALSE./
333 DATA CTCALL_REQ_SO_DONE/.FALSE./334 DATA CTCALL_REQ_SO_DONE/.FALSE./
334 DATA FILTER_SO/.FALSE./335 DATA FILTER_SO/.FALSE./
335 common/%(proc_prefix)sSO_REQS/UVCT_REQ_SO_DONE,MP_UVCT_REQ_SO_DONE,CT_REQ_SO_DONE,MP_CT_REQ_SO_DONE,LOOP_REQ_SO_DONE,MP_LOOP_REQ_SO_DONE,CTCALL_REQ_SO_DONE,FILTER_SO336 common/%(proc_prefix)sSO_REQS/UVCT_REQ_SO_DONE,MP_UVCT_REQ_SO_DONE,CT_REQ_SO_DONE,MP_CT_REQ_SO_DONE,LOOP_REQ_SO_DONE,MP_LOOP_REQ_SO_DONE,CTCALL_REQ_SO_DONE,FILTER_SO
@@ -345,11 +346,10 @@
345 integer I_LIB346 integer I_LIB
346 DATA I_LIB/1/347 DATA I_LIB/1/
347 common/%(proc_prefix)sI_LIB/I_LIB348 common/%(proc_prefix)sI_LIB/I_LIB
348C UTIL NOW, ONLY CUTTOOLS PROVIDE QP349 LOGICAL QP_TOOLS_AVAILABLE
349 LOGICAL QP_TOOLS_AVAILABLE350 DATA QP_TOOLS_AVAILABLE/.FALSE./
350 DATA QP_TOOLS_AVAILABLE/.FALSE./351 INTEGER INDEX_QP_TOOLS(QP_NLOOPLIB+1)
351 INTEGER INDEX_QP_TOOLS(QP_NLOOPLIB+1)352 common/%(proc_prefix)sLOOP_TOOLS/QP_TOOLS_AVAILABLE,INDEX_QP_TOOLS
352 common/%(proc_prefix)sLOOP_TOOLS/QP_TOOLS_AVAILABLE,INDEX_QP_TOOLS
353353
354## if(not LoopInduced) {354## if(not LoopInduced) {
355 %(complex_dp_format)s AMP(NBORNAMPS)355 %(complex_dp_format)s AMP(NBORNAMPS)
@@ -420,9 +420,16 @@
420 DATA MP_DONE_ONCE/.FALSE./420 DATA MP_DONE_ONCE/.FALSE./
421 common/%(proc_prefix)sMP_DONE_ONCE/MP_DONE_ONCE421 common/%(proc_prefix)sMP_DONE_ONCE/MP_DONE_ONCE
422422
423 character(512) MLPath423 character(512) MLPath
424 common/MLPATH/MLPath424 common/MLPATH/MLPath
425425
426C This is just so that if the user disabled the computation of poles by COLLIER
427C using the MadLoop subroutine, we don't overwrite his choice when reading the parameters
428 LOGICAL FORCED_CHOICE_OF_COLLIER_UV_POLE_COMPUTATION, FORCED_CHOICE_OF_COLLIER_IR_POLE_COMPUTATION
429 LOGICAL COLLIER_UV_POLE_COMPUTATION_CHOICE, COLLIER_IR_POLE_COMPUTATION_CHOICE
430 DATA FORCED_CHOICE_OF_COLLIER_UV_POLE_COMPUTATION,FORCED_CHOICE_OF_COLLIER_IR_POLE_COMPUTATION/.FALSE.,.FALSE./
431 COMMON/%(proc_prefix)sCOLLIERPOLESFORCEDCHOICE/FORCED_CHOICE_OF_COLLIER_UV_POLE_COMPUTATION, FORCED_CHOICE_OF_COLLIER_IR_POLE_COMPUTATION,COLLIER_UV_POLE_COMPUTATION_CHOICE,COLLIER_IR_POLE_COMPUTATION_CHOICE
432
426C This variable controls the general initialization which is *common* between all MadLoop SubProcesses.433C This variable controls the general initialization which is *common* between all MadLoop SubProcesses.
427C For example setting the MadLoopPath or reading the ML runtime parameters.434C For example setting the MadLoopPath or reading the ML runtime parameters.
428 LOGICAL ML_INIT435 LOGICAL ML_INIT
@@ -440,6 +447,7 @@
440 LOGICAL FPE_IN_DP_REDUCTION, FPE_IN_QP_REDUCTION447 LOGICAL FPE_IN_DP_REDUCTION, FPE_IN_QP_REDUCTION
441 data FPE_IN_DP_REDUCTION, FPE_IN_QP_REDUCTION/.FALSE.,.FALSE./ 448 data FPE_IN_DP_REDUCTION, FPE_IN_QP_REDUCTION/.FALSE.,.FALSE./
442 COMMON/%(proc_prefix)sFPE_IN_REDUCTION/FPE_IN_DP_REDUCTION, FPE_IN_QP_REDUCTION449 COMMON/%(proc_prefix)sFPE_IN_REDUCTION/FPE_IN_DP_REDUCTION, FPE_IN_QP_REDUCTION
450
443C ----------451C ----------
444C BEGIN CODE452C BEGIN CODE
445C ----------453C ----------
@@ -451,6 +459,12 @@
451 CALL setMadLoopPath(TMP)459 CALL setMadLoopPath(TMP)
452 CALL JOINPATH(MLPATH,PARAMFNAME,PARAMFN)460 CALL JOINPATH(MLPATH,PARAMFNAME,PARAMFN)
453 CALL MADLOOPPARAMREADER(PARAMFN,.TRUE.)461 CALL MADLOOPPARAMREADER(PARAMFN,.TRUE.)
462 IF (FORCED_CHOICE_OF_COLLIER_UV_POLE_COMPUTATION) THEN
463 COLLIERComputeUVpoles = COLLIER_UV_POLE_COMPUTATION_CHOICE
464 ENDIF
465 IF (FORCED_CHOICE_OF_COLLIER_IR_POLE_COMPUTATION) THEN
466 COLLIERComputeIRpoles = COLLIER_IR_POLE_COMPUTATION_CHOICE
467 ENDIF
454 IF (FORBID_HEL_DOUBLECHECK) THEN468 IF (FORBID_HEL_DOUBLECHECK) THEN
455 DoubleCheckHelicityFilter = .False. 469 DoubleCheckHelicityFilter = .False.
456 ENDIF 470 ENDIF
@@ -801,6 +815,11 @@
801 CALL %(proc_prefix)sCLEAR_CACHES()815 CALL %(proc_prefix)sCLEAR_CACHES()
802ENDIF816ENDIF
803817
818## if(collier_available){
819C Now make sure to turn on the global COLLIER cache if applicable
820CALL %(proc_prefix)sSET_COLLIER_GLOBAL_CACHE(.TRUE.)
821## }
822
804IF (ImprovePSPoint.ge.0) THEN823IF (ImprovePSPoint.ge.0) THEN
805C Make the input PS more precise (exact onshell and energy-momentum conservation)824C Make the input PS more precise (exact onshell and energy-momentum conservation)
806 CALL %(proc_prefix)sIMPROVE_PS_POINT_PRECISION(PS)825 CALL %(proc_prefix)sIMPROVE_PS_POINT_PRECISION(PS)
@@ -1812,14 +1831,27 @@
1812IF (AUTOMATIC_CACHE_CLEARING) THEN1831IF (AUTOMATIC_CACHE_CLEARING) THEN
1813 CALL %(proc_prefix)sCLEAR_CACHES()1832 CALL %(proc_prefix)sCLEAR_CACHES()
1814ENDIF1833ENDIF
1834
1835## if(collier_available){
1836C Now make sure to turn off the global COLLIER cache if applicable
1837CALL %(proc_prefix)sSET_COLLIER_GLOBAL_CACHE(.FALSE.)
1838## }
1839
1815 END1840 END
18161841
1817 SUBROUTINE %(proc_prefix)sCLEAR_CACHES()1842 SUBROUTINE %(proc_prefix)sCLEAR_CACHES()
1818C Clears all the caches used at some point in MadLoop1843C
1844C This routine can be called directly from the user if
1845C AUTOMATIC_CACHE_CLEARING is set to False. It must then be called after
1846C ech event
1847C
1819 CALL %(proc_prefix)sCLEAR_TIR_CACHE()1848 CALL %(proc_prefix)sCLEAR_TIR_CACHE()
1820## if(ninja_available){1849## if(ninja_available){
1821 call ninja_clear_integral_cache()1850 call ninja_clear_integral_cache()
1822## }1851## }
1852## if(collier_available){
1853 call %(proc_prefix)sCLEAR_COLLIER_CACHE()
1854## }
1823 END1855 END
18241856
1825C --=========================================--1857C --=========================================--
@@ -1952,6 +1984,13 @@
1952 real*8 accuracies(3)1984 real*8 accuracies(3)
1953 real*8 list(maxstabilitylength)1985 real*8 list(maxstabilitylength)
19541986
1987C
1988C GLOBAL VARIABLES
1989C
1990 integer I_LIB
1991 common/%(proc_prefix)sI_LIB/I_LIB
1992 include 'MadLoopParams.inc'
1993
1955C ----------1994C ----------
1956C BEGIN CODE1995C BEGIN CODE
1957C ----------1996C ----------
@@ -1998,6 +2037,13 @@
1998 if (avg.ne.0.0d0) then2037 if (avg.ne.0.0d0) then
1999 acc(k) = acc(k) / ( ABS(AVG) / 3.0d0)2038 acc(k) = acc(k) / ( ABS(AVG) / 3.0d0)
2000 endif2039 endif
2040
2041C When using COLLIER with the internal stability test, the first evaluation is typically more reliable so we do not want to use the average but rather the first evaluation.
2042 IF (MLREDUCTIONLIB(I_LIB).eq.7.and.COLLIERUseInternalStabilityTest) THEN
2043 DO I=1,3
2044 estimate(i,k) = fulllist(i,k,1)
2045 ENDDO
2046 ENDIF
20012047
2002 enddo2048 enddo
20032049
@@ -2326,6 +2372,46 @@
2326C Definition of additional access routines2372C Definition of additional access routines
2327C --=========================================--2373C --=========================================--
23282374
2375 SUBROUTINE %(proc_prefix)sCOLLIER_COMPUTE_UV_POLES(ONOFF)
2376C
2377C This function can be called by the MadLoop user so as to chose to have COLLIER
2378C compute the UV pole or not (it costs more time).
2379C
2380 LOGICAL ONOFF
2381
2382 include 'MadLoopParams.inc'
2383
2384 LOGICAL FORCED_CHOICE_OF_COLLIER_UV_POLE_COMPUTATION, FORCED_CHOICE_OF_COLLIER_IR_POLE_COMPUTATION
2385 LOGICAL COLLIER_UV_POLE_COMPUTATION_CHOICE, COLLIER_IR_POLE_COMPUTATION_CHOICE
2386 COMMON/%(proc_prefix)sCOLLIERPOLESFORCEDCHOICE/FORCED_CHOICE_OF_COLLIER_UV_POLE_COMPUTATION, FORCED_CHOICE_OF_COLLIER_IR_POLE_COMPUTATION,COLLIER_UV_POLE_COMPUTATION_CHOICE,COLLIER_IR_POLE_COMPUTATION_CHOICE
2387
2388 COLLIERComputeUVpoles = ONOFF
2389C This is just so that if we read the param again, we don't overwrite the choice made here
2390 FORCED_CHOICE_OF_COLLIER_UV_POLE_COMPUTATION = .TRUE.
2391 COLLIER_UV_POLE_COMPUTATION_CHOICE = ONOFF
2392
2393 END SUBROUTINE
2394
2395 SUBROUTINE %(proc_prefix)sCOLLIER_COMPUTE_IR_POLES(ONOFF)
2396C
2397C This function can be called by the MadLoop user so as to chose to have COLLIER
2398C compute the IR pole or not (it costs more time).
2399C
2400 LOGICAL ONOFF
2401
2402 include 'MadLoopParams.inc'
2403
2404 LOGICAL FORCED_CHOICE_OF_COLLIER_UV_POLE_COMPUTATION, FORCED_CHOICE_OF_COLLIER_IR_POLE_COMPUTATION
2405 LOGICAL COLLIER_UV_POLE_COMPUTATION_CHOICE, COLLIER_IR_POLE_COMPUTATION_CHOICE
2406 COMMON/%(proc_prefix)sCOLLIERPOLESFORCEDCHOICE/FORCED_CHOICE_OF_COLLIER_UV_POLE_COMPUTATION, FORCED_CHOICE_OF_COLLIER_IR_POLE_COMPUTATION,COLLIER_UV_POLE_COMPUTATION_CHOICE,COLLIER_IR_POLE_COMPUTATION_CHOICE
2407
2408 COLLIERComputeIRpoles = ONOFF
2409C This is just so that if we read the param again, we don't overwrite the choice made here
2410 FORCED_CHOICE_OF_COLLIER_IR_POLE_COMPUTATION = .TRUE.
2411 COLLIER_IR_POLE_COMPUTATION_CHOICE = ONOFF
2412
2413 END SUBROUTINE
2414
2329 SUBROUTINE %(proc_prefix)sFORCE_STABILITY_CHECK(ONOFF)2415 SUBROUTINE %(proc_prefix)sFORCE_STABILITY_CHECK(ONOFF)
2330C2416C
2331C This function can be called by the MadLoop user so as to always have stability2417C This function can be called by the MadLoop user so as to always have stability
23322418
=== modified file 'madgraph/iolibs/template_files/matrix_loop_induced_madevent.inc'
--- madgraph/iolibs/template_files/matrix_loop_induced_madevent.inc 2016-02-18 03:09:50 +0000
+++ madgraph/iolibs/template_files/matrix_loop_induced_madevent.inc 2016-06-24 21:04:21 +0000
@@ -125,6 +125,9 @@
125125
126 IF(.NOT.INIT_MADLOOP) THEN126 IF(.NOT.INIT_MADLOOP) THEN
127 INIT_MADLOOP = .TRUE.127 INIT_MADLOOP = .TRUE.
128C We don't use the poles, so let's not compute them with COLLIER
129 CALL %(ml_prefix)sCOLLIER_COMPUTE_UV_POLES(.False.)
130 CALL %(ml_prefix)sCOLLIER_COMPUTE_IR_POLES(.False.)
128C Unless this is the first iteration, make sure to never double check the helicity filter again131C Unless this is the first iteration, make sure to never double check the helicity filter again
129 IF (read_grid_file) THEN132 IF (read_grid_file) THEN
130 CALL SET_FORBID_HEL_DOUBLECHECK(.True.)133 CALL SET_FORBID_HEL_DOUBLECHECK(.True.)
@@ -392,7 +395,7 @@
392 return395 return
393 endif396 endif
394397
395 IF (((OneEps+TwoEps)/finite).gt.(1000d0*PREC).AND.(((OneEps+TwoEps)/finite).gt.1.0d-5)) THEN398 IF (U.NE.7.AND.((OneEps+TwoEps)/finite).gt.(1000d0*PREC).AND.(((OneEps+TwoEps)/finite).gt.1.0d-5)) THEN
396 WARNING_COUNTERS(2) = WARNING_COUNTERS(2) + 1399 WARNING_COUNTERS(2) = WARNING_COUNTERS(2) + 1
397 IF (WARNING_COUNTERS(2).le.10) THEN400 IF (WARNING_COUNTERS(2).le.10) THEN
398 WRITE(*,*) "WARNING : The residue of the single and double pole of the loop matrix element being integrated does not seem to vanish."401 WRITE(*,*) "WARNING : The residue of the single and double pole of the loop matrix element being integrated does not seem to vanish."
399402
=== modified file 'madgraph/iolibs/template_files/matrix_loop_induced_madevent_group.inc'
--- madgraph/iolibs/template_files/matrix_loop_induced_madevent_group.inc 2016-02-18 03:09:50 +0000
+++ madgraph/iolibs/template_files/matrix_loop_induced_madevent_group.inc 2016-06-24 21:04:21 +0000
@@ -133,6 +133,9 @@
133133
134 IF(.NOT.INIT_MADLOOP) THEN134 IF(.NOT.INIT_MADLOOP) THEN
135 INIT_MADLOOP = .TRUE.135 INIT_MADLOOP = .TRUE.
136C We don't use the poles, so let's not compute them with COLLIER
137 CALL %(ml_prefix)sCOLLIER_COMPUTE_UV_POLES(.False.)
138 CALL %(ml_prefix)sCOLLIER_COMPUTE_IR_POLES(.False.)
136C Unless this is the first iteration, make sure to never double check the helicity filter again139C Unless this is the first iteration, make sure to never double check the helicity filter again
137 IF (read_grid_file) THEN 140 IF (read_grid_file) THEN
138 CALL SET_FORBID_HEL_DOUBLECHECK(.True.)141 CALL SET_FORBID_HEL_DOUBLECHECK(.True.)
@@ -405,7 +408,7 @@
405 return408 return
406 endif409 endif
407410
408 IF (((OneEps+TwoEps)/finite).gt.(1000d0*PREC).AND.(((OneEps+TwoEps)/finite).gt.1.0d-5)) THEN411 IF (U.NE.7.and.((OneEps+TwoEps)/finite).gt.(1000d0*PREC).AND.(((OneEps+TwoEps)/finite).gt.1.0d-5)) THEN
409 WARNING_COUNTERS(2) = WARNING_COUNTERS(2) + 1412 WARNING_COUNTERS(2) = WARNING_COUNTERS(2) + 1
410 IF (WARNING_COUNTERS(2).le.10) THEN413 IF (WARNING_COUNTERS(2).le.10) THEN
411 WRITE(*,*) "WARNING : The residue of the single and double pole of the loop matrix element being integrated does not seem to vanish."414 WRITE(*,*) "WARNING : The residue of the single and double pole of the loop matrix element being integrated does not seem to vanish."
412415
=== modified file 'madgraph/loop/loop_exporters.py'
--- madgraph/loop/loop_exporters.py 2016-05-11 21:44:52 +0000
+++ madgraph/loop/loop_exporters.py 2016-06-24 21:04:21 +0000
@@ -90,7 +90,8 @@
9090
91 include_names = {'ninja' : 'mninja.mod',91 include_names = {'ninja' : 'mninja.mod',
92 'golem' : 'generic_function_1p.mod',92 'golem' : 'generic_function_1p.mod',
93 'samurai':'msamurai.mod'}93 'samurai':'msamurai.mod',
94 'collier': 'collier.mod'}
9495
95 def __init__(self, mgme_dir="", dir_path = "", opt=None):96 def __init__(self, mgme_dir="", dir_path = "", opt=None):
96 """Initiate the LoopExporterFortran with directory information on where97 """Initiate the LoopExporterFortran with directory information on where
@@ -263,17 +264,18 @@
263 calls = self.write_loop_makefile_definitions(264 calls = self.write_loop_makefile_definitions(
264 writers.MakefileWriter(filePath),link_tir_libs,tir_libs)265 writers.MakefileWriter(filePath),link_tir_libs,tir_libs)
265266
266
267 # We need minimal editing of MadLoopCommons.f267 # We need minimal editing of MadLoopCommons.f
268 # For the optimized output, this file will be overwritten once the
269 # availability of COLLIER has been determined.
268 MadLoopCommon = open(os.path.join(self.loop_dir,'StandAlone', 270 MadLoopCommon = open(os.path.join(self.loop_dir,'StandAlone',
269 "SubProcesses","MadLoopCommons.inc")).read()271 "SubProcesses","MadLoopCommons.inc")).read()
270 writer = writers.FortranWriter(os.path.join(self.dir_path, 272 writer = writers.FortranWriter(os.path.join(self.dir_path,
271 "SubProcesses","MadLoopCommons.f"))273 "SubProcesses","MadLoopCommons.f"))
272 writer.writelines(MadLoopCommon%{274 writer.writelines(MadLoopCommon%{
273 'print_banner_commands':self.MadLoop_banner})275 'print_banner_commands':self.MadLoop_banner}, context={
276 'collier_available':False})
274 writer.close()277 writer.close()
275 278
276
277 # Copy the whole MadLoop5_resources directory (empty at this stage)279 # Copy the whole MadLoop5_resources directory (empty at this stage)
278 if not os.path.exists(pjoin(self.dir_path,'SubProcesses',280 if not os.path.exists(pjoin(self.dir_path,'SubProcesses',
279 'MadLoop5_resources')):281 'MadLoop5_resources')):
@@ -678,7 +680,7 @@
678 # generate_subprocess_directory_v4680 # generate_subprocess_directory_v4
679 #===========================================================================681 #===========================================================================
680 def generate_loop_subprocess(self, matrix_element, fortran_model,682 def generate_loop_subprocess(self, matrix_element, fortran_model,
681 group_number = None, proc_id = None, config_map=None):683 group_number = None, proc_id = None, config_map=None, unique_id=None):
682 """Generate the Pxxxxx directory for a loop subprocess in MG4 standalone,684 """Generate the Pxxxxx directory for a loop subprocess in MG4 standalone,
683 including the necessary loop_matrix.f, born_matrix.f and include files.685 including the necessary loop_matrix.f, born_matrix.f and include files.
684 Notice that this is too different from generate_subprocess_directory_v4686 Notice that this is too different from generate_subprocess_directory_v4
@@ -705,6 +707,14 @@
705707
706 logger.info('Creating files in directory %s' % dirpath)708 logger.info('Creating files in directory %s' % dirpath)
707709
710 if unique_id is None:
711 raise MadGraph5Error, 'A unique id must be provided to the function'+\
712 'generate_loop_subprocess of LoopProcessExporterFortranSA.'
713 # Create an include with the unique consecutive ID assigned
714 open('unique_id.inc','w').write(
715""" integer UNIQUE_ID
716 parameter(UNIQUE_ID=%d)"""%unique_id)
717
708 # Extract number of external particles718 # Extract number of external particles
709 (nexternal, ninitial) = matrix_element.get_nexternal_ninitial()719 (nexternal, ninitial) = matrix_element.get_nexternal_ninitial()
710720
@@ -778,7 +788,7 @@
778 'cts_mprec.h', 'cts_mpc.h', 'mp_coupl.inc', 788 'cts_mprec.h', 'cts_mpc.h', 'mp_coupl.inc',
779 'mp_coupl_same_name.inc',789 'mp_coupl_same_name.inc',
780 'MadLoopParamReader.f','MadLoopCommons.f',790 'MadLoopParamReader.f','MadLoopCommons.f',
781 'MadLoopParams.inc']791 'MadLoopParams.inc','global_specs.inc']
782 792
783 for file in linkfiles:793 for file in linkfiles:
784 ln('../%s' % file)794 ln('../%s' % file)
@@ -1014,11 +1024,13 @@
10141024
1015 writer.writelines(proc_include)1025 writer.writelines(proc_include)
1016 1026
1017 def generate_subprocess_directory_v4(self, matrix_element, fortran_model):1027 def generate_subprocess_directory_v4(self, matrix_element, fortran_model,
1028 unique_id):
1018 """ To overload the default name for this function such that the correct1029 """ To overload the default name for this function such that the correct
1019 function is used when called from the command interface """1030 function is used when called from the command interface """
1020 1031
1021 return self.generate_loop_subprocess(matrix_element,fortran_model)1032 return self.generate_loop_subprocess(matrix_element,fortran_model,
1033 unique_id=unique_id)
10221034
1023 def write_check_sa(self, writer, matrix_element):1035 def write_check_sa(self, writer, matrix_element):
1024 """Writes out the steering code check_sa. In the optimized output mode,1036 """Writes out the steering code check_sa. In the optimized output mode,
@@ -1576,7 +1588,7 @@
1576 # make sure that ninja appears first in the list of -L because 1588 # make sure that ninja appears first in the list of -L because
1577 # it is the tool for which the user is most susceptible of 1589 # it is the tool for which the user is most susceptible of
1578 # using a standalone verison independent of gosam_contrib1590 # using a standalone verison independent of gosam_contrib
1579 all_tir=['pjfry','iregi','ninja','golem','samurai']1591 all_tir=['pjfry','iregi','ninja','golem','samurai','collier']
1580 1592
1581 def __init__(self, mgme_dir="", dir_path = "", opt=None):1593 def __init__(self, mgme_dir="", dir_path = "", opt=None):
1582 """Initiate the LoopProcessOptimizedExporterFortranSA with directory 1594 """Initiate the LoopProcessOptimizedExporterFortranSA with directory
@@ -1588,7 +1600,7 @@
15881600
1589 # TIR available ones1601 # TIR available ones
1590 self.tir_available_dict={'pjfry':True,'iregi':True,'golem':True,1602 self.tir_available_dict={'pjfry':True,'iregi':True,'golem':True,
1591 'samurai':True,'ninja':True}1603 'samurai':True,'ninja':True,'collier':True}
15921604
1593 for tir in self.all_tir:1605 for tir in self.all_tir:
1594 tir_dir="%s_dir"%tir1606 tir_dir="%s_dir"%tir
@@ -1627,7 +1639,7 @@
1627 for tir in self.all_tir:1639 for tir in self.all_tir:
1628 context['%s_available'%tir]=self.tir_available_dict[tir]1640 context['%s_available'%tir]=self.tir_available_dict[tir]
1629 # safety check1641 # safety check
1630 if tir not in ['golem','pjfry','iregi','samurai','ninja']:1642 if tir not in ['golem','pjfry','iregi','samurai','ninja','collier']:
1631 raise MadGraph5Error,"%s was not a TIR currently interfaced."%tir_name1643 raise MadGraph5Error,"%s was not a TIR currently interfaced."%tir_name
16321644
1633 return context1645 return context
@@ -1648,16 +1660,30 @@
1648 tir_name=tir1660 tir_name=tir
1649 libpath = self.link_TIR(os.path.join(self.dir_path, 'lib'),1661 libpath = self.link_TIR(os.path.join(self.dir_path, 'lib'),
1650 libpath,libname,tir_name=tir_name)1662 libpath,libname,tir_name=tir_name)
1651 setattr(self,tir_dir,libpath)
1652 if libpath != "":1663 if libpath != "":
1653 if tir in ['ninja','pjfry','golem','samurai']:1664 if tir in ['ninja','pjfry','golem','samurai','collier']:
1654 # It is cleaner to use the original location of the libraries1665 # It is cleaner to use the original location of the libraries
1655 link_tir_libs.append('-L%s/ -l%s'%(libpath,tir))1666 link_tir_libs.append('-L%s/ -l%s'%(libpath,tir))
1656 tir_libs.append('%s/lib%s.$(libext)'%(libpath,tir))1667 tir_libs.append('%s/lib%s.$(libext)'%(libpath,tir))
1657 if tir in ['ninja','golem', 'samurai']:1668 # For Ninja, we must also link against OneLoop.
1669 if tir in ['ninja']:
1670 if not any(os.path.isfile(pjoin(libpath,'libavh_olo.%s'%ext))
1671 for ext in ['a','dylib','so']):
1672 raise MadGraph5Error(
1673"The OneLOop library 'libavh_olo.(a|dylib|so)' could no be found in path '%s'. Please place a symlink to it there."%libpath)
1674 link_tir_libs.append('-L%s/ -l%s'%(libpath,'avh_olo'))
1675 tir_libs.append('%s/lib%s.$(libext)'%(libpath,'avh_olo'))
1676 if tir in ['ninja','golem', 'samurai','collier']:
1658 trgt_path = pjoin(os.path.dirname(libpath),'include')1677 trgt_path = pjoin(os.path.dirname(libpath),'include')
1659 to_include = misc.find_includes_path(trgt_path,1678 if os.path.isdir(trgt_path):
1679 to_include = misc.find_includes_path(trgt_path,
1660 self.include_names[tir])1680 self.include_names[tir])
1681 else:
1682 to_include = None
1683 # Special possible location for collier
1684 if to_include is None and tir=='collier':
1685 to_include = misc.find_includes_path(
1686 pjoin(libpath,'modules'),self.include_names[tir])
1661 if to_include is None:1687 if to_include is None:
1662 logger.error(1688 logger.error(
1663'Could not find the include directory for %s, looking in %s.\n' % (tir, str(trgt_path))+1689'Could not find the include directory for %s, looking in %s.\n' % (tir, str(trgt_path))+
@@ -1669,7 +1695,7 @@
1669 # (such as what is done with the Sherpa interface), we1695 # (such as what is done with the Sherpa interface), we
1670 # place here an easy handle on the golem includes1696 # place here an easy handle on the golem includes
1671 name_map = {'golem':'golem95','samurai':'samurai',1697 name_map = {'golem':'golem95','samurai':'samurai',
1672 'ninja':'ninja'}1698 'ninja':'ninja','collier':'collier'}
1673 ln(to_include, starting_dir=pjoin(self.dir_path,'lib'),1699 ln(to_include, starting_dir=pjoin(self.dir_path,'lib'),
1674 name='%s_include'%name_map[tir],abspath=True)1700 name='%s_include'%name_map[tir],abspath=True)
1675 ln(libpath, starting_dir=pjoin(self.dir_path,'lib'),1701 ln(libpath, starting_dir=pjoin(self.dir_path,'lib'),
@@ -1687,6 +1713,17 @@
1687 writers.MakefileWriter(MadLoop_makefile_definitions),1713 writers.MakefileWriter(MadLoop_makefile_definitions),
1688 link_tir_libs,tir_libs, tir_include=tir_include)1714 link_tir_libs,tir_libs, tir_include=tir_include)
16891715
1716 # Finally overwrite MadLoopCommons.f now that we know the availibility of
1717 # COLLIER.
1718 MadLoopCommon = open(os.path.join(self.loop_dir,'StandAlone',
1719 "SubProcesses","MadLoopCommons.inc")).read()
1720 writer = writers.FortranWriter(os.path.join(self.dir_path,
1721 "SubProcesses","MadLoopCommons.f"))
1722 writer.writelines(MadLoopCommon%{
1723 'print_banner_commands':self.MadLoop_banner}, context={
1724 'collier_available':self.tir_available_dict['collier']})
1725 writer.close()
1726
1690 def link_files_from_Subprocesses(self,proc_name):1727 def link_files_from_Subprocesses(self,proc_name):
1691 """ Does the same as the mother routine except that it also links1728 """ Does the same as the mother routine except that it also links
1692 coef_specs.inc in the HELAS folder."""1729 coef_specs.inc in the HELAS folder."""
@@ -1704,7 +1741,7 @@
1704 """Link the TIR source directory inside the target path given1741 """Link the TIR source directory inside the target path given
1705 in argument"""1742 in argument"""
1706 1743
1707 if tir_name in ['pjfry','golem','samurai','ninja']:1744 if tir_name in ['pjfry','golem','samurai','ninja','collier']:
1708 # not self-contained libraries1745 # not self-contained libraries
1709 if (not isinstance(libpath,str)) or (not os.path.exists(libpath)) \1746 if (not isinstance(libpath,str)) or (not os.path.exists(libpath)) \
1710 or (not os.path.isfile(pjoin(libpath,libname))):1747 or (not os.path.isfile(pjoin(libpath,libname))):
@@ -1742,7 +1779,7 @@
1742 return ""1779 return ""
1743 1780
1744 if self.dependencies=='internal':1781 if self.dependencies=='internal':
1745 if tir_name in ['pjfry','golem','samurai','ninja']:1782 if tir_name in ['pjfry','golem','samurai','ninja','collier']:
1746 self.tir_available_dict[tir_name]=False1783 self.tir_available_dict[tir_name]=False
1747 logger.info("When using the 'output_dependencies=internal' "+\1784 logger.info("When using the 'output_dependencies=internal' "+\
1748" MG5_aMC option, the (optional) reduction library %s cannot be employed because"%tir_name+\1785" MG5_aMC option, the (optional) reduction library %s cannot be employed because"%tir_name+\
@@ -1793,7 +1830,7 @@
1793 self.tir_available_dict[tir_name]=False1830 self.tir_available_dict[tir_name]=False
1794 return ""1831 return ""
1795 # We link the tools below directly to the lib directory of the output 1832 # We link the tools below directly to the lib directory of the output
1796 if not tir_name in ['pjfry','golem','samurai','ninja']:1833 if not tir_name in ['pjfry','golem','samurai','ninja','collier']:
1797 ln(os.path.join(libpath,libname),targetPath,abspath=True)1834 ln(os.path.join(libpath,libname),targetPath,abspath=True)
17981835
1799 elif self.dependencies=='environment_paths':1836 elif self.dependencies=='environment_paths':
@@ -1804,7 +1841,7 @@
1804 logger.info('MG5_aMC is using %s installation found at %s.'%\1841 logger.info('MG5_aMC is using %s installation found at %s.'%\
1805 (tir_name,newlibpath)) 1842 (tir_name,newlibpath))
1806 # We link the tools below directly to directly where the library is detected1843 # We link the tools below directly to directly where the library is detected
1807 if not tir_name in ['pjfry','golem','samurai','ninja']:1844 if not tir_name in ['pjfry','golem','samurai','ninja','collier']:
1808 ln(newlibpath,targetPath,abspath=True)1845 ln(newlibpath,targetPath,abspath=True)
1809 self.tir_available_dict[tir_name]=True1846 self.tir_available_dict[tir_name]=True
1810 return os.path.dirname(newlibpath)1847 return os.path.dirname(newlibpath)
@@ -1911,6 +1948,11 @@
1911 self.write_GOLEM_interface(writers.FortranWriter(filename),1948 self.write_GOLEM_interface(writers.FortranWriter(filename),
1912 matrix_element)1949 matrix_element)
19131950
1951 if 'collier' in self.tir_available_dict and self.tir_available_dict['collier']:
1952 filename = 'COLLIER_interface.f'
1953 self.write_COLLIER_interface(writers.FortranWriter(filename),
1954 matrix_element)
1955
1914 filename = 'loop_num.f'1956 filename = 'loop_num.f'
1915 self.write_loop_num(writers.FortranWriter(filename),\1957 self.write_loop_num(writers.FortranWriter(filename),\
1916 matrix_element,OptimizedFortranModel)1958 matrix_element,OptimizedFortranModel)
@@ -2042,6 +2084,40 @@
2042 else:2084 else:
2043 return file2085 return file
20442086
2087 def write_COLLIER_interface(self, writer, matrix_element):
2088 """ Create the file COLLIER_interface.f"""
2089
2090 # First write GOLEM_interface which interfaces MG5 with TIR.
2091 replace_dict=copy.copy(matrix_element.rep_dict)
2092
2093 file = open(os.path.join(self.template_dir,'COLLIER_interface.inc')).read()
2094
2095 FPR = q_polynomial.FortranPolynomialRoutines(replace_dict['maxrank'],\
2096 coef_format=replace_dict['complex_dp_format'],\
2097 sub_prefix=replace_dict['proc_prefix'])
2098 map_definition = []
2099 collier_map = FPR.get_COLLIER_mapping()
2100
2101 chunk_size = 10
2102 for map_name, indices_list in \
2103 [('COEFMAP_ZERO',[c[0] for c in collier_map]),
2104 ('COEFMAP_ONE',[c[1] for c in collier_map]),
2105 ('COEFMAP_TWO',[c[2] for c in collier_map]),
2106 ('COEFMAP_THREE',[c[3] for c in collier_map])]:
2107 for k in xrange(0, len(indices_list), chunk_size):
2108 map_definition.append("DATA (%s(I),I=%3r,%3r) /%s/" % \
2109 (map_name,k, min(k + chunk_size, len(indices_list))-1,
2110 ','.join('%2r'%ind for ind in indices_list[k:k + chunk_size])))
2111
2112 replace_dict['collier_coefmap'] = '\n'.join(map_definition)
2113
2114 file = file % replace_dict
2115
2116 if writer:
2117 writer.writelines(file,context=self.get_context(matrix_element))
2118 else:
2119 return file
2120
2045 def write_GOLEM_interface(self, writer, matrix_element):2121 def write_GOLEM_interface(self, writer, matrix_element):
2046 """ Create the file GOLEM_interface.f which does NOT contain the subroutine2122 """ Create the file GOLEM_interface.f which does NOT contain the subroutine
2047 defining the loop HELAS-like calls along with the general interfacing 2123 defining the loop HELAS-like calls along with the general interfacing
@@ -2371,6 +2447,27 @@
23712447
2372 writer.writelines(file,context=self.get_context(matrix_element))2448 writer.writelines(file,context=self.get_context(matrix_element))
2373 2449
2450 def write_global_specs(self, matrix_element_list):
2451 """ From the list of matrix element, or the single matrix element, derive
2452 the global quantities to write in global_coef_specs.inc"""
2453
2454 if isinstance(matrix_element_list, list):
2455 me_list = matrix_element_list
2456 else:
2457 me_list = [matrix_element_list]
2458
2459 open(pjoin(self.dir_path,'SubProcesses','global_specs.inc'),'w').write(
2460""" integer MAXNEXTERNAL
2461 parameter(MAXNEXTERNAL=%d)
2462 integer OVERALLMAXRANK
2463 parameter(OVERALLMAXRANK=%d)
2464 integer NPROCS
2465 parameter(NPROCS=%d)"""%(
2466 max(me.get_nexternal_ninitial()[0] for me in me_list),
2467 max(me.get_max_loop_rank() for me in me_list),
2468 len(me_list)))
2469
2470
2374 def fix_coef_specs(self, overall_max_lwf_spin, overall_max_loop_vert_rank):2471 def fix_coef_specs(self, overall_max_lwf_spin, overall_max_loop_vert_rank):
2375 """ If processes with different maximum loop wavefunction size or2472 """ If processes with different maximum loop wavefunction size or
2376 different maximum loop vertex rank have to be output together, then2473 different maximum loop vertex rank have to be output together, then
@@ -2572,7 +2669,7 @@
2572 looplibs_av=['.TRUE.']2669 looplibs_av=['.TRUE.']
2573 # one should be careful about the order in the following as it must match2670 # one should be careful about the order in the following as it must match
2574 # the ordering in MadLoopParamsCard.2671 # the ordering in MadLoopParamsCard.
2575 for tir_lib in ['pjfry','iregi','golem','samurai','ninja']:2672 for tir_lib in ['pjfry','iregi','golem','samurai','ninja','collier']:
2576 looplibs_av.append('.TRUE.' if tir_lib in self.all_tir and \2673 looplibs_av.append('.TRUE.' if tir_lib in self.all_tir and \
2577 self.tir_available_dict[tir_lib] else '.FALSE.')2674 self.tir_available_dict[tir_lib] else '.FALSE.')
2578 replace_dict['data_looplibs_av']=','.join(looplibs_av)2675 replace_dict['data_looplibs_av']=','.join(looplibs_av)
@@ -2944,11 +3041,15 @@
2944 LoopInducedExporterME.finalize_v4_directory(self,*args,**opts)3041 LoopInducedExporterME.finalize_v4_directory(self,*args,**opts)
2945 3042
2946 def generate_subprocess_directory_v4(self, subproc_group,3043 def generate_subprocess_directory_v4(self, subproc_group,
2947 fortran_model,group_number):3044 fortran_model,group_number, unique_id=None):
2948 """Generate the Pn directory for a subprocess group in MadEvent,3045 """Generate the Pn directory for a subprocess group in MadEvent,
2949 including the necessary matrix_N.f files, configs.inc and various3046 including the necessary matrix_N.f files, configs.inc and various
2950 other helper files"""3047 other helper files"""
2951 3048
3049 if unique_id is None:
3050 raise MadGraph5Error, 'A unique_id must be provided to '+\
3051 'generate_subprocess_directory_v4 in LoopInducedExporterMEGroup.'
3052
2952 # Generate the MadLoop files3053 # Generate the MadLoop files
2953 calls = 03054 calls = 0
2954 matrix_elements = subproc_group.get('matrix_elements')3055 matrix_elements = subproc_group.get('matrix_elements')
@@ -2956,7 +3057,8 @@
2956 calls += self.generate_loop_subprocess(matrix_element,fortran_model,3057 calls += self.generate_loop_subprocess(matrix_element,fortran_model,
2957 group_number = group_number, proc_id = str(ime+1),3058 group_number = group_number, proc_id = str(ime+1),
2958# group_number = str(subproc_group.get('number')), proc_id = str(ime+1),3059# group_number = str(subproc_group.get('number')), proc_id = str(ime+1),
2959 config_map = subproc_group.get('diagram_maps')[ime])3060 config_map = subproc_group.get('diagram_maps')[ime],
3061 unique_id=unique_id+ime)
2960 3062
2961 # Then generate the MadEvent files3063 # Then generate the MadEvent files
2962 export_v4.ProcessExporterFortranMEGroup.generate_subprocess_directory_v4(3064 export_v4.ProcessExporterFortranMEGroup.generate_subprocess_directory_v4(
@@ -3107,14 +3209,15 @@
3107 # care of MadLoop virtuals initialization3209 # care of MadLoop virtuals initialization
3108 LoopInducedExporterME.finalize_v4_directory(self,*args,**opts)3210 LoopInducedExporterME.finalize_v4_directory(self,*args,**opts)
31093211
3110 def generate_subprocess_directory_v4(self, matrix_element, fortran_model, me_number):3212 def generate_subprocess_directory_v4(self, matrix_element, fortran_model,
3213 me_number):
3111 """Generate the Pn directory for a subprocess group in MadEvent,3214 """Generate the Pn directory for a subprocess group in MadEvent,
3112 including the necessary matrix_N.f files, configs.inc and various3215 including the necessary matrix_N.f files, configs.inc and various
3113 other helper files"""3216 other helper files"""
3114 3217
3115 # Then generate the MadLoop files3218 # Then generate the MadLoop files
3116 calls = self.generate_loop_subprocess(matrix_element,fortran_model, 3219 calls = self.generate_loop_subprocess(matrix_element,fortran_model,
3117 group_number = me_number)3220 group_number = me_number, unique_id=me_number)
3118 3221
3119 3222
3120 # First generate the MadEvent files3223 # First generate the MadEvent files
31213224
=== modified file 'madgraph/madevent/gen_ximprove.py'
--- madgraph/madevent/gen_ximprove.py 2016-04-16 23:51:09 +0000
+++ madgraph/madevent/gen_ximprove.py 2016-06-24 21:04:21 +0000
@@ -1100,6 +1100,7 @@
1100 break1100 break
1101 info = jobs[j]1101 info = jobs[j]
1102 info['script_name'] = 'ajob%i' % script_number1102 info['script_name'] = 'ajob%i' % script_number
1103 info['keeplog'] = 'false'
1103 if "base_directory" not in info:1104 if "base_directory" not in info:
1104 info["base_directory"] = "./"1105 info["base_directory"] = "./"
1105 fsock.write(template_text % info)1106 fsock.write(template_text % info)
11061107
=== modified file 'madgraph/madevent/sum_html.py'
--- madgraph/madevent/sum_html.py 2016-01-30 05:06:31 +0000
+++ madgraph/madevent/sum_html.py 2016-06-24 21:04:21 +0000
@@ -57,6 +57,7 @@
57 'Samurai_usage' : 0,57 'Samurai_usage' : 0,
58 'Ninja_usage' : 0,58 'Ninja_usage' : 0,
59 'Ninja_QP_usage' : 0,59 'Ninja_QP_usage' : 0,
60 'COLLIER_usage' : 0,
60 'max_precision' : 1.0e99,61 'max_precision' : 1.0e99,
61 'min_precision' : 0.0,62 'min_precision' : 0.0,
62 'averaged_timing' : 0.0,63 'averaged_timing' : 0.0,
@@ -119,6 +120,7 @@
119 self['Golem_usage'] = u_codes[4]120 self['Golem_usage'] = u_codes[4]
120 self['Samurai_usage'] = u_codes[5]121 self['Samurai_usage'] = u_codes[5]
121 self['Ninja_usage'] = u_codes[6]122 self['Ninja_usage'] = u_codes[6]
123 self['COLLIER_usage'] = u_codes[7]
122 self['Ninja_QP_usage'] = u_codes[8]124 self['Ninja_QP_usage'] = u_codes[8]
123 self['CutTools_QP_usage'] = u_codes[9]125 self['CutTools_QP_usage'] = u_codes[9]
124 t_return_code = xml_node.getElementsByTagName('t_return_code')126 t_return_code = xml_node.getElementsByTagName('t_return_code')
@@ -177,6 +179,7 @@
177 ('Golem',float(self['Golem_usage'])/self['n_madloop_calls']),179 ('Golem',float(self['Golem_usage'])/self['n_madloop_calls']),
178 ('IREGI',float(self['IREGI_usage'])/self['n_madloop_calls']),180 ('IREGI',float(self['IREGI_usage'])/self['n_madloop_calls']),
179 ('Samurai',float(self['Samurai_usage'])/self['n_madloop_calls']),181 ('Samurai',float(self['Samurai_usage'])/self['n_madloop_calls']),
182 ('COLLIER',float(self['COLLIER_usage'])/self['n_madloop_calls']),
180 ('Ninja_DP',float(self['Ninja_usage'])/self['n_madloop_calls']),183 ('Ninja_DP',float(self['Ninja_usage'])/self['n_madloop_calls']),
181 ('Ninja_QP',float(self['Ninja_QP_usage'])/self['n_madloop_calls'])]184 ('Ninja_QP',float(self['Ninja_QP_usage'])/self['n_madloop_calls'])]
182185
@@ -714,8 +717,8 @@
714 for P_comb in Presults:717 for P_comb in Presults:
715 P_text += P_comb.get_html(run, unit, cmd.me_dir) 718 P_text += P_comb.get_html(run, unit, cmd.me_dir)
716 P_comb.compute_values()719 P_comb.compute_values()
717 P_comb.write_results_dat(pjoin(cmd.me_dir, 'SubProcesses', P_comb.name,720 #P_comb.write_results_dat(pjoin(cmd.me_dir, 'SubProcesses', P_comb.name,
718 '%s_results.dat' % run))721 # '%s_results.dat' % run))
719722
720 723
721 Presults.write_results_dat(pjoin(cmd.me_dir,'SubProcesses', 'results.dat')) 724 Presults.write_results_dat(pjoin(cmd.me_dir,'SubProcesses', 'results.dat'))
722725
=== modified file 'madgraph/various/banner.py'
--- madgraph/various/banner.py 2016-05-11 21:44:52 +0000
+++ madgraph/various/banner.py 2016-06-24 21:04:21 +0000
@@ -1526,7 +1526,7 @@
1526 elif lpp in (3,-3):1526 elif lpp in (3,-3):
1527 return math.copysign(11, lpp)1527 return math.copysign(11, lpp)
1528 elif lpp == 0:1528 elif lpp == 0:
1529 logger.critical("Fail to write correct idbmup in the lhe file. Please correct those by hand")1529 #logger.critical("Fail to write correct idbmup in the lhe file. Please correct those by hand")
1530 return 01530 return 0
1531 else:1531 else:
1532 return lpp1532 return lpp
@@ -2189,17 +2189,23 @@
2189 contains a parser to read it, facilities to write a new file,...2189 contains a parser to read it, facilities to write a new file,...
2190 """2190 """
2191 2191
21922192 _ID_reduction_tool_map = {1:'CutTools',
2193 2193 2:'PJFry++',
2194 3:'IREGI',
2195 4:'Golem95',
2196 5:'Samurai',
2197 6:'Ninja',
2198 7:'COLLIER'}
2199
2194 def default_setup(self):2200 def default_setup(self):
2195 """initialize the directory to the default value"""2201 """initialize the directory to the default value"""
2196 2202
2197 self.add_param("MLReductionLib", "6|1|2")2203 self.add_param("MLReductionLib", "7|6|1|2")
2198 self.add_param("IREGIMODE", 2)2204 self.add_param("IREGIMODE", 2)
2199 self.add_param("IREGIRECY", True)2205 self.add_param("IREGIRECY", True)
2200 self.add_param("CTModeRun", -1)2206 self.add_param("CTModeRun", -1)
2201 self.add_param("MLStabThres", 1e-3)2207 self.add_param("MLStabThres", 1e-3)
2202 self.add_param("NRotations_DP", 1)2208 self.add_param("NRotations_DP", 0)
2203 self.add_param("NRotations_QP", 0)2209 self.add_param("NRotations_QP", 0)
2204 self.add_param("ImprovePSPoint", 2)2210 self.add_param("ImprovePSPoint", 2)
2205 self.add_param("CTLoopLibrary", 2)2211 self.add_param("CTLoopLibrary", 2)
@@ -2215,8 +2221,16 @@
2215 self.add_param("HelicityFilterLevel", 2)2221 self.add_param("HelicityFilterLevel", 2)
2216 self.add_param("LoopInitStartOver", False)2222 self.add_param("LoopInitStartOver", False)
2217 self.add_param("HelInitStartOver", False)2223 self.add_param("HelInitStartOver", False)
2218 self.add_param("UseQPIntegrandForNinja", False) 2224 self.add_param("UseQPIntegrandForNinja", True)
2219 self.add_param("UseQPIntegrandForCutTools", True)2225 self.add_param("UseQPIntegrandForCutTools", True)
2226 self.add_param("COLLIERMode", 1)
2227 self.add_param("COLLIERComputeUVpoles", True)
2228 self.add_param("COLLIERComputeIRpoles", True)
2229 self.add_param("COLLIERRequiredAccuracy", 1.0e-8)
2230 self.add_param("COLLIERCanOutput",False)
2231 self.add_param("COLLIERGlobalCache",-1)
2232 self.add_param("COLLIERUseCacheForPoles",False)
2233 self.add_param("COLLIERUseInternalStabilityTest",True)
22202234
2221 def read(self, finput):2235 def read(self, finput):
2222 """Read the input file, this can be a path to a file, 2236 """Read the input file, this can be a path to a file,
22232237
=== modified file 'madgraph/various/cluster.py'
--- madgraph/various/cluster.py 2016-02-23 22:55:27 +0000
+++ madgraph/various/cluster.py 2016-06-24 21:04:21 +0000
@@ -2126,3 +2126,5 @@
2126 'lsf': LSFCluster, 'ge':GECluster, 'slurm': SLURMCluster, 2126 'lsf': LSFCluster, 'ge':GECluster, 'slurm': SLURMCluster,
2127 'htcaas':HTCaaSCluster, 'htcaas2':HTCaaS2Cluster}2127 'htcaas':HTCaaSCluster, 'htcaas2':HTCaaS2Cluster}
21282128
2129onecore=MultiCore(1) # create a thread to run simple bash job without having to
2130 #fork the main process
2129\ No newline at end of file2131\ No newline at end of file
21302132
=== modified file 'madgraph/various/lhe_parser.py'
--- madgraph/various/lhe_parser.py 2016-06-07 09:34:40 +0000
+++ madgraph/various/lhe_parser.py 2016-06-24 21:04:21 +0000
@@ -20,22 +20,23 @@
2020
21class Particle(object):21class Particle(object):
22 """ """22 """ """
23 pattern=re.compile(r'''^\s*23 # regular expression not use anymore to speed up the computation
24 (?P<pid>-?\d+)\s+ #PID24 #pattern=re.compile(r'''^\s*
25 (?P<status>-?\d+)\s+ #status (1 for output particle)25 # (?P<pid>-?\d+)\s+ #PID
26 (?P<mother1>-?\d+)\s+ #mother26 # (?P<status>-?\d+)\s+ #status (1 for output particle)
27 (?P<mother2>-?\d+)\s+ #mother27 # (?P<mother1>-?\d+)\s+ #mother
28 (?P<color1>[+-e.\d]*)\s+ #color128 # (?P<mother2>-?\d+)\s+ #mother
29 (?P<color2>[+-e.\d]*)\s+ #color229 # (?P<color1>[+-e.\d]*)\s+ #color1
30 (?P<px>[+-e.\d]*)\s+ #px30 # (?P<color2>[+-e.\d]*)\s+ #color2
31 (?P<py>[+-e.\d]*)\s+ #py31 # (?P<px>[+-e.\d]*)\s+ #px
32 (?P<pz>[+-e.\d]*)\s+ #pz32 # (?P<py>[+-e.\d]*)\s+ #py
33 (?P<E>[+-e.\d]*)\s+ #E33 # (?P<pz>[+-e.\d]*)\s+ #pz
34 (?P<mass>[+-e.\d]*)\s+ #mass34 # (?P<E>[+-e.\d]*)\s+ #E
35 (?P<vtim>[+-e.\d]*)\s+ #displace vertex35 # (?P<mass>[+-e.\d]*)\s+ #mass
36 (?P<helicity>[+-e.\d]*)\s* #helicity36 # (?P<vtim>[+-e.\d]*)\s+ #displace vertex
37 ($|(?P<comment>\#[\d|D]*)) #comment/end of string37 # (?P<helicity>[+-e.\d]*)\s* #helicity
38 ''',66) #verbose+ignore case38 # ($|(?P<comment>\#[\d|D]*)) #comment/end of string
39 # ''',66) #verbose+ignore case
39 40
40 41
41 42
@@ -78,17 +79,19 @@
78 79
79 def parse(self, line):80 def parse(self, line):
80 """parse the line"""81 """parse the line"""
81 82
82 obj = self.pattern.search(line)83 args = line.split()
83 if not obj:84 keys = ['pid', 'status','mother1','mother2','color1', 'color2', 'px','py','pz','E',
84 raise Exception, 'the line\n%s\n is not a valid format for LHE particle' % line85 'mass','vtim','helicity']
85 for key, value in obj.groupdict().items():86
86 if key not in ['comment','pid']:87 for key,value in zip(keys,args):
87 setattr(self, key, float(value))88 setattr(self, key, float(value))
88 elif key in ['pid', 'mother1', 'mother2']:89 self.pid = int(self.pid)
89 setattr(self, key, int(value))90
90 else:91 self.comment = ' '.join(args[len(keys):])
91 self.comment = value92 if self.comment.startswith(('|','#')):
93 self.comment = self.comment[1:]
94
92 # Note that mother1/mother2 will be modified by the Event parse function to replace the95 # Note that mother1/mother2 will be modified by the Event parse function to replace the
93 # integer by a pointer to the actual particle object.96 # integer by a pointer to the actual particle object.
94 97
@@ -235,7 +238,7 @@
235 line = ''238 line = ''
236 mode = 0239 mode = 0
237 while '</event>' not in line:240 while '</event>' not in line:
238 line = super(EventFile, self).next().lower()241 line = super(EventFile, self).next()
239 if '<event' in line:242 if '<event' in line:
240 mode = 1243 mode = 1
241 text = ''244 text = ''
@@ -711,6 +714,17 @@
711 run_card = self.banner.charge_card("run_card")714 run_card = self.banner.charge_card("run_card")
712 715
713 init_information = run_card.get_banner_init_information()716 init_information = run_card.get_banner_init_information()
717 if init_information["idbmup1"] == 0:
718 event = self.next()
719 init_information["idbmup1"]= event[0].pdg
720 if init_information["idbmup2"] == 0:
721 init_information["idbmup2"]= event[1].pdg
722 self.seek(0)
723 if init_information["idbmup2"] == 0:
724 event = self.next()
725 init_information["idbmup2"] = event[1].pdg
726 self.seek(0)
727
714 init_information["nprup"] = nb_group728 init_information["nprup"] = nb_group
715 729
716 if run_card["lhe_version"] < 3:730 if run_card["lhe_version"] < 3:
@@ -877,16 +891,16 @@
877 891
878 def parse(self, text):892 def parse(self, text):
879 """Take the input file and create the structured information"""893 """Take the input file and create the structured information"""
880 text = re.sub(r'</?event>', '', text) # remove pointless tag894 #text = re.sub(r'</?event>', '', text) # remove pointless tag
881 status = 'first' 895 status = 'first'
882 for line in text.split('\n'):896 for line in text.split('\n'):
883 line = line.strip()897 line = line.strip()
884 if not line: 898 if not line:
885 continue899 continue
886 if line.startswith('#'):900 elif line[0] == '#':
887 self.comment += '%s\n' % line901 self.comment += '%s\n' % line
888 continue902 continue
889 if "<event" in line:903 elif line.startswith('<event'):
890 if '=' in line:904 if '=' in line:
891 found = re.findall(r"""(\w*)=(?:(?:['"])([^'"]*)(?=['"])|(\S*))""",line)905 found = re.findall(r"""(\w*)=(?:(?:['"])([^'"]*)(?=['"])|(\S*))""",line)
892 #for '<event line=4 value=\'3\' error="5" test=" 1 and 2">\n'906 #for '<event line=4 value=\'3\' error="5" test=" 1 and 2">\n'
@@ -895,23 +909,23 @@
895 # return {'test': ' 1 and 2', 'line': '4', 'value': '3', 'error': '5'}909 # return {'test': ' 1 and 2', 'line': '4', 'value': '3', 'error': '5'}
896 continue910 continue
897 911
898 if 'first' == status:912 elif 'first' == status:
899 if '<rwgt>' in line:913 if '<rwgt>' in line:
900 status = 'tag'914 status = 'tag'
901 915 else:
902 if 'first' == status:916 self.assign_scale_line(line)
903 self.assign_scale_line(line)917 status = 'part'
904 status = 'part' 918 continue
905 continue
906
907 if '<' in line:919 if '<' in line:
908 status = 'tag'920 status = 'tag'
909 921
910 if 'part' == status:922 if 'part' == status:
911 self.append(Particle(line, event=self))923 self.append(Particle(line, event=self))
912 else:924 else:
925 if '</event>' in line:
926 line = line.replace('</event>','',1)
913 self.tag += '%s\n' % line927 self.tag += '%s\n' % line
914928
915 self.assign_mother()929 self.assign_mother()
916 930
917 def assign_mother(self):931 def assign_mother(self):
918932
=== modified file 'madgraph/various/misc.py'
--- madgraph/various/misc.py 2016-05-18 14:36:57 +0000
+++ madgraph/various/misc.py 2016-06-24 21:04:21 +0000
@@ -308,7 +308,7 @@
308 log(msg)308 log(msg)
309 309
310310
311 if dependency in ['pjfry','golem','samurai','ninja']:311 if dependency in ['pjfry','golem','samurai','ninja','collier']:
312 if cmd.options[dependency] not in ['None',None,'']:312 if cmd.options[dependency] not in ['None',None,'']:
313 tell("Deactivating MG5_aMC dependency '%s'"%dependency)313 tell("Deactivating MG5_aMC dependency '%s'"%dependency)
314 cmd.options[dependency] = None314 cmd.options[dependency] = None
@@ -350,6 +350,13 @@
350 tell("Installing ninja...")350 tell("Installing ninja...")
351 cmd.do_install('ninja')351 cmd.do_install('ninja')
352 352
353 if dependency=='collier':
354 if cmd.options['collier'] in ['None',None,''] or\
355 (cmd.options['collier'] == 'auto' and which_lib('libcollier.a') is None) or\
356 which_lib(pjoin(cmd.options['collier'],'libcollier.a')) is None:
357 tell("Installing COLLIER...")
358 cmd.do_install('collier')
359
353#===============================================================================360#===============================================================================
354# find a library361# find a library
355#===============================================================================362#===============================================================================
356363
=== modified file 'madgraph/various/process_checks.py'
--- madgraph/various/process_checks.py 2016-04-15 11:14:25 +0000
+++ madgraph/various/process_checks.py 2016-06-24 21:04:21 +0000
@@ -613,7 +613,8 @@
613 self.mg_root, export_dir, MLoptions)613 self.mg_root, export_dir, MLoptions)
614 FortranModel = helas_call_writers.FortranUFOHelasCallWriter(model)614 FortranModel = helas_call_writers.FortranUFOHelasCallWriter(model)
615 FortranExporter.copy_v4template(modelname=model.get('name'))615 FortranExporter.copy_v4template(modelname=model.get('name'))
616 FortranExporter.generate_subprocess_directory_v4(matrix_element, FortranModel)616 FortranExporter.generate_subprocess_directory_v4(matrix_element, FortranModel, 1)
617 FortranExporter.write_global_specs(matrix_element)
617 wanted_lorentz = list(set(matrix_element.get_used_lorentz()))618 wanted_lorentz = list(set(matrix_element.get_used_lorentz()))
618 wanted_couplings = list(set([c for l in matrix_element.get_used_couplings() \619 wanted_couplings = list(set([c for l in matrix_element.get_used_couplings() \
619 for c in l]))620 for c in l]))
@@ -1155,7 +1156,8 @@
1155 FortranExporter = exporter_class(self.mg_root, export_dir, MLoptions)1156 FortranExporter = exporter_class(self.mg_root, export_dir, MLoptions)
1156 FortranModel = helas_call_writers.FortranUFOHelasCallWriter(model)1157 FortranModel = helas_call_writers.FortranUFOHelasCallWriter(model)
1157 FortranExporter.copy_v4template(modelname=model.get('name'))1158 FortranExporter.copy_v4template(modelname=model.get('name'))
1158 FortranExporter.generate_subprocess_directory_v4(matrix_element, FortranModel)1159 FortranExporter.generate_subprocess_directory_v4(matrix_element, FortranModel, 1)
1160 FortranExporter.write_global_specs(matrix_element)
1159 wanted_lorentz = list(set(matrix_element.get_used_lorentz()))1161 wanted_lorentz = list(set(matrix_element.get_used_lorentz()))
1160 wanted_couplings = list(set([c for l in matrix_element.get_used_couplings() \1162 wanted_couplings = list(set([c for l in matrix_element.get_used_couplings() \
1161 for c in l]))1163 for c in l]))
@@ -1470,8 +1472,8 @@
1470 tools=list(set(tools)) # remove the duplication ones1472 tools=list(set(tools)) # remove the duplication ones
1471 1473
1472 # not self-contained tir libraries1474 # not self-contained tir libraries
1473 tool_var={'pjfry':2,'golem':4,'samurai':5,'ninja':6}1475 tool_var={'pjfry':2,'golem':4,'samurai':5,'ninja':6,'collier':7}
1474 for tool in ['pjfry','golem','samurai','ninja']:1476 for tool in ['pjfry','golem','samurai','ninja','collier']:
1475 tool_dir='%s_dir'%tool1477 tool_dir='%s_dir'%tool
1476 if not tool_dir in self.tir_dir:1478 if not tool_dir in self.tir_dir:
1477 continue1479 continue
@@ -1493,8 +1495,8 @@
1493 export_dir=pjoin(self.mg_root,("SAVED" if keep_folder else "")+\1495 export_dir=pjoin(self.mg_root,("SAVED" if keep_folder else "")+\
1494 temp_dir_prefix+"_%s"%proc_name)1496 temp_dir_prefix+"_%s"%proc_name)
1495 1497
1496 tools_name={1:'CutTools',2:'PJFry++',3:'IREGI',4:'Golem95',5:'Samurai',1498 tools_name=bannermod.MadLoopParam._ID_reduction_tool_map
1497 6:'Ninja'}1499
1498 return_dict={}1500 return_dict={}
1499 return_dict['Stability']={}1501 return_dict['Stability']={}
1500 infos_save={'Process_output': None,1502 infos_save={'Process_output': None,
@@ -1517,7 +1519,7 @@
1517 # The exceptional PS points are those which stay unstable in quad prec.1519 # The exceptional PS points are those which stay unstable in quad prec.
1518 Exceptional_PS_points = []1520 Exceptional_PS_points = []
1519 1521
1520 MLoptions={}1522 MLoptions=MLOptions
1521 MLoptions["MLReductionLib"]=tool1523 MLoptions["MLReductionLib"]=tool
1522 clean = (tool==tools[0]) and not nPoints==01524 clean = (tool==tools[0]) and not nPoints==0
1523 if infos_IN==None or (tool_name not in infos_IN):1525 if infos_IN==None or (tool_name not in infos_IN):
@@ -1606,7 +1608,7 @@
1606 str(datetime.timedelta(seconds=sec_needed)),\1608 str(datetime.timedelta(seconds=sec_needed)),\
1607 datetime.datetime.now().strftime("%d-%m-%Y %H:%M")))1609 datetime.datetime.now().strftime("%d-%m-%Y %H:%M")))
1608 if logger.getEffectiveLevel()<logging.WARNING and \1610 if logger.getEffectiveLevel()<logging.WARNING and \
1609 (sec_needed>5 or (reusing and infos['Initialization'] == None)):1611 (sec_needed>5 or infos['Initialization'] == None):
1610 widgets = ['Stability check:', pbar.Percentage(), ' ', 1612 widgets = ['Stability check:', pbar.Percentage(), ' ',
1611 pbar.Bar(),' ', pbar.ETA(), ' ']1613 pbar.Bar(),' ', pbar.ETA(), ' ']
1612 progress_bar = pbar.ProgressBar(widgets=widgets, maxval=nPoints, 1614 progress_bar = pbar.ProgressBar(widgets=widgets, maxval=nPoints,
@@ -2125,8 +2127,10 @@
21252127
2126 timing2 = myProfiler.time_matrix_element(matrix_element, reusing, 2128 timing2 = myProfiler.time_matrix_element(matrix_element, reusing,
2127 param_card, keep_folder=keep_folder,options=options,2129 param_card, keep_folder=keep_folder,options=options,
2128 MLOptions = MLoptions)2130 MLOptions = MLoptions)
2129 2131
2132 timing2['reduction_tool'] = MLoptions['MLReductionLib'][0]
2133
2130 if timing2 == None:2134 if timing2 == None:
2131 return None, None2135 return None, None
21322136
@@ -2172,6 +2176,22 @@
2172 MLoptions = {}2176 MLoptions = {}
2173 else:2177 else:
2174 MLoptions = MLOptions2178 MLoptions = MLOptions
2179 # Make sure that the poles computation is disabled for COLLIER
2180 if 'COLLIERComputeUVpoles' not in MLoptions:
2181 MLoptions['COLLIERComputeUVpoles']=False
2182 if 'COLLIERComputeIRpoles' not in MLoptions:
2183 MLoptions['COLLIERComputeIRpoles']=False
2184 # Use high required accuracy in COLLIER's requirement if not specified
2185 if 'COLLIERRequiredAccuracy' not in MLoptions:
2186 MLoptions['COLLIERRequiredAccuracy']=1e-13
2187 # Use loop-direction switching as stability test if not specifed (more reliable)
2188 if 'COLLIERUseInternalStabilityTest' not in MLoptions:
2189 MLoptions['COLLIERUseInternalStabilityTest']=False
2190 # Finally we *must* forbid the use of COLLIER global cache here, because it
2191 # does not work with the way we call independently CTMODERun 1 and 2
2192 # with the StabilityChecker.
2193 MLoptions['COLLIERGlobalCache'] = 0
2194
2175 if "MLReductionLib" not in MLOptions:2195 if "MLReductionLib" not in MLOptions:
2176 MLoptions["MLReductionLib"] = []2196 MLoptions["MLReductionLib"] = []
2177 if cuttools:2197 if cuttools:
@@ -2186,6 +2206,8 @@
2186 MLoptions["MLReductionLib"].extend([5])2206 MLoptions["MLReductionLib"].extend([5])
2187 if "ninja_dir" in tir:2207 if "ninja_dir" in tir:
2188 MLoptions["MLReductionLib"].extend([6])2208 MLoptions["MLReductionLib"].extend([6])
2209 if "collier_dir" in tir:
2210 MLoptions["MLReductionLib"].extend([7])
21892211
2190 stability = myStabilityChecker.check_matrix_element_stability(matrix_element, 2212 stability = myStabilityChecker.check_matrix_element_stability(matrix_element,
2191 options=options,param_card=param_card, 2213 options=options,param_card=param_card,
@@ -2223,6 +2245,19 @@
2223 MLoptions = {}2245 MLoptions = {}
2224 else:2246 else:
2225 MLoptions = MLOptions2247 MLoptions = MLOptions
2248 # Make sure that the poles computation is disabled for COLLIER
2249 if 'COLLIERComputeUVpoles' not in MLoptions:
2250 MLoptions['COLLIERComputeUVpoles']=False
2251 if 'COLLIERComputeIRpoles' not in MLoptions:
2252 MLoptions['COLLIERComputeIRpoles']=False
2253 # And the COLLIER global cache is active, if not specified
2254 if 'COLLIERGlobalCache' not in MLoptions:
2255 MLoptions['COLLIERGlobalCache']=-1
2256 # And time NINJA by default if not specified:
2257 if 'MLReductionLib' not in MLoptions or \
2258 len(MLoptions['MLReductionLib'])==0:
2259 MLoptions['MLReductionLib'] = [6]
2260
2226 timing2 = myTimer.time_matrix_element(matrix_element, reusing, param_card,2261 timing2 = myTimer.time_matrix_element(matrix_element, reusing, param_card,
2227 keep_folder = keep_folder, options=options,2262 keep_folder = keep_folder, options=options,
2228 MLOptions = MLoptions)2263 MLOptions = MLoptions)
@@ -2233,6 +2268,7 @@
2233 # Return the merged two dictionaries2268 # Return the merged two dictionaries
2234 res = dict(timing1.items()+timing2.items())2269 res = dict(timing1.items()+timing2.items())
2235 res['loop_optimized_output']=myTimer.loop_optimized_output2270 res['loop_optimized_output']=myTimer.loop_optimized_output
2271 res['reduction_tool'] = MLoptions['MLReductionLib'][0]
2236 return res2272 return res
22372273
2238#===============================================================================2274#===============================================================================
@@ -2678,7 +2714,8 @@
2678 # Use nicer name for the XML tag in the log file2714 # Use nicer name for the XML tag in the log file
2679 xml_toolname = {'GOLEM95':'GOLEM','IREGI':'IREGI',2715 xml_toolname = {'GOLEM95':'GOLEM','IREGI':'IREGI',
2680 'CUTTOOLS':'CUTTOOLS','PJFRY++':'PJFRY',2716 'CUTTOOLS':'CUTTOOLS','PJFRY++':'PJFRY',
2681 'NINJA':'NINJA','SAMURAI':'SAMURAI'}[toolname.upper()]2717 'NINJA':'NINJA','SAMURAI':'SAMURAI',
2718 'COLLIER':'COLLIER'}[toolname.upper()]
2682 if len(UPS)>0:2719 if len(UPS)>0:
2683 res_str_i = "\nDetails of the %d/%d UPS encountered by %s\n"\2720 res_str_i = "\nDetails of the %d/%d UPS encountered by %s\n"\
2684 %(len(UPS),nPS,toolname)2721 %(len(UPS),nPS,toolname)
@@ -2819,7 +2856,7 @@
28192856
2820 try:2857 try:
2821 import matplotlib.pyplot as plt2858 import matplotlib.pyplot as plt
2822 colorlist=['b','r','g','y','m','c']2859 colorlist=['b','r','g','y','m','c','k']
2823 for i,key in enumerate(data_plot_dict.keys()):2860 for i,key in enumerate(data_plot_dict.keys()):
2824 color=colorlist[i]2861 color=colorlist[i]
2825 data_plot=data_plot_dict[key]2862 data_plot=data_plot_dict[key]
@@ -2860,6 +2897,8 @@
2860 # Define shortcut2897 # Define shortcut
2861 f = format_output2898 f = format_output
2862 loop_optimized_output = timings['loop_optimized_output']2899 loop_optimized_output = timings['loop_optimized_output']
2900 reduction_tool = bannermod.MadLoopParam._ID_reduction_tool_map[
2901 timings['reduction_tool']]
2863 2902
2864 res_str = "%s \n"%process.nice_string()2903 res_str = "%s \n"%process.nice_string()
2865 try:2904 try:
@@ -2885,6 +2924,7 @@
2885 res_str += "|= Initialization............ %s\n"\2924 res_str += "|= Initialization............ %s\n"\
2886 %f(timings['Initialization'],'%.3gs')2925 %f(timings['Initialization'],'%.3gs')
28872926
2927 res_str += "\n= Reduction tool tested...... %s\n"%reduction_tool
2888 res_str += "\n= Helicity sum time / PSpoint ========== %.3gms\n"\2928 res_str += "\n= Helicity sum time / PSpoint ========== %.3gms\n"\
2889 %(timings['run_unpolarized_total']*1000.0)2929 %(timings['run_unpolarized_total']*1000.0)
2890 if loop_optimized_output:2930 if loop_optimized_output:
@@ -2894,7 +2934,7 @@
2894 total=coef_time+loop_time2934 total=coef_time+loop_time
2895 res_str += "|= Coefs. computation time... %.3gms (%d%%)\n"\2935 res_str += "|= Coefs. computation time... %.3gms (%d%%)\n"\
2896 %(coef_time,int(round(100.0*coef_time/total)))2936 %(coef_time,int(round(100.0*coef_time/total)))
2897 res_str += "|= Loop evaluation (OPP) time %.3gms (%d%%)\n"\2937 res_str += "|= Loop evaluation time...... %.3gms (%d%%)\n"\
2898 %(loop_time,int(round(100.0*loop_time/total)))2938 %(loop_time,int(round(100.0*loop_time/total)))
2899 res_str += "\n= One helicity time / PSpoint ========== %.3gms\n"\2939 res_str += "\n= One helicity time / PSpoint ========== %.3gms\n"\
2900 %(timings['run_polarized_total']*1000.0)2940 %(timings['run_polarized_total']*1000.0)
@@ -2905,7 +2945,7 @@
2905 total=coef_time+loop_time 2945 total=coef_time+loop_time
2906 res_str += "|= Coefs. computation time... %.3gms (%d%%)\n"\2946 res_str += "|= Coefs. computation time... %.3gms (%d%%)\n"\
2907 %(coef_time,int(round(100.0*coef_time/total)))2947 %(coef_time,int(round(100.0*coef_time/total)))
2908 res_str += "|= Loop evaluation (OPP) time %.3gms (%d%%)\n"\2948 res_str += "|= Loop evaluation time...... %.3gms (%d%%)\n"\
2909 %(loop_time,int(round(100.0*loop_time/total)))2949 %(loop_time,int(round(100.0*loop_time/total)))
2910 res_str += "\n= Miscellaneous ========================\n"2950 res_str += "\n= Miscellaneous ========================\n"
2911 res_str += "|= Number of hel. computed... %s/%s\n"\2951 res_str += "|= Number of hel. computed... %s/%s\n"\
29122952
=== modified file 'madgraph/various/q_polynomial.py'
--- madgraph/various/q_polynomial.py 2016-06-09 00:59:23 +0000
+++ madgraph/various/q_polynomial.py 2016-06-24 21:04:21 +0000
@@ -362,6 +362,20 @@
362 362
363 return '\n'.join(lines)363 return '\n'.join(lines)
364 364
365 def get_COLLIER_mapping(self):
366 """ Returns a list of tuples of the form:
367 [ (COLLIER_ind0, COLLIER_ind1, COLLIER_ind2, COLLIER_ind3), ]
368 where the position in the list is the coef_ID in MadLoop ordering.
369 """
370 res = []
371 for coef_pos in range(0,get_number_of_coefs_for_rank(self.pq.rank)):
372 indices_list = self.pq.get_coef_at_position(coef_pos)
373 res.append((indices_list.count(0),
374 indices_list.count(1),
375 indices_list.count(2),
376 indices_list.count(3)))
377 return res
378
365 def write_golem95_mapping(self):379 def write_golem95_mapping(self):
366 """ Returns a fortran subroutine which fills in the array of tensorial380 """ Returns a fortran subroutine which fills in the array of tensorial
367 coefficients following golem95 standards using MadLoop coefficients."""381 coefficients following golem95 standards using MadLoop coefficients."""
368382
=== modified file 'tests/IOTests.py'
--- tests/IOTests.py 2015-10-01 16:00:08 +0000
+++ tests/IOTests.py 2016-06-24 21:04:21 +0000
@@ -155,7 +155,7 @@
155 myloopamp,optimized_output=isOptimized)155 myloopamp,optimized_output=isOptimized)
156156
157 self.exporter.copy_v4template(model.get('name'))157 self.exporter.copy_v4template(model.get('name'))
158 self.exporter.generate_loop_subprocess(hel_amp, self.helasModel)158 self.exporter.generate_loop_subprocess(hel_amp, self.helasModel,unique_id=1)
159 wanted_lorentz = hel_amp.get_used_lorentz()159 wanted_lorentz = hel_amp.get_used_lorentz()
160 wanted_couplings = list(set(sum(hel_amp.get_used_couplings(),[])))160 wanted_couplings = list(set(sum(hel_amp.get_used_couplings(),[])))
161 self.exporter.convert_model_to_mg4(model,wanted_lorentz,wanted_couplings)161 self.exporter.convert_model_to_mg4(model,wanted_lorentz,wanted_couplings)
162162
=== modified file 'tests/acceptance_tests/test_cmd.py'
--- tests/acceptance_tests/test_cmd.py 2016-05-11 21:07:38 +0000
+++ tests/acceptance_tests/test_cmd.py 2016-06-24 21:04:21 +0000
@@ -189,6 +189,7 @@
189 'f2py_compiler':None,189 'f2py_compiler':None,
190 'cluster_retry_wait': 300,190 'cluster_retry_wait': 300,
191 'syscalc_path':'./SysCalc',191 'syscalc_path':'./SysCalc',
192 'collier':'auto',
192 'hepmc_path': './hepmc',193 'hepmc_path': './hepmc',
193 'hwpp_path': './herwigPP',194 'hwpp_path': './herwigPP',
194 'thepeg_path': './thepeg',195 'thepeg_path': './thepeg',
195196
=== modified file 'tests/acceptance_tests/test_histograms.py'
--- tests/acceptance_tests/test_histograms.py 2016-06-09 00:59:23 +0000
+++ tests/acceptance_tests/test_histograms.py 2016-06-24 21:04:21 +0000
@@ -47,6 +47,5 @@
47 histo_list.output(pjoin('%s','HistoOut'), format = 'gnuplot');47 histo_list.output(pjoin('%s','HistoOut'), format = 'gnuplot');
48 ''' % (sys.path, _file_path, self.IOpath)48 ''' % (sys.path, _file_path, self.IOpath)
4949
50 import os
51 os.system('echo "%s" | python' % line) 50 os.system('echo "%s" | python' % line)
5251
5352
=== added file 'tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%COLLIER_interface.f'
--- tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%COLLIER_interface.f 1970-01-01 00:00:00 +0000
+++ tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%COLLIER_interface.f 2016-06-24 21:04:21 +0000
@@ -0,0 +1,693 @@
1 SUBROUTINE COLLIERLOOP(CTMODE, NLOOPLINE,RANK,PL,PDEN,M2L
2 $ ,TIRCOEFS)
3C
4C Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
5C By the MadGraph5_aMC@NLO Development Team
6C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
7C
8C Interface between MG5 and COLLIER.
9C It supports any rank when 1 < NLOOPLINE < 7.
10C
11C Process: d~ u > w+ WEIGHTED<=2 QED<=1 [ all = QCD ]
12C Process: s~ c > w+ WEIGHTED<=2 QED<=1 [ all = QCD ]
13C
14C
15C MODULES
16C
17 USE COLLIER
18 IMPLICIT NONE
19C
20C CONSTANTS
21C
22 LOGICAL CHECKPCONSERVATION
23 PARAMETER (CHECKPCONSERVATION=.TRUE.)
24 REAL*8 PI
25 PARAMETER(PI=3.14159265358979323846D0)
26 INTEGER MAXRANK
27 PARAMETER (MAXRANK=2)
28 INTEGER NLOOPGROUPS
29 PARAMETER (NLOOPGROUPS=1)
30 INCLUDE 'loop_max_coefs.inc'
31C
32C ARGUMENTS
33C
34 INTEGER NLOOPLINE, RANK, CTMODE
35 REAL*8 PL(0:3,NLOOPLINE)
36 REAL*8 PDEN(0:3,NLOOPLINE-1)
37 COMPLEX*16 M2L(NLOOPLINE)
38 COMPLEX*16 RES(3)
39 COMPLEX*16 TIRCOEFS(0:LOOPMAXCOEFS-1,3)
40C
41C LOCAL VARIABLES
42C
43 INTEGER N, I, J, K, L
44 INTEGER C0,C1,C2,C3
45 INTEGER N_CACHES
46 INTEGER CURR_RANK, SGN
47 INTEGER CURR_INDEX
48 INTEGER CURR_MAXCOEF
49 REAL*8 RBUFF(0:3)
50
51 INTEGER COEFMAP_ZERO(0:LOOPMAXCOEFS-1)
52 INTEGER COEFMAP_ONE(0:LOOPMAXCOEFS-1)
53 INTEGER COEFMAP_TWO(0:LOOPMAXCOEFS-1)
54 INTEGER COEFMAP_THREE(0:LOOPMAXCOEFS-1)
55 DATA (COEFMAP_ZERO(I),I= 0, 9) / 0, 1, 0, 0, 0, 2, 1, 0, 1, 0/
56 DATA (COEFMAP_ZERO(I),I= 10, 14) / 0, 1, 0, 0, 0/
57 DATA (COEFMAP_ONE(I),I= 0, 9) / 0, 0, 1, 0, 0, 0, 1, 2, 0, 1/
58 DATA (COEFMAP_ONE(I),I= 10, 14) / 0, 0, 1, 0, 0/
59 DATA (COEFMAP_TWO(I),I= 0, 9) / 0, 0, 0, 1, 0, 0, 0, 0, 1, 1/
60 DATA (COEFMAP_TWO(I),I= 10, 14) / 2, 0, 0, 1, 0/
61 DATA (COEFMAP_THREE(I),I= 0, 9) / 0, 0, 0, 0, 1, 0, 0, 0, 0, 0/
62 DATA (COEFMAP_THREE(I),I= 10, 14) / 0, 1, 1, 1, 2/
63
64 REAL*8 REF_NORMALIZATION
65
66 DOUBLE COMPLEX M2LCOLLIER(0:NLOOPLINE-1)
67 DOUBLE COMPLEX MOMVEC(0:3,NLOOPLINE-1)
68 DOUBLE COMPLEX MOMINV((NLOOPLINE*(NLOOPLINE-1))/2)
69
70 DOUBLE COMPLEX TNTEN(0:RANK,0:RANK,0:RANK,0:RANK)
71 DOUBLE COMPLEX TNTENUV(0:RANK,0:RANK,0:RANK,0:RANK)
72 DOUBLE PRECISION TNTENERR(0:RANK)
73
74C These quantities are for the pole evaluation
75 DOUBLE COMPLEX TNTEN_UV(0:RANK,0:RANK,0:RANK,0:RANK)
76 DOUBLE COMPLEX TNTENUV_UV(0:RANK,0:RANK,0:RANK,0:RANK)
77 DOUBLE PRECISION TNTENERR_UV(0:RANK)
78 DOUBLE COMPLEX TNTEN_IR1(0:RANK,0:RANK,0:RANK,0:RANK)
79 DOUBLE COMPLEX TNTENUV_IR1(0:RANK,0:RANK,0:RANK,0:RANK)
80 DOUBLE PRECISION TNTENERR_IR1(0:RANK)
81 DOUBLE COMPLEX TNTEN_IR2(0:RANK,0:RANK,0:RANK,0:RANK)
82 DOUBLE COMPLEX TNTENUV_IR2(0:RANK,0:RANK,0:RANK,0:RANK)
83 DOUBLE PRECISION TNTENERR_IR2(0:RANK)
84C
85C GLOBAL VARIABLES
86C
87 INCLUDE 'coupl.inc'
88 INCLUDE 'MadLoopParams.inc'
89 INCLUDE 'unique_id.inc'
90 INCLUDE 'global_specs.inc'
91
92 INTEGER ID,SQSOINDEX,R
93 COMMON/LOOP/ID,SQSOINDEX,R
94
95C
96C These global variables cache the coefficients already computed
97C by COLLIER
98C so that they can be reused. In particular, in CTMODE 2, the
99C cached ERROR
100C quantities for eahc rank will be used to make use of COLLIER's
101C internal
102C assessment of the numerical accuracy.
103C
104 LOGICAL LOOP_ID_DONE(NLOOPGROUPS)
105 DATA LOOP_ID_DONE/NLOOPGROUPS*.FALSE./
106 COMPLEX*16 TIR_COEFS_DIRECT_MODE(0:LOOPMAXCOEFS-1,3,NLOOPGROUPS)
107 REAL*8 TIR_COEFS_ERROR(0:MAXRANK,NLOOPGROUPS)
108 COMMON/COLLIER_TIR_COEFS/TIR_COEFS_DIRECT_MODE,TIR_COEFS_ERROR
109 $ ,LOOP_ID_DONE
110
111 INTEGER COLLIER_CACHE_ACTIVE, NCALLS_IN_CACHE(4),
112 $ NCOLLIERCALLS(4)
113 LOGICAL MUST_INIT_EVENT
114 COMMON/COLLIER_CACHE_STATUS/COLLIER_CACHE_ACTIVE,NCALLS_IN_CACHE
115 $ , NCOLLIERCALLS,MUST_INIT_EVENT
116
117 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT,
118 $ COLLIERINIT
119 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT,GOLEMINIT,SAMURAIINIT
120 $ ,NINJAINIT, COLLIERINIT
121
122C ----------
123C BEGIN CODE
124C ----------
125
126 IF (COLLIERUSECACHEFORPOLES) THEN
127 N_CACHES = 4
128 ELSE
129 N_CACHES =1
130 ENDIF
131
132C Initialize COLLIER if needed
133 IF (COLLIERINIT) THEN
134 COLLIERINIT=.FALSE.
135 CALL INITCOLLIER()
136 ENDIF
137
138C Initialize the event if it is the first time collier is called
139C on this PS point
140 IF(MUST_INIT_EVENT) THEN
141 MUST_INIT_EVENT = .FALSE.
142 IF (COLLIERGLOBALCACHE.EQ.0) THEN
143 CALL INITEVENT_CLL()
144 ELSE
145 DO I=1,N_CACHES
146C Record how many events where put in the cache. On the
147C first PS point.
148 IF (NCALLS_IN_CACHE(I).EQ.-1.AND.NCOLLIERCALLS(I).GT.0)
149 $ THEN
150 NCALLS_IN_CACHE(I) = NCOLLIERCALLS(I)
151 ENDIF
152 ENDDO
153 DO I=1,N_CACHES
154C Now apply a safety check that our last event had as many
155C calls as the cache is setup for.
156C The only case for now when it can be half of the calls
157C when we are doing the true loop-direction test with also
158C the computation of a rotated PS point (which is computed
159C for one mode only).
160 IF (NCALLS_IN_CACHE(I).NE.-1.AND..NOT. ( NCOLLIERCALLS(I)
161 $ .EQ.NCALLS_IN_CACHE(I).OR. ( CTMODERUN.EQ.
162 $ -1.AND..NOT.COLLIERUSEINTERNALSTABILITYTEST.AND.NROTATIONS
163 $_DP.GT.0.AND.MOD(NCALLS_IN_CACHE(I),2).EQ.0.AND.(NCALLS_IN_CACHE(
164 $I)/2).EQ.NCOLLIERCALLS(I) ) ) ) THEN
165 WRITE(*,*) 'WARNING: A consistency check in MadLoop'
166 $ //' failed and, for safety, forced MadLoop to'
167 $ //' reinitialize the global cache of COLLIER. Report'
168 $ //' this to MadLoop authors. The problematic cache was'
169 $ //' number ',I
170 IF (COLLIERGLOBALCACHE.EQ.-1) THEN
171 CALL INITCACHESYSTEM_CLL(N_CACHES*NPROCS,MAXNEXTERNAL)
172 ELSE
173 CALL INITCACHESYSTEM_CLL(N_CACHES*NPROCS
174 $ ,COLLIERGLOBALCACHE)
175 ENDIF
176C Make sure all caches are switched off at first.
177 CALL SWITCHOFFCACHESYSTEM_CLL()
178C Reset the cache design property
179 NCALLS_IN_CACHE(:) = -1
180 NCOLLIERCALLS(:) = 0
181 IF (COLLIER_CACHE_ACTIVE.EQ.1) THEN
182 CALL SWITCHONCACHE_CLL((UNIQUE_ID-1)*N_CACHES+1)
183 ENDIF
184C No need to check the other caches since we already had
185C to reset here.
186 EXIT
187 ENDIF
188 ENDDO
189 CALL INITEVENT_CLL((UNIQUE_ID-1)*N_CACHES+1)
190 NCOLLIERCALLS(1) = 0
191 IF(COLLIERCOMPUTEUVPOLES.AND.COLLIERUSECACHEFORPOLES) THEN
192 CALL INITEVENT_CLL((UNIQUE_ID-1)*N_CACHES+2)
193 NCOLLIERCALLS(2) = 0
194 ENDIF
195 IF(COLLIERCOMPUTEIRPOLES.AND.COLLIERUSECACHEFORPOLES) THEN
196 CALL INITEVENT_CLL((UNIQUE_ID-1)*N_CACHES+3)
197 NCOLLIERCALLS(3) = 0
198 CALL INITEVENT_CLL((UNIQUE_ID-1)*N_CACHES+4)
199 NCOLLIERCALLS(4) = 0
200 ENDIF
201 ENDIF
202 CALL SETDELTAIR_CLL(0.0D0,(PI**2)/6.0D0)
203 CALL SETDELTAUV_CLL(0.0D0)
204 CALL SETMUIR2_CLL(MU_R**2)
205 CALL SETMUUV2_CLL(MU_R**2)
206 ENDIF
207
208C Now really start the reduction with COLLIER
209
210C Number of coefficients for the current rank
211 CURR_MAXCOEF = 0
212 DO I=0,RANK
213 CURR_MAXCOEF=CURR_MAXCOEF+(3+I)*(2+I)*(1+I)/6
214 ENDDO
215
216 IF (CTMODE.NE.1.AND.CTMODE.NE.2) THEN
217 WRITE(*,*) 'ERROR: COLLIER only support the computational mode'
218 $ //' CTMODE equal to 1 or 2, not',CTMODE
219 STOP 'Incorrect computational mode specified to the COLLIER'
220 $ //' MG5aMC interface.'
221 ENDIF
222
223 IF (COLLIERUSEINTERNALSTABILITYTEST) THEN
224C Use MADLOOP internal cache dedicated to COLLIER that emulates
225C the CTMODE 2
226C by using coefficients shifted by COLLIER internal error
227C estimate.
228 IF (CTMODE.EQ.1) THEN
229 IF (LOOP_ID_DONE(ID)) THEN
230 DO I=0,CURR_MAXCOEF-1
231 DO K=1,3
232 TIRCOEFS(I,K)=TIR_COEFS_DIRECT_MODE(I,K,ID)
233 ENDDO
234 ENDDO
235 RETURN
236 ENDIF
237 ELSEIF (CTMODE.EQ.2) THEN
238 IF (LOOP_ID_DONE(ID)) THEN
239 DO I=0,CURR_MAXCOEF-1
240 CURR_RANK = COEFMAP_ZERO(I)+COEFMAP_ONE(I)+COEFMAP_TWO(I)
241 $ +COEFMAP_THREE(I)
242 DO K=1,3
243 TIRCOEFS(I,K)=TIR_COEFS_DIRECT_MODE(I,K,ID)*(1.0D0
244 $ +TIR_COEFS_ERROR(CURR_RANK,ID))
245 ENDDO
246 ENDDO
247 RETURN
248 ENDIF
249 ENDIF
250 ELSE
251C Apply the loop-direction switching here.
252 CALL SWITCH_ORDER(CTMODE,NLOOPLINE,PL,PDEN,M2L)
253 ENDIF
254
255C Make sure masses are complex
256 DO I=1,NLOOPLINE
257 M2LCOLLIER(I-1)=DCMPLX(M2L(I))
258 ENDDO
259
260C Now convert the loop offset momenta to COLLIER conventions
261 DO I=0,3
262 DO J=1,NLOOPLINE-1
263 MOMVEC(I,J)=DCMPLX(PDEN(I,J),0.0D0)
264 ENDDO
265 ENDDO
266
267C This first do loop spans over 'N' in '\foreach_N'
268C //' \foreach_i(k_i+k_{i+1}+..+k_{i+N})^2'
269 CURR_INDEX = 0
270 DO N=0,NLOOPLINE-1
271C We stop whenever we reached the target number of invariants
272 IF (CURR_INDEX.GE.((NLOOPLINE*(NLOOPLINE-1))/2)) THEN
273 EXIT
274 ENDIF
275C This do loop spans over 'i' in the expression above.
276 DO I=1,NLOOPLINE
277 IF (CURR_INDEX.GE.((NLOOPLINE*(NLOOPLINE-1))/2)) THEN
278 EXIT
279 ENDIF
280
281 CURR_INDEX = CURR_INDEX+1
282 RBUFF(:) = 0.0D0
283 DO J=I,I+N
284 RBUFF(:) = RBUFF(:) + PL(:,MOD(J-1,NLOOPLINE)+1)
285 ENDDO
286 MOMINV(CURR_INDEX) = DCMPLX(RBUFF(0)**2-RBUFF(1)**2-RBUFF(2)
287 $ **2-RBUFF(3)**2,0.0D0)
288
289C Now regularize the onshell behavior of the kinematic
290C invarients
291C All loop masses are tested, but that might be a bit too
292C inclusive.
293 DO K=1,NLOOPLINE
294 IF(ABS(M2L(K)).NE.0.0D0) THEN
295 IF(ABS((MOMINV(CURR_INDEX)-M2L(K))/M2L(K)).LT.OSTHRES)
296 $ THEN
297 MOMINV(CURR_INDEX)=DCMPLX(M2L(K))
298 ENDIF
299 ENDIF
300 ENDDO
301C For the massless onshell-case, we base the threshold only on
302C the energy component
303 REF_NORMALIZATION=0.0D0
304 DO L=0,0
305 REF_NORMALIZATION = REF_NORMALIZATION + ABS(RBUFF(L))
306 ENDDO
307 REF_NORMALIZATION = (REF_NORMALIZATION/(N+1))**2
308 IF(REF_NORMALIZATION.NE.0.0D0)THEN
309 IF(ABS(MOMINV(CURR_INDEX)/REF_NORMALIZATION).LT.OSTHRES)
310 $ THEN
311 MOMINV(CURR_INDEX)=DCMPLX(0.0D0,0.0D0)
312 ENDIF
313 ENDIF
314
315 ENDDO
316 ENDDO
317
318C We can now call COLLIER
319 IF (NLOOPLINE.NE.1) THEN
320 CALL TNTEN_CLL(TNTEN, TNTENUV, MOMVEC, MOMINV, M2LCOLLIER,
321 $ NLOOPLINE, RANK, TNTENERR)
322 ELSE
323 CALL TNTEN_CLL(TNTEN, TNTENUV, M2LCOLLIER, NLOOPLINE, RANK,
324 $ TNTENERR)
325 ENDIF
326 IF (COLLIER_CACHE_ACTIVE.EQ.1) THEN
327 NCOLLIERCALLS(1) = NCOLLIERCALLS(1)+1
328 ENDIF
329
330C Now compute the UV poles if asked for
331 IF (COLLIERCOMPUTEUVPOLES) THEN
332 IF(COLLIER_CACHE_ACTIVE.EQ.1) THEN
333 CALL SWITCHOFFCACHE_CLL((UNIQUE_ID-1)*N_CACHES+1)
334 IF(COLLIERUSECACHEFORPOLES) THEN
335 CALL SWITCHONCACHE_CLL((UNIQUE_ID-1)*N_CACHES+2)
336 ENDIF
337 ENDIF
338 CALL SETDELTAUV_CLL(1.0D0)
339 IF (NLOOPLINE.NE.1) THEN
340 CALL TNTEN_CLL(TNTEN_UV, TNTENUV_UV, MOMVEC, MOMINV,
341 $ M2LCOLLIER, NLOOPLINE, RANK, TNTENERR_UV)
342 ELSE
343 CALL TNTEN_CLL(TNTEN_UV, TNTENUV_UV, M2LCOLLIER, NLOOPLINE,
344 $ RANK, TNTENERR_UV)
345 ENDIF
346 IF (COLLIER_CACHE_ACTIVE.EQ.1) THEN
347 NCOLLIERCALLS(2) = NCOLLIERCALLS(2)+1
348 ENDIF
349 IF(COLLIER_CACHE_ACTIVE.EQ.1) THEN
350 IF(COLLIERUSECACHEFORPOLES) THEN
351 CALL SWITCHOFFCACHE_CLL((UNIQUE_ID-1)*N_CACHES+2)
352 ENDIF
353 CALL SWITCHONCACHE_CLL((UNIQUE_ID-1)*N_CACHES+1)
354 ENDIF
355 CALL SETDELTAUV_CLL(0.0D0)
356 ENDIF
357
358C Now compute the IR poles if asked for
359 IF (COLLIERCOMPUTEIRPOLES) THEN
360 IF(COLLIER_CACHE_ACTIVE.EQ.1) THEN
361 CALL SWITCHOFFCACHE_CLL((UNIQUE_ID-1)*N_CACHES+1)
362 IF(COLLIERUSECACHEFORPOLES) THEN
363 CALL SWITCHONCACHE_CLL((UNIQUE_ID-1)*N_CACHES+3)
364 ENDIF
365 ENDIF
366 CALL SETDELTAIR_CLL(1.0D0,(PI**2)/6.0D0)
367 IF (NLOOPLINE.NE.1) THEN
368 CALL TNTEN_CLL(TNTEN_IR1, TNTENUV_IR1, MOMVEC, MOMINV,
369 $ M2LCOLLIER, NLOOPLINE, RANK, TNTENERR_IR1)
370 ELSE
371 CALL TNTEN_CLL(TNTEN_IR1, TNTENUV_IR1, M2LCOLLIER, NLOOPLINE
372 $ , RANK, TNTENERR_IR1)
373 ENDIF
374 IF (COLLIER_CACHE_ACTIVE.EQ.1) THEN
375 NCOLLIERCALLS(3) = NCOLLIERCALLS(3)+1
376 ENDIF
377 IF(COLLIER_CACHE_ACTIVE.EQ.1.AND.COLLIERUSECACHEFORPOLES) THEN
378 CALL SWITCHOFFCACHE_CLL((UNIQUE_ID-1)*N_CACHES+3)
379 CALL SWITCHONCACHE_CLL((UNIQUE_ID-1)*N_CACHES+4)
380 ENDIF
381 CALL SETDELTAIR_CLL(0.0D0,1.0D0+(PI**2)/6.0D0)
382 IF (NLOOPLINE.NE.1) THEN
383 CALL TNTEN_CLL(TNTEN_IR2, TNTENUV_IR2, MOMVEC, MOMINV,
384 $ M2LCOLLIER, NLOOPLINE, RANK, TNTENERR_IR2)
385 ELSE
386 CALL TNTEN_CLL(TNTEN_IR2, TNTENUV_IR2, M2LCOLLIER, NLOOPLINE
387 $ , RANK, TNTENERR_IR2)
388 ENDIF
389 IF (COLLIER_CACHE_ACTIVE.EQ.1) THEN
390 NCOLLIERCALLS(4) = NCOLLIERCALLS(4)+1
391 ENDIF
392 IF(COLLIER_CACHE_ACTIVE.EQ.1) THEN
393 IF(COLLIERUSECACHEFORPOLES) THEN
394 CALL SWITCHOFFCACHE_CLL((UNIQUE_ID-1)*N_CACHES+4)
395 ENDIF
396 CALL SWITCHONCACHE_CLL((UNIQUE_ID-1)*N_CACHES+1)
397 ENDIF
398 CALL SETDELTAIR_CLL(0.0D0,(PI**2)/6.0D0)
399 ENDIF
400
401 DO I=0,(CURR_MAXCOEF-1)
402 C0 = COEFMAP_ZERO(I)
403 C1 = COEFMAP_ONE(I)
404 C2 = COEFMAP_TWO(I)
405 C3 = COEFMAP_THREE(I)
406 CURR_RANK = C0+C1+C2+C3
407C Because we must set q -> -q, we apply a minus sign to coefs of
408C odd rank
409 IF (MOD(CURR_RANK,2).EQ.1) THEN
410 SGN = -1
411 ELSE
412 SGN = 1
413 ENDIF
414 TIRCOEFS(I,1) = SGN*TNTEN(C0,C1,C2,C3)
415 IF (COLLIERCOMPUTEUVPOLES) THEN
416 TIRCOEFS(I,2) = SGN*( TNTEN_UV(C0,C1,C2,C3)-TNTEN(C0,C1,C2
417 $ ,C3) )
418 ELSE
419 TIRCOEFS(I,2) = DCMPLX(0.0D0,0.0D0)
420 ENDIF
421 IF (COLLIERCOMPUTEIRPOLES) THEN
422 TIRCOEFS(I,2) = TIRCOEFS(I,2) + SGN*( TNTEN_IR1(C0,C1,C2,C3)
423 $ -TNTEN(C0,C1,C2,C3) )
424 TIRCOEFS(I,3) = SGN*( TNTEN_IR2(C0,C1,C2,C3)-TNTEN(C0,C1,C2
425 $ ,C3) )
426 ELSE
427 TIRCOEFS(I,3) = DCMPLX(0.0D0,0.0D0)
428 ENDIF
429 ENDDO
430
431 IF (COLLIERUSEINTERNALSTABILITYTEST) THEN
432C Finish by caching the coefficients and error just computed
433 LOOP_ID_DONE(ID) = .TRUE.
434 DO J=0,CURR_MAXCOEF-1
435 DO K=1,3
436 TIR_COEFS_DIRECT_MODE(J,K,ID) = TIRCOEFS(J,K)
437 ENDDO
438 ENDDO
439 DO J=0,RANK
440 TIR_COEFS_ERROR(J,ID)=TNTENERR(J)
441 ENDDO
442
443 IF (CTMODE.EQ.2) THEN
444 DO I=0,(CURR_MAXCOEF-1)
445 CURR_RANK = COEFMAP_ZERO(I)+COEFMAP_ONE(I)+COEFMAP_TWO(I)
446 $ +COEFMAP_THREE(I)
447 DO J=1,3
448 TIRCOEFS(I,J) = TIRCOEFS(I,J) * (1.0D0
449 $ +TNTENERR(CURR_RANK))
450 ENDDO
451 ENDDO
452 ENDIF
453 ENDIF
454
455 END SUBROUTINE COLLIERLOOP
456
457 SUBROUTINE CLEAR_COLLIER_CACHE()
458
459 USE COLLIER
460
461 INCLUDE 'loop_max_coefs.inc'
462 INTEGER NLOOPGROUPS
463 PARAMETER (NLOOPGROUPS=1)
464 INTEGER MAXRANK
465 PARAMETER (MAXRANK=2)
466
467 INTEGER I,J,K
468
469 INCLUDE 'MadLoopParams.inc'
470
471 LOGICAL LOOP_ID_DONE(NLOOPGROUPS)
472 COMPLEX*16 TIR_COEFS_DIRECT_MODE(0:LOOPMAXCOEFS-1,3,NLOOPGROUPS)
473 COMPLEX*16 TIR_COEFS_ERROR(0:MAXRANK,NLOOPGROUPS)
474 COMMON/COLLIER_TIR_COEFS/TIR_COEFS_DIRECT_MODE,TIR_COEFS_ERROR
475 $ ,LOOP_ID_DONE
476
477 INTEGER COLLIER_CACHE_ACTIVE, NCALLS_IN_CACHE(4),
478 $ NCOLLIERCALLS(4)
479 LOGICAL MUST_INIT_EVENT
480 COMMON/COLLIER_CACHE_STATUS/COLLIER_CACHE_ACTIVE,NCALLS_IN_CACHE
481 $ , NCOLLIERCALLS,MUST_INIT_EVENT
482
483C Make sure that next time the COLLIER Subroutine is called it
484C will call the subroutine initEvent of Collier.
485 MUST_INIT_EVENT = .TRUE.
486
487C Reinitialize the ML cache for COLLIER
488 DO I=1,NLOOPGROUPS
489 LOOP_ID_DONE(I) = .FALSE.
490 DO J=0,LOOPMAXCOEFS-1
491 DO K=1,3
492 TIR_COEFS_DIRECT_MODE(J,K,I) = DCMPLX(0.0D0,0.0D0)
493 ENDDO
494 ENDDO
495 DO J=0,MAXRANK
496 TIR_COEFS_ERROR(J,I)=0.0D0
497 ENDDO
498 ENDDO
499
500 END
501
502 SUBROUTINE SET_COLLIER_GLOBAL_CACHE(ONOFF)
503C
504C This routine is used by loop_matrix.f to turn on the global
505C cache of COLLIER when it the main SLOOP subroutine starts and
506C turn it off when it ends.
507C However several checks are performed to verify that it is safe
508C to turn it on and to reinitialize it if necessary.
509C
510C MODULES
511C
512 USE COLLIER
513 IMPLICIT NONE
514C
515C ARGUMENTS
516C
517 LOGICAL ONOFF
518C
519C LOCAL VARIABLES
520C
521 LOGICAL NEED_REINITIALIZATION
522 INTEGER N_CACHES
523C
524C GLOBAL VARIABLES
525C
526C
527C This common blocks saves the relevant ML parameters when
528C activating the
529C global cache of COLLIER so that we know when we must
530C reinitialize it.
531C COLLIER_CACHE_ACTIVE is set to -1 when it has never been turned
532C on yet and
533C to 1 for 'Active' and 0 for 'Inactive'.
534C The integer NCALLS_IN_CACHE saves how many calls the cache is
535C setup for, for each of the up to four caches.
536C When it is the first PS points, it is set to -1.
537 INTEGER COLLIER_CACHE_ACTIVE, NCALLS_IN_CACHE(4),
538 $ NCOLLIERCALLS(4)
539 DATA COLLIER_CACHE_ACTIVE/-1/
540 DATA NCALLS_IN_CACHE/-1,-1,-1,-1/
541 DATA NCOLLIERCALLS/0,0,0,0/
542C This is a flag to tell the COLLIER subroutine that it must init
543C the event when called.
544 LOGICAL MUST_INIT_EVENT
545 DATA MUST_INIT_EVENT/.TRUE./
546 COMMON/COLLIER_CACHE_STATUS/COLLIER_CACHE_ACTIVE,
547 $ NCALLS_IN_CACHE, NCOLLIERCALLS,MUST_INIT_EVENT
548
549 LOGICAL COLLIERUSEINTERNALSTABILITYTEST_BU
550 INTEGER USERHEL_BU, SQSO_TARGET_BU, COLLIERMODE_BU,CTMODERUN_BU
551 COMMON/COLLIER_CACHE_RELEVANT_PARAMS/USERHEL_BU,SQSO_TARGET_BU
552 $ ,COLLIERMODE_BU,CTMODERUN_BU,COLLIERUSEINTERNALSTABILITYTEST_BU
553
554C The common blocks below are to retrieve the necessary
555C information about
556C MadLoop running mode and store it in the sCOLLIER_CACHE_RELEVANT_
557C PARAMS common block.
558
559 INCLUDE 'MadLoopParams.inc'
560 INCLUDE 'unique_id.inc'
561 INCLUDE 'global_specs.inc'
562
563 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT,
564 $ COLLIERINIT
565 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT,GOLEMINIT,SAMURAIINIT
566 $ ,NINJAINIT, COLLIERINIT
567
568 LOGICAL CHECKPHASE
569 LOGICAL HELDOUBLECHECKED
570 COMMON/INIT/CHECKPHASE, HELDOUBLECHECKED
571
572 INTEGER USERHEL
573 COMMON/USERCHOICE/USERHEL
574
575 INTEGER SQSO_TARGET
576 COMMON/SOCHOICE/SQSO_TARGET
577
578C
579C BEGIN CODE
580C
581
582 IF (COLLIERUSECACHEFORPOLES) THEN
583 N_CACHES = 4
584 ELSE
585 N_CACHES =1
586 ENDIF
587
588C Do nothing if COLLIER still has to be initialized or if global
589C caches are disabled
590 IF(COLLIERINIT.OR.COLLIERGLOBALCACHE.EQ.0) THEN
591 RETURN
592 ENDIF
593
594C Never activate anything in the checkphase
595 IF (ONOFF.AND.CHECKPHASE) THEN
596 RETURN
597 ENDIF
598
599C Handle the request of turning off the caching
600 IF (.NOT.ONOFF) THEN
601 IF (COLLIER_CACHE_ACTIVE.EQ.1) THEN
602 CALL SWITCHOFFCACHE_CLL((UNIQUE_ID-1)*4+1)
603 COLLIER_CACHE_ACTIVE = 0
604 ENDIF
605C If we were asked to turn the cache off but it was already so,
606C then do nothing
607 RETURN
608 ENDIF
609
610C Handle the request of turning on the caching
611
612C If asked to activate it but already active, then do nothing
613 IF (ONOFF.AND.COLLIER_CACHE_ACTIVE.EQ.1) THEN
614 RETURN
615 ENDIF
616
617C We are now in the position where we are asked to activate the
618C global cache but it was *not* already active.
619
620C If we activate it for the first time, make sure to store the
621C value of the relevant parameters, activate and return.
622 IF (COLLIER_CACHE_ACTIVE.EQ.-1) THEN
623 USERHEL_BU = USERHEL
624 SQSO_TARGET_BU = SQSO_TARGET
625 COLLIERMODE_BU = COLLIERMODE
626 COLLIERUSEINTERNALSTABILITYTEST_BU = COLLIERUSEINTERNALSTABILIT
627 $YTEST
628 CTMODERUN_BU = CTMODERUN
629 CALL SWITCHONCACHE_CLL((UNIQUE_ID-1)*4+1)
630 COLLIER_CACHE_ACTIVE = 1
631 RETURN
632 ENDIF
633
634C Now perform sanity check before the activation to decide if we
635C need to reinitialize the cache system first.
636 NEED_REINITIALIZATION = .FALSE.
637
638 IF (SQSO_TARGET.NE.SQSO_TARGET_BU) THEN
639 NEED_REINITIALIZATION = .TRUE.
640 ENDIF
641
642 IF (COLLIERMODE.NE.COLLIERMODE_BU) THEN
643 NEED_REINITIALIZATION = .TRUE.
644 ENDIF
645
646 IF (COLLIERUSEINTERNALSTABILITYTEST.NEQV.COLLIERUSEINTERNALSTABIL
647 $ITYTEST_BU) THEN
648 NEED_REINITIALIZATION = .TRUE.
649 ENDIF
650
651 IF (CTMODERUN_BU.NE.CTMODERUN.AND.(.NOT.COLLIERUSEINTERNALSTABILI
652 $TYTEST)) THEN
653 NEED_REINITIALIZATION = .TRUE.
654 ENDIF
655
656C When doing amplitude reduction the parameter USERHEL does not
657C impact the number/order of COLLIER calls
658C except if the LoopFilter is ON which really shouldn't be the
659C case anymore.
660 IF(USELOOPFILTER.AND.(USERHEL.NE.USERHEL_BU)) THEN
661 NEED_REINITIALIZATION = .TRUE.
662 ENDIF
663
664 IF(NEED_REINITIALIZATION) THEN
665C Log the event because if it happens a lot of time and floods
666C the screen, the user must see it
667C and either change its usage of MadLoop or turnoff COLLIER cache
668 WRITE(*,*) 'INFO: MadLoop detected that the global cache of'
669 $ //' COLLIER had to be reset because of a change in your use'
670 $ //' of MadLoop. This should not happend for each event.'
671 USERHEL_BU = USERHEL
672 SQSO_TARGET_BU = SQSO_TARGET
673 COLLIERMODE_BU = COLLIERMODE
674 COLLIERUSEINTERNALSTABILITYTEST_BU = COLLIERUSEINTERNALSTABILIT
675 $YTEST
676 CTMODERUN_BU = CTMODERUN
677 IF (COLLIERGLOBALCACHE.EQ.-1) THEN
678 CALL INITCACHESYSTEM_CLL(N_CACHES*NPROCS,MAXNEXTERNAL)
679 ELSE
680 CALL INITCACHESYSTEM_CLL(N_CACHES*NPROCS,COLLIERGLOBALCACHE)
681 ENDIF
682 NCOLLIERCALLS(:) = 0
683 NCALLS_IN_CACHE(:) = -1
684C Make sure all caches are switched off at first.
685 CALL SWITCHOFFCACHESYSTEM_CLL()
686 ENDIF
687
688C Now we can finally activate the cache
689 CALL SWITCHONCACHE_CLL((UNIQUE_ID-1)*4+1)
690 COLLIER_CACHE_ACTIVE = 1
691
692 END
693
0694
=== modified file 'tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%CT_interface.f'
--- tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%CT_interface.f 2016-05-06 09:08:11 +0000
+++ tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%CT_interface.f 2016-06-24 21:04:21 +0000
@@ -39,8 +39,9 @@
39 COMPLEX*16 R1, ACC39 COMPLEX*16 R1, ACC
40 INTEGER I, J, K40 INTEGER I, J, K
41 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT41 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT
42 $ ,COLLIERINIT
42 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT43 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT
43 $ ,NINJAINIT44 $ ,NINJAINIT,COLLIERINIT
44C 45C
45C EXTERNAL FUNCTIONS46C EXTERNAL FUNCTIONS
46C 47C
@@ -392,8 +393,9 @@
392 INCLUDE 'coupl.inc'393 INCLUDE 'coupl.inc'
393394
394 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT395 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT
396 $ ,COLLIERINIT
395 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT397 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT
396 $ ,NINJAINIT398 $ ,NINJAINIT,COLLIERINIT
397399
398 REAL*8 LSCALE400 REAL*8 LSCALE
399 INTEGER CTMODE401 INTEGER CTMODE
@@ -616,8 +618,9 @@
616 INCLUDE 'coupl.inc'618 INCLUDE 'coupl.inc'
617619
618 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT620 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT
621 $ ,COLLIERINIT
619 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT622 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT
620 $ ,NINJAINIT623 $ ,NINJAINIT,COLLIERINIT
621624
622 REAL*8 LSCALE625 REAL*8 LSCALE
623 INTEGER CTMODE626 INTEGER CTMODE
624627
=== modified file 'tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%GOLEM_interface.f'
--- tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%GOLEM_interface.f 2016-03-31 10:53:12 +0000
+++ tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%GOLEM_interface.f 2016-06-24 21:04:21 +0000
@@ -108,8 +108,9 @@
108 COMMON/LOOP/ID,SQSOINDEX,R108 COMMON/LOOP/ID,SQSOINDEX,R
109109
110 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT110 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT
111 $ ,COLLIERINIT
111 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT,GOLEMINIT,SAMURAIINIT112 COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT,GOLEMINIT,SAMURAIINIT
112 $ ,NINJAINIT113 $ ,NINJAINIT,COLLIERINIT
113114
114 INTEGER NLOOPGROUPS115 INTEGER NLOOPGROUPS
115 PARAMETER (NLOOPGROUPS=1)116 PARAMETER (NLOOPGROUPS=1)
116117
=== modified file 'tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%TIR_interface.f'
--- tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%TIR_interface.f 2016-05-06 09:08:11 +0000
+++ tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%TIR_interface.f 2016-06-24 21:04:21 +0000
@@ -45,8 +45,9 @@
45 INTEGER I, J, K45 INTEGER I, J, K
46 INTEGER NLOOPCOEFS46 INTEGER NLOOPCOEFS
47 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT47 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT
48 $ ,COLLIERINIT
48 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT49 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT
49 $ ,NINJAINIT50 $ ,NINJAINIT,COLLIERINIT
5051
51C This variable will be used to detect changes in the TIR library52C This variable will be used to detect changes in the TIR library
52C used so as to force the reset of the TIR filter.53C used so as to force the reset of the TIR filter.
@@ -67,7 +68,6 @@
67 REAL*8 LSCALE68 REAL*8 LSCALE
68 COMMON/CT/LSCALE,CTMODE69 COMMON/CT/LSCALE,CTMODE
6970
70C The variables below are just for monitoring purposes.
71 INTEGER ID,SQSOINDEX,R71 INTEGER ID,SQSOINDEX,R
72 COMMON/LOOP/ID,SQSOINDEX,R72 COMMON/LOOP/ID,SQSOINDEX,R
7373
@@ -184,6 +184,9 @@
184 $ ,M2L,MU_R,PJCOEFS,STABLE)184 $ ,M2L,MU_R,PJCOEFS,STABLE)
185C CONVERT TO MADLOOP CONVENTION185C CONVERT TO MADLOOP CONVENTION
186 CALL CONVERT_IREGI_COEFFS(RANK,PJCOEFS,TIRCOEFS)186 CALL CONVERT_IREGI_COEFFS(RANK,PJCOEFS,TIRCOEFS)
187 CASE(7)
188C COLLIER
189 CALL COLLIERLOOP(CTMODE,NLOOPLINE,RANK,PL,PDEN,M2L,TIRCOEFS)
187 END SELECT190 END SELECT
188 DO I=1,3191 DO I=1,3
189 RES(I)=(0.0D0,0.0D0)192 RES(I)=(0.0D0,0.0D0)
@@ -198,6 +201,8 @@
198C WRITE(*,*) 'PJFry: Loop ID',ID,' =',RES(1),RES(2),RES(3)201C WRITE(*,*) 'PJFry: Loop ID',ID,' =',RES(1),RES(2),RES(3)
199C ELSEIF(MLReductionLib(I_LIB).EQ.3) THEN202C ELSEIF(MLReductionLib(I_LIB).EQ.3) THEN
200C WRITE(*,*) 'Iregi: Loop ID',ID,' =',RES(1),RES(2),RES(3)203C WRITE(*,*) 'Iregi: Loop ID',ID,' =',RES(1),RES(2),RES(3)
204C ELSEIF(MLReductionLib(I_LIB).EQ.7) THEN
205C WRITE(*,*) 'COLLIER: Loop ID',ID,' =',RES(1),RES(2),RES(3)
201C ENDIF206C ENDIF
202 END207 END
203208
@@ -322,8 +327,9 @@
322C 327C
323 INCLUDE 'MadLoopParams.inc'328 INCLUDE 'MadLoopParams.inc'
324 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT329 LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT
330 $ ,COLLIERINIT
325 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT331 COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT
326 $ ,NINJAINIT332 $ ,NINJAINIT,COLLIERINIT
327333
328C ----------334C ----------
329C BEGIN CODE335C BEGIN CODE
@@ -366,7 +372,7 @@
366C CONSTANTS372C CONSTANTS
367C 373C
368 INTEGER NLOOPLIB374 INTEGER NLOOPLIB
369 PARAMETER (NLOOPLIB=4)375 PARAMETER (NLOOPLIB=7)
370 INTEGER QP_NLOOPLIB376 INTEGER QP_NLOOPLIB
371 PARAMETER (QP_NLOOPLIB=2)377 PARAMETER (QP_NLOOPLIB=2)
372 INTEGER NLOOPGROUPS378 INTEGER NLOOPGROUPS
373379
=== modified file 'tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%check_sa.f'
--- tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%check_sa.f 2016-03-31 10:53:12 +0000
+++ tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%check_sa.f 2016-06-24 21:04:21 +0000
@@ -294,6 +294,8 @@
294 $ //' an unknown reason.'294 $ //' an unknown reason.'
295 ENDIF295 ENDIF
296 ENDIF296 ENDIF
297 WRITE (*,'(1x,a23,3x,i3)') 'MadLoop return code ='
298 $ ,RETURNCODE
297 WRITE (*,*) '---------------------------------'299 WRITE (*,*) '---------------------------------'
298 IF (NBORNCHOSEN.EQ.0) THEN300 IF (NBORNCHOSEN.EQ.0) THEN
299 WRITE (*,*) 'No Born contribution satisfied the squared'301 WRITE (*,*) 'No Born contribution satisfied the squared'
300302
=== modified file 'tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%loop_matrix.f'
--- tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%loop_matrix.f 2016-05-06 09:08:11 +0000
+++ tests/input_files/IOTestsComparison/IOExportFKSTest/test_ppw_fksall/%SubProcesses%P0_dxu_wp%V0_dxu_wp%loop_matrix.f 2016-06-24 21:04:21 +0000
@@ -77,9 +77,9 @@
77 PARAMETER (NSQUAREDSOP1=NSQUAREDSO+1)77 PARAMETER (NSQUAREDSOP1=NSQUAREDSO+1)
78C The total number of loop reduction libraries78C The total number of loop reduction libraries
79C At present, there are only CutTools,PJFry++,IREGI,Golem95,Samurai79C At present, there are only CutTools,PJFry++,IREGI,Golem95,Samurai
80C and Ninja80C , Ninja and COLLIER
81 INTEGER NLOOPLIB81 INTEGER NLOOPLIB
82 PARAMETER (NLOOPLIB=6)82 PARAMETER (NLOOPLIB=7)
83C Only CutTools or possibly Ninja (if installed with qp support)83C Only CutTools or possibly Ninja (if installed with qp support)
84C provide QP84C provide QP
85 INTEGER QP_NLOOPLIB85 INTEGER QP_NLOOPLIB
@@ -207,6 +207,7 @@
207C GLOBAL VARIABLES207C GLOBAL VARIABLES
208C 208C
209 INCLUDE 'process_info.inc'209 INCLUDE 'process_info.inc'
210 INCLUDE 'unique_id.inc'
210 INCLUDE 'coupl.inc'211 INCLUDE 'coupl.inc'
211 INCLUDE 'mp_coupl.inc'212 INCLUDE 'mp_coupl.inc'
212 INCLUDE 'MadLoopParams.inc'213 INCLUDE 'MadLoopParams.inc'
@@ -236,23 +237,23 @@
236 COMMON/MP_DONE/MP_DONE237 COMMON/MP_DONE/MP_DONE
237C A FLAG TO DENOTE WHETHER THE CORRESPONDING LOOPLIBS ARE238C A FLAG TO DENOTE WHETHER THE CORRESPONDING LOOPLIBS ARE
238C AVAILABLE OR NOT239C AVAILABLE OR NOT
239 LOGICAL LOOPLIBS_AVAILABLE(6)240 LOGICAL LOOPLIBS_AVAILABLE(NLOOPLIB)
240 DATA LOOPLIBS_AVAILABLE/.TRUE.,.TRUE.,.TRUE.,.TRUE.,.FALSE.241 DATA LOOPLIBS_AVAILABLE/.TRUE.,.TRUE.,.TRUE.,.TRUE.,.FALSE.
241 $ ,.TRUE./242 $ ,.TRUE.,.TRUE./
242 COMMON/LOOPLIBS_AV/ LOOPLIBS_AVAILABLE243 COMMON/LOOPLIBS_AV/ LOOPLIBS_AVAILABLE
243C A FLAG TO DENOTE WHETHER THE CORRESPONDING DIRECTION TESTS244C A FLAG TO DENOTE WHETHER THE CORRESPONDING DIRECTION TESTS
244C AVAILABLE OR NOT IN THE LOOPLIBS245C AVAILABLE OR NOT IN THE LOOPLIBS
245 LOGICAL LOOPLIBS_DIRECTEST(6)246 LOGICAL LOOPLIBS_DIRECTEST(NLOOPLIB)
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: